我无法理解相等和本地定义之间的区别。例如,在阅读有关set
策略的文档时:
记住术语为身份
此行为与*和中的set(ident:= term)相同 使用逻辑(Leibniz)的平等而不是本地定义
确实,
set (ca := c + a) in *.
例如在上下文中生成ca := c + a : Z
,而
remember (c + a ) as ca.
在上下文中生成Heqca : ca = c + a
。
在案例2中,我可以使用生成的假设,如rewrite Heqca.
,而在案例1中,我不能使用rewrite ca
。
案例1的目的是什么?在实际使用方面,它与案例2的不同之处是什么?
此外,如果两者之间的差异是基本的,为什么remember
在文档(8.5p1)中被描述为set
的变体?
答案 0 :(得分:1)
您可以将set a := b + b in H
视为重写H
:
(fun a => H[b+b/a]) (b+b)
或
let a := b + b in
H[b+b/a]
也就是说,它将所有匹配的模式b+b
替换为新变量a
,然后将其实例化为模式的值。在这方面,H
和重写的假设都保持相等“转换”。
实际上,记住在某种意义上是集合的变体,但其含义却截然不同。在这种情况下,请记住将引入一个新的平等证明eq_refl: b + b = b + b
,然后它将抽象出左侧部分。这对于在模式匹配等方面有足够的自由度是很方便的......这就是更多原子战术的记忆:
Lemma U b c : b + b = c + c.
Proof.
assert (b + b = b + b). reflexivity.
revert H.
generalize (b+b) at 1 3.
intros n H.
答案 1 :(得分:1)
除了@ ejgallego的回答。
是的,你不能rewrite
一个(本地)定义,但你可以unfold
:
set (ca := c + a) in *.
unfold ca.
至于实际使用的差异 - 它们是完全不同的。例如,请参阅@eponier的this answer。它依赖于remember
策略,以便感应起到我们想要的作用。但是,如果我们将remember
替换为set
则会失败:
Inductive good : nat -> Prop :=
| g1 : good 1
| g3 : forall n, good n -> good (n * 3)
| g5 : forall n, good n -> good (n + 5).
Require Import Omega.
remember
的变体有效:
Goal ~ good 0.
remember 0 as n.
intro contra. induction contra; try omega.
apply IHcontra; omega.
Qed.
和set
的变体没有(因为我们没有引入any free variables来处理):
Goal ~ good 0.
set (n := 0). intro contra.
induction contra; try omega.
Fail apply IHcontra; omega.
Abort.