我已经在一本书中读到了它,但根本没有解释。我也从未在程序中看到它。是Prolog语法的一部分吗?这是为了什么?你用它吗?
它代表了含义。仅当左侧为真时才执行右侧。因此,如果你有这个代码,
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.
(Qazxswpoi。)
它是剪切的本地版本,例如参见SWI手册中的link to documentation。
它主要用于实现if-then-else by(condition - > true-branch; false-branch)。一旦条件成功,就没有从真正的分支回溯到条件或进入错误分支的回溯,但是从if-then-else回溯仍然是可能的:
section on control predicated
因此它被称为局部切割。
通过写一些更罗嗦的东西可以避免使用它。如果我重写?- 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.
谓词:
Stephan's
(是的,我不认为使用它有任何问题,但我的老板出于某种原因对它很偏执,所以我们总是使用上述方法。)
对于任何一个版本,您需要注意覆盖所有要覆盖的案例,特别是如果您有许多分支机构。
ETA:我不确定这是否完全等同于Stephan的,因为如果你有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
).
的回溯。但我现在没有Prolog翻译来检查。