我有以下代码,
此处O
是字符O
,而不是0
Module Playground1.
Inductive nat : Type :=
| O : nat
| S : nat → nat.
Definition pred (n : nat) : nat :=
match n with
| O ⇒ O
| S n' ⇒ n'
end.
End Playground1.
Definition minustwo (n : nat) : nat :=
match n with
| O ⇒ O
| S O ⇒ O
| S (S n') ⇒ n'
end.
Check (S (S (S (S O)))).
Eval compute in (minustwo 4).
我只是想知道它如何评估为2?我的意思是它实际上是如何检查数字并减去?我不是在这里减去任何东西,它还在起作用吗?我想知道这里的基本想法是什么?当我打电话给minustwo 4时,coq知道它是一个数字以及它是如何返回结果的?匹配如何在这里工作?
答案 0 :(得分:1)
Coq很容易按照一步一步的方式进行。但在我们能够做到这一点之前,我们需要知道你的程序在没有所有语法糖的情况下对Coq的看法。为此,请在程序中键入以下内容:
Set Printing All.
如果您现在打印minustwo
,您会看到
Print minustwo
> match n return nat with
> | O => O
> | S n0 => match n0 return nat with
> | O => O
> | S n' => n'
> end
> end
你的模式匹配实际上分为两种模式匹配。
不要让我们一步一步地看到Coq如何评估minustwo 4
。为此,请创建以下定理:
Goal (minustwo 4 = 2).
我们对定理本身并不在乎,我们更关心它包含术语minustwo 4
这一事实。我们现在可以逐步简化表达式(您应该在ide中运行它以实际查看正在发生的事情)。
首先,我们使用名为minustwo
的策略展开cbv delta
的定义。
cbv delta. (* unfold the definition of minustwo *)
我们现在可以使用策略cbv beta
调用该函数。
cbv beta. (* do the function call *)
我们现在可以与
进行模式匹配cbv iota; cbv beta. (* pattern match *)
由于Coq将比赛分成两部分,我们再次进行比赛
cbv iota; cbv beta. (* pattern match *)
这就是minustwo 4
为2
reflexivity.
Qed.