对prolog中列表内元素的操作

时间:2011-12-30 11:48:25

标签: prolog

我正在写一个prolog代码,在中间我要检查列表中的所有元素是否都不包含在某个谓词中

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

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

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

但这不会有用,任何人都可以告诉我哪里出错了? 感谢

1 个答案:

答案 0 :(得分:1)

您的基本情况是错误的。您为此谓词提供的任何列表都将被归类为不包含陷阱,因为第二个子句与之匹配:

?- 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是陷阱。)