14

AI クラスのプロローグの宿題で助けが必要です。問題は、アインシュタインのパズルのプロローグ コードを書くことです。自分で書き留める方法は知っていますが、宿題にはいくつかの制約があります。

 there are 5 houses
 the Englishman lives in the red house
 the Spaniard owns the dog
 coffee is drunk in the green house
 the Ukrainian drinks tea
 the green house is immediately to the right of the ivory house
 the Old Gold smoker owns snails
 Kools are smoked in the yellow house
 milk is drunk in the middle house
 the Norwegian lives in the first house
 the man who smokes Chesterelds lives in the house next to the man with the fox
 3 Kools are smoked in the house next to the house where the horse is kept
 the Lucky Strike smoker drinks orange juice
 the Japanese smokes Parliaments
 the Norwegian lives next to the blue house

家は順序付けられているため、リストを使用する必要があることはわかっています。家の特徴もリストを使いたかったのですが、ここで問題が発生しました。

匿名変数house(englishman, red, _, _, _)を使用するつもりでした。しかし、宿題のためにそれを解釈する方法がわかりません。

制約は次のとおりです。次の二項述語記号を使用する必要があります。

owns(N,Pet)
smokes(N, Cigarette).
drinks(N, Drink).

それ以外は、任意の数の述語を自由に使用できます。

これが事実を初期化する方法ですが、この場合のルールの作成方法はわかりません

next_to(X,Y) :- right_of(X,Y); right_of(Y,X).

owns(spaniard, dog).
drinks(ukrainian, tea).
smokes(japanese, parliaments).
right_of(ivory, green).
lives(englishman, red).
owns(X, snail) :- smokes(X, old_gold).
smokes(X, kools) :- owns(X, yellow).
smokes(X, lucky_strike) :- drinks(X, orange_juice).
drinks(X, coffee) :- owns(X, green_house).

少しは理にかなっていますが、同時に完全に間違っているように見えます。これではどこにも行けないと思います。:/

4

3 に答える 3

12

このサイトは、そんな謎をCLP(FD)で解いていきます。しかし、CLP(FD) のフルパワーはここではやり過ぎです: 制約を適切に記述した場合、割り当てはソリューション空間全体を効果的に検索して解決できます。

ソリューションは 5 つの家屋で構成され、各属性は説明によって課されるすべての制約を満たします。

各属性にまったく同じ記号を使用することに注意してください (つまり、 greengreen_houseは間違っています。どちらかを選択してください)。

また、next_to も間違っているようです。1 から 5 までの番号を付けた場合、これは計算または列挙できますが、すぐ隣のものを参照します。

したがって、次のような「ソリューション検索スペース」のデータ表現を完成させます

Problem = [
 house(1, Nationality1, Color1, Pet1, Drinks1, Smokes1),
 house(2, Nationality2, Color2, Pet2, Drinks2, Smokes2),
 ...
],
% place constraints
member(house(_, englishman, red, _, _, _), Problem),
member(house(_, spaniard, _, dog, _, _), Problem),
...

member/2 より単純な Prolog ビルトインですが、この場合は問題を解決するのに十分です: すべての制約がポストされると、変数は適切な値にバインドされます。重要なのは、メンバーがソリューションのメンバーを非決定論的に選択できることです (当然のことです)。

したがって、2 つの異なる要素間の制約を表現する必要がある場合は、2 回メンバーを呼び出し、適切な変数間に制約を配置します。

チェスタレルズを吸う男はキツネを飼っている男の隣の家に住んでいる

に翻訳されます

....,
member(house(N, _, _, _, _, chesterelds), Problem),
member(house(M, _, _, fox, _, _), Problem),
next_to(N, M),
...

このような方法で多くの制約を表現するときは、シンボルの同一性に注意してください。過度のエイリアシングを避けるために、各述語を個別の手順でコーディングすると役立つ場合があります。しかし、反対の部分も真実です。同じシンボルが複数の制約に関係している場合、検索を絞り込むためにシンボルを通過させる必要があります。

「幾何学的」述語の正しい表現について考えてみましょう。next_to と right_of は、列挙するか、算術で表現することができます。

于 2012-02-13T08:33:10.763 に答える