如何比较两个规则列表?

时间:2011-10-11 11:43:09

标签: comparison wolfram-mathematica rules

我需要比较两个形式规则列表var -> integer关于不匹配的事实 确定 lhs 是否存在相同的规则, rhs 的规则相同。

例如:

  

{a-> 3,b-> 1,c-> 4}〜??? 〜{a-> 3,b-> 1,c-> 4} =真
  {a-> 3, b-> 1 ,c-> 4}〜??? 〜{a-> 3, b-> 2 ,c-> 4} = false
  { a-> 3 b-> 1 ,c-> 4}〜??? 〜{ a-> 1 b-> 3 ,c-> 4} = false
  {a-> 3,b-> 1,c-> 4}〜??? 〜{c-> 4,d-> 8,e-> 9} =真
  {a-> 3,b-> 1,c-> 4}〜??? 〜{d-> 8,e-> 9,f-> 7} =真

在我的情况下,它们已经按 lhs 排序,并且所有 lhs 都是唯一的,如果它可以帮助制作尽可能简单的功能。

UPD:忘了一件事!列表可以有不同的长度。但似乎所有三个当前答案仍然有效。

4 个答案:

答案 0 :(得分:7)

您可以执行类似

的操作
check[{a__Rule}, {b__Rule}] := 
 Module[{common = Intersection[{a}[[All, 1]], {b}[[All, 1]]]},
  SameQ[common /. {a}, common /. {b}]]

然后

check[{a -> 3, b -> 1, c -> 4}, {a -> 3, b -> 1, c -> 4}]
check[{a -> 3, b -> 1, c -> 4}, {a -> 3, b -> 2, c -> 4}]
check[{a -> 3, b -> 1, c -> 4}, {a -> 1, b -> 3, c -> 4}]

产量

True
False
False

答案 1 :(得分:7)

也许更简单

check[a : {__Rule}, b : {__Rule}] :=  SameQ @@ Transpose[a /. b /. a /. Rule -> List]

修改

这是一个更为深奥的版本,它具有完全高级别的优势,因为我们不需要了解规则的内部结构,只知道它们的行为:

checkAlt[a : {__Rule}, b : {__Rule}] := # === (# /. #) &[a /. b /. a]

编辑2

好吧,让我再来一个,只是为了好玩:

check1[{a__Rule}, {b__Rule}] := SameQ @@ ({a, b} /. {{a, b}, {b, a}})

答案 2 :(得分:7)

这是另一种解决方案:

In[12]:= check[a:{__Rule}, b:{__Rule}] := FilterRules[a, b] === FilterRules[b, a]

In[18]:= {{a -> 3, b -> 1, c -> 4}~check ~ {a -> 3, b -> 1, c -> 4} ,
 {a -> 3, b -> 1, c -> 4}~check ~ {a -> 3, b -> 2, c -> 4},
 {a -> 3, b -> 1, c -> 4}~check ~ {a -> 1, b -> 3, c -> 4},
 {a -> 3, b -> 1, c -> 4}~check ~ {c -> 4, d -> 8, e -> 9},
 {a -> 3, b -> 1, c -> 4}~check ~ {d -> 8, e -> 9, f -> 7}}

Out[18]= {True, False, False, True, True}

(这取决于选项列表已经排序的事实。)

答案 3 :(得分:2)

这是一个略微概括的方法:

In[24]:= check[lists__] := 
 And @@ (SameQ @@@ GatherBy[Join[lists], First])

In[25]:= {
  {a -> 3, b -> 1, c -> 4}~check~{a -> 3, b -> 1, c -> 4}, 
  {a -> 3, b -> 1, c -> 4}~check~{a -> 3, b -> 2, c -> 4}, 
  {a -> 3, b -> 1, c -> 4}~check~{a -> 1, b -> 3, c -> 4}, 
  {a -> 3, b -> 1, c -> 4}~check~{c -> 4, d -> 8, e -> 9}, 
  {a -> 3, b -> 1, c -> 4}~check~{d -> 8, e -> 9, f -> 7}
  }

Out[25]= {True, False, False, True, True}

这个元素不要求元素是规则,它们可以是列表,或者几乎任何其他元素。它也适用于任何数量的输入。