Function 构造Coq码

Function 构造Coq码,function,types,structure,coq,Function,Types,Structure,Coq,我有通常的设置:首先定义一些类型,然后从这些类型中定义一些函数。但是,因为有很多方法可以将我所做的事情形式化,所以我将在3个版本中完成它。为简单起见(并维护概述),我希望将代码放在一个文件中我还希望尽量减少重复代码。为此,针对特定内容和前面的一般定义,使用3Modules进行设置可能会起作用,但在以下所述的情况下不起作用: 函数f:A->B的一般定义,可在所有 部分(或模块) A的模块(或部分)特定定义 f必须可在所有部分(或模块)中计算 您建议我使用什么设置?需要导入算术。 Require I

我有通常的设置:首先定义一些类型,然后从这些类型中定义一些函数。但是,因为有很多方法可以将我所做的事情形式化,所以我将在3个版本中完成它。为简单起见(并维护概述),我希望将代码放在一个文件中我还希望尽量减少重复代码。为此,针对特定内容和前面的一般定义,使用3
Module
s进行设置可能会起作用,但在以下所述的情况下不起作用:

  • 函数
    f:A->B
    的一般
    定义
    ,可在所有 部分(或模块)

  • A的模块(或部分)特定定义

  • f
    必须可在所有部分(或模块)中计算

  • 您建议我使用什么设置?

    需要导入算术。
    
    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.
    
    (*使用一些常规属性为某些类型a创建模块类型。*) 模块类型ModA。 参数A:类型。 公理a_dec:forall ab:a,{a=b}+{ab}。 结束莫达。 (*定义在另一个模块中使用A类型的函数 导入ModA类型模块*) 模块FMod(AM:(ModA))。 输入AM。 定义f(a1 a2:A):=如果A决定a1 a2,那么1其他2。 结束FMod。 (*以下是如何在另一个模块中使用f*) 模块F理论(AM:ModA)。 模块M:=FMod AM。 输入M。 输入AM。 定理f_定理:对于所有a,f a=1。 介绍。计算。自毁(a_dec__)。 自动的。相似 Qed。 结束理论。 (*最终,以某种方式稳定A型,
    使用子类型“你看了吗?谢谢,现在就看一看。似乎
    模块类型
    只能包含
    公理
    s和
    参数
    s。因为
    f
    会有一个主体(我已经用定义定义了它
    ),我无法将其放入
    模块类型
    。ATM我不知道如何满足我问题中的1-2点(甚至还没有认真考虑过3点)PS。你可以(更方便)开始计算
    f
    nat
    上已经在
    FTheory
    中——只需插入
    变量na:>nat->A.computef34.
    Import AM.
    之后,这里的想法是展示如何分离出一般属性,例如作为一个组、可判定、排序等,并创建关于它们的一般理论之后,这些理论可以专门用于特定实例,如矩阵、列表、树等,同时放置引用特定实例的引理(如nat,可判定)进入可判定类型的一般理论是可能的,但打破了对所有可判定类型都适用的事物与对NAT特别适用的事物之间的分离。