Coq中逻辑(Leibniz)相等和本地定义之间有什么区别?

时间:2016-06-25 07:45:34

标签: coq coq-tactic

我无法理解相等和本地定义之间的区别。例如,在阅读有关set策略的文档时:

  

记住术语为身份

     

此行为与*和中的set(ident:= term)相同   使用逻辑(Leibniz)的平等而不是本地定义

确实,

  1. set (ca := c + a) in *.例如在上下文中生成ca := c + a : Z,而

  2. remember (c + a ) as ca.在上下文中生成Heqca : ca = c + a

  3. 在案例2中,我可以使用生成的假设,如rewrite Heqca.,而在案例1中,我不能使用rewrite ca

    案例1的目的是什么?在实际使用方面,它与案例2的不同之处是什么?

    此外,如果两者之间的差异是基本的,为什么remember在文档(8.5p1)中被描述为set的变体?

2 个答案:

答案 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.