長めの例: 標準基底が K × K を張る¶
次に,e₁ = (1, 0) と e₂ = (0, 1) が K × K 全体を張ることを示します.
ここでは Basis を作るのではなく,まず Submodule.span だけを使います.
証明の中心は,任意の p : K × K について
を示すことです.
def planeE1 : K × K :=
(1, 0)
def planeE2 : K × K :=
(0, 1)
example : Submodule.span K ({planeE1, planeE2} : Set (K × K)) = ⊤ := by
ext p
constructor
· intro _
trivial
· intro _
have hp : p = p.1 • planeE1 + p.2 • planeE2 := by
ext <;> simp [planeE1, planeE2]
rw [hp]
apply Submodule.add_mem
· exact Submodule.smul_mem _ _ (Submodule.subset_span (by simp [planeE1]))
· exact Submodule.smul_mem _ _ (Submodule.subset_span (by simp [planeE2]))
end CoordinateLinearMaps
この例では ext p で部分空間の等式を元ごとの同値に変換しています.
その後,⊤ への所属は自明なので,全ての p が左辺の span に入ることを示せば十分です.
このような proof は,線形代数の形式化で頻繁に使う基本パターンです.
- span に生成元が入る:
Submodule.subset_span - span がスカラー倍で閉じる:
Submodule.smul_mem - span が和で閉じる:
Submodule.add_mem - 座標計算:
extとsimp
演習問題¶
-
K × K上の線形写像(x, y) ↦ x - yをLinearMapとして作ってください. -
sumPairLinearの kernel がx + y = 0であることを,rflではなくsimpで証明してください. -
planeE1とplaneE2が一次独立であることを示してください. これは少し難しい問題です.まず#check LinearIndependentで statement の形を確認してください.example {K : Type*} [Field K] : LinearIndependent K (fun i : Fin 2 => if i = 0 then (planeE1 : K × K) else planeE2) := by -- 方針: `linearIndependent_iff` 系の補題を探す. -- 解答例: -- rw [linearIndependent_iff] -- intro s hzero -- ext i -- fin_cases i -- · have h1 := congrArg Prod.fst hzero -- simp [Finsupp.linearCombination, planeE1, planeE2, Finsupp.sum_fintype] at h1 -- simpa using h1 -- · have h2 := congrArg Prod.snd hzero -- simp [Finsupp.linearCombination, planeE1, planeE2, Finsupp.sum_fintype] at h2 -- simpa using h2 sorry -
K × Kの任意の点をplaneE1とplaneE2の線形結合として書いてください.