Reflection certificates for the echelon decomposition #
The list-based certificates for a part of Echelon.Decomposition and their bridge lemmas.
Main definitions #
IsLowerTriangularDiagList: a list of rows is lower triangular with nonzero diagonal.IsPivotedList: a list of rows has the given pivot columns.pivotOfList: the pivot function corresponding to a given list of pivot columns.
Implementation notes #
The two conditions are kept as separate predicates for optimised checks.
The pivot cert states that each row is 0 up to its pivot column as the one equation
row = List.replicate k 0 ++ d :: suffix, which the kernel checks in one traversal of the row.
The lower-triangularity check requires each row to be 0 beyond the diagonal, so it skips the
prefix by drop.
Lower triangularity and nonzero diagonal of L #
Both conditions read the same suffix of each row, so one sweep certifies them together.
c rows starting at row k, each with a nonzero entry at its diagonal position and zeros
after it to the end of the row.
- nil {α : Type u_1} [Zero α] {k : ℕ} {rows : List (List α)} : IsLowerTriangularDiagList k 0 rows
- cons {α : Type u_1} [Zero α] {k c : ℕ} {row : List α} {rows : List (List α)} {d : α} (hdrop : List.drop k row = d :: List.replicate c 0) (hd : d ≠ 0) (h : IsLowerTriangularDiagList (k + 1) c rows) : IsLowerTriangularDiagList k (c + 1) (row :: rows)
Instances For
Lookup specification for IsLowerTriangularDiagList.
Pivots of U #
The rows with a nonzero entry at their pivot columns and zeros before it, then the rows beyond the pivot list (all 0).
- nil {α : Type u_1} {n : ℕ} [Zero α] {rows : List (List α)} (hz : rows = List.map (fun (x : List α) => List.replicate n 0) rows) : IsPivotedList [] rows
- cons {α : Type u_1} {n : ℕ} [Zero α] {k : Fin n} {ks : List (Fin n)} {row : List α} {rows : List (List α)} {d : α} {suffix : List α} (hrow : row = List.replicate (↑k) 0 ++ d :: suffix) (hd : d ≠ 0) (h : IsPivotedList ks rows) : IsPivotedList (k :: ks) (row :: rows)
Instances For
Lookup specification for IsPivotedList.