我对 Coq 有点陌生。
我正在尝试实现插入排序的通用版本。我正在实现的是作为一个以比较器为参数的模块。这个 Comparator 实现了比较运算符(例如 is_eq、is_le、is_neq 等)。
在插入排序中,为了插入,我必须比较输入列表中的两个元素,并根据比较的结果,将元素插入到正确的位置。
我的问题是比较运算符的实现是type -> type -> prop
(我需要它们像这样才能实现其他类型/证明)。type -> type -> bool
如果可以避免,我宁愿不创建运算符的版本。
有什么方法可以将True | False
prop 转换为 bool 以在if ... then ... 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.
自然数的实现:
Module IntComparator <: Comparator.ComparatorSig.
Definition X := nat.
Definition is_le x y := x <= y.
Definition is_eq x y := eq_nat x y.
Definition is_neq x y:= ~ is_eq x y.
Definition eqDec := eq_nat_dec.
Definition is_le_trans := le_trans.
End IntComparator.
插入排序的插入部分:
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.
(显然,插入固定点不起作用,因为 is_le 返回 Prop 而不是 bool)。
任何帮助表示赞赏。