我怎樣才能更簡潔地表達以下連詞?多個' ='[Prolog]
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.
理想情況下,我想使用內置/庫謂詞的一個目標。
我怎樣才能更簡潔地表達以下連詞?多個' ='[Prolog]
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.
理想情況下,我想使用內置/庫謂詞的一個目標。
您也可以選擇定義謂詞的唯一身份/ 1 MAPLIST/2如果列表由唯一元素組成,則成功。那麼你的斷言條件/ 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.
與不重複/ 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) ;
.
.
.
這取決於...
如果所有Xi
是整數,您的Prolog的支持finite-domain constraints(clpfd),只寫:
:- use_module(library(clpfd)). condition(X1, X2, X3, X4, X5) :- all_distinct([X1,X2,X3,X4,X5]). % use library predicate
有一個錯誤:條件(1,2,3,3,4)爲真。 – joel76
@ joel76:我多麼愚蠢。我修好了,感謝提示:-) – tas