127 lines
3.1 KiB
Text
127 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
|