From 2a71f5a3d33ad7e0d7d464ff228d01f2ac6ac57b Mon Sep 17 00:00:00 2001 From: charguer <arthur@chargueraud.org> Date: Tue, 9 Feb 2016 10:35:14 +0100 Subject: [PATCH] int_float --- generator/TODO | 10 +- generator/js_of_ast.ml | 8 +- generator/stdlib_ml/stdlib.mli | 27 ++-- generator/tests/jsref/BinInt.ml | 149 +++++++++++----------- generator/tests/jsref/BinNat.ml | 110 +++++++++-------- generator/tests/jsref/BinPos.ml | 157 +++++++++++------------ generator/tests/jsref/BinPosDef.ml | 164 +++++++++++++------------ generator/tests/jsref/JsInterpreter.ml | 22 ++-- generator/tests/jsref/JsNumber.ml | 12 +- generator/tests/jsref/JsPreliminary.ml | 2 +- generator/tests/jsref/LibList.ml | 2 +- generator/tests/jsref/LibNat.ml | 6 +- generator/tests/jsref/LibReflect.ml | 2 +- generator/tests/jsref/Peano.ml | 2 +- generator/tests/jsref/Shared.ml | 2 +- generator/tests/jsref/String0.ml | 2 +- 16 files changed, 360 insertions(+), 317 deletions(-) diff --git a/generator/TODO b/generator/TODO index fc05b7a..652447a 100644 --- a/generator/TODO +++ b/generator/TODO @@ -1,10 +1,14 @@ -- deal with unsupported let record in jsinterpreter.ml + + - cases seem to be in reversed order, check and fix + => corriger à la main le jour où on s'amuse à relire le code. + => order in pattern matching extraction seems to follow + order from the definition of the inductive type, + instead of the order of the code. - untab closing bracket for fun def - -- default case with error in switch, for logged/token mode + => later maybe - understand spec of polymorphic equality (= vs ===) diff --git a/generator/js_of_ast.ml b/generator/js_of_ast.ml index 7e5e4fa..807a7f4 100644 --- a/generator/js_of_ast.ml +++ b/generator/js_of_ast.ml @@ -119,6 +119,12 @@ let ppf_apply_infix f arg1 arg2 = let ppf_match value cases const = let cons_fld = if const then "" else ".type" in + let cases = + match !current_mode with + | Mode_unlogged -> cases + | Mode_line_token + | Mode_logged -> cases ^ "@,default: throw \"No matching case for switch\";" + in let s = Printf.sprintf "switch (%s%s) {@;<1 2>@[<v 0>%s@]@,}@," value cons_fld cases in s @@ -315,7 +321,7 @@ let generate_logged_return ctx sbody = Printf.sprintf "%sreturn %s;%s" token_start sbody token_stop | Mode_logged -> let id = id_fresh "_return_" in - Printf.sprintf "var %s = %s;@,log_event(%s, ctx_push(%s, {\"return_value\", %s}), \"return\");@,return %s" + Printf.sprintf "var %s = %s;@,log_event(%s, ctx_push(%s, {\"return_value\", %s}), \"return\");@,return %s;" id sbody token_lineof ctx id id | Mode_unlogged -> Printf.sprintf "return %s;" sbody diff --git a/generator/stdlib_ml/stdlib.mli b/generator/stdlib_ml/stdlib.mli index 34aeb5d..883c174 100644 --- a/generator/stdlib_ml/stdlib.mli +++ b/generator/stdlib_ml/stdlib.mli @@ -43,20 +43,33 @@ val int_of_float : float -> int val string_of_float : float -> string val string_of_int : int -> string -val ( === ) : 'a -> 'a -> bool -val ( <> ) : 'a -> 'a -> bool -val ( < ) : 'a -> 'a -> bool +(*val ( === ) : 'a -> 'a -> bool*) +(*val ( <> ) : 'a -> 'a -> bool*) +(*val ( < ) : 'a -> 'a -> bool val ( > ) : 'a -> 'a -> bool val ( <= ) : 'a -> 'a -> bool val ( >= ) : 'a -> 'a -> bool -val compare : 'a -> 'a -> int +*) +val ( = ) : float -> float -> bool +val ( < ) : float -> float -> bool +val ( > ) : float -> float -> bool +val ( <= ) : float -> float -> bool +val ( >= ) : float -> float -> bool +(*val compare : 'a -> 'a -> int*) + +val bool_eq : bool -> bool -> bool +val int_eq : int -> int -> bool +val int_ge : int -> int -> bool +val string_eq : string -> string -> bool +val float_eq : float -> float -> bool +val float_compare : float -> float -> int val ( && ) : bool -> bool -> bool - +val not : bool -> bool val stuck : string -> 'a -(* Structural equality, need to be careful with implementation *) -val (=) : 'a -> 'a -> bool +(* Structural equality, need to be careful with implementation +val (=) : 'a -> 'a -> bool*) val (^) : string -> string -> string diff --git a/generator/tests/jsref/BinInt.ml b/generator/tests/jsref/BinInt.ml index 3fce9d7..8aa1811 100644 --- a/generator/tests/jsref/BinInt.ml +++ b/generator/tests/jsref/BinInt.ml @@ -10,6 +10,11 @@ module Z = struct type t = float + (* HACK *) + let is_even p = + float_eq (mod_float p 2.) 0. + + (** val zero : float **) let zero = @@ -28,7 +33,7 @@ module Z = (** val double : float -> float **) let double x = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> ((fun p -> 2. *. p) @@ -40,7 +45,7 @@ module Z = (** val succ_double : float -> float **) let succ_double x = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 1.) (fun p -> ((fun p -> 1. +. (2. *. p)) @@ -52,7 +57,7 @@ module Z = (** val pred_double : float -> float **) let pred_double x = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (~-.) 1.) (fun p -> @@ -65,10 +70,10 @@ module Z = let rec pos_sub x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> double (pos_sub p q)) (fun q -> @@ -78,7 +83,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> pred_double (pos_sub p q)) (fun q -> @@ -88,7 +93,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (~-.) ((fun p -> 2. *. p) q)) (fun q -> (~-.) @@ -130,7 +135,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val pow : float -> float -> float **) let pow x y = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 1.) (fun p -> @@ -142,7 +147,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val square : float -> float **) let square x = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> @@ -153,12 +158,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val compare : float -> float -> comparison **) - let compare = fun x y -> if x=y then Eq else if x<y then Lt else Gt + let compare = fun x y -> if float_eq x y then Eq else if x<y then Lt else Gt (** val sgn : float -> float **) let sgn z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> @@ -202,9 +207,9 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val eqb : float -> float -> bool **) let rec eqb x y = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> true) (fun p -> @@ -213,7 +218,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els false) y) (fun p -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> false) (fun q -> @@ -222,7 +227,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els false) y) (fun p -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> false) (fun p0 -> @@ -247,7 +252,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val abs_nat : float -> int **) let abs_nat z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0) (fun p -> @@ -259,7 +264,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val abs_N : float -> float **) let abs_N z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> @@ -271,7 +276,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val to_nat : float -> int **) let to_nat z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0) (fun p -> @@ -283,7 +288,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val to_N : float -> float **) let to_N z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> @@ -295,7 +300,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val of_nat : int -> float **) let of_nat n = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 0.) (fun n0 -> @@ -305,7 +310,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val of_N : float -> float **) let of_N n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> @@ -315,7 +320,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val to_pos : float -> float **) let to_pos z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 1.) (fun p -> @@ -327,7 +332,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val iter : float -> ('a1 -> 'a1) -> 'a1 -> 'a1 **) let iter n f x = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> x) (fun p -> @@ -340,7 +345,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec pos_div_eucl a b = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun a' -> let (q, r) = pos_div_eucl a' b in let r' = add (mul ((fun p -> 2. *. p) 1.) r) 1. in @@ -360,18 +365,18 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val div_eucl : float -> float -> float * float **) let div_eucl a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (0., 0.)) (fun a' -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (0., 0.)) (fun p -> pos_div_eucl a' b) (fun b' -> let (q, r) = pos_div_eucl a' b' in - ((fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + ((fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> ((opp q), 0.)) (fun p -> ((opp (add q 1.)), @@ -381,12 +386,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els r)) b) (fun a' -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (0., 0.)) (fun p -> let (q, r) = pos_div_eucl a' b in - ((fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + ((fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> ((opp q), 0.)) (fun p0 -> ((opp (add q 1.)), @@ -412,11 +417,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val quotrem : float -> float -> float * float **) let quotrem a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (0., 0.)) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (0., a)) (fun b0 -> @@ -425,7 +430,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let (q, r) = N.pos_div_eucl a0 b0 in ((opp (of_N q)), (of_N r))) b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (0., a)) (fun b0 -> @@ -448,12 +453,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val even : float -> bool **) let even z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> true) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> false) (fun p0 -> @@ -463,7 +468,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els p) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> false) (fun p0 -> @@ -476,12 +481,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val odd : float -> bool **) let odd z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> false) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> true) (fun p0 -> @@ -491,7 +496,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els p) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> true) (fun p0 -> @@ -504,12 +509,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val div2 : float -> float **) let div2 z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (Pos.div2 p)) (fun p0 -> @@ -524,12 +529,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val quot2 : float -> float **) let quot2 z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (Pos.div2 p)) (fun p0 -> @@ -539,7 +544,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els p) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (~-.) (Pos.div2 p)) (fun p0 -> (~-.) @@ -552,12 +557,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val log2 : float -> float **) let log2 z = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (Pos.size p)) (fun p -> @@ -572,7 +577,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val sqrtrem : float -> float * float **) let sqrtrem n = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> (0., 0.)) (fun p -> @@ -588,7 +593,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val sqrt : float -> float **) let sqrt n = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun p -> @@ -600,11 +605,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val gcd : float -> float -> float **) let gcd a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> abs b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> abs a) (fun b0 -> @@ -613,7 +618,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (Pos.gcd a0 b0)) b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> abs a) (fun b0 -> @@ -626,11 +631,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val ggcd : float -> float -> float * (float * float) **) let ggcd a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> ((abs b), (0., (sgn b)))) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> ((abs a), ((sgn a), 0.))) (fun b0 -> @@ -640,7 +645,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let (aa, bb) = p in (g, (aa, ((~-.) bb)))) b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> ((abs a), ((sgn a), 0.))) (fun b0 -> @@ -655,11 +660,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val testbit : float -> float -> bool **) let testbit a n = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> odd a) (fun p -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> false) (fun a0 -> @@ -674,7 +679,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val shiftl : float -> float -> float **) let shiftl a n = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> a) (fun p -> @@ -691,11 +696,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_lor : float -> float -> float **) let coq_lor a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> a) (fun b0 -> @@ -704,7 +709,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (N.succ_pos (N.ldiff (Pos.pred_N b0) a0))) b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> a) (fun b0 -> (~-.) @@ -717,11 +722,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_land : float -> float -> float **) let coq_land a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun b0 -> @@ -730,7 +735,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els of_N (N.ldiff a0 (Pos.pred_N b0))) b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun b0 -> @@ -743,11 +748,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val ldiff : float -> float -> float **) let ldiff a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> 0.) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> a) (fun b0 -> @@ -756,7 +761,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els of_N (N.coq_land a0 (Pos.pred_N b0))) b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> a) (fun b0 -> (~-.) @@ -769,11 +774,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_lxor : float -> float -> float **) let coq_lxor a b = - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> a) (fun b0 -> @@ -782,7 +787,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (N.succ_pos (N.coq_lxor a0 (Pos.pred_N b0)))) b) (fun a0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> a) (fun b0 -> (~-.) @@ -795,9 +800,9 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val eq_dec : float -> float -> bool **) let eq_dec x y = - ((fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + ((fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ y0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> true) (fun p -> @@ -806,7 +811,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els false) y0) (fun x0 y0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> false) (fun p0 -> @@ -815,7 +820,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els false) y0) (fun x0 y0 -> - (fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z)) + (fun f0 fp fn z -> if float_eq z 0. then f0 () else if z>0. then fp z else fn (~-. z)) (fun _ -> false) (fun p0 -> diff --git a/generator/tests/jsref/BinNat.ml b/generator/tests/jsref/BinNat.ml index 394b02a..3968878 100644 --- a/generator/tests/jsref/BinNat.ml +++ b/generator/tests/jsref/BinNat.ml @@ -11,7 +11,11 @@ let __ = let rec f _ = Obj.repr f in Obj.repr f module N = struct type t = float - + + (* HACK *) + let is_even p = + float_eq (mod_float p 2.) 0. + (** val zero : float **) let zero = @@ -30,7 +34,7 @@ module N = (** val succ_double : float -> float **) let succ_double x = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 1.) (fun p -> ((fun p -> 1. +. (2. *. p)) @@ -40,7 +44,7 @@ module N = (** val double : float -> float **) let double n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> ((fun p -> 2. *. p) @@ -58,7 +62,7 @@ module N = (** val succ_pos : float -> float **) let succ_pos n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 1.) (fun p -> @@ -79,21 +83,21 @@ module N = (** val compare : float -> float -> comparison **) - let compare = fun x y -> if x=y then Eq else if x<y then Lt else Gt + let compare = fun x y -> if float_eq x y then Eq else if x<y then Lt else Gt (** val eqb : float -> float -> bool **) let rec eqb n m = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> true) (fun p -> false) m) (fun p -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> false) (fun q -> @@ -128,12 +132,12 @@ module N = (** val div2 : float -> float **) let div2 n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> p) (fun p -> @@ -146,12 +150,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val even : float -> bool **) let even n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> true) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> false) (fun p0 -> @@ -169,11 +173,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val pow : float -> float -> float **) let pow n p = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 1.) (fun p0 -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun q -> @@ -184,7 +188,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val square : float -> float **) let square n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> @@ -194,12 +198,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val log2 : float -> float **) let log2 n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (Pos.size p)) (fun p -> @@ -212,7 +216,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val size : float -> float **) let size n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> @@ -222,7 +226,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val size_nat : float -> int **) let size_nat n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0) (fun p -> @@ -233,7 +237,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec pos_div_eucl a b = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun a' -> let (q, r) = pos_div_eucl a' b in let r' = succ_double r in @@ -243,12 +247,12 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let r' = double r in if leb b r' then ((succ_double q), (sub r' b)) else ((double q), r')) (fun _ -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> (0., 1.)) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (0., 1.)) (fun p0 -> (0., @@ -262,11 +266,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val div_eucl : float -> float -> float * float **) let div_eucl a b = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> (0., 0.)) (fun na -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> (0., a)) (fun p -> @@ -276,7 +280,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val div : float -> float -> float **) - let div = (fun x y -> if x = 0. then 0. else floor (x /. y)) + let div = (fun x y -> if float_eq x 0. then 0. else floor (x /. y)) (** val modulo : float -> float -> float **) @@ -285,11 +289,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val gcd : float -> float -> float **) let gcd a b = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> b) (fun p -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> a) (fun q -> @@ -300,11 +304,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val ggcd : float -> float -> float * (float * float) **) let ggcd a b = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> (b, (0., 1.))) (fun p -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> (a, (1., 0.))) (fun q -> @@ -315,7 +319,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val sqrtrem : float -> float * float **) let sqrtrem n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> (0., 0.)) (fun p -> @@ -329,7 +333,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val sqrt : float -> float **) let sqrt n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> @@ -339,11 +343,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_lor : float -> float -> float **) let coq_lor n m = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> m) (fun p -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> n) (fun q -> @@ -354,11 +358,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_land : float -> float -> float **) let coq_land n m = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun q -> @@ -369,11 +373,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val ldiff : float -> float -> float **) let rec ldiff n m = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> n) (fun q -> @@ -384,11 +388,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_lxor : float -> float -> float **) let coq_lxor n m = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> m) (fun p -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> n) (fun q -> @@ -409,7 +413,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val shiftl : float -> float -> float **) let shiftl a n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun a0 -> @@ -419,7 +423,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val shiftr : float -> float -> float **) let shiftr a n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> a) (fun p -> @@ -429,7 +433,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val testbit_nat : float -> int -> bool **) let testbit_nat a = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ x -> false) (fun p -> @@ -439,7 +443,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val testbit : float -> float -> bool **) let testbit a n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> false) (fun p -> @@ -449,7 +453,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val to_nat : float -> int **) let to_nat a = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0) (fun p -> @@ -459,7 +463,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val of_nat : int -> float **) let of_nat n = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 0.) (fun n' -> @@ -469,7 +473,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val iter : float -> ('a1 -> 'a1) -> 'a1 -> 'a1 **) let iter n f x = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> x) (fun p -> @@ -479,16 +483,16 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val eq_dec : float -> float -> bool **) let eq_dec n m = - ((fun f0 fp n -> if n=0. then f0 () else fp n) + ((fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ m0 -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> true) (fun p -> false) m0) (fun x m0 -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> false) (fun p0 -> @@ -499,7 +503,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val discr : float -> float option **) let discr n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> None) (fun p -> Some @@ -512,13 +516,13 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let binary_rect f0 f2 fS2 n = let f2' = fun p -> f2 p in let fS2' = fun p -> fS2 p in - ((fun f0 fp n -> if n=0. then f0 () else fp n) + ((fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> f0) (fun p -> let rec f p0 = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> fS2' p1 (f p1)) (fun p1 -> @@ -539,7 +543,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let peano_rect f0 f n = let f' = fun p -> f p in - ((fun f0 fp n -> if n=0. then f0 () else fp n) + ((fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> f0) (fun p -> diff --git a/generator/tests/jsref/BinPos.ml b/generator/tests/jsref/BinPos.ml index 1a61483..6bd8cc3 100644 --- a/generator/tests/jsref/BinPos.ml +++ b/generator/tests/jsref/BinPos.ml @@ -12,6 +12,11 @@ module Pos = struct type t = float + (* HACK *) + let is_even p = + float_eq (mod_float p 2.) 0. + + (** val succ : float -> float **) let rec succ = (+.) 1. @@ -24,10 +29,10 @@ module Pos = and add_carry x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 1. +. (2. *. p)) (add_carry p q)) (fun q -> (fun p -> 2. *. p) @@ -37,7 +42,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 2. *. p) (add_carry p q)) (fun q -> (fun p -> 1. +. (2. *. p)) @@ -47,7 +52,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 1. +. (2. *. p)) (succ q)) (fun q -> (fun p -> 2. *. p) @@ -61,7 +66,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec pred_double x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun p -> 1. +. (2. *. p)) ((fun p -> 2. *. p) p)) (fun p -> (fun p -> 1. +. (2. *. p)) @@ -78,7 +83,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let pred_N x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> ((fun p -> 2. *. p) p)) (fun p -> @@ -124,7 +129,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let double_pred_mask x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> IsPos ((fun p -> 2. *. p) ((fun p -> 2. *. p) p))) (fun p -> IsPos ((fun p -> 2. *. p) @@ -139,7 +144,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els | IsNul -> IsNeg | IsPos q -> ((fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> IsPos (pred q)) (fun p0 -> IsPos @@ -153,10 +158,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec sub_mask x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> double_mask (sub_mask p q)) (fun q -> @@ -166,7 +171,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> succ_double_mask (sub_mask_carry p q)) (fun q -> @@ -176,7 +181,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> IsNeg) (fun p -> @@ -190,10 +195,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els and sub_mask_carry x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> succ_double_mask (sub_mask_carry p q)) (fun q -> @@ -203,7 +208,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> double_mask (sub_mask_carry p q)) (fun q -> @@ -227,7 +232,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec iter n f x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun n' -> f (iter n' f (iter n' f x))) (fun n' -> @@ -245,7 +250,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec square p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun p -> 1. +. (2. *. p)) ((fun p -> 2. *. p) (add (square p0) p0))) (fun p0 -> (fun p -> 2. *. p) ((fun p -> 2. *. p) @@ -258,7 +263,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let div2 p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> p0) (fun p0 -> @@ -271,7 +276,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let div2_up p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> succ p0) (fun p0 -> @@ -284,7 +289,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec size_nat p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> Pervasives.succ (size_nat p0)) (fun p0 -> Pervasives.succ @@ -297,7 +302,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec size p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> succ (size p0)) (fun p0 -> @@ -308,11 +313,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val compare_cont : float -> float -> comparison -> comparison **) - let rec compare_cont = fun x y c -> if x=y then c else if x<y then Lt else Gt + let rec compare_cont = fun x y c -> if float_eq x y then c else if x<y then Lt else Gt (** val compare : float -> float -> comparison **) - let compare = fun x y -> if x=y then Eq else if x<y then Lt else Gt + let compare = fun x y -> if float_eq x y then Eq else if x<y then Lt else Gt (** val min : float -> float -> float **) @@ -326,10 +331,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec eqb p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> eqb p0 q0) (fun p1 -> @@ -339,7 +344,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> false) (fun q0 -> @@ -349,7 +354,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> false) (fun p0 -> @@ -398,10 +403,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec sqrtrem p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> sqrtrem_step (fun x -> (fun p -> 1. +. (2. *. p)) x) (fun x -> (fun p -> 1. +. (2. *. p)) x) (sqrtrem p1)) @@ -413,7 +418,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els p0) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> sqrtrem_step (fun x -> (fun p -> 1. +. (2. *. p)) x) (fun x -> (fun p -> 2. *. p) x) (sqrtrem p1)) @@ -435,15 +440,15 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val gcdn : int -> float -> float -> float **) let rec gcdn n a b = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun n0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun a' -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun b' -> match compare a' b' with | Eq -> a @@ -456,7 +461,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els b) (fun a0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> gcdn n0 a0 b) (fun b0 -> (fun p -> 2. *. p) @@ -477,15 +482,15 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val ggcdn : int -> float -> float -> float * (float * float) **) let rec ggcdn n a b = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> (1., (a, b))) (fun n0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun a' -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun b' -> match compare a' b' with | Eq -> (a, (1., 1.)) @@ -503,7 +508,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els b) (fun a0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> let (g, p0) = ggcdn n0 a0 b in let (aa, bb) = p0 in (g, (((fun p -> 2. *. p) aa), bb))) @@ -525,7 +530,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_Nsucc_double : float -> float **) let coq_Nsucc_double x = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 1.) (fun p -> ((fun p -> 1. +. (2. *. p)) @@ -535,7 +540,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_Ndouble : float -> float **) let coq_Ndouble n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> ((fun p -> 2. *. p) @@ -546,10 +551,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec coq_lor p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> (fun p -> 1. +. (2. *. p)) (coq_lor p0 q0)) (fun q0 -> (fun p -> 1. +. (2. *. p)) @@ -559,7 +564,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> (fun p -> 1. +. (2. *. p)) (coq_lor p0 q0)) (fun q0 -> (fun p -> 2. *. p) @@ -569,7 +574,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> q) (fun q0 -> (fun p -> 1. +. (2. *. p)) @@ -583,10 +588,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec coq_land p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Nsucc_double (coq_land p0 q0)) (fun q0 -> @@ -596,7 +601,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (coq_land p0 q0)) (fun q0 -> @@ -606,7 +611,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> 1.) (fun q0 -> @@ -620,10 +625,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec ldiff p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (ldiff p0 q0)) (fun q0 -> @@ -633,7 +638,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (ldiff p0 q0)) (fun q0 -> @@ -643,7 +648,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> 0.) (fun q0 -> @@ -657,10 +662,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec coq_lxor p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (coq_lxor p0 q0)) (fun q0 -> @@ -670,7 +675,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Nsucc_double (coq_lxor p0 q0)) (fun q0 -> @@ -680,7 +685,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> ((fun p -> 2. *. p) q0)) (fun q0 -> ((fun p -> 1. +. (2. *. p)) @@ -703,7 +708,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val shiftl : float -> float -> float **) let shiftl p n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> p) (fun n0 -> @@ -713,7 +718,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val shiftr : float -> float -> float **) let shiftr p n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> p) (fun n0 -> @@ -724,23 +729,23 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec testbit_nat p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 n -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> true) (fun n' -> testbit_nat p0 n') n) (fun p0 n -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> false) (fun n' -> testbit_nat p0 n') n) (fun _ n -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> true) (fun n0 -> @@ -752,23 +757,23 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec testbit p n = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> true) (fun n0 -> testbit p0 (pred_N n0)) n) (fun p0 -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> false) (fun n0 -> testbit p0 (pred_N n0)) n) (fun _ -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> true) (fun p0 -> @@ -781,7 +786,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let iter_op op = let rec iter0 p a = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> op a (iter0 p0 (op a a))) (fun p0 -> @@ -799,11 +804,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val of_nat : int -> float **) let rec of_nat n = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun x -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun n0 -> @@ -814,7 +819,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val of_succ_nat : int -> float **) let rec of_succ_nat n = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun x -> @@ -826,10 +831,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let eq_dec x y = let rec f p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 y0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> if f p0 p1 then true else false) (fun p1 -> @@ -839,7 +844,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y0) (fun p0 y0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> false) (fun p1 -> @@ -849,7 +854,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y0) (fun _ y0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> false) (fun p0 -> @@ -868,7 +873,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els f (succ ((fun p -> 2. *. p) p0)) (f ((fun p -> 2. *. p) p0) x)) in ((fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> f ((fun p -> 2. *. p) q) (f2 q)) (fun q -> @@ -922,7 +927,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec peanoView p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> peanoView_xI p0 (peanoView p0)) (fun p0 -> diff --git a/generator/tests/jsref/BinPosDef.ml b/generator/tests/jsref/BinPosDef.ml index 1b910c6..5ef3d33 100644 --- a/generator/tests/jsref/BinPosDef.ml +++ b/generator/tests/jsref/BinPosDef.ml @@ -5,11 +5,17 @@ module Pos = struct type t = float + + (* HACK *) + let is_even p = + float_eq (mod_float p 2.) 0. + + (** val succ : float -> float **) let rec succ x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun p -> 2. *. p) (succ p)) (fun p -> (fun p -> 1. +. (2. *. p)) @@ -22,10 +28,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec add x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 2. *. p) (add_carry p q)) (fun q -> (fun p -> 1. +. (2. *. p)) @@ -35,7 +41,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 1. +. (2. *. p)) (add p q)) (fun q -> (fun p -> 2. *. p) @@ -45,7 +51,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 2. *. p) (succ q)) (fun q -> (fun p -> 1. +. (2. *. p)) @@ -59,10 +65,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els and add_carry x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 1. +. (2. *. p)) (add_carry p q)) (fun q -> (fun p -> 2. *. p) @@ -72,7 +78,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 2. *. p) (add_carry p q)) (fun q -> (fun p -> 1. +. (2. *. p)) @@ -82,7 +88,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> (fun p -> 1. +. (2. *. p)) (succ q)) (fun q -> (fun p -> 2. *. p) @@ -96,7 +102,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec pred_double x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun p -> 1. +. (2. *. p)) ((fun p -> 2. *. p) p)) (fun p -> (fun p -> 1. +. (2. *. p)) @@ -109,7 +115,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let pred x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun p -> 2. *. p) p) (fun p -> @@ -122,7 +128,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let pred_N x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> ((fun p -> 2. *. p) p)) (fun p -> @@ -168,7 +174,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let double_pred_mask x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> IsPos ((fun p -> 2. *. p) ((fun p -> 2. *. p) p))) (fun p -> IsPos ((fun p -> 2. *. p) @@ -183,7 +189,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els | IsNul -> IsNeg | IsPos q -> ((fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> IsPos (pred q)) (fun p0 -> IsPos @@ -197,10 +203,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec sub_mask x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> double_mask (sub_mask p q)) (fun q -> @@ -210,7 +216,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> succ_double_mask (sub_mask_carry p q)) (fun q -> @@ -220,7 +226,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> IsNeg) (fun p -> @@ -234,10 +240,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els and sub_mask_carry x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> succ_double_mask (sub_mask_carry p q)) (fun q -> @@ -247,7 +253,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> double_mask (sub_mask_carry p q)) (fun q -> @@ -271,7 +277,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec mul x y = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> add y ((fun p -> 2. *. p) (mul p y))) (fun p -> (fun p -> 2. *. p) @@ -284,7 +290,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec iter n f x = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun n' -> f (iter n' f (iter n' f x))) (fun n' -> @@ -302,7 +308,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec square p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun p -> 1. +. (2. *. p)) ((fun p -> 2. *. p) (add (square p0) p0))) (fun p0 -> (fun p -> 2. *. p) ((fun p -> 2. *. p) @@ -315,7 +321,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let div2 p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> p0) (fun p0 -> @@ -328,7 +334,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let div2_up p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> succ p0) (fun p0 -> @@ -341,7 +347,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec size_nat p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> Pervasives.succ (size_nat p0)) (fun p0 -> Pervasives.succ @@ -354,7 +360,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec size p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> succ (size p0)) (fun p0 -> @@ -367,10 +373,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec compare_cont x y r = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> compare_cont p q r) (fun q -> @@ -380,7 +386,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun p -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> compare_cont p q Lt) (fun q -> @@ -390,7 +396,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els y) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q -> Lt) (fun q -> @@ -425,10 +431,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec eqb p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> eqb p0 q0) (fun p1 -> @@ -438,7 +444,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> false) (fun q0 -> @@ -448,7 +454,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> false) (fun p0 -> @@ -497,10 +503,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec sqrtrem p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> sqrtrem_step (fun x -> (fun p -> 1. +. (2. *. p)) x) (fun x -> (fun p -> 1. +. (2. *. p)) x) (sqrtrem p1)) @@ -512,7 +518,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els p0) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p1 -> sqrtrem_step (fun x -> (fun p -> 1. +. (2. *. p)) x) (fun x -> (fun p -> 2. *. p) x) (sqrtrem p1)) @@ -534,15 +540,15 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val gcdn : int -> float -> float -> float **) let rec gcdn n a b = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun n0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun a' -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun b' -> match compare a' b' with | Eq -> a @@ -555,7 +561,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els b) (fun a0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> gcdn n0 a0 b) (fun b0 -> (fun p -> 2. *. p) @@ -576,15 +582,15 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val ggcdn : int -> float -> float -> float * (float * float) **) let rec ggcdn n a b = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> (1., (a, b))) (fun n0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun a' -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun b' -> match compare a' b' with | Eq -> (a, (1., 1.)) @@ -602,7 +608,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els b) (fun a0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p -> let (g, p0) = ggcdn n0 a0 b in let (aa, bb) = p0 in (g, (((fun p -> 2. *. p) aa), bb))) @@ -624,7 +630,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_Nsucc_double : float -> float **) let coq_Nsucc_double x = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 1.) (fun p -> ((fun p -> 1. +. (2. *. p)) @@ -634,7 +640,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val coq_Ndouble : float -> float **) let coq_Ndouble n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> 0.) (fun p -> ((fun p -> 2. *. p) @@ -645,10 +651,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec coq_lor p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> (fun p -> 1. +. (2. *. p)) (coq_lor p0 q0)) (fun q0 -> (fun p -> 1. +. (2. *. p)) @@ -658,7 +664,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> (fun p -> 1. +. (2. *. p)) (coq_lor p0 q0)) (fun q0 -> (fun p -> 2. *. p) @@ -668,7 +674,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> q) (fun q0 -> (fun p -> 1. +. (2. *. p)) @@ -682,10 +688,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec coq_land p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Nsucc_double (coq_land p0 q0)) (fun q0 -> @@ -695,7 +701,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (coq_land p0 q0)) (fun q0 -> @@ -705,7 +711,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> 1.) (fun q0 -> @@ -719,10 +725,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec ldiff p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (ldiff p0 q0)) (fun q0 -> @@ -732,7 +738,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (ldiff p0 q0)) (fun q0 -> @@ -742,7 +748,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> 0.) (fun q0 -> @@ -756,10 +762,10 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec coq_lxor p q = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Ndouble (coq_lxor p0 q0)) (fun q0 -> @@ -769,7 +775,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun p0 -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> coq_Nsucc_double (coq_lxor p0 q0)) (fun q0 -> @@ -779,7 +785,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els q) (fun _ -> (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun q0 -> ((fun p -> 2. *. p) q0)) (fun q0 -> ((fun p -> 1. +. (2. *. p)) @@ -802,7 +808,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val shiftl : float -> float -> float **) let shiftl p n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> p) (fun n0 -> @@ -812,7 +818,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val shiftr : float -> float -> float **) let shiftr p n = - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> p) (fun n0 -> @@ -823,23 +829,23 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec testbit_nat p = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 n -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> true) (fun n' -> testbit_nat p0 n') n) (fun p0 n -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> false) (fun n' -> testbit_nat p0 n') n) (fun _ n -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> true) (fun n0 -> @@ -851,23 +857,23 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let rec testbit p n = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> true) (fun n0 -> testbit p0 (pred_N n0)) n) (fun p0 -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> false) (fun n0 -> testbit p0 (pred_N n0)) n) (fun _ -> - (fun f0 fp n -> if n=0. then f0 () else fp n) + (fun f0 fp n -> if float_eq n 0. then f0 () else fp n) (fun _ -> true) (fun p0 -> @@ -880,7 +886,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els let iter_op op = let rec iter0 p a = (fun f2p1 f2p f1 p -> -if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) +if p <= 1. then f1 () else if is_even p then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.))) (fun p0 -> op a (iter0 p0 (op a a))) (fun p0 -> @@ -898,11 +904,11 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val of_nat : int -> float **) let rec of_nat n = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun x -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun n0 -> @@ -913,7 +919,7 @@ if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) els (** val of_succ_nat : int -> float **) let rec of_succ_nat n = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> 1.) (fun x -> diff --git a/generator/tests/jsref/JsInterpreter.ml b/generator/tests/jsref/JsInterpreter.ml index b126188..45000c0 100644 --- a/generator/tests/jsref/JsInterpreter.ml +++ b/generator/tests/jsref/JsInterpreter.ml @@ -307,7 +307,7 @@ let runs_type_object_define_own_prop_array_loop x = x.runs_type_object_define_ow let object_has_prop runs0 s c l x = if_some (run_object_method object_has_prop_ s l) (fun b -> - let Coq_builtin_has_prop_default = b in + match b with Coq_builtin_has_prop_default -> if_spec (runs0.runs_type_object_get_prop s c l x) (fun s1 d -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool @@ -371,7 +371,7 @@ let run_object_get runs0 s c l x = let run_object_get_prop runs0 s c l x = if_some (run_object_method object_get_prop_ s l) (fun b -> - let Coq_builtin_get_prop_default = b in + match b with Coq_builtin_get_prop_default -> if_spec (runs0.runs_type_object_get_own_prop s c l x) (fun s1 d -> if full_descriptor_comparable d Coq_full_descriptor_undef then if_some (run_object_method object_proto_ s1 l) (fun proto -> @@ -462,7 +462,7 @@ let object_proto_is_prototype_of runs0 s l0 l = let object_default_value runs0 s c l prefo = if_some (run_object_method object_default_value_ s l) (fun b -> - let Coq_builtin_default_value_default = b in + match b with Coq_builtin_default_value_default -> let gpref = unsome_default Coq_preftype_number prefo in let lpref = other_preftypes gpref in let_binding (fun s' x k -> @@ -550,7 +550,7 @@ let to_string runs0 s c _foo_ = match _foo_ with let object_can_put runs0 s c l x = if_some (run_object_method object_can_put_ s l) (fun b -> - let Coq_builtin_can_put_default = b in + match b with Coq_builtin_can_put_default -> if_spec (runs0.runs_type_object_get_own_prop s c l x) (fun s1 d -> match d with | Coq_full_descriptor_undef -> @@ -1381,7 +1381,7 @@ let run_expr_get_value runs0 s c e = -> prop_name -> value -> strictness_flag -> result_void **) let object_put_complete runs0 b s c vthis l x v str = - let Coq_builtin_put_default = b in + match b with Coq_builtin_put_default -> if_bool (object_can_put runs0 s c l x) (fun s1 b0 -> if b0 then if_spec (runs0.runs_type_object_get_own_prop s1 c l x) (fun s2 d -> @@ -2751,7 +2751,7 @@ let make_arg_setter runs0 s c x x0 = string list -> result_void **) let rec arguments_object_map_loop runs0 s c l xs len args x str lmap xsmap = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> if list_eq_nil_decidable xsmap then res_void s @@ -4757,7 +4757,7 @@ let run_stat_while runs0 s c rv labs e1 t2 = let rec run_stat_switch_end runs0 s c rv _foo_ = match _foo_ with | [] -> result_out (Coq_out_ter (s, (res_normal rv))) | y :: scs' -> - let Coq_switchclause_intro (e, ts) = y in + match y with Coq_switchclause_intro (e, ts) -> if_success_state rv (run_block runs0 s c (rev ts)) (fun s1 rv1 -> run_stat_switch_end runs0 s1 c rv1 scs') @@ -4768,7 +4768,7 @@ let rec run_stat_switch_end runs0 s c rv _foo_ = match _foo_ with let rec run_stat_switch_no_default runs0 s c vi rv _foo_ = match _foo_ with | [] -> result_out (Coq_out_ter (s, (res_normal rv))) | y :: scs' -> - let Coq_switchclause_intro (e, ts) = y in + match y with Coq_switchclause_intro (e, ts) -> if_spec (run_expr_get_value runs0 s c e) (fun s1 v1 -> let_binding (strict_equality_test v1 vi) (fun b -> if b @@ -4791,7 +4791,7 @@ let run_stat_switch_with_default_default runs0 s c ts scs = let rec run_stat_switch_with_default_B runs0 s c vi rv ts0 scs = match scs with | [] -> run_stat_switch_with_default_default runs0 s c ts0 scs | y :: scs' -> - let Coq_switchclause_intro (e, ts) = y in + match y with Coq_switchclause_intro (e, ts) -> if_spec (run_expr_get_value runs0 s c e) (fun s1 v1 -> let_binding (strict_equality_test v1 vi) (fun b -> if b @@ -4810,7 +4810,7 @@ let rec run_stat_switch_with_default_A runs0 s c found vi rv scs1 ts0 scs2 = then run_stat_switch_with_default_default runs0 s c ts0 scs2 else run_stat_switch_with_default_B runs0 s c vi rv ts0 scs2 | y :: scs' -> - let Coq_switchclause_intro (e, ts) = y in + match y with Coq_switchclause_intro (e, ts) -> let_binding (fun s0 -> if_success_state rv (run_block runs0 s0 c (rev ts)) (fun s1 rv0 -> run_stat_switch_with_default_A runs0 s1 c true vi rv0 scs' ts0 scs2)) @@ -6142,7 +6142,7 @@ let run_javascript runs0 p = (** val runs : int -> runs_type **) let rec runs max_step = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> { runs_type_expr = (fun s x x0 -> Coq_result_bottom s); runs_type_stat = (fun s x x0 -> Coq_result_bottom s); runs_type_prog = (fun s x x0 -> Coq_result_bottom s); runs_type_call = diff --git a/generator/tests/jsref/JsNumber.ml b/generator/tests/jsref/JsNumber.ml index e552789..3c4fd4f 100644 --- a/generator/tests/jsref/JsNumber.ml +++ b/generator/tests/jsref/JsNumber.ml @@ -52,7 +52,7 @@ let ln2 = (log 2.) let from_string = (fun s -> (*try*) (* let s = (String.concat "" (List.map (String.make 1) s)) in ARTHUR hack*) - if s = "" then 0. else float_of_string s + if string_eq s "" then 0. else float_of_string s (* FIXME: with Failure "float_of_string" -> nan *) ) (* Note that we're using `float_of_string' there, which does not have the same behavior than JavaScript. For instance it will read "022" as 22 instead of @@ -65,9 +65,9 @@ let to_string = (fun f -> prerr_newline(); let string_of_number n = let sfn = string_of_float n in - (if (sfn = "inf") then "Infinity" else - if (sfn = "-inf") then "-Infinity" else - if (sfn = "nan") then "NaN" else + (if (string_eq sfn "inf") then "Infinity" else + if (string_eq sfn "-inf") then "-Infinity" else + if (string_eq sfn "nan") then "NaN" else let inum = int_of_float n in if (float_of_int inum = n) then (string_of_int inum) else (string_of_float n)) in string_of_number f @@ -95,7 +95,7 @@ let absolute = abs_float (** val sign : number -> number **) -let sign = (fun f -> float_of_int (compare f 0.)) +let sign = (fun f -> float_of_int (float_compare f 0.)) (** val lt_bool : number -> number -> bool **) @@ -123,7 +123,7 @@ let div = (/.) (** val number_comparable : number coq_Comparable **) -let number_comparable = (fun n1 n2 -> 0 = compare n1 n2) +let number_comparable = (fun n1 n2 -> int_eq 0 (float_compare n1 n2)) (** val of_int : float -> number **) diff --git a/generator/tests/jsref/JsPreliminary.ml b/generator/tests/jsref/JsPreliminary.ml index 7a284e8..2b060b8 100644 --- a/generator/tests/jsref/JsPreliminary.ml +++ b/generator/tests/jsref/JsPreliminary.ml @@ -163,7 +163,7 @@ let rec inequality_test_string s1 s2 = then inequality_test_string s1' s2' else lt_int_decidable (int_of_char c1) (int_of_char c2)) *) -let inequality_test_string s1 s2 = (s1 <> s2) +let inequality_test_string s1 s2 = (not (string_eq s1 s2)) (** val inequality_test_primitive : prim -> prim -> prim **) diff --git a/generator/tests/jsref/LibList.ml b/generator/tests/jsref/LibList.ml index e34e1e5..aafdc80 100644 --- a/generator/tests/jsref/LibList.ml +++ b/generator/tests/jsref/LibList.ml @@ -63,7 +63,7 @@ let rec take_drop_last l = match l with let rec nth_def d n l = match l with | [] -> d - | x :: l' -> if n=0 then x else nth_def d (n-1) l' + | x :: l' -> if int_eq n 0 then x else nth_def d (n-1) l' (** val mem_decide : 'a1 coq_Comparable -> 'a1 -> 'a1 list -> bool **) diff --git a/generator/tests/jsref/LibNat.ml b/generator/tests/jsref/LibNat.ml index f1fe6af..96922ec 100644 --- a/generator/tests/jsref/LibNat.ml +++ b/generator/tests/jsref/LibNat.ml @@ -3,16 +3,16 @@ open LibReflect (** val nat_compare : int -> int -> bool **) let rec nat_compare x y = - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> true) (fun n -> false) y) (fun x' -> - (fun fO fS n -> if n=0 then fO () else fS (n-1)) + (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> false) (fun y' -> diff --git a/generator/tests/jsref/LibReflect.ml b/generator/tests/jsref/LibReflect.ml index 61b683d..6a03ff9 100644 --- a/generator/tests/jsref/LibReflect.ml +++ b/generator/tests/jsref/LibReflect.ml @@ -52,5 +52,5 @@ let bool_comparable x y = (** val prop_eq_decidable : coq_Decidable -> coq_Decidable -> coq_Decidable **) -let prop_eq_decidable = (=) +let prop_eq_decidable = bool_eq diff --git a/generator/tests/jsref/Peano.ml b/generator/tests/jsref/Peano.ml index 99c30cf..d3bd560 100644 --- a/generator/tests/jsref/Peano.ml +++ b/generator/tests/jsref/Peano.ml @@ -5,5 +5,5 @@ let rec plus = (+) (** val nat_iter : int -> ('a1 -> 'a1) -> 'a1 -> 'a1 **) let rec nat_iter n f x = - if n=0 then x else f (nat_iter (n-1) f x) + if int_eq n 0 then x else f (nat_iter (n-1) f x) diff --git a/generator/tests/jsref/Shared.ml b/generator/tests/jsref/Shared.ml index 002d695..1327790 100644 --- a/generator/tests/jsref/Shared.ml +++ b/generator/tests/jsref/Shared.ml @@ -33,7 +33,7 @@ let le_int_decidable = (<=) (** val ge_nat_decidable : int -> int -> coq_Decidable **) -let ge_nat_decidable = (>=) +let ge_nat_decidable = int_ge type 'a coq_Pickable_option = 'a option diff --git a/generator/tests/jsref/String0.ml b/generator/tests/jsref/String0.ml index fdd7e9f..b638ef0 100644 --- a/generator/tests/jsref/String0.ml +++ b/generator/tests/jsref/String0.ml @@ -1,7 +1,7 @@ (* ARTHUR: hacked this file *) -let string_dec s1 s2 = (s1 = s2) +let string_dec s1 s2 = (string_eq s1 s2) let append s1 s2 = String.append s1 s2 -- GitLab