Migrate most of the codebase (sans Reaching.lean / LICM left) to projections
This commit is contained in:
@@ -17,12 +17,12 @@ class ExprEvaluator where
|
||||
class ValidExprEvaluator [ExprEvaluator L prog] [I : LatticeInterpretation L] :
|
||||
Prop where
|
||||
valid : ∀ {vs : VariableValues L prog} {ρ : Env} {e : Expr} {v : Value},
|
||||
EvalExpr ρ e v → ⟦ vs ⟧ ρ () → I.interp (ExprEvaluator.eval e vs) v
|
||||
EvalExpr ρ e v → ⟦ vs ⟧ ρ → I.interp (ExprEvaluator.eval e vs) v
|
||||
|
||||
class ValidStmtEvaluator [E : StmtEvaluator L prog] [LatticeInterpretation L] :
|
||||
Prop where
|
||||
valid : ∀ {s : prog.State} {vs : VariableValues L prog} {ρ₁ ρ₂ : Env},
|
||||
EvalBasicStmtOpt ρ₁ (prog.code s) ρ₂ → ⟦ vs ⟧ ρ₁ () → ⟦ E.eval s vs ⟧ ρ₂ ()
|
||||
EvalBasicStmtOpt ρ₁ (prog.code s) ρ₂ → ⟦ vs ⟧ ρ₁ → ⟦ E.eval s vs ⟧ ρ₂
|
||||
|
||||
end Forward
|
||||
|
||||
|
||||
@@ -65,22 +65,28 @@ lemma variablesAt_joinAll (s : prog.State) (sv : StateVariables L prog) :
|
||||
joinAll_mem_eq (variablesAt_mem s (joinAll sv))
|
||||
|
||||
class StateInterpretation (L : Type) [Lattice L] (prog : Program) where
|
||||
St : Env → Type
|
||||
init : St []
|
||||
interp : VariableValues L prog → (ρ : Env) → St ρ → Prop
|
||||
interp_sup : ∀ {vs₁ vs₂ : VariableValues L prog} {ρ : Env} {st : St ρ},
|
||||
interp vs₁ ρ st ∨ interp vs₂ ρ st → interp (vs₁ ⊔ vs₂) ρ st
|
||||
interp_inf : ∀ {vs₁ vs₂ : VariableValues L prog} {ρ : Env} {st : St ρ},
|
||||
interp vs₁ ρ st ∧ interp vs₂ ρ st → interp (vs₁ ⊓ vs₂) ρ st
|
||||
Proj : Type
|
||||
Pre : ∀ {s₁ s₂ : prog.State} {ρ₁ ρ₂ : Env}, Traceₗ prog.cfg s₁ s₂ ρ₁ ρ₂ → Proj
|
||||
Post : ∀ {s₁ s₂ : prog.State} {ρ₁ ρ₂ : Env}, Trace prog.cfg s₁ s₂ ρ₁ ρ₂ → Proj
|
||||
|
||||
interp : VariableValues L prog → (p : Proj) → Prop
|
||||
interp_sup : ∀ {vs₁ vs₂ : VariableValues L prog} {p : Proj},
|
||||
interp vs₁ p ∨ interp vs₂ p → interp (vs₁ ⊔ vs₂) p
|
||||
interp_inf : ∀ {vs₁ vs₂ : VariableValues L prog} {p : Proj},
|
||||
interp vs₁ p ∧ interp vs₂ p → interp (vs₁ ⊓ vs₂) p
|
||||
|
||||
post_pre : ∀ {vs} {s₁ s₂ s₃: prog.State} {ρ₁ ρ₂ : Env}
|
||||
(tr : Trace prog.cfg s₁ s₂ ρ₁ ρ₂) (hedge : (s₂, s₃) ∈ prog.cfg.edges),
|
||||
interp vs (Post tr) → interp vs (Pre (tr.addEdge hedge))
|
||||
|
||||
instance [S : StateInterpretation L prog] :
|
||||
Interp (VariableValues L prog) ((ρ : Env) → S.St ρ → Prop) :=
|
||||
Interp (VariableValues L prog) (S.Proj → Prop) :=
|
||||
⟨S.interp⟩
|
||||
|
||||
lemma interp_foldr [S : StateInterpretation L prog]
|
||||
{vs : VariableValues L prog} {vss : List (VariableValues L prog)}
|
||||
{ρ : Env} {st : S.St ρ} (hvs : ⟦ vs ⟧ ρ st) (hmem : vs ∈ vss) :
|
||||
⟦ vss.foldr (· ⊔ ·) (botV L prog) ⟧ ρ st := by
|
||||
{p : S.Proj} (hvs : ⟦ vs ⟧ p) (hmem : vs ∈ vss) :
|
||||
⟦ vss.foldr (· ⊔ ·) (botV L prog) ⟧ p := by
|
||||
induction vss with
|
||||
| nil => cases hmem
|
||||
| cons vs' vss' ih =>
|
||||
@@ -91,20 +97,24 @@ lemma interp_foldr [S : StateInterpretation L prog]
|
||||
variable [I : LatticeInterpretation L]
|
||||
|
||||
instance : StateInterpretation L prog where
|
||||
St := fun _ => PUnit
|
||||
init := PUnit.unit
|
||||
interp vs ρ _ := ∀ (k : String) (l : L), (k, l) ∈ vs →
|
||||
Proj := Env
|
||||
Pre := fun {_ _ _ ρ₂} _ => ρ₂
|
||||
Post := fun {_ _ _ ρ₂} _ => ρ₂
|
||||
|
||||
interp vs ρ := ∀ (k : String) (l : L), (k, l) ∈ vs →
|
||||
∀ (v : Value), Env.Mem (k, v) ρ → I.interp l v
|
||||
interp_sup := by
|
||||
intro vs₁ vs₂ ρ st h k l hmem v hv
|
||||
intro vs₁ vs₂ ρ h k l hmem v hv
|
||||
obtain ⟨l₁, l₂, rfl, h₁, h₂⟩ := FiniteMap.mem_sup hmem
|
||||
rcases h with h | h
|
||||
· exact I.interp_sup v (Or.inl (h _ _ h₁ _ hv))
|
||||
· exact I.interp_sup v (Or.inr (h _ _ h₂ _ hv))
|
||||
interp_inf := by
|
||||
intro vs₁ vs₂ ρ st h k l hmem v hv
|
||||
intro vs₁ vs₂ ρ h k l hmem v hv
|
||||
obtain ⟨l₁, l₂, rfl, h₁, h₂⟩ := FiniteMap.mem_inf hmem
|
||||
exact I.interp_inf v ⟨h.1 _ _ h₁ _ hv, h.2 _ _ h₂ _ hv⟩
|
||||
post_pre := by simp
|
||||
|
||||
|
||||
end Forward
|
||||
|
||||
|
||||
Reference in New Issue
Block a user