这里有两个问题:
Y is Y+1
, 在 Prolog 中没有任何意义;和
- 请注意,您实际上已经编写了一个functor。
Prolog 认为这是一个调用:
convert(X,is(Y,Y+1))
where没有is(Y,Y+1)
被调用,而是作为函子传递。在 Prolog 中没有明确的输入和输出。您调用谓词并通过统一获得结果。
然而,我们可以通过使用递归来解决这个问题:当然convert/2
是:0
0
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).