2017-03-15 70 views
1

最近我开始学习逻辑编程和使用Prolog,并且几天前我发现条件语句也可以在Prolog中使用。
我想知道,如果我有一个谓语必须在这两种情况下被调用,是正确的这样写代码:以这种方式在Prolog中使用'if'是否正确?

process(args) :- 
    (condition -> process_args1; process_args2), 
    predicateCalledAnyway. 

与其说这是在两种情况下,像这样的:

process(args) :- 
    (condition -> process_args1, predicateCalledAnyway; process_args2, predicateCalledAnyway). 

有什么区别吗?如果是,那么为什么?对我来说,在两种情况下,代码似乎都会产生相同的结果。

回答

3

这些形式写的代码是等效

第一个版本是更短并使其更容易辨认的公用部分。

但是请注意,是固有的版本的更基本的问题:(->)/2不纯承诺的条件的第一个解决方案,而在一般情况下,如果Cond充分实例化(Cond -> Then ; Else)是只有声音。

例如:

 
?- (member(X, [a,b,c]) -> false ; true). 
false. 

然而,添加约束顿时使这个成功:

 
?- X = d, (member(X, [a,b,c]) -> false ; true). 
X = d. 

声明的方式,我们希望加入约束导致专业化,不是概括的程序!

因此,使用(->)/2非常谨慎:在一般情况下,它会破坏你的Prolog的方案,即他们的关系性质,使您可以使用您的谓词在多个方向和模式的最宝贵的属性之一。

如果可能的话,请使用纯Prolog的条款,或纯if_/3谓语。另见相关构建体(*->)/2if/3(在SICStus中)。

相关问题