Visual Algebra:用於代數表述的可視化插件
如果有這樣一種工具:它可以將代數中的表述可視化爲圖,並且能智能地挖掘元素間的代數關係並做到功能性的推導.那就是:
Visual Algebra:
將代數語言轉化爲規則的描述語言
我們平常所講述的代數學的描述事實上是數學符號和自然語言的混雜,考慮如下定義:
(定義) 設爲-模而爲子模;若,則稱爲-Primary Submod;
事實上這段短小的描述蘊含了許多先驗的數學知識,妄圖做到真正的"解析"對計算機是困難的,況且還有自然語言這道坎,因此首先我們需要用一種類似Script的標準語言將這些代數描述無歧義地表達,以便下一個接口的解析:
IS;$M$;$R$-Mod
$\sub$;$Q$;$M$
divide;$M$;$Q$
$ASS_R(\cdot)$;$M/Q$;$\{P\}$
DEF;$Q$;$P$-Primary Submod;
這就是我們定義的*.des描述文件,我們約定繪圖功能需要這樣一個文本描述文件;
其實這也算是一種抽象,但是我們可以看出這個抽象還是損失了一些描述準確性(比如並沒有將和是先做商再傳遞到中給表現出來,後期的版本會改進這一點).
將規則描述語言轉化爲圖
這裏要轉化的圖還不是最終可視化的圖(Visual),而是Graph,一種數據結構,將規則描述語言文件讀入轉化爲計算機可以存儲的圖數據結構是容易的,這也有便於下一步繪圖:
========= GRAPH ===========
---- Nodes ----
$M$
['var', 'normal']
$R$-Mod
['normal']
$Q$
['var', 'normal']
$ASS_R$
['var', 'normal']
$\{P\}$
['var', 'normal']
$P$-Primary Submod
['normal']
---- Edges ----
IS
['normal']
$\sub$
['normal']
divide
['normal']
DEF
['def']
... ...
可以見得這裏不光描述了元素之間的聯繫關係,還給這些關係分配了類別屬性,比如變量"var"、映射"map"等等,實際上當前的一個問題是隻有一階映射,後面會改進引入多階映射描述更復雜的代數關係;
將圖轉化爲可視化的結果
起初我本來想直接用pythonx這個繪製網絡的包,但是第一天就遇到它的文本添加功能有個大bug,閱讀了它的源代碼,發現它的圖參考座標系居然和文本位置座標系不統一,以至於畫出來的位置亂七八糟.於是又自己用pyplot重寫了繪圖功能.
這裏說幾個繪圖的難點:
- 點佈局:如何佈局才能使得線和點不重疊,繪製的圖可辨識;
- 文本佈局:如何才能和其他文本不重疊?如何保證文本在和圖對應的位置?我建立了一個表來記錄已經被佔用的位置;
- 複雜關係描述:比如多元函數的映射、多個元和其他元的關係繪製;
繪製效果:
智能地挖掘元素間的代數關係
考慮描述文件main.des:
$\subset$;$M_{i-1}$;$M_{i}$;$M_{i+1}$
$\cong$;$M_{i}/M_{i-1}$;$I/q_i$;
$\subset$;$q_i$;$I$
我們需要改進的是文件mani.des中的關係:
$\subset$;$M_{i-1}$;$M_{i}$;$M_{i+1}$
$\cong$;$M_{i}/M_{i-1}$;$R/q_i$;
易見我們可以給出補全:
$\subset$;$q_i$;$R$
可以發現,事實上我們需要引入多階邊了,所謂的多階邊是指,這個邊的連接的節點也是邊,那麼一個自然的想法就是:乾脆不要邊了,只需要將所有元都抽象爲點就可以了!(這樣一來邊就不帶有特殊含義了)
因此我們可以定義這樣的形式,就可以解析出和的關係了(這樣就比之前的表達更"細緻"了):
isomorphism(divide(M[i],M[i-1]),divide(R,q[i]));
意義和改進
當你在嘗試轉化這些數學表述爲圖數據結構的過程中,一定就真正理解了它的內涵,因爲圖是一種中介的"通用數學語言",它又可以被轉換爲其他的表述.
下一步的改進會集中在"智能挖掘元素間代數關係"這個功能上,這本來是一個難以實現的想法,想必會花漫長的時間來改進.