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.c.C.
Require Import Why3.mach.int.Unsigned.
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.ptralias.Alias.
Open Scope Z_scope.
Theorem wmpn_add'vc (sy : bv 32%N) (sx : bv 32%N) (r : ptr (bv 64%N)) (x : ptr (bv 64%N)) (y : ptr (bv 64%N)) (fact0 : 0%Z ≤ bv_signed sy) (fact1 : bv_signed sy ≤ bv_signed sx) (fact2 : valid r (bv_signed sx)) (fact3 : valid x (bv_signed sx)) (fact4 : valid y (bv_signed sy)) (fact5 : offset r = offset x ∨ offset r + bv_signed sx ≤ offset x ∨ offset x + bv_signed sx ≤ offset r) (fact6 : offset r = offset y ∨ offset r + bv_signed sx ≤ offset y ∨ offset y + bv_signed sy ≤ offset r) (fact7 : data r = data x) (fact8 : data x = data y) (fact9 : writable r = true) : 0%Z ≤ bv_signed sy ∧ valid r (bv_signed sy) ∧ valid x (bv_signed sy) ∧ valid y (bv_signed sy) ∧ (offset r = offset x ∨ offset r + bv_signed sy ≤ offset x ∨ offset x + bv_signed sy ≤ offset r) ∧ (offset r = offset y ∨ offset r + bv_signed sy ≤ offset y ∨ offset y + bv_signed sy ≤ offset r) ∧ data r = data x ∧ data x = data y ∧ writable r = true ∧ (∀(y1 : ptr (bv 64%N)) (x1 : ptr (bv 64%N)) (r1 : ptr (bv 64%N)), data y1 = data r1 ∧ length (data r1) = length (data y) ∧ offset y1 = offset y ∧ min y1 = min y ∧ C.max y1 = C.max y ∧ writable y1 = writable y ∧ zone1 y1 = zone1 y -> data x1 = data r1 ∧ length (data r1) = length (data x) ∧ offset x1 = offset x ∧ min x1 = min x ∧ C.max x1 = C.max x ∧ writable x1 = writable x ∧ zone1 x1 = zone1 x -> length (data r1) = length (data r) ∧ offset r1 = offset r ∧ min r1 = min r ∧ C.max r1 = C.max r ∧ writable r1 = writable r ∧ zone1 r1 = zone1 r -> (∀(o1 : bv 64%N), value r1 (bv_signed sy) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed sy) * bv_unsigned o1 = value x (bv_signed sy) + value y (bv_signed sy) ∧ (0%Z ≤ bv_unsigned o1 ∧ bv_unsigned o1 ≤ 1%Z) ∧ (∀(j : Z), j < offset r1 ∨ offset r1 + bv_signed sy ≤ j -> pelts r1 j = pelts r j) ∧ (offset r1 = offset x1 ∨ map_eq_sub (pelts x1) (pelts x) (offset x1) (offset x1 + bv_signed sy)) ∧ (offset r1 = offset y1 ∨ map_eq_sub (pelts y1) (pelts y) (offset y1) (offset y1 + bv_signed sy)) -> (∀(o2 : bool), (bv_unsigned o1 = bv_unsigned (0%bv : bv 64%N) -> o2 = true) ∧ (o2 = true -> o1 = (0%bv : bv 64%N)) -> (if decide (¬ o2 = true) then ((bv_signed sy ≤ bv_signed sy ∧ bv_signed sy ≤ bv_signed sx) ∧ value r1 (bv_signed sy) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed sy) * bv_unsigned o1 = value x (bv_signed sy) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r1 ∨ offset r1 + bv_signed sy ≤ j -> pelts r1 j = pelts r j) ∧ pelts x1 = pelts r1 ∧ pelts y1 = pelts r1 ∧ (offset r1 = offset x1 ∨ map_eq_sub (pelts x1) (pelts x) (offset x1) (offset x1 + bv_signed sx)) ∧ (offset r1 = offset y1 ∨ map_eq_sub (pelts y1) (pelts y) (offset y1) (offset y1 + bv_signed sy)) ∧ (0%Z ≤ bv_unsigned o1 ∧ bv_unsigned o1 ≤ 1%Z) ∧ (sy = sx ∨ bv_unsigned o1 = 1%Z)) ∧ (∀(i : bv 32%N) (c : bv 64%N) (y2 : ptr (bv 64%N)) (x2 : ptr (bv 64%N)) (r2 : ptr (bv 64%N)), data y2 = data r2 ∧ length (data r2) = length (data y1) ∧ offset y2 = offset y1 ∧ min y2 = min y1 ∧ C.max y2 = C.max y1 ∧ writable y2 = writable y1 ∧ zone1 y2 = zone1 y1 -> data x2 = data r2 ∧ length (data r2) = length (data x1) ∧ offset x2 = offset x1 ∧ min x2 = min x1 ∧ C.max x2 = C.max x1 ∧ writable x2 = writable x1 ∧ zone1 x2 = zone1 x1 -> length (data r2) = length (data r1) ∧ offset r2 = offset r1 ∧ min r2 = min r1 ∧ C.max r2 = C.max r1 ∧ writable r2 = writable r1 ∧ zone1 r2 = zone1 r1 -> (bv_signed sy ≤ bv_signed i ∧ bv_signed i ≤ bv_signed sx) ∧ value r2 (bv_signed i) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed i) * bv_unsigned c = value x (bv_signed i) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r2 ∨ offset r2 + bv_signed i ≤ j -> pelts r2 j = pelts r j) ∧ pelts x2 = pelts r2 ∧ pelts y2 = pelts r2 ∧ (offset r2 = offset x2 ∨ map_eq_sub (pelts x2) (pelts x) (offset x2) (offset x2 + bv_signed sx)) ∧ (offset r2 = offset y2 ∨ map_eq_sub (pelts y2) (pelts y) (offset y2) (offset y2 + bv_signed sy)) ∧ (0%Z ≤ bv_unsigned c ∧ bv_unsigned c ≤ 1%Z) ∧ (i = sx ∨ bv_unsigned c = 1%Z) -> (if decide (bv_signed i < bv_signed sx) then (min x2 ≤ offset x2 + bv_signed i ∧ offset x2 + bv_signed i < C.max x2) ∧ (min x ≤ offset x + bv_signed i ∧ offset x + bv_signed i < C.max x) ∧ (∀(res : bv 64%N), bv_unsigned res = ZEuclid.modulo (bv_unsigned (pelts x2 (offset x2 + bv_signed i)) + 1%Z) (18446744073709551615%Z + 1%Z) -> ((min r2 ≤ offset r2 + bv_signed i ∧ offset r2 + bv_signed i < C.max r2) ∧ writable r2 = true) ∧ (∀(y3 : ptr (bv 64%N)) (x3 : ptr (bv 64%N)) (r3 : ptr (bv 64%N)), data y3 = data r3 ∧ length (data r3) = length (data y2) ∧ offset y3 = offset y2 ∧ min y3 = min y2 ∧ C.max y3 = C.max y2 ∧ writable y3 = writable y2 ∧ zone1 y3 = zone1 y2 -> data x3 = data r3 ∧ length (data r3) = length (data x2) ∧ offset x3 = offset x2 ∧ min x3 = min x2 ∧ C.max x3 = C.max x2 ∧ writable x3 = writable x2 ∧ zone1 x3 = zone1 x2 -> length (data r3) = length (data r2) ∧ offset r3 = offset r2 ∧ min r3 = min r2 ∧ C.max r3 = C.max r2 ∧ writable r3 = writable r2 ∧ zone1 r3 = zone1 r2 -> pelts r3 = fun_updt (pelts r2) (offset r3 + bv_signed i) res ∧ pelts r3 (offset r3 + bv_signed i) = res -> int'32_in_bounds (bv_signed i + 1%Z) ∧ (∀(o3 : bv 32%N), bv_signed o3 = bv_signed i + 1%Z -> (∀(o4 : bool), (bv_unsigned res = bv_unsigned (0%bv : bv 64%N) -> o4 = true) ∧ (o4 = true -> res = (0%bv : bv 64%N)) -> (if decide (¬ o4 = true) then ((bv_signed sy ≤ bv_signed o3 ∧ bv_signed o3 ≤ bv_signed sx) ∧ (o3 = sx ∨ bv_unsigned (0%bv : bv 64%N) = 0%Z) ∧ value r3 (bv_signed o3) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed o3) * bv_unsigned (0%bv : bv 64%N) = value x (bv_signed o3) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r3 ∨ offset r3 + bv_signed o3 ≤ j -> pelts r3 j = pelts r j) ∧ pelts x3 = pelts r3 ∧ pelts y3 = pelts r3 ∧ (offset r3 = offset x3 ∨ map_eq_sub (pelts x3) (pelts x) (offset x3) (offset x3 + bv_signed sx)) ∧ (offset r3 = offset y3 ∨ map_eq_sub (pelts y3) (pelts y) (offset y3) (offset y3 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned (0%bv : bv 64%N) ∧ bv_unsigned (0%bv : bv 64%N) ≤ 1%Z) ∧ (∀(i1 : bv 32%N) (y4 : ptr (bv 64%N)) (x4 : ptr (bv 64%N)) (r4 : ptr (bv 64%N)), data y4 = data r4 ∧ length (data r4) = length (data y3) ∧ offset y4 = offset y3 ∧ min y4 = min y3 ∧ C.max y4 = C.max y3 ∧ writable y4 = writable y3 ∧ zone1 y4 = zone1 y3 -> data x4 = data r4 ∧ length (data r4) = length (data x3) ∧ offset x4 = offset x3 ∧ min x4 = min x3 ∧ C.max x4 = C.max x3 ∧ writable x4 = writable x3 ∧ zone1 x4 = zone1 x3 -> length (data r4) = length (data r3) ∧ offset r4 = offset r3 ∧ min r4 = min r3 ∧ C.max r4 = C.max r3 ∧ writable r4 = writable r3 ∧ zone1 r4 = zone1 r3 -> (bv_signed sy ≤ bv_signed i1 ∧ bv_signed i1 ≤ bv_signed sx) ∧ (i1 = sx ∨ bv_unsigned (0%bv : bv 64%N) = 0%Z) ∧ value r4 (bv_signed i1) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed i1) * bv_unsigned (0%bv : bv 64%N) = value x (bv_signed i1) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r4 ∨ offset r4 + bv_signed i1 ≤ j -> pelts r4 j = pelts r j) ∧ pelts x4 = pelts r4 ∧ pelts y4 = pelts r4 ∧ (offset r4 = offset x4 ∨ map_eq_sub (pelts x4) (pelts x) (offset x4) (offset x4 + bv_signed sx)) ∧ (offset r4 = offset y4 ∨ map_eq_sub (pelts y4) (pelts y) (offset y4) (offset y4 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned (0%bv : bv 64%N) ∧ bv_unsigned (0%bv : bv 64%N) ≤ 1%Z -> (if decide (bv_signed i1 < bv_signed sx) then (min x4 ≤ offset x4 + bv_signed i1 ∧ offset x4 + bv_signed i1 < C.max x4) ∧ (min x ≤ offset x + bv_signed i1 ∧ offset x + bv_signed i1 < C.max x) ∧ ((min r4 ≤ offset r4 + bv_signed i1 ∧ offset r4 + bv_signed i1 < C.max r4) ∧ writable r4 = true) ∧ (∀(y5 : ptr (bv 64%N)) (x5 : ptr (bv 64%N)) (r5 : ptr (bv 64%N)), data y5 = data r5 ∧ length (data r5) = length (data y4) ∧ offset y5 = offset y4 ∧ min y5 = min y4 ∧ C.max y5 = C.max y4 ∧ writable y5 = writable y4 ∧ zone1 y5 = zone1 y4 -> data x5 = data r5 ∧ length (data r5) = length (data x4) ∧ offset x5 = offset x4 ∧ min x5 = min x4 ∧ C.max x5 = C.max x4 ∧ writable x5 = writable x4 ∧ zone1 x5 = zone1 x4 -> length (data r5) = length (data r4) ∧ offset r5 = offset r4 ∧ min r5 = min r4 ∧ C.max r5 = C.max r4 ∧ writable r5 = writable r4 ∧ zone1 r5 = zone1 r4 -> pelts r5 = fun_updt (pelts r4) (offset r5 + bv_signed i1) (pelts x4 (offset x4 + bv_signed i1)) ∧ pelts r5 (offset r5 + bv_signed i1) = pelts x4 (offset x4 + bv_signed i1) -> int'32_in_bounds (bv_signed i1 + 1%Z) ∧ (∀(o5 : bv 32%N), bv_signed o5 = bv_signed i1 + 1%Z -> (0%Z ≤ bv_signed sx - bv_signed i1 ∧ bv_signed sx - bv_signed o5 < bv_signed sx - bv_signed i1) ∧ (bv_signed sy ≤ bv_signed o5 ∧ bv_signed o5 ≤ bv_signed sx) ∧ (o5 = sx ∨ bv_unsigned (0%bv : bv 64%N) = 0%Z) ∧ value r5 (bv_signed o5) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed o5) * bv_unsigned (0%bv : bv 64%N) = value x (bv_signed o5) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r5 ∨ offset r5 + bv_signed o5 ≤ j -> pelts r5 j = pelts r j) ∧ pelts x5 = pelts r5 ∧ pelts y5 = pelts r5 ∧ (offset r5 = offset x5 ∨ map_eq_sub (pelts x5) (pelts x) (offset x5) (offset x5 + bv_signed sx)) ∧ (offset r5 = offset y5 ∨ map_eq_sub (pelts y5) (pelts y) (offset y5) (offset y5 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned (0%bv : bv 64%N) ∧ bv_unsigned (0%bv : bv 64%N) ≤ 1%Z)) else value r4 (bv_signed sx) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed sx) * bv_unsigned (0%bv : bv 64%N) = value x (bv_signed sx) + value y (bv_signed sy) ∧ (0%Z ≤ bv_unsigned (0%bv : bv 64%N) ∧ bv_unsigned (0%bv : bv 64%N) ≤ 1%Z) ∧ (∀(j : Z), j < offset r4 ∨ offset r4 + bv_signed sx ≤ j -> pelts r4 j = pelts r j) ∧ (offset r4 = offset x4 ∨ map_eq_sub (pelts x4) (pelts x) (offset x4) (offset x4 + bv_signed sx)) ∧ (offset r4 = offset y4 ∨ map_eq_sub (pelts y4) (pelts y) (offset y4) (offset y4 + bv_signed sy)))) else (0%Z ≤ bv_signed sx - bv_signed i ∧ bv_signed sx - bv_signed o3 < bv_signed sx - bv_signed i) ∧ (bv_signed sy ≤ bv_signed o3 ∧ bv_signed o3 ≤ bv_signed sx) ∧ value r3 (bv_signed o3) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed o3) * bv_unsigned c = value x (bv_signed o3) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r3 ∨ offset r3 + bv_signed o3 ≤ j -> pelts r3 j = pelts r j) ∧ pelts x3 = pelts r3 ∧ pelts y3 = pelts r3 ∧ (offset r3 = offset x3 ∨ map_eq_sub (pelts x3) (pelts x) (offset x3) (offset x3 + bv_signed sx)) ∧ (offset r3 = offset y3 ∨ map_eq_sub (pelts y3) (pelts y) (offset y3) (offset y3 + bv_signed sy)) ∧ (0%Z ≤ bv_unsigned c ∧ bv_unsigned c ≤ 1%Z) ∧ (o3 = sx ∨ bv_unsigned c = 1%Z)))))) else ((bv_signed sy ≤ bv_signed i ∧ bv_signed i ≤ bv_signed sx) ∧ (i = sx ∨ bv_unsigned c = 0%Z) ∧ value r2 (bv_signed i) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed i) * bv_unsigned c = value x (bv_signed i) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r2 ∨ offset r2 + bv_signed i ≤ j -> pelts r2 j = pelts r j) ∧ pelts x2 = pelts r2 ∧ pelts y2 = pelts r2 ∧ (offset r2 = offset x2 ∨ map_eq_sub (pelts x2) (pelts x) (offset x2) (offset x2 + bv_signed sx)) ∧ (offset r2 = offset y2 ∨ map_eq_sub (pelts y2) (pelts y) (offset y2) (offset y2 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned c ∧ bv_unsigned c ≤ 1%Z) ∧ (∀(i1 : bv 32%N) (y3 : ptr (bv 64%N)) (x3 : ptr (bv 64%N)) (r3 : ptr (bv 64%N)), data y3 = data r3 ∧ length (data r3) = length (data y2) ∧ offset y3 = offset y2 ∧ min y3 = min y2 ∧ C.max y3 = C.max y2 ∧ writable y3 = writable y2 ∧ zone1 y3 = zone1 y2 -> data x3 = data r3 ∧ length (data r3) = length (data x2) ∧ offset x3 = offset x2 ∧ min x3 = min x2 ∧ C.max x3 = C.max x2 ∧ writable x3 = writable x2 ∧ zone1 x3 = zone1 x2 -> length (data r3) = length (data r2) ∧ offset r3 = offset r2 ∧ min r3 = min r2 ∧ C.max r3 = C.max r2 ∧ writable r3 = writable r2 ∧ zone1 r3 = zone1 r2 -> (bv_signed sy ≤ bv_signed i1 ∧ bv_signed i1 ≤ bv_signed sx) ∧ (i1 = sx ∨ bv_unsigned c = 0%Z) ∧ value r3 (bv_signed i1) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed i1) * bv_unsigned c = value x (bv_signed i1) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r3 ∨ offset r3 + bv_signed i1 ≤ j -> pelts r3 j = pelts r j) ∧ pelts x3 = pelts r3 ∧ pelts y3 = pelts r3 ∧ (offset r3 = offset x3 ∨ map_eq_sub (pelts x3) (pelts x) (offset x3) (offset x3 + bv_signed sx)) ∧ (offset r3 = offset y3 ∨ map_eq_sub (pelts y3) (pelts y) (offset y3) (offset y3 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned c ∧ bv_unsigned c ≤ 1%Z -> (if decide (bv_signed i1 < bv_signed sx) then (min x3 ≤ offset x3 + bv_signed i1 ∧ offset x3 + bv_signed i1 < C.max x3) ∧ (min x ≤ offset x + bv_signed i1 ∧ offset x + bv_signed i1 < C.max x) ∧ ((min r3 ≤ offset r3 + bv_signed i1 ∧ offset r3 + bv_signed i1 < C.max r3) ∧ writable r3 = true) ∧ (∀(y4 : ptr (bv 64%N)) (x4 : ptr (bv 64%N)) (r4 : ptr (bv 64%N)), data y4 = data r4 ∧ length (data r4) = length (data y3) ∧ offset y4 = offset y3 ∧ min y4 = min y3 ∧ C.max y4 = C.max y3 ∧ writable y4 = writable y3 ∧ zone1 y4 = zone1 y3 -> data x4 = data r4 ∧ length (data r4) = length (data x3) ∧ offset x4 = offset x3 ∧ min x4 = min x3 ∧ C.max x4 = C.max x3 ∧ writable x4 = writable x3 ∧ zone1 x4 = zone1 x3 -> length (data r4) = length (data r3) ∧ offset r4 = offset r3 ∧ min r4 = min r3 ∧ C.max r4 = C.max r3 ∧ writable r4 = writable r3 ∧ zone1 r4 = zone1 r3 -> pelts r4 = fun_updt (pelts r3) (offset r4 + bv_signed i1) (pelts x3 (offset x3 + bv_signed i1)) ∧ pelts r4 (offset r4 + bv_signed i1) = pelts x3 (offset x3 + bv_signed i1) -> int'32_in_bounds (bv_signed i1 + 1%Z) ∧ (∀(o3 : bv 32%N), bv_signed o3 = bv_signed i1 + 1%Z -> (0%Z ≤ bv_signed sx - bv_signed i1 ∧ bv_signed sx - bv_signed o3 < bv_signed sx - bv_signed i1) ∧ (bv_signed sy ≤ bv_signed o3 ∧ bv_signed o3 ≤ bv_signed sx) ∧ (o3 = sx ∨ bv_unsigned c = 0%Z) ∧ value r4 (bv_signed o3) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed o3) * bv_unsigned c = value x (bv_signed o3) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r4 ∨ offset r4 + bv_signed o3 ≤ j -> pelts r4 j = pelts r j) ∧ pelts x4 = pelts r4 ∧ pelts y4 = pelts r4 ∧ (offset r4 = offset x4 ∨ map_eq_sub (pelts x4) (pelts x) (offset x4) (offset x4 + bv_signed sx)) ∧ (offset r4 = offset y4 ∨ map_eq_sub (pelts y4) (pelts y) (offset y4) (offset y4 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned c ∧ bv_unsigned c ≤ 1%Z)) else value r3 (bv_signed sx) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed sx) * bv_unsigned c = value x (bv_signed sx) + value y (bv_signed sy) ∧ (0%Z ≤ bv_unsigned c ∧ bv_unsigned c ≤ 1%Z) ∧ (∀(j : Z), j < offset r3 ∨ offset r3 + bv_signed sx ≤ j -> pelts r3 j = pelts r j) ∧ (offset r3 = offset x3 ∨ map_eq_sub (pelts x3) (pelts x) (offset x3) (offset x3 + bv_signed sx)) ∧ (offset r3 = offset y3 ∨ map_eq_sub (pelts y3) (pelts y) (offset y3) (offset y3 + bv_signed sy)))))) else ((bv_signed sy ≤ bv_signed sy ∧ bv_signed sy ≤ bv_signed sx) ∧ (sy = sx ∨ bv_unsigned o1 = 0%Z) ∧ value r1 (bv_signed sy) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed sy) * bv_unsigned o1 = value x (bv_signed sy) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r1 ∨ offset r1 + bv_signed sy ≤ j -> pelts r1 j = pelts r j) ∧ pelts x1 = pelts r1 ∧ pelts y1 = pelts r1 ∧ (offset r1 = offset x1 ∨ map_eq_sub (pelts x1) (pelts x) (offset x1) (offset x1 + bv_signed sx)) ∧ (offset r1 = offset y1 ∨ map_eq_sub (pelts y1) (pelts y) (offset y1) (offset y1 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned o1 ∧ bv_unsigned o1 ≤ 1%Z) ∧ (∀(i : bv 32%N) (y2 : ptr (bv 64%N)) (x2 : ptr (bv 64%N)) (r2 : ptr (bv 64%N)), data y2 = data r2 ∧ length (data r2) = length (data y1) ∧ offset y2 = offset y1 ∧ min y2 = min y1 ∧ C.max y2 = C.max y1 ∧ writable y2 = writable y1 ∧ zone1 y2 = zone1 y1 -> data x2 = data r2 ∧ length (data r2) = length (data x1) ∧ offset x2 = offset x1 ∧ min x2 = min x1 ∧ C.max x2 = C.max x1 ∧ writable x2 = writable x1 ∧ zone1 x2 = zone1 x1 -> length (data r2) = length (data r1) ∧ offset r2 = offset r1 ∧ min r2 = min r1 ∧ C.max r2 = C.max r1 ∧ writable r2 = writable r1 ∧ zone1 r2 = zone1 r1 -> (bv_signed sy ≤ bv_signed i ∧ bv_signed i ≤ bv_signed sx) ∧ (i = sx ∨ bv_unsigned o1 = 0%Z) ∧ value r2 (bv_signed i) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed i) * bv_unsigned o1 = value x (bv_signed i) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r2 ∨ offset r2 + bv_signed i ≤ j -> pelts r2 j = pelts r j) ∧ pelts x2 = pelts r2 ∧ pelts y2 = pelts r2 ∧ (offset r2 = offset x2 ∨ map_eq_sub (pelts x2) (pelts x) (offset x2) (offset x2 + bv_signed sx)) ∧ (offset r2 = offset y2 ∨ map_eq_sub (pelts y2) (pelts y) (offset y2) (offset y2 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned o1 ∧ bv_unsigned o1 ≤ 1%Z -> (if decide (bv_signed i < bv_signed sx) then (min x2 ≤ offset x2 + bv_signed i ∧ offset x2 + bv_signed i < C.max x2) ∧ (min x ≤ offset x + bv_signed i ∧ offset x + bv_signed i < C.max x) ∧ ((min r2 ≤ offset r2 + bv_signed i ∧ offset r2 + bv_signed i < C.max r2) ∧ writable r2 = true) ∧ (∀(y3 : ptr (bv 64%N)) (x3 : ptr (bv 64%N)) (r3 : ptr (bv 64%N)), data y3 = data r3 ∧ length (data r3) = length (data y2) ∧ offset y3 = offset y2 ∧ min y3 = min y2 ∧ C.max y3 = C.max y2 ∧ writable y3 = writable y2 ∧ zone1 y3 = zone1 y2 -> data x3 = data r3 ∧ length (data r3) = length (data x2) ∧ offset x3 = offset x2 ∧ min x3 = min x2 ∧ C.max x3 = C.max x2 ∧ writable x3 = writable x2 ∧ zone1 x3 = zone1 x2 -> length (data r3) = length (data r2) ∧ offset r3 = offset r2 ∧ min r3 = min r2 ∧ C.max r3 = C.max r2 ∧ writable r3 = writable r2 ∧ zone1 r3 = zone1 r2 -> pelts r3 = fun_updt (pelts r2) (offset r3 + bv_signed i) (pelts x2 (offset x2 + bv_signed i)) ∧ pelts r3 (offset r3 + bv_signed i) = pelts x2 (offset x2 + bv_signed i) -> int'32_in_bounds (bv_signed i + 1%Z) ∧ (∀(o3 : bv 32%N), bv_signed o3 = bv_signed i + 1%Z -> (0%Z ≤ bv_signed sx - bv_signed i ∧ bv_signed sx - bv_signed o3 < bv_signed sx - bv_signed i) ∧ (bv_signed sy ≤ bv_signed o3 ∧ bv_signed o3 ≤ bv_signed sx) ∧ (o3 = sx ∨ bv_unsigned o1 = 0%Z) ∧ value r3 (bv_signed o3) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed o3) * bv_unsigned o1 = value x (bv_signed o3) + value y (bv_signed sy) ∧ (∀(j : Z), j < offset r3 ∨ offset r3 + bv_signed o3 ≤ j -> pelts r3 j = pelts r j) ∧ pelts x3 = pelts r3 ∧ pelts y3 = pelts r3 ∧ (offset r3 = offset x3 ∨ map_eq_sub (pelts x3) (pelts x) (offset x3) (offset x3 + bv_signed sx)) ∧ (offset r3 = offset y3 ∨ map_eq_sub (pelts y3) (pelts y) (offset y3) (offset y3 + bv_signed sy)) ∧ 0%Z ≤ bv_unsigned o1 ∧ bv_unsigned o1 ≤ 1%Z)) else value r2 (bv_signed sx) + Z.pow (18446744073709551615%Z + 1%Z) (bv_signed sx) * bv_unsigned o1 = value x (bv_signed sx) + value y (bv_signed sy) ∧ (0%Z ≤ bv_unsigned o1 ∧ bv_unsigned o1 ≤ 1%Z) ∧ (∀(j : Z), j < offset r2 ∨ offset r2 + bv_signed sx ≤ j -> pelts r2 j = pelts r j) ∧ (offset r2 = offset x2 ∨ map_eq_sub (pelts x2) (pelts x) (offset x2) (offset x2 + bv_signed sx)) ∧ (offset r2 = offset y2 ∨ map_eq_sub (pelts y2) (pelts y) (offset y2) (offset y2 + bv_signed sy)))))))).
Admitted.
