| ⟨lookup(a, T1, T2, h1, h2; found?)⟩ ⟨T4 := T2, T3 := T1; while ¬ found? do {if T3[h1(a)] = empty then {T3 := T3[h1(a), full(a)]; found? := true}; if ¬ found? then {a := T3[h1(a)].elem, T3 := T3[h1(a), T3[h1(a)].elem:= a]; if T4[h2(a)] = empty then {T4 := T4[h2(a), full(a)]; found? := true}}; if ¬ found? then a := T4[h2(a)].elem, T4 := T4[h2(a), T4[h2(a)].elem:= a]}⟩ (T3 = T ∧ T4 = T0), inv(T1, h1), inv(T2, h2), disj(T1, T2), abs(T1, T2, h1, h2) ++ a ≠ abs(T, T0, h1, h2) ∨ ¬ inv(T, h1) ∨ ¬ inv(T0, h2) ∨ ¬ disj(T, T0), found? ↔ false ⊦ |
⟨T4 := T2, T3 := T1⟩ ⟨while ¬ found?0 do {if T3[h1(a)] = empty then {T3 := T3[h1(a), full(a)]; found?0 := true}; if ¬ found?0 then {a := T3[h1(a)].elem, T3 := T3[h1(a), T3[h1(a)].elem:= a]; if T4[h2(a)] = empty then {T4 := T4[h2(a), full(a)]; found?0 := true}}; if ¬ found?0 then a := T4[h2(a)].elem, T4 := T4[h2(a), T4[h2(a)].elem:= a]}⟩ (T3 = T ∧ T4 = T0), ⟨lookup(a, T1, T2, h1, h2; found?)⟩ (found? ↔ found?0), inv(T1, h1), inv(T2, h2), disj(T1, T2), abs(T1, T2, h1, h2) ++ a ≠ abs(T, T0, h1, h2) ∨ ¬ inv(T, h1) ∨ ¬ inv(T0, h2) ∨ ¬ disj(T, T0), found? ↔ false ⊦
[Concretesimprules(())]