diff --git a/config/caisar-detection-data.conf b/config/caisar-detection-data.conf index fb7c5b65596e40857035a027327456753682af85..01bee760bc64463e08ad5866aea4f2186bc94c59 100644 --- a/config/caisar-detection-data.conf +++ b/config/caisar-detection-data.conf @@ -27,6 +27,6 @@ exec = "pyrat.py" version_switch = "--version" version_regexp = "PyRAT \\([0-9.]+\\)" version_ok = "1.0" -command = "%e --timeout %t %f" -driver = "drivers/pyrat" +command = "%e %f" +driver = "caisar_drivers/pyrat.drv" use_at_auto_level = 1 diff --git a/config/drivers/pyrat.drv b/config/drivers/pyrat.drv index 0a07e0cfbfb0bf2e7d4d1736a5ad5c608d6146b3..6c21b2b1c93ad95f30422e0fba2a26ad54d6685b 100644 --- a/config/drivers/pyrat.drv +++ b/config/drivers/pyrat.drv @@ -1 +1,201 @@ (* Why3 drivers for PyRAT *) + +(* additional regexp for detection of answers, needed for alt-ergo <= 0.99 *) +valid "^Inconsistent assumption$" + + +printer "alt-ergo" +filename "%f-%t-%g.why" + +valid "^File \".*\", line [0-9]+, characters [0-9]+-[0-9]+:Valid" +invalid "^File \".*\", line [0-9]+, characters [0-9]+-[0-9]+:Invalid" +unknown "^File \".*\", line [0-9]+, characters [0-9]+-[0-9]+:I don't know" "" +timeout "^File \".*\", line [0-9]+, characters [0-9]+-[0-9]+:Timeout" +timeout "^Timeout$" +steplimitexceeded "^File \".*\", line [0-9]+, characters [0-9]+-[0-9]+:Steps limit reached" +outofmemory "Fatal error: out of memory" +outofmemory "Fatal error: exception Stack_overflow" +fail "typing error:\\(.*\\)$" "Failure : File generation error : \\1" +time "Valid (%s)" +time "Valid (%s)" +steps "Valid (\\([0-9]+.?[0-9]*\\)) (\\([0-9]+.?[0-9]*\\))" 2 +steps "Valid (\\([0-9]+.?[0-9]*\\)) (\\([0-9]+.?[0-9]*\\) steps)" 2 +time "why3cpulimit time : %s s" + +transformation "inline_trivial" + +transformation "eliminate_builtin" +transformation "eliminate_recursion" +transformation "eliminate_inductive" +transformation "eliminate_algebraic" +transformation "eliminate_literal" +transformation "eliminate_epsilon" +transformation "eliminate_let_term" +transformation "split_premise_right" +transformation "simplify_formula" + +theory BuiltIn + syntax type int "int" + syntax type real "real" + + syntax predicate (=) "(%1 = %2)" + + meta "eliminate_algebraic" "keep_enums" + meta "eliminate_algebraic" "keep_recs" + +end + +theory int.Int + + prelude "(* this is a prelude for Alt-Ergo integer arithmetic *)" + + syntax function zero "0" + syntax function one "1" + + syntax function (+) "(%1 + %2)" + syntax function (-) "(%1 - %2)" + syntax function (*) "(%1 * %2)" + syntax function (-_) "(-%1)" + + meta "invalid trigger" predicate (<=) + meta "invalid trigger" predicate (<) + meta "invalid trigger" predicate (>=) + meta "invalid trigger" predicate (>) + + syntax predicate (<=) "(%1 <= %2)" + syntax predicate (<) "(%1 < %2)" + syntax predicate (>=) "(%1 >= %2)" + syntax predicate (>) "(%1 > %2)" + + remove prop MulComm.Comm + remove prop MulAssoc.Assoc + remove prop Unit_def_l + remove prop Unit_def_r + remove prop Inv_def_l + remove prop Inv_def_r + remove prop Assoc + remove prop Mul_distr_l + remove prop Mul_distr_r + remove prop Comm + remove prop Unitary + remove prop Refl + remove prop Trans + remove prop Total + remove prop Antisymm + remove prop NonTrivialRing + remove prop CompatOrderAdd + remove prop ZeroLessOne + +end + +theory int.EuclideanDivision + + syntax function div "(%1 / %2)" + syntax function mod "(%1 % %2)" + +end + +theory int.ComputerDivision + + use for_drivers.ComputerOfEuclideanDivision + +end + + +theory real.Real + + prelude "(* this is a prelude for Alt-Ergo real arithmetic *)" + + syntax function zero "0.0" + syntax function one "1.0" + + syntax function (+) "(%1 + %2)" + syntax function (-) "(%1 - %2)" + syntax function (*) "(%1 * %2)" + syntax function (/) "(%1 / %2)" + syntax function (-_) "(-%1)" + syntax function inv "(1.0 / %1)" + + meta "invalid trigger" predicate (<=) + meta "invalid trigger" predicate (<) + meta "invalid trigger" predicate (>=) + meta "invalid trigger" predicate (>) + + syntax predicate (<=) "(%1 <= %2)" + syntax predicate (<) "(%1 < %2)" + syntax predicate (>=) "(%1 >= %2)" + syntax predicate (>) "(%1 > %2)" + + remove prop MulComm.Comm + remove prop MulAssoc.Assoc + remove prop Unit_def_l + remove prop Unit_def_r + remove prop Inv_def_l + remove prop Inv_def_r + remove prop Assoc + remove prop Mul_distr_l + remove prop Mul_distr_r + remove prop Comm + remove prop Unitary + remove prop Refl + remove prop Trans + remove prop Total + remove prop Antisymm + remove prop Inverse + remove prop NonTrivialRing + remove prop CompatOrderAdd + remove prop ZeroLessOne + +end + +theory real.RealInfix + + syntax function (+.) "(%1 + %2)" + syntax function (-.) "(%1 - %2)" + syntax function ( *.) "(%1 * %2)" + syntax function (/.) "(%1 / %2)" + syntax function (-._) "(-%1)" + + meta "invalid trigger" predicate (<=.) + meta "invalid trigger" predicate (<.) + meta "invalid trigger" predicate (>=.) + meta "invalid trigger" predicate (>.) + + syntax predicate (<=.) "(%1 <= %2)" + syntax predicate (<.) "(%1 < %2)" + syntax predicate (>=.) "(%1 >= %2)" + syntax predicate (>.) "(%1 > %2)" + +end + +theory Bool + syntax type bool "bool" + syntax function True "true" + syntax function False "false" +end + +theory Tuple0 + syntax type tuple0 "unit" + syntax function Tuple0 "void" +end + +theory algebra.AC + meta AC function op + remove prop Comm + remove prop Assoc +end + +theory HighOrd + syntax type (->) "(%1,%2) farray" + syntax function (@) "(%1[%2])" +end + +theory map.Map + syntax function get "(%1[%2])" + syntax function set "(%1[%2 <- %3])" +end + +theory ieee_float.Float64 + syntax predicate is_not_nan "" + remove allprops +end diff --git a/config/dune b/config/dune index f1aaaab0addab9813c2381ff31de72070d539a85..bd74fc9e54339523e4580c0730c4728a9cc4e2d8 100644 --- a/config/dune +++ b/config/dune @@ -1,4 +1,6 @@ (install (section (site (caisar config))) - (files caisar-detection-data.conf) + (files caisar-detection-data.conf + (drivers/pyrat.drv as drivers/pyrat.drv) + ) (package caisar)) diff --git a/src/autodetection.ml b/src/autodetection.ml index 80435a03342219d8ff8b3b35b58ffd5a1d7fc501..f3984ac7faccb559ac8ebcfb3db24d7694d330c9 100644 --- a/src/autodetection.ml +++ b/src/autodetection.ml @@ -19,7 +19,9 @@ let rec lookup_file dirs filename = let autodetect ~debug () = let open Why3 in if debug then Debug.set_flag Autodetection.debug; - let caisar_conf = lookup_file Dirs.Sites.config "caisar-detection-data.conf" in + let caisar_conf = + lookup_file Dirs.Sites.config "caisar-detection-data.conf" + in let data = Autodetection.Prover_autodetection_data.from_file caisar_conf in let config = Whyconf.init_config (Some null) in let binaries = Autodetection.request_binaries_version config data in diff --git a/src/main.ml b/src/main.ml index c22b8dc970ede6879fb4c927055d1b9e9fe16e2b..c4ea8291114014035fd962818d426c2b233ef26f 100644 --- a/src/main.ml +++ b/src/main.ml @@ -59,8 +59,8 @@ let config detect () = provers) end -let verify format loadpath files = - List.iter ~f:(Verification.verify format loadpath) files +let verify format loadpath files prover = + List.iter ~f:(fun x -> Verification.verify format loadpath x prover) files let exec_cmd cmdname cmd = Logs.debug (fun m -> m "Command `%s'." cmdname); @@ -121,6 +121,10 @@ let verify_cmd = let doc = "additional loadpath" in Arg.(value & opt_all string [] & info [ "L" ] ~doc) in + let prover = + let doc = "Prover to use" in + Arg.(required & opt (some string) None & info [ "prover" ] ~doc) + in let doc = "Property verification of neural networks." in let exits = Term.default_exits in let man = @@ -130,9 +134,10 @@ let verify_cmd = in ( Term.( ret - (const (fun format loadpath files -> - `Ok (exec_cmd cmdname (fun () -> verify format loadpath files))) - $ format $ loadpath $ files)), + (const (fun format loadpath files prover -> + `Ok + (exec_cmd cmdname (fun () -> verify format loadpath files prover))) + $ format $ loadpath $ files $ prover)), Term.info cmdname ~sdocs:Manpage.s_common_options ~exits ~doc ~man ) let default_cmd = diff --git a/src/verification.ml b/src/verification.ml index f4ba6da943c70b5317ba43aa0caf6d48030383e7..54088494542baef589c6ff8e8d60a4ecf226a556 100644 --- a/src/verification.ml +++ b/src/verification.ml @@ -18,9 +18,9 @@ let create_env loadpath = (loadpath @ stdlib @ Whyconf.loadpath (Whyconf.get_main config)), config ) -let altergo = Why3.Whyconf.mk_filter_prover "Alt-Ergo" +let mkfilter prover = Why3.Whyconf.mk_filter_prover prover -let verify format loadpath file = +let verify format loadpath file prover = let open Why3 in let env, config = create_env loadpath in let _, mstr_theory = @@ -34,7 +34,17 @@ let verify format loadpath file = Wstdlib.Mstr.iter (fun _ theory -> let tasks = Task.split_theory theory None None in - let prover = Whyconf.filter_one_prover config altergo in - let driver = Whyconf.(load_driver (get_main config) env prover) in + let prover = Whyconf.filter_one_prover config (mkfilter prover) in + let driver = + match String.chop_prefix ~prefix:"caisar_drivers/" prover.driver with + | None -> Whyconf.(load_driver (get_main config) env prover) + | Some file -> + let file = + Caml.Filename.concat + (Caml.Filename.concat (List.hd_exn Dirs.Sites.config) "drivers") + file + in + Driver.load_driver_absolute env file prover.extra_drivers + in List.iter tasks ~f:(Format.printf "%a" (Driver.print_task driver))) mstr_theory diff --git a/tests/autodetect.t b/tests/autodetect.t index 13344dc8202dcd19199cb4781c5a689799c04822..6f08613f5314de89df20c7c404db55fdd0eb5077 100644 --- a/tests/autodetect.t +++ b/tests/autodetect.t @@ -1,5 +1,3 @@ Test autodetect $ caisar config -d [caisar] Alt-Ergo 2.4.0 - Marabou 1.0.+ - PyRAT 1.0 diff --git a/tests/simple.t b/tests/simple.t index c5d8729b3373d9c0720660b62d0ce091a5892ad9..56a0a7502052c0afdb26e826bb70fec3f101e6c4 100644 --- a/tests/simple.t +++ b/tests/simple.t @@ -1,5 +1,19 @@ Test verify - $ caisar verify -L . --format whyml - 2>&1 <<EOF | sed 's/\/tmp\/[a-z0-9./]*/$TMPFILE/' + $ mkdir bin + + $ cat - > bin/pyrat.py << EOF + > #!/bin/sh + > echo "PyRAT 1.0" + > EOF + + $ chmod u+x bin/pyrat.py + + $ bin/pyrat.py + PyRAT 1.0 + + $ PATH=$(pwd)/bin:$PATH + + $ caisar verify -L . --format whyml --prover=PyRAT - 2>&1 <<EOF | sed 's/\/tmp\/[a-z0-9./]*/$TMPFILE/' > theory T > use TestNetwork.AsTuple > use ieee_float.Float64 @@ -14,6 +28,9 @@ Test verify <autodetect>0 prover(s) added <autodetect>Generating strategies: <autodetect>Run: (Marabou --version) > $TMPFILE 2>&1 + <autodetect>command 'Marabou --version' failed. Output: + sh: 1: Marabou: not found + <autodetect>Run: (alt-ergo --version) > $TMPFILE 2>&1 <autodetect>Run: (alt-ergo-2.4.0 --version) > $TMPFILE 2>&1 <autodetect>command 'alt-ergo-2.4.0 --version' failed. Output: @@ -21,10 +38,8 @@ Test verify <autodetect>Run: (pyrat.py --version) > $TMPFILE 2>&1 <autodetect>Found prover Alt-Ergo version 2.4.0, OK. - <autodetect>Found prover Marabou version 1.0.+, OK. <autodetect>Found prover PyRAT version 1.0, OK. - <autodetect>3 prover(s) added - (* this is the prelude for Alt-Ergo, version >= 2.4.0 *) + <autodetect>2 prover(s) added (* this is a prelude for Alt-Ergo integer arithmetic *) (* this is a prelude for Alt-Ergo real arithmetic *) type string @@ -406,205 +421,30 @@ Test verify predicate is_minus_zero(x: t) = (is_zero(x) and is_negative(x)) - predicate is_not_nan(x: t) = (tqtisFinite(x) or is_infinite(x)) - - axiom is_not_nan1 : (forall x:t. (is_not_nan(x) -> (not is_nan(x)))) - - axiom is_not_nan2 : (forall x:t. ((not is_nan(x)) -> is_not_nan(x))) - - axiom is_not_finite : - (forall x:t. ((not tqtisFinite(x)) -> (is_infinite(x) or is_nan(x)))) - - axiom is_not_finite1 : - (forall x:t. ((is_infinite(x) or is_nan(x)) -> (not tqtisFinite(x)))) - - axiom zeroF_is_positive : is_positive(zeroF) - - axiom zeroF_is_zero : is_zero(zeroF) - - axiom zero_to_real : - (forall x:t [is_zero(x)]. (is_zero(x) -> tqtisFinite(x))) - - axiom zero_to_real1 : - (forall x:t [is_zero(x)]. (is_zero(x) -> (tqtreal(x) = 0.0))) - - axiom zero_to_real2 : - (forall x:t [is_zero(x)]. ((tqtisFinite(x) and (tqtreal(x) = 0.0)) -> - is_zero(x))) - logic of_int : mode, int -> t logic to_int : mode, t -> int - axiom zero_of_int : (forall m:mode. (zeroF = of_int(m, 0))) - logic round : mode, real -> real logic max_int1 : int - axiom max_real_int : (0x1.FFFFFFFFFFFFFp1023 = from_int(max_int1)) - predicate in_range(x: real) = (((-0x1.FFFFFFFFFFFFFp1023) <= x) and (x <= 0x1.FFFFFFFFFFFFFp1023)) predicate in_int_range(i: int) = (((-max_int1) <= i) and (i <= max_int1)) - axiom is_finite : (forall x:t. (tqtisFinite(x) -> in_range(tqtreal(x)))) - predicate no_overflow(m: mode, x: real) = in_range(round(m, x)) - axiom Bounded_real_no_overflow : - (forall m:mode. forall x:real. (in_range(x) -> no_overflow(m, x))) - - axiom Round_monotonic : - (forall m:mode. forall x:real. forall y:real. ((x <= y) -> (round(m, - x) <= round(m, y)))) - - axiom Round_idempotent : - (forall m1:mode. forall m2:mode. forall x:real. (round(m1, round(m2, - x)) = round(m2, x))) - - axiom Round_to_real : - (forall m:mode. forall x:t. (tqtisFinite(x) -> (round(m, - tqtreal(x)) = tqtreal(x)))) - - axiom Round_down_le : (forall x:real. (round(RTN, x) <= x)) - - axiom Round_up_ge : (forall x:real. (x <= round(RTP, x))) - - axiom Round_down_neg : (forall x:real. (round(RTN, (-x)) = (-round(RTP, x)))) - - axiom Round_up_neg : (forall x:real. (round(RTP, (-x)) = (-round(RTN, x)))) - predicate in_safe_int_range(i: int) = (((-9007199254740992) <= i) and (i <= 9007199254740992)) - axiom Exact_rounding_for_integers : - (forall m:mode. forall i:int. (in_safe_int_range(i) -> (round(m, - from_int(i)) = from_int(i)))) - predicate same_sign(x: t, y: t) = ((is_positive(x) and is_positive(y)) or (is_negative(x) and is_negative(y))) predicate diff_sign(x: t, y: t) = ((is_positive(x) and is_negative(y)) or (is_negative(x) and is_positive(y))) - axiom feq_eq : - (forall x:t. forall y:t. (tqtisFinite(x) -> (tqtisFinite(y) -> - ((not is_zero(x)) -> (eq(x, y) -> (x = y)))))) - - axiom eq_feq : - (forall x:t. forall y:t. (tqtisFinite(x) -> (tqtisFinite(y) -> ((x = y) -> - eq(x, y))))) - - axiom eq_refl : (forall x:t. (tqtisFinite(x) -> eq(x, x))) - - axiom eq_sym : (forall x:t. forall y:t. (eq(x, y) -> eq(y, x))) - - axiom eq_trans : - (forall x:t. forall y:t. forall z:t. (eq(x, y) -> (eq(y, z) -> eq(x, z)))) - - axiom eq_zero : eq(zeroF, neg(zeroF)) - - axiom eq_to_real_finite : - (forall x:t. forall y:t. ((tqtisFinite(x) and tqtisFinite(y)) -> (eq(x, - y) -> (tqtreal(x) = tqtreal(y))))) - - axiom eq_to_real_finite1 : - (forall x:t. forall y:t. ((tqtisFinite(x) and tqtisFinite(y)) -> - ((tqtreal(x) = tqtreal(y)) -> eq(x, y)))) - - axiom eq_special : (forall x:t. forall y:t. (eq(x, y) -> is_not_nan(x))) - - axiom eq_special1 : (forall x:t. forall y:t. (eq(x, y) -> is_not_nan(y))) - - axiom eq_special2 : - (forall x:t. forall y:t. (eq(x, y) -> ((tqtisFinite(x) and - tqtisFinite(y)) or (is_infinite(x) and (is_infinite(y) and same_sign(x, - y)))))) - - axiom lt_finite : - (forall x:t. forall y:t [lt(x, y)]. ((tqtisFinite(x) and tqtisFinite(y)) -> - (lt(x, y) -> (tqtreal(x) < tqtreal(y))))) - - axiom lt_finite1 : - (forall x:t. forall y:t [lt(x, y)]. ((tqtisFinite(x) and tqtisFinite(y)) -> - ((tqtreal(x) < tqtreal(y)) -> lt(x, y)))) - - axiom le_finite : - (forall x:t. forall y:t [le(x, y)]. ((tqtisFinite(x) and tqtisFinite(y)) -> - (le(x, y) -> (tqtreal(x) <= tqtreal(y))))) - - axiom le_finite1 : - (forall x:t. forall y:t [le(x, y)]. ((tqtisFinite(x) and tqtisFinite(y)) -> - ((tqtreal(x) <= tqtreal(y)) -> le(x, y)))) - - axiom le_lt_trans : - (forall x:t. forall y:t. forall z:t. ((le(x, y) and lt(y, z)) -> lt(x, z))) - - axiom lt_le_trans : - (forall x:t. forall y:t. forall z:t. ((lt(x, y) and le(y, z)) -> lt(x, z))) - - axiom le_ge_asym : - (forall x:t. forall y:t. ((le(x, y) and le(y, x)) -> eq(x, y))) - - axiom not_lt_ge : - (forall x:t. forall y:t. (((not lt(x, y)) and (is_not_nan(x) and - is_not_nan(y))) -> le(y, x))) - - axiom not_gt_le : - (forall x:t. forall y:t. (((not lt(y, x)) and (is_not_nan(x) and - is_not_nan(y))) -> le(x, y))) - - axiom le_special : - (forall x:t. forall y:t [le(x, y)]. (le(x, y) -> ((tqtisFinite(x) and - tqtisFinite(y)) or ((is_minus_infinity(x) and is_not_nan(y)) or - (is_not_nan(x) and is_plus_infinity(y)))))) - - axiom lt_special : - (forall x:t. forall y:t [lt(x, y)]. (lt(x, y) -> ((tqtisFinite(x) and - tqtisFinite(y)) or ((is_minus_infinity(x) and (is_not_nan(y) and - (not is_minus_infinity(y)))) or (is_not_nan(x) and - ((not is_plus_infinity(x)) and is_plus_infinity(y))))))) - - axiom lt_lt_finite : - (forall x:t. forall y:t. forall z:t. (lt(x, y) -> (lt(y, z) -> - tqtisFinite(y)))) - - axiom positive_to_real : - (forall x:t [is_positive(x)]. (tqtisFinite(x) -> (is_positive(x) -> - (0.0 <= tqtreal(x))))) - - axiom to_real_positive : - (forall x:t [is_positive(x)]. (tqtisFinite(x) -> ((0.0 < tqtreal(x)) -> - is_positive(x)))) - - axiom negative_to_real : - (forall x:t [is_negative(x)]. (tqtisFinite(x) -> (is_negative(x) -> - (tqtreal(x) <= 0.0)))) - - axiom to_real_negative : - (forall x:t [is_negative(x)]. (tqtisFinite(x) -> ((tqtreal(x) < 0.0) -> - is_negative(x)))) - - axiom negative_xor_positive : - (forall x:t. (not (is_positive(x) and is_negative(x)))) - - axiom negative_or_positive : - (forall x:t. (is_not_nan(x) -> (is_positive(x) or is_negative(x)))) - - axiom diff_sign_trans : - (forall x:t. forall y:t. forall z:t. ((diff_sign(x, y) and diff_sign(y, - z)) -> same_sign(x, z))) - - axiom diff_sign_product : - (forall x:t. forall y:t. ((tqtisFinite(x) and (tqtisFinite(y) and - ((tqtreal(x) * tqtreal(y)) < 0.0))) -> diff_sign(x, y))) - - axiom same_sign_product : - (forall x:t. forall y:t. ((tqtisFinite(x) and (tqtisFinite(y) and - same_sign(x, y))) -> (0.0 <= (tqtreal(x) * tqtreal(y))))) - predicate product_sign(z: t, x: t, y: t) = ((same_sign(x, y) -> is_positive(z)) and (diff_sign(x, y) -> is_negative(z))) @@ -623,180 +463,6 @@ Test verify is_positive(x))) and ((m = RTN) -> is_negative(x))) and ((m = RTZ) -> is_positive(x)))) - axiom add_finite : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> (no_overflow(m, (tqtreal(x) + tqtreal(y))) -> - tqtisFinite(add(m, x, y)))))) - - axiom add_finite1 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> (no_overflow(m, (tqtreal(x) + tqtreal(y))) -> - (tqtreal(add(m, x, y)) = round(m, (tqtreal(x) + tqtreal(y)))))))) - - axiom add_finite_rev : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. (tqtisFinite(add(m, - x, y)) -> tqtisFinite(x))) - - axiom add_finite_rev1 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. (tqtisFinite(add(m, - x, y)) -> tqtisFinite(y))) - - axiom add_finite_rev_n : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(add(m, x, y)) -> no_overflow(m, (tqtreal(x) + tqtreal(y)))))) - - axiom add_finite_rev_n1 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(add(m, x, y)) -> (tqtreal(add(m, x, y)) = round(m, - (tqtreal(x) + tqtreal(y))))))) - - axiom sub_finite : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> (no_overflow(m, (tqtreal(x) - tqtreal(y))) -> - tqtisFinite(sub(m, x, y)))))) - - axiom sub_finite1 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> (no_overflow(m, (tqtreal(x) - tqtreal(y))) -> - (tqtreal(sub(m, x, y)) = round(m, (tqtreal(x) - tqtreal(y)))))))) - - axiom sub_finite_rev : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. (tqtisFinite(sub(m, - x, y)) -> tqtisFinite(x))) - - axiom sub_finite_rev1 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. (tqtisFinite(sub(m, - x, y)) -> tqtisFinite(y))) - - axiom sub_finite_rev_n : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(sub(m, x, y)) -> no_overflow(m, (tqtreal(x) - tqtreal(y)))))) - - axiom sub_finite_rev_n1 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(sub(m, x, y)) -> (tqtreal(sub(m, x, y)) = round(m, - (tqtreal(x) - tqtreal(y))))))) - - axiom mul_finite : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> (no_overflow(m, (tqtreal(x) * tqtreal(y))) -> - tqtisFinite(mul(m, x, y)))))) - - axiom mul_finite1 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> (no_overflow(m, (tqtreal(x) * tqtreal(y))) -> - (tqtreal(mul(m, x, y)) = round(m, (tqtreal(x) * tqtreal(y)))))))) - - axiom mul_finite_rev : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. (tqtisFinite(mul(m, - x, y)) -> tqtisFinite(x))) - - axiom mul_finite_rev1 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. (tqtisFinite(mul(m, - x, y)) -> tqtisFinite(y))) - - axiom mul_finite_rev_n : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(mul(m, x, y)) -> no_overflow(m, (tqtreal(x) * tqtreal(y)))))) - - axiom mul_finite_rev_n1 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(mul(m, x, y)) -> (tqtreal(mul(m, x, y)) = round(m, - (tqtreal(x) * tqtreal(y))))))) - - axiom div_finite : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> ((not is_zero(y)) -> (no_overflow(m, - (tqtreal(x) / tqtreal(y))) -> tqtisFinite(div(m, x, y))))))) - - axiom div_finite1 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. (tqtisFinite(x) -> - (tqtisFinite(y) -> ((not is_zero(y)) -> (no_overflow(m, - (tqtreal(x) / tqtreal(y))) -> (tqtreal(div(m, x, y)) = round(m, - (tqtreal(x) / tqtreal(y))))))))) - - axiom div_finite_rev : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. (tqtisFinite(div(m, - x, y)) -> ((tqtisFinite(x) and (tqtisFinite(y) and (not is_zero(y)))) or - (tqtisFinite(x) and (is_infinite(y) and (tqtreal(div(m, x, y)) = 0.0)))))) - - axiom div_finite_rev_n : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(div(m, x, y)) -> (tqtisFinite(y) -> no_overflow(m, - (tqtreal(x) / tqtreal(y))))))) - - axiom div_finite_rev_n1 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. (to_nearest(m) -> - (tqtisFinite(div(m, x, y)) -> (tqtisFinite(y) -> (tqtreal(div(m, x, - y)) = round(m, (tqtreal(x) / tqtreal(y)))))))) - - axiom neg_finite : - (forall x:t [neg(x)]. (tqtisFinite(x) -> tqtisFinite(neg(x)))) - - axiom neg_finite1 : - (forall x:t [neg(x)]. (tqtisFinite(x) -> - (tqtreal(neg(x)) = (-tqtreal(x))))) - - axiom neg_finite_rev : - (forall x:t [neg(x)]. (tqtisFinite(neg(x)) -> tqtisFinite(x))) - - axiom neg_finite_rev1 : - (forall x:t [neg(x)]. (tqtisFinite(neg(x)) -> - (tqtreal(neg(x)) = (-tqtreal(x))))) - - axiom abs_finite : - (forall x:t [abs1(x)]. (tqtisFinite(x) -> tqtisFinite(abs1(x)))) - - axiom abs_finite1 : - (forall x:t [abs1(x)]. (tqtisFinite(x) -> - (tqtreal(abs1(x)) = abs(tqtreal(x))))) - - axiom abs_finite2 : - (forall x:t [abs1(x)]. (tqtisFinite(x) -> is_positive(abs1(x)))) - - axiom abs_finite_rev : - (forall x:t [abs1(x)]. (tqtisFinite(abs1(x)) -> tqtisFinite(x))) - - axiom abs_finite_rev1 : - (forall x:t [abs1(x)]. (tqtisFinite(abs1(x)) -> - (tqtreal(abs1(x)) = abs(tqtreal(x))))) - - axiom abs_universal : (forall x:t [abs1(x)]. (not is_negative(abs1(x)))) - - axiom fma_finite : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - (tqtisFinite(x) -> (tqtisFinite(y) -> (tqtisFinite(z) -> (no_overflow(m, - ((tqtreal(x) * tqtreal(y)) + tqtreal(z))) -> tqtisFinite(fma(m, x, y, - z))))))) - - axiom fma_finite1 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - (tqtisFinite(x) -> (tqtisFinite(y) -> (tqtisFinite(z) -> (no_overflow(m, - ((tqtreal(x) * tqtreal(y)) + tqtreal(z))) -> (tqtreal(fma(m, x, y, - z)) = round(m, ((tqtreal(x) * tqtreal(y)) + tqtreal(z))))))))) - - axiom fma_finite_rev : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - (tqtisFinite(fma(m, x, y, z)) -> tqtisFinite(x))) - - axiom fma_finite_rev1 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - (tqtisFinite(fma(m, x, y, z)) -> tqtisFinite(y))) - - axiom fma_finite_rev2 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - (tqtisFinite(fma(m, x, y, z)) -> tqtisFinite(z))) - - axiom fma_finite_rev_n : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - (to_nearest(m) -> (tqtisFinite(fma(m, x, y, z)) -> no_overflow(m, - ((tqtreal(x) * tqtreal(y)) + tqtreal(z)))))) - - axiom fma_finite_rev_n1 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - (to_nearest(m) -> (tqtisFinite(fma(m, x, y, z)) -> (tqtreal(fma(m, x, y, - z)) = round(m, ((tqtreal(x) * tqtreal(y)) + tqtreal(z))))))) - function sqr(x: real) : real = (x * x) logic sqrt1 : real -> real @@ -815,550 +481,11 @@ Test verify (forall x:real. forall y:real. (((0.0 <= x) and (x <= y)) -> (sqrt1(x) <= sqrt1(y)))) - axiom sqrt_finite : - (forall m:mode. forall x:t [sqrt(m, x)]. (tqtisFinite(x) -> - ((0.0 <= tqtreal(x)) -> tqtisFinite(sqrt(m, x))))) - - axiom sqrt_finite1 : - (forall m:mode. forall x:t [sqrt(m, x)]. (tqtisFinite(x) -> - ((0.0 <= tqtreal(x)) -> (tqtreal(sqrt(m, x)) = round(m, - sqrt1(tqtreal(x))))))) - - axiom sqrt_finite_rev : - (forall m:mode. forall x:t [sqrt(m, x)]. (tqtisFinite(sqrt(m, x)) -> - tqtisFinite(x))) - - axiom sqrt_finite_rev1 : - (forall m:mode. forall x:t [sqrt(m, x)]. (tqtisFinite(sqrt(m, x)) -> - (0.0 <= tqtreal(x)))) - - axiom sqrt_finite_rev2 : - (forall m:mode. forall x:t [sqrt(m, x)]. (tqtisFinite(sqrt(m, x)) -> - (tqtreal(sqrt(m, x)) = round(m, sqrt1(tqtreal(x)))))) - predicate same_sign_real(x: t, r: real) = ((is_positive(x) and (0.0 < r)) or (is_negative(x) and (r < 0.0))) - axiom add_special : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((is_nan(x) or - is_nan(y)) -> is_nan(add(m, x, y)))) - - axiom add_special1 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((tqtisFinite(x) and - is_infinite(y)) -> is_infinite(add(m, x, y)))) - - axiom add_special2 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((tqtisFinite(x) and - is_infinite(y)) -> same_sign(add(m, x, y), y))) - - axiom add_special3 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((is_infinite(x) and - tqtisFinite(y)) -> is_infinite(add(m, x, y)))) - - axiom add_special4 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((is_infinite(x) and - tqtisFinite(y)) -> same_sign(add(m, x, y), x))) - - axiom add_special5 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((is_infinite(x) and - (is_infinite(y) and same_sign(x, y))) -> is_infinite(add(m, x, y)))) - - axiom add_special6 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((is_infinite(x) and - (is_infinite(y) and same_sign(x, y))) -> same_sign(add(m, x, y), x))) - - axiom add_special7 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((is_infinite(x) and - (is_infinite(y) and diff_sign(x, y))) -> is_nan(add(m, x, y)))) - - axiom add_special8 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((tqtisFinite(x) and - (tqtisFinite(y) and (not no_overflow(m, (tqtreal(x) + tqtreal(y)))))) -> - same_sign_real(add(m, x, y), (tqtreal(x) + tqtreal(y))))) - - axiom add_special9 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((tqtisFinite(x) and - (tqtisFinite(y) and (not no_overflow(m, (tqtreal(x) + tqtreal(y)))))) -> - overflow_value(m, add(m, x, y)))) - - axiom add_special10 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((tqtisFinite(x) and - tqtisFinite(y)) -> (same_sign(x, y) -> same_sign(add(m, x, y), x)))) - - axiom add_special11 : - (forall m:mode. forall x:t. forall y:t [add(m, x, y)]. ((tqtisFinite(x) and - tqtisFinite(y)) -> ((not same_sign(x, y)) -> sign_zero_result(m, add(m, x, - y))))) - - axiom sub_special : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((is_nan(x) or - is_nan(y)) -> is_nan(sub(m, x, y)))) - - axiom sub_special1 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((tqtisFinite(x) and - is_infinite(y)) -> is_infinite(sub(m, x, y)))) - - axiom sub_special2 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((tqtisFinite(x) and - is_infinite(y)) -> diff_sign(sub(m, x, y), y))) - - axiom sub_special3 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((is_infinite(x) and - tqtisFinite(y)) -> is_infinite(sub(m, x, y)))) - - axiom sub_special4 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((is_infinite(x) and - tqtisFinite(y)) -> same_sign(sub(m, x, y), x))) - - axiom sub_special5 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((is_infinite(x) and - (is_infinite(y) and same_sign(x, y))) -> is_nan(sub(m, x, y)))) - - axiom sub_special6 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((is_infinite(x) and - (is_infinite(y) and diff_sign(x, y))) -> is_infinite(sub(m, x, y)))) - - axiom sub_special7 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((is_infinite(x) and - (is_infinite(y) and diff_sign(x, y))) -> same_sign(sub(m, x, y), x))) - - axiom sub_special8 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((tqtisFinite(x) and - (tqtisFinite(y) and (not no_overflow(m, (tqtreal(x) - tqtreal(y)))))) -> - same_sign_real(sub(m, x, y), (tqtreal(x) - tqtreal(y))))) - - axiom sub_special9 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((tqtisFinite(x) and - (tqtisFinite(y) and (not no_overflow(m, (tqtreal(x) - tqtreal(y)))))) -> - overflow_value(m, sub(m, x, y)))) - - axiom sub_special10 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((tqtisFinite(x) and - tqtisFinite(y)) -> (diff_sign(x, y) -> same_sign(sub(m, x, y), x)))) - - axiom sub_special11 : - (forall m:mode. forall x:t. forall y:t [sub(m, x, y)]. ((tqtisFinite(x) and - tqtisFinite(y)) -> ((not diff_sign(x, y)) -> sign_zero_result(m, sub(m, x, - y))))) - - axiom mul_special : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. ((is_nan(x) or - is_nan(y)) -> is_nan(mul(m, x, y)))) - - axiom mul_special1 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. ((is_zero(x) and - is_infinite(y)) -> is_nan(mul(m, x, y)))) - - axiom mul_special2 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. ((tqtisFinite(x) and - (is_infinite(y) and (not is_zero(x)))) -> is_infinite(mul(m, x, y)))) - - axiom mul_special3 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. ((is_infinite(x) and - is_zero(y)) -> is_nan(mul(m, x, y)))) - - axiom mul_special4 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. ((is_infinite(x) and - (tqtisFinite(y) and (not is_zero(y)))) -> is_infinite(mul(m, x, y)))) - - axiom mul_special5 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. ((is_infinite(x) and - is_infinite(y)) -> is_infinite(mul(m, x, y)))) - - axiom mul_special6 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. ((tqtisFinite(x) and - (tqtisFinite(y) and (not no_overflow(m, (tqtreal(x) * tqtreal(y)))))) -> - overflow_value(m, mul(m, x, y)))) - - axiom mul_special7 : - (forall m:mode. forall x:t. forall y:t [mul(m, x, y)]. (let r = mul(m, x, - y) : t in ((not is_nan(r)) -> product_sign(r, x, y)))) - - axiom div_special : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. ((is_nan(x) or - is_nan(y)) -> is_nan(div(m, x, y)))) - - axiom div_special1 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. ((tqtisFinite(x) and - is_infinite(y)) -> is_zero(div(m, x, y)))) - - axiom div_special2 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. ((is_infinite(x) and - tqtisFinite(y)) -> is_infinite(div(m, x, y)))) - - axiom div_special3 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. ((is_infinite(x) and - is_infinite(y)) -> is_nan(div(m, x, y)))) - - axiom div_special4 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. ((tqtisFinite(x) and - (tqtisFinite(y) and ((not is_zero(y)) and (not no_overflow(m, - (tqtreal(x) / tqtreal(y))))))) -> overflow_value(m, div(m, x, y)))) - - axiom div_special5 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. ((tqtisFinite(x) and - (is_zero(y) and (not is_zero(x)))) -> is_infinite(div(m, x, y)))) - - axiom div_special6 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. ((is_zero(x) and - is_zero(y)) -> is_nan(div(m, x, y)))) - - axiom div_special7 : - (forall m:mode. forall x:t. forall y:t [div(m, x, y)]. (let r = div(m, x, - y) : t in ((not is_nan(r)) -> product_sign(r, x, y)))) - - axiom neg_special : (forall x:t [neg(x)]. (is_nan(x) -> is_nan(neg(x)))) - - axiom neg_special1 : - (forall x:t [neg(x)]. (is_infinite(x) -> is_infinite(neg(x)))) - - axiom neg_special2 : - (forall x:t [neg(x)]. ((not is_nan(x)) -> diff_sign(x, neg(x)))) - - axiom abs_special : (forall x:t [abs1(x)]. (is_nan(x) -> is_nan(abs1(x)))) - - axiom abs_special1 : - (forall x:t [abs1(x)]. (is_infinite(x) -> is_infinite(abs1(x)))) - - axiom abs_special2 : - (forall x:t [abs1(x)]. ((not is_nan(x)) -> is_positive(abs1(x)))) - - axiom fma_special : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_nan(x) or (is_nan(y) or is_nan(z))) -> is_nan(fma(m, x, y, z)))) - - axiom fma_special1 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_zero(x) and is_infinite(y)) -> is_nan(fma(m, x, y, z)))) - - axiom fma_special2 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and is_zero(y)) -> is_nan(fma(m, x, y, z)))) - - axiom fma_special3 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and ((not is_zero(x)) and (is_infinite(y) and - tqtisFinite(z)))) -> is_infinite(fma(m, x, y, z)))) - - axiom fma_special4 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and ((not is_zero(x)) and (is_infinite(y) and - tqtisFinite(z)))) -> product_sign(fma(m, x, y, z), x, y))) - - axiom fma_special5 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and ((not is_zero(x)) and (is_infinite(y) and - is_infinite(z)))) -> (product_sign(z, x, y) -> is_infinite(fma(m, x, y, - z))))) - - axiom fma_special6 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and ((not is_zero(x)) and (is_infinite(y) and - is_infinite(z)))) -> (product_sign(z, x, y) -> same_sign(fma(m, x, y, z), - z)))) - - axiom fma_special7 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and ((not is_zero(x)) and (is_infinite(y) and - is_infinite(z)))) -> ((not product_sign(z, x, y)) -> is_nan(fma(m, x, y, - z))))) - - axiom fma_special8 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (tqtisFinite(y) and ((not is_zero(y)) and - tqtisFinite(z)))) -> is_infinite(fma(m, x, y, z)))) - - axiom fma_special9 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (tqtisFinite(y) and ((not is_zero(y)) and - tqtisFinite(z)))) -> product_sign(fma(m, x, y, z), x, y))) - - axiom fma_special10 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (tqtisFinite(y) and ((not is_zero(y)) and - is_infinite(z)))) -> (product_sign(z, x, y) -> is_infinite(fma(m, x, y, - z))))) - - axiom fma_special11 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (tqtisFinite(y) and ((not is_zero(y)) and - is_infinite(z)))) -> (product_sign(z, x, y) -> same_sign(fma(m, x, y, z), - z)))) - - axiom fma_special12 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (tqtisFinite(y) and ((not is_zero(y)) and - is_infinite(z)))) -> ((not product_sign(z, x, y)) -> is_nan(fma(m, x, y, - z))))) - - axiom fma_special13 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (is_infinite(y) and tqtisFinite(z))) -> - is_infinite(fma(m, x, y, z)))) - - axiom fma_special14 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (is_infinite(y) and tqtisFinite(z))) -> - product_sign(fma(m, x, y, z), x, y))) - - axiom fma_special15 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and (tqtisFinite(y) and is_infinite(z))) -> - is_infinite(fma(m, x, y, z)))) - - axiom fma_special16 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and (tqtisFinite(y) and is_infinite(z))) -> - same_sign(fma(m, x, y, z), z))) - - axiom fma_special17 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (is_infinite(y) and is_infinite(z))) -> - (product_sign(z, x, y) -> is_infinite(fma(m, x, y, z))))) - - axiom fma_special18 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (is_infinite(y) and is_infinite(z))) -> - (product_sign(z, x, y) -> same_sign(fma(m, x, y, z), z)))) - - axiom fma_special19 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((is_infinite(x) and (is_infinite(y) and is_infinite(z))) -> - ((not product_sign(z, x, y)) -> is_nan(fma(m, x, y, z))))) - - axiom fma_special20 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and (tqtisFinite(y) and (tqtisFinite(z) and - (not no_overflow(m, ((tqtreal(x) * tqtreal(y)) + tqtreal(z))))))) -> - same_sign_real(fma(m, x, y, z), ((tqtreal(x) * tqtreal(y)) + tqtreal(z))))) - - axiom fma_special21 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and (tqtisFinite(y) and (tqtisFinite(z) and - (not no_overflow(m, ((tqtreal(x) * tqtreal(y)) + tqtreal(z))))))) -> - overflow_value(m, fma(m, x, y, z)))) - - axiom fma_special22 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and (tqtisFinite(y) and tqtisFinite(z))) -> - (product_sign(z, x, y) -> same_sign(fma(m, x, y, z), z)))) - - axiom fma_special23 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and (tqtisFinite(y) and tqtisFinite(z))) -> - ((not product_sign(z, x, y)) -> - ((((tqtreal(x) * tqtreal(y)) + tqtreal(z)) = 0.0) -> ((m = RTN) -> - is_negative(fma(m, x, y, z))))))) - - axiom fma_special24 : - (forall m:mode. forall x:t. forall y:t. forall z:t [fma(m, x, y, z)]. - ((tqtisFinite(x) and (tqtisFinite(y) and tqtisFinite(z))) -> - ((not product_sign(z, x, y)) -> - ((((tqtreal(x) * tqtreal(y)) + tqtreal(z)) = 0.0) -> ((not (m = RTN)) -> - is_positive(fma(m, x, y, z))))))) - - axiom sqrt_special : - (forall m:mode. forall x:t [sqrt(m, x)]. (is_nan(x) -> is_nan(sqrt(m, x)))) - - axiom sqrt_special1 : - (forall m:mode. forall x:t [sqrt(m, x)]. (is_plus_infinity(x) -> - is_plus_infinity(sqrt(m, x)))) - - axiom sqrt_special2 : - (forall m:mode. forall x:t [sqrt(m, x)]. (is_minus_infinity(x) -> - is_nan(sqrt(m, x)))) - - axiom sqrt_special3 : - (forall m:mode. forall x:t [sqrt(m, x)]. ((tqtisFinite(x) and - (tqtreal(x) < 0.0)) -> is_nan(sqrt(m, x)))) - - axiom sqrt_special4 : - (forall m:mode. forall x:t [sqrt(m, x)]. (is_zero(x) -> same_sign(sqrt(m, - x), x))) - - axiom sqrt_special5 : - (forall m:mode. forall x:t [sqrt(m, x)]. ((tqtisFinite(x) and - (0.0 < tqtreal(x))) -> is_positive(sqrt(m, x)))) - - axiom of_int_add_exact : - (forall m:mode. forall n:mode. forall i:int. forall j:int. - (in_safe_int_range(i) -> (in_safe_int_range(j) -> - (in_safe_int_range((i + j)) -> eq(of_int(m, (i + j)), add(n, of_int(m, i), - of_int(m, j))))))) - - axiom of_int_sub_exact : - (forall m:mode. forall n:mode. forall i:int. forall j:int. - (in_safe_int_range(i) -> (in_safe_int_range(j) -> - (in_safe_int_range((i - j)) -> eq(of_int(m, (i - j)), sub(n, of_int(m, i), - of_int(m, j))))))) - - axiom of_int_mul_exact : - (forall m:mode. forall n:mode. forall i:int. forall j:int. - (in_safe_int_range(i) -> (in_safe_int_range(j) -> - (in_safe_int_range((i * j)) -> eq(of_int(m, (i * j)), mul(n, of_int(m, i), - of_int(m, j))))))) - - axiom Min_r : (forall x:t. forall y:t. (le(y, x) -> eq(min(x, y), y))) - - axiom Min_l : (forall x:t. forall y:t. (le(x, y) -> eq(min(x, y), x))) - - axiom Max_r : (forall x:t. forall y:t. (le(y, x) -> eq(max(x, y), x))) - - axiom Max_l : (forall x:t. forall y:t. (le(x, y) -> eq(max(x, y), y))) - logic is_int : t -> prop - axiom zeroF_is_int : is_int(zeroF) - - axiom of_int_is_int : - (forall m:mode. forall x:int. (in_int_range(x) -> is_int(of_int(m, x)))) - - axiom big_float_is_int : - (forall m:mode. forall i:t. (tqtisFinite(i) -> ((le(i, neg(of_int(m, - 9007199254740992))) or le(of_int(m, 9007199254740992), i)) -> is_int(i)))) - - axiom roundToIntegral_is_int : - (forall m:mode. forall x:t. (tqtisFinite(x) -> is_int(roundToIntegral(m, - x)))) - - axiom eq_is_int : - (forall x:t. forall y:t. (eq(x, y) -> (is_int(x) -> is_int(y)))) - - axiom add_int : - (forall x:t. forall y:t. forall m:mode. (is_int(x) -> (is_int(y) -> - (tqtisFinite(add(m, x, y)) -> is_int(add(m, x, y)))))) - - axiom sub_int : - (forall x:t. forall y:t. forall m:mode. (is_int(x) -> (is_int(y) -> - (tqtisFinite(sub(m, x, y)) -> is_int(sub(m, x, y)))))) - - axiom mul_int : - (forall x:t. forall y:t. forall m:mode. (is_int(x) -> (is_int(y) -> - (tqtisFinite(mul(m, x, y)) -> is_int(mul(m, x, y)))))) - - axiom fma_int : - (forall x:t. forall y:t. forall z:t. forall m:mode. (is_int(x) -> - (is_int(y) -> (is_int(z) -> (tqtisFinite(fma(m, x, y, z)) -> is_int(fma(m, - x, y, z))))))) - - axiom neg_int : (forall x:t. (is_int(x) -> is_int(neg(x)))) - - axiom abs_int1 : (forall x:t. (is_int(x) -> is_int(abs1(x)))) - - axiom is_int_of_int : - (forall x:t. forall m:mode. forall mqt:mode. (is_int(x) -> eq(x, - of_int(mqt, to_int(m, x))))) - - axiom is_int_to_int : - (forall m:mode. forall x:t. (is_int(x) -> in_int_range(to_int(m, x)))) - - axiom is_int_is_finite : (forall x:t. (is_int(x) -> tqtisFinite(x))) - - axiom int_to_real : - (forall m:mode. forall x:t. (is_int(x) -> (tqtreal(x) = from_int(to_int(m, - x))))) - - axiom truncate_int : - (forall m:mode. forall i:t. (is_int(i) -> eq(roundToIntegral(m, i), i))) - - axiom truncate_neg : - (forall x:t. (tqtisFinite(x) -> (is_negative(x) -> (roundToIntegral(RTZ, - x) = roundToIntegral(RTP, x))))) - - axiom truncate_pos : - (forall x:t. (tqtisFinite(x) -> (is_positive(x) -> (roundToIntegral(RTZ, - x) = roundToIntegral(RTN, x))))) - - axiom ceil_le : - (forall x:t. (tqtisFinite(x) -> le(x, roundToIntegral(RTP, x)))) - - axiom ceil_lest : - (forall x:t. forall y:t. ((le(x, y) and is_int(y)) -> - le(roundToIntegral(RTP, x), y))) - - axiom ceil_to_real : - (forall x:t. (tqtisFinite(x) -> (tqtreal(roundToIntegral(RTP, - x)) = from_int(ceil(tqtreal(x)))))) - - axiom ceil_to_int : - (forall m:mode. forall x:t. (tqtisFinite(x) -> (to_int(m, - roundToIntegral(RTP, x)) = ceil(tqtreal(x))))) - - axiom floor_le : - (forall x:t. (tqtisFinite(x) -> le(roundToIntegral(RTN, x), x))) - - axiom floor_lest : - (forall x:t. forall y:t. ((le(y, x) and is_int(y)) -> le(y, - roundToIntegral(RTN, x)))) - - axiom floor_to_real : - (forall x:t. (tqtisFinite(x) -> (tqtreal(roundToIntegral(RTN, - x)) = from_int(floor(tqtreal(x)))))) - - axiom floor_to_int : - (forall m:mode. forall x:t. (tqtisFinite(x) -> (to_int(m, - roundToIntegral(RTN, x)) = floor(tqtreal(x))))) - - axiom RNA_down : - (forall x:t. (lt(sub(RNE, x, roundToIntegral(RTN, x)), sub(RNE, - roundToIntegral(RTP, x), x)) -> (roundToIntegral(RNA, - x) = roundToIntegral(RTN, x)))) - - axiom RNA_up : - (forall x:t. (lt(sub(RNE, roundToIntegral(RTP, x), x), sub(RNE, x, - roundToIntegral(RTN, x))) -> (roundToIntegral(RNA, - x) = roundToIntegral(RTP, x)))) - - axiom RNA_down_tie : - (forall x:t. (eq(sub(RNE, x, roundToIntegral(RTN, x)), sub(RNE, - roundToIntegral(RTP, x), x)) -> (is_negative(x) -> (roundToIntegral(RNA, - x) = roundToIntegral(RTN, x))))) - - axiom RNA_up_tie : - (forall x:t. (eq(sub(RNE, roundToIntegral(RTP, x), x), sub(RNE, x, - roundToIntegral(RTN, x))) -> (is_positive(x) -> (roundToIntegral(RNA, - x) = roundToIntegral(RTP, x))))) - - axiom to_int_roundToIntegral : - (forall m:mode. forall x:t. (to_int(m, x) = to_int(m, roundToIntegral(m, - x)))) - - axiom to_int_monotonic : - (forall m:mode. forall x:t. forall y:t. (tqtisFinite(x) -> - (tqtisFinite(y) -> (le(x, y) -> (to_int(m, x) <= to_int(m, y)))))) - - axiom to_int_of_int : - (forall m:mode. forall i:int. (in_safe_int_range(i) -> (to_int(m, of_int(m, - i)) = i))) - - axiom eq_to_int : - (forall m:mode. forall x:t. forall y:t. (tqtisFinite(x) -> (eq(x, y) -> - (to_int(m, x) = to_int(m, y))))) - - axiom neg_to_int : - (forall m:mode. forall x:t. (is_int(x) -> (to_int(m, neg(x)) = (-to_int(m, - x))))) - - axiom roundToIntegral_is_finite : - (forall m:mode. forall x:t. (tqtisFinite(x) -> - tqtisFinite(roundToIntegral(m, x)))) - - axiom round_bound_ne : - (forall x:real [round(RNE, x)]. (no_overflow(RNE, x) -> - (((x - (0x1.0p-53 * abs(x))) - 0x1.0p-1075) <= round(RNE, x)))) - - axiom round_bound_ne1 : - (forall x:real [round(RNE, x)]. (no_overflow(RNE, x) -> (round(RNE, - x) <= ((x + (0x1.0p-53 * abs(x))) + 0x1.0p-1075)))) - - axiom round_bound : - (forall m:mode. forall x:real [round(m, x)]. (no_overflow(m, x) -> - (((x - (0x1.0p-52 * abs(x))) - 0x1.0p-1074) <= round(m, x)))) - - axiom round_bound1 : - (forall m:mode. forall x:real [round(m, x)]. (no_overflow(m, x) -> - (round(m, x) <= ((x + (0x1.0p-52 * abs(x))) + 0x1.0p-1074)))) - type ('a, 'a1, 'a2, 'a3, 'a4) tuple5 = { Tuple5_proj_1 : 'a; Tuple5_proj_2 : 'a1; Tuple5_proj_3 : 'a2; Tuple5_proj_4 : 'a3; Tuple5_proj_5 : 'a4 }