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