2017-10-21 74 views
0

我怎樣才能更簡潔地表達以下連詞?多個' ='[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. 

理想情況下,我想使用內置/庫謂詞的一個目標。

回答

5

您也可以選擇定義謂詞的唯一身份/ 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) ; 
. 
. 
. 
+2

有一個錯誤:條件(1,2,3,3,4)爲真。 – joel76

+0

@ joel76:我多麼愚蠢。我修好了,感謝提示:-) – tas

5

這取決於...

如果所有Xi是整數,您的Prolog的支持finite-domain constraints),只寫:

 
:- use_module(library(clpfd)). 

condition(X1, X2, X3, X4, X5) :- 
    all_distinct([X1,X2,X3,X4,X5]).  % use library predicate 
+1

也許[all_distinct/1](HTTP://www.swi因爲[all_different/1](http://www.swi-prolog.org/pldoc/doc_for?object=all_different/1)有一個更好的建議較弱的傳播和文檔明確指出「考慮使用all_distinct/1,而不是......」。 – tas

+0

@tas。謝謝! – repeat