在coq中解释一个简单的操作

时间:2014-06-12 05:57:55

标签: functional-programming coq

我有以下代码, 此处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知道它是一个数字以及它是如何返回结果的?匹配如何在这里工作?

1 个答案:

答案 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 42

的原因
reflexivity.

Qed.