These series of notes combined
- My notes on reading Software Foundation and (if any) watching on Coq intensive.
- Gotchas from my independent studies and discussion within Prof.Fluet’s class.
The
.vcode is a gorgeous example of literal programming and the compiled.htmlwebsite is full-fledged. So this note is intended to be NOT self-contained and only focus on things I found essential or interesting.
This note is intended to be very personal and potentially mix English with Chinese (You can Lol) So yeah. Don’t expect it to be well organized and well written. I posted it on blog mainly for my own references purpose.
The quotes could either come from the book or saying from someone (even including me).
Data and Functions
Custom Notation
Notation "x && y" := (andb x y).
Notation "x || y" := (orb x y).
can go pretty far with unicode char…
making things infix
Notation "x + y" := (plus x y)
(at level 50, left associativity)
: nat_scope.
Notation "x - y" := (minus x y)
(at level 50, left associativity)
: nat_scope.
Notation "x * y" := (mult x y)
(at level 40, left associativity)
: nat_scope.
why 40 50? Making sure there are still rooms for priority in between…
no known PL using real number for priority though
Data Constructor with arguments
there are 2 ways to define them:
Inductive color : Type :=
| black
| white
| primary (p : rgb). (* ADT, need to name arg, useful in proof *)
| primary : rgb -> color. (* GADT style, dependent type *)
Syntax for arguments having the same type
As a notational convenience, if two or more arguments have the same type, they can be written together
Inductive nybble : Type :=
| bits (b0 b1 b2 b3 : bit).
Fixpoint mult (n m : nat) : nat :=
Fixpoint plus (n : nat) (m : nat) : nat :=
Fixpoint and Structrual Recursion
This requirement is a fundamental feature of Coq’s design: In particular, it guarantees that every function that can be defined in Coq will terminate on all inputs.
However, Coq’s “decreasing analysis” is not very sophisticated. E.g.
Fixpoint evenb (n:nat) : bool :=
match n with
| O => true
| S O => false
| n => evenb (pred (pred n))
end.
will result in a error that basically complains “this structure is not shrinking”.
Error:
Recursive definition of evenb is ill-formed.
evenb : nat -> bool
n : nat
n0 : nat
n1 : nat
Recursive call to evenb has principal argument equal to
"Nat.pred (Nat.pred n)" instead of one of the following variables: "n0" "n1".
Recursive definition is:
"fun n : nat =>
match n with
| 0 => true
| 1 => false
| S (S _) => evenb (Nat.pred (Nat.pred n))
end".
N.B. the n0 and n1 are sub-terms of n where n = S (S _).
So we have to make the sub-structure explicit to indicate the structure is obviously shrinking:
Fixpoint evenb (n:nat) : bool :=
match n with
| O => true
| S O => false
| S (S n') => evenb n'
end.
Now Coq will know this Fixpoint is performing a structural recursion over the 1st recursion and it guarantees to be terminated since the structure is decreasing:
evenb is defined
evenb is recursively defined (decreasing on 1st argument)
Proof by Case Analysis
Theorem plus_1_neq_0_firsttry : ∀n : nat,
(n + 1) =? 0 = false.
Proof.
intros n.
simpl. (* does nothing! *)
Abort.
simpl. does nothing since both + and =? have 2 cases.
so we have to destruct n as 2 cases: nullary O and unary S n'.
intros n. destruct n as [ (* O *) | (* S *) n'] eqn:E.
- the intro pattern
as [ |n']name new bindings. eqn:Eannonate the destructedeqn(equation?) asEin the premises of proofs. It could be elided if not explicitly used, but useful to keep for the sake of documentation as well.
subgoal 1
n : nat
E : n = 0 (* case 1, n is [O] a.k.a. [0] *)
============================
(0 + 1 =? 0) = false
subgoal 2
n, n' : nat
E : n = S n' (* case 2, n is [S n'] *)
============================
(S n' + 1 =? 0) = false
If there is no need to specify any names, we could omit as clause or simply write as [|] or as [].
In fact. Any as clause could be ommited and Coq will fill in random var name auto-magically.
A small caveat on intro
intros x y. destruct y as [ | y ] eqn:E.
By doing this, name y is shadowed. It’d usually better to use, say y' for this purpose.
Qed
standing for Latin words “Quod Erat Demonstrandum”…meaning “that which was to be demonstrated”.
What readers say
先看读者反馈,再直接在当前页面继续讨论。公共留言需要 Waline 服务端;配置后访客只填昵称即可发布。
这类长文如果结构清楚,我会一路读到底。这里最好的地方是把概念、公式和代码示例放在同一篇里。
数据库和工程文档的风格很实用,截图、SQL 和说明都能直接拿去复盘项目。
强化学习相关文章密度很高,但排版如果更清楚,回看体验会更好。这个新版方向是对的。
我更喜欢能快速扫到标签、修改时间和文章重点的首页,现在这种卡片视图会比纯列表更容易选读。
代码块只要语言标识和层级做好,技术博客的专业感会立刻上来。
评论区不用社交账号强绑定会更愿意留言,尤其是这种偏学习记录的网站。
Quick Identity
Pick a preset and leave a note
留言方式:先选择一个预设身份,再在下方输入评论。当前若显示“需要配置 Waline”,说明站点还缺少可写评论后端。
当前未选择预设身份