2012-02-18 94 views
2

我最近在學習有關Prolog,我發現用於定義中綴運算符混淆的三種類型。序言中綴運算符定義

指定操作符的類型時,xfx,xfy和yfx有什麼區別? 我已經搜索了關於這個問題,並沒有發現任何有用的東西。

我試着在序言中輸入以下代碼:

:- op(500,yfx,is_alive). 
is_alive(A,B) :- display([A,B]). 
:- op(500,xfy,is_alive2). 
is_alive2(A,B) :- display([A,B]). 
:- op(500,xfx,is_alive3). 
is_alive3(A,B) :- display([A,B]). 

和輸出:

| ?- 1 is_alive 2. 
'.'(1,'.'(2,[])) 

yes 
| ?- 1 is_alive2 2. 
'.'(1,'.'(2,[])) 

yes 
| ?- 1 is_alive3 2. 
'.'(1,'.'(2,[])) 

yes 

結果表明沒有對我來說差別。

回答

3

操作員的'類型'控制相關性,例如,是否將表達「5 - 4 - 3」解釋爲「(5 - 4) - 3」,稱爲左結合性或稱爲「5 - (4 - 3)」,即右結合性。

如果減號運算符應該按照通常的預期工作,那麼需要將其定義爲'yfx',這使得它是左聯合的。其他類型的'xfx'和'xfy'是這方面的變體。請參閱http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html

+0

謝謝你的回答! – JasonLi 2012-02-18 11:53:42

+2

嘗試對您的每個操作員進行操作(1 is_alive 2 is_alive 3),您將看到不同 – DaveEdelstein 2012-02-18 14:55:07

2

如果您的Prolog符合ISO標準,則可以使用write_canonical來分析運算符優先級和關聯性的影響。例如

?- write_canonical(1+2*3). 
+(1,*(2,3)) 
true.