2012-04-29 13 views
0

SWI-Prologにall_differentの独自のバージョンを書く必要があります。私はall_differentと同じ入力値に対して同じtrue/falseを返す述語を書いていますが、実際にこの述語を制約として適用する方法をオンラインで見つけるのは難しいです。ここに私のall_differentのバージョンがあります。swiplで制約を適用する

distinct([]). 
distinct([X|Xs]) :- 
    different(X,Xs), 
    distinct(Xs). 

different(_,[]). 
different(X,[Y|Ys]) :- 
    (nonvar(X), nonvar(Y) -> X \= Y 
    ; 
    true 
), 
    different(X,Ys). 

整数と_のリストに適用する必要があります。はい、これはスドクプログラムプロジェクトです。申し訳ありませんが、これは愚かな疑問ですが、私はまだPrologには新しく、オンラインで十分な文書を見つけるのは難しいです。 助けてください!

答えて

2

あなたは制約ではなく述語を書いています。要約すると、述語は成功または失敗のいずれかであり、制約は可能な値の制限のみを表します。制約は、それらを単純化し、関係する変数の可能な値の範囲を示すために、いくつかの黒い魔法を行う制約のソルバーによって記録されています。したがって、述部を制約として適用することはできません。

あなたは(私はSWI-Prologのを使用しています)元の問題を再検討し、制約が必要かどうかを確認するか、次のように上に実装を変更することができ、次のいずれか

different(X,[Y|Ys]) :- 
    X#\= Y, 
    different(X,Ys). 

#\=

はdisequality式があることを示し、制約。

http://www.swi-prolog.org/man/clpfd.html、具体的にはall_different/1all_distinct/1の違いを確認することができます。

+0

あなたはウィザードです!神の愛のために、私はAGESのためにネット上でこれを探しています。この質問は、実際に私のグーグルで何度も現れました。私はすべて興奮して、何かを見つけたと思った。とにかく、ありがとう。私はずっと探していた!何百万回も投票してください! –

+1

'maplist(#\ =(X)、Ys)' – false

関連する問題