我想在序言中写“检查一个列表是否具有相同的元素”,例如 list[a,a,a,a] 为真。list[a,c,a,a] 是假的。我怎么能这样做?
它可以通过一个简单的谓词来完成:
same([]). % You only need this one if you want the empty list to succeed
same([_]).
same([X,X|T]) :- same([X|T]).
Run Code Online (Sandbox Code Playgroud)
结果:
| ?- same([a,b,a,a]).
no
| ?- same([a,a,a,a]).
true ? ;
no
| ?- same([]).
yes
Run Code Online (Sandbox Code Playgroud)
附录 1
更改子句的顺序以使基本情况首先允许:
| ?- same(L).
L = [] ? ;
L = [_] ? ;
L = [A,A] ? ;
L = [A,A,A] ? ;
...
Run Code Online (Sandbox Code Playgroud)
附录 2
另一种使用 DCG 的方法可能是:
same(_) --> [].
same(X) --> [X], same(X).
Run Code Online (Sandbox Code Playgroud)
然后:
| ?- phrase(same(_), [a,b,a,a]).
no
| ?- phrase(same(_), [a,a,a,a]).
true ? a
(1 ms) no
| ?- phrase(same(X), L).
L = [] ? ;
L = [X] ? ;
L = [X,X] ? ;
L = [X,X,X] ? ;
...
Run Code Online (Sandbox Code Playgroud)