“在什么条件下”;“评估cbv三角洲”;在Coq中扩展定义?

“在什么条件下”;“评估cbv三角洲”;在Coq中扩展定义?,coq,evaluation,Coq,Evaluation,在一般证明中(使用Coq 8.5),我执行了以下内容: Require Import Arith. Eval cbv delta in Nat.add_comm 3 7. 输出是 然而,Print Nat.add_comm.给出了一个以两个Nat作为输入的长而复杂的函数。我希望我的代码能够扩展Nat.add\u comm的定义,这是Eval cbv delta in.在类似情况下所做的。作为一个初学者,我知道有一种天真的误解潜伏着。我遗漏了什么?对Daniel的评论进行一点扩展,cbv del

在一般证明中(使用Coq 8.5),我执行了以下内容:

Require Import Arith.
Eval cbv delta in Nat.add_comm 3 7.
输出是


然而,
Print Nat.add_comm.
给出了一个以两个Nat作为输入的长而复杂的函数。我希望我的代码能够扩展
Nat.add\u comm
的定义,这是
Eval cbv delta in.
在类似情况下所做的。作为一个初学者,我知道有一种天真的误解潜伏着。我遗漏了什么?

对Daniel的评论进行一点扩展,
cbv delta
将显示一个标识符,如果

  • 它有一个主体(即,不是上下文变量、公理、当前模块函子的模块参数中的字段、绑定变量等),以及
  • 它的主体是透明给出的,即,要么证明脚本是用
    定义的
    而不是
    Qed
    关闭的,要么主体是通过
    :=
    或自动义务策略(对于
    程序定义
    )或类型类解析(对于没有主体的
    实例
    )给出的,以及
  • 未通过
    不透明id
    策略不透明[id]
    将其标记为不透明,以及

  • 它不是通过“模块锁定”创建的另一个常量,即通过
    而不是
    在具有模块类型归属的模块(或模块函子)中定义的。可能只是
    Nat.add\u comm
    是不透明的-如果你通过它的证明(以及依赖引理的证明)并将
    Qed.
    替换为
    已定义。
    在任何地方,它的计算结果都可能是
    eq\u refl
    @DanielSchepler:谢谢。不透明和透明的区别正是我想要的。
    Nat.add_comm 3 7 : 3 + 7 = 7 + 3