Загадка Эйнштейна в Прологе
Я пытаюсь разгадать загадку Эйнштейна, используя Пролог. Задача
- Норвежец живет в первом доме.
- Англичанин живет в Красном доме.
- Шведские собаки имеют домашних животных.
- Датчанин пьет чай.
- Зеленый дом находится слева от Белого дома.
- Человек, который живет в теплице, пьет кофе.
- Человек, который курит Pall Mall, выращивает птиц.
- Человек, живущий в Желтом доме, курит Данхилл.
- Человек, который живет в Среднем доме, пьет молоко.
- Человек, который курит смесь, живет рядом с тем, у кого есть кошки.
- Человек, который держит лошадей, живет рядом с тем, кто курит Dunhill .
- Человек, который курит Blue Master, пьет пиво.
- Немец курит принц.
- Норвежец живет рядом со стороной Голубого дома.
- Человек, который курит смесь, является соседом того, кто пьет воду.
- У кого-то есть один аквариум с рыбками.
Программа:
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 ответ
Вот одна из причин, по которой вам нужно обратиться, чтобы решить эту проблему. В приведенном ниже фрагменте программы удалено довольно много целей, но все равно это не удается. Одна только видимая часть уже ответственна за отказ. Можете ли вы определить причину этого фрагмента?
(Подробнее об этом методе см. Это объяснение.)
: - op (950, фу, *). * _. : - инициализация (сосед (_Rua)). сосед (_ / *Руа* /): - *длина (Руа, 5), *Rua = [casa (_, noruegues, _, _, _) | _], *член (casa (vermelha, ingles, _, _, _), Rua), *член (casa (_, sueco, _, _, cachorros), Rua), *участник (casa (_, dinamarques, cha, _, _), Rua), esquerda (casa (_ / *verde* /, _, _, _, _), _ / *casa (branca, _, _, _, _)* /, Rua), *участник (casa (verde, _, cafe, _, _), Rua), *член (casa (_, _, _, pallmall, passaros), Rua), *участник (casa (amarela, _, _, dunhill, _), Rua), *Rua = [_, _, casa (_, _, leite, _, _), _, _], *ao_lado (casa (_, _, _, blends, _), casa (_, _, _, _, gatos), Rua), *ao_lado (casa (_, _, _, _, cavalos), casa (_, _, _, dunhill, _), Rua), *участник (casa (_, _, cerveja, bluemaster, _), Rua), *участник (casa (_, alemao, _, prince, _), Rua), *ao_lado (casa (_, noruegues, _, _, _), casa (azul, _, _, _, _), Rua), *ao_lado (casa (_, _, _, blends, _), casa (_, _, agua, _, _), Rua), *член (casa (_, _, _, _, peixes), Rua). esquerda ([A | As], _ / * A * /, E): - *член (E, As). esquerda ([_ | As], A, E): - *esquerda (As, A, E).