簡體   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