diff --git a/lean/Spa/Language/Traces.lean b/lean/Spa/Language/Traces.lean index 55478fb..550c6e0 100644 --- a/lean/Spa/Language/Traces.lean +++ b/lean/Spa/Language/Traces.lean @@ -57,4 +57,43 @@ inductive EndToEndTrace (g : Graph) (ρ₁ ρ₂ : Env) : Type (idx₂ : g.Index) (idx₂_mem : idx₂ ∈ g.outputs) (trace : Trace g idx₁ idx₂ ρ₁ ρ₂) : EndToEndTrace g ρ₁ ρ₂ +inductive MyReaches {prog : Program} : {s₁ s₂ : prog.State} → {ρ₁ ρ₂ : Env} → + Trace prog.cfg s₁ s₂ ρ₁ ρ₂ → + (s : prog.State) → (ρin ρout : Env) → Type + | single_here {s₁ : prog.State} {ρ₁ ρ₂ : Env} + (hnode : EvalBasicStmtOpt ρ₁ (prog.code s₁) ρ₂) : + MyReaches (.single hnode) s₁ ρ₁ ρ₂ + | edge_here {s₁ s₂ s₃ : prog.State} {ρ₁ ρ₂ ρ₃ : Env} + (hnode : EvalBasicStmtOpt ρ₁ (prog.code s₁) ρ₂) + (hedge : (s₁, s₂) ∈ prog.cfg.edges) (rest : Trace prog.cfg s₂ s₃ ρ₂ ρ₃) : + MyReaches (.edge hnode hedge rest) s₁ ρ₁ ρ₂ + | edge_there {s₁ s₂ s₃ : prog.State} {ρ₁ ρ₂ ρ₃ : Env} + (hnode : EvalBasicStmtOpt ρ₁ (prog.code s₁) ρ₂) + (hedge : (s₁, s₂) ∈ prog.cfg.edges) (rest : Trace prog.cfg s₂ s₃ ρ₂ ρ₃) + {s : prog.State} {ρin ρout : Env} : + MyReaches rest s ρin ρout → + MyReaches (.edge hnode hedge rest) s ρin ρout + +noncomputable def MyReaches.prefix {prog : Program} {s₁ s₂ s: prog.State} + {ρ₁ ρ₂ ρin ρout : Env} {tr : Trace prog.cfg s₁ s₂ ρ₁ ρ₂} : + (r : MyReaches tr s ρin ρout) → Trace prog.cfg s₁ s ρ₁ ρout + | .single_here hnode => Spa.Trace.single hnode + | .edge_here hnode hedge hrest => Spa.Trace.single hnode + | .edge_there hnode hedge hrest tmp' => Spa.Trace.edge hnode hedge tmp'.prefix + +noncomputable def MyReaches.first {prog : Program} {s₁ s₂ s: prog.State} + {ρ₁ ρ₂ ρin ρout : Env} {tr : Trace prog.cfg s₁ s₂ ρ₁ ρ₂} : + (r : MyReaches tr s ρin ρout) → Σ ρ₁', MyReaches tr s₁ ρ₁ ρ₁' + | .single_here hnode => ⟨_, .single_here hnode⟩ + | .edge_here hnode hedge hrest => ⟨_, .edge_here hnode hedge hrest⟩ + | .edge_there hnode hedge hrest tmp' => ⟨_, .edge_here hnode hedge hrest⟩ + +noncomputable def MyReaches.step {prog : Program} {s₁ s₂ s: prog.State} + {ρ₁ ρ₂ ρin ρout : Env} {tr : Trace prog.cfg s₁ s₂ ρ₁ ρ₂} : + (r : MyReaches tr s ρin ρout) → EvalBasicStmtOpt ρin (prog.code s) ρout + | .single_here hnode => hnode + | .edge_here hnode hedge hrest => hnode + | .edge_there hnode hedge hrest tmp' => tmp'.step + + end Spa