我正在写一个prolog代码,在中间我要检查列表中的所有元素是否都不包含在某个谓词中
Here is the code:
trap(a).
trap(b).
not_trap([A|B]):-
\+trap(A),
not_trap(B).
not_trap(B):-
\+trap(B).
但这不会有用,任何人都可以告诉我哪里出错了? 感谢
答案 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
是陷阱。)