Coq-如果。。。然后。。。其他的

Coq-如果。。。然后。。。其他的,coq,Coq,我对Coq有点陌生 我正在尝试实现插入排序的通用版本。我将实现is作为一个模块,它将比较器作为参数。此比较器实现比较运算符(如is_eq、is_le、is_neq等) 在插入排序中,为了插入,我必须比较输入列表中的两个元素,并根据比较结果将元素插入正确的位置 我的问题是比较运算符的实现是type->type->prop(我需要它们类似于其他类型/证明的实现)。如果可以避免的话,我宁愿不创建操作符的type->type->bool版本 如果。。。然后。。。else条款 比较器模块类型: Modul

我对Coq有点陌生

我正在尝试实现插入排序的通用版本。我将实现is作为一个模块,它将比较器作为参数。此比较器实现比较运算符(如is_eq、is_le、is_neq等)

在插入排序中,为了插入,我必须比较输入列表中的两个元素,并根据比较结果将元素插入正确的位置

我的问题是比较运算符的实现是
type->type->prop
(我需要它们类似于其他类型/证明的实现)。如果可以避免的话,我宁愿不创建操作符的
type->type->bool
版本

如果。。。然后。。。else条款

比较器模块类型:

Module Type ComparatorSig.

  Parameter X: Set.
  Parameter is_eq : X -> X -> Prop.
  Parameter is_le : X -> X -> Prop.
  Parameter is_neq :  X -> X -> Prop.

  Infix "=" := is_eq (at level 70).
  Infix "<>" := (~ is_eq) (at level 70).
  Infix "<=" := is_le (at level 70).

  Parameter eqDec : forall x y : X, { x = y } + { x <> y }.

  Axiom is_le_trans : forall (x y z:X), is_le x y -> is_le y z -> is_le x z.

End ComparatorSig.
(显然,插入固定点不起作用,因为is_le is返回Prop而不是bool)


感谢您的帮助。

您似乎对道具有点困惑

is_le x y
是Prop类型,并且是语句
x小于或等于y
。这并不能证明这句话是正确的。证明该陈述正确的证据应为
p:is_le x y
,该类型的居民(即该陈述真实性的见证人)

这就是为什么在
IntComparator.is_le x h
上进行模式匹配没有多大意义

更好的界面如下所示:

Module Type ComparatorSig.

  Parameter X: Set.
  Parameter is_le : X -> X -> Prop.
  Parameter is_le_dec : forall x y, { is_le x y } + { ~ is_le x y }.
具体而言,
is_le_dec
的类型是属性
is_le
的决策过程的类型,也就是说,它返回一个证明
x
  Fixpoint insert (x : IntComparator .X) (l : list IntComparator .X) :=
    match l with
      | nil => x :: nil
      | h :: tl => if IntComparator.is_le x h then x :: h :: tl else h :: (insert x tl)
    end.
Module Type ComparatorSig.

  Parameter X: Set.
  Parameter is_le : X -> X -> Prop.
  Parameter is_le_dec : forall x y, { is_le x y } + { ~ is_le x y }.