From Stdlib Require Import Strings.String.
From Stdlib Require Import String Ascii.
From Stdlib Require Arith.
From stdpp Require Import base.
From stdpp Require Import fin_maps.
From stdpp Require Import gmap.
From stdpp Require Import base gmultiset.
From Stdlib Require Classical.
From Stdlib Require Import ZArith.
From stdpp.bitvector Require Import definitions tactics.
From Stdlib Require Import Sorting.Sorted.
From Stdlib Require Import Reals.Rbasic_fun.
From Stdlib Require Import Reals.Abstract.ConstructiveAbs.
From Stdlib Require Import Reals.Rdefinitions.
From stdpp Require Import list_relations.
From stdpp Require Import list_numbers.
From stdpp Require Import functions.
From Stdlib Require Import ClassicalEpsilon.
From stdpp Require Import base decidable.
From Stdlib Require Import ZArith.Zeuclid.
From Stdlib Require Import ZArith.Znumtheory.
From stdpp Require Import propset.
From Stdlib Require Import Reals.
Require Import Why3.Base.
Require Import Why3.why3.Ref.Ref.
Require Import Why3.map.Const.
Require Import Why3.map.MapEq.
Require Import Why3.mach.int.Unsigned.
Require Import Why3.mach.c.C.
Require Import multiprecision.lemmas.Lemmas.
Require Import multiprecision.types.Config.
Require Import multiprecision.types.Types.
Require Import multiprecision.types.Int32Eq.
Require Import multiprecision.types.UInt64Eq.
Require Import multiprecision.util.Util.
Require Import multiprecision.ptralias.Alias.
Require Import multiprecision.compare.Compare.
Require Import multiprecision.add.Add.
Require Import multiprecision.sub.Sub.
Require Import multiprecision.mpz.Z.
Require Import multiprecision.mpz.Zutil.
Open Scope Z_scope.
Lemma wmpz_sub'vc (mpz : mpz_memo) (w : mpz_ptr) (u : mpz_ptr) (v : mpz_ptr) (fact0 : 1%Z ≤ alloc mpz w) (fact1 : 1%Z ≤ alloc mpz u) (fact2 : 1%Z ≤ alloc mpz v) (fact3 : readers mpz w = 0%Z) (fact4 : readers mpz u = 0%Z) (fact5 : readers mpz v = 0%Z) (fact6 : abs_size mpz u < 2147483647%Z) (fact7 : abs_size mpz v < 2147483647%Z) (fact8 : mpz_eq u v = (u = v)) : if decide (mpz_eq u v) then (- 1%Z ≤ readers mpz w ∧ readers mpz w ≤ 0%Z) ∧ (∀(mpz1 : mpz_memo), alloc mpz1 = alloc mpz ∧ sgn mpz1 = sgn mpz ∧ readers mpz1 = readers mpz ∧ zones mpz1 = zones mpz -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz1 mpz) ∧ abs_size mpz1 w = 0%Z ∧ abs_value_of mpz1 w = 0%Z -> value_of w mpz1 = value_of u mpz - value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz1 mpz) ∧ readers mpz1 w = 0%Z ∧ readers mpz1 u = 0%Z ∧ readers mpz1 v = 0%Z) else - 2%Z < readers mpz u ∧ (∀(o1 : bv 32%N), bv_signed o1 = sgn mpz u * abs_size mpz u -> - 2%Z < readers mpz v ∧ (∀(o2 : bv 32%N), bv_signed o2 = sgn mpz v * abs_size mpz v -> int'32_in_bounds (- bv_signed o2) ∧ (∀(o3 : bv 32%N), bv_signed o3 = - bv_signed o2 -> - 2147483648%Z < bv_signed o1 ∧ (∀(o4 : bv 32%N), bv_signed o4 = Z.abs (bv_signed o1) -> - 2147483648%Z < bv_signed o3 ∧ (∀(o5 : bv 32%N), bv_signed o5 = Z.abs (bv_signed o3) -> (if decide (bv_signed o4 < bv_signed o5) then (readers mpz u = 0%Z ∧ readers mpz v = 0%Z) ∧ (readers mpz v = 0%Z ∧ readers mpz u = 0%Z -> (abs_size mpz v = bv_signed o5 ∧ abs_size mpz u = bv_signed o4) ∧ (bv_signed o4 ≤ bv_signed o5 ∧ bv_signed o5 < 2147483647%Z) ∧ (0%Z ≤ bv_signed o4 ∧ bv_signed o4 ≤ alloc mpz u) ∧ (0%Z ≤ bv_signed o5 ∧ bv_signed o5 ≤ alloc mpz v) ∧ (0%Z < alloc mpz v ∧ 0%Z < alloc mpz u) ∧ (readers mpz v = 0%Z ∧ readers mpz u = 0%Z) ∧ True = (bv_signed o4 < bv_signed o5) ∧ (bv_signed o5 * sgn mpz v = - bv_signed o3 ∧ bv_signed o4 * sgn mpz u = bv_signed o1) ∧ (¬ True -> bv_signed o5 * sgn mpz v = bv_signed o3 ∧ bv_signed o4 * sgn mpz u = - bv_signed o1) ∧ - value_of v mpz + value_of u mpz = value_of u mpz - value_of v mpz ∧ (¬ True -> value_of v mpz - value_of u mpz = value_of u mpz - value_of v mpz) ∧ mpz_unchanged v mpz mpz ∧ mpz_unchanged u mpz mpz ∧ ¬ mpz_eq v u) else (abs_size mpz u = bv_signed o4 ∧ abs_size mpz v = bv_signed o5) ∧ (bv_signed o5 ≤ bv_signed o4 ∧ bv_signed o4 < 2147483647%Z) ∧ (0%Z ≤ bv_signed o5 ∧ bv_signed o5 ≤ alloc mpz v) ∧ (0%Z ≤ bv_signed o4 ∧ bv_signed o4 ≤ alloc mpz u) ∧ (0%Z < alloc mpz u ∧ 0%Z < alloc mpz v) ∧ (readers mpz u = 0%Z ∧ readers mpz v = 0%Z) ∧ ¬ bv_signed o4 < bv_signed o5 ∧ (bv_signed o4 * sgn mpz u = bv_signed o1 ∧ bv_signed o5 * sgn mpz v = - bv_signed o3) ∧ mpz_unchanged u mpz mpz ∧ mpz_unchanged v mpz mpz ∧ ¬ mpz_eq u v) ∧ (∀(swapped : bool) (abs_vsize : bv 32%N) (abs_usize : bv 32%N) (vsize : bv 32%N) (usize : bv 32%N) (v1 : mpz_ptr) (u1 : mpz_ptr), (abs_size mpz u1 = bv_signed abs_usize ∧ abs_size mpz v1 = bv_signed abs_vsize) ∧ (bv_signed abs_vsize ≤ bv_signed abs_usize ∧ bv_signed abs_usize < 2147483647%Z) ∧ (0%Z ≤ bv_signed abs_vsize ∧ bv_signed abs_vsize ≤ alloc mpz v1) ∧ (0%Z ≤ bv_signed abs_usize ∧ bv_signed abs_usize ≤ alloc mpz u1) ∧ (0%Z < alloc mpz u1 ∧ 0%Z < alloc mpz v1) ∧ (readers mpz u1 = 0%Z ∧ readers mpz v1 = 0%Z) ∧ (swapped = true) = (bv_signed o4 < bv_signed o5) ∧ (swapped = true -> bv_signed abs_usize * sgn mpz u1 = - bv_signed usize ∧ bv_signed abs_vsize * sgn mpz v1 = bv_signed vsize) ∧ (¬ swapped = true -> bv_signed abs_usize * sgn mpz u1 = bv_signed usize ∧ bv_signed abs_vsize * sgn mpz v1 = - bv_signed vsize) ∧ (swapped = true -> - value_of u1 mpz + value_of v1 mpz = value_of u mpz - value_of v mpz) ∧ (¬ swapped = true -> value_of u1 mpz - value_of v1 mpz = value_of u mpz - value_of v mpz) ∧ mpz_unchanged u1 mpz mpz ∧ mpz_unchanged v1 mpz mpz ∧ ¬ mpz_eq u1 v1 -> int'32_in_bounds (bv_signed abs_usize + 1%Z) ∧ (∀(o6 : bv 32%N), bv_signed o6 = bv_signed abs_usize + 1%Z -> mpz_eq u1 w = (u1 = w) -> mpz_eq v1 w = (v1 = w) -> (readers mpz w = 0%Z ∧ 1%Z ≤ alloc mpz w) ∧ (∀(mpz1 : mpz_memo), sgn mpz1 = sgn mpz -> (∀(wp : C.ptr (bv 64%N)), (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz1 mpz) ∧ readers mpz1 w = - 1%Z ∧ abs_value_of mpz1 w = value wp (abs_size mpz1 w) ∧ zones mpz1 w = zone1 wp ∧ offset wp = 0%Z ∧ plength wp = alloc mpz1 w ∧ min wp = 0%Z ∧ C.max wp = plength wp ∧ writable wp = true ∧ abs_size mpz1 w = abs_size mpz w ∧ value wp (abs_size mpz w) = abs_value_of mpz w ∧ (if decide (alloc mpz w < bv_signed o6) then alloc mpz1 w = bv_signed o6 else alloc mpz1 w = alloc mpz w) -> (∀(o7 : bv 32%N), (bv_signed usize = 0%Z -> o7 = vsize) ∧ (bv_signed vsize = 0%Z -> o7 = usize) ∧ (0%Z ≤ bv_signed usize ∧ 0%Z ≤ bv_signed vsize ∨ bv_signed usize < 0%Z ∧ bv_signed vsize < 0%Z -> 0%Z ≤ bv_signed o7) ∧ (bv_signed usize < 0%Z ∧ 0%Z ≤ bv_signed vsize ∨ 0%Z ≤ bv_signed usize ∧ bv_signed vsize < 0%Z -> bv_signed o7 < 0%Z) -> (if decide (bv_signed o7 < 0%Z) then (∀(o8 : bool), (bv_signed abs_usize = bv_signed abs_vsize -> o8 = true) ∧ (o8 = true -> abs_usize = abs_vsize) -> (if decide (¬ o8 = true) then (if decide (mpz_eq u1 w) then 0%Z ≤ readers mpz1 v1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(vp : C.ptr (bv 64%N)), readers mpz2 v1 = readers mpz1 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz2 y = readers mpz1 y) ∧ value vp (abs_size mpz2 v1) = abs_value_of mpz2 v1 ∧ plength vp = alloc mpz2 v1 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = plength vp ∧ zone1 vp = zones mpz2 v1 -> ((0%Z ≤ bv_signed abs_vsize ∧ bv_signed abs_vsize ≤ bv_signed abs_usize) ∧ (valid wp (bv_signed abs_usize) ∧ valid vp (bv_signed abs_vsize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value wp (bv_signed abs_usize) - value vp (bv_signed abs_vsize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ value vp1 (bv_signed abs_vsize) = value vp (bv_signed abs_vsize) ∧ (min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp) ∧ min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp -> (zones mpz2 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz2 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 v1 = readers mpz2 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (bv_signed abs_usize) = abs_value_of mpz1 u1 - abs_value_of mpz1 v1 ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))))) else if decide (mpz_eq v1 w) then 0%Z ≤ readers mpz1 u1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(up : C.ptr (bv 64%N)), readers mpz2 u1 = readers mpz1 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz2 y = readers mpz1 y) ∧ value up (abs_size mpz2 u1) = abs_value_of mpz2 u1 ∧ plength up = alloc mpz2 u1 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = plength up ∧ zone1 up = zones mpz2 u1 -> ((0%Z ≤ bv_signed abs_vsize ∧ bv_signed abs_vsize ≤ bv_signed abs_usize) ∧ (valid up (bv_signed abs_usize) ∧ valid wp (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value up (bv_signed abs_usize) - value wp (bv_signed abs_vsize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ (min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (zones mpz2 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz2 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 u1 = readers mpz2 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (bv_signed abs_usize) = abs_value_of mpz1 u1 - abs_value_of mpz1 v1 ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))))) else 0%Z ≤ readers mpz1 u1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(up : C.ptr (bv 64%N)), readers mpz2 u1 = readers mpz1 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz2 y = readers mpz1 y) ∧ value up (abs_size mpz2 u1) = abs_value_of mpz2 u1 ∧ plength up = alloc mpz2 u1 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = plength up ∧ zone1 up = zones mpz2 u1 -> 0%Z ≤ readers mpz2 v1 ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(vp : C.ptr (bv 64%N)), readers mpz3 v1 = readers mpz2 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz3 y = readers mpz2 y) ∧ value vp (abs_size mpz3 v1) = abs_value_of mpz3 v1 ∧ plength vp = alloc mpz3 v1 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = plength vp ∧ zone1 vp = zones mpz3 v1 -> ((0%Z ≤ bv_signed abs_vsize ∧ bv_signed abs_vsize ≤ bv_signed abs_usize) ∧ (valid wp (bv_signed abs_usize) ∧ valid up (bv_signed abs_usize) ∧ valid vp (bv_signed abs_vsize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value up (bv_signed abs_usize) - value vp (bv_signed abs_vsize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ value vp1 (bv_signed abs_vsize) = value vp (bv_signed abs_vsize) ∧ (min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up) ∧ (min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (zones mpz3 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz3 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 u1 = readers mpz3 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz4 y = readers mpz3 y) -> (zones mpz4 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz4 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz5 : mpz_memo), abs_value_of mpz5 = abs_value_of mpz4 ∧ alloc mpz5 = alloc mpz4 ∧ abs_size mpz5 = abs_size mpz4 ∧ sgn mpz5 = sgn mpz4 ∧ zones mpz5 = zones mpz4 -> readers mpz5 v1 = readers mpz4 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz5 y = readers mpz4 y) -> value wp1 (bv_signed abs_usize) = abs_value_of mpz1 u1 - abs_value_of mpz1 v1 ∧ (mpz_eq u1 w ∨ readers mpz5 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz5 v1 = 0%Z) ∧ readers mpz5 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz5 mpz) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))))))))) ∧ (∀(wp1 : C.ptr (bv 64%N)) (mpz2 : mpz_memo), offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> value wp1 (bv_signed abs_usize) = abs_value_of mpz1 u1 - abs_value_of mpz1 v1 ∧ (mpz_eq u1 w ∨ readers mpz2 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz2 v1 = 0%Z) ∧ readers mpz2 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz2 mpz) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (0%Z ≤ bv_signed abs_usize ∧ valid wp1 (bv_signed abs_usize)) ∧ (∀(wsize : bv 32%N), (0%Z ≤ bv_signed wsize ∧ bv_signed wsize ≤ bv_signed abs_usize) ∧ value wp1 (bv_signed wsize) = value wp1 (bv_signed abs_usize) ∧ (bv_signed wsize = 0%Z ∨ 0%Z < bv_unsigned (pelts wp1 (offset wp1 + bv_signed wsize - 1%Z))) ∧ (bv_signed wsize = 0%Z ∨ Z.pow (18446744073709551615%Z + 1%Z) (bv_signed wsize - 1%Z) ≤ value wp1 (bv_signed wsize)) -> (if decide (bv_signed usize < 0%Z) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o9 : bv 32%N), bv_signed o9 = - bv_signed wsize -> value wp1 (Z.abs (bv_signed o9)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 o9 = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz2 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz2 v1 = 0%Z) ∧ readers mpz2 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz2 mpz) ∧ Z.abs (bv_signed o9) ≤ plength wp1 ∧ (¬ bv_signed o9 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o9) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o9))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp) else value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz2 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz2 v1 = 0%Z) ∧ readers mpz2 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz2 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))) else if decide (mpz_eq u1 w) then 0%Z ≤ readers mpz1 v1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(vp : C.ptr (bv 64%N)), readers mpz2 v1 = readers mpz1 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz2 y = readers mpz1 y) ∧ value vp (abs_size mpz2 v1) = abs_value_of mpz2 v1 ∧ plength vp = alloc mpz2 v1 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = plength vp ∧ zone1 vp = zones mpz2 v1 -> (valid wp (bv_signed abs_usize) ∧ valid vp (bv_signed abs_usize)) ∧ (∀(o9 : bv 32%N), bv_signed o9 = compare_int (value wp (bv_signed abs_usize)) (value vp (bv_signed abs_usize)) -> (if decide (bv_signed o9 < 0%Z) then (0%Z ≤ bv_signed abs_usize ∧ (valid vp (bv_signed abs_usize) ∧ valid wp (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value vp (bv_signed abs_usize) - value wp (bv_signed abs_usize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ value vp1 (bv_signed abs_usize) = value vp (bv_signed abs_usize) ∧ (min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (0%Z ≤ bv_signed abs_usize ∧ valid wp1 (bv_signed abs_usize)) ∧ (∀(wsize : bv 32%N), (0%Z ≤ bv_signed wsize ∧ bv_signed wsize ≤ bv_signed abs_usize) ∧ value wp1 (bv_signed wsize) = value wp1 (bv_signed abs_usize) ∧ (bv_signed wsize = 0%Z ∨ 0%Z < bv_unsigned (pelts wp1 (offset wp1 + bv_signed wsize - 1%Z))) ∧ (bv_signed wsize = 0%Z ∨ Z.pow (18446744073709551615%Z + 1%Z) (bv_signed wsize - 1%Z) ≤ value wp1 (bv_signed wsize)) -> (if decide (0%Z ≤ bv_signed usize) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o10 : bv 32%N), bv_signed o10 = - bv_signed wsize -> (zones mpz2 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz2 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 v1 = readers mpz2 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed o10)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 o10 = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed o10) ≤ plength wp1 ∧ (¬ bv_signed o10 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o10) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o10))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp)) else (zones mpz2 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz2 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 v1 = readers mpz2 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))))) else (0%Z ≤ bv_signed abs_usize ∧ (valid wp (bv_signed abs_usize) ∧ valid vp (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value wp (bv_signed abs_usize) - value vp (bv_signed abs_usize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ value vp1 (bv_signed abs_usize) = value vp (bv_signed abs_usize) ∧ (min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp) ∧ min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp -> (0%Z ≤ bv_signed abs_usize ∧ valid wp1 (bv_signed abs_usize)) ∧ (∀(wsize : bv 32%N), (0%Z ≤ bv_signed wsize ∧ bv_signed wsize ≤ bv_signed abs_usize) ∧ value wp1 (bv_signed wsize) = value wp1 (bv_signed abs_usize) ∧ (bv_signed wsize = 0%Z ∨ 0%Z < bv_unsigned (pelts wp1 (offset wp1 + bv_signed wsize - 1%Z))) ∧ (bv_signed wsize = 0%Z ∨ Z.pow (18446744073709551615%Z + 1%Z) (bv_signed wsize - 1%Z) ≤ value wp1 (bv_signed wsize)) -> (if decide (bv_signed usize < 0%Z) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o10 : bv 32%N), bv_signed o10 = - bv_signed wsize -> (zones mpz2 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz2 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 v1 = readers mpz2 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed o10)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 o10 = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed o10) ≤ plength wp1 ∧ (¬ bv_signed o10 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o10) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o10))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp)) else (zones mpz2 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz2 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 v1 = readers mpz2 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))))))))) else if decide (mpz_eq v1 w) then 0%Z ≤ readers mpz1 u1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(up : C.ptr (bv 64%N)), readers mpz2 u1 = readers mpz1 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz2 y = readers mpz1 y) ∧ value up (abs_size mpz2 u1) = abs_value_of mpz2 u1 ∧ plength up = alloc mpz2 u1 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = plength up ∧ zone1 up = zones mpz2 u1 -> (valid up (bv_signed abs_usize) ∧ valid wp (bv_signed abs_usize)) ∧ (∀(o9 : bv 32%N), bv_signed o9 = compare_int (value up (bv_signed abs_usize)) (value wp (bv_signed abs_usize)) -> (if decide (bv_signed o9 < 0%Z) then (0%Z ≤ bv_signed abs_usize ∧ (valid wp (bv_signed abs_usize) ∧ valid up (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value wp (bv_signed abs_usize) - value up (bv_signed abs_usize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ (min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp) ∧ min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up -> (0%Z ≤ bv_signed abs_usize ∧ valid wp1 (bv_signed abs_usize)) ∧ (∀(wsize : bv 32%N), (0%Z ≤ bv_signed wsize ∧ bv_signed wsize ≤ bv_signed abs_usize) ∧ value wp1 (bv_signed wsize) = value wp1 (bv_signed abs_usize) ∧ (bv_signed wsize = 0%Z ∨ 0%Z < bv_unsigned (pelts wp1 (offset wp1 + bv_signed wsize - 1%Z))) ∧ (bv_signed wsize = 0%Z ∨ Z.pow (18446744073709551615%Z + 1%Z) (bv_signed wsize - 1%Z) ≤ value wp1 (bv_signed wsize)) -> (if decide (0%Z ≤ bv_signed usize) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o10 : bv 32%N), bv_signed o10 = - bv_signed wsize -> (zones mpz2 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz2 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 u1 = readers mpz2 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed o10)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 o10 = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed o10) ≤ plength wp1 ∧ (¬ bv_signed o10 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o10) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o10))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp)) else (zones mpz2 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz2 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 u1 = readers mpz2 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))))) else (0%Z ≤ bv_signed abs_usize ∧ (valid up (bv_signed abs_usize) ∧ valid wp (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value up (bv_signed abs_usize) - value wp (bv_signed abs_usize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ (min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (0%Z ≤ bv_signed abs_usize ∧ valid wp1 (bv_signed abs_usize)) ∧ (∀(wsize : bv 32%N), (0%Z ≤ bv_signed wsize ∧ bv_signed wsize ≤ bv_signed abs_usize) ∧ value wp1 (bv_signed wsize) = value wp1 (bv_signed abs_usize) ∧ (bv_signed wsize = 0%Z ∨ 0%Z < bv_unsigned (pelts wp1 (offset wp1 + bv_signed wsize - 1%Z))) ∧ (bv_signed wsize = 0%Z ∨ Z.pow (18446744073709551615%Z + 1%Z) (bv_signed wsize - 1%Z) ≤ value wp1 (bv_signed wsize)) -> (if decide (bv_signed usize < 0%Z) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o10 : bv 32%N), bv_signed o10 = - bv_signed wsize -> (zones mpz2 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz2 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 u1 = readers mpz2 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed o10)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 o10 = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed o10) ≤ plength wp1 ∧ (¬ bv_signed o10 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o10) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o10))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp)) else (zones mpz2 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz2 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 u1 = readers mpz2 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz3 y = readers mpz2 y) -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))))))))) else 0%Z ≤ readers mpz1 u1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(up : C.ptr (bv 64%N)), readers mpz2 u1 = readers mpz1 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz2 y = readers mpz1 y) ∧ value up (abs_size mpz2 u1) = abs_value_of mpz2 u1 ∧ plength up = alloc mpz2 u1 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = plength up ∧ zone1 up = zones mpz2 u1 -> 0%Z ≤ readers mpz2 v1 ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(vp : C.ptr (bv 64%N)), readers mpz3 v1 = readers mpz2 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz3 y = readers mpz2 y) ∧ value vp (abs_size mpz3 v1) = abs_value_of mpz3 v1 ∧ plength vp = alloc mpz3 v1 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = plength vp ∧ zone1 vp = zones mpz3 v1 -> (valid up (bv_signed abs_usize) ∧ valid vp (bv_signed abs_usize)) ∧ (∀(o9 : bv 32%N), bv_signed o9 = compare_int (value up (bv_signed abs_usize)) (value vp (bv_signed abs_usize)) -> (if decide (bv_signed o9 < 0%Z) then (0%Z ≤ bv_signed abs_usize ∧ (valid wp (bv_signed abs_usize) ∧ valid vp (bv_signed abs_usize) ∧ valid up (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value vp (bv_signed abs_usize) - value up (bv_signed abs_usize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ value vp1 (bv_signed abs_usize) = value vp (bv_signed abs_usize) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ (min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp) ∧ (min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (0%Z ≤ bv_signed abs_usize ∧ valid wp1 (bv_signed abs_usize)) ∧ (∀(wsize : bv 32%N), (0%Z ≤ bv_signed wsize ∧ bv_signed wsize ≤ bv_signed abs_usize) ∧ value wp1 (bv_signed wsize) = value wp1 (bv_signed abs_usize) ∧ (bv_signed wsize = 0%Z ∨ 0%Z < bv_unsigned (pelts wp1 (offset wp1 + bv_signed wsize - 1%Z))) ∧ (bv_signed wsize = 0%Z ∨ Z.pow (18446744073709551615%Z + 1%Z) (bv_signed wsize - 1%Z) ≤ value wp1 (bv_signed wsize)) -> (if decide (0%Z ≤ bv_signed usize) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o10 : bv 32%N), bv_signed o10 = - bv_signed wsize -> (zones mpz3 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz3 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 u1 = readers mpz3 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz4 y = readers mpz3 y) -> (zones mpz4 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz4 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz5 : mpz_memo), abs_value_of mpz5 = abs_value_of mpz4 ∧ alloc mpz5 = alloc mpz4 ∧ abs_size mpz5 = abs_size mpz4 ∧ sgn mpz5 = sgn mpz4 ∧ zones mpz5 = zones mpz4 -> readers mpz5 v1 = readers mpz4 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz5 y = readers mpz4 y) -> value wp1 (Z.abs (bv_signed o10)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 o10 = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz5 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz5 v1 = 0%Z) ∧ readers mpz5 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz5 mpz) ∧ Z.abs (bv_signed o10) ≤ plength wp1 ∧ (¬ bv_signed o10 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o10) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o10))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))) else (zones mpz3 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz3 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 u1 = readers mpz3 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz4 y = readers mpz3 y) -> (zones mpz4 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz4 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz5 : mpz_memo), abs_value_of mpz5 = abs_value_of mpz4 ∧ alloc mpz5 = alloc mpz4 ∧ abs_size mpz5 = abs_size mpz4 ∧ sgn mpz5 = sgn mpz4 ∧ zones mpz5 = zones mpz4 -> readers mpz5 v1 = readers mpz4 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz5 y = readers mpz4 y) -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz5 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz5 v1 = 0%Z) ∧ readers mpz5 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz5 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp)))))) else (0%Z ≤ bv_signed abs_usize ∧ (valid wp (bv_signed abs_usize) ∧ valid up (bv_signed abs_usize) ∧ valid vp (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(x_b : bv 64%N), value wp1 (bv_signed abs_usize) - Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned x_b = value up (bv_signed abs_usize) - value vp (bv_signed abs_usize) ∧ (0%Z ≤ bv_unsigned x_b ∧ bv_unsigned x_b ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ value vp1 (bv_signed abs_usize) = value vp (bv_signed abs_usize) ∧ (min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up) ∧ (min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (0%Z ≤ bv_signed abs_usize ∧ valid wp1 (bv_signed abs_usize)) ∧ (∀(wsize : bv 32%N), (0%Z ≤ bv_signed wsize ∧ bv_signed wsize ≤ bv_signed abs_usize) ∧ value wp1 (bv_signed wsize) = value wp1 (bv_signed abs_usize) ∧ (bv_signed wsize = 0%Z ∨ 0%Z < bv_unsigned (pelts wp1 (offset wp1 + bv_signed wsize - 1%Z))) ∧ (bv_signed wsize = 0%Z ∨ Z.pow (18446744073709551615%Z + 1%Z) (bv_signed wsize - 1%Z) ≤ value wp1 (bv_signed wsize)) -> (if decide (bv_signed usize < 0%Z) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o10 : bv 32%N), bv_signed o10 = - bv_signed wsize -> (zones mpz3 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz3 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 u1 = readers mpz3 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz4 y = readers mpz3 y) -> (zones mpz4 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz4 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz5 : mpz_memo), abs_value_of mpz5 = abs_value_of mpz4 ∧ alloc mpz5 = alloc mpz4 ∧ abs_size mpz5 = abs_size mpz4 ∧ sgn mpz5 = sgn mpz4 ∧ zones mpz5 = zones mpz4 -> readers mpz5 v1 = readers mpz4 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz5 y = readers mpz4 y) -> value wp1 (Z.abs (bv_signed o10)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 o10 = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz5 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz5 v1 = 0%Z) ∧ readers mpz5 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz5 mpz) ∧ Z.abs (bv_signed o10) ≤ plength wp1 ∧ (¬ bv_signed o10 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o10) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o10))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp))) else (zones mpz3 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz3 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 u1 = readers mpz3 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz4 y = readers mpz3 y) -> (zones mpz4 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz4 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz5 : mpz_memo), abs_value_of mpz5 = abs_value_of mpz4 ∧ alloc mpz5 = alloc mpz4 ∧ abs_size mpz5 = abs_size mpz4 ∧ sgn mpz5 = sgn mpz4 ∧ zones mpz5 = zones mpz4 -> readers mpz5 v1 = readers mpz4 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz5 y = readers mpz4 y) -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz5 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz5 v1 = 0%Z) ∧ readers mpz5 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz5 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp)))))))))))))) ∧ (∀(wp1 : C.ptr (bv 64%N)) (wsize : bv 32%N) (mpz2 : mpz_memo), offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 - abs_value_of mpz1 v1) ∧ sgn_value wp1 wsize = value_of u mpz - value_of v mpz ∧ (mpz_eq u1 w ∨ readers mpz2 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz2 v1 = 0%Z) ∧ readers mpz2 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz2 mpz) ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (zones mpz2 w = zone1 wp1 ∧ readers mpz2 w = - 1%Z ∧ offset wp1 = 0%Z ∧ min wp1 = 0%Z ∧ C.max wp1 = plength wp1 ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ plength wp1 = alloc mpz2 w ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize)))) ∧ (∀(mpz3 : mpz_memo), alloc mpz3 = alloc mpz2 ∧ readers mpz3 = readers mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz3 mpz2) ∧ (sgn mpz3 w = 1%Z) = (0%Z ≤ bv_signed wsize) ∧ (sgn mpz3 w = - 1%Z) = (bv_signed wsize < 0%Z) ∧ abs_size mpz3 w = Z.abs (bv_signed wsize) ∧ abs_value_of mpz3 w = value wp1 (Z.abs (bv_signed wsize)) -> (zones mpz3 w = zone1 wp1 ∧ readers mpz3 w = - 1%Z ∧ min wp1 = 0%Z ∧ C.max wp1 = plength wp1 ∧ abs_value_of mpz3 w = value wp1 (abs_size mpz3 w)) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz4 y = readers mpz3 y) -> value_of w mpz4 = value_of u mpz - value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz4 mpz) ∧ readers mpz4 w = 0%Z ∧ readers mpz4 u = 0%Z ∧ readers mpz4 v = 0%Z))) else (if decide (mpz_eq u1 w) then 0%Z ≤ readers mpz1 v1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(vp : C.ptr (bv 64%N)), readers mpz2 v1 = readers mpz1 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz2 y = readers mpz1 y) ∧ value vp (abs_size mpz2 v1) = abs_value_of mpz2 v1 ∧ plength vp = alloc mpz2 v1 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = plength vp ∧ zone1 vp = zones mpz2 v1 -> ((0%Z ≤ bv_signed abs_vsize ∧ bv_signed abs_vsize ≤ bv_signed abs_usize) ∧ (valid wp (bv_signed abs_usize) ∧ valid vp (bv_signed abs_vsize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(o8 : bv 64%N), value wp1 (bv_signed abs_usize) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned o8 = value wp (bv_signed abs_usize) + value vp (bv_signed abs_vsize) ∧ (0%Z ≤ bv_unsigned o8 ∧ bv_unsigned o8 ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ value vp1 (bv_signed abs_vsize) = value vp (bv_signed abs_vsize) ∧ (min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp) ∧ min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp -> (zones mpz2 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz2 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 v1 = readers mpz2 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz3 y = readers mpz2 y) -> ((min wp1 ≤ offset wp1 + bv_signed abs_usize ∧ offset wp1 + bv_signed abs_usize < C.max wp1) ∧ writable wp1 = true) ∧ (∀(wp2 : C.ptr (bv 64%N)), length (data wp2) = length (data wp1) ∧ offset wp2 = offset wp1 ∧ min wp2 = min wp1 ∧ C.max wp2 = C.max wp1 ∧ writable wp2 = writable wp1 ∧ zone1 wp2 = zone1 wp1 -> pelts wp2 = fun_updt (pelts wp1) (offset wp2 + bv_signed abs_usize) o8 ∧ pelts wp2 (offset wp2 + bv_signed abs_usize) = o8 -> (bv_unsigned o8 ≤ 2147483647%Z ∧ (∀(o9 : bv 32%N), bv_signed o9 = bv_unsigned o8 -> int'32_in_bounds (bv_signed abs_usize + bv_signed o9) ∧ (∀(o10 : bv 32%N), bv_signed o10 = bv_signed abs_usize + bv_signed o9 -> (if decide (bv_unsigned o8 = 0%Z) then o10 = abs_usize else bv_signed o10 = bv_signed abs_usize + 1%Z)))) ∧ (∀(wsize : bv 32%N), (if decide (bv_unsigned o8 = 0%Z) then wsize = abs_usize else bv_signed wsize = bv_signed abs_usize + 1%Z) -> value wp2 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 + abs_value_of mpz1 v1) ∧ value wp2 (bv_signed wsize) = Z.abs (value_of u mpz - value_of v mpz) ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp2 (Z.abs (bv_signed wsize))) ∧ (min wp2 = min wp ∧ C.max wp2 = C.max wp ∧ plength wp2 = plength wp) ∧ bv_signed abs_usize ≤ bv_signed wsize ∧ bv_signed wsize ≤ plength wp2))))))) else if decide (mpz_eq v1 w) then 0%Z ≤ readers mpz1 u1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(up : C.ptr (bv 64%N)), readers mpz2 u1 = readers mpz1 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz2 y = readers mpz1 y) ∧ value up (abs_size mpz2 u1) = abs_value_of mpz2 u1 ∧ plength up = alloc mpz2 u1 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = plength up ∧ zone1 up = zones mpz2 u1 -> ((0%Z ≤ bv_signed abs_vsize ∧ bv_signed abs_vsize ≤ bv_signed abs_usize) ∧ (valid up (bv_signed abs_usize) ∧ valid wp (bv_signed abs_usize)) ∧ writable wp = true) ∧ (∀(up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(o8 : bv 64%N), value wp1 (bv_signed abs_usize) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned o8 = value up (bv_signed abs_usize) + value wp (bv_signed abs_vsize) ∧ (0%Z ≤ bv_unsigned o8 ∧ bv_unsigned o8 ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ (min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (zones mpz2 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz2 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> readers mpz3 u1 = readers mpz2 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz3 y = readers mpz2 y) -> ((min wp1 ≤ offset wp1 + bv_signed abs_usize ∧ offset wp1 + bv_signed abs_usize < C.max wp1) ∧ writable wp1 = true) ∧ (∀(wp2 : C.ptr (bv 64%N)), length (data wp2) = length (data wp1) ∧ offset wp2 = offset wp1 ∧ min wp2 = min wp1 ∧ C.max wp2 = C.max wp1 ∧ writable wp2 = writable wp1 ∧ zone1 wp2 = zone1 wp1 -> pelts wp2 = fun_updt (pelts wp1) (offset wp2 + bv_signed abs_usize) o8 ∧ pelts wp2 (offset wp2 + bv_signed abs_usize) = o8 -> (bv_unsigned o8 ≤ 2147483647%Z ∧ (∀(o9 : bv 32%N), bv_signed o9 = bv_unsigned o8 -> int'32_in_bounds (bv_signed abs_usize + bv_signed o9) ∧ (∀(o10 : bv 32%N), bv_signed o10 = bv_signed abs_usize + bv_signed o9 -> (if decide (bv_unsigned o8 = 0%Z) then o10 = abs_usize else bv_signed o10 = bv_signed abs_usize + 1%Z)))) ∧ (∀(wsize : bv 32%N), (if decide (bv_unsigned o8 = 0%Z) then wsize = abs_usize else bv_signed wsize = bv_signed abs_usize + 1%Z) -> value wp2 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 + abs_value_of mpz1 v1) ∧ value wp2 (bv_signed wsize) = Z.abs (value_of u mpz - value_of v mpz) ∧ (mpz_eq u1 w ∨ readers mpz3 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz3 v1 = 0%Z) ∧ readers mpz3 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz3 mpz) ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp2 (Z.abs (bv_signed wsize))) ∧ (min wp2 = min wp ∧ C.max wp2 = C.max wp ∧ plength wp2 = plength wp) ∧ bv_signed abs_usize ≤ bv_signed wsize ∧ bv_signed wsize ≤ plength wp2))))))) else 0%Z ≤ readers mpz1 u1 ∧ (∀(mpz2 : mpz_memo), abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> (∀(up : C.ptr (bv 64%N)), readers mpz2 u1 = readers mpz1 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz2 y = readers mpz1 y) ∧ value up (abs_size mpz2 u1) = abs_value_of mpz2 u1 ∧ plength up = alloc mpz2 u1 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = plength up ∧ zone1 up = zones mpz2 u1 -> 0%Z ≤ readers mpz2 v1 ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ alloc mpz3 = alloc mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(vp : C.ptr (bv 64%N)), readers mpz3 v1 = readers mpz2 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz3 y = readers mpz2 y) ∧ value vp (abs_size mpz3 v1) = abs_value_of mpz3 v1 ∧ plength vp = alloc mpz3 v1 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = plength vp ∧ zone1 vp = zones mpz3 v1 -> ((0%Z ≤ bv_signed abs_vsize ∧ bv_signed abs_vsize ≤ bv_signed abs_usize) ∧ (valid wp (bv_signed abs_usize) ∧ valid up (bv_signed abs_usize) ∧ valid vp (bv_signed abs_vsize)) ∧ writable wp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)) (up1 : C.ptr (bv 64%N)) (wp1 : C.ptr (bv 64%N)), offset vp1 = offset vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> offset up1 = offset up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(o8 : bv 64%N), value wp1 (bv_signed abs_usize) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed abs_usize) * bv_unsigned o8 = value up (bv_signed abs_usize) + value vp (bv_signed abs_vsize) ∧ (0%Z ≤ bv_unsigned o8 ∧ bv_unsigned o8 ≤ 1%Z) ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed abs_usize ≤ j -> pelts wp1 j = pelts wp j) ∧ (∀(j : Z), pelts up1 j = pelts up j) ∧ (∀(j : Z), pelts vp1 j = pelts vp j) ∧ value up1 (bv_signed abs_usize) = value up (bv_signed abs_usize) ∧ value vp1 (bv_signed abs_vsize) = value vp (bv_signed abs_vsize) ∧ (min up1 = min up ∧ C.max up1 = C.max up ∧ plength up1 = plength up) ∧ (min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ plength vp1 = plength vp) ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp -> (zones mpz3 u1 = zone1 up1 ∧ 1%Z ≤ readers mpz3 u1 ∧ min up1 = 0%Z ∧ C.max up1 = plength up1) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 u1 = readers mpz3 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz4 y = readers mpz3 y) -> (zones mpz4 v1 = zone1 vp1 ∧ 1%Z ≤ readers mpz4 v1 ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1) ∧ (∀(mpz5 : mpz_memo), abs_value_of mpz5 = abs_value_of mpz4 ∧ alloc mpz5 = alloc mpz4 ∧ abs_size mpz5 = abs_size mpz4 ∧ sgn mpz5 = sgn mpz4 ∧ zones mpz5 = zones mpz4 -> readers mpz5 v1 = readers mpz4 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz5 y = readers mpz4 y) -> ((min wp1 ≤ offset wp1 + bv_signed abs_usize ∧ offset wp1 + bv_signed abs_usize < C.max wp1) ∧ writable wp1 = true) ∧ (∀(wp2 : C.ptr (bv 64%N)), length (data wp2) = length (data wp1) ∧ offset wp2 = offset wp1 ∧ min wp2 = min wp1 ∧ C.max wp2 = C.max wp1 ∧ writable wp2 = writable wp1 ∧ zone1 wp2 = zone1 wp1 -> pelts wp2 = fun_updt (pelts wp1) (offset wp2 + bv_signed abs_usize) o8 ∧ pelts wp2 (offset wp2 + bv_signed abs_usize) = o8 -> (bv_unsigned o8 ≤ 2147483647%Z ∧ (∀(o9 : bv 32%N), bv_signed o9 = bv_unsigned o8 -> int'32_in_bounds (bv_signed abs_usize + bv_signed o9) ∧ (∀(o10 : bv 32%N), bv_signed o10 = bv_signed abs_usize + bv_signed o9 -> (if decide (bv_unsigned o8 = 0%Z) then o10 = abs_usize else bv_signed o10 = bv_signed abs_usize + 1%Z)))) ∧ (∀(wsize : bv 32%N), (if decide (bv_unsigned o8 = 0%Z) then wsize = abs_usize else bv_signed wsize = bv_signed abs_usize + 1%Z) -> value wp2 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 + abs_value_of mpz1 v1) ∧ value wp2 (bv_signed wsize) = Z.abs (value_of u mpz - value_of v mpz) ∧ (mpz_eq u1 w ∨ readers mpz5 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz5 v1 = 0%Z) ∧ readers mpz5 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz5 mpz) ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp2 (Z.abs (bv_signed wsize))) ∧ (min wp2 = min wp ∧ C.max wp2 = C.max wp ∧ plength wp2 = plength wp) ∧ bv_signed abs_usize ≤ bv_signed wsize ∧ bv_signed wsize ≤ plength wp2))))))))))) ∧ (∀(wp1 : C.ptr (bv 64%N)) (wsize : bv 32%N) (mpz2 : mpz_memo), offset wp1 = offset wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> abs_value_of mpz2 = abs_value_of mpz1 ∧ alloc mpz2 = alloc mpz1 ∧ abs_size mpz2 = abs_size mpz1 ∧ sgn mpz2 = sgn mpz1 ∧ zones mpz2 = zones mpz1 -> value wp1 (Z.abs (bv_signed wsize)) = Z.abs (abs_value_of mpz1 u1 + abs_value_of mpz1 v1) ∧ value wp1 (bv_signed wsize) = Z.abs (value_of u mpz - value_of v mpz) ∧ (mpz_eq u1 w ∨ readers mpz2 u1 = 0%Z) ∧ (mpz_eq v1 w ∨ readers mpz2 v1 = 0%Z) ∧ readers mpz2 w = - 1%Z ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz2 mpz) ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize))) ∧ (min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ plength wp1 = plength wp) ∧ bv_signed abs_usize ≤ bv_signed wsize ∧ bv_signed wsize ≤ plength wp1 -> (if decide (bv_signed usize < 0%Z) then int'32_in_bounds (- bv_signed wsize) ∧ (∀(o8 : bv 32%N), bv_signed o8 = - bv_signed wsize -> (zones mpz2 w = zone1 wp1 ∧ readers mpz2 w = - 1%Z ∧ offset wp1 = 0%Z ∧ min wp1 = 0%Z ∧ C.max wp1 = plength wp1 ∧ Z.abs (bv_signed o8) ≤ plength wp1 ∧ plength wp1 = alloc mpz2 w ∧ (¬ bv_signed o8 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o8) - 1%Z) ≤ value wp1 (Z.abs (bv_signed o8)))) ∧ (∀(mpz3 : mpz_memo), alloc mpz3 = alloc mpz2 ∧ readers mpz3 = readers mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz3 mpz2) ∧ (sgn mpz3 w = 1%Z) = (0%Z ≤ bv_signed o8) ∧ (sgn mpz3 w = - 1%Z) = (bv_signed o8 < 0%Z) ∧ abs_size mpz3 w = Z.abs (bv_signed o8) ∧ abs_value_of mpz3 w = value wp1 (Z.abs (bv_signed o8)) -> (zones mpz3 w = zone1 wp1 ∧ readers mpz3 w = - 1%Z ∧ min wp1 = 0%Z ∧ C.max wp1 = plength wp1 ∧ abs_value_of mpz3 w = value wp1 (abs_size mpz3 w)) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz4 y = readers mpz3 y) -> value_of w mpz4 = value_of u mpz - value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz4 mpz) ∧ readers mpz4 w = 0%Z ∧ readers mpz4 u = 0%Z ∧ readers mpz4 v = 0%Z))) else (zones mpz2 w = zone1 wp1 ∧ readers mpz2 w = - 1%Z ∧ offset wp1 = 0%Z ∧ min wp1 = 0%Z ∧ C.max wp1 = plength wp1 ∧ Z.abs (bv_signed wsize) ≤ plength wp1 ∧ plength wp1 = alloc mpz2 w ∧ (¬ bv_signed wsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed wsize) - 1%Z) ≤ value wp1 (Z.abs (bv_signed wsize)))) ∧ (∀(mpz3 : mpz_memo), alloc mpz3 = alloc mpz2 ∧ readers mpz3 = readers mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz3 mpz2) ∧ (sgn mpz3 w = 1%Z) = (0%Z ≤ bv_signed wsize) ∧ (sgn mpz3 w = - 1%Z) = (bv_signed wsize < 0%Z) ∧ abs_size mpz3 w = Z.abs (bv_signed wsize) ∧ abs_value_of mpz3 w = value wp1 (Z.abs (bv_signed wsize)) -> (zones mpz3 w = zone1 wp1 ∧ readers mpz3 w = - 1%Z ∧ min wp1 = 0%Z ∧ C.max wp1 = plength wp1 ∧ abs_value_of mpz3 w = value wp1 (abs_size mpz3 w)) ∧ (∀(mpz4 : mpz_memo), abs_value_of mpz4 = abs_value_of mpz3 ∧ alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 ∧ zones mpz4 = zones mpz3 -> readers mpz4 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz4 y = readers mpz3 y) -> value_of w mpz4 = value_of u mpz - value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz4 mpz) ∧ readers mpz4 w = 0%Z ∧ readers mpz4 u = 0%Z ∧ readers mpz4 v = 0%Z))))))))))))))).
Admitted.
