Skip to content

Commit 357b579

Browse files
committed
made progress towards toSSAExpr!_vars_equiv
1 parent b6cadb4 commit 357b579

2 files changed

Lines changed: 97 additions & 9 deletions

File tree

Pullback/SSA/SSADo.lean

Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,25 +247,97 @@ theorem SSADo.eval_letM
247247
(rest.toSSAExpr! (vars.push (var, val.inferType! vars)) (mutVars.push (var, val.inferType! vars)) kMutVars kbreak kcontinue)
248248
v hval
249249

250-
theorem SSADo.eval_toSSAExpr_push_assign_invariant
250+
251+
#check SSADo.toSSAExpr!
252+
theorem SSADo.toSSAExpr!_vars_equiv
253+
{vars₁ vars₂ mutVars kMutVars : VarMap} {kbreak kcontinue : Option Name}
254+
(hvars : VarMap.equiv vars₁ vars₂) :
255+
{rest : SSADo} →
256+
(rest.toSSAExpr! vars₁ mutVars kMutVars kbreak kcontinue) =
257+
(rest.toSSAExpr! vars₂ mutVars kMutVars kbreak kcontinue)
258+
| expr x => by
259+
simp [toSSAExpr!]
260+
| letE varName val body => by
261+
simp only [toSSAExpr!, SSAExpr.letE.injEq, true_and]
262+
apply SSADo.toSSAExpr!_vars_equiv
263+
have : SSAExpr.inferType! vars₁ val = SSAExpr.inferType! vars₂ val :=
264+
SSAExpr.inferType!_eq_of_vars_equiv hvars
265+
rw [this]
266+
exact VarMap.equiv_push vars₁ vars₂ hvars varName (SSAExpr.inferType! vars₂ val)
267+
| letM varName val body => by
268+
simp only [toSSAExpr!, SSAExpr.letE.injEq, true_and]
269+
have : SSAExpr.inferType! vars₁ val = SSAExpr.inferType! vars₂ val :=
270+
SSAExpr.inferType!_eq_of_vars_equiv hvars
271+
rw [this]
272+
apply toSSAExpr!_vars_equiv
273+
exact VarMap.equiv_push vars₁ vars₂ hvars varName (SSAExpr.inferType! vars₂ val)
274+
| assign varname val body => by
275+
simp [toSSAExpr!]
276+
apply SSADo.toSSAExpr!_vars_equiv
277+
have : SSAExpr.inferType! vars₁ val = SSAExpr.inferType! vars₂ val :=
278+
SSAExpr.inferType!_eq_of_vars_equiv hvars
279+
rw [this]
280+
exact VarMap.equiv_push vars₁ vars₂ hvars varname (SSAExpr.inferType! vars₂ val)
281+
| .return out => by simp [toSSAExpr!]
282+
| .break => by simp [toSSAExpr!]
283+
| .continue => by simp [toSSAExpr!]
284+
| seq s₁ s₂ => by
285+
simp [toSSAExpr!]
286+
apply And.intro
287+
· exact toSSAExpr!_vars_equiv hvars
288+
· exact toSSAExpr!_vars_equiv hvars
289+
| loop body rest => by
290+
simp [toSSAExpr!]
291+
have : freshName (Array.map (fun x => x.1) vars₁ ++ body.vars) =
292+
freshName (Array.map (fun x => x.1) vars₂ ++ body.vars) := sorry
293+
simp [this]
294+
simp [toSSAExpr!_vars_equiv hvars, SSAExpr.inferType!_eq_of_vars_equiv hvars]
295+
| ifthenelse c t e rest => by
296+
simp [toSSAExpr!]
297+
have : freshName (Array.map (fun x => x.1) vars₁ ++ (t.vars ++ e.vars)) =
298+
freshName (Array.map (fun x => x.1) vars₂ ++ (t.vars ++ e.vars)) := sorry
299+
simp [this]
300+
simp [toSSAExpr!_vars_equiv hvars, SSAExpr.inferType!_eq_of_vars_equiv hvars]
301+
-- rw [toSSAExpr!_vars_equiv (vars₂ := vars₂), SSAExpr.inferType!_eq_of_vars_equiv (vars₂ := vars₂)]
302+
-- apply And.intro
303+
sorry
304+
305+
theorem SSADo.toSSAExpr_var_push
251306
{vars mutVars kMutVars : VarMap} {kbreak kcontinue : Option Name}
252-
{args : Array (Name × SSAConst)}
253307
{var : Name} {val : SSAExpr} {rest : SSADo} :
254-
(rest.toSSAExpr! (vars.push (var, val.inferType! vars)) mutVars kMutVars kbreak kcontinue).eval args =
255-
(rest.toSSAExpr! vars mutVars kMutVars kbreak kcontinue).eval args := by
256-
sorry
308+
(hvar_type : vars.get var = some (val.inferType! vars)) →
309+
(rest.toSSAExpr! (vars.push (var, val.inferType! vars)) mutVars kMutVars kbreak kcontinue) =
310+
(rest.toSSAExpr! vars mutVars kMutVars kbreak kcontinue) := by
311+
intro hvar_type
312+
have hpush_equiv : VarMap.equiv (vars.push (var, val.inferType! vars)) vars := by
313+
apply VarMap.equiv_symm
314+
apply VarMap.equiv_push_of_shadow
315+
grind
316+
simpa using SSADo.toSSAExpr!_vars_equiv
317+
(vars₁ := (vars.push (var, val.inferType! vars)))
318+
(vars₂ := vars)
319+
(mutVars := mutVars)
320+
(kMutVars := kMutVars)
321+
(kbreak := kbreak)
322+
(kcontinue := kcontinue)
323+
(rest := rest)
324+
hpush_equiv
257325

