什么是 - > Prolog中的运算符,我该如何使用它?

时间:2009-11-21 14:43:56

标签: operators prolog

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

3 个答案:

答案 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.

link to documentation。)

答案 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翻译来检查。