Prolog 序言-我为什么要使用';dif';而不是'=\=';

Prolog 序言-我为什么要使用';dif';而不是'=\=';,prolog,prolog-dif,Prolog,Prolog Dif,我正在学习《示例序言》(由Helder Coelho和Jose C Cotta撰写)一书中的一个例子 有一个解决方案,但它在SWI Prolog中不起作用,甚至不编译 我不得不改变书中的解决方案:使用'dif(X,Y)'而不是'X=\=Y' 有人能解释一下:为什么最初的解决方案不起作用 下面是一个代码: plan(FD,D1,W1,D2,W2) :- frontroom(FD,D1,W1), opposite(D1,D2), room(D2,W2), notopposite(W

我正在学习《示例序言》(由Helder Coelho和Jose C Cotta撰写)一书中的一个例子

有一个解决方案,但它在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
我试图跟踪原始解决方案(用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

为什么我不能使用“=\=”?

它应该是
\=
而不是不正确的
=\=
。我不知道
=\=
除了算术不等式之外,还有什么别的意思

1982年的第三版是,而
=\=
是 与1978年作为DEC10 Prolog系统一部分的同一文件中。因此,即使在这本书之前的版本中,矛盾也存在


到目前为止的文本。但是你绝对正确地认为
dif/2
(\==)/2
更可取。有关详细信息,请参阅。

dif
意味着创建一个约束,以便稍后如果两个操作数接地,则如果两个操作数相同,它将失败。
=\=
意味着它应该立即不同。@WillemVanOnsem:Try
2=\=1+1。
3=\=1+1
@commentupvoter:接地具有相关性是不正确的。考虑<代码> dif(x,y),x= y这里,没有任何接地,但仍然失败。尝试列出所有这些谓词。这需要一点时间。
?- plan(west,D1,W1,D2,W2).
D1 = east,
W1 = south,
D2 = west,
W2 = south
[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