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
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。在第二种情况下,它没有命名(可能是因为它没有在…
中的任何位置使用)。