Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Операции над элементами внутри списков в прологе

Автор вопроса: Aya AbdelsalamОтветов: 1

Я пишу код пролога, и в середине я хочу проверить, все ли элементы в списке не включены в определенный предикат

Here is the code:
 trap(a).
 trap(b).

not_trap([A|B]):-
\+trap(A),
not_trap(B).

not_trap(B):-
\+trap(B).

но это не сработает, может ли кто-нибудь сказать мне, где я ошибся? Спасибо

prolog

Ответы

Ответ 1 · рейтинг 1 · Fred Foo

Ваш базовый случай неверен. Какой бы список вы ни дали этому предикату, он будет классифицирован как не содержащий ловушки, так как ему соответствует второе предложение:

?- trace.
true.

[trace]  ?- not_trap([a]).
   Call: (6) not_trap([a]) ? creep
   Call: (7) trap(a) ? creep
   Exit: (7) trap(a) ? creep
   Call: (7) trap([a]) ? creep
   Fail: (7) trap([a]) ? creep
   Exit: (6) not_trap([a]) ? creep
true.

Вы можете исправить этот предикат, используя типичный базовый случай рекурсии списка

not_trap([]).

или переписав его без явной рекурсии как

not_trap(L) :-
    \+ (member(X, L), trap(X)).

(Читайте это так: нет члена X из L, который был бы ловушкой.)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы