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/1
和 count/3
谓词似乎是正确的。
如果您想要“更大”,其中 greater(X, Y)
表示 X 大于 Y,您可以这样写:
greater(succ(_), 0).
greater(succ(X), succ(Y)) :- greater(X, Y).
您的解决方案检查 X 是否 正好比 Y 大。
请注意,没有任何东西大于 0。
如果您根据 count/3
和 greater/2
实施 more/1
,您会写:
more(X) :-
count(X, Forward, Backward),
greater(Forward, Backward).
所以我绝对是 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/1
和 count/3
谓词似乎是正确的。
如果您想要“更大”,其中 greater(X, Y)
表示 X 大于 Y,您可以这样写:
greater(succ(_), 0).
greater(succ(X), succ(Y)) :- greater(X, Y).
您的解决方案检查 X 是否 正好比 Y 大。
请注意,没有任何东西大于 0。
如果您根据 count/3
和 greater/2
实施 more/1
,您会写:
more(X) :-
count(X, Forward, Backward),
greater(Forward, Backward).