Coq 编码有序集

Coq 编码有序集,coq,Coq,至于有Coq编程经验, 我想知道是否有其他方法来编码,而不是我的编码,用于检查它们的预订单关系。我在下面的代码中将程序的数据类型和函数替换为简单的数据类型和函数。 mydata是一个具有前序关系(即具有自反和传递关系)的集合,是函数mappingFunction的范围,该函数将nat数字映射到mydata。当编码定理映射函数正在增加时,我无法在mydata上定义预序关系,因此作为一种解决方案,我通过dataparts\u toNat将mydata映射到nat编号,以使我能够定义它们之间的预序关系

至于有Coq编程经验, 我想知道是否有其他方法来编码,而不是我的编码,用于检查它们的预订单关系。我在下面的代码中将程序的数据类型和函数替换为简单的数据类型和函数。
mydata
是一个具有前序关系(即具有自反和传递关系)的集合,是函数
mappingFunction
的范围,该函数将nat数字映射到
mydata
。当编码定理
映射函数正在增加时,我无法在mydata上定义预序关系,因此作为一种解决方案,我通过
dataparts\u toNat
mydata
映射到nat编号,以使我能够定义它们之间的预序关系。我想知道是否还有其他方法可以执行此程序,例如不使用
dataparts\u toNat
。多谢各位

 (*defining the datatype*)
Inductive mydata : Set :=
  | part1 : mydata
  | part2 : mydata
  |part3 :mydata.

(* mapping to nats to have
        preorder relation(part1<part2<part3 and part1=part1 and part2=part2 and part3=part3)*)
Definition dataparts_toNat (n:mydata):nat :=
   match n with
          |part1 => 0
          |part2 => 1
          |part3 => 2
    end.

(* a sample function from nat to mydata which is always increasing or not changing*)
Definition mappingFunction
  (a1:nat): mydata :=
        match a1 with 
           |0=> part1
           |S(0) => part2
           |_ => part3
         end.    
Theorem mappingFunction_isIncreasing: forall(a1 a2: nat)(data1 data2: mydata),
   a1<=a2 -> (mappingFunction a1= data1 )/\(mappingFunction a2= 
data2) -> ((dataparts_toNat data1) <= dataparts_toNat(data2)).
Proof.
(*定义数据类型*)
归纳mydata:设置:=
|第1部分:mydata
|第2部分:mydata
|第三部分:mydata。
(*映射到NAT以使
前序关系(第1部分)
|第3部分=>2
结束。
(*从nat到mydata的示例函数,该函数始终在增加或不变*)
定义映射函数
(a1:nat):我的数据:=
将a1与
|0=>第1部分
|S(0)=>第2部分
|_=>第三部分
结束。
定理映射函数是递增的:forall(a1 a2:nat)(data1 data2:mydata),
a1(映射函数a1=data1)/\(映射函数a2=
数据2)->(数据部分数据1)
您可以将比较定义为布尔函数
mydata->mydata->bool

Definition le_mydata_dec (d1 d2 : mydata) : bool :=
  match d1, d2 with
  | part1, _ => true
  | part2, (part2 | part3) => true
  | part3, part3 => true
  | _, _ => false
  end.
从中导出一个比较关系
mydata->mydata->Prop
(这只是一种方法,有时将
le_mydata
定义为一个
归纳的
命题更方便)

映射函数相同(为了简洁起见,重命名为
f
):

这就是单调性:

Theorem f_isMonotonic: forall(a1 a2: nat),
   a1<=a2 -> le_mydata (f a1) (f a2).
Proof.
Abort.
使用该符号,再次证明单调性定理:

Theorem f_isMonotonic: forall(a1 a2: nat),
   a1<=a2 -> (f a1 <= f a2)%mydata.
Proof.
Abort.
定理f_是单调的:forall(a1a2:nat),

a1(在我的代码
dataparts\u toNat
中,f a1将
mydata
映射到nat,因为它们具有较大数据类型的预排序关系,您可以使用策略或插件来自动实现和验证标准关系(尽管我不知道任何广泛可用的实现)。
(* a sample function from nat to mydata which is always increasing or not changing*)
Definition f
  (a1:nat): mydata :=
        match a1 with 
           |0=> part1
           |S(0) => part2
           |_ => part3
         end.    
Theorem f_isMonotonic: forall(a1 a2: nat),
   a1<=a2 -> le_mydata (f a1) (f a2).
Proof.
Abort.
Infix "<=" := le_mydata : mydata_scope.
Delimit Scope mydata_scope with mydata.
(* now we can write  (x <= y)%mydata  instead of  le_mydata x y *)
Theorem f_isMonotonic: forall(a1 a2: nat),
   a1<=a2 -> (f a1 <= f a2)%mydata.
Proof.
Abort.