2014-10-16 56 views
2

我想用連字符運算符將邊緣表示爲對,即From-To。 我想表示節點也是成對的(表示FCA概念),即Extent-Intent。 所以我得到類似如下:使用運算符連字符嵌套對

([1]-[a])-([2,3]-[b]) 

括號確保表達正確消除歧義:單外連字符表示的邊緣算,兩個內連字符表示節點操作。

這裏是我的問題:

?- X = (a-b)-(c-d), X = Y1-Y2-Y3. 
X = a-b- (c-d), 
Y1 = a, 
Y2 = b, 
Y3 = c-d 

我期待這不是失敗...... 我的問題:

  1. 爲什麼在X的(顯示)結合去除括號?
  2. 爲什麼第一個連字符的解釋方式與第三個不同?

可能相關的,連字符運算符優先級規則:

?- current_op(P,T,-). 
P = 200, 
T = fy ; 
P = 500, 
T = yfx. 

(這是SWI-Prolog的開發分支,但我懷疑這會是SWI專用)

+0

爲了完整起見,這樣一個減號對的正式名稱是'pair'。您可以從'keysort([a],_)'的錯誤消息中看到 – false 2017-02-21 20:52:19

回答

3

一般,write_canonical對理解Prolog如何解釋運算符非常有用。

?- write_canonical(a-b-c). 
-(-(a,b),c) 
true. 

?- write_canonical(a-(b-c)). 
-(a,-(b,c)) 
true. 

?- write_canonical(a-b-c-d). 
-(-(-(a,b),c),d) 
true. 

?- write_canonical(a-b-(c-d)). 
-(-(a,b),-(c,d)) 
true. 

然後,這樣的有道理,假設這裏所有的連字符是與具有嚴格優先級較低的右手參數二元運算符:

?- X = (a-b)-(c-d), X = Y1-(Y2-Y3). 
X = a-b- (c-d), 
Y1 = a-b, 
Y2 = c, 
Y3 = d. 

?- X = (a-b)-(c-d), X = (Y1-Y2)-Y3. 
X = a-b- (c-d), 
Y1 = a, 
Y2 = b, 
Y3 = c-d. 

第一架不是嚴格必要顯示嵌套術語-(-(a,b),-(c,d))。第二對括號是必要的,否則將意味着-(-(-(a,b),c),d)

PS。由於我不夠好,始終將運營商優先規則放在我的頭上,所以我儘量避免運營商。顯式仿函數沒有錯。連字符當然對於像keysort/2這樣的謂詞和library(ugraphs)這樣的庫非常有用。