这与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
答案 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)
此类问题还有其他一些解决方案,不要求您使用Hold
或ReleaseHold
,而是依赖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的“测试”案例。我还认为,与目前为止看到的其他方法相比,这更简洁,更易读。