我在一本书中读到过它,但根本没有解释。我也从未在程序中看到它。是Prolog语法的一部分吗?这是为了什么?你用它吗?
答案 0 :(得分:8)
代表暗示。只有在左侧为真时才执行右侧。因此,如果您有此代码,
implication(X) :-
(X = a ->
write('Argument a received.'), nl
; X = b ->
write('Argument b received.'), nl
;
write('Received unknown argument.'), nl
).
然后它会根据它的参数写出不同的东西:
?- implication(a).
Argument a received.
true.
?- implication(b).
Argument b received.
true.
?- implication(c).
Received unknown argument.
true.
答案 1 :(得分:3)
这是剪辑的本地版本,例如参见SWI手册中的section on control predicated。
它主要用于实现if-then-else by(condition - > true-branch; false-branch)。一旦条件成功,就没有从真正的分支回溯到条件或进入假分支的回溯,但是仍然可以从if-then-else中回溯:
?- member(X,[1,2,3]), (X=1 -> Y=a ; X=2 -> Y=b ; Y=c).
X = 1,
Y = a ;
X = 2,
Y = b ;
X = 3,
Y = c.
?- member(X,[1,2,3]), (X=1, !, Y=a ; X=2 -> Y=b ; Y=c).
X = 1,
Y = a.
因此它被称为局部切割。
答案 2 :(得分:0)
可以通过写一些更罗嗦的东西来避免使用它。如果我重写Stephan's谓词:
implication(X) :-
(
X = a,
write('Argument a received.'), nl
;
X = b,
write('Argument b received.'), nl
;
X \= a,
X \= b,
write('Received unknown argument.'), nl
).
(是的,我不认为使用它有任何问题,但我的老板出于某种原因对此很偏执,所以我们总是使用上述方法。)
对于任何一个版本,您需要注意覆盖所有要覆盖的案例,特别是如果您有许多分支。
ETA:我不确定这是否完全等同于Stephan的,因为如果你有implication(X)
的回溯。但是我现在没有Prolog翻译来检查。