Prolog:链接多个规则

Prolog: Chaining multiple rules

所以我绝对是 Prolog 的初学者。我目前正在学习递归,这是我迄今为止在任务中得到的。

dance(start). 
dance(forward(T)) :- dance(T). 
dance(backward(T)) :- dance(T). 

count(start,0,0).                   
count(forward(X),succ(Y),Z) :- count(X,Y,Z).  
count(backward(X),Y,succ(Z)) :- count(X,Y,Z).   

greater(succ(0),0).   
greater(succ(Y),succ(Z)):-greater(Y,Z).`

这应该做什么的总结:可以有从“开始”开始的舞蹈,然后每次递归向前或向后添加。在计数方面,我设法能够计算给定序列中向前和向后的数量,并将它们保存在“succ”符号中,并且我想比较两个这样的“succ”数字。如果第一个参数更大(包含比第二个参数更多的“成功”),则 greater 应为真。

现在我的任务是编写一个新规则“more(X)”,如果序列 X(根据舞蹈构建)向前多于向后,则该规则为真。我想我已经拥有了它所需的所有子任务,但现在我无法将它们链接在一起,因为直到现在我只有 2 个具有相同数量参数的规则,但在这种情况下,我得到了一个具有 1、2 和 3 个参数的规则.解决方案应该是这样的

more(X):-greater(Y,Z)

但是如何让我的“succ”数字从“count”到“greater”以及给定的序列 X 到“count”?我确实必须更改一些规则,否则永远不会调用 count,对吗?

所以应该更像 more(X):-greater(count(X,Y,Z)) ?

但像这样,我将不得不改变更大的规则才能“得到”这种类型的参数。

查询示例 ?- more(backward(forward(start))).

错误。

?- 更多(前进(开始))。

正确。

So it should be more like more(X):-greater(count(X,Y,Z)) ?

不,您写的好像是 Python 并且 greater(count(X,Y,Z)) 会在 return 上调用 greater(...) 从计数。 Prolog 谓词不是函数调用,并且 count(...) 不会 return 那样做。

计数的结果是Y和Z。(您使用的这些名称可能更清楚)。进行计数,然后将 Y 和 Z 用于其他用途。

count(X,Y,Z),
greater(Y,Z)

逗号是AND; “如果 X 的计数是 Y 且 Z AND Y 大于 Z,则此代码有效”。

您的 dance/1count/3 谓词似乎是正确的。

如果您想要“更大”,其中 greater(X, Y) 表示 X 大于 Y,您可以这样写:

greater(succ(_), 0).
greater(succ(X), succ(Y)) :- greater(X, Y).

您的解决方案检查 X 是否 正好比 Y 大

请注意,没有任何东西大于 0。

如果您根据 count/3greater/2 实施 more/1,您会写:

more(X) :-
    count(X, Forward, Backward),
    greater(Forward, Backward).