prolog使用递归查找后继对象

prolog使用递归查找后继对象,prolog,successor-arithmetics,Prolog,Successor Arithmetics,我现在正在努力学习prolog,并开始了递归主题。我为继任者找到了这个例子 numeral(0). numeral(succ(X)) :- numeral(X) 我确实理解它在理论上是如何工作的。它接受数字X,然后succ将其递增。我的问题是,succ是内置谓词吗?或者在这个例子中还有其他的事情吗。示例取自learnprolognow.org 然后我遇到了这个练习 pterm(null). pterm(f0(X)) :- pterm(X). pterm(f1(X)) :- pterm(X).

我现在正在努力学习prolog,并开始了递归主题。我为继任者找到了这个例子

numeral(0).
numeral(succ(X)) :- numeral(X)
我确实理解它在理论上是如何工作的。它接受数字X,然后succ将其递增。我的问题是,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进行比较,但我不能完全确定语法。
任何提示都是有用的

看来检查顶级参数就足够了。只是一个暗示

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

看来检查最高层的论点就足够了。只是一个暗示

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

看来检查最高层的论点就足够了。只是一个暗示

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

看来检查最高层的论点就足够了。只是一个暗示

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

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

按照这两个条款的顺序,您有:

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

numeral(succ(X)) :- numeral(X)
这意味着,如果可以证明数字(X)为真,则数字(such(X))为真

如果你问这个问题:

?- numeral(succ(succ(0)).
然后序言会说True:如果numeric(such(0))为True,则numeric(such(0))为True。如果numeric(0)为True,则numeric(such(0))为True。我们知道numeric(0)为True

如果你问

?- numeral(X).
然后prolog会回复X=0,然后X=such(0),然后X=such(such(0))等等,因为它会找到满足您的子句的术语

现在回答你的问题

首先想想你正在构建的结构。它是一个二进制数,最外层的项是最低有效位。下面是一些正确的例子:

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)。

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

按照这两个条款的顺序,您有:

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

numeral(succ(X)) :- numeral(X)
这意味着,如果可以证明数字(X)为真,则数字(such(X))为真

如果你问这个问题:

?- numeral(succ(succ(0)).
然后序言会说True:如果numeric(such(0))为True,则numeric(such(0))为True。如果numeric(0)为True,则numeric(such(0))为True。我们知道numeric(0)为True

如果你问

?- numeral(X).
然后prolog会回复X=0,然后X=such(0),然后X=such(such(0))等等,因为它会找到满足您的子句的术语

现在回答你的问题

首先想想你正在构建的结构。它是一个二进制数,最外层的项是最低有效位。下面是一些正确的例子:

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)。

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

按照这两个条款的顺序,您有:

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

numeral(succ(X)) :- numeral(X)
这意味着,如果可以证明数字(X)为真,则数字(such(X))为真

如果你问这个问题:

?- numeral(succ(succ(0)).
然后序言会说True:如果numeric(such(0))为True,则numeric(such(0))为True。如果numeric(0)为True,则numeric(such(0))为True。我们知道numeric(0)为True

如果你问

?- numeral(X).
然后prolog会回复X=0,然后X=such(0),然后X=such(such(0))等等,因为它会找到满足您的子句的术语

现在回答你的问题

首先想想你正在构建的结构。它是一个二进制数,最外层的项是最低有效位。下面是一些正确的例子:

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)。

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

按照这两个条款的顺序,您有:

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

numeral(succ(X)) :- numeral(X)
这意味着,如果可以证明数字(X)为真,则数字(such(X))为真

如果你问这个问题:

?- numeral(succ(succ(0)).
然后序言会说True:如果numeric(such(0))为True,则numeric(such(0))为True。如果numeric(0)为True,则numeric(such(0))为True。我们知道numeric(0)为True

如果你问

?- numeral(X).
然后prolog会回复X=0,然后X=such(0),然后X=such(such(0))等等,因为它会找到满足您的子句的术语

现在回答你的问题

首先想想你正在构建的结构。它是一个二进制数,最外层的项是最低有效位。下面是一些正确的例子:

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).

succ/1
只是一个任意函数符号。更常见的是
s/1
succ/1
只是一个任意函数符号。更常见的是
s/1
succ/1
只是一个任意函数符号。更常见的是
s/1
succ/1
只是一个任意函数符号。更常见的是<代码>s/1。