我试图了解这个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]。任何帮助将不胜感激。
答案 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]
相同的参数匹配。