If statement 使用'是否正确;如果';用这种方式?
最近我开始学习逻辑编程和使用Prolog,几天前我发现Prolog中也可以使用条件语句。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
我想知道,如果我有一个谓词必须在这两种情况下都调用,那么这样编写代码是否正确:
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中)