2016-08-13 5 views
1

Я пытаюсь решить загадку Эйнштейна с помощью Пролога. ЗадачаEinstein puzzle in Prolog

  1. Норвежцы живут в первом доме.
  2. Английский живет в Красном доме.
  3. Шведский HAS Dogs В качестве домашних животных.
  4. Датский чай для напитков.
  5. Зеленый дом находится слева от Белого дома.
  6. Человек, который живет в зеленом доме, выпивает кофе.
  7. Человек, который курит Pall Mall, воспитывает птиц.
  8. Человек, живущий в Желтом доме, курит Данхилл.
  9. Человек, который живет в Среднем доме, пьет молоко.
  10. Человек, который курит Blends, живет рядом с тем, у кого есть кошки.
  11. Человек, который держит лошадей, живет рядом с тем, кто курит Данхилл.
  12. Человек, который курит Blue Master, пьет пиво.
  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 -с-лист-из-терминов) –

ответ

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