私はCoqが初めてです。
挿入ソートの汎用バージョンを実装しようとしています。私が実装しているのは、 Comparator をパラメーターとして受け取るモジュールです。この Comparator は、比較演算子 (is_eq、is_le、is_neq など) を実装します。
挿入ソートでは、挿入するために、入力リスト内の 2 つの要素を比較し、比較の結果に基づいて、要素を正しい位置に挿入する必要があります。
私の問題は、比較演算子の実装がそうで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 は bool ではなく Prop を返すため、insert fixpoint は機能しません)。
どんな助けでも大歓迎です。