构建Coq代码

时间:2017-04-30 20:04:16

标签: function types structure coq

我有通常的设置:首先我定义一些类型,然后是这些类型的一些函数。但是,由于有许多方法可以将我所做的事情形式化,我将在3个版本中完成。为简单起见(并保持概述),我希望将代码放在一个文件中。 我还希望尽量减少重复代码。为此,对于特定内容和前面的一般定义,设置w / 3 Module可能有效 - 但不是在下面描述的情况类型中:

  1. 函数Definition的一般f: A -> B,可以访问 部分(或模块)

  2. A

  3. 的模块(或部分)具体定义
  4. f必须可在所有部分(或模块)中计算

  5. 您建议我使用哪种设置?

1 个答案:

答案 0 :(得分:3)

Require Import Arith.

(* Create a module type for some type A with some general properties. *)
Module Type ModA.
  Parameter A: Type.
  Axiom a_dec: forall a b:A, {a=b}+{a<>b}.
End ModA.

(* Define the function that uses the A type in another module 
   that imports a ModA type module *)

Module FMod (AM: (ModA)).
  Import AM.
  Definition f (a1 a2:A) := if a_dec a1 a2 then 1 else 2.
End FMod.

(* Here's how to use f in another module *)
Module FTheory (AM:ModA).
  Module M := FMod AM.
  Import M.
  Import AM.

  Theorem f_theorem: forall a, f a a = 1.
    intros. compute. destruct (a_dec _ _).
    auto. congruence.
  Qed.
End FTheory.  

(* Eventually, instatiate the type A in some way,
   using subtyping '<:'. *)

Module ModANat <: ModA.
  Definition A := nat.
  Theorem a_dec: forall a b:A, {a=b}+{a<>b}.
    apply eq_nat_dec.
  Qed.
 End ModANat. 

(* Here we use f for your particular type A *)
Module FModNat := FMod ModANat.

Compute (FModNat.f 3 4).

Recursive Extraction FModNat.f.

Goal FModNat.f 3 3 = 1.
  Module M := FTheory ModANat.
  apply M.f_theorem.
Qed.