(让我在期中问题的浪潮中偷偷摸摸。)
两个自然数之和的常见定义是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).
同样,我们得到以下答案替换:
?- nat_nat_sum(0, A, B).
A = B.
我们将此答案替换解释为包括所有自然数,而不关心其他术语。
鉴于此,现在让我们考虑它的终止属性。事实上,考虑以下故障切片就足够了。也就是说nat_nat_sum/3
,如果这个切片没有终止,不仅不会终止。这一次他们完全一样!所以我们可以说iff。
nat_nat_sum(0, N, N) :-假。 nat_nat_sum(s(M), N, s(O)) :- nat_nat_sum(M, N, O),假。
这个失败切片现在暴露了第一个和第三个参数之间的对称性:它们都以完全相同的方式影响非终止!因此,尽管它们描述了完全不同的事物——一个是总和,另一个是总和——但它们对终止的影响完全相同。可怜的第二个论点没有任何影响。
可以肯定的是,不仅故障片在其通用终止条件(使用 cTI)中相同,其读取
nat_nat_sum(A,B,C)terminates_if b(A);b(C).
对于此条件未涵盖的情况,它也以完全相同的方式终止,例如
?- nat_nat_sum(f(X),Y,Z).
现在我的问题:
nat_nat_sum/3
是否存在具有终止条件的替代定义:nat_nat_sum2(A,B,C) terminates_if b(A);b(B);b(C).
(如果是,请出示。如果不是,请说明原因)
换句话说,如果新定义的一个论点已经是有限且有基础的,则新定义nat_nat_sum2/3
应该终止。
精美的印刷品。只考虑纯粹的、单调的 Prolog 程序。也就是说,除了(=)/2
和之外没有内置插件dif/2
(我将为此奖励 200 赏金)