微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写递归减法的序言程序

如何解决如何编写递归减法的序言程序

我想要一个 prolog 中的递归减法程序。

方案的方案是

(define (sub m n)
(cond
    ((= n 0) m)
    (else (sub (- m 1) (- n 1)))))

我需要把这个程序转换成 prolog 程序..

解决方法

虽然它没有实际用途,但从 Scheme 代码到相应的 Prolog 代码更直接的翻译如下:

% mode: sub(+,+,-)

sub(A,B,C) :-
    (   B = 0               % if
    ->  C = A               % then
    ;   A1 is A-1,% else
        B1 is B-1,sub(A1,B1,C) ).

Number is ExpressionNumber 求值的值时,谓词 Expression 为 True。

示例:

?- sub(12,7,C).
C = 5.

?- sub(7,12,C).
C = -5.

?- sub(7,C).
C = 0.
,

Prolog 的工作方式有点不同。后继格式数字的代码示例(例如 s(0) 等于 1)是:

sub(M,M).
sub(s(M),s(N),R):-
    sub(M,N,R).

测试:

?- sub(s(s(s(0))),s(0),R).
R = s(s(0)) ;
false.

这是最简单的解决方案。两种情况:第二个属性为 0 或前两个属性大于零。缺点是无法计算案例 M<N。请注意,大写字母是变量,代码从上到下,从左到右。

处理普通十进制格式的数字更为复杂,因为需要明确计算数学术语。示例:

?- M = 4,N = M-1.
M = 4,N = 4-1.

?- M = 4,N is M-1.
M = 4,N = 3.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。