Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
LocalOpen Scope nat_scope.(** Finite-dimensional sequence. It is often referred to as vector, but we call it finite sequence [FinSeq] to avoid confusion with vector from linear algebra. Note that the induction principle [finseq_]*)DefinitionFinSeq@{u} (n : nat) (A : Type@{u}) : Type@{u} := Fin n -> A.(** The empty finite sequence. *)Definitionfsnil {A : Type} : FinSeq 0 A := Empty_rec.
H: Funext A: Type v: FinSeq 0 A
fsnil = v
H: Funext A: Type v: FinSeq 0 A
fsnil = v
apply path_contr.Defined.(** Add an element in the end of a finite sequence, [fscons'] and [fscons]. *)Definitionfscons' {A : Type} (n : nat) (a : A) (v : FinSeq (nat_pred n) A)
: FinSeq n A
:= funi => fin_rec (funn => FinSeq (nat_pred n) A -> A)
(fun__ => a) (funn'i_v => v i) i v.Definitionfscons {A : Type} {n : nat} : A -> FinSeq n A -> FinSeq n.+1 A
:= fscons' n.+1.(** Take the first element of a non-empty finite sequence, [fshead'] and [fshead]. *)Definitionfshead' {A} (n : nat) : 0 < n -> FinSeq n A -> A
:= match n with
| 0 => funN_ => Empty_rec (not_lt_zero_r _ N)
| n'.+1 => fun_v => v fin_zero
end.Definitionfshead {A} {n : nat} : FinSeq n.+1 A -> A := fshead' n.+1 _.
A: Type n: nat N: n > 0 a: A v: FinSeq (nat_pred n) A
fshead' n N (fscons' n a v) = a
A: Type n: nat N: n > 0 a: A v: FinSeq (nat_pred n) A
fshead' n N (fscons' n a v) = a
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A
apply fshead'_beta_fscons'.Defined.(** If the sequence is non-empty, then remove the first element. *)Definitionfstail' {A} (n : nat) : FinSeq n A -> FinSeq (nat_pred n) A
:= match n with
| 0 => fun_ => Empty_rec
| n'.+1 => funvi => v (fsucc i)
end.(** Remove the first element from a non-empty sequence. *)Definitionfstail {A} {n : nat} : FinSeq n.+1 A -> FinSeq n A := fstail' n.+1.
A: Type n: nat a: A v: FinSeq (nat_pred n) A
fstail' n (fscons' n a v) == v
A: Type n: nat a: A v: FinSeq (nat_pred n) A
fstail' n (fscons' n a v) == v
A: Type n: nat a: A v: FinSeq (nat_pred n) A i: Fin (nat_pred n)
fstail' n (fscons' n a v) i = v i
A: Type n: nat a: A v: FinSeq (nat_pred n.+1) A i: Fin (nat_pred n.+1)
H: Funext A: Type n: nat a: A v: FinSeq n A i: Fin n
fstail (fscons a v) i = v i
apply fstail'_beta_fscons'.Defined.(** A non-empty finite sequence is equal to [fscons] of head and tail, [path_expand_fscons'] and [path_expand_fscons]. *)
A: Type n: nat i: Fin n N: n > 0 v: FinSeq n A
fscons' n (fshead' n N v) (fstail' n v) i = v i
A: Type n: nat i: Fin n N: n > 0 v: FinSeq n A
fscons' n (fshead' n N v) (fstail' n v) i = v i
A: Type n: nat N: n.+1 > 0 v: FinSeq n.+1 A
fscons' n.+1 (fshead' n.+1 N v) (fstail' n.+1 v)
fin_zero = v fin_zero
A: Type n: nat i: Fin n N: n.+1 > 0 v: FinSeq n.+1 A IHi: forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i = v i
fscons' n.+1 (fshead' n.+1 N v) (fstail' n.+1 v)
(fsucc i) = v (fsucc i)
A: Type n: nat N: n.+1 > 0 v: FinSeq n.+1 A
fscons' n.+1 (fshead' n.+1 N v) (fstail' n.+1 v)
fin_zero = v fin_zero
apply fshead_beta_fscons.
A: Type n: nat i: Fin n N: n.+1 > 0 v: FinSeq n.+1 A IHi: forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i = v i
fscons' n.+1 (fshead' n.+1 N v) (fstail' n.+1 v)
(fsucc i) = v (fsucc i)
H: Funext A: Type n: nat v: FinSeq n.+1 A i: Fin n.+1
fscons (fshead v) (fstail v) i = v i
apply path_expand_fscons'.Defined.(** The following [path_fscons'] and [path_fscons] gives a way to construct a path between [fscons] finite sequences. They cooperate nicely with [path_expand_fscons'] and [path_expand_fscons]. *)
A: Type n: nat a1, a2: A v1, v2: FinSeq (nat_pred n) A p: a1 = a2 q: foralli : Fin (nat_pred n), v1 i = v2 i i: Fin n
fscons' n a1 v1 i = fscons' n a2 v2 i
A: Type n: nat a1, a2: A v1, v2: FinSeq (nat_pred n) A p: a1 = a2 q: foralli : Fin (nat_pred n), v1 i = v2 i i: Fin n
fscons' n a1 v1 i = fscons' n a2 v2 i
A: Type a1, a2: A n: nat v1, v2: FinSeq (nat_pred n.+1) A p: a1 = a2 q: foralli : Fin (nat_pred n.+1), v1 i = v2 i
A: Type a1, a2: A n: nat v1, v2: FinSeq (nat_pred n.+1) A p: a1 = a2 q: foralli : Fin (nat_pred n.+1), v1 i = v2 i i: Fin n IHi: forallv1v2 : FinSeq (nat_pred n) A,
(foralli : Fin (nat_pred n), v1 i = v2 i) ->
fscons' n a1 v1 i = fscons' n a2 v2 i
exact (fshead_beta_fscons _ _ @ p @ (fshead_beta_fscons _ _)^).
A: Type a1, a2: A n: nat v1, v2: FinSeq (nat_pred n.+1) A p: a1 = a2 q: foralli : Fin (nat_pred n.+1), v1 i = v2 i i: Fin n IHi: forallv1v2 : FinSeq (nat_pred n) A,
(foralli : Fin (nat_pred n), v1 i = v2 i) ->
fscons' n a1 v1 i = fscons' n a2 v2 i
A: Type a1, a2: A n: nat v1, v2: FinSeq (nat_pred n.+1) A p: a1 = a2 q: foralli : Fin (nat_pred n.+1), v1 i = v2 i i: Fin n IHi: forallv1v2 : FinSeq (nat_pred n) A,
(foralli : Fin (nat_pred n), v1 i = v2 i) ->
fscons' n a1 v1 i = fscons' n a2 v2 i
fscons' n.+1 a1 v1 (fsucc i) = v2 i
exact (fstail'_beta_fscons' n.+1 a1 v1 i @ q i).Defined.
A: Type n: nat a: A v: FinSeq (nat_pred n) A i: Fin n
path_fscons' n 1 (funj : Fin (nat_pred n) => 1) i = 1
A: Type n: nat a: A v: FinSeq (nat_pred n) A i: Fin n
path_fscons' n 1 (funj : Fin (nat_pred n) => 1) i = 1
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A
fin_ind
(fun (n : nat) (i : Fin n) =>
forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(fun (n : nat) (v1v2 : FinSeq (nat_pred n.+1) A)
(_ : foralli : Fin (nat_pred n.+1), v1 i = v2 i)
=>
(fshead_beta_fscons a v1 @ 1) @
(fshead_beta_fscons a v2)^)
(fun (n : nat) (i : Fin n)
(_ : forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(v1v2 : FinSeq (nat_pred n.+1) A)
(q : foralli0 : Fin (nat_pred n.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n.+1 a v1 i @ q i) @
(fstail'_beta_fscons' n.+1 a v2 i)^) fin_zero v v
(funj : Fin (nat_pred n.+1) => 1) = 1
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forallv : FinSeq (nat_pred n) A,
path_fscons' n 1 (funj : Fin (nat_pred n) => 1) i = 1
fin_ind
(fun (n : nat) (i : Fin n) =>
forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(fun (n : nat) (v1v2 : FinSeq (nat_pred n.+1) A)
(_ : foralli : Fin (nat_pred n.+1), v1 i = v2 i)
=>
(fshead_beta_fscons a v1 @ 1) @
(fshead_beta_fscons a v2)^)
(fun (n : nat) (i : Fin n)
(_ : forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(v1v2 : FinSeq (nat_pred n.+1) A)
(q : foralli0 : Fin (nat_pred n.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n.+1 a v1 i @ q i) @
(fstail'_beta_fscons' n.+1 a v2 i)^) (fsucc i) v v
(funj : Fin (nat_pred n.+1) => 1) = 1
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A
fin_ind
(fun (n : nat) (i : Fin n) =>
forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(fun (n : nat) (v1v2 : FinSeq (nat_pred n.+1) A)
(_ : foralli : Fin (nat_pred n.+1), v1 i = v2 i)
=>
(fshead_beta_fscons a v1 @ 1) @
(fshead_beta_fscons a v2)^)
(fun (n : nat) (i : Fin n)
(_ : forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(v1v2 : FinSeq (nat_pred n.+1) A)
(q : foralli0 : Fin (nat_pred n.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n.+1 a v1 i @ q i) @
(fstail'_beta_fscons' n.+1 a v2 i)^) fin_zero v v
(funj : Fin (nat_pred n.+1) => 1) = 1
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A
(fshead_beta_fscons a v @ 1) @
(fshead_beta_fscons a v)^ = 1
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A
fshead_beta_fscons a v @ (fshead_beta_fscons a v)^ = 1
apply concat_pV.
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forallv : FinSeq (nat_pred n) A,
path_fscons' n 1 (funj : Fin (nat_pred n) => 1) i = 1
fin_ind
(fun (n : nat) (i : Fin n) =>
forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(fun (n : nat) (v1v2 : FinSeq (nat_pred n.+1) A)
(_ : foralli : Fin (nat_pred n.+1), v1 i = v2 i)
=>
(fshead_beta_fscons a v1 @ 1) @
(fshead_beta_fscons a v2)^)
(fun (n : nat) (i : Fin n)
(_ : forallv1v2 : FinSeq (nat_pred n) A,
(foralli0 : Fin (nat_pred n), v1 i0 = v2 i0) ->
fscons' n a v1 i = fscons' n a v2 i)
(v1v2 : FinSeq (nat_pred n.+1) A)
(q : foralli0 : Fin (nat_pred n.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n.+1 a v1 i @ q i) @
(fstail'_beta_fscons' n.+1 a v2 i)^) (fsucc i) v v
(funj : Fin (nat_pred n.+1) => 1) = 1
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forallv : FinSeq (nat_pred n) A,
path_fscons' n 1 (funj : Fin (nat_pred n) => 1) i = 1
(fstail'_beta_fscons' n.+1 a v i @ 1) @
(fstail'_beta_fscons' n.+1 a v i)^ = 1
A: Type a: A n: nat v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forallv : FinSeq (nat_pred n) A,
path_fscons' n 1 (funj : Fin (nat_pred n) => 1) i = 1
fstail'_beta_fscons' n.+1 a v i @
(fstail'_beta_fscons' n.+1 a v i)^ = 1
apply concat_pV.Qed.
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2
fscons a1 v1 = fscons a2 v2
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2
fscons a1 v1 = fscons a2 v2
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2 i: Fin n.+1
fscons a1 v1 i = fscons a2 v2 i
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2 i: Fin n.+1
a1 = a2
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2 i: Fin n.+1
foralli : Fin (nat_pred n.+1), v1 i = v2 i
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2 i: Fin n.+1
a1 = a2
assumption.
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2 i: Fin n.+1
foralli : Fin (nat_pred n.+1), v1 i = v2 i
H: Funext A: Type n: nat a1, a2: A p: a1 = a2 v1, v2: FinSeq n A q: v1 = v2 i: Fin n.+1 j: Fin (nat_pred n.+1)
v1 j = v2 j
exact (apD10 q j).Defined.
H: Funext A: Type n: nat a: A v: FinSeq n A
path_fscons 11 = 1
H: Funext A: Type n: nat a: A v: FinSeq n A
path_fscons 11 = 1
H: Funext A: Type n: nat a: A v: FinSeq n A
(funi : Fin n.+1 =>
path_fscons' n.+11
(funj : Fin (nat_pred n.+1) => apD10 1 j) i) =
apD10 1
H: Funext A: Type n: nat a: A v: FinSeq n A i: Fin n.+1
path_fscons' n.+11
(funj : Fin (nat_pred n.+1) => apD10 1 j) i =
apD10 1 i
exact (path_fscons'_beta n.+1 a v i).Defined.(** The lemmas [path_expand_fscons_fscons'] and [path_expand_fscons_fscons] identify [path_expand_fscons'] with [path_fscons'] and [path_expand_fscons] with [path_fscons]. *)
A: Type n: nat N: n > 0 a: A v: FinSeq (nat_pred n) A i: Fin n
path_expand_fscons' n i N (fscons' n a v) =
path_fscons' n (fshead'_beta_fscons' n N a v)
(fstail'_beta_fscons' n a v) i
A: Type n: nat N: n > 0 a: A v: FinSeq (nat_pred n) A i: Fin n
path_expand_fscons' n i N (fscons' n a v) =
path_fscons' n (fshead'_beta_fscons' n N a v)
(fstail'_beta_fscons' n a v) i
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i = v i)
(fun (n : nat) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fshead_beta_fscons (v fin_zero) (fstail' n.+1 v))
(fun (n : nat) (i : Fin n)
(_ : forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i =
v i) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fstail'_beta_fscons' n.+1 (fshead v) (fstail v) i)
fin_zero N (fscons' n.+1 a v) =
fin_ind
(fun (n0 : nat) (i : Fin n0) =>
forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0), v1 i0 = v2 i0) ->
fscons' n0 (fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(fun (n0 : nat) (v1v2 : FinSeq (nat_pred n0.+1) A)
(_ : foralli : Fin (nat_pred n0.+1), v1 i = v2 i)
=>
(fshead_beta_fscons
(fshead' n.+1 N (fscons' n.+1 a v)) v1 @
fshead'_beta_fscons' n.+1 N a v) @
(fshead_beta_fscons a v2)^)
(fun (n0 : nat) (i : Fin n0)
(_ : forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0),
v1 i0 = v2 i0) ->
fscons' n0
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(v1v2 : FinSeq (nat_pred n0.+1) A)
(q : foralli0 : Fin (nat_pred n0.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n0.+1
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i @ q i) @
(fstail'_beta_fscons' n0.+1 a v2 i)^) fin_zero
(fstail' n.+1 (fscons' n.+1 a v)) v
(fstail'_beta_fscons' n.+1 a v)
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forall (N : n > 0) (v : FinSeq (nat_pred n) A),
path_expand_fscons' n i N (fscons' n a v) =
path_fscons' n (fshead'_beta_fscons' n N a v) (fstail'_beta_fscons' n a v) i
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i = v i)
(fun (n : nat) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fshead_beta_fscons (v fin_zero) (fstail' n.+1 v))
(fun (n : nat) (i : Fin n)
(_ : forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i =
v i) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fstail'_beta_fscons' n.+1 (fshead v) (fstail v) i)
(fsucc i) N (fscons' n.+1 a v) =
fin_ind
(fun (n0 : nat) (i : Fin n0) =>
forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0), v1 i0 = v2 i0) ->
fscons' n0 (fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(fun (n0 : nat) (v1v2 : FinSeq (nat_pred n0.+1) A)
(_ : foralli : Fin (nat_pred n0.+1), v1 i = v2 i)
=>
(fshead_beta_fscons
(fshead' n.+1 N (fscons' n.+1 a v)) v1 @
fshead'_beta_fscons' n.+1 N a v) @
(fshead_beta_fscons a v2)^)
(fun (n0 : nat) (i : Fin n0)
(_ : forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0),
v1 i0 = v2 i0) ->
fscons' n0
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(v1v2 : FinSeq (nat_pred n0.+1) A)
(q : foralli0 : Fin (nat_pred n0.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n0.+1
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i @ q i) @
(fstail'_beta_fscons' n0.+1 a v2 i)^) (fsucc i)
(fstail' n.+1 (fscons' n.+1 a v)) v
(fstail'_beta_fscons' n.+1 a v)
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i = v i)
(fun (n : nat) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fshead_beta_fscons (v fin_zero) (fstail' n.+1 v))
(fun (n : nat) (i : Fin n)
(_ : forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i =
v i) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fstail'_beta_fscons' n.+1 (fshead v) (fstail v) i)
fin_zero N (fscons' n.+1 a v) =
fin_ind
(fun (n0 : nat) (i : Fin n0) =>
forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0), v1 i0 = v2 i0) ->
fscons' n0 (fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(fun (n0 : nat) (v1v2 : FinSeq (nat_pred n0.+1) A)
(_ : foralli : Fin (nat_pred n0.+1), v1 i = v2 i)
=>
(fshead_beta_fscons
(fshead' n.+1 N (fscons' n.+1 a v)) v1 @
fshead'_beta_fscons' n.+1 N a v) @
(fshead_beta_fscons a v2)^)
(fun (n0 : nat) (i : Fin n0)
(_ : forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0),
v1 i0 = v2 i0) ->
fscons' n0
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(v1v2 : FinSeq (nat_pred n0.+1) A)
(q : foralli0 : Fin (nat_pred n0.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n0.+1
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i @ q i) @
(fstail'_beta_fscons' n0.+1 a v2 i)^) fin_zero
(fstail' n.+1 (fscons' n.+1 a v)) v
(fstail'_beta_fscons' n.+1 a v)
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A
fshead_beta_fscons (fscons' n.+1 a v fin_zero)
(fstail' n.+1 (fscons' n.+1 a v)) =
(fshead_beta_fscons
(fshead' n.+1 N (fscons' n.+1 a v))
(fstail' n.+1 (fscons' n.+1 a v)) @
fshead'_beta_fscons' n.+1 N a v) @
(fshead_beta_fscons a v)^
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A
fshead_beta_fscons (fscons' n.+1 a v fin_zero)
(fstail' n.+1 (fscons' n.+1 a v)) =
fshead_beta_fscons (fshead' n.+1 N (fscons' n.+1 a v))
(fstail' n.+1 (fscons' n.+1 a v)) @
(fshead'_beta_fscons' n.+1 N a v @
(fshead_beta_fscons a v)^)
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A
fshead_beta_fscons (fscons' n.+1 a v fin_zero)
(fstail' n.+1 (fscons' n.+1 a v)) =
fshead_beta_fscons (fshead' n.+1 N (fscons' n.+1 a v))
(fstail' n.+1 (fscons' n.+1 a v)) @ 1
exact (concat_p1 _)^.
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forall (N : n > 0) (v : FinSeq (nat_pred n) A),
path_expand_fscons' n i N (fscons' n a v) =
path_fscons' n (fshead'_beta_fscons' n N a v) (fstail'_beta_fscons' n a v) i
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i = v i)
(fun (n : nat) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fshead_beta_fscons (v fin_zero) (fstail' n.+1 v))
(fun (n : nat) (i : Fin n)
(_ : forall (N : n > 0) (v : FinSeq n A),
fscons' n (fshead' n N v) (fstail' n v) i =
v i) (_ : n.+1 > 0) (v : FinSeq n.+1 A) =>
fstail'_beta_fscons' n.+1 (fshead v) (fstail v) i)
(fsucc i) N (fscons' n.+1 a v) =
fin_ind
(fun (n0 : nat) (i : Fin n0) =>
forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0), v1 i0 = v2 i0) ->
fscons' n0 (fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(fun (n0 : nat) (v1v2 : FinSeq (nat_pred n0.+1) A)
(_ : foralli : Fin (nat_pred n0.+1), v1 i = v2 i)
=>
(fshead_beta_fscons
(fshead' n.+1 N (fscons' n.+1 a v)) v1 @
fshead'_beta_fscons' n.+1 N a v) @
(fshead_beta_fscons a v2)^)
(fun (n0 : nat) (i : Fin n0)
(_ : forallv1v2 : FinSeq (nat_pred n0) A,
(foralli0 : Fin (nat_pred n0),
v1 i0 = v2 i0) ->
fscons' n0
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i =
fscons' n0 a v2 i)
(v1v2 : FinSeq (nat_pred n0.+1) A)
(q : foralli0 : Fin (nat_pred n0.+1),
v1 i0 = v2 i0) =>
(fstail'_beta_fscons' n0.+1
(fshead' n.+1 N (fscons' n.+1 a v)) v1 i @ q i) @
(fstail'_beta_fscons' n0.+1 a v2 i)^) (fsucc i)
(fstail' n.+1 (fscons' n.+1 a v)) v
(fstail'_beta_fscons' n.+1 a v)
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forall (N : n > 0) (v : FinSeq (nat_pred n) A),
path_expand_fscons' n i N (fscons' n a v) =
path_fscons' n (fshead'_beta_fscons' n N a v) (fstail'_beta_fscons' n a v) i
fstail'_beta_fscons' n.+1 (fshead (fscons' n.+1 a v))
(fstail (fscons' n.+1 a v)) i =
(fstail'_beta_fscons' n.+1
(fshead' n.+1 N (fscons' n.+1 a v))
(fstail' n.+1 (fscons' n.+1 a v)) i @
fstail'_beta_fscons' n.+1 a v i) @
(fstail'_beta_fscons' n.+1 a v i)^
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forall (N : n > 0) (v : FinSeq (nat_pred n) A),
path_expand_fscons' n i N (fscons' n a v) =
path_fscons' n (fshead'_beta_fscons' n N a v) (fstail'_beta_fscons' n a v) i
fstail'_beta_fscons' n.+1 (fshead (fscons' n.+1 a v))
(fstail (fscons' n.+1 a v)) i =
fstail'_beta_fscons' n.+1
(fshead' n.+1 N (fscons' n.+1 a v))
(fstail' n.+1 (fscons' n.+1 a v)) i @
(fstail'_beta_fscons' n.+1 a v i @
(fstail'_beta_fscons' n.+1 a v i)^)
A: Type n: nat N: n.+1 > 0 a: A v: FinSeq (nat_pred n.+1) A i: Fin n IHi: forall (N : n > 0) (v : FinSeq (nat_pred n) A),
path_expand_fscons' n i N (fscons' n a v) =
path_fscons' n (fshead'_beta_fscons' n N a v) (fstail'_beta_fscons' n a v) i
fstail'_beta_fscons' n.+1 (fshead (fscons' n.+1 a v))
(fstail (fscons' n.+1 a v)) i =
fstail'_beta_fscons' n.+1
(fshead' n.+1 N (fscons' n.+1 a v))
(fstail' n.+1 (fscons' n.+1 a v)) i @ 1
exact (concat_p1 _)^.Qed.
H: Funext A: Type n: nat a: A v: FinSeq n A
path_expand_fscons (fscons a v) =
path_fscons (fshead_beta_fscons a v)
(fstail_beta_fscons a v)
H: Funext A: Type n: nat a: A v: FinSeq n A
path_expand_fscons (fscons a v) =
path_fscons (fshead_beta_fscons a v)
(fstail_beta_fscons a v)
H: Funext A: Type n: nat a: A v: FinSeq n A
(funi : Fin n.+1 =>
path_expand_fscons' n.+1 i (leq_add_r 1 n)
(fscons a v)) =
(funi : Fin n.+1 =>
path_fscons' n.+1 (fshead_beta_fscons a v)
(funj : Fin (nat_pred n.+1) =>
apD10 (fstail_beta_fscons a v) j) i)
H: Funext A: Type n: nat a: A v: FinSeq n A i: Fin n.+1
path_expand_fscons' n.+1 i (leq_add_r 1 n)
(fscons a v) =
path_fscons' n.+1 (fshead_beta_fscons a v)
(funj : Fin (nat_pred n.+1) =>
apD10 (fstail_beta_fscons a v) j) i
H: Funext A: Type n: nat a: A v: FinSeq n A i: Fin n.+1 p:= eisretr apD10 (fstail'_beta_fscons' n.+1 a v): (apD10 o apD10^-1) (fstail'_beta_fscons' n.+1 a v) =
idmap (fstail'_beta_fscons' n.+1 a v)
path_expand_fscons' n.+1 i (leq_add_r 1 n)
(fscons a v) =
path_fscons' n.+1 (fshead_beta_fscons a v)
(funj : Fin (nat_pred n.+1) =>
apD10 (fstail_beta_fscons a v) j) i
H: Funext A: Type n: nat a: A v: FinSeq n A i: Fin n.+1 p:= eisretr apD10 (fstail'_beta_fscons' n.+1 a v): (apD10 o apD10^-1) (fstail'_beta_fscons' n.+1 a v) =
idmap (fstail'_beta_fscons' n.+1 a v)
path_expand_fscons' n.+1 i (leq_add_r 1 n)
(fscons a v) =
path_fscons' n.+1 (fshead_beta_fscons a v)
(fstail'_beta_fscons' n.+1 a v) i
exact (path_expand_fscons_fscons' n.+1 _ a v i).Defined.(** The induction principle for finite sequence, [finseq_ind]. Note that it uses funext and does not compute. *)
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat v: FinSeq n A
P n v
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat v: FinSeq n A
P n v
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) v: FinSeq 0 A
P 0 v
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat v: FinSeq n.+1 A IHn: forallv : FinSeq n A, P n v
P n.+1 v
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) v: FinSeq 0 A
P 0 v
exact (transport (P 0) (path_fsnil v) z).
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat v: FinSeq n.+1 A IHn: forallv : FinSeq n A, P n v
P n.+1 v
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat v: FinSeq n.+1 A IHn: forallv : FinSeq n A, P n v
P n.+1 (fscons (fshead v) (fstail v))
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat v: FinSeq n.+1 A IHn: forallv : FinSeq n A, P n v
P n (fstail v)
apply IHn.Defined.
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v)
finseq_ind P z s fsnil = z
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v)
finseq_ind P z s fsnil = z
exact (ap (funx => _ x z) (hset_path2 1 (path_fsnil fsnil)))^.Defined.
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat a: A v: FinSeq n A
finseq_ind P z s (fscons a v) =
s n a v (finseq_ind P z s v)
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat a: A v: FinSeq n A
finseq_ind P z s (fscons a v) =
s n a v (finseq_ind P z s v)
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat a: A v: FinSeq n A
transport (P n.+1) (path_expand_fscons (fscons a v))
(s n (fshead (fscons a v)) (fstail (fscons a v))
(finseq_ind P z s (fstail (fscons a v)))) =
s n a v (finseq_ind P z s v)
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat a: A v: FinSeq n A
transport (P n.+1)
(path_fscons (fshead_beta_fscons a v)
(fstail_beta_fscons a v))
(s n (fshead (fscons a v)) (fstail (fscons a v))
(finseq_ind P z s (fstail (fscons a v)))) =
s n a v (finseq_ind P z s v)
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat a: A v: FinSeq n A p1:= fshead_beta_fscons a v: fshead (fscons a v) = a
transport (P n.+1)
(path_fscons p1 (fstail_beta_fscons a v))
(s n (fshead (fscons a v)) (fstail (fscons a v))
(finseq_ind P z s (fstail (fscons a v)))) =
s n a v (finseq_ind P z s v)
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat a: A v: FinSeq n A p1:= fshead_beta_fscons a v: fshead (fscons a v) = a p2:= fstail_beta_fscons a v: fstail (fscons a v) = v
transport (P n.+1) (path_fscons p1 p2)
(s n (fshead (fscons a v)) (fstail (fscons a v))
(finseq_ind P z s (fstail (fscons a v)))) =
s n a v (finseq_ind P z s v)
H: Funext A: Type P: foralln : nat, FinSeq n A -> Type z: P 0 fsnil s: forall (n : nat) (a : A) (v : FinSeq n A),
P n v -> P n.+1 (fscons a v) n: nat a: A v: FinSeq n A
transport (P n.+1) (path_fscons 11)
(s n (fshead (fscons a (fstail (fscons a v))))
(fstail (fscons a v))
(finseq_ind P z s (fstail (fscons a v)))) =
s n (fshead (fscons a (fstail (fscons a v))))
(fstail (fscons a v))
(finseq_ind P z s (fstail (fscons a v)))
exact (ap (funp => transport _ p _) (path_fscons_beta _ _)).Defined.