使用Prolog计算自然数的s数

问题描述 投票:0回答:1

我是Prolog的新手,但仍然习惯于它的“病态”逻辑=)

我的任务是创建将自然数转换为“ S数”,反之亦然的函数。

因此数字0将为0。1是s(0)。2是s(s(0))。等等。

nat(0).

nat(s(0)):- nat(X).

用于查找已经存在的给定S数的自然数的函数:

s2nat(0, 0) :- !.

s2nat(s(S),Number) :- s2nat(S,NewNumber), Number is NewNumber + 1.

所以?- s2nat(s(s(s(0))), X)会将X=3作为输出。

现在,我需要编写一个与之相反的函数:返回给定自然数的S数。在这里我被困住了。我不太了解如何编写条件,以便序言理解我需要返回s(S)。条件Number is NewNumber + 1不再适用,无法返回到“ 0”。

您有什么建议吗?

prolog swi-prolog
1个回答
0
投票

在递归步骤中,您可以检查是否为Number > 0,并使用Number-1进行递归:

snat(0, 0).
snat(s(S), Number) :-
    Number > 0,
    Number1 is Number-1,
    s2nat(S, Number1).

例如,可以使用clpfd库来使谓词具有多向性:

:- use_module(library(clpfd)).

snat(0, 0).
snat(s(X), N) :-
    N #> 0,
    N1 #= N-1,
    snat(X, N1).

因此该谓词可以计算数字的Peano表示形式,计算Peano表示形式表示的数字,验证给定的Peano编号是否确实是给定的数字,并列举所有可能的Peano表示形式及其对应的数字:

?- snat(X, 4).
X = s(s(s(s(0)))) ;
false.

?- snat(s(s(0)), N).
N = 2.

?- snat(s(s(0)), 2).
true.

?- snat(s(s(0)), 4).
false.

?- snat(X, N).
X = N, N = 0 ;
X = s(0),
N = 1 ;
X = s(s(0)),
N = 2 ;
X = s(s(s(0))),
N = 3 ;
X = s(s(s(s(0)))),
N = 4 
© www.soinside.com 2019 - 2024. All rights reserved.