Загадка Эйнштейна с использованием Пролога

Я пытаюсь решить загадку Эйнштейна с помощью Пролога. Когда я пытаюсь пробежать мимо домов (Hs), это показывает Нет. Задача

  1. Британец живет в красном доме.
  2. Швед держит собак как домашних животных.
  3. Датчанин пьет чай.
  4. Зеленый дом находится слева от белого дома.
  5. Хозяин зеленого дома пьет кофе.
  6. Хозяин, который курит Pall Mall, разводит птиц.
  7. Хозяин желтого дома курит Dunhill.
  8. Хозяин, живущий в центральном доме, пьет молоко.
  9. Норвежец живет в первом доме.
  10. Хозяин, который курит Blends, живет рядом с тем, кто держит кошек.
  11. Хозяин, который держит лошадь, живет рядом с тем, кто курит Dunhill.
  12. Хозяин, который курит Bluemasters, пьет пиво.
  13. Немец курит принца.
  14. Норвежец живет рядом с синим домом.
  15. Хозяин, который курит Blends, живет рядом с тем, кто пьет воду.
    houses(Hs) :-
       length(Hs, 5),                                            
       member(h(english,_,_,_,red), Hs),                         
       member(h(swede,dog,_,_,_), Hs),                         
       member(h(_,_,_,coffee,green), Hs),                        
       member(h(dane,_,_,tea,_), Hs),                       
       next(h(_,_,_,_,green), h(_,_,_,_,white), Hs),             
       member(h(_,bird,'Pall Mall',_,_), Hs),                       
       member(h(_,_,'Dunhill',_,yellow), Hs),                         
       Hs = [_,_,h(_,_,_,milk,_),_,_],                           
       Hs = [h(norwegian,_,_,_,_)|_],                            
       next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs),        
       next(h(_,_,blend,_,_), h(_,cat,_,_,_), Hs),             
       member(h(_,_,'Blue Master',beer,_), Hs),                        
       member(h(german,_,'Prince',_,_), Hs),                      
       next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs),  
       next(h(_,_,'Blend',_,_), h(_,_,_,water,_), Hs), 
       member(h(_,fish,_,_,_), Hs).

    next(A, B, Ls) :- append(_, [A,B|_], Ls).
    next(A, B, Ls) :- append(_, [B,A|_], Ls).

Я понятия не имею, что не так. Спасибо


person user3637775    schedule 23.04.2016    source источник
comment
Где определяется next? Это не встроенный предикат SWI Prolog.   -  person lurker    schedule 24.04.2016
comment
Извините, я забыл добавить это. next (A, B, Ls): - добавить (, [A, B |], Ls). next (A, B, Ls): - добавить (, [B, A |], Ls).   -  person user3637775    schedule 24.04.2016
comment
Когда я пытаюсь управлять домами (Hs). Это показывает Нет. Я понятия не имею, почему.   -  person user3637775    schedule 24.04.2016
comment
@ user3637775 - Вероятно, вы неправильно перевели правило. Можете ли вы опубликовать оригинальный текст головоломки?   -  person Enigmativity    schedule 24.04.2016
comment
к настоящему времени вы, должно быть, поняли, что дали 6 различных спецификаций дымов для 5-длинного списка: 'Pall Mall', 'Dunhill', blend, 'Blue Master', 'Prince' и 'Blend'. Невозможно вместить их всех в это. В противном случае очень легко сделать ошибку, вручную переведя правила в те h(....) спецификации; лучше использовать Prolog для этого тоже.   -  person Will Ness    schedule 09.05.2016
comment
Возможный дубликат Загадки Эйнштейна со списком терминов   -  person Mostowski Collapse    schedule 21.12.2016


Ответы (1)


Вот обобщение вашей программы. Я добавил несколько дополнительных *, чтобы удалить несколько целей, и заменил некоторые термины на _/*origterm*/. И все же получившаяся программа все еще дает сбой. Следовательно, ошибка должна быть в оставшемся фрагменте. Вы ничего не сказали о программе (Edit: вы добавили что-то позже), поэтому я (Edit: хочу) не знаю, о чем она. Но, несмотря ни на что, ошибка должна быть в оставшейся видимой части:

:- initialization(houses(_Sol)).
:- op(950, fy, *).
*_.

houses(Hs) :-
   length(Hs, 5),
   * member(h(english,_,_,_,red), Hs),                         %  2
   * member(h(swede,dog,_,_,_), Hs),
   * member(h(_,_,_,coffee,green), Hs),
   * member(h(dane,_,_,tea,_), Hs),
   * next(h(_,_,_,_,green), h(_,_,_,_,white), Hs),
   member(h(_,_/*bird*/,'Pall Mall',_,_), Hs),
   member(h(_,_,'Dunhill',_,_/*yellow*/), Hs),
   * Hs = [_,_,h(_,_,_,milk,_),_,_],
   * Hs = [h(norwegian,_,_,_,_)|_],
   * next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs),
   next(h(_,_,blend,_,_), _/*h(_,cat,_,_,_)*/, Hs),
   member(h(_,_,'Blue Master',_/*beer*/,_), Hs),
   member(h(_/*german*/,_,'Prince',_,_), Hs),
   * next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs),
   next(h(_,_,'Blend',_,_), _/*h(_,_,_,water,_)*/, Hs),
   * member(h(_,fish,_,_,_), Hs).

next(A, B, Ls) :- append(_, [A,B|_], Ls).
next(A, B, Ls) :- append(_, [B,A|_], Ls).

Осталось немногое! В видимой части хоть одна ошибка! (И, строго говоря, ошибок в других частях может быть намного больше. Мы просто не знаем).

person false    schedule 24.04.2016
comment
@ user3637775: Это ответ на ваш вопрос? Это действительно должно быть! - person false; 24.04.2016