| dom remove-refsize0(gstore) ∩ ginval = ∅, abs-gstore(avol0, lpt, gstore, ginval), avol-cleanup-lpt-unchanged(avol0, avol1, lpt) ⊦ ¬ abs-gstore(avol1, cleanup-lpt(lpt), remove-refsize0(gstore), ∅) ↔ false |
# lpt = # avol1, # avol0 = # avol1, dom remove-refsize0(gstore) ∩ ginval = ∅, ∀ n. n < # avol1 ∧ (lpt[n].ref-size ≠ 0 ∨ lpt[n].flags = LP_FREE) → avol0[n] = avol1[n], ∀ n. (n < # avol1 ∧ lpt[n].flags = LP_GROUP_NODES ↔ n ∈ gstore) ∧ (n ∈ gstore ∧ ¬ n ∈ ginval → abs-leb(avol0[n], gstore[n], lpt[n])) ∧ (n ∈ gstore → lpt[n].ref-size = gstore[n].ref-size), ¬ ( n < # avol1 ∧ lpt.map(λ lp. (lp.ref-size = 0 ∧ lp.flags ≠ LP_FREE ⊃ mklp(0, 0, LP_FREE, lp.gcheapidx);lp))[n].flags = LP_GROUP_NODES ↔ n ∈ remove-refsize0(gstore)) ∨ ¬ ( n ∈ remove-refsize0(gstore) → abs-leb(avol1[n], remove-refsize0(gstore)[n], lpt.map(λ lp. (lp.ref-size = 0 ∧ lp.flags ≠ LP_FREE ⊃ mklp(0, 0, LP_FREE, lp.gcheapidx);lp))[n])) ∨ ¬ ( n ∈ remove-refsize0(gstore) → lpt.map(λ lp. (lp.ref-size = 0 ∧ lp.flags ≠ LP_FREE ⊃ mklp(0, 0, LP_FREE, lp.gcheapidx);lp))[n].ref-size = remove-refsize0(gstore)[n].ref-size) ⊦
Used simplifier rules: cleanup-lpt: ⊦ cleanup-lpt(lpt) = lpt .map (λ lp. (lp.ref-size = 0 ∧ lp.flags ≠ LP_FREE ⊃ mklp(0, 0, LP_FREE, lp.gcheapidx) ;lp ) );%abs-gstore-def: ⊦ abs-gstore(avol, lpt, gstore, ginval) ↔ (∀ n. (n < # lpt ∧ lpt[n].flags = LP_GROUP_NODES ↔ n ∈ gstore) ∧ ( n ∈ gstore ∧ ¬ n ∈ ginval → abs-leb(avol[n], gstore[n], lpt[n])) ∧ (n ∈ gstore → lpt[n].ref-size = gstore[n].ref-size));%avol-cleanup-lpt-unchanged: ⊦ avol-cleanup-lpt-unchanged(avol0, avol1, lpt) ↔ # avol0 = # avol1 ∧ # avol0 = # lpt ∧ (∀ n. n < # avol0 ∧ (lpt[n].ref-size ≠ 0 ∨ lpt[n].flags = LP_FREE) → avol0[n] = avol1[n]);% ⊦ ¬ n ∈ ∅; (s)% ⊦ # lpt.map(lptfun) = # lpt; (s)