4

アインシュタインのなぞなぞのバリエーションを実装していますが、問題が発生しています。

解を計算しようとするとき、私はこれを試します:

solve(Street) :- Street = [_House1,_House2,_House3,_House4,_House5],
%hint one goes here
%hint two goes here
%etc.

次に、次のように入力して解決策を尋ねます。solve(Street)

ただし、これは解決策として出てきます。

  1. 家(花、食べ物、ペット、スポーツ)
  2. 家(花、食べ物、ペット、スポーツ)
  3. 家(x 、食べ物、ペット、スポーツ)
  4. 家(花、食べ物、ペット、スポーツ)
  5. 家(x、花、ペット、スポーツ)

ご覧のとおり、 xは2回ありますが、残りはすべての種類の食品、花、ペット、スポーツです。しかし、すべてのタイプはユニークです。ある人が花Xを好きなら、他の誰もXを好きになることはできません。

さて、私のソリューションが2 xを与える理由は簡単にわかります。ヒントがたくさん与えられていますが、すべてのヒントで言及されている花は4つだけです。したがって、Prologは別の花があることを知りません。それが可能であり、他のすべてのヒントを満たしているという理由だけで、xを2回使用します。

私が言いたいのは、ストリートの食べ物や花などはすべて種類がユニークなので、すでにすべての種類を使用している場合は空白のままにする必要があるということです。3は次のようになります:house(x , food, pet ,sport)そして5は次のようになります:house(_, flower, pet, sport)

また、これをヒントに追加してみました:(「サボテン」はヒントに記載されていない花の1つだとしましょう) member(house(cactus,_,_,_), Street)

しかし、私のプログラムは終了しません...

ヒントは次のよう になります。with is_neighbour(house(_,_,_,football),house(_,_,fish,_), Street), :AとBがで隣り合っている場合にis_neighbour(A,B,List)与えます。ヒントは次のように翻訳できます。サッカーを愛する人は、魚を飼っている人の隣に住んでいます。trueList

さらに情報を提供する必要がある場合は、詳しく説明します。:)

4

1 に答える 1

2

花が2回報告されないことを表現し、すべての花がバインドされていることを確認するには、permutation / 2述語を使用できます。すべての花のリストは、指定された花のリストの順列である必要があります。これは[未テスト]のようになります

flowers([], []).
flowers([house(Flower,_,_,_)|Street], [Flower|Rest]) :- flowers(Street, Rest).

-- ...
   flowers(Street, Flowers), 
   permutation(Flowers, [kaktus, tulpe, nelke, rose, fingerhut]),

編集:10の花の場合、順列の使用はおそらく遅すぎます。別のアプローチは

flower(kaktus).
flower(tulpe).
flower(nelke).
--...

       flowers(Street,[F1,F2,F3,F4,F5,F6,F7,F8,F9,F10]),
       flower(F1), flower(F2), F1\=F2,
       flower(F3), F3\=F1, F3\=F2,
       flower(F4), F4\=F1, F4\=F2, F4\=F3,
       --...
于 2010-12-10T16:17:54.113 に答える