пролог - почему я должен использовать 'dif' вместо '= \ =' - PullRequest
1 голос
/ 22 марта 2020

Я изучаю пример из книги «Пролог на примере» (Хелдер Коэльо и Хосе C Котта).

Write a program for designing an architectural unit
obeying the following specifications:

+ Two rectangular rooms
+ Each room has a window and interior door
+ Rooms are connected by interior door
+ One room also has an exterior door
+ A wall can have only one door or window
+ No window can face north
+ Windows cannot be on opposite sides of the unit

enter image description here

Есть решение, но оно не работает на SWI-Prolog, даже не компилируется.

Мне пришлось изменить решение из книги: используйте «dif (X, Y)» вместо «X = \ = Y».

Может кто-нибудь объяснить: почему оригинальное решение не работает ?

Вот код:

plan(FD,D1,W1,D2,W2) :-
  frontroom(FD,D1,W1),
  opposite(D1,D2),
  room(D2,W2),
  notopposite(W1,W2).

frontroom(FD,D,W) :-
  room(D,W),
  direction(FD),
  dif(FD,D),     % FD =\= D,   % <- original was commented
  dif(FD,W).     % FD =\= W.   % <- original was commented

room(D,W) :-
  direction(D),
  direction(W),
  dif(D,W),      % D =\= W,     % <- original was commented
  dif(W,north).  % W =\= north. % <- original was commented

direction(north).
direction(south).
direction(east).
direction(west).

opposite(north,south).
opposite(south,north).
opposite(east,west).
opposite(west,east).

notopposite(D1,D2) :-
  opposite(D1,D3),
  dif(D2,D3).  % D2 =\= D3. % <- original was commented

Я могу сделать запрос и получить ответ:

?- plan(west,D1,W1,D2,W2).
D1 = east,
W1 = south,
D2 = west,
W2 = south

Я пытаюсь найти исходное решение (с D2 = \ = D3 вместо dif (D2, D3)) и получите это:

[trace]  ?- plan(west,D1,W1,D2,W2).
   Call: (8) plan(west, _9632, _9634, _9636, _9638) ? creep
   Call: (9) frontroom(west, _9632, _9634) ? creep
   Call: (10) room(_9632, _9634) ? creep
   Call: (11) direction(_9632) ? creep
   Exit: (11) direction(north) ? creep
   Call: (11) direction(_9634) ? creep
   Exit: (11) direction(north) ? creep
   Call: (11) north=\=north ? creep
ERROR: Arithmetic: `north/0' is not a function

Почему я не могу использовать '= \ ='?

1 Ответ

2 голосов
/ 22 марта 2020

Это должно быть скорее \==, чем неправильное =\=. Я не знаю, что =\= когда-либо означало нечто иное, чем арифметическое неравенство.

3-е издание 1982 года онлайн , а =\= - даже задокументировано в самом тот же документ, что и часть DECsystem 10 Prolog от 1978. Таким образом, противоречие присутствует даже в этой предыдущей версии упомянутой книги.

Пока что касается текста. Но вы абсолютно правы, что dif/2 предпочтительнее (\==)/2. Подробнее см. .

...