0

このことをPrologにコード化するために私が何をするか説明してもらえますか?

メイソン、アレックス、スティーブ、サイモンは警察のラインナップに立っています。それらの1つは金髪で、ハンサムで、傷がありません。金髪ではない2人がメイソンの両側に立っています。アレックスはちょうど一人のハンサムな男の隣に立っている唯一の人です。ちょうど一人の傷ついた男の隣に立っていないのはスティーブだけです。金髪でハンサムで怖くないのは誰ですか?

私はここにいます、

p->立っている(x、y)

twoOfThem(金髪ではなく、メイソンの両側に立っている)

standing(mason,[x,y]):-
         blond([x,y]) == false.

ちょうど1人のハンサムの隣に立っているのは1人だけのアレックス

standing(alex,x):-
         handsome(x).

スティーブは傷のない隣に立っているだけではありません。

standing(steve,x):- 
         unscared(x).
4

1 に答える 1

1

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) ソリューションに興味がある場合は、質問を編集します (たとえば、適切なタグを追加します)。

于 2013-03-14T16:00:04.240 に答える