0

有四个篮子,每个篮子都有独特的颜色。我编写了一个序言程序来根据一些事实和规则来告诉颜色顺序。这是 .pl 文件:

iright(L, R, [L | [R | _]]).
iright(L, R, [_ | Rest]) :- iright(L, R, Rest).
nextto(L, R, List) :- iright(L, R, List).
nextto(L, R, List) :- iright(R, L, List).

myprogram(Data) :-     =(Data, [_,red,_,_]), 
\+nextto(red,blue,Data), % blue is not next to red
iright(red,green,Data), %green is right to red
member(red,Data),
member(blue,Data),
member(green,Data),
member(yellow,Data).

iright 和 nextto 谓词是正确的。我的查询是myprogram(Data),我希望结果应该是

Data = [yellow,red, green, blue]?
yes

但实际上提示表明

| ?- myprogram(Data).

no

我知道问题在于否定,但不知道如何以及为什么。请帮忙。

当我使用trace.

      1    1  Call: myprogram(_16) ? 
      2    2  Call: \+nextto(red,blue,[_46,red,_50,_52]) ? 
      3    3  Call: nextto(red,blue,[_46,red,_50,_52]) ? 
      4    4  Call: iright(red,blue,[_46,red,_50,_52]) ? 
      5    5  Call: iright(red,blue,[red,_50,_52]) ? 
      5    5  Exit: iright(red,blue,[red,blue,_52]) ? 
      4    4  Exit: iright(red,blue,[_46,red,blue,_52]) ? 
      3    3  Exit: nextto(red,blue,[_46,red,blue,_52]) ? 
      2    2  Fail: \+nextto(red,blue,[_46,red,_50,_52]) ? 
      1    1  Fail: myprogram(_16) ? 

(2 ms) no
4

1 回答 1

1

如果将 移到\+nextto(red, blue, Data)的最后一行myprogram,它会起作用。

这有点不直观,但您需要考虑一下 Prolog 如何评估表达式以及否定的真正含义。否定的意思是“这不可能是真的”,而不是“对于一组特定的值不可能是真的”。如果您将程序简化为:

 myprogram(Data) :-
    =(Data, [_,red,_,_]),
    \+nextto(red,blue,Data).

你仍然会得到一个No.. 这是因为,根据您的声明,Data可以 [_, red, blue, _]- 您会在Exit: iright(red,blue,[red,blue,_52]). Prolog 尝试回溯,但它没有其他可以尝试的方法 - 您尚未将任何 _s 限制为具有特定值。

如果,OTOH,您将所有 nextto、member 和 iright 语句放在否定语句之前,那么当它到达否定表达式时,有多种可能的解决方案(嗯,两个)可以尝试:Data = [blue,red,green,yellow]Data = [yellow,red,green,blue]。此时,当它看到否定时,它会“丢弃”红色与蓝色相邻的“分支”,但它能够回溯并具有使否定为真的可能的世界状态。也就是说:

myprogram(Data) :-
    =(Data, [_,red,_,_]),
    iright(red,green,Data),
    member(red,Data),
    member(blue,Data),
    member(green,Data),
    member(yellow,Data),
    \+nextto(red,blue,Data).

...给你想要的结果。

TL;DR - Prolog 中的否定(和削减,当你遇到它们时)比你最初想象的要强大得多。在使用它们之前,请确保您首先弄清楚了其他所有内容。

于 2012-11-21T00:43:48.070 回答