Coq 如何将(简介';d)假设返回到目标公式?

Coq 如何将(简介';d)假设返回到目标公式?,coq,Coq,为了证明: Parameter A B : Prop. Goal A->B. intro A. 我得到: 1 subgoals A : A ______________________________________(1/1) B 如何返回到目标部分?返回: 1 subgoals ______________________________________(1/1) A -> B 使用revert策略: revert A. 这与简介完全相反,参见。您可以使用还原策略 考虑到

为了证明:

Parameter A B : Prop.
Goal A->B.
intro A.
我得到:

 1 subgoals
A : A
______________________________________(1/1)
B
如何返回到目标部分?返回:

1 subgoals
______________________________________(1/1)
A -> B

使用
revert
策略:

revert A.

这与
简介
完全相反,参见。

您可以使用
还原
策略

考虑到Coq有过多的策略,每种策略都有不同的角落案例和不同质量的文档,很常见的情况是您不知道使用哪种策略

在这种情况下,我发现把你的证明看作一个程序(参见Curry Howard同构)是很有用的,并且问问你自己,为了解决你的目标,你需要写什么术语。这种方法的优点是Coq的术语语言更容易学习(因为没有那么多不同类型的术语),并且表达能力足以解决所有可以用策略解决的目标(尽管有时证明更加冗长)

你可以使用这种策略用术语语言写证明。
refine
的参数是一个带有孔的术语
\uu
<代码>优化使用术语释放当前目标,并为术语中的每个孔生成子目标。一旦你知道了
refine
的工作原理,你所要做的就是想出一个符合你需要的术语。例如:

  • 使用
    refine(h)
    还原假设
    h
  • 使用
    refine(fun h=>)
    引入假设
    h
  • refine((fun h'=>uuh)
    复制一个假设
    h
请注意,Coq的战术往往会在幕后发挥相当大的魔力。例如,在处理因变量时,
revert
策略比上面的
refine
策略“更聪明”:

Goal forall n:nat, n >= 0.
  intro n; revert n.      (* forall n : nat, n >= 0 *)
Restart.
  intro n; refine (_ n).  (* nat -> n >= 0 *)
Restart.
  intro n'; refine ((_ : forall n, n >= 0) n').   (* forall n : nat, n >= 0 *)
Abort.

老实说,我不理解
refine(h)
的魔力,但它肯定不同于
revert h
,因为h不仅仅是一个假设,而是一个参数
h:nat
。在这种情况下,
revert h
给出了所有h:nat的
refine(h)
给出了
nat->,
,这两个函数都是接受nat的函数吗?在第一种情况下,nat被命名为h。在第二种情况下,它没有命名(可能是因为它没有在
中的任何位置使用)。