2016-04-23 12 views
2

私はPrologを使用してアインシュタインの謎を解こうとしています。私が家(Hs)で走ってみると、いいえ。タスクはEinstein Riddle using Prolog

  1. 赤い家に住んでいます。
  2. スウェーデンはペットとして犬を飼っています。
  3. デーンはお茶を飲みます。
  4. 緑の家は白い家のすぐ左です。
  5. グリーンハウスのオーナーはコーヒーを飲みます。
  6. ポールモールを吸うオーナーは鳥を飼育します。
  7. イエローハウスの所有者がダンヒルを吸う。
  8. センターハウスに住むオーナーはミルクを飲みます。
  9. ノルウェー人は最初の家に住んでいます。
  10. 煙を吸うオーナーは、猫を飼っている人の隣に住んでいます。
  11. ダンヒルを吸う人の隣に馬を飼っている所有者がいる。
  12. Bluemastersを吸うオーナーはビールを飲みます。
  13. ドイツのスモークプリンス。
  14. ノルウェー人は、青い家の隣に住んでいます。
  15. 喫煙者は水を飲む人の隣に息を吹き込みます。
 
    houses(Hs) :- 
     length(Hs, 5),            
     member(h(english,_,_,_,red), Hs),       
     member(h(swede,dog,_,_,_), Hs),       
     member(h(_,_,_,coffee,green), Hs),       
     member(h(dane,_,_,tea,_), Hs),      
     next(h(_,_,_,_,green), h(_,_,_,_,white), Hs),    
     member(h(_,bird,'Pall Mall',_,_), Hs),      
     member(h(_,_,'Dunhill',_,yellow), Hs),       
     Hs = [_,_,h(_,_,_,milk,_),_,_],       
     Hs = [h(norwegian,_,_,_,_)|_],        
     next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs),   
     next(h(_,_,blend,_,_), h(_,cat,_,_,_), Hs),    
     member(h(_,_,'Blue Master',beer,_), Hs),       
     member(h(german,_,'Prince',_,_), Hs),      
     next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs), 
     next(h(_,_,'Blend',_,_), h(_,_,_,water,_), Hs), 
     member(h(_,fish,_,_,_), Hs). 

    next(A, B, Ls) :- append(_, [A,B|_], Ls). 
    next(A, B, Ls) :- append(_, [B,A|_], Ls). 

私が間違って何であるか見当がつかない。ありがとう

+1

「next」はどこに定義されていますか?これは組み込みのSWI Prolog述語ではありません。 – lurker

+0

申し訳ありません追加するのを忘れてしまいました。 next(A、B、Ls): - append(_、[A、B | _]、Ls)。 next(A、B、Ls): - append(_、[B、A | _]、Ls)。 – user3637775

+1

私は家(Hs)を走ろうとしています。いいえ、私には理由が分かりません。 – user3637775

答えて

5

あなたのプログラムの一般化です。いくつかのゴールを取り除き、いくつかの用語を置き換えた*をいくつか追加しました。_/*origterm*/で置き換えました。しかし、結果として得られるプログラムはまだ失敗しています。したがって、エラーは残りのフラグメントででなければなりません。あなたはプログラムについて何も言わなかった(編集:後で何かを追加した)ので、私は(編集:したい)それが何であるか知っていない。しかし、エラーが残りの目に見える部分にある必要があります:

:- initialization(houses(_Sol)). 
:- op(950, fy, *). 
*_. 

houses(Hs) :- 
    length(Hs, 5), 
    * member(h(english,_,_,_,red), Hs),       % 2 
    * member(h(swede,dog,_,_,_), Hs), 
    * member(h(_,_,_,coffee,green), Hs), 
    * member(h(dane,_,_,tea,_), Hs), 
    * next(h(_,_,_,_,green), h(_,_,_,_,white), Hs), 
    member(h(_,_/*bird*/,'Pall Mall',_,_), Hs), 
    member(h(_,_,'Dunhill',_,_/*yellow*/), Hs), 
    * Hs = [_,_,h(_,_,_,milk,_),_,_], 
    * Hs = [h(norwegian,_,_,_,_)|_], 
    * next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs), 
    next(h(_,_,blend,_,_), _/*h(_,cat,_,_,_)*/, Hs), 
    member(h(_,_,'Blue Master',_/*beer*/,_), Hs), 
    member(h(_/*german*/,_,'Prince',_,_), Hs), 
    * next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs), 
    next(h(_,_,'Blend',_,_), _/*h(_,_,_,water,_)*/, Hs), 
    * member(h(_,fish,_,_,_), Hs). 

next(A, B, Ls) :- append(_, [A,B|_], Ls). 
next(A, B, Ls) :- append(_, [B,A|_], Ls). 

あまり残っていません!目に見える部分には少なくとも1つのエラーがあります! (厳密に言えば、他の部分にはもっと多くの誤りがあるかもしれません。わかりません)。

+1

@ user3637775:これはあなたの質問に答えますか?それは本当にすべきです! – false