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.util.UtilOld.
Require Import multiprecision.compare.Compare.
Require Import multiprecision.add.Add.
Require Import multiprecision.add.AddOld.
Require Import multiprecision.sub.Sub.
Require Import multiprecision.sub.SubOld.
Require Import multiprecision.mul.Mul.
Require Import multiprecision.mul.Mul_basecase.
Require Import multiprecision.toom.Toom.
Require Import multiprecision.valuation.Valuation.
Require Import multiprecision.add_1.Add_1.
Require Import multiprecision.sub_1.Sub_1.
Require Import multiprecision.logical.LogicalUtil.
Require Import multiprecision.logical.Logical.
Require Import multiprecision.mpz.Z.
Require Import multiprecision.mpz.Zutil.
Open Scope Z_scope.
Lemma wmpz_mul'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 + abs_size mpz v ≤ 2147483647%Z) (fact7 : 8%Z * abs_size mpz u < 2147483647%Z) (fact8 : 8%Z * abs_size mpz v < 2147483647%Z) : - 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 -> (∀(sign_product : bv 32%N), (bv_signed o1 = 0%Z -> sign_product = o2) ∧ (bv_signed o2 = 0%Z -> sign_product = o1) ∧ (0%Z ≤ bv_signed o1 ∧ 0%Z ≤ bv_signed o2 ∨ bv_signed o1 < 0%Z ∧ bv_signed o2 < 0%Z -> 0%Z ≤ bv_signed sign_product) ∧ (bv_signed o1 < 0%Z ∧ 0%Z ≤ bv_signed o2 ∨ 0%Z ≤ bv_signed o1 ∧ bv_signed o2 < 0%Z -> bv_signed sign_product < 0%Z) -> - 2147483648%Z < bv_signed o1 ∧ (∀(o3 : bv 32%N), bv_signed o3 = Z.abs (bv_signed o1) -> - 2147483648%Z < bv_signed o2 ∧ (∀(o4 : bv 32%N), bv_signed o4 = Z.abs (bv_signed o2) -> (if decide (bv_signed o3 < bv_signed o4) 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 o4 ∧ abs_size mpz u = bv_signed o3) ∧ (1%Z ≤ alloc mpz v ∧ 1%Z ≤ alloc mpz u) ∧ bv_signed o3 ≤ bv_signed o4 ∧ bv_signed o4 + bv_signed o3 ≤ 2147483647%Z ∧ 8%Z * bv_signed o4 < 2147483647%Z ∧ (readers mpz w = 0%Z ∧ readers mpz v = 0%Z ∧ readers mpz u = 0%Z) ∧ abs_value_of mpz v * abs_value_of mpz u = abs_value_of mpz u * abs_value_of mpz v ∧ value_of v mpz * value_of u mpz = value_of u mpz * value_of v mpz ∧ (v = u ∧ u = v ∨ True)) else (abs_size mpz u = bv_signed o3 ∧ abs_size mpz v = bv_signed o4) ∧ (1%Z ≤ alloc mpz u ∧ 1%Z ≤ alloc mpz v) ∧ bv_signed o4 ≤ bv_signed o3 ∧ bv_signed o3 + bv_signed o4 ≤ 2147483647%Z ∧ 8%Z * bv_signed o3 < 2147483647%Z ∧ readers mpz w = 0%Z ∧ readers mpz u = 0%Z ∧ readers mpz v = 0%Z) ∧ (∀(vsize : bv 32%N) (usize : bv 32%N) (v1 : mpz_ptr) (u1 : mpz_ptr), (abs_size mpz u1 = bv_signed usize ∧ abs_size mpz v1 = bv_signed vsize) ∧ (1%Z ≤ alloc mpz u1 ∧ 1%Z ≤ alloc mpz v1) ∧ bv_signed vsize ≤ bv_signed usize ∧ bv_signed usize + bv_signed vsize ≤ 2147483647%Z ∧ 8%Z * bv_signed usize < 2147483647%Z ∧ (readers mpz w = 0%Z ∧ readers mpz u1 = 0%Z ∧ readers mpz v1 = 0%Z) ∧ abs_value_of mpz u1 * abs_value_of mpz v1 = abs_value_of mpz u * abs_value_of mpz v ∧ value_of u1 mpz * value_of v1 mpz = value_of u mpz * value_of v mpz ∧ (u1 = u ∧ v1 = v ∨ u1 = v ∧ v1 = u) -> (∀(o5 : bool), (bv_signed vsize = bv_signed (0%bv : bv 32%N) -> o5 = true) ∧ (o5 = true -> vsize = (0%bv : bv 32%N)) -> (if decide (o5 = true) 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 mpz_eq u1 w = (u1 = w) -> mpz_eq v1 w = (v1 = w) -> (∀(o6 : bool), (bv_signed vsize = bv_signed (1%bv : bv 32%N) -> o6 = true) ∧ (o6 = true -> vsize = (1%bv : bv 32%N)) -> (if decide (o6 = true) then 0%Z ≤ readers mpz v1 ∧ (∀(mpz1 : mpz_memo), abs_value_of mpz1 = abs_value_of mpz ∧ alloc mpz1 = alloc mpz ∧ abs_size mpz1 = abs_size mpz ∧ sgn mpz1 = sgn mpz ∧ zones mpz1 = zones mpz -> (∀(vp : C.ptr (bv 64%N)), readers mpz1 v1 = readers mpz v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz1 y = readers mpz y) ∧ value vp (abs_size mpz1 v1) = abs_value_of mpz1 v1 ∧ plength vp = alloc mpz1 v1 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = plength vp ∧ zone1 vp = zones mpz1 v1 -> (min vp ≤ offset vp ∧ offset vp < C.max vp) ∧ (let v0 : bv 64%N := pelts vp (offset vp) in (zones mpz1 v1 = zone1 vp ∧ 1%Z ≤ readers mpz1 v1 ∧ min vp = 0%Z ∧ C.max vp = plength vp) ∧ (∀(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 -> readers mpz2 v1 = readers mpz1 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz2 y = readers mpz1 y) -> int'32_in_bounds (bv_signed usize + 1%Z) ∧ (∀(o7 : bv 32%N), bv_signed o7 = bv_signed usize + 1%Z -> (readers mpz2 w = 0%Z ∧ 1%Z ≤ alloc mpz2 w) ∧ (∀(mpz3 : mpz_memo), sgn mpz3 = sgn mpz2 -> (∀(wp : C.ptr (bv 64%N)), (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz3 mpz2) ∧ readers mpz3 w = - 1%Z ∧ abs_value_of mpz3 w = value wp (abs_size mpz3 w) ∧ zones mpz3 w = zone1 wp ∧ offset wp = 0%Z ∧ plength wp = alloc mpz3 w ∧ min wp = 0%Z ∧ C.max wp = plength wp ∧ writable wp = true ∧ abs_size mpz3 w = abs_size mpz2 w ∧ value wp (abs_size mpz2 w) = abs_value_of mpz2 w ∧ (if decide (alloc mpz2 w < bv_signed o7) then alloc mpz3 w = bv_signed o7 else alloc mpz3 w = alloc mpz2 w) -> (if decide (mpz_eq u1 w) then (valid wp (bv_signed usize) ∧ writable wp = true) ∧ (∀(wp1 : C.ptr (bv 64%N)), length (data wp1) = length (data wp) ∧ offset wp1 = offset wp ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(cy : bv 64%N), value wp1 (bv_signed usize) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed usize) * bv_unsigned cy = value wp (bv_signed usize) * bv_unsigned v0 ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed usize ≤ j -> pelts wp1 j = pelts wp j) -> ((min wp1 ≤ offset wp1 + bv_signed usize ∧ offset wp1 + bv_signed 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 usize) cy ∧ pelts wp2 (offset wp2 + bv_signed usize) = cy -> (∀(o8 : bool), (bv_unsigned cy = bv_unsigned (0%bv : bv 64%N) -> o8 = true) ∧ (o8 = true -> cy = (0%bv : bv 64%N)) -> (∀(o9 : bv 32%N), (if decide (¬ o8 = true) then o9 = (1%bv : bv 32%N) else o9 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed usize + bv_signed o9) ∧ (∀(o10 : bv 32%N), bv_signed o10 = bv_signed usize + bv_signed o9 -> ((¬ 0%Z ≤ bv_signed sign_product -> int'32_in_bounds (- bv_signed o10) ∧ (∀(us : bv 32%N), bv_signed us = - bv_signed o10 -> int'32_in_bounds (- bv_signed o10))) ∧ (∀(result : bv 32%N), (if decide (0%Z ≤ bv_signed sign_product) then result = o10 else ∃(us : bv 32%N), bv_signed us = - bv_signed o10 ∧ bv_signed result = - bv_signed o10) -> sgn_value wp2 result = value_of u mpz * value_of v mpz ∧ Z.abs (bv_signed result) = bv_signed o10)) ∧ (∀(wsize : bv 32%N), sgn_value wp2 wsize = value_of u mpz * value_of v mpz ∧ Z.abs (bv_signed wsize) = bv_signed o10 -> (zones mpz3 w = zone1 wp2 ∧ readers mpz3 w = - 1%Z ∧ offset wp2 = 0%Z ∧ min wp2 = 0%Z ∧ C.max wp2 = plength wp2 ∧ Z.abs (bv_signed wsize) ≤ plength wp2 ∧ plength wp2 = alloc mpz3 w ∧ (¬ 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)))) ∧ (∀(mpz4 : mpz_memo), alloc mpz4 = alloc mpz3 ∧ readers mpz4 = readers mpz3 ∧ zones mpz4 = zones mpz3 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz4 mpz3) ∧ (sgn mpz4 w = 1%Z) = (0%Z ≤ bv_signed wsize) ∧ (sgn mpz4 w = - 1%Z) = (bv_signed wsize < 0%Z) ∧ abs_size mpz4 w = Z.abs (bv_signed wsize) ∧ abs_value_of mpz4 w = value wp2 (Z.abs (bv_signed wsize)) -> (zones mpz4 w = zone1 wp2 ∧ readers mpz4 w = - 1%Z ∧ min wp2 = 0%Z ∧ C.max wp2 = plength wp2 ∧ abs_value_of mpz4 w = value wp2 (abs_size mpz4 w)) ∧ (∀(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 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz5 y = readers mpz4 y) -> value_of w mpz5 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz5 mpz) ∧ readers mpz5 w = 0%Z ∧ readers mpz5 u = 0%Z ∧ readers mpz5 v = 0%Z))))))))) else mpz_unchanged u1 mpz3 mpz ∧ (readers mpz3 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz3 u1 -> abs_value_of mpz3 u1 = abs_value_of mpz u1 ∧ alloc mpz3 u1 = alloc mpz u1 ∧ abs_size mpz3 u1 = abs_size mpz u1 ∧ sgn mpz3 u1 = sgn mpz u1 ∧ readers mpz3 u1 = readers mpz u1 ∧ zones mpz3 u1 = zones mpz u1) -> 0%Z ≤ readers mpz3 u1 ∧ (∀(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 -> (∀(up : C.ptr (bv 64%N)), readers mpz4 u1 = readers mpz3 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz4 y = readers mpz3 y) ∧ value up (abs_size mpz4 u1) = abs_value_of mpz4 u1 ∧ plength up = alloc mpz4 u1 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = plength up ∧ zone1 up = zones mpz4 u1 -> (valid up (bv_signed usize) ∧ valid wp (bv_signed usize) ∧ writable wp = true) ∧ (∀(wp1 : C.ptr (bv 64%N)), length (data wp1) = length (data wp) ∧ offset wp1 = offset wp ∧ min wp1 = min wp ∧ C.max wp1 = C.max wp ∧ writable wp1 = writable wp ∧ zone1 wp1 = zone1 wp -> (∀(cy : bv 64%N), value wp1 (bv_signed usize) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed usize) * bv_unsigned cy = value up (bv_signed usize) * bv_unsigned v0 ∧ (∀(j : Z), j < offset wp1 ∨ offset wp1 + bv_signed usize ≤ j -> pelts wp1 j = pelts wp j) -> (zones mpz4 u1 = zone1 up ∧ 1%Z ≤ readers mpz4 u1 ∧ min up = 0%Z ∧ C.max up = plength up) ∧ (∀(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 u1 = readers mpz4 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz5 y = readers mpz4 y) -> ((min wp1 ≤ offset wp1 + bv_signed usize ∧ offset wp1 + bv_signed 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 usize) cy ∧ pelts wp2 (offset wp2 + bv_signed usize) = cy -> (∀(o8 : bool), (bv_unsigned cy = bv_unsigned (0%bv : bv 64%N) -> o8 = true) ∧ (o8 = true -> cy = (0%bv : bv 64%N)) -> (∀(o9 : bv 32%N), (if decide (¬ o8 = true) then o9 = (1%bv : bv 32%N) else o9 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed usize + bv_signed o9) ∧ (∀(o10 : bv 32%N), bv_signed o10 = bv_signed usize + bv_signed o9 -> ((¬ 0%Z ≤ bv_signed sign_product -> int'32_in_bounds (- bv_signed o10) ∧ (∀(us : bv 32%N), bv_signed us = - bv_signed o10 -> int'32_in_bounds (- bv_signed o10))) ∧ (∀(result : bv 32%N), (if decide (0%Z ≤ bv_signed sign_product) then result = o10 else ∃(us : bv 32%N), bv_signed us = - bv_signed o10 ∧ bv_signed result = - bv_signed o10) -> sgn_value wp2 result = value_of u mpz * value_of v mpz ∧ Z.abs (bv_signed result) = bv_signed o10)) ∧ (∀(wsize : bv 32%N), sgn_value wp2 wsize = value_of u mpz * value_of v mpz ∧ Z.abs (bv_signed wsize) = bv_signed o10 -> (zones mpz5 w = zone1 wp2 ∧ readers mpz5 w = - 1%Z ∧ offset wp2 = 0%Z ∧ min wp2 = 0%Z ∧ C.max wp2 = plength wp2 ∧ Z.abs (bv_signed wsize) ≤ plength wp2 ∧ plength wp2 = alloc mpz5 w ∧ (¬ 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)))) ∧ (∀(mpz6 : mpz_memo), alloc mpz6 = alloc mpz5 ∧ readers mpz6 = readers mpz5 ∧ zones mpz6 = zones mpz5 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz6 mpz5) ∧ (sgn mpz6 w = 1%Z) = (0%Z ≤ bv_signed wsize) ∧ (sgn mpz6 w = - 1%Z) = (bv_signed wsize < 0%Z) ∧ abs_size mpz6 w = Z.abs (bv_signed wsize) ∧ abs_value_of mpz6 w = value wp2 (Z.abs (bv_signed wsize)) -> (zones mpz6 w = zone1 wp2 ∧ readers mpz6 w = - 1%Z ∧ min wp2 = 0%Z ∧ C.max wp2 = plength wp2 ∧ abs_value_of mpz6 w = value wp2 (abs_size mpz6 w)) ∧ (∀(mpz7 : mpz_memo), abs_value_of mpz7 = abs_value_of mpz6 ∧ alloc mpz7 = alloc mpz6 ∧ abs_size mpz7 = abs_size mpz6 ∧ sgn mpz7 = sgn mpz6 ∧ zones mpz7 = zones mpz6 -> readers mpz7 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz7 y = readers mpz6 y) -> value_of w mpz7 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz7 mpz) ∧ readers mpz7 w = 0%Z ∧ readers mpz7 u = 0%Z ∧ readers mpz7 v = 0%Z))))))))))))))))))))) else int'32_in_bounds (bv_signed usize + bv_signed vsize) ∧ (∀(o7 : bv 32%N), bv_signed o7 = bv_signed usize + bv_signed vsize -> - 2%Z < readers mpz w ∧ (∀(o8 : bv 32%N), bv_signed o8 = alloc mpz w -> (if decide (bv_signed o8 < bv_signed o7) then ∀(mpz1 : mpz_memo) (memw : mpz_mem), Zutil.ok memw = true ∧ readers mpz1 (Zutil.ptr memw) = 0%Z ∧ alloc mpz1 (Zutil.ptr memw) = 0%Z ∧ abs_size mpz1 (Zutil.ptr memw) = 0%Z ∧ readers mpz (Zutil.ptr memw) = - 2%Z ∧ (∀(x : mpz_ptr), ¬ x = Zutil.ptr memw -> mpz_unchanged x mpz1 mpz) -> readers mpz1 (Zutil.ptr memw) = 0%Z ∧ (∀(mpz2 : mpz_memo), (∀(x : mpz_ptr), ¬ x = Zutil.ptr memw -> mpz_unchanged x mpz2 mpz1) ∧ readers mpz2 (Zutil.ptr memw) = 0%Z ∧ abs_value_of mpz2 (Zutil.ptr memw) = 0%Z ∧ abs_size mpz2 (Zutil.ptr memw) = 0%Z ∧ sgn mpz2 (Zutil.ptr memw) = 1%Z ∧ alloc mpz2 (Zutil.ptr memw) = 1%Z ∧ ¬ zones mpz2 (Zutil.ptr memw) = null_zone -> (readers mpz2 (Zutil.ptr memw) = 0%Z ∧ 1%Z ≤ alloc mpz2 (Zutil.ptr memw)) ∧ (∀(mpz3 : mpz_memo), sgn mpz3 = sgn mpz2 -> (∀(wp' : C.ptr (bv 64%N)), (∀(y : mpz_ptr), ¬ y = Zutil.ptr memw -> mpz_unchanged y mpz3 mpz2) ∧ readers mpz3 (Zutil.ptr memw) = - 1%Z ∧ abs_value_of mpz3 (Zutil.ptr memw) = value wp' (abs_size mpz3 (Zutil.ptr memw)) ∧ zones mpz3 (Zutil.ptr memw) = zone1 wp' ∧ offset wp' = 0%Z ∧ plength wp' = alloc mpz3 (Zutil.ptr memw) ∧ min wp' = 0%Z ∧ C.max wp' = plength wp' ∧ writable wp' = true ∧ abs_size mpz3 (Zutil.ptr memw) = abs_size mpz2 (Zutil.ptr memw) ∧ value wp' (abs_size mpz2 (Zutil.ptr memw)) = abs_value_of mpz2 (Zutil.ptr memw) ∧ (if decide (alloc mpz2 (Zutil.ptr memw) < bv_signed o7) then alloc mpz3 (Zutil.ptr memw) = bv_signed o7 else alloc mpz3 (Zutil.ptr memw) = alloc mpz2 (Zutil.ptr memw)) -> mpz_unchanged u1 mpz3 mpz ∧ (readers mpz3 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz3 u1 -> abs_value_of mpz3 u1 = abs_value_of mpz u1 ∧ alloc mpz3 u1 = alloc mpz u1 ∧ abs_size mpz3 u1 = abs_size mpz u1 ∧ sgn mpz3 u1 = sgn mpz u1 ∧ readers mpz3 u1 = readers mpz u1 ∧ zones mpz3 u1 = zones mpz u1) -> mpz_unchanged v1 mpz3 mpz ∧ (readers mpz3 v1 = readers mpz v1 ∧ (- 2%Z < readers mpz3 v1 -> abs_value_of mpz3 v1 = abs_value_of mpz v1 ∧ alloc mpz3 v1 = alloc mpz v1 ∧ abs_size mpz3 v1 = abs_size mpz v1 ∧ sgn mpz3 v1 = sgn mpz v1 ∧ readers mpz3 v1 = readers mpz v1 ∧ zones mpz3 v1 = zones mpz v1) -> mpz_unchanged w mpz3 mpz ∧ (readers mpz3 w = readers mpz w ∧ (- 2%Z < readers mpz3 w -> abs_value_of mpz3 w = abs_value_of mpz w ∧ alloc mpz3 w = alloc mpz w ∧ abs_size mpz3 w = abs_size mpz w ∧ sgn mpz3 w = sgn mpz w ∧ readers mpz3 w = readers mpz w ∧ zones mpz3 w = zones mpz w) -> (zones mpz3 (Zutil.ptr memw) = zone1 wp' ∧ readers mpz3 (Zutil.ptr memw) = - 1%Z ∧ min wp' = 0%Z ∧ C.max wp' = plength wp' ∧ abs_value_of mpz3 (Zutil.ptr memw) = value wp' (abs_size mpz3 (Zutil.ptr memw))) ∧ (∀(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 (Zutil.ptr memw) = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr memw -> readers mpz4 y = readers mpz3 y) -> 0%Z ≤ readers mpz4 u1 ∧ (∀(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 -> (∀(up' : C.ptr (bv 64%N)), readers mpz5 u1 = readers mpz4 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz5 y = readers mpz4 y) ∧ value up' (abs_size mpz5 u1) = abs_value_of mpz5 u1 ∧ plength up' = alloc mpz5 u1 ∧ offset up' = 0%Z ∧ min up' = 0%Z ∧ C.max up' = plength up' ∧ zone1 up' = zones mpz5 u1 -> 0%Z ≤ readers mpz5 v1 ∧ (∀(mpz6 : mpz_memo), abs_value_of mpz6 = abs_value_of mpz5 ∧ alloc mpz6 = alloc mpz5 ∧ abs_size mpz6 = abs_size mpz5 ∧ sgn mpz6 = sgn mpz5 ∧ zones mpz6 = zones mpz5 -> (∀(vp' : C.ptr (bv 64%N)), readers mpz6 v1 = readers mpz5 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz6 y = readers mpz5 y) ∧ value vp' (abs_size mpz6 v1) = abs_value_of mpz6 v1 ∧ plength vp' = alloc mpz6 v1 ∧ offset vp' = 0%Z ∧ min vp' = 0%Z ∧ C.max vp' = plength vp' ∧ zone1 vp' = zones mpz6 v1 -> mpz_unchanged (Zutil.ptr memw) mpz6 mpz4 ∧ (readers mpz6 (Zutil.ptr memw) = readers mpz4 (Zutil.ptr memw) ∧ (- 2%Z < readers mpz6 (Zutil.ptr memw) -> abs_value_of mpz6 (Zutil.ptr memw) = abs_value_of mpz4 (Zutil.ptr memw) ∧ alloc mpz6 (Zutil.ptr memw) = alloc mpz4 (Zutil.ptr memw) ∧ abs_size mpz6 (Zutil.ptr memw) = abs_size mpz4 (Zutil.ptr memw) ∧ sgn mpz6 (Zutil.ptr memw) = sgn mpz4 (Zutil.ptr memw) ∧ readers mpz6 (Zutil.ptr memw) = readers mpz4 (Zutil.ptr memw) ∧ zones mpz6 (Zutil.ptr memw) = zones mpz4 (Zutil.ptr memw)) -> readers mpz6 (Zutil.ptr memw) = 0%Z ∧ (∀(mpz7 : mpz_memo), abs_value_of mpz7 = abs_value_of mpz6 ∧ alloc mpz7 = alloc mpz6 ∧ abs_size mpz7 = abs_size mpz6 ∧ sgn mpz7 = sgn mpz6 ∧ zones mpz7 = zones mpz6 -> (∀(wp'1 : C.ptr (bv 64%N)), readers mpz7 (Zutil.ptr memw) = - 1%Z ∧ (∀(y : mpz_ptr), ¬ Zutil.ptr memw = y -> readers mpz7 y = readers mpz6 y) ∧ value wp'1 (abs_size mpz7 (Zutil.ptr memw)) = abs_value_of mpz7 (Zutil.ptr memw) ∧ plength wp'1 = alloc mpz7 (Zutil.ptr memw) ∧ offset wp'1 = 0%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ writable wp'1 = true ∧ zone1 wp'1 = zones mpz7 (Zutil.ptr memw) -> mpz_unchanged u1 mpz7 mpz6 ∧ (readers mpz7 u1 = readers mpz6 u1 ∧ (- 2%Z < readers mpz7 u1 -> abs_value_of mpz7 u1 = abs_value_of mpz6 u1 ∧ alloc mpz7 u1 = alloc mpz6 u1 ∧ abs_size mpz7 u1 = abs_size mpz6 u1 ∧ sgn mpz7 u1 = sgn mpz6 u1 ∧ readers mpz7 u1 = readers mpz6 u1 ∧ zones mpz7 u1 = zones mpz6 u1) -> mpz_unchanged v1 mpz7 mpz6 ∧ (readers mpz7 v1 = readers mpz6 v1 ∧ (- 2%Z < readers mpz7 v1 -> abs_value_of mpz7 v1 = abs_value_of mpz6 v1 ∧ alloc mpz7 v1 = alloc mpz6 v1 ∧ abs_size mpz7 v1 = abs_size mpz6 v1 ∧ sgn mpz7 v1 = sgn mpz6 v1 ∧ readers mpz7 v1 = readers mpz6 v1 ∧ zones mpz7 v1 = zones mpz6 v1) -> (valid up' (bv_signed usize) ∧ valid vp' (bv_signed vsize) ∧ valid wp'1 (bv_signed usize + bv_signed vsize) ∧ writable wp'1 = true ∧ (0%Z < bv_signed vsize ∧ bv_signed vsize ≤ bv_signed usize) ∧ 8%Z * bv_signed usize < 2147483647%Z ∧ bv_signed usize ≤ bv_signed (29%bv : bv 32%N) * Z.pow 2%Z 64%Z ∧ 0%Z ≤ 64%Z ∧ 64%Z ≤ 64%Z) ∧ (∀(wp'2 : C.ptr (bv 64%N)), offset wp'2 = offset wp'1 ∧ writable wp'2 = writable wp'1 ∧ zone1 wp'2 = zone1 wp'1 -> min wp'2 = min wp'1 ∧ C.max wp'2 = C.max wp'1 ∧ plength wp'2 = plength wp'1 ∧ value wp'2 (bv_signed usize + bv_signed vsize) = value up' (bv_signed usize) * value vp' (bv_signed vsize) ∧ (∀(j : Z), min wp'2 ≤ j ∧ j < offset wp'2 ∨ offset wp'2 + bv_signed usize + bv_signed vsize ≤ j ∧ j < C.max wp'2 -> pelts wp'2 j = pelts wp'1 j) -> (∀(o9 : bool), (bv_unsigned (pelts wp'2 (offset wp'2 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o9 = true) ∧ (o9 = true -> pelts wp'2 (offset wp'2 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o10 : bv 32%N), (if decide (o9 = true) then o10 = (1%bv : bv 32%N) else o10 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o10) ∧ (∀(wsize' : bv 32%N), bv_signed wsize' = bv_signed o7 - bv_signed o10 -> (zones mpz7 u1 = zone1 up' ∧ 1%Z ≤ readers mpz7 u1 ∧ min up' = 0%Z ∧ C.max up' = plength up') ∧ (∀(mpz8 : mpz_memo), abs_value_of mpz8 = abs_value_of mpz7 ∧ alloc mpz8 = alloc mpz7 ∧ abs_size mpz8 = abs_size mpz7 ∧ sgn mpz8 = sgn mpz7 ∧ zones mpz8 = zones mpz7 -> readers mpz8 u1 = readers mpz7 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz8 y = readers mpz7 y) -> mpz_eq u1 v1 = (u1 = v1) -> (¬ mpz_eq u1 v1 -> mpz_unchanged v1 mpz8 mpz6) ∧ ((¬ mpz_eq u1 v1 -> readers mpz8 v1 = readers mpz6 v1 ∧ (- 2%Z < readers mpz8 v1 -> abs_value_of mpz8 v1 = abs_value_of mpz6 v1 ∧ alloc mpz8 v1 = alloc mpz6 v1 ∧ abs_size mpz8 v1 = abs_size mpz6 v1 ∧ sgn mpz8 v1 = sgn mpz6 v1 ∧ readers mpz8 v1 = readers mpz6 v1 ∧ zones mpz8 v1 = zones mpz6 v1)) -> (zones mpz8 v1 = zone1 vp' ∧ 1%Z ≤ readers mpz8 v1 ∧ min vp' = 0%Z ∧ C.max vp' = plength vp') ∧ (∀(mpz9 : mpz_memo), abs_value_of mpz9 = abs_value_of mpz8 ∧ alloc mpz9 = alloc mpz8 ∧ abs_size mpz9 = abs_size mpz8 ∧ sgn mpz9 = sgn mpz8 ∧ zones mpz9 = zones mpz8 -> readers mpz9 v1 = readers mpz8 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz9 y = readers mpz8 y) -> mpz_unchanged (Zutil.ptr memw) mpz9 mpz7 ∧ (readers mpz9 (Zutil.ptr memw) = readers mpz7 (Zutil.ptr memw) ∧ (- 2%Z < readers mpz9 (Zutil.ptr memw) -> abs_value_of mpz9 (Zutil.ptr memw) = abs_value_of mpz7 (Zutil.ptr memw) ∧ alloc mpz9 (Zutil.ptr memw) = alloc mpz7 (Zutil.ptr memw) ∧ abs_size mpz9 (Zutil.ptr memw) = abs_size mpz7 (Zutil.ptr memw) ∧ sgn mpz9 (Zutil.ptr memw) = sgn mpz7 (Zutil.ptr memw) ∧ readers mpz9 (Zutil.ptr memw) = readers mpz7 (Zutil.ptr memw) ∧ zones mpz9 (Zutil.ptr memw) = zones mpz7 (Zutil.ptr memw)) -> (if decide True then readers mpz9 w = 0%Z ∧ (∀(mpz10 : mpz_memo), abs_value_of mpz10 = abs_value_of mpz9 ∧ alloc mpz10 = alloc mpz9 ∧ abs_size mpz10 = abs_size mpz9 ∧ sgn mpz10 = sgn mpz9 ∧ zones mpz10 = zones mpz9 -> (∀(wp : C.ptr (bv 64%N)), readers mpz10 w = - 1%Z ∧ (∀(y : mpz_ptr), ¬ w = y -> readers mpz10 y = readers mpz9 y) ∧ value wp (abs_size mpz10 w) = abs_value_of mpz10 w ∧ plength wp = alloc mpz10 w ∧ offset wp = 0%Z ∧ min wp = 0%Z ∧ C.max wp = plength wp ∧ writable wp = true ∧ zone1 wp = zones mpz10 w -> (offset wp = 0%Z ∧ min wp = 0%Z ∧ C.max wp = plength wp ∧ writable wp = true) ∧ (abs_size mpz10 w ≤ bv_signed o7 ∧ - 1%Z ≤ readers mpz10 w ∧ readers mpz10 w ≤ 0%Z) ∧ (∀(mpz11 : mpz_memo), abs_value_of mpz11 = abs_value_of mpz10 ∧ abs_size mpz11 = abs_size mpz10 ∧ sgn mpz11 = sgn mpz10 ∧ readers mpz11 = readers mpz10 ∧ zones mpz11 = zones mpz10 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz11 mpz10) ∧ alloc mpz11 w = bv_signed o7 -> (Zutil.ok memw = true ∧ - 1%Z ≤ readers mpz11 (Zutil.ptr memw) ∧ readers mpz11 (Zutil.ptr memw) ≤ 0%Z) ∧ (∀(mpz12 : mpz_memo), readers mpz12 (Zutil.ptr memw) = - 2%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr memw -> mpz_unchanged y mpz12 mpz11) -> mpz_eq u1 w = (u1 = w) -> (¬ mpz_eq u1 w -> mpz_unchanged u1 mpz12 mpz9) ∧ ((¬ mpz_eq u1 w -> readers mpz12 u1 = readers mpz9 u1 ∧ (- 2%Z < readers mpz12 u1 -> abs_value_of mpz12 u1 = abs_value_of mpz9 u1 ∧ alloc mpz12 u1 = alloc mpz9 u1 ∧ abs_size mpz12 u1 = abs_size mpz9 u1 ∧ sgn mpz12 u1 = sgn mpz9 u1 ∧ readers mpz12 u1 = readers mpz9 u1 ∧ zones mpz12 u1 = zones mpz9 u1)) -> mpz_eq v1 w = (v1 = w) -> (¬ mpz_eq v1 w -> mpz_unchanged v1 mpz12 mpz9) ∧ ((¬ mpz_eq v1 w -> readers mpz12 v1 = readers mpz9 v1 ∧ (- 2%Z < readers mpz12 v1 -> abs_value_of mpz12 v1 = abs_value_of mpz9 v1 ∧ alloc mpz12 v1 = alloc mpz9 v1 ∧ abs_size mpz12 v1 = abs_size mpz9 v1 ∧ sgn mpz12 v1 = sgn mpz9 v1 ∧ readers mpz12 v1 = readers mpz9 v1 ∧ zones mpz12 v1 = zones mpz9 v1)) -> mpz_unchanged w mpz12 mpz11 ∧ (readers mpz12 w = readers mpz11 w ∧ (- 2%Z < readers mpz12 w -> abs_value_of mpz12 w = abs_value_of mpz11 w ∧ alloc mpz12 w = alloc mpz11 w ∧ abs_size mpz12 w = abs_size mpz11 w ∧ sgn mpz12 w = sgn mpz11 w ∧ readers mpz12 w = readers mpz11 w ∧ zones mpz12 w = zones mpz11 w) -> (∀(o11 : bool), (bv_unsigned (pelts wp'2 (offset wp'2 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o11 = true) ∧ (o11 = true -> pelts wp'2 (offset wp'2 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o12 : bv 32%N), (if decide (o11 = true) then o12 = (1%bv : bv 32%N) else o12 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o12) ∧ (∀(o13 : bv 32%N), bv_signed o13 = bv_signed o7 - bv_signed o12 -> (bv_signed sign_product < 0%Z -> int'32_in_bounds (- bv_signed o13)) ∧ (∀(o14 : bv 32%N), (if decide (bv_signed sign_product < 0%Z) then bv_signed o14 = - bv_signed o13 else o14 = o13) -> (offset wp'2 = 0%Z ∧ writable wp'2 = true ∧ min wp'2 = 0%Z ∧ C.max wp'2 = plength wp'2 ∧ plength wp'2 = alloc mpz12 w ∧ (readers mpz12 w = 0%Z ∨ readers mpz12 w = - 1%Z)) ∧ (∀(mpz13 : mpz_memo), alloc mpz13 = alloc mpz12 ∧ abs_size mpz13 = abs_size mpz12 ∧ sgn mpz13 = sgn mpz12 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz13 mpz12) ∧ abs_value_of mpz13 w = value wp'2 (abs_size mpz13 w) ∧ readers mpz13 w = - 1%Z ∧ zones mpz13 w = zone1 wp'2 -> (zones mpz13 w = zone1 wp'2 ∧ readers mpz13 w = - 1%Z ∧ offset wp'2 = 0%Z ∧ min wp'2 = 0%Z ∧ C.max wp'2 = plength wp'2 ∧ Z.abs (bv_signed o14) ≤ plength wp'2 ∧ plength wp'2 = alloc mpz13 w ∧ (¬ bv_signed o14 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o14) - 1%Z) ≤ value wp'2 (Z.abs (bv_signed o14)))) ∧ (∀(mpz14 : mpz_memo), alloc mpz14 = alloc mpz13 ∧ readers mpz14 = readers mpz13 ∧ zones mpz14 = zones mpz13 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz14 mpz13) ∧ (sgn mpz14 w = 1%Z) = (0%Z ≤ bv_signed o14) ∧ (sgn mpz14 w = - 1%Z) = (bv_signed o14 < 0%Z) ∧ abs_size mpz14 w = Z.abs (bv_signed o14) ∧ abs_value_of mpz14 w = value wp'2 (Z.abs (bv_signed o14)) -> mpz_eq w (Zutil.ptr memw) = (w = Zutil.ptr memw) -> (¬ mpz_eq w (Zutil.ptr memw) -> mpz_unchanged (Zutil.ptr memw) mpz14 mpz12) ∧ ((¬ mpz_eq w (Zutil.ptr memw) -> readers mpz14 (Zutil.ptr memw) = readers mpz12 (Zutil.ptr memw) ∧ (- 2%Z < readers mpz14 (Zutil.ptr memw) -> abs_value_of mpz14 (Zutil.ptr memw) = abs_value_of mpz12 (Zutil.ptr memw) ∧ alloc mpz14 (Zutil.ptr memw) = alloc mpz12 (Zutil.ptr memw) ∧ abs_size mpz14 (Zutil.ptr memw) = abs_size mpz12 (Zutil.ptr memw) ∧ sgn mpz14 (Zutil.ptr memw) = sgn mpz12 (Zutil.ptr memw) ∧ readers mpz14 (Zutil.ptr memw) = readers mpz12 (Zutil.ptr memw) ∧ zones mpz14 (Zutil.ptr memw) = zones mpz12 (Zutil.ptr memw))) -> (zones mpz14 w = zone1 wp'2 ∧ readers mpz14 w = - 1%Z ∧ min wp'2 = 0%Z ∧ C.max wp'2 = plength wp'2 ∧ abs_value_of mpz14 w = value wp'2 (abs_size mpz14 w)) ∧ (∀(mpz15 : mpz_memo), abs_value_of mpz15 = abs_value_of mpz14 ∧ alloc mpz15 = alloc mpz14 ∧ abs_size mpz15 = abs_size mpz14 ∧ sgn mpz15 = sgn mpz14 ∧ zones mpz15 = zones mpz14 -> readers mpz15 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz15 y = readers mpz14 y) -> mpz_eq u1 w = (u1 = w) -> (¬ mpz_eq u1 w -> mpz_unchanged u1 mpz15 mpz12) ∧ ((¬ mpz_eq u1 w -> readers mpz15 u1 = readers mpz12 u1 ∧ (- 2%Z < readers mpz15 u1 -> abs_value_of mpz15 u1 = abs_value_of mpz12 u1 ∧ alloc mpz15 u1 = alloc mpz12 u1 ∧ abs_size mpz15 u1 = abs_size mpz12 u1 ∧ sgn mpz15 u1 = sgn mpz12 u1 ∧ readers mpz15 u1 = readers mpz12 u1 ∧ zones mpz15 u1 = zones mpz12 u1)) -> mpz_eq v1 w = (v1 = w) -> (¬ mpz_eq v1 w -> mpz_unchanged v1 mpz15 mpz12) ∧ ((¬ mpz_eq v1 w -> readers mpz15 v1 = readers mpz12 v1 ∧ (- 2%Z < readers mpz15 v1 -> abs_value_of mpz15 v1 = abs_value_of mpz12 v1 ∧ alloc mpz15 v1 = alloc mpz12 v1 ∧ abs_size mpz15 v1 = abs_size mpz12 v1 ∧ sgn mpz15 v1 = sgn mpz12 v1 ∧ readers mpz15 v1 = readers mpz12 v1 ∧ zones mpz15 v1 = zones mpz12 v1)) -> mpz_eq u1 u1 -> (∀(o15 : bool), (if decide (mpz_eq u1 u1) then o15 = true else mpz_eq u1 v1 = (u1 = v1) ∧ (if decide (mpz_eq u1 v1) then o15 = true else mpz_eq u1 (Zutil.ptr memw) = (u1 = Zutil.ptr memw) ∧ (if decide (mpz_eq u1 (Zutil.ptr memw)) then o15 = true else o15 = (if decide (mpz_eq u1 w) then true else false) ∧ (o15 = true) = (u1 = w)))) -> (¬ o15 = true -> mpz_unchanged u1 mpz15 mpz) ∧ ((¬ o15 = true -> readers mpz15 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz15 u1 -> abs_value_of mpz15 u1 = abs_value_of mpz u1 ∧ alloc mpz15 u1 = alloc mpz u1 ∧ abs_size mpz15 u1 = abs_size mpz u1 ∧ sgn mpz15 u1 = sgn mpz u1 ∧ readers mpz15 u1 = readers mpz u1 ∧ zones mpz15 u1 = zones mpz u1)) -> mpz_eq v1 u1 = (v1 = u1) -> (∀(o16 : bool), (if decide (mpz_eq v1 u1) then o16 = true else mpz_eq v1 v1 ∧ (if decide (mpz_eq v1 v1) then o16 = true else mpz_eq v1 (Zutil.ptr memw) = (v1 = Zutil.ptr memw) ∧ (if decide (mpz_eq v1 (Zutil.ptr memw)) then o16 = true else o16 = (if decide (mpz_eq v1 w) then true else false) ∧ (o16 = true) = (v1 = w)))) -> (¬ o16 = true -> mpz_unchanged v1 mpz15 mpz) ∧ ((¬ o16 = true -> readers mpz15 v1 = readers mpz v1 ∧ (- 2%Z < readers mpz15 v1 -> abs_value_of mpz15 v1 = abs_value_of mpz v1 ∧ alloc mpz15 v1 = alloc mpz v1 ∧ abs_size mpz15 v1 = abs_size mpz v1 ∧ sgn mpz15 v1 = sgn mpz v1 ∧ readers mpz15 v1 = readers mpz v1 ∧ zones mpz15 v1 = zones mpz v1)) -> mpz_unchanged w mpz15 mpz15 ∧ value_of w mpz15 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz15 mpz) ∧ readers mpz15 w = 0%Z ∧ readers mpz15 u = 0%Z ∧ readers mpz15 v = 0%Z))))))))))))))))))))) else ∀(o11 : bool), (bv_unsigned (pelts wp'2 (offset wp'2 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o11 = true) ∧ (o11 = true -> pelts wp'2 (offset wp'2 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o12 : bv 32%N), (if decide (o11 = true) then o12 = (1%bv : bv 32%N) else o12 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o12) ∧ (∀(o13 : bv 32%N), bv_signed o13 = bv_signed o7 - bv_signed o12 -> (bv_signed sign_product < 0%Z -> int'32_in_bounds (- bv_signed o13)) ∧ (∀(o14 : bv 32%N), (if decide (bv_signed sign_product < 0%Z) then bv_signed o14 = - bv_signed o13 else o14 = o13) -> (offset wp'2 = 0%Z ∧ writable wp'2 = true ∧ min wp'2 = 0%Z ∧ C.max wp'2 = plength wp'2 ∧ plength wp'2 = alloc mpz9 w ∧ (readers mpz9 w = 0%Z ∨ readers mpz9 w = - 1%Z)) ∧ (∀(mpz10 : mpz_memo), alloc mpz10 = alloc mpz9 ∧ abs_size mpz10 = abs_size mpz9 ∧ sgn mpz10 = sgn mpz9 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz10 mpz9) ∧ abs_value_of mpz10 w = value wp'2 (abs_size mpz10 w) ∧ readers mpz10 w = - 1%Z ∧ zones mpz10 w = zone1 wp'2 -> (zones mpz10 w = zone1 wp'2 ∧ readers mpz10 w = - 1%Z ∧ offset wp'2 = 0%Z ∧ min wp'2 = 0%Z ∧ C.max wp'2 = plength wp'2 ∧ Z.abs (bv_signed o14) ≤ plength wp'2 ∧ plength wp'2 = alloc mpz10 w ∧ (¬ bv_signed o14 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o14) - 1%Z) ≤ value wp'2 (Z.abs (bv_signed o14)))) ∧ (∀(mpz11 : mpz_memo), alloc mpz11 = alloc mpz10 ∧ readers mpz11 = readers mpz10 ∧ zones mpz11 = zones mpz10 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz11 mpz10) ∧ (sgn mpz11 w = 1%Z) = (0%Z ≤ bv_signed o14) ∧ (sgn mpz11 w = - 1%Z) = (bv_signed o14 < 0%Z) ∧ abs_size mpz11 w = Z.abs (bv_signed o14) ∧ abs_value_of mpz11 w = value wp'2 (Z.abs (bv_signed o14)) -> mpz_eq w (Zutil.ptr memw) = (w = Zutil.ptr memw) -> (¬ mpz_eq w (Zutil.ptr memw) -> mpz_unchanged (Zutil.ptr memw) mpz11 mpz9) ∧ ((¬ mpz_eq w (Zutil.ptr memw) -> readers mpz11 (Zutil.ptr memw) = readers mpz9 (Zutil.ptr memw) ∧ (- 2%Z < readers mpz11 (Zutil.ptr memw) -> abs_value_of mpz11 (Zutil.ptr memw) = abs_value_of mpz9 (Zutil.ptr memw) ∧ alloc mpz11 (Zutil.ptr memw) = alloc mpz9 (Zutil.ptr memw) ∧ abs_size mpz11 (Zutil.ptr memw) = abs_size mpz9 (Zutil.ptr memw) ∧ sgn mpz11 (Zutil.ptr memw) = sgn mpz9 (Zutil.ptr memw) ∧ readers mpz11 (Zutil.ptr memw) = readers mpz9 (Zutil.ptr memw) ∧ zones mpz11 (Zutil.ptr memw) = zones mpz9 (Zutil.ptr memw))) -> (zones mpz11 w = zone1 wp'2 ∧ readers mpz11 w = - 1%Z ∧ min wp'2 = 0%Z ∧ C.max wp'2 = plength wp'2 ∧ abs_value_of mpz11 w = value wp'2 (abs_size mpz11 w)) ∧ (∀(mpz12 : mpz_memo), abs_value_of mpz12 = abs_value_of mpz11 ∧ alloc mpz12 = alloc mpz11 ∧ abs_size mpz12 = abs_size mpz11 ∧ sgn mpz12 = sgn mpz11 ∧ zones mpz12 = zones mpz11 -> readers mpz12 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz12 y = readers mpz11 y) -> mpz_eq u1 w = (u1 = w) -> (¬ mpz_eq u1 w -> mpz_unchanged u1 mpz12 mpz9) ∧ ((¬ mpz_eq u1 w -> readers mpz12 u1 = readers mpz9 u1 ∧ (- 2%Z < readers mpz12 u1 -> abs_value_of mpz12 u1 = abs_value_of mpz9 u1 ∧ alloc mpz12 u1 = alloc mpz9 u1 ∧ abs_size mpz12 u1 = abs_size mpz9 u1 ∧ sgn mpz12 u1 = sgn mpz9 u1 ∧ readers mpz12 u1 = readers mpz9 u1 ∧ zones mpz12 u1 = zones mpz9 u1)) -> mpz_eq v1 w = (v1 = w) -> (¬ mpz_eq v1 w -> mpz_unchanged v1 mpz12 mpz9) ∧ ((¬ mpz_eq v1 w -> readers mpz12 v1 = readers mpz9 v1 ∧ (- 2%Z < readers mpz12 v1 -> abs_value_of mpz12 v1 = abs_value_of mpz9 v1 ∧ alloc mpz12 v1 = alloc mpz9 v1 ∧ abs_size mpz12 v1 = abs_size mpz9 v1 ∧ sgn mpz12 v1 = sgn mpz9 v1 ∧ readers mpz12 v1 = readers mpz9 v1 ∧ zones mpz12 v1 = zones mpz9 v1)) -> mpz_eq u1 u1 -> (∀(o15 : bool), (if decide (mpz_eq u1 u1) then o15 = true else mpz_eq u1 v1 = (u1 = v1) ∧ (if decide (mpz_eq u1 v1) then o15 = true else mpz_eq u1 (Zutil.ptr memw) = (u1 = Zutil.ptr memw) ∧ (if decide (mpz_eq u1 (Zutil.ptr memw)) then o15 = true else o15 = (if decide (mpz_eq u1 w) then true else false) ∧ (o15 = true) = (u1 = w)))) -> (¬ o15 = true -> mpz_unchanged u1 mpz12 mpz) ∧ ((¬ o15 = true -> readers mpz12 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz12 u1 -> abs_value_of mpz12 u1 = abs_value_of mpz u1 ∧ alloc mpz12 u1 = alloc mpz u1 ∧ abs_size mpz12 u1 = abs_size mpz u1 ∧ sgn mpz12 u1 = sgn mpz u1 ∧ readers mpz12 u1 = readers mpz u1 ∧ zones mpz12 u1 = zones mpz u1)) -> mpz_eq v1 u1 = (v1 = u1) -> (∀(o16 : bool), (if decide (mpz_eq v1 u1) then o16 = true else mpz_eq v1 v1 ∧ (if decide (mpz_eq v1 v1) then o16 = true else mpz_eq v1 (Zutil.ptr memw) = (v1 = Zutil.ptr memw) ∧ (if decide (mpz_eq v1 (Zutil.ptr memw)) then o16 = true else o16 = (if decide (mpz_eq v1 w) then true else false) ∧ (o16 = true) = (v1 = w)))) -> (¬ o16 = true -> mpz_unchanged v1 mpz12 mpz) ∧ ((¬ o16 = true -> readers mpz12 v1 = readers mpz v1 ∧ (- 2%Z < readers mpz12 v1 -> abs_value_of mpz12 v1 = abs_value_of mpz v1 ∧ alloc mpz12 v1 = alloc mpz v1 ∧ abs_size mpz12 v1 = abs_size mpz v1 ∧ sgn mpz12 v1 = sgn mpz v1 ∧ readers mpz12 v1 = readers mpz v1 ∧ zones mpz12 v1 = zones mpz v1)) -> mpz_unchanged w mpz12 mpz12 ∧ value_of w mpz12 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz12 mpz) ∧ readers mpz12 w = 0%Z ∧ readers mpz12 u = 0%Z ∧ readers mpz12 v = 0%Z)))))))))))))))))))))))))))))))))))))) else if decide (mpz_eq u1 w) then 0%Z ≤ readers mpz w ∧ (∀(mpz1 : mpz_memo), abs_value_of mpz1 = abs_value_of mpz ∧ alloc mpz1 = alloc mpz ∧ abs_size mpz1 = abs_size mpz ∧ sgn mpz1 = sgn mpz ∧ zones mpz1 = zones mpz -> (∀(wp : C.ptr (bv 64%N)), readers mpz1 w = readers mpz w + 1%Z ∧ (∀(y : mpz_ptr), ¬ w = y -> readers mpz1 y = readers mpz y) ∧ value wp (abs_size mpz1 w) = abs_value_of mpz1 w ∧ plength wp = alloc mpz1 w ∧ offset wp = 0%Z ∧ min wp = 0%Z ∧ C.max wp = plength wp ∧ zone1 wp = zones mpz1 w -> 0%Z ≤ bv_signed usize ∧ (∀(o9 : bv 32%N), bv_unsigned o9 = bv_signed usize -> 0%Z ≤ bv_unsigned o9 ∧ (∀(up : C.ptr (bv 64%N)), plength up = bv_unsigned o9 ∧ offset up = 0%Z ∧ min up = 0%Z ∧ C.max up = bv_unsigned o9 ∧ writable up = true -> (∀(mpz2 : mpz_memo) (mu : mpz_mem), Zutil.ok mu = true ∧ readers mpz2 (Zutil.ptr mu) = 0%Z ∧ alloc mpz2 (Zutil.ptr mu) = 0%Z ∧ abs_size mpz2 (Zutil.ptr mu) = 0%Z ∧ readers mpz1 (Zutil.ptr mu) = - 2%Z ∧ (∀(x : mpz_ptr), ¬ x = Zutil.ptr mu -> mpz_unchanged x mpz2 mpz1) -> (abs_size mpz2 (Zutil.ptr mu) ≤ bv_signed usize ∧ - 1%Z ≤ readers mpz2 (Zutil.ptr mu) ∧ readers mpz2 (Zutil.ptr mu) ≤ 0%Z) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ readers mpz3 = readers mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> mpz_unchanged y mpz3 mpz2) ∧ alloc mpz3 (Zutil.ptr mu) = bv_signed usize -> (valid wp (bv_signed usize) ∧ valid up (bv_signed usize) ∧ writable up = true) ∧ (∀(up1 : C.ptr (bv 64%N)), length (data up1) = length (data up) ∧ offset up1 = offset up ∧ min up1 = min up ∧ C.max up1 = C.max up ∧ writable up1 = writable up ∧ zone1 up1 = zone1 up -> map_eq_sub_shift (pelts up1) (pelts wp) (offset up1) (offset wp) (bv_signed usize) ∧ (∀(j : Z), j < offset up1 ∨ offset up1 + bv_signed usize ≤ j -> pelts up1 j = pelts up j) -> (offset up1 = 0%Z ∧ writable up1 = true ∧ min up1 = 0%Z ∧ C.max up1 = plength up1 ∧ plength up1 = alloc mpz3 (Zutil.ptr mu) ∧ (readers mpz3 (Zutil.ptr mu) = 0%Z ∨ readers mpz3 (Zutil.ptr mu) = - 1%Z)) ∧ (∀(mpz4 : mpz_memo), alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 -> (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> mpz_unchanged y mpz4 mpz3) ∧ abs_value_of mpz4 (Zutil.ptr mu) = value up1 (abs_size mpz4 (Zutil.ptr mu)) ∧ readers mpz4 (Zutil.ptr mu) = - 1%Z ∧ zones mpz4 (Zutil.ptr mu) = zone1 up1 -> (zones mpz4 (Zutil.ptr mu) = zone1 up1 ∧ readers mpz4 (Zutil.ptr mu) = - 1%Z ∧ offset up1 = 0%Z ∧ min up1 = 0%Z ∧ C.max up1 = plength up1 ∧ Z.abs (bv_signed usize) ≤ plength up1 ∧ plength up1 = alloc mpz4 (Zutil.ptr mu) ∧ (¬ bv_signed usize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed usize) - 1%Z) ≤ value up1 (Z.abs (bv_signed usize)))) ∧ (∀(mpz5 : mpz_memo), alloc mpz5 = alloc mpz4 ∧ readers mpz5 = readers mpz4 ∧ zones mpz5 = zones mpz4 -> (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> mpz_unchanged y mpz5 mpz4) ∧ (sgn mpz5 (Zutil.ptr mu) = 1%Z) = (0%Z ≤ bv_signed usize) ∧ (sgn mpz5 (Zutil.ptr mu) = - 1%Z) = (bv_signed usize < 0%Z) ∧ abs_size mpz5 (Zutil.ptr mu) = Z.abs (bv_signed usize) ∧ abs_value_of mpz5 (Zutil.ptr mu) = value up1 (Z.abs (bv_signed usize)) -> (zones mpz5 (Zutil.ptr mu) = zone1 up1 ∧ readers mpz5 (Zutil.ptr mu) = - 1%Z ∧ min up1 = 0%Z ∧ C.max up1 = plength up1 ∧ abs_value_of mpz5 (Zutil.ptr mu) = value up1 (abs_size mpz5 (Zutil.ptr mu))) ∧ (∀(mpz6 : mpz_memo), abs_value_of mpz6 = abs_value_of mpz5 ∧ alloc mpz6 = alloc mpz5 ∧ abs_size mpz6 = abs_size mpz5 ∧ sgn mpz6 = sgn mpz5 ∧ zones mpz6 = zones mpz5 -> readers mpz6 (Zutil.ptr mu) = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> readers mpz6 y = readers mpz5 y) -> (if decide (mpz_eq v1 w) then mpz_unchanged u1 mpz6 mpz1 ∧ (readers mpz6 u1 = readers mpz1 u1 ∧ (- 2%Z < readers mpz6 u1 -> abs_value_of mpz6 u1 = abs_value_of mpz1 u1 ∧ alloc mpz6 u1 = alloc mpz1 u1 ∧ abs_size mpz6 u1 = abs_size mpz1 u1 ∧ sgn mpz6 u1 = sgn mpz1 u1 ∧ readers mpz6 u1 = readers mpz1 u1 ∧ zones mpz6 u1 = zones mpz1 u1) -> mpz_unchanged w mpz6 mpz1 ∧ (readers mpz6 w = readers mpz1 w ∧ (- 2%Z < readers mpz6 w -> abs_value_of mpz6 w = abs_value_of mpz1 w ∧ alloc mpz6 w = alloc mpz1 w ∧ abs_size mpz6 w = abs_size mpz1 w ∧ sgn mpz6 w = sgn mpz1 w ∧ readers mpz6 w = readers mpz1 w ∧ zones mpz6 w = zones mpz1 w) -> (zones mpz6 w = zone1 wp ∧ 1%Z ≤ readers mpz6 w ∧ min wp = 0%Z ∧ C.max wp = plength wp) ∧ (∀(mpz7 : mpz_memo), abs_value_of mpz7 = abs_value_of mpz6 ∧ alloc mpz7 = alloc mpz6 ∧ abs_size mpz7 = abs_size mpz6 ∧ sgn mpz7 = sgn mpz6 ∧ zones mpz7 = zones mpz6 -> readers mpz7 w = readers mpz6 w - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz7 y = readers mpz6 y) -> 0%Z ≤ readers mpz7 (Zutil.ptr mu) ∧ (∀(mpz8 : mpz_memo), abs_value_of mpz8 = abs_value_of mpz7 ∧ alloc mpz8 = alloc mpz7 ∧ abs_size mpz8 = abs_size mpz7 ∧ sgn mpz8 = sgn mpz7 ∧ zones mpz8 = zones mpz7 -> (∀(up' : C.ptr (bv 64%N)), readers mpz8 (Zutil.ptr mu) = readers mpz7 (Zutil.ptr mu) + 1%Z ∧ (∀(y : mpz_ptr), ¬ Zutil.ptr mu = y -> readers mpz8 y = readers mpz7 y) ∧ value up' (abs_size mpz8 (Zutil.ptr mu)) = abs_value_of mpz8 (Zutil.ptr mu) ∧ plength up' = alloc mpz8 (Zutil.ptr mu) ∧ offset up' = 0%Z ∧ min up' = 0%Z ∧ C.max up' = plength up' ∧ zone1 up' = zones mpz8 (Zutil.ptr mu) -> 0%Z ≤ readers mpz8 (Zutil.ptr mu) ∧ (∀(mpz9 : mpz_memo), abs_value_of mpz9 = abs_value_of mpz8 ∧ alloc mpz9 = alloc mpz8 ∧ abs_size mpz9 = abs_size mpz8 ∧ sgn mpz9 = sgn mpz8 ∧ zones mpz9 = zones mpz8 -> (∀(vp' : C.ptr (bv 64%N)), readers mpz9 (Zutil.ptr mu) = readers mpz8 (Zutil.ptr mu) + 1%Z ∧ (∀(y : mpz_ptr), ¬ Zutil.ptr mu = y -> readers mpz9 y = readers mpz8 y) ∧ value vp' (abs_size mpz9 (Zutil.ptr mu)) = abs_value_of mpz9 (Zutil.ptr mu) ∧ plength vp' = alloc mpz9 (Zutil.ptr mu) ∧ offset vp' = 0%Z ∧ min vp' = 0%Z ∧ C.max vp' = plength vp' ∧ zone1 vp' = zones mpz9 (Zutil.ptr mu) -> mpz_unchanged w mpz9 mpz7 ∧ (readers mpz9 w = readers mpz7 w ∧ (- 2%Z < readers mpz9 w -> abs_value_of mpz9 w = abs_value_of mpz7 w ∧ alloc mpz9 w = alloc mpz7 w ∧ abs_size mpz9 w = abs_size mpz7 w ∧ sgn mpz9 w = sgn mpz7 w ∧ readers mpz9 w = readers mpz7 w ∧ zones mpz9 w = zones mpz7 w) -> readers mpz9 w = 0%Z ∧ (∀(mpz10 : mpz_memo), abs_value_of mpz10 = abs_value_of mpz9 ∧ alloc mpz10 = alloc mpz9 ∧ abs_size mpz10 = abs_size mpz9 ∧ sgn mpz10 = sgn mpz9 ∧ zones mpz10 = zones mpz9 -> (∀(wp' : C.ptr (bv 64%N)), readers mpz10 w = - 1%Z ∧ (∀(y : mpz_ptr), ¬ w = y -> readers mpz10 y = readers mpz9 y) ∧ value wp' (abs_size mpz10 w) = abs_value_of mpz10 w ∧ plength wp' = alloc mpz10 w ∧ offset wp' = 0%Z ∧ min wp' = 0%Z ∧ C.max wp' = plength wp' ∧ writable wp' = true ∧ zone1 wp' = zones mpz10 w -> mpz_unchanged (Zutil.ptr mu) mpz10 mpz9 ∧ (readers mpz10 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ (- 2%Z < readers mpz10 (Zutil.ptr mu) -> abs_value_of mpz10 (Zutil.ptr mu) = abs_value_of mpz9 (Zutil.ptr mu) ∧ alloc mpz10 (Zutil.ptr mu) = alloc mpz9 (Zutil.ptr mu) ∧ abs_size mpz10 (Zutil.ptr mu) = abs_size mpz9 (Zutil.ptr mu) ∧ sgn mpz10 (Zutil.ptr mu) = sgn mpz9 (Zutil.ptr mu) ∧ readers mpz10 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ zones mpz10 (Zutil.ptr mu) = zones mpz9 (Zutil.ptr mu)) -> mpz_unchanged (Zutil.ptr mu) mpz10 mpz9 ∧ (readers mpz10 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ (- 2%Z < readers mpz10 (Zutil.ptr mu) -> abs_value_of mpz10 (Zutil.ptr mu) = abs_value_of mpz9 (Zutil.ptr mu) ∧ alloc mpz10 (Zutil.ptr mu) = alloc mpz9 (Zutil.ptr mu) ∧ abs_size mpz10 (Zutil.ptr mu) = abs_size mpz9 (Zutil.ptr mu) ∧ sgn mpz10 (Zutil.ptr mu) = sgn mpz9 (Zutil.ptr mu) ∧ readers mpz10 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ zones mpz10 (Zutil.ptr mu) = zones mpz9 (Zutil.ptr mu)) -> (valid up' (bv_signed usize) ∧ valid vp' (bv_signed vsize) ∧ valid wp' (bv_signed usize + bv_signed vsize) ∧ writable wp' = true ∧ (0%Z < bv_signed vsize ∧ bv_signed vsize ≤ bv_signed usize) ∧ 8%Z * bv_signed usize < 2147483647%Z ∧ bv_signed usize ≤ bv_signed (29%bv : bv 32%N) * Z.pow 2%Z 64%Z ∧ 0%Z ≤ 64%Z ∧ 64%Z ≤ 64%Z) ∧ (∀(wp'1 : C.ptr (bv 64%N)), offset wp'1 = offset wp' ∧ writable wp'1 = writable wp' ∧ zone1 wp'1 = zone1 wp' -> min wp'1 = min wp' ∧ C.max wp'1 = C.max wp' ∧ plength wp'1 = plength wp' ∧ value wp'1 (bv_signed usize + bv_signed vsize) = value up' (bv_signed usize) * value vp' (bv_signed vsize) ∧ (∀(j : Z), min wp'1 ≤ j ∧ j < offset wp'1 ∨ offset wp'1 + bv_signed usize + bv_signed vsize ≤ j ∧ j < C.max wp'1 -> pelts wp'1 j = pelts wp' j) -> (∀(o10 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o10 = true) ∧ (o10 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o11 : bv 32%N), (if decide (o10 = true) then o11 = (1%bv : bv 32%N) else o11 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o11) ∧ (∀(wsize' : bv 32%N), bv_signed wsize' = bv_signed o7 - bv_signed o11 -> (zones mpz10 (Zutil.ptr mu) = zone1 up' ∧ 1%Z ≤ readers mpz10 (Zutil.ptr mu) ∧ min up' = 0%Z ∧ C.max up' = plength up') ∧ (∀(mpz11 : mpz_memo), abs_value_of mpz11 = abs_value_of mpz10 ∧ alloc mpz11 = alloc mpz10 ∧ abs_size mpz11 = abs_size mpz10 ∧ sgn mpz11 = sgn mpz10 ∧ zones mpz11 = zones mpz10 -> readers mpz11 (Zutil.ptr mu) = readers mpz10 (Zutil.ptr mu) - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> readers mpz11 y = readers mpz10 y) -> mpz_eq (Zutil.ptr mu) (Zutil.ptr mu) = True -> (¬ mpz_eq (Zutil.ptr mu) (Zutil.ptr mu) -> mpz_unchanged (Zutil.ptr mu) mpz11 mpz9) ∧ ((¬ mpz_eq (Zutil.ptr mu) (Zutil.ptr mu) -> readers mpz11 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ (- 2%Z < readers mpz11 (Zutil.ptr mu) -> abs_value_of mpz11 (Zutil.ptr mu) = abs_value_of mpz9 (Zutil.ptr mu) ∧ alloc mpz11 (Zutil.ptr mu) = alloc mpz9 (Zutil.ptr mu) ∧ abs_size mpz11 (Zutil.ptr mu) = abs_size mpz9 (Zutil.ptr mu) ∧ sgn mpz11 (Zutil.ptr mu) = sgn mpz9 (Zutil.ptr mu) ∧ readers mpz11 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ zones mpz11 (Zutil.ptr mu) = zones mpz9 (Zutil.ptr mu))) -> (zones mpz11 (Zutil.ptr mu) = zone1 vp' ∧ 1%Z ≤ readers mpz11 (Zutil.ptr mu) ∧ min vp' = 0%Z ∧ C.max vp' = plength vp') ∧ (∀(mpz12 : mpz_memo), abs_value_of mpz12 = abs_value_of mpz11 ∧ alloc mpz12 = alloc mpz11 ∧ abs_size mpz12 = abs_size mpz11 ∧ sgn mpz12 = sgn mpz11 ∧ zones mpz12 = zones mpz11 -> readers mpz12 (Zutil.ptr mu) = readers mpz11 (Zutil.ptr mu) - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> readers mpz12 y = readers mpz11 y) -> mpz_unchanged w mpz12 mpz10 ∧ (readers mpz12 w = readers mpz10 w ∧ (- 2%Z < readers mpz12 w -> abs_value_of mpz12 w = abs_value_of mpz10 w ∧ alloc mpz12 w = alloc mpz10 w ∧ abs_size mpz12 w = abs_size mpz10 w ∧ sgn mpz12 w = sgn mpz10 w ∧ readers mpz12 w = readers mpz10 w ∧ zones mpz12 w = zones mpz10 w) -> (∀(o12 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o12 = true) ∧ (o12 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o13 : bv 32%N), (if decide (o12 = true) then o13 = (1%bv : bv 32%N) else o13 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o13) ∧ (∀(o14 : bv 32%N), bv_signed o14 = bv_signed o7 - bv_signed o13 -> (bv_signed sign_product < 0%Z -> int'32_in_bounds (- bv_signed o14)) ∧ (∀(o15 : bv 32%N), (if decide (bv_signed sign_product < 0%Z) then bv_signed o15 = - bv_signed o14 else o15 = o14) -> (offset wp'1 = 0%Z ∧ writable wp'1 = true ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ plength wp'1 = alloc mpz12 w ∧ (readers mpz12 w = 0%Z ∨ readers mpz12 w = - 1%Z)) ∧ (∀(mpz13 : mpz_memo), alloc mpz13 = alloc mpz12 ∧ abs_size mpz13 = abs_size mpz12 ∧ sgn mpz13 = sgn mpz12 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz13 mpz12) ∧ abs_value_of mpz13 w = value wp'1 (abs_size mpz13 w) ∧ readers mpz13 w = - 1%Z ∧ zones mpz13 w = zone1 wp'1 -> (zones mpz13 w = zone1 wp'1 ∧ readers mpz13 w = - 1%Z ∧ offset wp'1 = 0%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ Z.abs (bv_signed o15) ≤ plength wp'1 ∧ plength wp'1 = alloc mpz13 w ∧ (¬ bv_signed o15 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o15) - 1%Z) ≤ value wp'1 (Z.abs (bv_signed o15)))) ∧ (∀(mpz14 : mpz_memo), alloc mpz14 = alloc mpz13 ∧ readers mpz14 = readers mpz13 ∧ zones mpz14 = zones mpz13 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz14 mpz13) ∧ (sgn mpz14 w = 1%Z) = (0%Z ≤ bv_signed o15) ∧ (sgn mpz14 w = - 1%Z) = (bv_signed o15 < 0%Z) ∧ abs_size mpz14 w = Z.abs (bv_signed o15) ∧ abs_value_of mpz14 w = value wp'1 (Z.abs (bv_signed o15)) -> mpz_eq w w -> (¬ mpz_eq w w -> mpz_unchanged w mpz14 mpz12) ∧ ((¬ mpz_eq w w -> readers mpz14 w = readers mpz12 w ∧ (- 2%Z < readers mpz14 w -> abs_value_of mpz14 w = abs_value_of mpz12 w ∧ alloc mpz14 w = alloc mpz12 w ∧ abs_size mpz14 w = abs_size mpz12 w ∧ sgn mpz14 w = sgn mpz12 w ∧ readers mpz14 w = readers mpz12 w ∧ zones mpz14 w = zones mpz12 w)) -> (zones mpz14 w = zone1 wp'1 ∧ readers mpz14 w = - 1%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ abs_value_of mpz14 w = value wp'1 (abs_size mpz14 w)) ∧ (∀(mpz15 : mpz_memo), abs_value_of mpz15 = abs_value_of mpz14 ∧ alloc mpz15 = alloc mpz14 ∧ abs_size mpz15 = abs_size mpz14 ∧ sgn mpz15 = sgn mpz14 ∧ zones mpz15 = zones mpz14 -> readers mpz15 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz15 y = readers mpz14 y) -> mpz_eq (Zutil.ptr mu) w = (Zutil.ptr mu = w) -> (¬ mpz_eq (Zutil.ptr mu) w -> mpz_unchanged (Zutil.ptr mu) mpz15 mpz12) ∧ ((¬ mpz_eq (Zutil.ptr mu) w -> readers mpz15 (Zutil.ptr mu) = readers mpz12 (Zutil.ptr mu) ∧ (- 2%Z < readers mpz15 (Zutil.ptr mu) -> abs_value_of mpz15 (Zutil.ptr mu) = abs_value_of mpz12 (Zutil.ptr mu) ∧ alloc mpz15 (Zutil.ptr mu) = alloc mpz12 (Zutil.ptr mu) ∧ abs_size mpz15 (Zutil.ptr mu) = abs_size mpz12 (Zutil.ptr mu) ∧ sgn mpz15 (Zutil.ptr mu) = sgn mpz12 (Zutil.ptr mu) ∧ readers mpz15 (Zutil.ptr mu) = readers mpz12 (Zutil.ptr mu) ∧ zones mpz15 (Zutil.ptr mu) = zones mpz12 (Zutil.ptr mu))) -> mpz_eq (Zutil.ptr mu) w = (Zutil.ptr mu = w) -> (¬ mpz_eq (Zutil.ptr mu) w -> mpz_unchanged (Zutil.ptr mu) mpz15 mpz12) ∧ ((¬ mpz_eq (Zutil.ptr mu) w -> readers mpz15 (Zutil.ptr mu) = readers mpz12 (Zutil.ptr mu) ∧ (- 2%Z < readers mpz15 (Zutil.ptr mu) -> abs_value_of mpz15 (Zutil.ptr mu) = abs_value_of mpz12 (Zutil.ptr mu) ∧ alloc mpz15 (Zutil.ptr mu) = alloc mpz12 (Zutil.ptr mu) ∧ abs_size mpz15 (Zutil.ptr mu) = abs_size mpz12 (Zutil.ptr mu) ∧ sgn mpz15 (Zutil.ptr mu) = sgn mpz12 (Zutil.ptr mu) ∧ readers mpz15 (Zutil.ptr mu) = readers mpz12 (Zutil.ptr mu) ∧ zones mpz15 (Zutil.ptr mu) = zones mpz12 (Zutil.ptr mu))) -> mpz_eq u1 (Zutil.ptr mu) = (u1 = Zutil.ptr mu) -> (∀(o16 : bool), (if decide (mpz_eq u1 (Zutil.ptr mu)) then o16 = true else mpz_eq u1 (Zutil.ptr mu) = (u1 = Zutil.ptr mu) ∧ (if decide (mpz_eq u1 (Zutil.ptr mu)) then o16 = true else mpz_eq u1 w = (u1 = w) ∧ (if decide (mpz_eq u1 w) then o16 = true else o16 = (if decide (mpz_eq u1 w) then true else false) ∧ (o16 = true) = (u1 = w)))) -> (¬ o16 = true -> mpz_unchanged u1 mpz15 mpz) ∧ ((¬ o16 = true -> readers mpz15 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz15 u1 -> abs_value_of mpz15 u1 = abs_value_of mpz u1 ∧ alloc mpz15 u1 = alloc mpz u1 ∧ abs_size mpz15 u1 = abs_size mpz u1 ∧ sgn mpz15 u1 = sgn mpz u1 ∧ readers mpz15 u1 = readers mpz u1 ∧ zones mpz15 u1 = zones mpz u1)) -> mpz_eq v1 (Zutil.ptr mu) = (v1 = Zutil.ptr mu) -> (∀(o17 : bool), (if decide (mpz_eq v1 (Zutil.ptr mu)) then o17 = true else mpz_eq v1 (Zutil.ptr mu) = (v1 = Zutil.ptr mu) ∧ (if decide (mpz_eq v1 (Zutil.ptr mu)) then o17 = true else mpz_eq v1 w = (v1 = w) ∧ (if decide (mpz_eq v1 w) then o17 = true else o17 = (if decide (mpz_eq v1 w) then true else false) ∧ (o17 = true) = (v1 = w)))) -> (¬ o17 = true -> mpz_unchanged v1 mpz15 mpz) ∧ ((¬ o17 = true -> readers mpz15 v1 = readers mpz v1 ∧ (- 2%Z < readers mpz15 v1 -> abs_value_of mpz15 v1 = abs_value_of mpz v1 ∧ alloc mpz15 v1 = alloc mpz v1 ∧ abs_size mpz15 v1 = abs_size mpz v1 ∧ sgn mpz15 v1 = sgn mpz v1 ∧ readers mpz15 v1 = readers mpz v1 ∧ zones mpz15 v1 = zones mpz v1)) -> (if decide True then (Zutil.ok mu = true ∧ - 1%Z ≤ readers mpz15 (Zutil.ptr mu) ∧ readers mpz15 (Zutil.ptr mu) ≤ 0%Z) ∧ (∀(mpz16 : mpz_memo), readers mpz16 (Zutil.ptr mu) = - 2%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> mpz_unchanged y mpz16 mpz15) -> mpz_unchanged w mpz16 mpz15 ∧ (readers mpz16 w = readers mpz15 w ∧ (- 2%Z < readers mpz16 w -> abs_value_of mpz16 w = abs_value_of mpz15 w ∧ alloc mpz16 w = alloc mpz15 w ∧ abs_size mpz16 w = abs_size mpz15 w ∧ sgn mpz16 w = sgn mpz15 w ∧ readers mpz16 w = readers mpz15 w ∧ zones mpz16 w = zones mpz15 w) -> value_of w mpz16 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz16 mpz) ∧ readers mpz16 w = 0%Z ∧ readers mpz16 u = 0%Z ∧ readers mpz16 v = 0%Z)) else mpz_unchanged w mpz15 mpz15 ∧ value_of w mpz15 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz15 mpz) ∧ readers mpz15 w = 0%Z ∧ readers mpz15 u = 0%Z ∧ readers mpz15 v = 0%Z))))))))))))))))))))))))))))))))))) else mpz_unchanged v1 mpz6 mpz1 ∧ (readers mpz6 v1 = readers mpz1 v1 ∧ (- 2%Z < readers mpz6 v1 -> abs_value_of mpz6 v1 = abs_value_of mpz1 v1 ∧ alloc mpz6 v1 = alloc mpz1 v1 ∧ abs_size mpz6 v1 = abs_size mpz1 v1 ∧ sgn mpz6 v1 = sgn mpz1 v1 ∧ readers mpz6 v1 = readers mpz1 v1 ∧ zones mpz6 v1 = zones mpz1 v1) -> mpz_unchanged u1 mpz6 mpz1 ∧ (readers mpz6 u1 = readers mpz1 u1 ∧ (- 2%Z < readers mpz6 u1 -> abs_value_of mpz6 u1 = abs_value_of mpz1 u1 ∧ alloc mpz6 u1 = alloc mpz1 u1 ∧ abs_size mpz6 u1 = abs_size mpz1 u1 ∧ sgn mpz6 u1 = sgn mpz1 u1 ∧ readers mpz6 u1 = readers mpz1 u1 ∧ zones mpz6 u1 = zones mpz1 u1) -> mpz_unchanged w mpz6 mpz1 ∧ (readers mpz6 w = readers mpz1 w ∧ (- 2%Z < readers mpz6 w -> abs_value_of mpz6 w = abs_value_of mpz1 w ∧ alloc mpz6 w = alloc mpz1 w ∧ abs_size mpz6 w = abs_size mpz1 w ∧ sgn mpz6 w = sgn mpz1 w ∧ readers mpz6 w = readers mpz1 w ∧ zones mpz6 w = zones mpz1 w) -> (zones mpz6 w = zone1 wp ∧ 1%Z ≤ readers mpz6 w ∧ min wp = 0%Z ∧ C.max wp = plength wp) ∧ (∀(mpz7 : mpz_memo), abs_value_of mpz7 = abs_value_of mpz6 ∧ alloc mpz7 = alloc mpz6 ∧ abs_size mpz7 = abs_size mpz6 ∧ sgn mpz7 = sgn mpz6 ∧ zones mpz7 = zones mpz6 -> readers mpz7 w = readers mpz6 w - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz7 y = readers mpz6 y) -> 0%Z ≤ readers mpz7 (Zutil.ptr mu) ∧ (∀(mpz8 : mpz_memo), abs_value_of mpz8 = abs_value_of mpz7 ∧ alloc mpz8 = alloc mpz7 ∧ abs_size mpz8 = abs_size mpz7 ∧ sgn mpz8 = sgn mpz7 ∧ zones mpz8 = zones mpz7 -> (∀(up' : C.ptr (bv 64%N)), readers mpz8 (Zutil.ptr mu) = readers mpz7 (Zutil.ptr mu) + 1%Z ∧ (∀(y : mpz_ptr), ¬ Zutil.ptr mu = y -> readers mpz8 y = readers mpz7 y) ∧ value up' (abs_size mpz8 (Zutil.ptr mu)) = abs_value_of mpz8 (Zutil.ptr mu) ∧ plength up' = alloc mpz8 (Zutil.ptr mu) ∧ offset up' = 0%Z ∧ min up' = 0%Z ∧ C.max up' = plength up' ∧ zone1 up' = zones mpz8 (Zutil.ptr mu) -> 0%Z ≤ readers mpz8 v1 ∧ (∀(mpz9 : mpz_memo), abs_value_of mpz9 = abs_value_of mpz8 ∧ alloc mpz9 = alloc mpz8 ∧ abs_size mpz9 = abs_size mpz8 ∧ sgn mpz9 = sgn mpz8 ∧ zones mpz9 = zones mpz8 -> (∀(vp' : C.ptr (bv 64%N)), readers mpz9 v1 = readers mpz8 v1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ v1 = y -> readers mpz9 y = readers mpz8 y) ∧ value vp' (abs_size mpz9 v1) = abs_value_of mpz9 v1 ∧ plength vp' = alloc mpz9 v1 ∧ offset vp' = 0%Z ∧ min vp' = 0%Z ∧ C.max vp' = plength vp' ∧ zone1 vp' = zones mpz9 v1 -> mpz_unchanged w mpz9 mpz7 ∧ (readers mpz9 w = readers mpz7 w ∧ (- 2%Z < readers mpz9 w -> abs_value_of mpz9 w = abs_value_of mpz7 w ∧ alloc mpz9 w = alloc mpz7 w ∧ abs_size mpz9 w = abs_size mpz7 w ∧ sgn mpz9 w = sgn mpz7 w ∧ readers mpz9 w = readers mpz7 w ∧ zones mpz9 w = zones mpz7 w) -> readers mpz9 w = 0%Z ∧ (∀(mpz10 : mpz_memo), abs_value_of mpz10 = abs_value_of mpz9 ∧ alloc mpz10 = alloc mpz9 ∧ abs_size mpz10 = abs_size mpz9 ∧ sgn mpz10 = sgn mpz9 ∧ zones mpz10 = zones mpz9 -> (∀(wp' : C.ptr (bv 64%N)), readers mpz10 w = - 1%Z ∧ (∀(y : mpz_ptr), ¬ w = y -> readers mpz10 y = readers mpz9 y) ∧ value wp' (abs_size mpz10 w) = abs_value_of mpz10 w ∧ plength wp' = alloc mpz10 w ∧ offset wp' = 0%Z ∧ min wp' = 0%Z ∧ C.max wp' = plength wp' ∧ writable wp' = true ∧ zone1 wp' = zones mpz10 w -> mpz_unchanged (Zutil.ptr mu) mpz10 mpz9 ∧ (readers mpz10 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ (- 2%Z < readers mpz10 (Zutil.ptr mu) -> abs_value_of mpz10 (Zutil.ptr mu) = abs_value_of mpz9 (Zutil.ptr mu) ∧ alloc mpz10 (Zutil.ptr mu) = alloc mpz9 (Zutil.ptr mu) ∧ abs_size mpz10 (Zutil.ptr mu) = abs_size mpz9 (Zutil.ptr mu) ∧ sgn mpz10 (Zutil.ptr mu) = sgn mpz9 (Zutil.ptr mu) ∧ readers mpz10 (Zutil.ptr mu) = readers mpz9 (Zutil.ptr mu) ∧ zones mpz10 (Zutil.ptr mu) = zones mpz9 (Zutil.ptr mu)) -> mpz_unchanged v1 mpz10 mpz9 ∧ (readers mpz10 v1 = readers mpz9 v1 ∧ (- 2%Z < readers mpz10 v1 -> abs_value_of mpz10 v1 = abs_value_of mpz9 v1 ∧ alloc mpz10 v1 = alloc mpz9 v1 ∧ abs_size mpz10 v1 = abs_size mpz9 v1 ∧ sgn mpz10 v1 = sgn mpz9 v1 ∧ readers mpz10 v1 = readers mpz9 v1 ∧ zones mpz10 v1 = zones mpz9 v1) -> (valid up' (bv_signed usize) ∧ valid vp' (bv_signed vsize) ∧ valid wp' (bv_signed usize + bv_signed vsize) ∧ writable wp' = true ∧ (0%Z < bv_signed vsize ∧ bv_signed vsize ≤ bv_signed usize) ∧ 8%Z * bv_signed usize < 2147483647%Z ∧ bv_signed usize ≤ bv_signed (29%bv : bv 32%N) * Z.pow 2%Z 64%Z ∧ 0%Z ≤ 64%Z ∧ 64%Z ≤ 64%Z) ∧ (∀(wp'1 : C.ptr (bv 64%N)), offset wp'1 = offset wp' ∧ writable wp'1 = writable wp' ∧ zone1 wp'1 = zone1 wp' -> min wp'1 = min wp' ∧ C.max wp'1 = C.max wp' ∧ plength wp'1 = plength wp' ∧ value wp'1 (bv_signed usize + bv_signed vsize) = value up' (bv_signed usize) * value vp' (bv_signed vsize) ∧ (∀(j : Z), min wp'1 ≤ j ∧ j < offset wp'1 ∨ offset wp'1 + bv_signed usize + bv_signed vsize ≤ j ∧ j < C.max wp'1 -> pelts wp'1 j = pelts wp' j) -> (∀(o10 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o10 = true) ∧ (o10 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o11 : bv 32%N), (if decide (o10 = true) then o11 = (1%bv : bv 32%N) else o11 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o11) ∧ (∀(wsize' : bv 32%N), bv_signed wsize' = bv_signed o7 - bv_signed o11 -> (zones mpz10 (Zutil.ptr mu) = zone1 up' ∧ 1%Z ≤ readers mpz10 (Zutil.ptr mu) ∧ min up' = 0%Z ∧ C.max up' = plength up') ∧ (∀(mpz11 : mpz_memo), abs_value_of mpz11 = abs_value_of mpz10 ∧ alloc mpz11 = alloc mpz10 ∧ abs_size mpz11 = abs_size mpz10 ∧ sgn mpz11 = sgn mpz10 ∧ zones mpz11 = zones mpz10 -> readers mpz11 (Zutil.ptr mu) = readers mpz10 (Zutil.ptr mu) - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> readers mpz11 y = readers mpz10 y) -> mpz_eq (Zutil.ptr mu) v1 = (Zutil.ptr mu = v1) -> (¬ mpz_eq (Zutil.ptr mu) v1 -> mpz_unchanged v1 mpz11 mpz9) ∧ ((¬ mpz_eq (Zutil.ptr mu) v1 -> readers mpz11 v1 = readers mpz9 v1 ∧ (- 2%Z < readers mpz11 v1 -> abs_value_of mpz11 v1 = abs_value_of mpz9 v1 ∧ alloc mpz11 v1 = alloc mpz9 v1 ∧ abs_size mpz11 v1 = abs_size mpz9 v1 ∧ sgn mpz11 v1 = sgn mpz9 v1 ∧ readers mpz11 v1 = readers mpz9 v1 ∧ zones mpz11 v1 = zones mpz9 v1)) -> (zones mpz11 v1 = zone1 vp' ∧ 1%Z ≤ readers mpz11 v1 ∧ min vp' = 0%Z ∧ C.max vp' = plength vp') ∧ (∀(mpz12 : mpz_memo), abs_value_of mpz12 = abs_value_of mpz11 ∧ alloc mpz12 = alloc mpz11 ∧ abs_size mpz12 = abs_size mpz11 ∧ sgn mpz12 = sgn mpz11 ∧ zones mpz12 = zones mpz11 -> readers mpz12 v1 = readers mpz11 v1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = v1 -> readers mpz12 y = readers mpz11 y) -> mpz_unchanged w mpz12 mpz10 ∧ (readers mpz12 w = readers mpz10 w ∧ (- 2%Z < readers mpz12 w -> abs_value_of mpz12 w = abs_value_of mpz10 w ∧ alloc mpz12 w = alloc mpz10 w ∧ abs_size mpz12 w = abs_size mpz10 w ∧ sgn mpz12 w = sgn mpz10 w ∧ readers mpz12 w = readers mpz10 w ∧ zones mpz12 w = zones mpz10 w) -> (∀(o12 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o12 = true) ∧ (o12 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o13 : bv 32%N), (if decide (o12 = true) then o13 = (1%bv : bv 32%N) else o13 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o13) ∧ (∀(o14 : bv 32%N), bv_signed o14 = bv_signed o7 - bv_signed o13 -> (bv_signed sign_product < 0%Z -> int'32_in_bounds (- bv_signed o14)) ∧ (∀(o15 : bv 32%N), (if decide (bv_signed sign_product < 0%Z) then bv_signed o15 = - bv_signed o14 else o15 = o14) -> (offset wp'1 = 0%Z ∧ writable wp'1 = true ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ plength wp'1 = alloc mpz12 w ∧ (readers mpz12 w = 0%Z ∨ readers mpz12 w = - 1%Z)) ∧ (∀(mpz13 : mpz_memo), alloc mpz13 = alloc mpz12 ∧ abs_size mpz13 = abs_size mpz12 ∧ sgn mpz13 = sgn mpz12 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz13 mpz12) ∧ abs_value_of mpz13 w = value wp'1 (abs_size mpz13 w) ∧ readers mpz13 w = - 1%Z ∧ zones mpz13 w = zone1 wp'1 -> (zones mpz13 w = zone1 wp'1 ∧ readers mpz13 w = - 1%Z ∧ offset wp'1 = 0%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ Z.abs (bv_signed o15) ≤ plength wp'1 ∧ plength wp'1 = alloc mpz13 w ∧ (¬ bv_signed o15 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o15) - 1%Z) ≤ value wp'1 (Z.abs (bv_signed o15)))) ∧ (∀(mpz14 : mpz_memo), alloc mpz14 = alloc mpz13 ∧ readers mpz14 = readers mpz13 ∧ zones mpz14 = zones mpz13 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz14 mpz13) ∧ (sgn mpz14 w = 1%Z) = (0%Z ≤ bv_signed o15) ∧ (sgn mpz14 w = - 1%Z) = (bv_signed o15 < 0%Z) ∧ abs_size mpz14 w = Z.abs (bv_signed o15) ∧ abs_value_of mpz14 w = value wp'1 (Z.abs (bv_signed o15)) -> mpz_eq w w -> (¬ mpz_eq w w -> mpz_unchanged w mpz14 mpz12) ∧ ((¬ mpz_eq w w -> readers mpz14 w = readers mpz12 w ∧ (- 2%Z < readers mpz14 w -> abs_value_of mpz14 w = abs_value_of mpz12 w ∧ alloc mpz14 w = alloc mpz12 w ∧ abs_size mpz14 w = abs_size mpz12 w ∧ sgn mpz14 w = sgn mpz12 w ∧ readers mpz14 w = readers mpz12 w ∧ zones mpz14 w = zones mpz12 w)) -> (zones mpz14 w = zone1 wp'1 ∧ readers mpz14 w = - 1%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ abs_value_of mpz14 w = value wp'1 (abs_size mpz14 w)) ∧ (∀(mpz15 : mpz_memo), abs_value_of mpz15 = abs_value_of mpz14 ∧ alloc mpz15 = alloc mpz14 ∧ abs_size mpz15 = abs_size mpz14 ∧ sgn mpz15 = sgn mpz14 ∧ zones mpz15 = zones mpz14 -> readers mpz15 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz15 y = readers mpz14 y) -> mpz_eq (Zutil.ptr mu) w = (Zutil.ptr mu = w) -> (¬ mpz_eq (Zutil.ptr mu) w -> mpz_unchanged (Zutil.ptr mu) mpz15 mpz12) ∧ ((¬ mpz_eq (Zutil.ptr mu) w -> readers mpz15 (Zutil.ptr mu) = readers mpz12 (Zutil.ptr mu) ∧ (- 2%Z < readers mpz15 (Zutil.ptr mu) -> abs_value_of mpz15 (Zutil.ptr mu) = abs_value_of mpz12 (Zutil.ptr mu) ∧ alloc mpz15 (Zutil.ptr mu) = alloc mpz12 (Zutil.ptr mu) ∧ abs_size mpz15 (Zutil.ptr mu) = abs_size mpz12 (Zutil.ptr mu) ∧ sgn mpz15 (Zutil.ptr mu) = sgn mpz12 (Zutil.ptr mu) ∧ readers mpz15 (Zutil.ptr mu) = readers mpz12 (Zutil.ptr mu) ∧ zones mpz15 (Zutil.ptr mu) = zones mpz12 (Zutil.ptr mu))) -> mpz_eq v1 w = (v1 = w) -> (¬ mpz_eq v1 w -> mpz_unchanged v1 mpz15 mpz12) ∧ ((¬ mpz_eq v1 w -> readers mpz15 v1 = readers mpz12 v1 ∧ (- 2%Z < readers mpz15 v1 -> abs_value_of mpz15 v1 = abs_value_of mpz12 v1 ∧ alloc mpz15 v1 = alloc mpz12 v1 ∧ abs_size mpz15 v1 = abs_size mpz12 v1 ∧ sgn mpz15 v1 = sgn mpz12 v1 ∧ readers mpz15 v1 = readers mpz12 v1 ∧ zones mpz15 v1 = zones mpz12 v1)) -> mpz_eq u1 (Zutil.ptr mu) = (u1 = Zutil.ptr mu) -> (∀(o16 : bool), (if decide (mpz_eq u1 (Zutil.ptr mu)) then o16 = true else mpz_eq u1 v1 = (u1 = v1) ∧ (if decide (mpz_eq u1 v1) then o16 = true else mpz_eq u1 w = (u1 = w) ∧ (if decide (mpz_eq u1 w) then o16 = true else o16 = (if decide (mpz_eq u1 w) then true else false) ∧ (o16 = true) = (u1 = w)))) -> (¬ o16 = true -> mpz_unchanged u1 mpz15 mpz) ∧ ((¬ o16 = true -> readers mpz15 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz15 u1 -> abs_value_of mpz15 u1 = abs_value_of mpz u1 ∧ alloc mpz15 u1 = alloc mpz u1 ∧ abs_size mpz15 u1 = abs_size mpz u1 ∧ sgn mpz15 u1 = sgn mpz u1 ∧ readers mpz15 u1 = readers mpz u1 ∧ zones mpz15 u1 = zones mpz u1)) -> mpz_eq v1 (Zutil.ptr mu) = (v1 = Zutil.ptr mu) -> (∀(o17 : bool), (if decide (mpz_eq v1 (Zutil.ptr mu)) then o17 = true else mpz_eq v1 v1 ∧ (if decide (mpz_eq v1 v1) then o17 = true else mpz_eq v1 w = (v1 = w) ∧ (if decide (mpz_eq v1 w) then o17 = true else o17 = (if decide (mpz_eq v1 w) then true else false) ∧ (o17 = true) = (v1 = w)))) -> (¬ o17 = true -> mpz_unchanged v1 mpz15 mpz) ∧ ((¬ o17 = true -> readers mpz15 v1 = readers mpz v1 ∧ (- 2%Z < readers mpz15 v1 -> abs_value_of mpz15 v1 = abs_value_of mpz v1 ∧ alloc mpz15 v1 = alloc mpz v1 ∧ abs_size mpz15 v1 = abs_size mpz v1 ∧ sgn mpz15 v1 = sgn mpz v1 ∧ readers mpz15 v1 = readers mpz v1 ∧ zones mpz15 v1 = zones mpz v1)) -> (if decide True then (Zutil.ok mu = true ∧ - 1%Z ≤ readers mpz15 (Zutil.ptr mu) ∧ readers mpz15 (Zutil.ptr mu) ≤ 0%Z) ∧ (∀(mpz16 : mpz_memo), readers mpz16 (Zutil.ptr mu) = - 2%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mu -> mpz_unchanged y mpz16 mpz15) -> mpz_unchanged w mpz16 mpz15 ∧ (readers mpz16 w = readers mpz15 w ∧ (- 2%Z < readers mpz16 w -> abs_value_of mpz16 w = abs_value_of mpz15 w ∧ alloc mpz16 w = alloc mpz15 w ∧ abs_size mpz16 w = abs_size mpz15 w ∧ sgn mpz16 w = sgn mpz15 w ∧ readers mpz16 w = readers mpz15 w ∧ zones mpz16 w = zones mpz15 w) -> value_of w mpz16 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz16 mpz) ∧ readers mpz16 w = 0%Z ∧ readers mpz16 u = 0%Z ∧ readers mpz16 v = 0%Z)) else mpz_unchanged w mpz15 mpz15 ∧ value_of w mpz15 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz15 mpz) ∧ readers mpz15 w = 0%Z ∧ readers mpz15 u = 0%Z ∧ readers mpz15 v = 0%Z))))))))))))))))))))))))))))))))))))))))))))))) else if decide (mpz_eq v1 w) then 0%Z ≤ readers mpz w ∧ (∀(mpz1 : mpz_memo), abs_value_of mpz1 = abs_value_of mpz ∧ alloc mpz1 = alloc mpz ∧ abs_size mpz1 = abs_size mpz ∧ sgn mpz1 = sgn mpz ∧ zones mpz1 = zones mpz -> (∀(wp : C.ptr (bv 64%N)), readers mpz1 w = readers mpz w + 1%Z ∧ (∀(y : mpz_ptr), ¬ w = y -> readers mpz1 y = readers mpz y) ∧ value wp (abs_size mpz1 w) = abs_value_of mpz1 w ∧ plength wp = alloc mpz1 w ∧ offset wp = 0%Z ∧ min wp = 0%Z ∧ C.max wp = plength wp ∧ zone1 wp = zones mpz1 w -> 0%Z ≤ bv_signed vsize ∧ (∀(o9 : bv 32%N), bv_unsigned o9 = bv_signed vsize -> 0%Z ≤ bv_unsigned o9 ∧ (∀(vp : C.ptr (bv 64%N)), plength vp = bv_unsigned o9 ∧ offset vp = 0%Z ∧ min vp = 0%Z ∧ C.max vp = bv_unsigned o9 ∧ writable vp = true -> (∀(mpz2 : mpz_memo) (mv : mpz_mem), Zutil.ok mv = true ∧ readers mpz2 (Zutil.ptr mv) = 0%Z ∧ alloc mpz2 (Zutil.ptr mv) = 0%Z ∧ abs_size mpz2 (Zutil.ptr mv) = 0%Z ∧ readers mpz1 (Zutil.ptr mv) = - 2%Z ∧ (∀(x : mpz_ptr), ¬ x = Zutil.ptr mv -> mpz_unchanged x mpz2 mpz1) -> (abs_size mpz2 (Zutil.ptr mv) ≤ bv_signed vsize ∧ - 1%Z ≤ readers mpz2 (Zutil.ptr mv) ∧ readers mpz2 (Zutil.ptr mv) ≤ 0%Z) ∧ (∀(mpz3 : mpz_memo), abs_value_of mpz3 = abs_value_of mpz2 ∧ abs_size mpz3 = abs_size mpz2 ∧ sgn mpz3 = sgn mpz2 ∧ readers mpz3 = readers mpz2 ∧ zones mpz3 = zones mpz2 -> (∀(y : mpz_ptr), ¬ y = Zutil.ptr mv -> mpz_unchanged y mpz3 mpz2) ∧ alloc mpz3 (Zutil.ptr mv) = bv_signed vsize -> (valid wp (bv_signed vsize) ∧ valid vp (bv_signed vsize) ∧ writable vp = true) ∧ (∀(vp1 : C.ptr (bv 64%N)), length (data vp1) = length (data vp) ∧ offset vp1 = offset vp ∧ min vp1 = min vp ∧ C.max vp1 = C.max vp ∧ writable vp1 = writable vp ∧ zone1 vp1 = zone1 vp -> map_eq_sub_shift (pelts vp1) (pelts wp) (offset vp1) (offset wp) (bv_signed vsize) ∧ (∀(j : Z), j < offset vp1 ∨ offset vp1 + bv_signed vsize ≤ j -> pelts vp1 j = pelts vp j) -> (offset vp1 = 0%Z ∧ writable vp1 = true ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1 ∧ plength vp1 = alloc mpz3 (Zutil.ptr mv) ∧ (readers mpz3 (Zutil.ptr mv) = 0%Z ∨ readers mpz3 (Zutil.ptr mv) = - 1%Z)) ∧ (∀(mpz4 : mpz_memo), alloc mpz4 = alloc mpz3 ∧ abs_size mpz4 = abs_size mpz3 ∧ sgn mpz4 = sgn mpz3 -> (∀(y : mpz_ptr), ¬ y = Zutil.ptr mv -> mpz_unchanged y mpz4 mpz3) ∧ abs_value_of mpz4 (Zutil.ptr mv) = value vp1 (abs_size mpz4 (Zutil.ptr mv)) ∧ readers mpz4 (Zutil.ptr mv) = - 1%Z ∧ zones mpz4 (Zutil.ptr mv) = zone1 vp1 -> (zones mpz4 (Zutil.ptr mv) = zone1 vp1 ∧ readers mpz4 (Zutil.ptr mv) = - 1%Z ∧ offset vp1 = 0%Z ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1 ∧ Z.abs (bv_signed vsize) ≤ plength vp1 ∧ plength vp1 = alloc mpz4 (Zutil.ptr mv) ∧ (¬ bv_signed vsize = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed vsize) - 1%Z) ≤ value vp1 (Z.abs (bv_signed vsize)))) ∧ (∀(mpz5 : mpz_memo), alloc mpz5 = alloc mpz4 ∧ readers mpz5 = readers mpz4 ∧ zones mpz5 = zones mpz4 -> (∀(y : mpz_ptr), ¬ y = Zutil.ptr mv -> mpz_unchanged y mpz5 mpz4) ∧ (sgn mpz5 (Zutil.ptr mv) = 1%Z) = (0%Z ≤ bv_signed vsize) ∧ (sgn mpz5 (Zutil.ptr mv) = - 1%Z) = (bv_signed vsize < 0%Z) ∧ abs_size mpz5 (Zutil.ptr mv) = Z.abs (bv_signed vsize) ∧ abs_value_of mpz5 (Zutil.ptr mv) = value vp1 (Z.abs (bv_signed vsize)) -> (zones mpz5 (Zutil.ptr mv) = zone1 vp1 ∧ readers mpz5 (Zutil.ptr mv) = - 1%Z ∧ min vp1 = 0%Z ∧ C.max vp1 = plength vp1 ∧ abs_value_of mpz5 (Zutil.ptr mv) = value vp1 (abs_size mpz5 (Zutil.ptr mv))) ∧ (∀(mpz6 : mpz_memo), abs_value_of mpz6 = abs_value_of mpz5 ∧ alloc mpz6 = alloc mpz5 ∧ abs_size mpz6 = abs_size mpz5 ∧ sgn mpz6 = sgn mpz5 ∧ zones mpz6 = zones mpz5 -> readers mpz6 (Zutil.ptr mv) = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mv -> readers mpz6 y = readers mpz5 y) -> mpz_unchanged u1 mpz6 mpz1 ∧ (readers mpz6 u1 = readers mpz1 u1 ∧ (- 2%Z < readers mpz6 u1 -> abs_value_of mpz6 u1 = abs_value_of mpz1 u1 ∧ alloc mpz6 u1 = alloc mpz1 u1 ∧ abs_size mpz6 u1 = abs_size mpz1 u1 ∧ sgn mpz6 u1 = sgn mpz1 u1 ∧ readers mpz6 u1 = readers mpz1 u1 ∧ zones mpz6 u1 = zones mpz1 u1) -> mpz_unchanged v1 mpz6 mpz1 ∧ (readers mpz6 v1 = readers mpz1 v1 ∧ (- 2%Z < readers mpz6 v1 -> abs_value_of mpz6 v1 = abs_value_of mpz1 v1 ∧ alloc mpz6 v1 = alloc mpz1 v1 ∧ abs_size mpz6 v1 = abs_size mpz1 v1 ∧ sgn mpz6 v1 = sgn mpz1 v1 ∧ readers mpz6 v1 = readers mpz1 v1 ∧ zones mpz6 v1 = zones mpz1 v1) -> mpz_unchanged w mpz6 mpz1 ∧ (readers mpz6 w = readers mpz1 w ∧ (- 2%Z < readers mpz6 w -> abs_value_of mpz6 w = abs_value_of mpz1 w ∧ alloc mpz6 w = alloc mpz1 w ∧ abs_size mpz6 w = abs_size mpz1 w ∧ sgn mpz6 w = sgn mpz1 w ∧ readers mpz6 w = readers mpz1 w ∧ zones mpz6 w = zones mpz1 w) -> (zones mpz6 w = zone1 wp ∧ 1%Z ≤ readers mpz6 w ∧ min wp = 0%Z ∧ C.max wp = plength wp) ∧ (∀(mpz7 : mpz_memo), abs_value_of mpz7 = abs_value_of mpz6 ∧ alloc mpz7 = alloc mpz6 ∧ abs_size mpz7 = abs_size mpz6 ∧ sgn mpz7 = sgn mpz6 ∧ zones mpz7 = zones mpz6 -> readers mpz7 w = readers mpz6 w - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz7 y = readers mpz6 y) -> 0%Z ≤ readers mpz7 u1 ∧ (∀(mpz8 : mpz_memo), abs_value_of mpz8 = abs_value_of mpz7 ∧ alloc mpz8 = alloc mpz7 ∧ abs_size mpz8 = abs_size mpz7 ∧ sgn mpz8 = sgn mpz7 ∧ zones mpz8 = zones mpz7 -> (∀(up' : C.ptr (bv 64%N)), readers mpz8 u1 = readers mpz7 u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz8 y = readers mpz7 y) ∧ value up' (abs_size mpz8 u1) = abs_value_of mpz8 u1 ∧ plength up' = alloc mpz8 u1 ∧ offset up' = 0%Z ∧ min up' = 0%Z ∧ C.max up' = plength up' ∧ zone1 up' = zones mpz8 u1 -> 0%Z ≤ readers mpz8 (Zutil.ptr mv) ∧ (∀(mpz9 : mpz_memo), abs_value_of mpz9 = abs_value_of mpz8 ∧ alloc mpz9 = alloc mpz8 ∧ abs_size mpz9 = abs_size mpz8 ∧ sgn mpz9 = sgn mpz8 ∧ zones mpz9 = zones mpz8 -> (∀(vp' : C.ptr (bv 64%N)), readers mpz9 (Zutil.ptr mv) = readers mpz8 (Zutil.ptr mv) + 1%Z ∧ (∀(y : mpz_ptr), ¬ Zutil.ptr mv = y -> readers mpz9 y = readers mpz8 y) ∧ value vp' (abs_size mpz9 (Zutil.ptr mv)) = abs_value_of mpz9 (Zutil.ptr mv) ∧ plength vp' = alloc mpz9 (Zutil.ptr mv) ∧ offset vp' = 0%Z ∧ min vp' = 0%Z ∧ C.max vp' = plength vp' ∧ zone1 vp' = zones mpz9 (Zutil.ptr mv) -> mpz_unchanged w mpz9 mpz7 ∧ (readers mpz9 w = readers mpz7 w ∧ (- 2%Z < readers mpz9 w -> abs_value_of mpz9 w = abs_value_of mpz7 w ∧ alloc mpz9 w = alloc mpz7 w ∧ abs_size mpz9 w = abs_size mpz7 w ∧ sgn mpz9 w = sgn mpz7 w ∧ readers mpz9 w = readers mpz7 w ∧ zones mpz9 w = zones mpz7 w) -> readers mpz9 w = 0%Z ∧ (∀(mpz10 : mpz_memo), abs_value_of mpz10 = abs_value_of mpz9 ∧ alloc mpz10 = alloc mpz9 ∧ abs_size mpz10 = abs_size mpz9 ∧ sgn mpz10 = sgn mpz9 ∧ zones mpz10 = zones mpz9 -> (∀(wp' : C.ptr (bv 64%N)), readers mpz10 w = - 1%Z ∧ (∀(y : mpz_ptr), ¬ w = y -> readers mpz10 y = readers mpz9 y) ∧ value wp' (abs_size mpz10 w) = abs_value_of mpz10 w ∧ plength wp' = alloc mpz10 w ∧ offset wp' = 0%Z ∧ min wp' = 0%Z ∧ C.max wp' = plength wp' ∧ writable wp' = true ∧ zone1 wp' = zones mpz10 w -> mpz_unchanged u1 mpz10 mpz9 ∧ (readers mpz10 u1 = readers mpz9 u1 ∧ (- 2%Z < readers mpz10 u1 -> abs_value_of mpz10 u1 = abs_value_of mpz9 u1 ∧ alloc mpz10 u1 = alloc mpz9 u1 ∧ abs_size mpz10 u1 = abs_size mpz9 u1 ∧ sgn mpz10 u1 = sgn mpz9 u1 ∧ readers mpz10 u1 = readers mpz9 u1 ∧ zones mpz10 u1 = zones mpz9 u1) -> mpz_unchanged (Zutil.ptr mv) mpz10 mpz9 ∧ (readers mpz10 (Zutil.ptr mv) = readers mpz9 (Zutil.ptr mv) ∧ (- 2%Z < readers mpz10 (Zutil.ptr mv) -> abs_value_of mpz10 (Zutil.ptr mv) = abs_value_of mpz9 (Zutil.ptr mv) ∧ alloc mpz10 (Zutil.ptr mv) = alloc mpz9 (Zutil.ptr mv) ∧ abs_size mpz10 (Zutil.ptr mv) = abs_size mpz9 (Zutil.ptr mv) ∧ sgn mpz10 (Zutil.ptr mv) = sgn mpz9 (Zutil.ptr mv) ∧ readers mpz10 (Zutil.ptr mv) = readers mpz9 (Zutil.ptr mv) ∧ zones mpz10 (Zutil.ptr mv) = zones mpz9 (Zutil.ptr mv)) -> (valid up' (bv_signed usize) ∧ valid vp' (bv_signed vsize) ∧ valid wp' (bv_signed usize + bv_signed vsize) ∧ writable wp' = true ∧ (0%Z < bv_signed vsize ∧ bv_signed vsize ≤ bv_signed usize) ∧ 8%Z * bv_signed usize < 2147483647%Z ∧ bv_signed usize ≤ bv_signed (29%bv : bv 32%N) * Z.pow 2%Z 64%Z ∧ 0%Z ≤ 64%Z ∧ 64%Z ≤ 64%Z) ∧ (∀(wp'1 : C.ptr (bv 64%N)), offset wp'1 = offset wp' ∧ writable wp'1 = writable wp' ∧ zone1 wp'1 = zone1 wp' -> min wp'1 = min wp' ∧ C.max wp'1 = C.max wp' ∧ plength wp'1 = plength wp' ∧ value wp'1 (bv_signed usize + bv_signed vsize) = value up' (bv_signed usize) * value vp' (bv_signed vsize) ∧ (∀(j : Z), min wp'1 ≤ j ∧ j < offset wp'1 ∨ offset wp'1 + bv_signed usize + bv_signed vsize ≤ j ∧ j < C.max wp'1 -> pelts wp'1 j = pelts wp' j) -> (∀(o10 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o10 = true) ∧ (o10 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o11 : bv 32%N), (if decide (o10 = true) then o11 = (1%bv : bv 32%N) else o11 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o11) ∧ (∀(wsize' : bv 32%N), bv_signed wsize' = bv_signed o7 - bv_signed o11 -> (zones mpz10 u1 = zone1 up' ∧ 1%Z ≤ readers mpz10 u1 ∧ min up' = 0%Z ∧ C.max up' = plength up') ∧ (∀(mpz11 : mpz_memo), abs_value_of mpz11 = abs_value_of mpz10 ∧ alloc mpz11 = alloc mpz10 ∧ abs_size mpz11 = abs_size mpz10 ∧ sgn mpz11 = sgn mpz10 ∧ zones mpz11 = zones mpz10 -> readers mpz11 u1 = readers mpz10 u1 - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = u1 -> readers mpz11 y = readers mpz10 y) -> mpz_eq u1 (Zutil.ptr mv) = (u1 = Zutil.ptr mv) -> (¬ mpz_eq u1 (Zutil.ptr mv) -> mpz_unchanged (Zutil.ptr mv) mpz11 mpz9) ∧ ((¬ mpz_eq u1 (Zutil.ptr mv) -> readers mpz11 (Zutil.ptr mv) = readers mpz9 (Zutil.ptr mv) ∧ (- 2%Z < readers mpz11 (Zutil.ptr mv) -> abs_value_of mpz11 (Zutil.ptr mv) = abs_value_of mpz9 (Zutil.ptr mv) ∧ alloc mpz11 (Zutil.ptr mv) = alloc mpz9 (Zutil.ptr mv) ∧ abs_size mpz11 (Zutil.ptr mv) = abs_size mpz9 (Zutil.ptr mv) ∧ sgn mpz11 (Zutil.ptr mv) = sgn mpz9 (Zutil.ptr mv) ∧ readers mpz11 (Zutil.ptr mv) = readers mpz9 (Zutil.ptr mv) ∧ zones mpz11 (Zutil.ptr mv) = zones mpz9 (Zutil.ptr mv))) -> (zones mpz11 (Zutil.ptr mv) = zone1 vp' ∧ 1%Z ≤ readers mpz11 (Zutil.ptr mv) ∧ min vp' = 0%Z ∧ C.max vp' = plength vp') ∧ (∀(mpz12 : mpz_memo), abs_value_of mpz12 = abs_value_of mpz11 ∧ alloc mpz12 = alloc mpz11 ∧ abs_size mpz12 = abs_size mpz11 ∧ sgn mpz12 = sgn mpz11 ∧ zones mpz12 = zones mpz11 -> readers mpz12 (Zutil.ptr mv) = readers mpz11 (Zutil.ptr mv) - 1%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mv -> readers mpz12 y = readers mpz11 y) -> mpz_unchanged w mpz12 mpz10 ∧ (readers mpz12 w = readers mpz10 w ∧ (- 2%Z < readers mpz12 w -> abs_value_of mpz12 w = abs_value_of mpz10 w ∧ alloc mpz12 w = alloc mpz10 w ∧ abs_size mpz12 w = abs_size mpz10 w ∧ sgn mpz12 w = sgn mpz10 w ∧ readers mpz12 w = readers mpz10 w ∧ zones mpz12 w = zones mpz10 w) -> (∀(o12 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o12 = true) ∧ (o12 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o13 : bv 32%N), (if decide (o12 = true) then o13 = (1%bv : bv 32%N) else o13 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o13) ∧ (∀(o14 : bv 32%N), bv_signed o14 = bv_signed o7 - bv_signed o13 -> (bv_signed sign_product < 0%Z -> int'32_in_bounds (- bv_signed o14)) ∧ (∀(o15 : bv 32%N), (if decide (bv_signed sign_product < 0%Z) then bv_signed o15 = - bv_signed o14 else o15 = o14) -> (offset wp'1 = 0%Z ∧ writable wp'1 = true ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ plength wp'1 = alloc mpz12 w ∧ (readers mpz12 w = 0%Z ∨ readers mpz12 w = - 1%Z)) ∧ (∀(mpz13 : mpz_memo), alloc mpz13 = alloc mpz12 ∧ abs_size mpz13 = abs_size mpz12 ∧ sgn mpz13 = sgn mpz12 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz13 mpz12) ∧ abs_value_of mpz13 w = value wp'1 (abs_size mpz13 w) ∧ readers mpz13 w = - 1%Z ∧ zones mpz13 w = zone1 wp'1 -> (zones mpz13 w = zone1 wp'1 ∧ readers mpz13 w = - 1%Z ∧ offset wp'1 = 0%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ Z.abs (bv_signed o15) ≤ plength wp'1 ∧ plength wp'1 = alloc mpz13 w ∧ (¬ bv_signed o15 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o15) - 1%Z) ≤ value wp'1 (Z.abs (bv_signed o15)))) ∧ (∀(mpz14 : mpz_memo), alloc mpz14 = alloc mpz13 ∧ readers mpz14 = readers mpz13 ∧ zones mpz14 = zones mpz13 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz14 mpz13) ∧ (sgn mpz14 w = 1%Z) = (0%Z ≤ bv_signed o15) ∧ (sgn mpz14 w = - 1%Z) = (bv_signed o15 < 0%Z) ∧ abs_size mpz14 w = Z.abs (bv_signed o15) ∧ abs_value_of mpz14 w = value wp'1 (Z.abs (bv_signed o15)) -> mpz_eq w w -> (¬ mpz_eq w w -> mpz_unchanged w mpz14 mpz12) ∧ ((¬ mpz_eq w w -> readers mpz14 w = readers mpz12 w ∧ (- 2%Z < readers mpz14 w -> abs_value_of mpz14 w = abs_value_of mpz12 w ∧ alloc mpz14 w = alloc mpz12 w ∧ abs_size mpz14 w = abs_size mpz12 w ∧ sgn mpz14 w = sgn mpz12 w ∧ readers mpz14 w = readers mpz12 w ∧ zones mpz14 w = zones mpz12 w)) -> (zones mpz14 w = zone1 wp'1 ∧ readers mpz14 w = - 1%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ abs_value_of mpz14 w = value wp'1 (abs_size mpz14 w)) ∧ (∀(mpz15 : mpz_memo), abs_value_of mpz15 = abs_value_of mpz14 ∧ alloc mpz15 = alloc mpz14 ∧ abs_size mpz15 = abs_size mpz14 ∧ sgn mpz15 = sgn mpz14 ∧ zones mpz15 = zones mpz14 -> readers mpz15 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz15 y = readers mpz14 y) -> mpz_eq u1 w = (u1 = w) -> (¬ mpz_eq u1 w -> mpz_unchanged u1 mpz15 mpz12) ∧ ((¬ mpz_eq u1 w -> readers mpz15 u1 = readers mpz12 u1 ∧ (- 2%Z < readers mpz15 u1 -> abs_value_of mpz15 u1 = abs_value_of mpz12 u1 ∧ alloc mpz15 u1 = alloc mpz12 u1 ∧ abs_size mpz15 u1 = abs_size mpz12 u1 ∧ sgn mpz15 u1 = sgn mpz12 u1 ∧ readers mpz15 u1 = readers mpz12 u1 ∧ zones mpz15 u1 = zones mpz12 u1)) -> mpz_eq (Zutil.ptr mv) w = (Zutil.ptr mv = w) -> (¬ mpz_eq (Zutil.ptr mv) w -> mpz_unchanged (Zutil.ptr mv) mpz15 mpz12) ∧ ((¬ mpz_eq (Zutil.ptr mv) w -> readers mpz15 (Zutil.ptr mv) = readers mpz12 (Zutil.ptr mv) ∧ (- 2%Z < readers mpz15 (Zutil.ptr mv) -> abs_value_of mpz15 (Zutil.ptr mv) = abs_value_of mpz12 (Zutil.ptr mv) ∧ alloc mpz15 (Zutil.ptr mv) = alloc mpz12 (Zutil.ptr mv) ∧ abs_size mpz15 (Zutil.ptr mv) = abs_size mpz12 (Zutil.ptr mv) ∧ sgn mpz15 (Zutil.ptr mv) = sgn mpz12 (Zutil.ptr mv) ∧ readers mpz15 (Zutil.ptr mv) = readers mpz12 (Zutil.ptr mv) ∧ zones mpz15 (Zutil.ptr mv) = zones mpz12 (Zutil.ptr mv))) -> mpz_eq u1 u1 -> (∀(o16 : bool), (if decide (mpz_eq u1 u1) then o16 = true else mpz_eq u1 (Zutil.ptr mv) = (u1 = Zutil.ptr mv) ∧ (if decide (mpz_eq u1 (Zutil.ptr mv)) then o16 = true else mpz_eq u1 w = (u1 = w) ∧ (if decide (mpz_eq u1 w) then o16 = true else o16 = (if decide (mpz_eq u1 w) then true else false) ∧ (o16 = true) = (u1 = w)))) -> (¬ o16 = true -> mpz_unchanged u1 mpz15 mpz) ∧ ((¬ o16 = true -> readers mpz15 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz15 u1 -> abs_value_of mpz15 u1 = abs_value_of mpz u1 ∧ alloc mpz15 u1 = alloc mpz u1 ∧ abs_size mpz15 u1 = abs_size mpz u1 ∧ sgn mpz15 u1 = sgn mpz u1 ∧ readers mpz15 u1 = readers mpz u1 ∧ zones mpz15 u1 = zones mpz u1)) -> mpz_eq v1 u1 = (v1 = u1) -> (∀(o17 : bool), (if decide (mpz_eq v1 u1) then o17 = true else mpz_eq v1 (Zutil.ptr mv) = (v1 = Zutil.ptr mv) ∧ (if decide (mpz_eq v1 (Zutil.ptr mv)) then o17 = true else mpz_eq v1 w = (v1 = w) ∧ (if decide (mpz_eq v1 w) then o17 = true else o17 = (if decide (mpz_eq v1 w) then true else false) ∧ (o17 = true) = (v1 = w)))) -> (¬ o17 = true -> mpz_unchanged v1 mpz15 mpz) ∧ ((¬ o17 = true -> readers mpz15 v1 = readers mpz v1 ∧ (- 2%Z < readers mpz15 v1 -> abs_value_of mpz15 v1 = abs_value_of mpz v1 ∧ alloc mpz15 v1 = alloc mpz v1 ∧ abs_size mpz15 v1 = abs_size mpz v1 ∧ sgn mpz15 v1 = sgn mpz v1 ∧ readers mpz15 v1 = readers mpz v1 ∧ zones mpz15 v1 = zones mpz v1)) -> (if decide True then (Zutil.ok mv = true ∧ - 1%Z ≤ readers mpz15 (Zutil.ptr mv) ∧ readers mpz15 (Zutil.ptr mv) ≤ 0%Z) ∧ (∀(mpz16 : mpz_memo), readers mpz16 (Zutil.ptr mv) = - 2%Z ∧ (∀(y : mpz_ptr), ¬ y = Zutil.ptr mv -> mpz_unchanged y mpz16 mpz15) -> mpz_unchanged w mpz16 mpz15 ∧ (readers mpz16 w = readers mpz15 w ∧ (- 2%Z < readers mpz16 w -> abs_value_of mpz16 w = abs_value_of mpz15 w ∧ alloc mpz16 w = alloc mpz15 w ∧ abs_size mpz16 w = abs_size mpz15 w ∧ sgn mpz16 w = sgn mpz15 w ∧ readers mpz16 w = readers mpz15 w ∧ zones mpz16 w = zones mpz15 w) -> value_of w mpz16 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz16 mpz) ∧ readers mpz16 w = 0%Z ∧ readers mpz16 u = 0%Z ∧ readers mpz16 v = 0%Z)) else mpz_unchanged w mpz15 mpz15 ∧ value_of w mpz15 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz15 mpz) ∧ readers mpz15 w = 0%Z ∧ readers mpz15 u = 0%Z ∧ readers mpz15 v = 0%Z)))))))))))))))))))))))))))))))))))))))))))))) else 0%Z ≤ readers mpz u1 ∧ (∀(mpz1 : mpz_memo), abs_value_of mpz1 = abs_value_of mpz ∧ alloc mpz1 = alloc mpz ∧ abs_size mpz1 = abs_size mpz ∧ sgn mpz1 = sgn mpz ∧ zones mpz1 = zones mpz -> (∀(up' : C.ptr (bv 64%N)), readers mpz1 u1 = readers mpz u1 + 1%Z ∧ (∀(y : mpz_ptr), ¬ u1 = y -> readers mpz1 y = readers mpz y) ∧ value up' (abs_size mpz1 u1) = abs_value_of mpz1 u1 ∧ plength up' = alloc mpz1 u1 ∧ offset up' = 0%Z ∧ min up' = 0%Z ∧ C.max up' = plength up' ∧ zone1 up' = zones mpz1 u1 -> 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 -> mpz_unchanged w mpz2 mpz ∧ (readers mpz2 w = readers mpz w ∧ (- 2%Z < readers mpz2 w -> abs_value_of mpz2 w = abs_value_of mpz w ∧ alloc mpz2 w = alloc mpz w ∧ abs_size mpz2 w = abs_size mpz w ∧ sgn mpz2 w = sgn mpz w ∧ readers mpz2 w = readers mpz w ∧ zones mpz2 w = zones mpz w) -> readers mpz2 w = 0%Z ∧ (∀(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 -> (∀(wp' : C.ptr (bv 64%N)), readers mpz3 w = - 1%Z ∧ (∀(y : mpz_ptr), ¬ w = y -> readers mpz3 y = readers mpz2 y) ∧ value wp' (abs_size mpz3 w) = abs_value_of mpz3 w ∧ plength wp' = alloc mpz3 w ∧ offset wp' = 0%Z ∧ min wp' = 0%Z ∧ C.max wp' = plength wp' ∧ writable wp' = true ∧ zone1 wp' = zones mpz3 w -> mpz_unchanged u1 mpz3 mpz2 ∧ (readers mpz3 u1 = readers mpz2 u1 ∧ (- 2%Z < readers mpz3 u1 -> abs_value_of mpz3 u1 = abs_value_of mpz2 u1 ∧ alloc mpz3 u1 = alloc mpz2 u1 ∧ abs_size mpz3 u1 = abs_size mpz2 u1 ∧ sgn mpz3 u1 = sgn mpz2 u1 ∧ readers mpz3 u1 = readers mpz2 u1 ∧ zones mpz3 u1 = zones mpz2 u1) -> mpz_unchanged v1 mpz3 mpz2 ∧ (readers mpz3 v1 = readers mpz2 v1 ∧ (- 2%Z < readers mpz3 v1 -> abs_value_of mpz3 v1 = abs_value_of mpz2 v1 ∧ alloc mpz3 v1 = alloc mpz2 v1 ∧ abs_size mpz3 v1 = abs_size mpz2 v1 ∧ sgn mpz3 v1 = sgn mpz2 v1 ∧ readers mpz3 v1 = readers mpz2 v1 ∧ zones mpz3 v1 = zones mpz2 v1) -> (valid up' (bv_signed usize) ∧ valid vp' (bv_signed vsize) ∧ valid wp' (bv_signed usize + bv_signed vsize) ∧ writable wp' = true ∧ (0%Z < bv_signed vsize ∧ bv_signed vsize ≤ bv_signed usize) ∧ 8%Z * bv_signed usize < 2147483647%Z ∧ bv_signed usize ≤ bv_signed (29%bv : bv 32%N) * Z.pow 2%Z 64%Z ∧ 0%Z ≤ 64%Z ∧ 64%Z ≤ 64%Z) ∧ (∀(wp'1 : C.ptr (bv 64%N)), offset wp'1 = offset wp' ∧ writable wp'1 = writable wp' ∧ zone1 wp'1 = zone1 wp' -> min wp'1 = min wp' ∧ C.max wp'1 = C.max wp' ∧ plength wp'1 = plength wp' ∧ value wp'1 (bv_signed usize + bv_signed vsize) = value up' (bv_signed usize) * value vp' (bv_signed vsize) ∧ (∀(j : Z), min wp'1 ≤ j ∧ j < offset wp'1 ∨ offset wp'1 + bv_signed usize + bv_signed vsize ≤ j ∧ j < C.max wp'1 -> pelts wp'1 j = pelts wp' j) -> (∀(o9 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o9 = true) ∧ (o9 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o10 : bv 32%N), (if decide (o9 = true) then o10 = (1%bv : bv 32%N) else o10 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o10) ∧ (∀(wsize' : bv 32%N), bv_signed wsize' = bv_signed o7 - bv_signed o10 -> (zones mpz3 u1 = zone1 up' ∧ 1%Z ≤ readers mpz3 u1 ∧ min up' = 0%Z ∧ C.max up' = plength up') ∧ (∀(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) -> mpz_eq u1 v1 = (u1 = v1) -> (¬ mpz_eq u1 v1 -> mpz_unchanged v1 mpz4 mpz2) ∧ ((¬ mpz_eq u1 v1 -> readers mpz4 v1 = readers mpz2 v1 ∧ (- 2%Z < readers mpz4 v1 -> abs_value_of mpz4 v1 = abs_value_of mpz2 v1 ∧ alloc mpz4 v1 = alloc mpz2 v1 ∧ abs_size mpz4 v1 = abs_size mpz2 v1 ∧ sgn mpz4 v1 = sgn mpz2 v1 ∧ readers mpz4 v1 = readers mpz2 v1 ∧ zones mpz4 v1 = zones mpz2 v1)) -> (zones mpz4 v1 = zone1 vp' ∧ 1%Z ≤ readers mpz4 v1 ∧ min vp' = 0%Z ∧ C.max vp' = plength vp') ∧ (∀(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) -> mpz_unchanged w mpz5 mpz3 ∧ (readers mpz5 w = readers mpz3 w ∧ (- 2%Z < readers mpz5 w -> abs_value_of mpz5 w = abs_value_of mpz3 w ∧ alloc mpz5 w = alloc mpz3 w ∧ abs_size mpz5 w = abs_size mpz3 w ∧ sgn mpz5 w = sgn mpz3 w ∧ readers mpz5 w = readers mpz3 w ∧ zones mpz5 w = zones mpz3 w) -> (∀(o11 : bool), (bv_unsigned (pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z)) = bv_unsigned (0%bv : bv 64%N) -> o11 = true) ∧ (o11 = true -> pelts wp'1 (offset wp'1 + bv_signed usize + bv_signed vsize - 1%Z) = (0%bv : bv 64%N)) -> (∀(o12 : bv 32%N), (if decide (o11 = true) then o12 = (1%bv : bv 32%N) else o12 = (0%bv : bv 32%N)) -> int'32_in_bounds (bv_signed o7 - bv_signed o12) ∧ (∀(o13 : bv 32%N), bv_signed o13 = bv_signed o7 - bv_signed o12 -> (bv_signed sign_product < 0%Z -> int'32_in_bounds (- bv_signed o13)) ∧ (∀(o14 : bv 32%N), (if decide (bv_signed sign_product < 0%Z) then bv_signed o14 = - bv_signed o13 else o14 = o13) -> (offset wp'1 = 0%Z ∧ writable wp'1 = true ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ plength wp'1 = alloc mpz5 w ∧ (readers mpz5 w = 0%Z ∨ readers mpz5 w = - 1%Z)) ∧ (∀(mpz6 : mpz_memo), alloc mpz6 = alloc mpz5 ∧ abs_size mpz6 = abs_size mpz5 ∧ sgn mpz6 = sgn mpz5 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz6 mpz5) ∧ abs_value_of mpz6 w = value wp'1 (abs_size mpz6 w) ∧ readers mpz6 w = - 1%Z ∧ zones mpz6 w = zone1 wp'1 -> (zones mpz6 w = zone1 wp'1 ∧ readers mpz6 w = - 1%Z ∧ offset wp'1 = 0%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ Z.abs (bv_signed o14) ≤ plength wp'1 ∧ plength wp'1 = alloc mpz6 w ∧ (¬ bv_signed o14 = 0%Z -> Z.pow (18446744073709551615%Z + 1%Z) (Z.abs (bv_signed o14) - 1%Z) ≤ value wp'1 (Z.abs (bv_signed o14)))) ∧ (∀(mpz7 : mpz_memo), alloc mpz7 = alloc mpz6 ∧ readers mpz7 = readers mpz6 ∧ zones mpz7 = zones mpz6 -> (∀(y : mpz_ptr), ¬ y = w -> mpz_unchanged y mpz7 mpz6) ∧ (sgn mpz7 w = 1%Z) = (0%Z ≤ bv_signed o14) ∧ (sgn mpz7 w = - 1%Z) = (bv_signed o14 < 0%Z) ∧ abs_size mpz7 w = Z.abs (bv_signed o14) ∧ abs_value_of mpz7 w = value wp'1 (Z.abs (bv_signed o14)) -> mpz_eq w w -> (¬ mpz_eq w w -> mpz_unchanged w mpz7 mpz5) ∧ ((¬ mpz_eq w w -> readers mpz7 w = readers mpz5 w ∧ (- 2%Z < readers mpz7 w -> abs_value_of mpz7 w = abs_value_of mpz5 w ∧ alloc mpz7 w = alloc mpz5 w ∧ abs_size mpz7 w = abs_size mpz5 w ∧ sgn mpz7 w = sgn mpz5 w ∧ readers mpz7 w = readers mpz5 w ∧ zones mpz7 w = zones mpz5 w)) -> (zones mpz7 w = zone1 wp'1 ∧ readers mpz7 w = - 1%Z ∧ min wp'1 = 0%Z ∧ C.max wp'1 = plength wp'1 ∧ abs_value_of mpz7 w = value wp'1 (abs_size mpz7 w)) ∧ (∀(mpz8 : mpz_memo), abs_value_of mpz8 = abs_value_of mpz7 ∧ alloc mpz8 = alloc mpz7 ∧ abs_size mpz8 = abs_size mpz7 ∧ sgn mpz8 = sgn mpz7 ∧ zones mpz8 = zones mpz7 -> readers mpz8 w = 0%Z ∧ (∀(y : mpz_ptr), ¬ y = w -> readers mpz8 y = readers mpz7 y) -> mpz_eq u1 w = (u1 = w) -> (¬ mpz_eq u1 w -> mpz_unchanged u1 mpz8 mpz5) ∧ ((¬ mpz_eq u1 w -> readers mpz8 u1 = readers mpz5 u1 ∧ (- 2%Z < readers mpz8 u1 -> abs_value_of mpz8 u1 = abs_value_of mpz5 u1 ∧ alloc mpz8 u1 = alloc mpz5 u1 ∧ abs_size mpz8 u1 = abs_size mpz5 u1 ∧ sgn mpz8 u1 = sgn mpz5 u1 ∧ readers mpz8 u1 = readers mpz5 u1 ∧ zones mpz8 u1 = zones mpz5 u1)) -> mpz_eq v1 w = (v1 = w) -> (¬ mpz_eq v1 w -> mpz_unchanged v1 mpz8 mpz5) ∧ ((¬ mpz_eq v1 w -> readers mpz8 v1 = readers mpz5 v1 ∧ (- 2%Z < readers mpz8 v1 -> abs_value_of mpz8 v1 = abs_value_of mpz5 v1 ∧ alloc mpz8 v1 = alloc mpz5 v1 ∧ abs_size mpz8 v1 = abs_size mpz5 v1 ∧ sgn mpz8 v1 = sgn mpz5 v1 ∧ readers mpz8 v1 = readers mpz5 v1 ∧ zones mpz8 v1 = zones mpz5 v1)) -> mpz_eq u1 u1 -> (∀(o15 : bool), (if decide (mpz_eq u1 u1) then o15 = true else mpz_eq u1 v1 = (u1 = v1) ∧ (if decide (mpz_eq u1 v1) then o15 = true else mpz_eq u1 w = (u1 = w) ∧ (if decide (mpz_eq u1 w) then o15 = true else o15 = (if decide (mpz_eq u1 w) then true else false) ∧ (o15 = true) = (u1 = w)))) -> (¬ o15 = true -> mpz_unchanged u1 mpz8 mpz) ∧ ((¬ o15 = true -> readers mpz8 u1 = readers mpz u1 ∧ (- 2%Z < readers mpz8 u1 -> abs_value_of mpz8 u1 = abs_value_of mpz u1 ∧ alloc mpz8 u1 = alloc mpz u1 ∧ abs_size mpz8 u1 = abs_size mpz u1 ∧ sgn mpz8 u1 = sgn mpz u1 ∧ readers mpz8 u1 = readers mpz u1 ∧ zones mpz8 u1 = zones mpz u1)) -> mpz_eq v1 u1 = (v1 = u1) -> (∀(o16 : bool), (if decide (mpz_eq v1 u1) then o16 = true else mpz_eq v1 v1 ∧ (if decide (mpz_eq v1 v1) then o16 = true else mpz_eq v1 w = (v1 = w) ∧ (if decide (mpz_eq v1 w) then o16 = true else o16 = (if decide (mpz_eq v1 w) then true else false) ∧ (o16 = true) = (v1 = w)))) -> (¬ o16 = true -> mpz_unchanged v1 mpz8 mpz) ∧ ((¬ o16 = true -> readers mpz8 v1 = readers mpz v1 ∧ (- 2%Z < readers mpz8 v1 -> abs_value_of mpz8 v1 = abs_value_of mpz v1 ∧ alloc mpz8 v1 = alloc mpz v1 ∧ abs_size mpz8 v1 = abs_size mpz v1 ∧ sgn mpz8 v1 = sgn mpz v1 ∧ readers mpz8 v1 = readers mpz v1 ∧ zones mpz8 v1 = zones mpz v1)) -> mpz_unchanged w mpz8 mpz8 ∧ value_of w mpz8 = value_of u mpz * value_of v mpz ∧ (∀(x : mpz_ptr), ¬ x = w -> mpz_unchanged x mpz8 mpz) ∧ readers mpz8 w = 0%Z ∧ readers mpz8 u = 0%Z ∧ readers mpz8 v = 0%Z)))))))))))))))))))))))))))))))))))))))))))).
Admitted.
