我需要推理向量在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
定义,因为它似乎比VectorDef.to_list
更容易推理。
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.
-
但它给我留下了感性hypotehsis这是不足够广义的,取决于v1
和v2
:
IHP : l = list_of_vec v1 -> l' = list_of_vec v2 -> VPermutation A n v1 v2
我会很高兴听到的建议总体方法和我的表述。
P.S.完整的自包含的例子:https://gist.github.com/vzaliva/c31300aa484ff6ad2089cb0c45c3828a
对于排列,您最好使用数学comp中提供的'seq'和'tuple'库。 – ejgallego