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]
Require Import Types.Sigma.Require Import Algebra.AbGroups.AbelianGroup Algebra.Rings.Ring Algebra.Rings.Module.Require Import Spaces.Nat.Core.Require Import Spaces.List.Core Spaces.List.Theory Spaces.List.Paths.Require Import abstract_algebra.LocalOpen Scope mc_scope.Local Set Universe Minimization ToSet.Local Set Polymorphic Inductive Cumulativity.(** * Vectors *)(** A vector is simply a list with a specified length. This data structure has many uses, but here we will focus on lists of left module elements. *)(** ** Definition *)DefinitionVector@{i|} (A : Type@{i}) (n : nat) : Type@{i}
:= { l : list A & length l = n }.(** *** Constructors *)DefinitionBuild_Vector (A : Type) (n : nat)
(f : forall (i : nat), (i < n)%nat -> A)
: Vector A n
:= (Build_list n f; length_Build_list n f).(** *** Projections *)Definitionentry {A : Type} {n : nat} (v : Vector A n) i {Hi : (i < n)%nat} : A
:= nth' (pr1 v) i ((pr2 v)^ # Hi).(** *** Basic properties *)
A: Type n: nat f: foralli : nat, (i < n)%nat -> A i: nat Hi: (i < n)%nat
entry (Build_Vector A n f) i = f i Hi
A: Type n: nat f: foralli : nat, (i < n)%nat -> A i: nat Hi: (i < n)%nat
entry (Build_Vector A n f) i = f i Hi
snapply nth'_Build_list.Defined.
A: Type n: nat k: trunc_index IsTrunc0: IsTrunc k.+2 A
IsTrunc k.+2 (Vector A n)
A: Type n: nat k: trunc_index IsTrunc0: IsTrunc k.+2 A
IsTrunc k.+2 (Vector A n)
rapply istrunc_sigma@{i i i}.Defined.
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i
v1 = v2
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i
v1 = v2
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i
v1.1 = v2.1
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i
length v1.1 = length v2.1
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i i: nat Hi: (i < length v1.1)%nat
nth' v1.1 i Hi =
nth' v2.1 i
(transport (Core.lt i) (v1.2 @ (v2.2)^) Hi)
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i i: nat Hi: (i < length v1.1)%nat
nth' v1.1 i Hi = entry v1 i
A: Type n: nat v1, v2: Vector A n H: forall (i : nat) (H : (i < n)%nat),
entry v1 i = entry v2 i i: nat Hi: (i < length v1.1)%nat
entry v2 i =
nth' v2.1 i
(transport (Core.lt i) (v1.2 @ (v2.2)^) Hi)
1, 2: apply nth'_nth'.Defined.
A: Type n: nat v: Vector A n i, j: nat Hi: (i < n)%nat Hj: (j < n)%nat p: i = j
entry v i = entry v j
A: Type n: nat v: Vector A n i, j: nat Hi: (i < n)%nat Hj: (j < n)%nat p: i = j
entry v i = entry v j
A: Type n: nat v: Vector A n i: nat Hi, Hj: (i < n)%nat
entry v i = entry v i
apply nth'_nth'.Defined.(** ** Operations *)Definitionvector_map {AB : Type} {n} (f : A -> B)
: Vector A n -> Vector B n
:= funv => Build_Vector B n (funi_ => f (entry v i)).Definitionvector_map2 {ABC : Type} {n} (f : A -> B -> C)
: Vector A n -> Vector B n -> Vector C n
:= funv1v2 => Build_Vector C n (funi_ => f (entry v1 i) (entry v2 i)).(** ** Abelian group structure *)SectionVectorAddition.Context (A : AbGroup) (n : nat).Definitionvector_plus : Plus (Vector A n) := vector_map2 (+).Definitionvector_zero : Zero (Vector A n)
:= Build_Vector A n (fun__ => 0).Definitionvector_neg : Negate (Vector A n) := vector_map (-).
A: AbGroup n: nat
Associative vector_plus
A: AbGroup n: nat
Associative vector_plus
A: AbGroup n: nat v1, v2, v3: Vector A n i: nat Hi: (i < n)%nat
entry (vector_plus v1 (vector_plus v2 v3)) i =
entry (vector_plus (vector_plus v1 v2) v3) i
A: AbGroup n: nat v1, v2, v3: Vector A n i: nat Hi: (i < n)%nat
entry v1 i + (entry v2 i + entry v3 i) =
entry v1 i + entry v2 i + entry v3 i
apply associativity.Defined.
A: AbGroup n: nat
Commutative vector_plus
A: AbGroup n: nat
Commutative vector_plus
A: AbGroup n: nat v1, v2: Vector A n i: nat Hi: (i < n)%nat
entry (vector_plus v1 v2) i =
entry (vector_plus v2 v1) i
A: AbGroup n: nat v1, v2: Vector A n i: nat Hi: (i < n)%nat
entry v1 i + entry v2 i = entry v2 i + entry v1 i
apply commutativity.Defined.
A: AbGroup n: nat
LeftIdentity vector_plus vector_zero
A: AbGroup n: nat
LeftIdentity vector_plus vector_zero
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
entry (vector_plus vector_zero v) i = entry v i
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
0 + entry v i = entry v i
apply left_identity.Defined.
A: AbGroup n: nat
RightIdentity vector_plus vector_zero
A: AbGroup n: nat
RightIdentity vector_plus vector_zero
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
entry (vector_plus v vector_zero) i = entry v i
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
entry v i + 0 = entry v i
apply right_identity.Defined.
A: AbGroup n: nat
LeftInverse vector_plus vector_neg vector_zero
A: AbGroup n: nat
LeftInverse vector_plus vector_neg vector_zero
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
entry (vector_plus (vector_neg v) v) i =
entry vector_zero i
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
- entry v i + entry v i = 0
apply left_inverse.Defined.
A: AbGroup n: nat
RightInverse vector_plus vector_neg vector_zero
A: AbGroup n: nat
RightInverse vector_plus vector_neg vector_zero
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
entry (vector_plus v (vector_neg v)) i =
entry vector_zero i
A: AbGroup n: nat v: Vector A n i: nat Hi: (i < n)%nat
entry v i - entry v i = 0
apply right_inverse.Defined.
A: AbGroup n: nat
AbGroup
A: AbGroup n: nat
AbGroup
A: AbGroup n: nat
Group
A: AbGroup n: nat
Commutative sg_op
A: AbGroup n: nat
Type
A: AbGroup n: nat
SgOp ?G
A: AbGroup n: nat
MonUnit ?G
A: AbGroup n: nat
Inverse ?G
A: AbGroup n: nat
IsGroup ?G
A: AbGroup n: nat
Commutative sg_op
A: AbGroup n: nat
Type
A: AbGroup n: nat
SgOp ?G
A: AbGroup n: nat
MonUnit ?G
A: AbGroup n: nat
Inverse ?G
A: AbGroup n: nat
IsHSet ?G
A: AbGroup n: nat
Associative sg_op
A: AbGroup n: nat
LeftIdentity sg_op mon_unit
A: AbGroup n: nat
RightIdentity sg_op mon_unit
A: AbGroup n: nat
LeftInverse sg_op inv mon_unit
A: AbGroup n: nat
RightInverse sg_op inv mon_unit
A: AbGroup n: nat
Commutative sg_op
A: AbGroup n: nat
Type
exact (Vector A n).
A: AbGroup n: nat
SgOp (Vector A n)
exact vector_plus.
A: AbGroup n: nat
MonUnit (Vector A n)
exact vector_zero.
A: AbGroup n: nat
Inverse (Vector A n)
exact vector_neg.
A: AbGroup n: nat
IsHSet (Vector A n)
exact _.
A: AbGroup n: nat
Associative sg_op
exact associative_vector_plus.
A: AbGroup n: nat
LeftIdentity sg_op mon_unit
exact left_identity_vector_plus.
A: AbGroup n: nat
RightIdentity sg_op mon_unit
exact right_identity_vector_plus.
A: AbGroup n: nat
LeftInverse sg_op inv mon_unit
exact left_inverse_vector_plus.
A: AbGroup n: nat
RightInverse sg_op inv mon_unit
exact right_inverse_vector_plus.
A: AbGroup n: nat
Commutative sg_op
exact commutative_vector_plus.Defined.EndVectorAddition.Arguments vector_plus {A n} v1 v2.(** ** Module structure *)SectionVectorScale.(** A vector of elements of an R-module is itself an R-module. A special case is when the R-module is the ring R itself. *)Context (M : AbGroup) (n : nat) {R : Ring} `{IsLeftModule R M}.Definitionvector_lact (r : R) : Vector M n -> Vector M n
:= vector_map (lact r).