prolog使用递归来寻找后继者

时间:2014-10-25 11:54:29

标签: prolog successor-arithmetics

我现在正在尝试学习prolog而且我开始了递归主题。在这个例子中遇到了继任者。

numeral(0).
numeral(succ(X)) :- numeral(X)

我确实理解它在理论上是如何运作的。需要数字X和succ递增它。我的问题是,这是一个内置的谓词吗?或者在这个例子中还有其他事情发生了。示例来自learnprolognow.org

然后我遇到了这个练习

pterm(null).
pterm(f0(X)) :- pterm(X).
pterm(f1(X)) :- pterm(X).

表示二进制,即0表示f0(null),1表示f1(null),2(10)表示f0(f1(null)),3(11)表示f1(f1(null) )等 该问题要求定义谓词(P1,P2),以便P2通过使用pterms成为P1的后继者。 有人可以为我更详细地解释这个问题吗? 我现在看到它的方式,我必须遍历P1直到我到达结束然后将它与P2进行比较,但我不完全确定语法。 任何提示都很有用

2 个答案:

答案 0 :(得分:1)

似乎检查顶级参数就足够了。只是一个提示

psucc(pterm(f0(X)), pterm(f1(f0(X)))).
...

答案 1 :(得分:1)

succ是一个复合词,而不是内置谓词。

按照以下两个条款:

numeral(0).

这意味着数字(0)为真,即0是数字

numeral(succ(X)) :- numeral(X)

如果您可以显示数字(X)为真,则表示数字(succ(X))为真。

如果您询问查询:

?- numeral(succ(succ(0)).

然后prolog会说True:数字(succ(succ(0))如果数字(succ(0))为真则为真。如果数字(0)为真,则数字(succ(0))为真。我们知道数字(0)是真的。

如果你问

?- numeral(X).

然后prolog将回复X = 0然后X = succ(0)然后X = succ(succ(0))等等,因为它找到满足你的子句的条件。

现在回答你的pterm问题......

首先考虑一下你正在建造的结构。它是二进制数,最外面的项是最低有效位。以下是一些事实的例子:

1: succ(f1(null),f0(f1(null))
2: succ(f0(f1(null)),f1(f1(null))
3: succ(f1(f1(null)),f0(f0(f1(null)))

如果你看一下上面2和3的例子,你应该能够得出三个感兴趣的案例。作为提示,第一种情况是如果该术语的形式为f0(X),则后继者为f1(X)。