Prolog を使用してアインシュタインのなぞなぞを解こうとしています。タスクは
- ノルウェー人は最初の家に住んでいます。
- イギリス人はレッドハウスに住んでいます。
- スウェーデンはペットとして犬を飼っています。
- デンマーク人はお茶を飲みます。
- グリーンハウスはホワイトハウスの左側にあります。
- 温室に住む男はコーヒーを飲む。
- ポール・モールを吸う男は鳥を飼っている。
- イエローハウスに住む男性はダンヒルを吸っている。
- ミドルハウスに住む男は牛乳を飲む。
- Blends を吸う男は、Has Cats の隣に住んでいます。
- 馬を飼う男は、ダンヒルを吸う男の隣に住んでいます。
- ブルーマスターを吸う男はビールを飲む。
- ドイツ人はプリンスを吸う。
- ノルウェー人はブルーハウス側の隣に住んでいます。
- ブレンドを吸う男は、水を飲む人の隣人です。
- 誰かが魚の入った水族館を持っています。
プログラム:
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).