Lean source & proof · 42 lines
/-- E is output 5 of the compiled circuit, the port obs-e; the input's initial wires (initial-a10, initial-a01, initial-a11, initial-a21, initial-a12) start at (1, 1, 1, 1, 1) at time = 0. The trajectory decider proved it. Goal (trajectory): trajectory ns-k5 interpretation continuous-real obligation contract start time = 0 initial initial-a01 = 1, initial-a10 = 1, initial-a11 = 1, initial-a12 = 1, initial-a21 = 1 observe obs-e as E always : E >= 0 and E <= 13 -/
theorem in_ball :
have circuit := Gimle.Forseti.Examples.GalerkinNS.K5.observed
have time : Gimle.Asgard.Dynamics.TimeDomain := ⟨"time", 0⟩
∀ u : Gimle.Asgard.Dynamics.Signal (0 + 5),
Gimle.Asgard.Dynamics.signalRight u 0 = ![1, 1, 1, 1, 1] →
(∃ y : Gimle.Asgard.Dynamics.Signal 8, circuit.Rel time u y) ∧
(∀ y y' : Gimle.Asgard.Dynamics.Signal 8, circuit.Rel time u y → circuit.Rel time u y' →
∀ t ≥ 0, y t = y' t) ∧
(∀ y : Gimle.Asgard.Dynamics.Signal 8, circuit.Rel time u y →
∀ t ≥ 0, have E := y t 5; E ≥ 0 ∧ E ≤ 13) := by
have root : forsetiRoot := by
unfold forsetiRoot forsetiIdentities forsetiContract
refine ⟨⟨by decide, by decide, by decide⟩, ?_⟩
have time : forsetiTime = Gimle.Forseti.Examples.GalerkinNS.K5.evolution.time := by simp [forsetiTime, Gimle.Asgard.Model.Evolution.time, Gimle.Forseti.Examples.GalerkinNS.K5.evolution] <;> norm_num [Rat.mkRat_eq_div]
have init : forsetiInitial = Gimle.Forseti.Examples.GalerkinNS.K5.compiled.initial := by rw [Gimle.Forseti.Examples.GalerkinNS.K5.initial_eq]; funext i; fin_cases i <;> norm_num [forsetiInitial, Rat.mkRat_eq_div]
have obs : forsetiObservation = Gimle.Forseti.Examples.GalerkinNS.K5.energyIndex := rfl
rw [time, init, obs]
refine Gimle.Forseti.Trajectory.Contract.consequence Gimle.Forseti.Examples.GalerkinNS.K5.below6_contract (fun _ admitted => admitted) ?_
intro o band t within
have leaf := Gimle.Forseti.Syntax.EntailmentCertificate.sound forsetiLeaf ⟨[⟨⟨[]⟩, [⟨[((mkRat (1) 1), (.constant (mkRat (1) 1)))]⟩, ⟨[]⟩]⟩, ⟨⟨[((mkRat (7) 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 (13) 1) : ℚ) : ℝ) = 13 := by norm_num [Rat.mkRat_eq_div]
have forsetiCast1 : (((mkRat (0) 1) : ℚ) : ℝ) = 0 := by norm_num [Rat.mkRat_eq_div]
have forsetiCast2 : (((mkRat (1) 1) : ℚ) : ℝ) = 1 := 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, Gimle.Forseti.Syntax.Formula.holds, Gimle.Forseti.Syntax.Relation.holds, Gimle.Asgard.Polynomial.Expr.eval, true_and, forsetiCast0, forsetiCast1, forsetiCast2, ← 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, Gimle.Forseti.Syntax.Formula.holds, Gimle.Forseti.Syntax.Relation.holds, Gimle.Asgard.Polynomial.Expr.eval, true_and, forsetiCast0, forsetiCast1, forsetiCast2, ← 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 start => (claim u start).1
· exact fun u start => (claim u start).2.1
· exact fun u start => (claim u 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, Gimle.Forseti.Syntax.Formula.holds, Gimle.Forseti.Syntax.Relation.holds, Gimle.Asgard.Polynomial.Expr.eval, true_and, forsetiCast0, forsetiCast1, forsetiCast2, ← 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 start => ⟨realizable u start, unique u start, holds u start⟩