Return 与 Prolog 的整数

Return Integer with Prolog

我现在试着理解序言。我想给出输入:convert(s(s(s(X))),Y) 输出应该是 Y = 3.

convert(s(0), 1).
convert(s(s(0)), 2).
convert(s(X),Y) :- convert(X,Y is (Y+1)).

这些是我现在的规则,但只是输入: convert(s(0), 1)。和 convert(s(s(0)), 2)。工作。

如果我的递归能正常工作,我就不需要规则:convert(s(s(0)), 2)。 有人可以帮我解决这个问题吗?

这里有两个问题:

  • Y is Y+1,在 Prolog 中没有任何意义;和
  • 注意你这里实际上写了一个仿函数.

Prolog 将此视为调用:

convert(X,is(Y,Y+1))

其中 is(Y,Y+1) 未被 调用,但作为函子传递。在 Prolog 中没有明确的输入和输出。你调用谓词并通过统一,你得到结果。

不过我们可以通过递归来解决这个问题:0convert/2当然是0:

convert(0,0).

s(X)的转换,是X加一的转换:

convert(s(X),R) :-
    convert(X,Y),
    R is Y+1.

或者把这些放在一起:

convert(0,0).
convert(s(X),R) :-
    convert(X,Y),
    R is Y+1.

现在我们可以调用谓词列出所有Peano数和对应的数,以及将Peano数转换为数字。我们还可以验证 Peano 数是否为正常数。

不幸的是,我们不能使用此谓词从给定数字中获取 Peano 数:它将与 Peano 数统一,但试图寻找另一个 Peano 数时,将陷入无限循环。

我们可以使用 clpfd 库来帮助我们:

:- use_module(library(clpfd)).

convert(0,0).
convert(s(X),R) :-
    <b>R #> 0,
    Y #= R-1,</b>
    convert(X,Y).