展开在 Coq 中使用 `assert` 创建的术语
Unfolding terms created with `assert` in Coq
可以找到相关证据here。在目前的状态下,我想展开假设eqveq
中的eqvid
和eqvneg
,以简化投影并获得两个不同函数之间的矛盾等式。然而,这两个项是使用 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).
相反。然后假设不会显示这个乱七八糟的术语,直到你揭示它。
可以找到相关证据here。在目前的状态下,我想展开假设eqveq
中的eqvid
和eqvneg
,以简化投影并获得两个不同函数之间的矛盾等式。然而,这两个项是使用 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).
相反。然后假设不会显示这个乱七八糟的术语,直到你揭示它。