2017-10-21 10 views
0

どうすれば簡単に次のように表現できますか?複数の ' =' [プロローグ]

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

あなたはまた、maplistと述語ユニーク/ 1を定義することを選ぶことができ/ 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は整数であり、あなたのプロローグだけで書き込み、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 -prolog.org/pldoc/man?predicate=all_distinct/1)は、[all_different/1](http://www.swi-prolog.org/pldoc/doc_for?object=all_different/1)にあるため、より良い提案になります。ドキュメントの明示的に「all_distinct/1を代わりに使用することを検討...」と明記されています。 – tas

+0

@ tas。ありがとうございました! – repeat