@@ -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
258326theorem 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
0 commit comments