9

我在一本书中读过它,但根本没有解释。我也从未在程序中看到它。是 Prolog 语法的一部分吗?这是为了什么?你用它吗?

4

3 回答 3

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.

链接到文档。)

于 2009-11-21T15:00:47.523 回答
3

这是剪辑的本地版本,例如参见SWI 手册中关于控制的部分。

它主要用于实现 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.

因此,它被称为局部切割。

于 2009-11-21T19:30:34.827 回答
1

可以通过写一些更冗长的东西来避免使用它。如果我重写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
  ).

(是的,我认为使用它没有任何问题,但是我的老板出于某种原因对此感到偏执,所以我们总是使用上述方法。)

对于任何一个版本,您都需要注意要涵盖您打算涵盖的所有案例,尤其是在您有许多分支的情况下。

ETA:我不确定这是否完全等同于斯蒂芬的,因为如果你有implication(X). 但是我现在没有 Prolog 解释器可以检查。

于 2009-11-22T05:17:07.090 回答