关于intros的理解
我们通常会说“‘假设’ 存在一个任意自然数 n…”。而在形式化证明中,这是用 intros n 来实现的,它会将量词从证明目标转移到当前假设的’上下文’中。
这里可以理解为,intros n m将第一个假设forall n m:nat放入上下文,假设它成立。intros H将第二个假设n=m放入上下文,假设它成立。
关于case的理解
其第一个参数先被 match 匹配。 但此处 + 的第一个参数 n 未知,而 eqb 的第一个参数 n + 1 是复杂表达式,二者均无法化简。
case n as [|n’]可以理解为对n进行情况分析,O和n‘的情况下。
关于intros[|n]和intros[] []的理解
对于nat型的n进行分析的时候,我们使用的 intros x y. destruct y as [|y] eqn:E. 可以合并成intros [|n].
对于bool型的n进行分析的时候,我们使用的 intros x y. case b 可以合并成intros [] .或者多个case时,intros [][].
例如:
**不动点 Fixpoint 和结构化递归 **
Coq 要求每个 Fixpoint 定义中的某些参数必须是“递减的”
当 Coq 查看此定义时,它会注意到“plus’ 的第一个参数是递减的”。 这意味着我们对参数 n 执行了’结构化递归’。换言之,我们仅对严格递减的 n 值进行递归调用。这一点蕴含了“对 plus’ 的调用最终会停止”。