我需要推理一下矢量' 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,这种推理没有充分概括,取决于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
答案 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.