List 序言-所有不同的列表不计算“_&引用;变量

List 序言-所有不同的列表不计算“_&引用;变量,list,prolog,List,Prolog,我需要在Prolog中做一个函数,在给定列表的情况下,检查每个成员是否不同。唯一的特殊性是,它不能计算“u”变量。 以下是我想要的示例: unique([3,1,2]). > true unique([3,1,2,_]). > true unique([3,1,2,_,_,_]). > true unique([3,1,2,1]). > false unique([3,1,2,1,_]). > false 我已经尝试使用以下函数,使用谓词“var”检查变

我需要在Prolog中做一个函数,在给定列表的情况下,检查每个成员是否不同。唯一的特殊性是,它不能计算“u”变量。 以下是我想要的示例:

unique([3,1,2]). 
> true

unique([3,1,2,_]).
> true

unique([3,1,2,_,_,_]).
> true

unique([3,1,2,1]).
> false

unique([3,1,2,1,_]).
> false
我已经尝试使用以下函数,使用谓词“var”检查变量是否为自由变量,但它不起作用:

element(X,[X|_]) :- !.
element(X,[_|Q]) :- element(X,Q).

unique([]).
unique([_,[]]).
unique([T,Q]) :- var(T), unique(Q), !.
unique([T|Q]) :- \+element(T,Q),unique(Q).
谢谢你的帮助

PS:我正在使用GProlog


PS2:我知道函数fd_all_different可以工作,但我更愿意自己实现它

由于@false:

对于那些想知道如何实现的人,这里有一个“独特”的功能:

dif(X,Y) :- X \== Y.

unique([]).
unique([T|Q]) :- maplist(dif(T), Q), unique(Q).

unique([3,1,2,X,X])应该做什么呢?
基本上,我的程序中没有这个案例,所以用这个好名字来代替
所有不同的/1
并不重要。请参阅。如果您的序言没有定义两个排版问题:
unique([[uu,[])。
=>
unique([[uu])。
unique([T,Q]):-…
=>
unique([T,Q]):-…