这样在 Prolog 中使用 'if' 是否正确?

Is it correct to use 'if' in Prolog this way?

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

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

而不是在这两种情况下都调用它,像这样:

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

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

这些写代码的形式等价.

第一个版本更短,更容易发现共同部分。

但是,请注意 两个 版本所固有的更基本的问题:(->)/2 不纯地 提交 条件的第一个解决方案,一般来说,( Cond -> Then ; Else ) 只有在 Cond 被充分实例化时才合理。

例如:

?- ( 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 中)。