CLP(FD) を使用せずに、問題と制約を適切に表現する Prolog の組み合わせ機能を使用する必要があります。例えば
puzzle(Name) :-
L = [[mason, Pos1, Blond1, Handsome1, UnScared1],
[alex, Pos2, Blond2, Handsome2, UnScared2],
[steve, Pos3, Blond3, Handsome3, UnScared3],
[simon, Pos4, Blond4, Handsome4, UnScared4]
],
permutation([1,2,3,4], [Pos1,Pos2,Pos3,Pos4]),
maplist(yn,
[Blond1, Handsome1, UnScared1,
Blond2, Handsome2, UnScared2,
Blond3, Handsome3, UnScared3,
Blond4, Handsome4, UnScared4
]),
...
各変数 (大文字で始まる記号!) は個人の属性であり、ドメインからの値を想定できます。yn/1 これはサービス ファクトであり、これらのバイナリ値が yes または no のいずれかを想定できるようにします。
yn(y).
yn(n).
制約は次のように表現できます (最初の例のみ)。
...
% Two of them who are not blond are standing on either side of Mason.
member([mason, I1, _,_,_], L),
member([_, I2, n,_,_], L),
member([_, I3, n,_,_], L),
(I2>I1, I3>I1 ; I2<I1, I3<I1),
...
そして解決策は
% One of them is blond, handsome, and unscarred.
member([Name, _, y, y, y], L).
すべての制約 (英語) を理解しているかどうかはわかりません。実際、私のプログラムは解決策を見つけられません。
プログラムはかなり遅く、CLP(FD) を呼び出します。CLP(FD) ソリューションに興味がある場合は、質問を編集します (たとえば、適切なタグを追加します)。