以编程方式在Mathematica中创建多变量函数

时间:2010-11-10 09:01:09

标签: wolfram-mathematica

这与earlier问题的讨论分开。

假设我需要定义一个函数f,它检查给定的图形标签是否是正确的颜色。换句话说,我们有一个分配给每个节点的整数,没有两个相邻的节点得到相同的答案。例如,对于{“Path”,3},f [{1,2,3}]返回True,f [{1,1,2}]返回False。我如何为任意图形创建这样的函数?

以下基本上是我需要的,但会生成Part警告。

g[edges_] := Function @@ {{x}, And @@ (x[[First[#]]] != x[[Last[#]]] & /@ edges)}
f = g[GraphData[{"Path", 3}, "EdgeIndices"]];
f[{1, 2, 1}]==False

这是我经常遇到的玩具实例问题 - 我需要以编程方式创建多变量函数f,最后得到1)部分警告2)推迟评估g直到评估f

3 个答案:

答案 0 :(得分:1)

这是件事。当没有其他工作时,Hold和规则通常可以完成工作。我不确定它会产生正确的结果w.r.t.你的图形着色问题,但希望给你一个起点。我最终使用了Slot而不是命名变量,因为当我使用一个我没做过的命名变量时,存在一些范围问题(在我之前的建议x$x中也存在)花时间尝试解决。

g[edges_] := 
 With[{ors = (Hold @@ edges) /. {a_, b_} :> #[[a]] == #[[b]]},
  Function[!ors] /. Hold -> Or
  ]

In[90]:= f = g[GraphData[{"Path", 3}, "EdgeIndices"]]
Out[90]= !(#1[[1]] == #1[[2]] || #1[[2]] == #1[[3]]) &

In[91]:= f[{1, 2, 3}]
Out[91]= True

In[92]:= f[{1, 1, 2}]
Out[92]= False

我觉得它缺乏典型的Mathematica优雅,但它有效。如果我受到更美丽的启发,我会更新。

答案 1 :(得分:1)

此类问题还有其他一些解决方案,不要求您使用HoldReleaseHold,而是依赖Function已经拥有HoldAll的事实{1}}属性。您首先使用Part在本地“擦除”Block的定义,以便可以安全地构建您感兴趣的表达式,然后使用With将其插入{{1}然后可以在Function之外安全地返回,并且还使用Block并不真正意味着Slot之外的任何事实的事实。

使用您的示例:

Function

我不知道这是不是比使用coloringChecker[edges_List] := Block[{Part}, With[{body = And @@ Table[#[[First@edge]] != #[[Last@edge]], {edge, edges}]}, body &]] 那么麻烦,但它是不同的。

答案 2 :(得分:0)

我仍然对你似乎遇到的困难感到困惑。这是一个函数,它检查列表中没有2个连续元素是相同的:

f[l_List] := Length[Split[l]] == Length[l]

Part没有问题,对于我迄今为止尝试的简单示例没有错误消息,包括OP的“测试”案例。我还认为,与目前为止看到的其他方法相比,这更简洁,更易读。