Prolog简单的问题

时间:2010-06-09 15:29:04

标签: prolog if-statement

我还在弄清楚prolog是如何运作的,并试图开发一个带有if语句的小测试程序,但却无法真正得到我需要的价值。

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,所以我可以将它作为另一个谓词的参数。当条件为假时,此代码会出错,我已尝试过:

prog([],[],Sy).
prog(Sx,Sy) :- 
    Sx > 0 -> 
        update(Sx,10,S1), update(S1,10,S2), prog(S2,S2) ;
        prog([],[],Sy).

但只是返回true。

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

由于

1 个答案:

答案 0 :(得分:1)

Prolog规则不是“返回”值,箭头分号模式不是最惯用的方式。相反,你应该使用两个规则,每个规则对应一个Sx。我不确定你试图用你的例子代表什么。如果Sx不大于零,您期望Sy有什么价值?假设在这种情况下你希望Sy成为Sx:

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

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

prog(40, V),
write(V),
prog(V, Z),
write(Z).

依此类推,第二个参数在每种情况下都与“答案”绑定。