Coq向量排列

时间:2017-10-20 01:40:15

标签: list vector permutation coq induction

我需要推理一下矢量' 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.

只要我能证明向量可以转换为相应的列表,就可以让我重复使用列表置换引理。

除此之外:我使用list_of_vec库中的coq-color定义,因为它似乎比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,这种推理没有充分概括,取决于v1v2

  IHP : l = list_of_vec v1 -> l' = list_of_vec v2 -> VPermutation A n v1 v2

我很高兴听到关于这种方法的一些建议和我的表述。

P.S。完整的自包含示例:https://gist.github.com/vzaliva/c31300aa484ff6ad2089cb0c45c3828a

2 个答案:

答案 0 :(得分:2)

我使用了这些简单的引理:

Fri Oct 20 00:44:50 CEST 2017

并进一步概括了诱导假设:

first()

警告:我没有尝试简化证明或摆脱Lemma list_of_vec_eq (A : Type) (n : nat) (v1 v2 : vector A n) : list_of_vec v1 = list_of_vec v2 -> v1 = v2. Admitted. Lemma list_of_vec_length {A : Type} {n : nat} {v : vector A n} : length (list_of_vec v) = n. Admitted. Lemma list_of_vec_vec_of_list {A : Type} {l : list A} : list_of_vec (vec_of_list l) = l. Admitted. 公理。

答案 1 :(得分:1)

这是一个没有公理的解决方案,使用辅助引理来破坏向量。

org.openqa.selenium.InvalidSelectorException: invalid selector: The result of the xpath expression "//ib-selector[@initial-label='dateYear']/div/text()" is: [object Text]. It should be an element.