【问题标题】:calculate the s-number for a natural number using Prolog [duplicate]使用 Prolog 计算自然数的 s 数
【发布时间】:2020-04-10 17:55:28
【问题描述】:

我是 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 数。

我在这里卡住了。我不太明白如何编写条件,以便 Prolog 明白我需要返回 s(S)。条件Number is NewNumber + 1 不再起作用,无法返回到“0”。

你有什么建议吗?

【问题讨论】:

  • 您发表了类似sick logic 的评论,然后您希望得到帮助?
  • 如果Number is NewNumber + 1 适用于从 0 上升,NewNumber is Number - 1 将适用于下降至 0。

标签: prolog successor-arithmetics


【解决方案1】:

在递归步骤中,可以检查是否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 

【讨论】:

  • 非常感谢!我的错误是 Number1 is Number-1 。我第一次愚蠢地试图把它放在最后。非常感谢,一开始肯定有助于从侧面获得一拳。
猜你喜欢
  • 2015-06-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多