allsame([]).
allsame([X]).
allsame([X,X|Z]) :-
allsame([X|Z]).
Run Code Online (Sandbox Code Playgroud)
如何更改以获得下面的结果?
alldifferent(L): The elements in L are all different.
?- alldifferent([a, b, b, c, d]).
false
?- alldifferent([a, b, c, d, e]).
true
Run Code Online (Sandbox Code Playgroud) Prolog新手在这里谁想知道为什么这些规则不能自立,如果我想知道某些东西是否是列表的成员.
member(X, [X|_]).
member(X, [_|Y]) :- member(X,Y).
Run Code Online (Sandbox Code Playgroud)
如果我问以下规则:
member(will, [anna, eddie, pat, will, marjorie, donna]).
Run Code Online (Sandbox Code Playgroud)
我明白了,但如果我删除:
member(X, [X|_]).
Run Code Online (Sandbox Code Playgroud)
刚离开第二条规则,我就是假的.如果第二条规则指出"如果X是列表尾部的成员,则X是列表的成员",为什么会这样呢?
"will"是此列表尾部的成员.
而且,为什么可以
member(X, [X|_]).
Run Code Online (Sandbox Code Playgroud)
当X是列表的头部时(第二个规则不能)时,单独站立告诉我?
谢谢.
我正在学习使用 SWI Prolog,我正在学习使用列表。一个小练习是检查一个元素是否在列表中。这是我得到的:
member(X,[X|_]).
member(X,[_|T]):-member[X|T].
Run Code Online (Sandbox Code Playgroud)
第一种情况按预期进行:
?- member(a,[b,a]).
true.
Run Code Online (Sandbox Code Playgroud)
但第二个没有,因为似乎出现了一些回溯:
?- member(a,[a,b]).
true ;
false.
Run Code Online (Sandbox Code Playgroud)
我怎样才能防止这种情况发生,即让 Prolog 只返回true?(我不想忽略 false。)
我想知道为什么member/2Prolog 的谓词提供了多种替代方案(通过回溯?!),如果true已经统一了输出.
例如,member(1, [1,2,3]).提供以下输出:
true ;
false.
Run Code Online (Sandbox Code Playgroud)
为什么member在已经发现原子1确实是列表成员之后返回false [1,2,3]?
对我来说更令人困惑的是以下输出:
?- member(1, [1,2,3,1]).
true ;
true.
Run Code Online (Sandbox Code Playgroud)