| ⟨if ¬ found? then a := T2[h2(a)].elem, T2 := T2[h2(a), T2[h2(a)].elem:= a]⟩ ⟨loop if ¬ found? then {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 T2[h2(a)] = empty then {T2 := T2[h2(a), full(a)]; found? := true}}; if ¬ found? then a := T2[h2(a)].elem, T2 := T2[h2(a), T2[h2(a)].elem:= a]} times kappa -1⟩ (T3 = T ∧ found? ∧ a = a1 ∧ T2 = T0), ∀ kappa0, found?0, T1, h1, a, T2, h2, T, a1, T0. kappa0 < kappa → ⟨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 kappa0⟩ (T1 = T ∧ found?0 ∧ a = a1 ∧ T2 = T0) ∧ ¬ found?0 ∧ T2[h2(a)] ≠ full(a) ∧ T1[h1(a)] ≠ full(a) ∧ disj(T1, T2) ∧ inv(T2, h2) ∧ inv(T1, h1) ∧ (abs(T1, T2, h1, h2) ++ a ≠ abs(T, T0, h1, h2) ∨ ¬ inv(T, h1) ∨ ¬ inv(T0, h2) ∨ ¬ disj(T, T0)) → false, ¬ found?0, T2[h2(a)] ≠ full(a), T1[h1(a)] ≠ full(a), disj(T1, T2), inv(T2, h2), inv(T1, h1), abs(T1, T2, h1, h2) ++ a ≠ abs(T, T0, h1, h2) ∨ ¬ inv(T, h1) ∨ ¬ inv(T0, h2) ∨ ¬ disj(T, T0), ¬ found?0 ∧ kappa ≠ 0, T1[h1(a)] = empty, T3 = T1[h1(a), full(a)], found? ↔ true ⊦ |
⟨skip⟩ ⟨loop if ¬ found? then {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 T2[h2(a)] = empty then {T2 := T2[h2(a), full(a)]; found? := true}}; if ¬ found? then a := T2[h2(a)].elem, T2 := T2[h2(a), T2[h2(a)].elem:= a]} times kappa -1⟩ (T3 = T ∧ found? ∧ a = a1 ∧ T2 = T0), ∀ kappa0, found?0, T1, h1, a, T2, h2, T, a1, T0. kappa0 < kappa → ⟨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 kappa0⟩ (T1 = T ∧ found?0 ∧ a = a1 ∧ T2 = T0) ∧ ¬ found?0 ∧ T2[h2(a)] ≠ full(a) ∧ T1[h1(a)] ≠ full(a) ∧ disj(T1, T2) ∧ inv(T2, h2) ∧ inv(T1, h1) ∧ (abs(T1, T2, h1, h2) ++ a ≠ abs(T, T0, h1, h2) ∨ ¬ inv(T, h1) ∨ ¬ inv(T0, h2) ∨ ¬ disj(T, T0)) → false, ¬ found?0, T2[h2(a)] ≠ full(a), T1[h1(a)] ≠ full(a), disj(T1, T2), inv(T2, h2), inv(T1, h1), abs(T1, T2, h1, h2) ++ a ≠ abs(T, T0, h1, h2) ∨ ¬ inv(T, h1) ∨ ¬ inv(T0, h2) ∨ ¬ disj(T, T0), ¬ found?0 ∧ kappa ≠ 0, T1[h1(a)] = empty, T3 = T1[h1(a), full(a)], found? ↔ true ⊦
[Concretesimprules(())]