Вариация зебры в прологе, и я не могу понять, где я иду не так - PullRequest
0 голосов
/ 23 марта 2020

Я знаю, что загадку зебра часто спрашивают здесь, но это немного отличается: нам дали написать вариант загадки зебра в Прологе. Я очень новичок в этом, но я даже пытался получить помощь от некоторых людей в прошлом году, у которых были другие варианты, и они не были уверены, что происходит с моим кодом.

Я опубликую все это, я надеюсь, что это не излишняя или плохая практика.

register_renderer/2

:- use_rendering(table,
         [header(dorm('Major', 'Car', 'Team', 'Music', 'Drink'))]).

csMusic(Music) :-
  dorms(Dorms),
  member(dorm(computerscience,_,_,Music,_),Dorms).

engDrink(Drink) :-
  dorms(Dorms),
  member(dorm(english,_,_,_,Drink),Dorms).

dorms(Dorms) :-
      length(Dorms, 5),

      % 1.  The computer science student lives in the middle of the corridor.
      Dorms = [_,_,(dorm(computerscience,_,_,_,_)),_,_],
      % 2.  The history major is a jazz fan.
      member(dorm(history,_,_,jazz,_),Dorms),
      % 3.  The Yankees fan drives a Toyota.
      member(dorm(_,toyota,yankees,_,_),Dorms),
      % 4.  The accounting major drinks Coke.
      member(dorm(accounting,_,_,_,coke),Dorms),
      % 5.  The engineering major drinks coffee.
      member(dorm(engineering,_,_,_,coffee),Dorms),
      % 6.  The computer science student and history student are neighbors.
      adjacent((dorm(computerscience,_,_,_,_)),(dorm(history,_,_,_,_)),Dorms),
      % 7.  The student at the far end of the hall likes classical music.
      Dorms = [_,_,_,_,(dorm(_,_,_,classical,_))],
      % 8.  The tea drinker drives a Tesla.
      member(dorm(_,_,_,_,_),Dorms),
      % 9.  The classical music fan lives next to the jazz listener.
      adjacent((dorm(_,_,_,classical,_)),(dorm(_,_,_,jazz,_)),Dorms),
      % 10. The English major does not live in either of the first two rooms.
      member(dorm(english,_,_,_,_),Dorms),
      not(Dorms = [dorm(english,_,_,_,_)]),
      not(Dorms = [_,dorm(english,_,_,_,_),_,_,_]),
      % 11. The Royals fan drives a Tesla.
      member(dorm(_,tesla,royals,_,_),Dorms),
      % 12. The Cubs fan listens to jazz.
      member(dorm(_,_,cubs,jazz,_),Dorms),
      % 13. The engineering major follows the Chiefs
      member(dorm(engineering,_,chiefs,_,_),Dorms),
      % 14. The first room is the home of the Broncos fan
      Dorms = [dorms(_,_,broncos,_,_),_,_,_,_],
      % 15. The Coke drinker drives a Nissan.
      member(dorm(_,nissan,_,_,coke),Dorms),
      % 16. The country music fan and the techno fan are neighbors.
      adjacent((dorm(_,_,_,country,_)),(dorm(_,_,_,techno,_)),Dorms),
      % 17. The accounting major lives in the first room.
      Dorms = [dorms(accounting,_,_,_,_),_,_,_,_],
      % 18. The fans of the 2 Kansas City teams (Chiefs and Royals) are neighbors
      adjacent((dorm(_,_,chiefs,_,_)),(dorm(_,_,royals,_,_)),Dorms),
      % 19. The accounting major listens to rock music
      member(dorm(accounting,_,_,rock,_),Dorms),
      % 20. The Yankees fan drinks milk.
      member(dorm(_,_,yankees,_,milk),Dorms),
      % 21. The Chevy driver listens to country music.
      member(dorm(_,chevy,_,country,_),Dorms),
      % 22. The jazz fan drives a Ford.
      member(dorm(_,ford,_,jazz,_),Dorms),
      % 23. Water isnt used.
      member(dorm(_,_,_,_,water),Dorms).

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

Моя база данных загружается просто отлично, но выдает false, когда я пытаюсь что-либо запустить. Если я запускаю dorms(Dorms), чтобы распечатать все результаты, мне возвращается false. Когда я запускаю csMusic (пытаясь найти тип музыки c, которую слушает майор CS) или engDrink (пытаясь найти, какой напиток основные напитки Engli sh), я возвращаюсь false.

Я довольно мало знаю о Прологе, но я приложил все усилия, чтобы следить за этим на веб-сайте swipl . Может быть, я что-то упускаю из виду, что кто-то может указать Возможно, несоответствие в именах?

Помощь очень ценится, спасибо!

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Если dorms(Dorms) терпит неудачу, то, конечно, csMusic(Music) завершится неудачей, потому что для успеха требуется dorms(Dorms).

Один из способов найти проблему - попытаться закомментировать некоторые подсказки и затем выполнить запрос dorms(Dorms). Вы обнаружите, что вы получаете несколько решений. В конце концов вы найдете один ключ, который вызывает сбой. Конечно, это не может быть плохой подсказкой.

Еще одна вещь, которая может быть неправильной, - это использование «не». Например, если вы выполните этот запрос:

?- length(Dorms, 5), not(Dorms = [dorm(english,_,_,_,_)]).  % 10.
Dorms = [_9200, _9206, _9212, _9218, _9224].

это тот результат, который вы ожидаете? Возможно, вы захотите пересмотреть «предположение о замкнутом мире», которое использует Пролог для отрицания, и рассмотреть альтернативный способ написания этой подсказки.

Незначительный момент: нет необходимости ставить скобки вокруг dorm(...). Например, первое ограничение может быть записано Dorms = [_,_,dorm(computerscience,_,_,_,_),_,_].

0 голосов
/ 25 марта 2020

В пункте 8 я фактически не упоминал чай или Теслу. В пункте 10 в моем первом использовании not было неверное количество элементов в массиве. В пунктах 14 и 17 я неправильно написал общежитие как «общежитие».

Исправив их, я смог получить правильный и полный ответ.

...