1

我试图了解这个 prolog 程序是如何工作的,而且,作为一个初学者,我遇到了一些困难。程序如下:

initialCan([w, b, w, w, w]).
scholten([X], X).
scholten([X, X | Z], Answer) :- scholten([b | Z], Answer).
scholten([X, Y | Z], Answer) :- scholten([w | Z], Answer).
run(Answer) :- initialCan(L), scholten(L, Answer).

这是通过第一个解决方案运行它的跟踪。

{trace}
| ?- run(A).
      1    1  Call: run(_17) ? 
      2    2  Call: initialCan(_84) ? 
      2    2  Exit: initialCan([w,b,w,w,w]) ? 
      3    2  Call: scholten([w,b,w,w,w],_17) ? 
      4    3  Call: scholten([w,w,w,w],_17) ? 
      5    4  Call: scholten([b,w,w],_17) ? 
      6    5  Call: scholten([w,w],_17) ? 
      7    6  Call: scholten([b],_17) ? 
      7    6  Exit: scholten([b],b) ? 
      6    5  Exit: scholten([w,w],b) ? 
      5    4  Exit: scholten([b,w,w],b) ? 
      4    3  Exit: scholten([w,w,w,w],b) ? 
      3    2  Exit: scholten([w,b,w,w,w],b) ? 
      1    1  Exit: run(b) ? 

A = b ? 

我无法理解的是递归调用是如何工作的。究竟发生了什么

scholten([X, X | Z], Answer) :- scholten([b | Z], Answer).

最令人困惑的是 [X, X | Z] 和 [b | Z]。任何帮助,将不胜感激。

4

1 回答 1

0

有问题的规则说,如果scholten看到以两个相同元素开头的列表,则需要将这两个元素替换为单个b. 该列表[b | Z]比 . 短一个元素[X, X | Z]

注意下面的规则

scholten([X, Y | Z], Answer) :- scholten([w | Z], Answer).

有一个单例(即在其他任何地方未使用)变量Y。您应该将规则更改为

scholten([X, Y | Z], Answer) :- X \= Y, scholten([w | Z], Answer).

确保X不等于Y,防止此规则匹配与该规则相同的参数[X, X | Z]

于 2013-03-15T01:48:01.670 回答