这样在 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
谓词。另见相关结构 (*->)/2
和 if/3
(在 SICStus 中)。
最近我开始学习逻辑编程和使用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
谓词。另见相关结构 (*->)/2
和 if/3
(在 SICStus 中)。