Add non-state parameterized 'Reaches' relation
This commit is contained in:
@@ -57,4 +57,43 @@ inductive EndToEndTrace (g : Graph) (ρ₁ ρ₂ : Env) : Type
|
|||||||
(idx₂ : g.Index) (idx₂_mem : idx₂ ∈ g.outputs)
|
(idx₂ : g.Index) (idx₂_mem : idx₂ ∈ g.outputs)
|
||||||
(trace : Trace g idx₁ idx₂ ρ₁ ρ₂) : EndToEndTrace g ρ₁ ρ₂
|
(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
|
end Spa
|
||||||
|
|||||||
Reference in New Issue
Block a user