Visual Algebra:用于代数表述的可视化插件
如果有这样一种工具:它可以将代数中的表述可视化为图,并且能智能地挖掘元素间的代数关系并做到功能性的推导.那就是:
Visual Algebra:
将代数语言转化为规则的描述语言
我们平常所讲述的代数学的描述事实上是数学符号和自然语言的混杂,考虑如下定义:
(定义) 设 M M M为 R R R-模而 Q ⊂ M Q \subset M Q⊂M为子模;若 Ass R ( M / Q ) = { P } \text{Ass}_R(M/Q)=\{P\} AssR(M/Q)={P},则称 Q Q Q为 P P P-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描述文件,我们约定绘图功能需要这样一个文本描述文件;
其实这也算是一种抽象,但是我们可以看出这个抽象还是损失了一些描述准确性(比如并没有将 M M M和 Q Q Q是先做商再传递到 Ass R ( ⋅ ) \text{Ass}_R(\cdot) AssR(⋅)中给表现出来,后期的版本会改进这一点).
将规则描述语言转化为图
这里要转化的图还不是最终可视化的图(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$
可以发现,事实上我们需要引入多阶边了,所谓的多阶边是指,这个边的连接的节点也是边,那么一个自然的想法就是:干脆不要边了,只需要将所有元都抽象为点就可以了!(这样一来边就不带有特殊含义了)
因此我们可以定义这样的形式,就可以解析出 q i q_i qi和 R R R的关系了(这样就比之前的表达更"细致"了):
isomorphism(divide(M[i],M[i-1]),divide(R,q[i]));
意义和改进
当你在尝试转化这些数学表述为图数据结构的过程中,一定就真正理解了它的内涵,因为图是一种中介的"通用数学语言",它又可以被转换为其他的表述.
下一步的改进会集中在"智能挖掘元素间代数关系"这个功能上,这本来是一个难以实现的想法,想必会花漫长的时间来改进.