繁体   English   中英

如何编写用于递归减法的 prolog 程序

[英]How to write a prolog program for recursive subtraction

我想要一个 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) ).

NumberExpression计算的值时,谓词Number is Expression为 True。

例子:

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

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

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

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

sub(M,0,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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM