126 lines
3.1 KiB
Text
126 lines
3.1 KiB
Text
/-
|
||
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Joseph Tooby-Smith
|
||
-/
|
||
import HepLean.SpaceTime.LorentzTensor.IndexNotation.GetDual
|
||
import Mathlib.Algebra.Order.Ring.Nat
|
||
import Mathlib.Data.Finset.Sort
|
||
/-!
|
||
|
||
# With dual
|
||
|
||
We define the finite sets of indices in an index list which have a dual
|
||
|
||
-/
|
||
|
||
|
||
namespace IndexNotation
|
||
|
||
|
||
namespace IndexList
|
||
|
||
variable {X : Type} [IndexNotation X] [Fintype X] [DecidableEq X]
|
||
variable (l l2 l3 : IndexList X)
|
||
|
||
/-!
|
||
|
||
## Finsets on which getDual? and getDualInOther? are some.
|
||
|
||
-/
|
||
|
||
/-- The finite set of indices of an index list which have a dual in that index list. -/
|
||
def withDual : Finset (Fin l.length) :=
|
||
Finset.filter (fun i => (l.getDual? i).isSome) Finset.univ
|
||
|
||
/-- The finite set of indices of an index list which have a dual in another provided index list. -/
|
||
def withDualInOther : Finset (Fin l.length) :=
|
||
Finset.filter (fun i => (l.getDualInOther? l2 i).isSome) Finset.univ
|
||
|
||
/-!
|
||
|
||
## Basic properties of withDual
|
||
|
||
-/
|
||
|
||
@[simp]
|
||
lemma withDual_isSome (i : l.withDual) : (l.getDual? i).isSome := by
|
||
simpa [withDual] using i.2
|
||
|
||
@[simp]
|
||
lemma mem_withDual_iff_isSome (i : Fin l.length) : i ∈ l.withDual ↔ (l.getDual? i).isSome := by
|
||
simp [withDual]
|
||
|
||
lemma not_mem_withDual_iff_isNone (i : Fin l.length) :
|
||
i ∉ l.withDual ↔ (l.getDual? i).isNone := by
|
||
simp only [mem_withDual_iff_isSome, Bool.not_eq_true, Option.not_isSome,
|
||
Option.isNone_iff_eq_none]
|
||
|
||
lemma mem_withDual_iff_exists : i ∈ l.withDual ↔ ∃ j, l.AreDualInSelf i j := by
|
||
simp [withDual, Finset.mem_filter, Finset.mem_univ, getDual?]
|
||
exact Fin.isSome_find_iff
|
||
|
||
/-!
|
||
|
||
## Basic properties of withDualInOther
|
||
|
||
-/
|
||
|
||
|
||
@[simp]
|
||
lemma mem_withInDualOther_iff_isSome (i : Fin l.length) :
|
||
i ∈ l.withDualInOther l2 ↔ (l.getDualInOther? l2 i).isSome := by
|
||
simp only [withDualInOther, getDualInOther?, Finset.mem_filter, Finset.mem_univ, true_and]
|
||
|
||
lemma mem_withInDualOther_iff_exists :
|
||
i ∈ l.withDualInOther l2 ↔ ∃ (j : Fin l2.length), l.AreDualInOther l2 i j := by
|
||
simp [withDualInOther, Finset.mem_filter, Finset.mem_univ, getDualInOther?]
|
||
exact Fin.isSome_find_iff
|
||
|
||
/-!
|
||
|
||
## Append properties of withDual
|
||
|
||
-/
|
||
|
||
lemma withDual_append_eq_disjSum : (l ++ l2).withDual =
|
||
Equiv.finsetCongr appendEquiv
|
||
((l.withDual ∪ l.withDualInOther l2).disjSum
|
||
(l2.withDual ∪ l2.withDualInOther l)) := by
|
||
ext i
|
||
obtain ⟨k, hk⟩ := appendEquiv.surjective i
|
||
subst hk
|
||
match k with
|
||
| Sum.inl k =>
|
||
simp
|
||
| Sum.inr k =>
|
||
simp
|
||
|
||
/-!
|
||
|
||
## Append properties of withDualInOther
|
||
|
||
-/
|
||
|
||
lemma append_withDualInOther_eq :
|
||
(l ++ l2).withDualInOther l3 =
|
||
Equiv.finsetCongr appendEquiv ((l.withDualInOther l3).disjSum (l2.withDualInOther l3)) := by
|
||
rw [Finset.ext_iff]
|
||
intro i
|
||
obtain ⟨k, hk⟩ := appendEquiv.surjective i
|
||
subst hk
|
||
match k with
|
||
| Sum.inl k =>
|
||
simp
|
||
| Sum.inr k =>
|
||
simp
|
||
|
||
|
||
lemma withDualInOther_append_eq : l.withDualInOther (l2 ++ l3) =
|
||
l.withDualInOther l2 ∪ l.withDualInOther l3 := by
|
||
ext i
|
||
simp
|
||
|
||
end IndexList
|
||
|
||
end IndexNotation
|