If statement 使用'是否正确;如果';用这种方式?

If statement 使用'是否正确;如果';用这种方式?,if-statement,prolog,conditional,If Statement,Prolog,Conditional,最近我开始学习逻辑编程和使用Prolog,几天前我发现Prolog中也可以使用条件语句。我想知道,如果我有一个谓词必须在这两种情况下都调用,那么这样编写代码是否正确: process(args) :- (condition -> process_args1; process_args2), predicateCalledAnyway. 而不是在这两种情况下都这样称呼它: process(args) :- (condition -> process_args1

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

process(args) :-
    (condition -> process_args1; process_args2),
    predicateCalledAnyway.
而不是在这两种情况下都这样称呼它:

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

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

这些编写代码的表单是等价的

第一个版本更短,更容易发现常见部件

但是,请注意这两个版本所固有的更基本的问题:
(>)/2
inpurely致力于条件的第一个解决方案,一般来说,
(Cond->Then;Else)
只有在充分实例化了
Cond
的情况下才是正确的

例如:

?- ( member(X, [a,b,c]) -> false ; true ). false. ?-(成员(X[a,b,c])->假;真)。 错。 然而,添加一个约束突然使这项工作成功:

?- X = d, ( member(X, [a,b,c]) -> false ; true ). X = d. ?-X=d,(成员(X[a,b,c])->假;真)。 X=d。 声明性地说,我们期望添加约束会导致专门化,而不是程序的泛化

因此,使用
(>)/2
时要格外小心:一般来说,它会破坏Prolog程序最有价值的属性之一,即允许您在多个方向和模式中使用谓词的关系性质

如果可能,使用纯Prolog子句或纯
If\u3
谓词。另请参见相关结构
(*->)/2
if/3
(在SICStus中)