| ⟨loop if ¬ found?0 then {if T1[h1(a)] = empty then {T1 := T1[h1(a), full(a)]; found?0 := true}; if ¬ found?0 then {a := T1[h1(a)].elem, T1 := T1[h1(a), T1[h1(a)].elem:= a]; if T2[h2(a)] = empty then {T2 := T2[h2(a), full(a)]; found?0 := true}}; if ¬ found?0 then a := T2[h2(a)].elem, T2 := T2[h2(a), T2[h2(a)].elem:= a]} times kappa⟩ (T1 = T3 ∧ (found?0 ↔ found?2) ∧ a = a1 ∧ T2 = T4), ⟨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), T3 = T, found?2 ↔ found?1, a1 = a0, T4 = T0, ¬ ¬ found?2 ⊦ |
⟨lookup(a, T1, T2, h1, h2; found?)⟩ (found? ↔ found?0), ⟨loop if ¬ found?0 then {if T1[h1(a)] = empty then {T1 := T1[h1(a), full(a)]; found?0 := true}; if ¬ found?0 then {a := T1[h1(a)].elem, T1 := T1[h1(a), T1[h1(a)].elem:= a]; if T2[h2(a)] = empty then {T2 := T2[h2(a), full(a)]; found?0 := true}}; if ¬ found?0 then a := T2[h2(a)].elem, T2 := T2[h2(a), T2[h2(a)].elem:= a]} times kappa⟩ (T1 = T ∧ found?0 ∧ a = a1 ∧ T2 = 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) ⊦
[Concretesimprules(())]