Pith. sign in

IndisputableMonolith.Verification.UnitsFromAnchorsRescaleCert

IndisputableMonolith/Verification/UnitsFromAnchorsRescaleCert.lean · 97 lines · 4 declarations

show as:
view math explainer →

open module explainer GitHub source

Explainer status: pending

   1import Mathlib
   2import IndisputableMonolith.RecogSpec.Spec
   3
   4/-!
   5# Units-from-Anchors Rescaling Certificate
   6
   7This audit certificate records that rescaling anchors by a positive factor `s`
   8corresponds to a `Verification.UnitsRescaled` relation between the resulting
   9`RSUnits` packs (with `c` fixed).
  10
  11This makes the “units are only defined up to scale” invariance explicit in the
  12certified surface.
  13-/
  14
  15namespace IndisputableMonolith
  16namespace Verification
  17namespace UnitsFromAnchorsRescale
  18
  19open IndisputableMonolith.RecogSpec
  20
  21/-- Rescale anchors by a factor `s` (scaling both a1 and a2).
  22
  23The consistency field is preserved because `a1 = 0 → a2 = 0` implies
  24`s*a1 = 0 → s*a2 = 0`. -/
  25def rescaleAnchors (s : ℝ) (A : RecogSpec.Anchors) : RecogSpec.Anchors :=
  26{ a1 := s * A.a1
  27  a2 := s * A.a2
  28  consistent := by
  29    intro h
  30    by_cases hs : s = 0
  31    · simp [hs]
  32    · have ha1 : A.a1 = 0 := by
  33        -- from s*a1=0 and s≠0
  34        have : s = 0 ∨ A.a1 = 0 := mul_eq_zero.mp h
  35        cases this with
  36        | inl hs0 => exact (hs hs0).elim
  37        | inr ha1 => exact ha1
  38      have ha2 : A.a2 = 0 := A.consistent ha1
  39      simp [ha2] }
  40
  41private lemma speedFromAnchors_rescale (A : RecogSpec.Anchors) (s : ℝ) (hs : 0 < s) :
  42    RecogSpec.speedFromAnchors (rescaleAnchors s A) = RecogSpec.speedFromAnchors A := by
  43  have hs0 : s ≠ 0 := ne_of_gt hs
  44  by_cases hA : A.a1 = 0
  45  · -- degenerate anchors: both speeds are 0
  46    have hA' : (rescaleAnchors s A).a1 = 0 := by simp [rescaleAnchors, hA]
  47    simp [RecogSpec.speedFromAnchors, hA, hA', rescaleAnchors]
  48  · have hA' : (rescaleAnchors s A).a1 ≠ 0 := by
  49      -- s*a1 ≠ 0
  50      simp [rescaleAnchors, hs0, hA]
  51    -- compute both speeds on the nondegenerate branch and cancel `s`
  52    have hsA : RecogSpec.speedFromAnchors (rescaleAnchors s A) =
  53        (rescaleAnchors s A).a2 / (rescaleAnchors s A).a1 :=
  54      RecogSpec.speedFromAnchors_of_ne_zero (A := rescaleAnchors s A) hA'
  55    have hA0 : RecogSpec.speedFromAnchors A = A.a2 / A.a1 :=
  56      RecogSpec.speedFromAnchors_of_ne_zero (A := A) hA
  57    -- simplify the ratio
  58    have hcancel : (s * A.a2) / (s * A.a1) = A.a2 / A.a1 := by
  59      field_simp [hs0, hA]
  60    -- finish
  61    calc
  62      RecogSpec.speedFromAnchors (rescaleAnchors s A)
  63          = (rescaleAnchors s A).a2 / (rescaleAnchors s A).a1 := hsA
  64      _ = (s * A.a2) / (s * A.a1) := by simp [rescaleAnchors]
  65      _ = A.a2 / A.a1 := hcancel
  66      _ = RecogSpec.speedFromAnchors A := hA0.symm
  67
  68private def unitsFromAnchors_unitsRescaled (A : RecogSpec.Anchors) (s : ℝ) (hs : 0 < s) :
  69    Verification.UnitsRescaled (RecogSpec.unitsFromAnchors A) (RecogSpec.unitsFromAnchors (rescaleAnchors s A)) := by
  70  refine
  71    { s := s
  72      hs := hs
  73      tau0 := by simp [RecogSpec.unitsFromAnchors, rescaleAnchors]
  74      ell0 := by simp [RecogSpec.unitsFromAnchors, rescaleAnchors]
  75      cfix := by
  76        -- c = speedFromAnchors is invariant under rescaling
  77        simp [RecogSpec.unitsFromAnchors, speedFromAnchors_rescale (A := A) (s := s) hs] }
  78
  79structure UnitsFromAnchorsRescaleCert where
  80  deriving Repr
  81
  82@[simp] def UnitsFromAnchorsRescaleCert.verified (_c : UnitsFromAnchorsRescaleCert) : Prop :=
  83  ∀ (A : RecogSpec.Anchors) (s : ℝ), 0 < s →
  84    Nonempty
  85      (Verification.UnitsRescaled
  86        (RecogSpec.unitsFromAnchors A)
  87        (RecogSpec.unitsFromAnchors (rescaleAnchors s A)))
  88
  89@[simp] theorem UnitsFromAnchorsRescaleCert.verified_any (c : UnitsFromAnchorsRescaleCert) :
  90    UnitsFromAnchorsRescaleCert.verified c := by
  91  intro A s hs
  92  exact ⟨unitsFromAnchors_unitsRescaled (A := A) (s := s) hs⟩
  93
  94end UnitsFromAnchorsRescale
  95end Verification
  96end IndisputableMonolith
  97

source mirrored from github.com/jonwashburn/shape-of-logic