1

我现在试着理解序言。我想给出输入: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). 有人可以帮我解决这个问题吗?

4

1 回答 1

1

这里有两个问题:

  • Y is Y+1, 在 Prolog 中没有任何意义;和
  • 请注意,您实际上已经编写了一个functor

Prolog 认为这是一个调用:

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

where没有is(Y,Y+1)被调用,而是作为函子传递。在 Prolog 中没有明确的输入和输出。您调用谓词并通过统一获得结果。

然而,我们可以通过使用递归来解决这个问题:当然convert/2是:00

convert(0,0).

和 ans(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) :-
    R #> 0,
    Y #= R-1,
    convert(X,Y).
于 2017-11-11T14:11:19.443 回答