我怎样才能更简洁地表达以下结合?
condition(X1, X2, X3, X4, X5) :-
X1 \= X2,
X1 \= X3,
X1 \= X4,
X1 \= X5,
X2 \= X3,
X2 \= X4,
X2 \= X5,
X3 \= X4,
X3 \= X5,
X4 \= X5.
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想使用内置/库谓词的单个目标.
这取决于...
如果所有Xi都是整数并且您的Prolog支持有限域约束(clpfd),那么只需写:
:- use_module(library(clpfd)). condition(X1, X2, X3, X4, X5) :- all_distinct([X1,X2,X3,X4,X5]). % use library predicate
如果列表由唯一元素组成,您还可以选择使用maplist/2定义谓词唯一/ 1.然后你的谓词条件/ 5将作为调用谓词:
:- use_module(library(apply)). % for maplist/2
condition(X1, X2, X3, X4, X5) :-
uniques([X1,X2,X3,X4,X5]).
uniques([]).
uniques([X|Xs]) :-
maplist(dif(X),Xs),
uniques(Xs).
?- condition(1,2,3,4,5).
true.
?- condition(1,2,3,4,1).
false.
Run Code Online (Sandbox Code Playgroud)
uniques/1可用于任意列表:
?- uniques([]).
true.
?- uniques([1,a,6,f(X)]).
true.
?- uniques([A,B,C]).
dif(A, C),
dif(A, B),
dif(B, C).
?- uniques([A,B,A]).
false.
?- uniques(U).
U = [] ;
U = [_G265] ;
U = [_G392, _G395],
dif(_G392, _G395) ;
U = [_G489, _G492, _G495],
dif(_G489, _G495),
dif(_G489, _G492),
dif(_G492, _G495) ;
.
.
.
Run Code Online (Sandbox Code Playgroud)