用关联和交换算子求解方程

时间:2014-12-03 12:34:19

标签: solver isabelle associativity commutativity

在Isabelle中考虑这样的目标(不要担心ccProdccFromList):

ccProd {x} (set xs) ⊔ (ccProd {x} (set ys) ⊔ (ccFromList xs ⊔ (ccFromList ys ⊔ ccProd (set xs) (set ys)))) =
ccProd {x} (set xs) ⊔ (ccFromList xs ⊔ (ccFromList ys ⊔ (ccProd {x} (set ys) ⊔ ccProd (set xs) (set ys))))

这是事实,因为具有关联性和可交换性。我通常采用的方法是使用

apply (metis join_assoc join_comm)

它有效,但已经花了很长时间才能完成。

同样,我有一个像

这样的目标
ccProd {x} (set xs) ⊔ (ccProd {x} (set ys) ⊔ (ccFromList xs ⊔ (ccFromList ys ⊔ ccProd (set xs) (set ys)))) =
ccFromList xs ⊔ (ccProd {x} (set ys) ⊔ (ccFromList ys ⊔ (ccProd (set xs) {x} ⊔ ccProd (set xs) (set ys))))

我还需要在一个实例中应用ccProd的可交换性。再次

apply (metis join_assoc join_comm ccProd_comm)

完成工作,但需要更长时间。

有没有更好的方法来解决涉及交换和关联运算符的方程?

根据定理join_assoc join_comm,可能会采用一种策略或simpproc来解决第一个目标并将第二个目标降低到

ccProd {x} (set xs) = ccProd (set xs) {x} 

2 个答案:

答案 0 :(得分:2)

通常在Isabelle中使用简化器和有序重写来推理相关性和可交换性。在您的示例中,您为简化器提供了关联性规则(从左到右),交换规则和左交换规则。有关详细信息,请参阅Isabelle / HOL教程(第9.1节,Permutative重写规则)。

然后,简化器会将方程的两边重新排序为正规形式,这由Isabelle中的隐式术语顺序确定。因此,你在两边得到平等的条件,通过反身性证明是相等的。除非您的运营商也满足取消法律,否则这种方法不会将第二个示例减少到不同的部分。如果幸运的话,简化器会在同一位置旋转这两个术语。你可以使用a = b ==> a ⊔ c = b ⊔ c形式的一堆介绍规则。但是,这是相当脆弱的。如果重命名变量,订单可能会发生变化,从而破坏证据。但是,ccProd似乎也是可交换的,所以只需将可交换律添加到简化器中。然后,它将首先规范化这些子项并解决所有问题。

答案 1 :(得分:1)

如果你有一个ab_semigroup_multab_semigroup_add的实例,而不是将ac_simps添加到simpset,那么通常就可以了。

例如,如果我用以下内容替换您的上述目标(因为出现语法错误):

lemma
  fixes ccProd :: "_ ⇒ _ ⇒ 'a::ab_semigroup_add"
  shows "ccProd {x} (set xs) + (ccProd {x} (set ys) + (ccFromList xs + (ccFromList ys + ccProd (set xs) (set ys)))) =
    ccProd {x} (set xs) + (ccFromList xs + (ccFromList ys + (ccProd {x} (set ys) + ccProd (set xs) (set ys))))"

然后by (simp add: ac_simps)成功。

更新:还有相应的区域设置abel_semigroup再次与ac_simps“注册”。所以你的第二个引理可以按照以下方式工作

interpretation abel_semigroup ccProd
sorry

即表示ccProd是AC(除了上面已经建立的ab_semigroup_add个实例)。

lemma
  "ccProd {x} (set xs) + (ccProd {x} (set ys) + (ccFromList xs + (ccFromList ys + ccProd (set xs) (set ys)))) =
  ccFromList xs + (ccProd {x} (set ys) + (ccFromList ys + (ccProd (set xs) {x} + ccProd (set xs) (set ys))))"
by (simp add: ac_simps)