prolog - 使用 Prolog 计算自然数的 s 数
问题描述
我是 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”。
你有什么建议吗?
解决方案
在递归步骤中,您可以检查 if 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
推荐阅读
- kubernetes - 在 Windows 10 上安装 Kubernetes
- azure - Azure Devops - 使用 docker 和 Azure 容器注册表 (ACR) 发布管道 - 标记问题
- angular - 页面未检测到更改?
- excel-2010 - Excel 删除重复项(如 SELECT ID、max(Monday)、max(Tuesday)
- c# - 在类中使用静态函数返回它初始化
- ios - UICollectionViewCell 快速调整大小
- python - 在python中使用UI手机作为kivy的默认界面
- django-forms - 包含子表单的 django 表单未显示子表单的验证错误
- python - 尽管没有产生错误,但 python 中的 subprocess.call() 没有产生文件
- javascript - 如何阻止其他人发布请求我的 php