很抱歉没能提出一个简短的例子。
我的证明状态为
1. ⋀e1 T1 L e2 T2 G1.
typing (G1 @ (x, U) # G2) e1 T1 ⟹
typing (G1 @ G2) e1 T1 ⟹
(⋀xa. xa |∉| L ⟹
typing ((xa, T1) # G1 @ (x, U) # G2) (open e2 (exp_fvar xa))
T2) ⟹
(⋀xa G1a.
xa |∉| L ⟹
(xa, T1) # G1 = G1a ⟹
x |∉| fv (open e2 (exp_fvar xa)) ⟹
typing (G1a @ G2) (open e2 (exp_fvar xa)) T2) ⟹
x |∉| fv e1 ⟹ x |∉| fv e2 ⟹ typing (G1 @ G2) (exp_let e1 e2) T2
注意第四个前提(大的前提):它通常对G1a
进行元量化,但G1a
实际上是由那里的等式确定的。所以它可以替代它(然后简化前提的结论),auto
将能够解决目标。
我可以让简化器解决这个问题吗?
我想一个小例子是
lemma foo:
"(⋀ G. x#xs = G ⟹ P x ⟹ f G) ⟹ f (x#xs)"
apply simp
有一个与equalities under existentials有关的问题。
答案 0 :(得分:1)
这个问题只能通过simproc可靠地解决。 induct
中的~~/src/Tools/induct.ML
证明方法已经有了实现,因此您可以调整代码。我们的想法是使用Induct.rearrange_eqs_simproc
将方程式移到前面,然后使用适当的一个点规则来消除相等性。