Coq 入门学习笔记 (1)
鸡年当然要学习鸡语言啦。
简介
在开始玩耍之前需要到官网下载 Coq
安装完成后打开 Coq 的 REPL —— Coq.exe 。
打开后能看到类似内容
1 | Welcome to Coq 8.6 (December 2016) |
输入 "Hello World".
打印 Hello World 。
然而并没有什么 Hello World :P 。
普通的引理
先来证明一个普通的引理,算是 Hello World 吧。
在 Coq 中输入一下内容。 被 (*
和 *)
括起来的是注释不用输入。 「Coq <」 也不用输入。
1 | Coq < Section Minimal_Logic. (* 以点号结尾,类似 C 语言的分号 *) |
证明完毕!到此结束,手动再见。
简单的过程
既然愿意了解,那么就一步步来。先撤销证明。
1 | Unnamed_thm < Undo. (* U 是大写 *) |
输出的内容中 1 subgoal 说明只有一个目标需要证明
A, B, C : Prop
表示 A B C 都是 Prop 。Prop 是命题 (Proposition)的缩写。
============================
是分割线。上面的内容是假设和条件。下面的内容是需要证明的部分。
(A -> B -> C) -> (A -> B) -> A -> C
需要证明的内容。 用 ()
括起来表示视为一个整体, ->
为蕴涵。
A -> B
读作若 A 则 B。
接下来为了方便证明,需要引入一些假设。
使用 intro
引入一个假设。
1 | Unnamed_thm < intro H. |
引入了假设 H : A -> B ->C
。证明的目标就变成了 (A -> B) -> A -> C
。
还可以引入多个假设。
多个假设使用 intros
就是 intro
加了 s 。
1 | Unnamed_thm < intros H' HA. |
现在需要证明的目标变成了 C
。
观察已有条件,发现假设 H : A -> B -> C
蕴涵 C
。当然演绎出 C
还需要 A -> B
。
可以先应用假设,转化证明的目标。
应用假设使用 apply
1 | Unnamed_thm < apply H. |
现在目标变成了两个,一个 A
一个 B
。
观察已有条件,A
刚好是假设 HA : A
。
使用 exact
表示刚好。
1 | Unnamed_thm < exact HA. |
现在目标变成了 B
。
观察已有条件,假设 H' : A -> B
蕴含了 B
。
那么应用 H'
即可。
1 | Unnamed_thm < apply H'. |
现在目标变成了 A
。
之前已经证明了 A
。这里可以用 exact HA.
。
也可以直接总结,表示目标已经证明。
总结使用 assumption
。
1 | Unnamed_thm < assumption. |
No more subgoals
说明没有需要证明的目标了。证明结束。
证明可以使用 Save
保存。
1 | Unnamed_thm < Save trivial_lemma. |
中间的部分就是证明的过程。
最后
这次就简单的写个 Hello World 的笔记。后面的内容还需要慢慢整理。