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. 전체 자체에 포함 된 예 : https://gist.github.com/vzaliva/c31300aa484ff6ad2089cb0c45c3828a
순열을 위해서는 math-comp에서 사용 가능한'seq' 및'tuple' 라이브러리로 작업하는 것이 더 좋습니다. – ejgallego