展开在 Coq 中使用 `assert` 创建的术语

Unfolding terms created with `assert` in Coq

可以找到相关证据here。在目前的状态下,我想展开假设eqveq中的eqvideqvneg,以简化投影并获得两个不同函数之间的矛盾等式。然而,这两个项是使用 assert 策略合成为子目标的,并且当前环境似乎没有记忆项的值。我知道我可以手动写这两个术语,但我认为那会很麻烦。有没有更优雅的方法来恢复在解决子目标时生成的定义?

咒语:

unshelve epose (eqvid := _ : isequiv bool bool).

pose/set 是透明的,而 assert 不是。 _ 成为一个新的存在变量(或更标准的说法中的统一变量)。正常的 pose 会失败,因为它无法求解变量,但 epose 会跳过检查。存在变量通常不会直接受到战术的攻击(它们通过统一解决),因此它们会自动搁置,但unshelve 将其控制的战术产生的所有 evar 转化为目标。

用这个替换断言(如果需要,您可以制作自定义符号)和

apply (f_equal (fun f => f false)) in eqveq.
discriminate.

完成你的证明。

请注意,如果您这样做,证明状态会很快变得不可读。避免这种情况的一个技巧是

Definition hidden {A} {x : A} : A := x.

并使用

unshelve epose (eqvid := hidden : isequiv bool bool).

相反。然后假设不会显示这个乱七八糟的术语,直到你揭示它。