258326
theorem SSADo.eval_assign
259327
{vars mutVars kMutVars : VarMap} {kbreak kcontinue : Option Name}
260328
{args : Array (Name × SSAConst)}
261329
{var : Name} {val : SSAExpr} {rest : SSADo} {v : SSAConst}
330+
(hvar_type : vars.get var = some (val.inferType! vars))
262331
(_hval : val.eval args = some v) :
263332
(SSADo.toSSAExpr! vars mutVars kMutVars kbreak kcontinue (SSADo.assign var val rest)).eval args =
264333
(SSADo.toSSAExpr! vars mutVars kMutVars kbreak kcontinue rest).eval args := by
265334
have hassign_bridge :
266335
(rest.toSSAExpr! (vars.push (var, val.inferType! vars)) mutVars kMutVars kbreak kcontinue).eval args =
267336
(rest.toSSAExpr! vars mutVars kMutVars kbreak kcontinue).eval args := by
268-
exact SSADo.eval_toSSAExpr_push_assign_invariant
337+
exact congrArg (fun e => e.eval args) <|
338+
SSADo.toSSAExpr_var_push (vars := vars) (mutVars := mutVars) (kMutVars := kMutVars)
339+
(kbreak := kbreak) (kcontinue := kcontinue) (var := var) (val := val)
340+
(rest := rest) hvar_type
269341
have hlet :
270342
(SSADo.toSSAExpr! vars mutVars kMutVars kbreak kcontinue (SSADo.assign var val rest)).eval args =
271343
(rest.toSSAExpr! (vars.push (var, val.inferType! vars)) mutVars kMutVars kbreak kcontinue).eval args := by

Pullback/SSA/VarMap.lean

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,25 @@ theorem VarMap.get_eq_none_iff_not_any (vars : VarMap) (key : Name) : vars.get k
2828
def VarMap.equiv (vars₁ vars₂ : VarMap) : Prop :=
2929
{name | vars₁.any (·.1 = name)} = {name | vars₂.any (·.1 = name)} ∧ ∀ name, vars₁.any (·.1 = name) → vars₁.get name = vars₂.get name
3030

31-
def VarMap.equiv_push (vars₁ vars₂ : VarMap) (hvars : vars₁.equiv vars₂) (varname : Name) (vartype : SSAType) : (cast (β := VarMap) rfl (vars₁.push (varname, vartype))).equiv (vars₂.push (varname, vartype)) := by
32-
simp only [cast_eq]
31+
def VarMap.equiv_symm {vars₁ vars₂ : VarMap} : vars₁.equiv vars₂ → vars₂.equiv vars₁ := by
32+
simp only [equiv, Array.any_eq_true', decide_eq_true_eq, forall_exists_index, and_imp]
33+
intro h1 h2
34+
have : ∀ (name : Name) (x : Name × SSAType), x ∈ vars₂ → x.1 = name → Array.get vars₂ name = Array.get vars₁ name := by
35+
intro name a ha1 ha2
36+
rw [Set.ext_iff] at h1
37+
specialize h1 a.1
38+
grind
39+
tauto
40+
41+
def VarMap.equiv_push (vars₁ vars₂ : VarMap) (hvars : vars₁.equiv vars₂) (varname : Name) (vartype : SSAType) : VarMap.equiv (vars₁.push (varname, vartype)) (vars₂.push (varname, vartype)) := by
3342
simp only [equiv, Array.any_eq_true, decide_eq_true_eq, forall_exists_index, Array.size_push, Array.any_push', Bool.or_eq_true] at ⊢ hvars
3443
apply And.intro
3544
· ext name
3645
rw [Set.ext_iff] at hvars
3746
grind only [usr Set.mem_setOf_eq]
3847
· intro name H
3948
have := VarMap.get_push
40-
simp only [cast_eq, Prod.forall] at this
49+
simp only [Prod.forall] at this
4150
rw [this]
4251
cases em (varname = name) with
4352
| inl hl =>
@@ -50,6 +59,8 @@ def VarMap.equiv_push (vars₁ vars₂ : VarMap) (hvars : vars₁.equiv vars₂)
5059
simp [hr]
5160
grind only
5261

62+
def VarMap.equiv_push_of_shadow (vars : VarMap) (varname : Name) (vartype : SSAType) (hvar_type : vars.get varname = some vartype): VarMap.equiv vars (vars.push (varname, vartype)) := sorry
63+
5364
theorem SSAExpr.inferType_eq_of_vars_equiv (vars₁ vars₂ : VarMap) (hvars : vars₁.equiv vars₂) : (expr : SSAExpr) → expr.inferType vars₁ = expr.inferType vars₂
5465
| const c => by simp only [inferType]
5566
| letE varname val body => by
@@ -120,3 +131,8 @@ theorem VarMap.push_valid {var : Name} {varT : SSAType} {mutVars vars : VarMap}
120131
grind
121132
have : Array.get vars var = varT := by grind
122133
grind
134+
135+
theorem SSAExpr.inferType!_eq_of_vars_equiv {vars₁ vars₂ : VarMap} (hvars : VarMap.equiv vars₁ vars₂) {expr : SSAExpr} :
136+
expr.inferType! vars₁ = expr.inferType! vars₂ := sorry
137+
138+
#check mkMutTuple

0 commit comments

Comments
 (0)