Lean source & proof · 45 lines
/-- s is output 0 of the compiled circuit, the port obs-s; the input's initial wires (initial-s, initial-h) start at (0, 0) at time = 0. The input's driver wires (driver-d) are admitted, with |driver-d| ≤ 1. The trajectory decider proved it. Goal (trajectory): trajectory hedged-spread interpretation continuous-real obligation contract start time = 0 initial initial-h = 0, initial-s = 0 drivers driver-d within 1 observe obs-s as s always : s >= -1 and s <= 1 -/
theorem no_limit_breach :
have circuit := Gimle.Forseti.Examples.HedgedSpreadContract.observed
have time : Gimle.Asgard.Dynamics.TimeDomain := ⟨"time", 0⟩
∀ u : Gimle.Asgard.Dynamics.Signal (1 + 2),
Gimle.Forseti.Examples.HedgedSpread.evolution.Admitted Gimle.Forseti.Examples.HedgedSpread.drivers
(Gimle.Asgard.Dynamics.signalLeft u) →
(∀ t ≥ 0, |Gimle.Asgard.Dynamics.signalLeft u t 0| ≤ 1) →
Gimle.Asgard.Dynamics.signalRight u 0 = ![0, 0] →
(∃ y : Gimle.Asgard.Dynamics.Signal 2, circuit.Rel time u y) ∧
(∀ y y' : Gimle.Asgard.Dynamics.Signal 2, circuit.Rel time u y → circuit.Rel time u y' →
∀ t ≥ 0, y t = y' t) ∧
(∀ y : Gimle.Asgard.Dynamics.Signal 2, circuit.Rel time u y →
∀ t ≥ 0, have s := y t 0; s ≥ -1 ∧ s ≤ 1) := by
have root : forsetiRoot := by
unfold forsetiRoot forsetiIdentities forsetiContract forsetiDrivers
refine ⟨⟨by decide, by decide, by decide, by decide +kernel, by decide +kernel⟩, ?_⟩
have time : forsetiTime = Gimle.Forseti.Examples.HedgedSpread.evolution.time := by simp [forsetiTime, Gimle.Asgard.Model.Evolution.time, Gimle.Forseti.Examples.HedgedSpread.evolution] <;> norm_num [Rat.mkRat_eq_div]
have init : forsetiInitial = Gimle.Forseti.Examples.HedgedSpread.compiled.initial := by rw [Gimle.Forseti.Examples.HedgedSpread.initial_eq]; funext i; fin_cases i <;> norm_num [forsetiInitial, Rat.mkRat_eq_div]
have obs : forsetiObservation = Gimle.Forseti.Examples.HedgedSpread.sIndex := rfl
have drv : forsetiDriver0 = Gimle.Forseti.Examples.HedgedSpread.dIndex := rfl
rw [time, init, obs, drv]
refine Gimle.Forseti.Trajectory.Contract.consequence Gimle.Forseti.Examples.HedgedSpreadContract.exposure_contract (fun _ admitted => ⟨⟨admitted.1.1, fun t within => (admitted.1.2 t within).trans (by norm_num [Rat.mkRat_eq_div])⟩, admitted.2⟩) ?_
intro o band t within
have leaf := Gimle.Forseti.Syntax.EntailmentCertificate.sound forsetiLeaf ⟨[⟨⟨[]⟩, [⟨[((mkRat (1) 1), (.constant (mkRat (1) 1)))]⟩, ⟨[]⟩]⟩, ⟨⟨[]⟩, [⟨[]⟩, ⟨[((mkRat (1) 1), (.constant (mkRat (1) 1)))]⟩]⟩]⟩ (by decide +kernel)
apply leaf
simp only [forsetiLeaf, Gimle.Forseti.Syntax.Formula.holds, Gimle.Forseti.Syntax.Relation.holds, Gimle.Asgard.Polynomial.Expr.eval]
obtain ⟨low, high⟩ := band t within
refine ⟨?_, ?_⟩ <;> norm_num [Rat.mkRat_eq_div] <;> linarith
have forsetiCast0 : (((mkRat (1) 1) : ℚ) : ℝ) = 1 := by norm_num [Rat.mkRat_eq_div]
have forsetiCast1 : (((mkRat (0) 1) : ℚ) : ℝ) = 0 := by norm_num [Rat.mkRat_eq_div]
refine (fun (bridge : _ ↔ forsetiContract) => bridge.mpr (show forsetiIdentities ∧ forsetiContract from root).2) ?_
constructor
· intro claim
unfold forsetiContract
set_option linter.unusedSimpArgs false in simp only [Gimle.Forseti.Trajectory.Realizable, Gimle.Forseti.Trajectory.Unique, Gimle.Forseti.Trajectory.Holds, Gimle.Forseti.Trajectory.Initialized, Gimle.Forseti.Trajectory.Always, Set.EqOn, Gimle.Asgard.Dynamics.TimeDomain.domain, Set.mem_Ici, forsetiTime, forsetiInitial, forsetiPost, forsetiObservation, forsetiDrivers, Gimle.Forseti.Syntax.Formula.holds, Gimle.Forseti.Syntax.Relation.holds, Gimle.Asgard.Polynomial.Expr.eval, true_and, forsetiCast0, forsetiCast1, ← sub_eq_add_neg, sub_zero, sub_nonpos, sub_neg, sub_eq_zero, sub_nonneg, sub_pos, ge_iff_le, gt_iff_lt, and_assoc, or_assoc] at claim
refine ⟨?_, ?_, ?_⟩ <;> set_option linter.unusedSimpArgs false in simp only [Gimle.Forseti.Trajectory.Realizable, Gimle.Forseti.Trajectory.Unique, Gimle.Forseti.Trajectory.Holds, Gimle.Forseti.Trajectory.Initialized, Gimle.Forseti.Trajectory.Always, Set.EqOn, Gimle.Asgard.Dynamics.TimeDomain.domain, Set.mem_Ici, forsetiTime, forsetiInitial, forsetiPost, forsetiObservation, forsetiDrivers, Gimle.Forseti.Syntax.Formula.holds, Gimle.Forseti.Syntax.Relation.holds, Gimle.Asgard.Polynomial.Expr.eval, true_and, forsetiCast0, forsetiCast1, ← sub_eq_add_neg, sub_zero, sub_nonpos, sub_neg, sub_eq_zero, sub_nonneg, sub_pos, ge_iff_le, gt_iff_lt, and_assoc, or_assoc]
· exact fun u ⟨admit, band, start⟩ => (claim u admit band start).1
· exact fun u ⟨admit, band, start⟩ => (claim u admit band start).2.1
· exact fun u ⟨admit, band, start⟩ => (claim u admit band start).2.2
· intro lane
unfold forsetiContract at lane
obtain ⟨realizable, unique, holds⟩ := lane
set_option linter.unusedSimpArgs false in simp only [Gimle.Forseti.Trajectory.Realizable, Gimle.Forseti.Trajectory.Unique, Gimle.Forseti.Trajectory.Holds, Gimle.Forseti.Trajectory.Initialized, Gimle.Forseti.Trajectory.Always, Set.EqOn, Gimle.Asgard.Dynamics.TimeDomain.domain, Set.mem_Ici, forsetiTime, forsetiInitial, forsetiPost, forsetiObservation, forsetiDrivers, Gimle.Forseti.Syntax.Formula.holds, Gimle.Forseti.Syntax.Relation.holds, Gimle.Asgard.Polynomial.Expr.eval, true_and, forsetiCast0, forsetiCast1, ← sub_eq_add_neg, sub_zero, sub_nonpos, sub_neg, sub_eq_zero, sub_nonneg, sub_pos, ge_iff_le, gt_iff_lt, and_assoc, or_assoc] at realizable unique holds ⊢
exact fun u admit band start => ⟨realizable u ⟨admit, band, start⟩, unique u ⟨admit, band, start⟩, holds u ⟨admit, band, start⟩⟩