我想自动确定给定对象是Combinatorica还是Mathematica 8.0 Graph。
FullForm似乎没有足够的信息来判断哪一个是哪个
(* output of Combinatorica`CompleteGraph[1] *)
Graph[List[],List[List[List[0,0]]]]
(* output of System`CompleteGraph[1] *)
Graph[List[1],List[]]
然而,Mathematica能够区分它们并将其中一个作为文本字符串而另一个作为可视对象。有吗
更新的: 即使显示的头部相同,Head似乎也会给出两个图形的不同结果。将函数定义为f [a_System'Graph]和f [a_Combinatorica'Graph]会导致调用正确的版本
答案 0 :(得分:3)
Head 为两种类型的图形返回不同的值:
In[1]:= g1 = Combinatorica`CompleteGraph[1];
In[2]:= g2 = System`CompleteGraph[1];
In[3]:= Combinatorica`Graph === Head[#] & /@ {g1, g2}
Out[3]= {True, False}
In[4]:= System`Graph === Head[#] & /@ {g1, g2}
Out[4]= {False, True}
对于问题1,您可以选择在图形,图像等非符号对象中查看“隐藏”信息。您可以调用可以访问本机对象表示的内置Mathematica函数。有特定于对象类型的函数(如VertextCount或ImageDimensions)或更通用的函数(如CurrentValue或PropertyValue)。您可以使用MMA文档来查找此类功能的全面列表。或者,您有时可以通过检查包含此类对象的输出单元格的单元格表达式来收集有用信息。但这可能会被击中或错过。
对于问题2,WRI通常会保护内置功能的呈现规则。此外,某些功能(如绘图工具和图形编辑器)似乎直接内置于笔记本界面本身。您可能会很幸运地检查渲染函数的上升值或下降值,例如 MakeBoxes 和 Format 等。再次,它有点受欢迎。