如何比较两个规则列表?

Nak*_*lon 9 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:忘了一件事!列表可以有不同的长度.但似乎所有三个当前答案仍然有效.

Hei*_*ike 7

你可以做点什么

check[{a__Rule}, {b__Rule}] := 
 Module[{common = Intersection[{a}[[All, 1]], {b}[[All, 1]]]},
  SameQ[common /. {a}, common /. {b}]]
Run Code Online (Sandbox Code Playgroud)

然后

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}]
Run Code Online (Sandbox Code Playgroud)

产量

True
False
False
Run Code Online (Sandbox Code Playgroud)


Leo*_*rin 7

也许更简单

check[a : {__Rule}, b : {__Rule}] :=  SameQ @@ Transpose[a /. b /. a /. Rule -> List]
Run Code Online (Sandbox Code Playgroud)

编辑

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

checkAlt[a : {__Rule}, b : {__Rule}] := # === (# /. #) &[a /. b /. a]
Run Code Online (Sandbox Code Playgroud)

编辑2

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

check1[{a__Rule}, {b__Rule}] := SameQ @@ ({a, b} /. {{a, b}, {b, a}})
Run Code Online (Sandbox Code Playgroud)


Bre*_*ion 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}
Run Code Online (Sandbox Code Playgroud)

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