Remove 'prog.code s = some bs' argument to eval
This commit is contained in:
@@ -14,44 +14,50 @@ lemma updateVariablesFromExpression_mono (k : String) (e : Expr) :
|
||||
Monotone (updateVariablesFromExpression (L := L) (prog := prog) k e) :=
|
||||
FiniteMap.generalizedUpdate_monotone monotone_id (fun _ => E.eval_mono e)
|
||||
|
||||
def evalBasicStmt (s : prog.State) (bs : BasicStmt) (_h : prog.code s = some bs)
|
||||
def evalBasicStmt (bs : BasicStmt)
|
||||
(vs : VariableValues L prog) : VariableValues L prog :=
|
||||
match bs with
|
||||
| .assign k e => updateVariablesFromExpression k e vs
|
||||
| .noop => vs
|
||||
|
||||
lemma evalBasicStmt_mono (s : prog.State) (bs : BasicStmt) (h : prog.code s = some bs) :
|
||||
Monotone (evalBasicStmt (L := L) (prog := prog) s bs h) := by
|
||||
lemma evalBasicStmt_mono (bs : BasicStmt) :
|
||||
Monotone (evalBasicStmt (L := L) (prog := prog) bs) := by
|
||||
cases bs with
|
||||
| assign k e => exact updateVariablesFromExpression_mono k e
|
||||
| noop => exact monotone_id
|
||||
|
||||
def evalBasicStmtOpt (obs : Option BasicStmt)
|
||||
(vs : VariableValues L prog) : VariableValues L prog :=
|
||||
match obs with
|
||||
| none => vs
|
||||
| some bs => evalBasicStmt bs vs
|
||||
|
||||
lemma evalBasicStmtOpt_mono (obs : Option BasicStmt) :
|
||||
Monotone (evalBasicStmtOpt (L := L) (prog := prog) obs) := by
|
||||
cases obs <;> unfold evalBasicStmtOpt
|
||||
· exact monotone_id
|
||||
· apply evalBasicStmt_mono
|
||||
|
||||
instance ExprEvaluator.toStmtEvaluator : StmtEvaluator L prog :=
|
||||
⟨evalBasicStmt, evalBasicStmt_mono⟩
|
||||
⟨evalBasicStmtOpt ∘ prog.code,
|
||||
by intro s; simp; exact (evalBasicStmtOpt_mono (prog.code s))⟩
|
||||
|
||||
instance ExprEvaluator.toStmtEvaluator_valid [LatticeInterpretation L]
|
||||
[ValidExprEvaluator L prog] : ValidStmtEvaluator L prog := by
|
||||
constructor
|
||||
intro s vs ρ₁ ρ₂ bs hcode hbs hvs
|
||||
cases hbs with
|
||||
| noop => exact hvs
|
||||
| assign k e v hev =>
|
||||
intro k' l hk'l v' hv'
|
||||
cases hv' with
|
||||
| here =>
|
||||
have hk'l₀ : (k, l) ∈ FiniteMap.generalizedUpdate (ks := prog.vars) id
|
||||
(fun _ vs => E.eval e vs) [k] vs := hk'l
|
||||
have hl := FiniteMap.generalizedUpdate_mem_eq (f := id)
|
||||
(g := fun _ vs => E.eval e vs) (List.mem_singleton_self k) hk'l₀
|
||||
rw [hl]
|
||||
exact ValidExprEvaluator.valid hev hvs
|
||||
| there _ _ _ _ _ hne hmem' =>
|
||||
have hk'l₀ : (k', l) ∈ FiniteMap.generalizedUpdate (ks := prog.vars) id
|
||||
(fun _ vs => E.eval e vs) [k] vs := hk'l
|
||||
have hk'l' : (k', l) ∈ (id vs : VariableValues L prog) :=
|
||||
FiniteMap.generalizedUpdate_not_mem_backward
|
||||
(fun hmem => hne (List.mem_singleton.mp hmem)) hk'l₀
|
||||
exact hvs _ _ hk'l' _ hmem'
|
||||
simp [StmtEvaluator.eval, evalBasicStmtOpt]
|
||||
intro s vs ρ₁ ρ₂; generalize prog.code s = obs; intro hev hvs
|
||||
rcases hev with _ | @⟨_,bs,hev⟩ <;> try simpa
|
||||
rcases hev with _ | @⟨k, e, v, hev⟩ <;> try simpa
|
||||
intros k' l' hkl' v' hρ
|
||||
rcases hρ with _ | ⟨_,_,_,_,_,hne,hmem⟩ <;> simp [evalBasicStmt] at hkl'
|
||||
· have hl := FiniteMap.generalizedUpdate_mem_eq (f := id)
|
||||
(g := fun _ vs => E.eval e vs) (List.mem_singleton_self k) hkl'
|
||||
rewrite [hl]; simp
|
||||
exact ValidExprEvaluator.valid hev hvs
|
||||
· have hl := FiniteMap.generalizedUpdate_not_mem_backward
|
||||
(fun hmem => hne (List.mem_singleton.mp hmem)) hkl'
|
||||
apply hvs _ _ hl _ hmem
|
||||
|
||||
end Forward
|
||||
|
||||
|
||||
@@ -7,9 +7,8 @@ namespace Forward
|
||||
variable (L : Type) [Lattice L] (prog : Program)
|
||||
|
||||
class StmtEvaluator where
|
||||
eval : (s : prog.State) → (bs : BasicStmt) → prog.code s = some bs →
|
||||
VariableValues L prog → VariableValues L prog
|
||||
eval_mono : ∀ s bs h, Monotone (eval s bs h)
|
||||
eval : prog.State → VariableValues L prog → VariableValues L prog
|
||||
eval_mono : ∀ s, Monotone (eval s)
|
||||
|
||||
class ExprEvaluator where
|
||||
eval : Expr → VariableValues L prog → L
|
||||
@@ -22,9 +21,8 @@ class ValidExprEvaluator [ExprEvaluator L prog] [I : LatticeInterpretation L] :
|
||||
|
||||
class ValidStmtEvaluator [E : StmtEvaluator L prog] [LatticeInterpretation L] :
|
||||
Prop where
|
||||
valid : ∀ {s : prog.State} {vs : VariableValues L prog} {ρ₁ ρ₂ : Env}
|
||||
{bs : BasicStmt} (hcode : prog.code s = some bs),
|
||||
EvalBasicStmt ρ₁ bs ρ₂ → ⟦ vs ⟧ ρ₁ () → ⟦ E.eval s bs hcode vs ⟧ ρ₂ ()
|
||||
valid : ∀ {s : prog.State} {vs : VariableValues L prog} {ρ₁ ρ₂ : Env},
|
||||
EvalBasicStmtOpt ρ₁ (prog.code s) ρ₂ → ⟦ vs ⟧ ρ₁ () → ⟦ E.eval s vs ⟧ ρ₂ ()
|
||||
|
||||
end Forward
|
||||
|
||||
|
||||
Reference in New Issue
Block a user