import Mathlib import Definitions.Def_Dieudonne_DatumAndHonda set_option autoImplicit false open LinearMap Submodule Function universe u v namespace Deformation namespace HondaSystem variable {๐“ž : Type u} [CommRing ๐“ž] {โ„“ : ๐“ž} {D : Type v} [AddCommGroup D] [Module ๐“ž D] (H : HondaSystem โ„“ D) def extPairs : Submodule ๐“ž (Module.End ๐“ž D ร— Module.End ๐“ž D) where carrier := {XY | H.F โˆ˜โ‚— XY.2 + XY.1 โˆ˜โ‚— H.V = 0 โˆง H.V โˆ˜โ‚— XY.1 + XY.2 โˆ˜โ‚— H.F = 0} zero_mem' := by simp add_mem' {a b} ha hb := by obtain โŸจhaโ‚, haโ‚‚โŸฉ := ha obtain โŸจhbโ‚, hbโ‚‚โŸฉ := hb constructor ยท rw [Prod.snd_add, Prod.fst_add, comp_add, add_comp, add_add_add_comm, haโ‚, hbโ‚, add_zero] ยท rw [Prod.snd_add, Prod.fst_add, comp_add, add_comp, add_add_add_comm, haโ‚‚, hbโ‚‚, add_zero] smul_mem' c a ha := by obtain โŸจhaโ‚, haโ‚‚โŸฉ := ha constructor ยท rw [Prod.smul_snd, Prod.smul_fst, comp_smul, smul_comp, โ† smul_add, haโ‚, smul_zero] ยท rw [Prod.smul_snd, Prod.smul_fst, comp_smul, smul_comp, โ† smul_add, haโ‚‚, smul_zero] theorem mem_extPairs_iff (XY : Module.End ๐“ž D ร— Module.End ๐“ž D) : XY โˆˆ H.extPairs โ†” H.F โˆ˜โ‚— XY.2 + XY.1 โˆ˜โ‚— H.V = 0 โˆง H.V โˆ˜โ‚— XY.1 + XY.2 โˆ˜โ‚— H.F = 0 := Iff.rfl def filteredEnd : Submodule ๐“ž (Module.End ๐“ž D) where carrier := {a | โˆ€ x โˆˆ H.L, a x โˆˆ H.L} zero_mem' := fun x _ => by simp add_mem' {a b} ha hb := fun x hx => by simpa using H.L.add_mem (ha x hx) (hb x hx) smul_mem' c a ha := fun x hx => by simpa using H.L.smul_mem c (ha x hx) theorem mem_filteredEnd_iff (a : Module.End ๐“ž D) : a โˆˆ H.filteredEnd โ†” โˆ€ x โˆˆ H.L, a x โˆˆ H.L := Iff.rfl def innerDerivation : Module.End ๐“ž D โ†’โ‚—[๐“ž] Module.End ๐“ž D ร— Module.End ๐“ž D where toFun a := (H.F โˆ˜โ‚— a - a โˆ˜โ‚— H.F, H.V โˆ˜โ‚— a - a โˆ˜โ‚— H.V) map_add' a b := by ext x <;> simp [sub_add_sub_comm] map_smul' c a := by ext x <;> simp [smul_sub] theorem innerDerivation_apply (a : Module.End ๐“ž D) : H.innerDerivation a = (H.F โˆ˜โ‚— a - a โˆ˜โ‚— H.F, H.V โˆ˜โ‚— a - a โˆ˜โ‚— H.V) := rfl def innerPairs : Submodule ๐“ž (Module.End ๐“ž D ร— Module.End ๐“ž D) := H.filteredEnd.map H.innerDerivation def endHonda : Submodule ๐“ž (Module.End ๐“ž D) := H.filteredEnd โŠ“ LinearMap.ker H.innerDerivation theorem mem_endHonda_iff (a : Module.End ๐“ž D) : a โˆˆ H.endHonda โ†” (โˆ€ x โˆˆ H.L, a x โˆˆ H.L) โˆง H.F โˆ˜โ‚— a = a โˆ˜โ‚— H.F โˆง H.V โˆ˜โ‚— a = a โˆ˜โ‚— H.V := by simp only [endHonda, Submodule.mem_inf, mem_filteredEnd_iff, LinearMap.mem_ker, innerDerivation_apply, Prod.mk_eq_zero, sub_eq_zero] theorem innerPairs_le_extPairs : H.innerPairs โ‰ค H.extPairs := by rintro _ โŸจa, -, rflโŸฉ rw [mem_extPairs_iff, innerDerivation_apply] constructor ยท ext x simp [H.toDieudonneDatum.F_V_apply] ยท ext x simp [H.toDieudonneDatum.V_F_apply] def selfExt : Type v := โ†ฅH.extPairs โงธ (H.innerPairs.comap H.extPairs.subtype) instance instAddCommGroupSelfExt : AddCommGroup H.selfExt := inferInstanceAs (AddCommGroup (โ†ฅH.extPairs โงธ (H.innerPairs.comap H.extPairs.subtype))) instance instModuleSelfExt : Module ๐“ž H.selfExt := inferInstanceAs (Module ๐“ž (โ†ฅH.extPairs โงธ (H.innerPairs.comap H.extPairs.subtype))) end HondaSystem end Deformation