相关疑难解决方法(0)

Prolog中的alldifferent/1谓词

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 dcg

1
推荐指数
1
解决办法
750
查看次数

Prolog成员名单

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是列表的头部时(第二个规则不能)时,单独站立告诉我?

谢谢.

prolog

1
推荐指数
1
解决办法
453
查看次数

Prolog:具有真假值

我正在学习使用 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。)

list prolog

1
推荐指数
1
解决办法
2659
查看次数

Prolog:成员谓词的真/假输出?

我想知道为什么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)

prolog member

0
推荐指数
1
解决办法
714
查看次数

标签 统计

prolog ×4

dcg ×1

list ×1

member ×1