2009-11-21 507 views
7

我已經在一本書中讀過它,但沒有解釋。我也從來沒有在一個程序中看到它。是Prolog語法的一部分嗎?這是爲了什麼?你用它嗎?什麼是Prolog中的 - >運算符,我該如何使用它?

感謝

+0

我讀過它可以用來寫解析器。 SUM - > O1 + O2或某物... – 2009-11-21 15:10:46

+2

即 - >(注意兩個字符),請參閱SWI手冊:http://www.swi-prolog.org/pldoc/doc_for?object=section%282 %2c%20%274.12%27%2c%20swi%28%27%2fdoc%2fManual%2fDCG.html%27%29%29 – starblue 2009-11-21 19:22:56

回答

7

它代表蘊涵。右側只有在左側爲真的情況下才會執行。因此,如果你有這樣的代碼,

implication(X) :- 
    (X = a -> 
    write('Argument a received.'), nl 
    ; X = b -> 
    write('Argument b received.'), nl 
    ; 
    write('Received unknown argument.'), nl 
). 

然後,它會寫這取決於它的參數不同的事情:(link to documentation

?- implication(a). 
Argument a received. 
true. 

?- implication(b). 
Argument b received. 
true. 

?- implication(c). 
Received unknown argument. 
true. 

+0

等等,如果有暗示的話,邏輯false - > false應該給出true ',但實際上沒有。那是什麼? – 2018-02-25 13:11:58

2

這是切的本地版本,請參閱例如SWI手冊中的section on control predicated

它主要用於實現if-then-else by(condition - > true-branch; false-branch)。一旦條件成功,沒有從真正的分支回到狀態或進入假分支,但是回到if-then-else仍然是可能的。因此它被稱爲局部切割或軟切割。

+0

SWI通過「* - >」而不是「 - >」提供軟切換! – mat 2012-05-08 19:20:16

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:我不確定這是否完全等同於斯蒂芬的,因爲回溯如果您有implication(X)。但是我現在沒有一個Prolog解釋器來檢查。

+0

嗯。我對Prolog沒有太多的瞭解,但這似乎違反了DRY原則。不知道這是否值得!我的意思是,特別是如果前提變得稍微複雜一點,這可能會變得混亂。至於回溯:對於這個版本(SWI-)prolog不會立即返回到「暗示(a)」和「暗示(b)」的提示,所以確實會嘗試一些回溯。 – Stephan202 2009-11-22 09:07:15

+0

是的,我絕對不是說這是一個優越的選擇,只是它是一種選擇。 :) – pfctdayelise 2009-11-22 22:55:23