如果一个列表具有相同的元素,我想检查序言

ora*_*alo 1 list prolog

我想在序言中写“检查一个列表是否具有相同的元素”,例如 list[a,a,a,a] 为真。list[a,c,a,a] 是假的。我怎么能这样做?

lur*_*ker 5

它可以通过一个简单的谓词来完成:

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)