Coqのベクトルの順列について、私は理由を考える必要があります。標準ライブラリには、リストの置換定義のみが含まれています。私の最初の試みとして、私はのようなベクターのためにそれを模倣しようとした:Coqベクトルの置換
Inductive VPermutation: forall n, vector A n -> vector A n -> Prop :=
| vperm_nil: VPermutation 0 [] []
| vperm_skip {n} x l l' : VPermutation n l l' -> VPermutation (S n) (x::l) (x::l')
| vperm_swap {n} x y l : VPermutation (S (S n)) (y::x::l) (x::y::l)
| vperm_trans {n} l l' l'' :
VPermutation n l l' -> VPermutation n l' l'' -> VPermutation n l l''.
私はすぐにもベクトルに対して証明する必要があり、既にリストに実績のある多くの順列補題があることに気づきました。それは多くの仕事である、と私は多分、私は次の補題を証明することにより、ショートカットを取ることができることを考えた:
Lemma ListVecPermutation {n} {l1 l2} {v1 v2}:
l1 = list_of_vec v1 ->
l2 = list_of_vec v2 ->
Permutation l1 l2 ->
VPermutation A n v1 v2.
Proof.
それは限り、私はあることを示すことができるように私は、ベクトルの再利用リストの順列補題できるようになりますベクトルを対応するリストに変換することができます。
脇に:より理由が分かりやすいと思われるので、私はcoq-color
のライブラリからlist_of_vec
の定義を使用しています。
Fixpoint list_of_vec n (v : vector A n) : list A :=
match v with
| Vnil => nil
| Vcons x v => x :: list_of_vec v
end.
この補題を証明するのは難解です。私は、誘導によってこれを実行しようとしました:
Proof.
intros H1 H2 P.
revert H1 H2.
dependent induction P.
-
intros H1 H2.
dep_destruct v1; auto.
dep_destruct v2; auto.
inversion H1.
-
しかし、それは十分に一般的なものではなく、v1
とv2
に依存誘導hypotehsisで私の葉:私は上のアドバイスを聞いて喜んでいるでしょう
IHP : l = list_of_vec v1 -> l' = list_of_vec v2 -> VPermutation A n v1 v2
一般的なアプローチと私のそれの策定。
P.S.フル自己完結型の例:https://gist.github.com/vzaliva/c31300aa484ff6ad2089cb0c45c3828a
順列については、math-compで利用可能な 'seq'と' tuple'ライブラリで作業するほうがよいでしょう。 – ejgallego