successor-arithmetics相关内容
让我们考虑 n=s(s(...s(0)...)) (简单地说 n= s^n(0)).如何编写一个计算两个整数相除的程序?我的意思是 s^(n//m) (这是除法的定义).有任何想法吗?例如,如果我们有这样的问题: ?-除法(s(s(s(s(0)))),s(0),D). 我写了以下代码: nat(0).nat(s(X)) :- nat(X).除法(0,_,D):- D 为 0.除(s(X),
..
我现在试着理解序言.我想给出输入: convert(s(s(s(X))),Y) 输出应该是 Y = 3. convert(s(0), 1).转换(s(s(0)),2).转换(s(X),Y):-转换(X,Y是(Y + 1)). 这些是我现在的规则,但只有输入:convert(s(0), 1).和转换(s(s(0)), 2).工作. 如果我的递归可以正常工作,我就不需要规则:convert(
..
我在 Prolog 中做一个非常简单的练习,在跟踪中有一些我不明白的东西.该程序是对表示为后继的整数的“大于"(>): greater_than(succ(_), 0).大于(成功(A),成功(B)):-大于(A,B). 我的问题:我不明白为什么请求 greater_than(succ(succ(succ(0))),succ(0)) 会在以下跟踪: [trace] ?-greater_tha
..
下面的 Prolog 程序定义了一个谓词 fact/2,用于在后续算术中计算整数的阶乘: 事实(0,s(0)).事实(s(X),Y):-事实(X,Z),产品(s(X),Z,Y).产品(0,_,0).产品(s(U),V,W):-总和(V,X,W),产品(V,U,X).总和(0,Y,Y).总和(s(X),Y,s(Z)):-总和(X,Y,Z). 它适用于这种参数模式下的查询: ?- 事实(s(0)
..
让我们考虑以下 Prolog 程序(来自“The Art of Prolog"): natural_number(0).自然数(s(X)):- 自然数(X).加(X,0,X):-自然数(X).加(X,s(Y),s(Z)):-加(X,Y,Z). 和查询: ?- plus(s(s(s(0))), s(0), Z). SICStus 和 SWI 都产生预期的 Z = s(s(s(s(0))))
..
Peano 算术中的这个小于谓词 less(0, s(_)).更少(s(X),s(Y)):-更少(X,Y). 循环时 ?-less(X, Y), X=s(0), Y=0. 有没有更好的方法来编写 less/2(仅使用 Horn 子句)? 解决方案 你可以使用when/2.使它不再是一个无限枚举的谓词,并且仍然保持 100% 的纯正.when/2 修改SLD-Resolution,一
..
我对自然数的下一个程序是SWI-prolog: natural_number(0).自然数(s(X)):- 自然数(X). 现在我想做一个递归调用,当我们到达 0 时停止. 我的自然数表示为 - s(0)=0, s(s(0))=1, s(s(s(0)))=2, etc 所以我定义: recommend(A, B, natural_number(0)) :-dosomeFINITE
..
为了了解 Prolog 中的绿色切割,我试图将它们添加到后继算术中 sum 的标准定义中(请参阅 这个查询的 SLD 树是什么?).这个想法是通过消除所有无用的回溯(即,没有 ... ; false)尽可能“清理"输出,同时在所有可能的参数实例化组合下保持相同的行为 - 所有实例化,一/二/三完全未实例化,以及所有变体,包括部分实例化的参数. 这是我在尝试尽可能接近这个理想时能够做到的(我承
..
我需要使用自然数为 2 的幂创建一个 Prolog 谓词.自然数有:0、s(0)、s(s(0))等等…… 例如: ?- pow2(s(0),P).P = s(s(0));错误的.?- pow2(P,s(s(0))).P = s(0);错误的. 这是我的代码: times2(X,Y) :-添加(X,X,Y).pow2(0,s(0)).pow2(s(N),Y) :-pow2(N,Z),次2
..
我在教程中遇到了这种逻辑数的自然数评估,这让我有些头疼: natural_number(0).自然数(s(N)):- 自然数(N). 规则大致规定:如果 N 是 0 这是很自然的,如果不是我们尝试将 s/1 的内容发回递归到规则直到内容为0,则为自然数,否则为非自然数. 所以我测试了上面的逻辑实现,心想,如果我想将 s(0) 表示为 1 和 s(s(0)) 为 2,但我希望能够将 s(0
..
(让我在期中问题的浪潮中潜入.) 两个自然数之和的常见定义是nat_nat_sum/3: nat_nat_sum(0, N, N).nat_nat_sum(s(M), N, s(O)) :-nat_nat_sum(M, N, O). 严格来说,这个定义太笼统了,因为我们现在也成功了 ?- nat_nat_sum(A, B, unnatural_number). 同样,我们得到以下答案
..
我开始学习 Prolog 并首先了解了后继符号. 这就是我了解如何在 Prolog 中编写 Peano 公理的地方. 请参阅 PDF 的第 12 页: sum(0, M, M).总和(s(N),M,s(K)):-总和(N,M,K).产品(0,M,0).产品(s(N),M,P):-产品(N,M,K),总和(K,M,P). 我将乘法规则放入 Prolog.然后我进行查询: ?- pr
..
Prolog 中有两种可能的加法规则,根据 cTI 具有不同的终止属性: cTI 报告 sum(A,B,C)terminates_if b(A);b(C). 对于以下规则: sum(0, Y, Y).总和(s(X), Y, s(Z)) :-总和(X,Y,Z). cTI 报告 sum(A,B,C)terminates_if b(A),b(B);b(C). 对于以下规则(X 和 Y 交换
..
我该怎么做. 我需要定义谓词shownumber(X,N),当符号X对应于自然数N时为真.例如,shownumber(s(zero),1) 是真的.好的,现在我有了一个谓词: shownumber(零,0).shownumber(s(N),X):-shownumber(N,Y),X为Y+1. 现在我需要使用 shownumber (X, Y) 谓词来定义: 1) times (X,
..
Peano 算术中的这个小于谓词 less(0, s(_)).少(s(X),s(Y)): - 少(X,Y). 何时循环 ?-less(X, Y), X=s(0), Y=0. 是否有更好的方法来编写 less/2(仅使用 Horn 子句)? 解决方案 您可以使用 when/2.使它不再是一个无限枚举的谓词,并且仍然保持 100% 纯净.when/2 修改了 SLD-Resolutio
..
如果可能的话,我希望有人解释一下此过程(摘自《立即学习入门》一书).它需要两个数字并将它们加在一起. add(0,Y,Y). add(s(X),Y,s(Z)) :- add(X,Y,Z). 原则上我理解,但是我有一些问题.可以说我发出查询 ?- add(s(s(0)), s(0), R). 这将导致: R = s(s(s(0))). 步骤1是与规则2的匹配.现在X
..
我的以下引理不完整: Lemma (s_is_plus_one : forall n:nat, S n = n + 1). Proof. intros. reflexivity. Qed. 此证明失败 Unable to unify "n + 1" with "S n". 似乎可以用eq_S来证明这一点,但是我不能应用它(它不能将n + 1识别为S n:Error: U
..
我写了以下代码: nat(0). nat(s(X)) :- nat(X). divide(0,_,0). divide(X,Y,D) :- X@
..
有人可以向我解释为什么此序言查询以这种方式起作用.定义是: add(0,Y,Y). add(succ(X),Y,succ(Z)):- add(X,Y,Z). 为此: ?- add(succ(succ(succ(0))), succ(succ(0)), R). 在此处查询查询: Call: (6) add(succ(succ(succ(0))), succ(s
..
我一直在尝试学习Prolog,并且对谓词s()的功能完全感到困惑. 我看到它经常使用,并且关于Prolog的互联网资源很少,我找不到答案. 例如. /* sum(Is,S) is true if S is the sum of the list of integers Is. */ sum([],0). sum([0|Is],S):-sum(
..