2016-08-13 20 views
1

我試圖用Prolog來解決愛因斯坦的謎題。任務是愛因斯坦在Prolog中的拼圖

  1. 挪威人住在第一宮。
  2. 英國人住在紅樓。
  3. 瑞典HAS狗作爲寵物。
  4. 丹麥人喝茶。
  5. 綠屋位於白宮左側。
  6. 住在溫室裏的男人喝咖啡。
  7. 抽菸的波爾購物中心的男人會養鳥。
  8. 住在黃房子裏的男人吸菸登喜路。
  9. 住在中間房子的人喝牛奶。
  10. 吸菸Blends的男人住在有貓的人旁邊。
  11. 保持馬匹的人與吸菸的登喜路住在一起。
  12. 抽藍色大師的人喝啤酒。
  13. 德國人吸菸王子。
  14. 挪威人住在藍屋旁邊。
  15. 抽Blends的男人是喝水的人的鄰居。
  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). 
+1

的可能的複製[愛因斯坦裏德爾用術語的列表](http://stackoverflow.com/questions/36743498/einstein-riddle -with-列表中的字詞) –

回答

5

這是一個原因,你必須地址來解決這個問題。程序片段下面有很多目標被刪除,但仍然失敗。只有可見部分已經對失敗負責。你能發現這個片段的原因嗎?

(有關這方面的方法見 this 解釋。)

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

:- initialization(neighbor(_Rua)). 

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). 

esquerda([A|As], _/*A*/, E) :- 
    *member(E, As). 
esquerda([_|As], A, E) :- 
    *esquerda(As, A, E).