关于if语句:Prolog简单问题

Prolog simple question

我仍在弄清楚 prolog 的真正工作原理,并试图开发一个带有 if 语句的小型测试程序,但无法真正得到我需要的值。

1
2
3
4
5
6
7
prog(Sx,Sy) :-
    Sx > 0 ->
        update(Sx,10,S1), update(S1,10,S2), prog(S2,S2) ;
        Sy.

update(S,V,RES) :-
    RES is S-V.

我希望 prog 将 Sy 作为答案而不是 true,因此我可以将其用作另一个谓词的参数。当条件为假时,此代码会出错,我尝试过这样做:

1
2
3
4
5
prog([],[],Sy).
prog(Sx,Sy) :-
    Sx > 0 ->
        update(Sx,10,S1), update(S1,10,S2), prog(S2,S2) ;
        prog([],[],Sy).

但只返回true。

谁能告诉我如何让它返回 Sy?

谢谢


Prolog 规则不会"返回"值,而箭头分号模式并不是最惯用的方法。相反,您应该使用两条规则,一条用于 Sx 的每种情况。我不确定你想用你的例子来代表什么。如果 Sx 不大于零,您期望 Sy 具有什么值?假设在这种情况下您希望 Sy 成为 Sx:

1
2
prog(Sx, Sy) :- Sx > 0, update(Sx,10,S1), update(S1,10,S2), prog(S2,Sy).
prog(Sx, Sx) :- Sx <= 0.

要将它与另一个谓词一起使用,您可以执行以下操作:

1
2
3
4
prog(40, V),
write(V),
prog(V, Z),
write(Z).

以此类推,在每种情况下,第二个参数都绑定到"答案"。