在Isabelle中考虑这样的目标(不要担心ccProd
和ccFromList
):
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}
答案 0 :(得分:2)
通常在Isabelle中使用简化器和有序重写来推理相关性和可交换性。在您的示例中,您为简化器提供了关联性规则(从左到右),交换规则和左交换规则。有关详细信息,请参阅Isabelle / HOL教程(第9.1节,Permutative重写规则)。
然后,简化器会将方程的两边重新排序为正规形式,这由Isabelle中的隐式术语顺序确定。因此,你在两边得到平等的条件,通过反身性证明是相等的。除非您的运营商也满足取消法律,否则这种方法不会将第二个示例减少到不同的部分。如果幸运的话,简化器会在同一位置旋转这两个术语。你可以使用a = b ==> a ⊔ c = b ⊔ c
形式的一堆介绍规则。但是,这是相当脆弱的。如果重命名变量,订单可能会发生变化,从而破坏证据。但是,ccProd
似乎也是可交换的,所以只需将可交换律添加到简化器中。然后,它将首先规范化这些子项并解决所有问题。
答案 1 :(得分:1)
如果你有一个ab_semigroup_mult
或ab_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)