Samplinglib
Lean gate not recorded for this source state main · 0e31a3cda412
production module

AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain

7 named declarations scanned from AutoSamplingTheory/TechnicalLemmas/Analysis/PairingClosedChain.lean.

Imports
Imported by
Placeholder scan
0 declaration(s) flagged
Gate status
Partial

Declarations

def AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain.chainValue Partial Not mapped

- Affine value of a finite chain at a terminal source point `z`. For `[p₀,...,pₖ]`, this is `Σ_{j<k} <p_j.2, p_{j+1}.1-p_j.1> + <p_k.2, z-p_k.1>`.

def chainValue : List (E × E) → E → ℝ
  | [], _ => 0
  | [p], z => inner ℝ p.2 (z - p.1)
  | p :: q :: rest, z =>
      inner ℝ p.2 (q.1 - p.1) + chainValue (q :: rest) z

/-- The rooted list condition consumed by the Rockafellar potential: closing a
nonempty chain back at the source coordinate of its head has nonpositive value. -/
def AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain.PairingClosedChainMonotone Partial Not mapped

- The rooted list condition consumed by the Rockafellar potential: closing a nonempty chain back at the source coordinate of its head has nonpositive value.

def PairingClosedChainMonotone (Gamma : Set (E × E)) : Prop :=
  ∀ ⦃l : List (E × E)⦄ ⦃base : E × E⦄,
    l ≠ [] → l.head? = some base →
      List.Forall (fun p => p ∈ Gamma) l →
      chainValue l base.1 ≤ 0

@[simp]
theorem AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain.chainValue_singleton Partial Not mapped

No declaration docstring.

theorem chainValue_singleton (p : E × E) (z : E) :
    chainValue [p] z = inner ℝ p.2 (z - p.1) :=
  rfl

/-- Concatenating a nonempty second chain at `q` splits the value at the join. -/
theorem AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain.chainValue_append_cons Partial Not mapped

- Concatenating a nonempty second chain at `q` splits the value at the join.

theorem chainValue_append_cons :
    ∀ (l₁ : List (E × E)) (q : E × E) (l₂ : List (E × E)) (z : E),
      chainValue (l₁ ++ q :: l₂) z =
        chainValue l₁ q.1 + chainValue (q :: l₂) z
  | [], q, l₂, z => by simp [chainValue]
  | [p], q, l₂, z => by simp [chainValue]
  | p :: r :: l₁, q, l₂, z => by
      rw [show (p :: r :: l₁) ++ q :: l₂ = p :: ((r :: l₁) ++ q :: l₂) by rfl]
      simp only [chainValue]
      rw [chainValue_append_cons (r :: l₁) q l₂ z]
      rw [chainValue_append_cons [p] q [] q.1]
      simp [chainValue, add_assoc]

/-- Membership of an element in a list gives a prefix/suffix decomposition. -/
theorem AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain.exists_split_of_mem Partial Not mapped

- Membership of an element in a list gives a prefix/suffix decomposition.

theorem exists_split_of_mem {α : Type*} {a : α} :
    ∀ {l : List α}, a ∈ l → ∃ s t : List α, l = s ++ a :: t
  | [], h => by simp at h
  | b :: l, h => by
      rw [List.mem_cons] at h
      rcases h with h | h
      · subst b
        exact ⟨[], l, rfl⟩
      · rcases exists_split_of_mem h with ⟨s, t, rfl⟩
        exact ⟨b :: s, t, by simp⟩

/-- A duplicated element gives two explicit occurrences with an intermediate loop. -/
theorem AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain.exists_duplicate_split Partial Not mapped

- A duplicated element gives two explicit occurrences with an intermediate loop.

theorem exists_duplicate_split {α : Type*} {a : α} :
    ∀ {l : List α}, List.Duplicate a l →
      ∃ s t u : List α, l = s ++ a :: t ++ a :: u
  | _, List.Duplicate.cons_mem h => by
      rcases exists_split_of_mem h with ⟨t, u, rfl⟩
      exact ⟨[], t, u, by simp⟩
  | _, @List.Duplicate.cons_duplicate _ a b l h => by
      rcases exists_duplicate_split h with ⟨s, t, u, rfl⟩
      exact ⟨b :: s, t, u, by simp [List.append_assoc]⟩

/-- Removing the segment between two identical pair points decomposes the
original affine chain value into the shortened outer chain plus the closed
inner loop. -/
theorem AutoSamplingTheory.TechnicalLemmas.Analysis.PairingClosedChain.chainValue_duplicate_split Partial Not mapped

- Removing the segment between two identical pair points decomposes the original affine chain value into the shortened outer chain plus the closed inner loop.

theorem chainValue_duplicate_split
    (s t u : List (E × E)) (a : E × E) (z : E) :
    chainValue (s ++ a :: t ++ a :: u) z =
      chainValue (s ++ a :: u) z + chainValue (a :: t) a.1 := by
  rw [show s ++ a :: t ++ a :: u = s ++ a :: (t ++ a :: u) by
    simp [List.append_assoc]]
  rw [chainValue_append_cons s a (t ++ a :: u) z]
  change chainValue s a.1 + chainValue ((a :: t) ++ a :: u) z =
    chainValue (s ++ a :: u) z + chainValue (a :: t) a.1
  rw [chainValue_append_cons (a :: t) a u z]
  rw [chainValue_append_cons s a u z]
  ring

end

end PairingClosedChain
end Analysis
end TechnicalLemmas
end AutoSamplingTheory