Coq Can';不要在证明中使用peanat.Nat.add_assoc

Coq Can';不要在证明中使用peanat.Nat.add_assoc,coq,Coq,输出: Require Import PeanoNat. Check PeanoNat.Nat.add_assoc. 因此,定义了定理 但当我创建一个定理并尝试使用它时,它给出了一个错误: Nat.add_assoc : forall n m p : nat, n + (m + p) = n + m + p 错误:在中找不到引用PeanoNat.Nat.add_assoc 当前环境 为什么它找不到定理?证明之后的东西。不是证明本身。这是一系列被称为战术的指示,告诉Coq如何建立证

输出:

Require Import PeanoNat.

Check PeanoNat.Nat.add_assoc.
因此,定义了定理

但当我创建一个定理并尝试使用它时,它给出了一个错误:

Nat.add_assoc
     : forall n m p : nat, n + (m + p) = n + m + p
错误:在中找不到引用PeanoNat.Nat.add_assoc 当前环境


为什么它找不到定理?

证明之后的东西。不是证明本身。这是一系列被称为战术的指示,告诉Coq如何建立证据
add_assoc
是一种证明,而不是一种建立证明的策略。您可以使用策略
rewrite(Nat.add_assoc a(b+c)d)
根据等式重写(任何部分)目标

Theorem a : forall a b c d e f,
    a + b + c + d + e = f.
Proof.
  intros.
  PeanoNat.Nat.add_assoc a (b + c) d.

但是,您的目标
a+b+c+d+e=f
不包含这两个术语-
+
是左关联的,您的目标实际上是
((a+b)+c)+d)+e=f
,因此此策略将失败。事实上,你的目标是无法实现的,但我认为这只是一个例子。您可能还对策略
应用[prf]
感兴趣。它获取
prf
的结论(所有
->
右侧的内容和所有
内容),将其与目标匹配,并为其所有假设提供子目标。另请参见:.

apply prf
prf
周围的这些方括号仅供您解释,对吗?它们不应该在正常Coq代码中存在?我原以为这是我不知道的
apply
的一个变体,但现在我想我误解了你的帖子。“你的目标是无法实现的,但我认为这只是一个例子”——yes@eponier是的,括号只是为了表明这是一个可以改变的论点。实际使用中没有它们。
Nat.add_assoc a (b + c) d
  : a + (b + c + d) = a + (b + c) + d