1

Prolog を使用してアインシュタインのなぞなぞを解こうとしています。タスクは

  1. ノルウェー人は最初の家に住んでいます。
  2. イギリス人はレッドハウスに住んでいます。
  3. スウェーデンはペットとして犬を飼っています。
  4. デンマーク人はお茶を飲みます。
  5. グリーンハウスはホワイトハウスの左側にあります。
  6. 温室に住む男はコーヒーを飲む。
  7. ポール・モールを吸う男は鳥を飼っている。
  8. イエローハウスに住む男性はダンヒルを吸っている。
  9. ミドルハウスに住む男は牛乳を飲む。
  10. Blends を吸う男は、Has Cats の隣に住んでいます。
  11. 馬を飼う男は、ダンヒルを吸う男の隣に住んでいます。
  12. ブルーマスターを吸う男はビールを飲む。
  13. ドイツ人はプリンスを吸う。
  14. ノルウェー人はブルーハウス側の隣に住んでいます。
  15. ブレンドを吸う男は、水を飲む人の隣人です。
  16. 誰かが魚の入った水族館を持っています。

プログラム:

neighbor(Rua):-
   length(Rua, 5),
   Rua = [casa(_,noruegues,_,_,_)|_],
   member(casa(vermelha,ingles,_,_,_),Rua),
   member(casa(_,sueco,_,_,cachorros),Rua),
   member(casa(_,dinamarques,cha,_,_),Rua),
   esquerda(casa(verde,_,_,_,_), casa(branca,_,_,_,_),Rua),
   member(casa(verde,_,cafe,_,_),Rua),
   member(casa(_,_,_,pallmall,passaros),Rua),
   member(casa(amarela,_,_,dunhill,_),Rua),
   Rua = [_,_,casa(_,_,leite,_,_),_,_],
   ao_lado(casa(_,_,_,blends,_), casa(_,_,_,_,gatos),Rua),
   ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua),
   member(casa(_,_,cerveja,bluemaster,_),Rua),
   member(casa(_,alemao,_,prince,_),Rua),
   ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),Rua),
   ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua),
   member(casa(_,_,_,_,peixes),Rua).

ao_lado([X,Y|_],X, Y).
ao_lado([X,Y|_],Y, X).
ao_lado([_|L],X, Y):-
   ao_lado(L, X, Y).

esquerda([A|As], A, E) :-
   member2(E, As).
esquerda([_|As], A, E) :-
   esquerda(As, A, E).
4

1 に答える 1

6

この問題を解決するために対処しなければならない理由の 1 つがここにあります。以下のプログラム フラグメントでは、かなり多くの目標が削除されていますが、それでも失敗します。目に見える部分だけがすでに失敗の原因です。この断片から理由がわかりますか?

(この方法の詳細については 、この 説明を参照してください。)

:- op(950, fy, *).
*_.

:- 初期化(隣人(_Rua))。

neighbour( _ /* Rua */):-
    *  length(Rua, 5) ,
    *  Rua = [casa(_,noruegues,_,_,_)|_] ,
    *  member(casa(vermelha,ingles,_, _,_),Rua) ,
    *  member(casa(_,sueco,_,_,cachorros),Rua) ,
    *  member(casa(_,dinamarques,cha,_,_),Rua) ,
   esquerda(casa( _ /*ベルデ*/,_,_,_,_), _ /* casa(ブランカ,_,_,_,_) */,Rua),
    *  member(casa(ベルデ,_, cafe,_,_),Rua) ,
    *  member(casa(_,_,_,pallmall,passaros),Rua) ,
    *  member(casa(amarela,_,_,dunhill,_),Rua) ,
    * ルア= [_,_,casa(_,_,leite,_,_),_,_] ,
    *  ao_lado(casa(_,_,_,ブレンド,_), casa(_,_,_,_, gatos),Rua) ,
    *  ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua) ,
    *  member(casa(_,_,cerveja,bluemaster) ,_),ルア) ,
    * member(casa(_,alemao,_,prince,_),Rua) ,
    *  ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),ルア) ,
    *  ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua) ,
    *  member(casa(_,_,_,_,peixes),Rua) .

esquerda([A|As], _ /*A*/, E) :-
    *  member(E, As) .
esquerda([_|As], A, E) :-
   *  esquerda(As, A, E) .
于 2016-08-13T11:20:48.103 に答える