目前,我有一个这样的感应案例(截断其他信息,如引入的变量,我可以在需要时添加它):
IHe : not_set e -> (let (a, _) := sem e c in a) = c
============================
(let (a, _) := let (c0, r) := sem e c in (c0, - r) in a) = c
我还没有真正使用let
关键字(事实上,我使用了一个案例match
,其中Coq似乎自动为let
设置了别名。但是,对我来说,声明似乎很明显:
(let (a, _) := let (c0, r) := sem e c in (c0, - r) in a)
只是使用多个间接级别对相同的值进行别名处理。也就是a=c0=c0
和_=-r=r
,但我无法弄清楚如何减少这种情况。我已经尝试了simpl
和auto
之类的内容。我确实遇到了cbv zeta
,根据我的理解,它应该简化let
语句,但它没有做任何事情。
我在这里缺少什么?我考虑引入一个引理,但是根本没有契约能力,我不知道我试图证明什么相关的东西。 (意思是:如果我能证明任何有用的东西,我就不需要证明)。
答案 0 :(得分:0)
您需要查看sem e c
的结果。
destruct (sem e c) eqn:?. simpl in *.
也可以证明
(let (a, _) := let (c0, r) := sem e c in (c0, - r) in a) = (let (a, _) := sem e c in a),
再次通过检查该对,因为该对的第二个元素未被使用。