列表上的Prolog递归

时间:2013-03-15 01:35:52

标签: list recursion prolog

我试图了解这个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]。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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]相同的参数匹配。