coq - Coq 中的逻辑(莱布尼茨)相等和局部定义有什么区别?

标签 coq coq-tactic

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

remember term as ident

This behaves as set ( ident := term ) in * and using a logical (Leibniz’s) equality instead of a local definition



的确,
  • 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描述为 set 的变体在文档(8.5p1)中?

    最佳答案

    除了@ejgallego 的回答。

    是的,你不能rewrite一个(本地)定义,但您可以 unfold它:

    set (ca := c + a) in *.    
    unfold ca. 
    

    至于它们在实际使用中的差异——它们完全不同。例如,参见 this answer来自@eponier。它依赖于 remember策略,以便归纳按照我们想要的方式工作。但是,如果我们替换 rememberset它失败:
    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.
    

    关于coq - Coq 中的逻辑(莱布尼茨)相等和局部定义有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38026220/

    相关文章:

    coq - 经过验证的软件工具链 : if-then-else proof

    Coq:理由不足错误

    scope - 在当前环境中未找到该引用

    coq - Coq 中类型类方法的递归使用

    coq - 在 Coq 中,重写适用于 = 但不适用于 <-> (iff)

    linux - 如何在 Linux 中安装 SSReflect 和 MathComp?

    coq - 如何在 Coq 中的列表末尾进行归纳

    coq - 如何在 Coq 中重复证明策略?

    coq - 如何在 Ltac 中尝试某种策略,但如果失败则继续

    coq:消除 forall 量词