diff --git a/Src/COLIBRI/check_lin_expr.pl b/Src/COLIBRI/check_lin_expr.pl
index 6197d3892fa71e6b8ca3fab7eeb9c51a6901250e..b51c5c62ccb66a97e2833f53b82df2e6f4cea308 100755
--- a/Src/COLIBRI/check_lin_expr.pl
+++ b/Src/COLIBRI/check_lin_expr.pl
@@ -71,6 +71,7 @@ try_check_exists_lin_expr_giving_diff_args(Type,A,B,Stop) :-
 
     init_vardef,
     
+    %((var(A),var(B)) -> call(spy_here)@eclipse ; true),
     setval(get_args_from_other,0),
         
     ((number(A),
@@ -116,30 +117,21 @@ try_check_exists_lin_expr_giving_diff_args(Type,A,B,Stop) :-
     % qui peuvent etre utilises pour reduire A et B
     (reduce_var_from_rat_interval(Type,A,R1) -> true;call(spy_here)@eclipse),
     (reduce_var_from_rat_interval(Type,B,R2) -> true;call(spy_here)@eclipse),
-    ((is_real_box_rat(A,RA),
-      is_real_box_rat(B,RB))
+    ((number(A),Val = A,Other = B;
+      number(B),Val = B,Other = A)
     ->
-        RA \== RB,
-        Stop = 1
-    ;   ((number(A),
-          Val = A,
-          Other = B;
-          number(B),
-          Val = B,
-          Other = A)
-        ->
-            (Type == int ->
-                mfd:dvar_remove_element(Other,Val),
+        (Type == int ->
+            mfd:dvar_remove_element(Other,Val),
+            Stop = 1
+        ;   % real
+            ((not_inf_bounds(Other), % prudence pour p(Inf) ou s(-Inf)
+              is_float_number(Other),
+              not is_real_box(Other))
+            ->
+                mreal:dvar_remove_element(Other,Val),
                 Stop = 1
-            ;   % real
-                ((not_inf_bounds(Other), % prudence pour p(Inf) ou s(-Inf)
-                  is_float_number(Other),
-                  not is_real_box(Other))
-                ->
-                    mreal:dvar_remove_element(Other,Val),
-                    Stop = 1
-                ;   true))
-        ;   true)).
+            ;   true))
+    ;   true).
 
 %% Repérer (x+y)^2 et (x-y)^2 exhiber des carrés forcant le signe
 protected_find_square_ids(L,R) :-
diff --git a/Src/COLIBRI/col_solve.pl b/Src/COLIBRI/col_solve.pl
index f9f6e9fd365e2b7f869a30c8a25395cb50ba2dbe..2cf9d66f177eeb115c28d4ef23e34ab6018cc96e 100644
--- a/Src/COLIBRI/col_solve.pl
+++ b/Src/COLIBRI/col_solve.pl
@@ -613,11 +613,10 @@ smt_solve_bis0(Test,FILE,Code) :-
                        ;   true),
                        Code = 3,
                        setval(diag_code,(timeout,3))
-                   ;   (TagRead == syntax ->
+                   ;   (Tag == syntax ->
                            concat_string(["(error \"",FILE,":",TagRead,"\")"],Mess),
                            writeln(output,Mess),
-                           Code = 2,
-                           setval(diag_code,(unknown,2))
+                           Code = 2
                        ;   % debug
                            (Test == 1 -> halt;true),
                            writeln(output,unknown),
@@ -755,10 +754,7 @@ clean_and_save_goal_before_check_sat(Goal,NewGoal) :-
     conj_to_list(Goal,LGoal),
     goals_before_check_sat(LGoal,NLGoal0,LEndNewGoal),
     get_type_decl_list(NLGoal0,LDecl,NLGoal1),
-    (occurs(get_model,LEndNewGoal) ->
-        NLDecl = LDecl,
-        CleanLGoal = NLGoal1
-    ;   remove_unused_decl_goal(LDecl,NLDecl,NLGoal1,LEndNewGoal,CleanLGoal)),
+    remove_unused_decl_goal(LDecl,NLDecl,NLGoal1,CleanLGoal),
     keep_ground_goals(CleanLGoal,NLGoal2,_GCG,_EGCG),
     
     % BUG copy_term trop gros
@@ -803,11 +799,10 @@ list_to_conj([A,B|L],(A,CBL)) :- !,
 list_to_conj([A],A) :- !.
 list_to_conj([],true).
 
-remove_unused_decl_goal([],[],LG,_,LG).
-remove_unused_decl_goal([D|LD],NLD,LG,LEndNewGoal,NLG) ?- !,
+remove_unused_decl_goal([],[],LG,LG).
+remove_unused_decl_goal([D|LD],NLD,LG,NLG) ?- !,
     ((is_decl(D),
       term_variables(D,[V]),
-      not occurs(V,LEndNewGoal),
       member_begin_end(G,LG,NewLG,ELG,ELG),
       once member(G,[A $= B,
                      A #= B,
@@ -821,9 +816,9 @@ remove_unused_decl_goal([D|LD],NLD,LG,LEndNewGoal,NLG) ?- !,
     ->
         % D inutile
         % call(spy_here)@eclipse,
-        remove_unused_decl_goal(LD,NLD,NewLG,LEndNewGoal,NLG)
+        remove_unused_decl_goal(LD,NLD,NewLG,NLG)
     ;   NLD = [D|ENLD],
-        remove_unused_decl_goal(LD,ENLD,LG,LEndNewGoal,NLG)).
+        remove_unused_decl_goal(LD,ENLD,LG,NLG)).
 
 :- export my_term_variables/2.
 my_term_variables(Term,Vars) :-
@@ -1949,7 +1944,6 @@ check_unit_tests(SatUnsat,TO,Mod) :-
 
 check_unit_tests(SatUnsat,TO) :-
     Sat = [
-           "./UnitTests/sat/BV/",
            "./UnitTests/sat/FP/",
            "./UnitTests/sat/BVFP/",
            "./UnitTests/sat/FPLRA/",
@@ -1985,7 +1979,6 @@ check_unit_tests(SatUnsat,TO) :-
     Unsat = 
           [
            "./UnitTests/unsat/FP/",
-           "./UnitTests/unsat/BV/",
            "./UnitTests/unsat/BVFPLRA/",
              "./UnitTests/unsat/ALL/",
              "./UnitTests/unsat/FP/",
diff --git a/Src/COLIBRI/lin.pl b/Src/COLIBRI/lin.pl
index 88ce686a8b01d55fc858755edd7aee5bda16a707..0bbffdf2f99dbdc0d6dd526e7f962402db4e2ade 100644
--- a/Src/COLIBRI/lin.pl
+++ b/Src/COLIBRI/lin.pl
@@ -60,8 +60,7 @@ unify_lin_lin(Y, (_,CCX,LX,HX,InfosX), (IdY,CCY,LY,HY,InfosY)) ?-
     CCX = CCY,
     ((LX,HX,InfosX) == (LY,HY,InfosY) ->
         true
-    ;   append(InfosX,InfosY,Infos),
-        sort(0,<,Infos,NInfos),
+    ;   merge(0, <, InfosX, InfosY, NInfos),
         % garder les pires bornes pour Y
         NLY is min(LX,LY),
         NHY is max(HX,HY),
@@ -93,7 +92,7 @@ set_lin_var_bounds(V{(Id,CC,_,_,Infos)},L,H) ?-
 
 :- export add_lin_cstr/2.
 add_lin_cstr(V{(Id,CC,L,H,Infos)},Cstr) ?- !,
-	sort(0,<,[Cstr|Infos],NInfos),
+        merge(0,<,[Cstr],Infos,NInfos),
 	replace_attribute(V,(Id,CC,L,H,NInfos),lin).
 add_lin_cstr(_,_).
 
diff --git a/Src/COLIBRI/lp_arith.pl b/Src/COLIBRI/lp_arith.pl
index b16ee55b1baeb014c945bf6b9956c3bd324229e9..1ddd447a9d48b117745dc4fdbfe0c47abf803a93 100755
--- a/Src/COLIBRI/lp_arith.pl
+++ b/Src/COLIBRI/lp_arith.pl
@@ -1447,7 +1447,8 @@ lin_abs_int(A,B) :-
         add_lin_cstr(B,abs_int(A,B)),
         remind_lin_cstr(abs_int(A,B))).
 lin_abs_int(A,B).
-    
+
+%%%% CJ: never used ??
 %lin_abs_real(A,B) :- !.
 lin_abs_real(A,B) :-
     getval(use_delta,1)@eclipse,
@@ -1856,23 +1857,6 @@ insert_lin_cstr(square_int(X,XX)) ?- !,
     make_poly([(LXpHX,X),(-1,XX),(OpHX,LX)],P3,Int3),
     assert_poly_geq_val(P3,Int3).
 
-/*
-si A non signe les propagateurs garantissent:
-MaxB = min(op(MinA0),MaxA0)
-MinB = 0
-MinA = max(op(MaxB0),MinA0)
-MaxA = min(MaxB0,MaxA)
- (Ap >= 0),
- (An >= 0),
- (Ap =< MaxB),
- (An =< MaxB),
- (Ap - An =:= A)
- (Ap + An =:= B)
- (Ap =< MaxB * Bool),
- (NegBool + Bool = 1),
- (An =< MaxB * NegBool)
- NegBool * Bool = 0
-*/                                                                              
 insert_lin_cstr(abs_int(A,B)) ?- !,
     mfd:dvar_range(A,MinA,MaxA),
     (MaxA =< 0 ->
diff --git a/Src/COLIBRI/ndelta.pl b/Src/COLIBRI/ndelta.pl
index a49fe0db683d29e3fc1a29a74e3dc167b68d443a..61e6c1cf6432dec73fa86a3963b16338cc5d6743 100755
--- a/Src/COLIBRI/ndelta.pl
+++ b/Src/COLIBRI/ndelta.pl
@@ -1444,13 +1444,11 @@ deltas_inter_diff(OMin..OMax,=,C,=,C,1) :- !,
     C \== 0.
 deltas_inter_diff(OMin..OMax,_PlusDiff,Min..Max,NS,NC,Check) :-
     NMin0 is protected_rat_max(OMin,Min),
-    (fail,NMin0 =:= 0 ->
-        % seulement pour int et real_int
+    (NMin0 =:= 0 ->
         NMin = 1
     ;   NMin = NMin0),
     NMax0 is protected_rat_min(OMax,Max),
-    (fail,NMax0 =:= 0 ->
-        % seulement pour int et real_int
+    (NMax0 =:= 0 ->
         NMax = -1
     ;   NMax = NMax0),
     % On peut echouer ici
@@ -1465,7 +1463,7 @@ deltas_inter_diff(OMin..OMax,_PlusDiff,Min..Max,NS,NC,Check) :-
             NS = '=',
             NC = NMin
         ;   NC = NMin..NMax,
-            ((NMin > 0;
+            ((NMin >  0;
               NMax < 0)
             ->
                 NS = '+'
diff --git a/Src/COLIBRI/realarith.pl b/Src/COLIBRI/realarith.pl
index 55c97e8ab8b50438667d9f93d81cd12c76c8d708..3dae31c41abe98e0933c23863ee25fde19574a38 100644
--- a/Src/COLIBRI/realarith.pl
+++ b/Src/COLIBRI/realarith.pl
@@ -761,7 +761,7 @@ min_inv_round_rna_val(Type,B,A) :-
             (B == -0.0 ->
                 get_next_float(Type,-0.5,A)
             ;   A = 0.0)
-        ;   check_minus_rat(B,0.5,A0),
+        ;   safe_minus_rat(B,0.5,A0),
             (A0 == 0.0 ->
                 (get_sign(B,neg) ->
                     A = -0.0
@@ -1227,23 +1227,19 @@ ceiling_bis(Type,A,B) :-
             true
         ;   (nonvar(A) ->
                 get_next_float_int(Type,A,B)
-            ;   (is_real_box_rat(A,RA) ->
-                    ceiling(RA,CRA),
-                    numerator(CRA,IC),
-                    cast_int_real(Type,IC,B)
-                ;   (nonvar(B) ->
-                        (abs(B) =:= 1.0Inf ->
-                            % real impossible
-                            Type \== real,
-                            protected_unify(A,B)
-                        ;   get_previous_float_int(Type,B,LA0),
-                            (Type == real ->
-                                mreal:set_typed_intervals(A,Type,[LA0..B]),
-                                Continue = 1
-                                           % A peut devenir un float_int
-                            ;   get_next_float(Type,LA0,LA),
-                                mreal:set_typed_intervals(A,Type,[LA..B])))
-                    ;   Continue = 1))))),
+            ;   (nonvar(B) ->
+                    (abs(B) =:= 1.0Inf ->
+                        % real impossible
+                        Type \== real,
+                        protected_unify(A,B)
+                    ;   get_previous_float_int(Type,B,LA0),
+                        (Type == real ->
+                            mreal:set_typed_intervals(A,Type,[LA0..B]),
+                            Continue = 1
+                            % A peut devenir un float_int
+                        ;   get_next_float(Type,LA0,LA),
+                            mreal:set_typed_intervals(A,Type,[LA..B])))
+                ;   Continue = 1)))),
     (var(Continue) ->
         true
     ;   save_cstr_suspensions([A]),
@@ -3268,8 +3264,8 @@ add_real1(Type,A,B,C) :-
     set_priority(Prio),
     wake_if_other_scheduled(Prio).
 
-%check_real_add_opp(_,A,B,C,1) :- !.
-check_real_add_opp(real,A,B,C,Continue) ?-
+check_real_add_opp(_,A,B,C,1) :- !.
+check_real_add_opp(real,A,B,C,Continue) :-
     nonvar(C),
     C \== 0.0,
     var(A),
@@ -3279,8 +3275,8 @@ check_real_add_opp(real,A,B,C,Continue) ?-
     get_saved_cstr_suspensions(LS),
     ((member((_,op_real1(real,X,OpX)),LS),
       (X == A ->
-          % -X + B = C -> C + X = B
-          Goal =  add_real_bis(real,OpX,C,B)
+          % -X + B = C -> X - C = B
+          Goal =  minus_real_bis(real,OpX,C,B)
       ;   (X == B ->
               % A + -X = C -> X + C = A
               Goal =  add_real_bis(real,OpX,C,A)
@@ -3291,9 +3287,9 @@ check_real_add_opp(real,A,B,C,Continue) ?-
                   % A + OpX = C -> A = X + C
                   Goal = add_real_bis(real,X,C,A)))))
     ->
-        call(spy_here)@eclipse,
-        call_priority(Goal,2)
-        %Continue = 1
+        %call(spy_here)@eclipse,
+        call_priority(Goal,2),
+        Continue = 1
     ;   Continue = 1).
 check_real_add_opp(_,A,B,C,1).
 
@@ -4640,16 +4636,12 @@ is_fzero_interval([I]) ?-
 get_rel_between_real_args(A,A,RelAB) ?- !,
     RelAB = '='.
 get_rel_between_real_args(A,B,RelAB) :-
-    (((is_fzero(A),
-       ZA = 1,
-       get_type(B,Type);
-       is_fzero(B),
-       get_type(A,Type)),
-      Type \== real)
+    ((is_fzero(A),ZA = 1;
+      is_fzero(B))
     ->
         (nonvar(ZA) ->
             (is_fzero(B) ->
-               % on ne peut pas dire = ici
+                % on ne peut pas dire = ici
                 RelAB = ?
             ;   mreal:dvar_range(B,MinB,MaxB),
                 (MinB >= 0.0 ->
@@ -7093,10 +7085,18 @@ cast_int_real(Rnd,Type,A,B) :-
         % initialisation de A si necessaire/possible
         (get_type(A,_) ->
             dvar_range(int,A,LA,HA),
-            make_OCamlRat(LA,LRA),
-            float_of_OCamlRat(Type,LRnd,LRA,LB),
-            make_OCamlRat(HA,HRA),
-            float_of_OCamlRat(Type,HRnd,HRA,HB),
+            ((LRnd == rtn,
+              LA == 0)
+            ->
+                LB = -0.0
+            ;   make_OCamlRat(LA,LRA),
+                float_of_OCamlRat(Type,LRnd,LRA,LB)),
+            ((LRnd == rtn,
+              HA == 0)
+            ->
+               HB = -0.0
+            ;  make_OCamlRat(HA,HRA),
+               float_of_OCamlRat(Type,HRnd,HRA,HB)),
             set_typed_intervals(B,Type,[LB..HB])
         ;   true),
         % pas de projection inverse
@@ -7469,34 +7469,32 @@ cast_int_real_intervals(Type,[I|L],[CI|CL]) :-
 
 %% Pour simplif_node
 int_to_real_interval(I,CI) :-
-    getval(float_eval,Type)@eclipse,
-    int_to_real_interval(Type,I,CI).
+	getval(float_eval,Type)@eclipse,
+	int_to_real_interval(Type,I,CI).
 
 int_to_real_interval(real,I,CI) :- !,
-    int_to_real_interval0(I,CI).
+	int_to_real_interval0(I,CI).
 int_to_real_interval(Type,I,CI) :-
-    int_to_float_interval(Type,I,CI).
+	int_to_float_interval(Type,I,CI).
 
 
 int_to_real_interval0(Min..Max,CI) ?- !,
-    int_to_float_min(real,Min,CMin),
-    int_to_float_max(real,Max,CMax),
-    interval_from_bounds(CMin,CMax,CI).
+	int_to_float_min(real,Min,CMin),
+	int_to_float_max(real,Max,CMax),
+	interval_from_bounds(CMin,CMax,CI).
 int_to_real_interval0(I,CI) :-
-    int_to_float_min_max(real,I,CMin,CMax),
-    interval_from_bounds(CMin,CMax,CI).
+	int_to_float_min_max(real,I,CMin,CMax),
+	interval_from_bounds(CMin,CMax,CI).
 
 int_to_float_interval(Type,Min..Max,CI) ?- !,
-    int_to_float(Type,Min,CMin),
-    int_to_float(Type,Max,CMax),
-    interval_from_bounds(CMin,CMax,CI).
+	int_to_float(Type,Min,CMin),
+	int_to_float(Type,Max,CMax),
+	interval_from_bounds(CMin,CMax,CI).
 int_to_float_interval(Type,I,F) :-
-    int_to_float(Type,I,F).
+	int_to_float(Type,I,F).
 
-inv_cast_int_real_interval(Type,1.0Inf,A) ?- !.
-inv_cast_int_real_interval(Type,-1.0Inf,A) ?- !.
 inv_cast_int_real_interval(Type,B,A) :-
-    mfd:dvar_range(A,MinA,MaxA),
+	mfd:dvar_range(A,MinA,MaxA),
     mreal:dvar_range(B,MinB,MaxB),
     (MinB == -1.0Inf ->
         Stop = 1,
@@ -8400,7 +8398,7 @@ check_op_mult_div_real(real,A,OpA) ?- !,
         % -(X op Y) = OpA
         % ou -round/truncate(X) = OpA
         % on essaye de saturer
-        %call(spy_here)@eclipse,
+        call(spy_here)@eclipse,
         (foreach(NGs,LNGs) do
             call_priority(NGs,2))
     ;   true).
@@ -13603,36 +13601,37 @@ idiv_mod_real(A,B,Q,R) :- !,
     % pour la simulation des entiers non bornes par des reels
     get_priority(P),
     set_priority(1),
-    save_cstr_suspensions((A,B)),
-    get_saved_cstr_suspensions(LS),
-    ((member((_,check_idiv_mod_real(AA,BB,QQ,BQ,RR)),LS),
-      A == AA,B == BB)
-    ->
-        protected_unify(Q,QQ),
-        protected_unify(R,RR)
-    ;   set_lazy_domain(real,BQ),
-        launch_float_int_number(BQ),
-        ensure_not_NaN([A,B,Q,BQ,R]),
-        % 0.0 <= R <= abs(B)-1.0
-        launch_geq_real(real,R,0.0),
-        abs_val_real(real,B,AbsB),
-        launch_gt_real(real,AbsB,R),
-        % A = BQ + R
-        mult_real(real,B,Q,BQ),
-        add_real(real,BQ,R,A),
-        % cas à gérer explicitement pour forcer
-        % les signes de A et B 
-        chk_nan(as(A,real) $= as(0.0,real),
-                (as(Q,real) $= as(0.0,real)) and 
-                (as(R,real) $= as(0.0,real)),
-                chk_nan(as(A,real) $> as(0.0,real),
-                        chk_nan(as(B,real) $> as(0.0,real),
-                                as(Q,real) $>= as(0.0,real),
-                                as(Q,real) $=< as(0.0,real)),
-                        chk_nan(as(B,real) $> as(0.0,real),
-                                as(Q,real) $=< as(0.0,real),
-                                as(Q,real) $>= as(0.0,real)))),
-        check_idiv_mod_real(A,B,Q,BQ,R)),
+    set_lazy_domain(real,A),
+    set_lazy_domain(real,B),
+    set_lazy_domain(real,Q),
+    set_lazy_domain(real,BQ),
+    set_lazy_domain(real,R),
+    launch_float_int_number(A),
+    launch_float_int_number(B),
+    launch_float_int_number(Q),
+    launch_float_int_number(BQ),
+    launch_float_int_number(R),
+    ensure_not_NaN([A,B,Q,BQ,R]),
+    % 0.0 <= R <= abs(B)-1.0
+    launch_geq_real(real,R,0.0),
+    abs_val_real(real,B,AbsB),
+    launch_gt_real(real,AbsB,R),
+    % A = BQ + R
+    mult_real(real,B,Q,BQ),
+    add_real(real,BQ,R,A),
+    % cas à gérer explicitement pour forcer
+    % les signes de A et B 
+    chk_nan(as(A,real) $= as(0.0,real),
+            (as(Q,real) $= as(0.0,real)) and 
+            (as(R,real) $= as(0.0,real)),
+            chk_nan(as(A,real) $> as(0.0,real),
+                    chk_nan(as(B,real) $> as(0.0,real),
+                            as(Q,real) $>= as(0.0,real),
+                            as(Q,real) $=< as(0.0,real)),
+                    chk_nan(as(B,real) $> as(0.0,real),
+                            as(Q,real) $=< as(0.0,real),
+                            as(Q,real) $>= as(0.0,real)))),
+    check_idiv_mod_real(A,B,Q,BQ,R),
     set_priority(P),
     wake_if_other_scheduled(P).
 
@@ -13697,30 +13696,6 @@ check_idiv_mod_real(X,Y,Q,YQ,R) :-
             protected_unify(R,RR)
         ;   call_priority(Goal,2))
     ;   true),
-    % issue 63, A ETOFFER ?
-    % X > 0,  X = -OpX, Q = -OpQ ,R = -OpR
-    % => idiv_mod_real(OpX,Y,OpQ,OpR)
-    % saturation: OpX = Y*OpQ + OpR
-    ((member_begin_end((_,op_real1(real,A,B)),LSusp,BLS,ELS,ELS),
-      (A == X ->
-          OpX = B
-      ;   B == X,
-          OpX = A),
-      member_begin_end((_,op_real1(real,C,D)),BLS,BLS1,ELS1,ELS1),
-      (C == Q ->
-          OpQ = D
-      ;   D == Q,
-          OpQ = C),
-      member_begin_end((_,op_real1(real,E,F)),BLS1,BLS2,ELS2,ELS2),
-      (E == R ->
-          OpR = F
-      ;   F == R,
-          OpR = E))
-    ->
-        Goal = (mult_real(real,Y,OpQ,YOpQ),
-                add_real(real,YOpQ,OpR,OpX)),
-        call_priority(Goal,2)
-    ;   true),
     % X et/ou Y variable
     ((var(Stop),
       divides_real_vars(Y,X,[]))
@@ -13753,8 +13728,11 @@ check_idiv_mod_real(X,Y,Q,YQ,R) :-
             ->
                 launch_diff_real(real,D1,D2)
             ;   true)),
-        my_suspend(check_idiv_mod_real(X,Y,Q,YQ,R),4,
-                   (X,Y,Q,YQ,R)->suspend:constrained)
+
+        (var(Stop) ->
+            my_suspend(check_idiv_mod_real(X,Y,Q,YQ,R),4,(X,Y,Q,YQ,R)->
+                          suspend:constrained)
+        ;   true)
     ;   true),
     set_priority(P),
     wake_if_other_scheduled(P).
@@ -19756,30 +19734,27 @@ diff_real_ineq(_,_,_).
 
 is_removable_real_value_in_var(Type,DiffGt,A,B,PA,NA) ?- !,
     number(A),
-    (is_float_int_number(B) ->
-        get_previous_float_int(Type,A,PA),
-        get_next_float_int(Type,A,NA)
-    ;   (is_float_number(B) ->
-            get_previous_float(Type,A,PA0),
-            get_next_float(Type,A,NA0),
-            ((DiffGt == diff,
-              Type \== real,
-              abs(A) =:= 0.0)
-            ->
-                (A == 0.0 ->
-                    PA = -0.0,
-                    NA = NA0
-                ;   % A = -0
-                    PA = PA0,
-                    NA = 0.0)
-            ;   PA = PA0,
-                NA = NA0)
-        ;   Type = real,
-            is_float_int_number(B),
-            get_previous_float_int(real,A,PA),
-            is_inside_mantissa(real,PA),
-            get_next_float_int(real,A,NA),
-            is_inside_mantissa(real,NA))).
+    (is_float_number(B) ->
+        get_previous_float(Type,A,PA0),
+        get_next_float(Type,A,NA0),
+        ((DiffGt == diff,
+          Type \== real,
+          abs(A) =:= 0.0)
+        ->
+            (A == 0.0 ->
+                PA = -0.0,
+                NA = NA0
+            ;   % A = -0
+                PA = PA0,
+                NA = 0.0)
+        ;   PA = PA0,
+            NA = NA0)
+    ;   Type = real,
+        is_float_int_number(B),
+        get_previous_float_int(real,A,PA),
+        is_inside_mantissa(real,PA),
+        get_next_float_int(real,A,NA),
+        is_inside_mantissa(real,NA)).
 
 diff_real_number_box(_,A,B,1,Continue) ?- !.
 diff_real_number_box(Type,A,B,_,Continue) :-
@@ -20152,11 +20127,7 @@ check_geq_real(Type,A,B,_,Suspend) :-
         ;   geq_real_number_box(Type,A,B,Continue),
             (var(Continue) ->
                 true
-            ;   mreal:mindomain(A,NMinA),
-                mreal:maxdomain(B,NMaxB),
-                (NMinA >= NMaxB ->
-                    true
-                ;   Suspend = 1)))).
+            ;   Suspend = 1))).
 
 geq_real_number_box(real,A,B,Continue) ?- !,
     (is_real_box_rat(A,RA) ->
@@ -20192,9 +20163,7 @@ geq_real_number_box(real,A,B,Continue) ?- !,
                         ->
                             true
                         ;   % on a pu creer une boite
-                            ((var(B),
-                              get_next_float(real,-1.0Inf) =:= MaxB)
-                            ->
+                            (get_next_float(real,-1.0Inf) =:= MaxB ->
                                 launch_box(B),
                                 geq_real_number_box(real,A,B,Continue)
                             ;   Continue = 1))))))
@@ -20236,9 +20205,7 @@ geq_real_number_box(real,A,B,Continue) ?- !,
                     ;   mreal:maxdomain(B,MaxB),
                         (MinA >= MaxB ->
                             true
-                        ;   ((var(B),
-                              MaxB =:= get_next_float(real,-1.0Inf))
-                            ->
+                        ;   (MaxB =:= get_next_float(real,-1.0Inf) ->
                                 launch_box(B),
                                 geq_real_number_box(real,A,B,Continue)
                             ;   Continue = 1)))))
@@ -20258,9 +20225,7 @@ geq_real_number_box(real,A,B,Continue) ?- !,
                         ;   % peut echouer
                             mreal:maxdomain(A) >= MinB,
                             % on peut avoir une boite pour A maintenant
-                            ((var(A),
-                              MinA =:= get_previous_float(real,1.0Inf))
-                            ->
+                            (MinA =:= get_previous_float(real,1.0Inf) ->
                                 % nouvelle boite, on recommence
                                 launch_box(A),
                                 geq_real_number_box(real,A,B,Continue)
@@ -20271,15 +20236,11 @@ geq_real_number_box(real,A,B,Continue) ?- !,
                     mreal:dvar_remove_greater(B,MaxA),
                     mreal:mindomain(B,MinB),
                     mreal:dvar_remove_smaller(A,MinB),
-                    ((var(B),
-                      mreal:maxdomain(B) =:= get_next_float(real,-1.0Inf)) 
-                    ->
+                    (mreal:maxdomain(B) =:= get_next_float(real,-1.0Inf) ->
                         launch_box(B),
                         Iter = 1
                     ;   true),
-                    ((var(A),
-                      mreal:mindomain(A) =:= get_previous_float(real,1.0Inf)) 
-                    ->
+                    (mreal:mindomain(A) =:= get_previous_float(real,1.0Inf) ->
                         launch_box(A),
                         Iter = 1
                     ;   true),
diff --git a/Src/COLIBRI/smt_import.pl b/Src/COLIBRI/smt_import.pl
index cc621e38c28b185c1b9a4d9f2e66995bc93a5dfd..51496686c66e1dd460c1d86e610dac4981a715e4 100644
--- a/Src/COLIBRI/smt_import.pl
+++ b/Src/COLIBRI/smt_import.pl
@@ -23,7 +23,7 @@ quant_abs(Expr) :-
             (occurs(Expr,(0,1)) ->
                 Var = Expr
             ;   exit_block(syntax))
-        ;   %Var = 1,
+        ;   Var = 1,
             call(as(Var,bool) #= as(Expr,bool)))),
     getval(quant_abs,TL),
     (TL == 0 ->
@@ -91,8 +91,7 @@ parse_smtlib_file(File,Res) :-
         wait(ComPid,Status),
         Status == 0
     ;   FilteredFile = File),
-    ignore_logic(FilteredFile,NFilteredFile),
-    block((p_simplex_ocaml_create_parser(NFilteredFile,PEnv),
+    block((p_simplex_ocaml_create_parser(FilteredFile,PEnv),
            read_dolmen_terms(PEnv,Res)),
           Tag,
           (getval(scrambler,1)@eclipse ->
@@ -100,45 +99,6 @@ parse_smtlib_file(File,Res) :-
               exit(4)
           ;   exit_block(Tag))).
 
-ignore_logic(File,NFile) :-
-    open(File,update,Stream),
-    find_logic(Stream,Logic,NewFstr),
-    close(Stream),
-    setval(logic,Logic)@eclipse,
-    (var(NewFstr) ->
-        NFile = File
-    ;   NFile = "/tmp/col_temp.smt2",
-        open(NFile,write,S),
-        write(S,NewFstr),
-        close(S)).
-find_logic(Stream,Logic,NewFStr) :-
-    (at_eof(Stream) ->
-        Logic = ALL
-    ;   at(Stream,Pos),
-        read_string(Stream, end_of_line, Length, String),
-        ((substring(String,Before,After,"(set-logic "),
-          PBefore is Before-1,
-          not substring(String,1,PBefore,";"))
-        ->
-            (String == "(set-logic ALL)" ->
-                Logic = "ALL"
-            ;   Start is Before+11,
-                End is Length-Start,
-                substring(String,Start,End,EStr),
-                split_string(EStr,")","",LEstr),
-                (LEstr = [Logic] ->
-                    true
-                ;   LEstr = [_,Logic|_]),
-                at(Stream,PosE),
-                read_string(Stream,end_of_file,_,EFStr),
-                % on remplace pas un commentaire
-                concat_string(["(set-logic ALL)\n;",String,"\n",EFStr],EndStr),
-                seek(Stream,0),
-                read_string(Stream,end_of_file,_,FStr),
-                substring(FStr,1,Pos,BFStr),
-                concat_string([BFStr,EndStr],NewFStr))
-        ;   find_logic(Stream,Logic,NewFStr))).
-
 read_dolmen_terms(PEnv,Terms) :-
     p_simplex_ocaml_parser_next(PEnv,DTerm),
     (DTerm == end ->
@@ -665,16 +625,10 @@ check_sat :-
             writeln(output,unknown),
             setval(unknown_quantifier_abstraction,1)@eclipse
         ;   setval(unknown_quantifier_abstraction,0)@eclipse,
-            %setval(check_sat_vars,1)@eclipse,
-            check_sat0)).
-/*            (check_sat_vars ->
-                setval(check_sat_vars,0)@eclipse,
-                setval(diag_code,(sat,1))@eclipse,
-                writeln(output,sat)
-            ;   setval(diag_code,(unknown,2))@eclipse,
-                writeln(output,unknown),
-                setval(check_sat_vars,0)@eclipse))).
-*/
+            check_sat_vars,
+            setval(diag_code,(sat,1))@eclipse,
+            writeln(output,sat))).
+
 check_sat0 :-
     % pour les unknowm lies aux
     % contraintes residuelles en Real
@@ -1879,14 +1833,7 @@ add_binding(Var,Type,Val) :-
 get_binding(Var,Type,Val) :-
     getval(binding,HBinding),
     hash_contains(HBinding,Var),
-    hash_get(HBinding,Var,(Type0,Val)),
-    (var(Type) ->
-        Type = Type0
-    ;   (real_type(Type0,T) ->
-            (var(Type) ->
-                Type = T
-            ;   real_type(Type,T))
-        ;   Type0 = Type)).
+    hash_get(HBinding,Var,(Type,Val)).
 
 add_label(Label,Type,Val) :-
     getval(binding,HBinding),
@@ -1924,13 +1871,7 @@ remove_let_var(Var) :-
 get_let_var_type(Var,NVar,Type) :-
     atomic(Var),
     getval(let_vars,HLV),
-    hash_get(HLV,Var,(Type0,NVar)),
-    (var(Type) ->
-        Type = Type0
-    ;   (Type == Type0 ->
-            true
-        ;   real_type(Type,T),
-            real_type(Type,T))).
+    hash_get(HLV,Var,(Type,NVar)).
 
 unsupported_error(Com) :-
     concat_string(["(error \"Unsupported:",Com,"\")"],Err),
@@ -2023,9 +1964,8 @@ smt_interp(Expr,IExpr,Type) :-
 :- setval(in_assert,0).
 % INTERPRETATION
 smt_interp0(exit,true,bool) :- !.
-smt_interp0('set-logic'(SLogic),true,bool) :- !.
-    % deja fait dans ignore_logic
-    % setval(logic,SLogic)@eclipse.
+smt_interp0('set-logic'(SLogic),true,bool) :- !,
+    setval(logic,SLogic)@eclipse.
 
 smt_interp0('get-info'(Key),true,bool) :- 
     call(spy_here)@eclipse,
@@ -2102,8 +2042,7 @@ smt_interp0(assert(A0),NewDecl,bool) :- !,
                 ;   IA = IA0))
         ;   IA = IA0),
         getval(decl,Decl-NEnd),
-        ((var(IA),
-          VIA = IA;
+        ((var(IA),VIA = IA;
           remove_upper_as(IA,VIA,_),
           var(VIA))
         ->
@@ -2114,7 +2053,17 @@ smt_interp0(assert(A0),NewDecl,bool) :- !,
         ;   NEnd = IA),
         (integer(Decl) ->
             NDecl = as(Decl,bool)
-        ;   NDecl = Decl)),
+        ;   ((Decl =.. [FD,X,Y],
+              occurs(FD,('#=','$=')),
+              remove_upper_as(X,X1,_),
+              remove_upper_as(Y,Y1,_),
+              (var(X1);atomic(X1)),
+              (var(Y1);atomic(Y1)))
+            ->
+                (protected_unify(X1,Y1) ->
+                    NDecl = as(1,bool)
+                ;   NDecl = as(0,bool))
+            ;   NDecl = Decl))),
     reset_let_vars,
     remove_true_decl(NDecl,NewDecl),
     setval(decl,OD),
@@ -2426,7 +2375,9 @@ smt_interp0(not(A),NegIA,bool) :- !,
     ((nonvar(A),
       remove_upper_as(A,AA,_),
       (AA = let(Pairs,Expr),
-       NA = let(Pairs,not(Expr))))
+       NA = let(Pairs,not(Expr));
+       AA = forall(Pairs,Expr),
+       NA = exists(Pairs,not(Expr))))
     ->
         smt_interp(NA,NegIA,bool)
     ;   ((nonvar(A),
@@ -2454,14 +2405,8 @@ smt_interp0(A => B,IA => IB,bool) :- !,
     smt_interp(B,IB,bool).
 % comparaisons
 smt_interp0(A < B,Comp,bool) :- !,
-    smt_interp(A,IA0,Type0),
-    smt_interp(B,IB,Type1),
-    ((real_type(Type0,Type),
-      real_type(Type1,Type))
-    ->
-        true
-    ;   Type0 == Type1,
-        Type = Type0),
+    smt_interp(A,IA0,Type),
+    smt_interp(B,IB,Type),
     get_real_int_type_from_logic(Type),
     add_as(Type,IA0,IA),
     functor(Type,FType,_),
@@ -2469,14 +2414,8 @@ smt_interp0(A < B,Comp,bool) :- !,
         Comp = (as(IA,FType) #< IB)
     ;   Comp = (IA $< IB)).
 smt_interp0(A <= B,Comp,bool) :- !,
-    smt_interp(A,IA0,Type0),
-    smt_interp(B,IB,Type1),
-    ((real_type(Type0,Type),
-      real_type(Type1,Type))
-    ->
-        true
-    ;   Type0 == Type1,
-        Type = Type0),
+    smt_interp(A,IA0,Type),
+    smt_interp(B,IB,Type),
     get_real_int_type_from_logic(Type),
     add_as(Type,IA0,IA),
     functor(Type,FType,_),
@@ -3533,23 +3472,13 @@ get_type_from_sort('Bool',bool,bool) :- !.
 get_type_from_sort('Int',IType,Type) :-
     setval(int_used,1)@eclipse,
     (getval(real_for_int,1)@eclipse ->
-        (var(IType) ->
-            IType = real_int,
-            Type = real_int
-        ;   Type = real)
+%        IType = real,
+        IType = real_int,
+        Type = real_int
     ;   Type = IType,
         IType = int),
     !.
-get_type_from_sort('Real',IType,Type) ?- !,
-    (var(IType) ->
-        (var(Type) ->
-            IType = real,
-            Type = IType
-        ;   Type = IType)
-    ;   (var(Type) ->
-            Type = IType
-        ;   occurs(IType,(real,real_int)),
-            occurs(Type,(real,real_int)))).
+get_type_from_sort('Real',real,real) :- !.
 get_type_from_sort('RoundingMode',rnd,rnd) :- !.
 get_type_from_sort('_'('BitVec',N),uint(N),uint(N)) :- !.
 get_type_from_sort('Float32',float_simple,float) :- !.
diff --git a/Src/COLIBRI/solve.pl b/Src/COLIBRI/solve.pl
index 6236381094f3bc587d489fb57e9f70b9e8fd363b..759b7a66a6ce6f39ee6855a8aa6a5a232818da61 100644
--- a/Src/COLIBRI/solve.pl
+++ b/Src/COLIBRI/solve.pl
@@ -2488,7 +2488,7 @@ unfold_int_expr(EA $= EB,D,Cstr,Type0,R) ?-
         insert_dep_inst(dep(A,D,[R])),
         insert_dep_inst(dep(B,D,[R])),
         make_conj(CA,CB,CAB),
-        ((fail,(Type \== real;
+        (((Type \== real;
            fail,is_float_int_number(B)),
           (number(A),
            C = A;
@@ -2497,7 +2497,7 @@ unfold_int_expr(EA $= EB,D,Cstr,Type0,R) ?-
           var(B))
         ->
             Goal = in_intervals_reif(Type,B,[C],R)
-        ;   ((fail,(Type \== real;
+        ;   (((Type \== real;
                fail,is_float_int_number(A)),
               (number(B),
                C = B;
@@ -2574,7 +2574,7 @@ unfold_int_expr(EA $\= EB,D,Cstr,Type0,R) ?- !,
         insert_dep_inst(dep(A,D,[R])),
         insert_dep_inst(dep(B,D,[R])),
         make_conj(CA,CB,CAB),
-        (fail,(Type \== real,
+        ((Type \== real,
           (number(A),C = A;
            number(EA),to_real(Type,EA,C)),
           var(B))
@@ -2588,7 +2588,7 @@ unfold_int_expr(EA $\= EB,D,Cstr,Type0,R) ?- !,
                     Inter = [NA..1.0Inf]
                 ;   Inter = [-1.0Inf..PA,NA..1.0Inf])),
             Goal = in_intervals_reif(Type,B,Inter,R)
-        ;   ((fail,(Type \== real;
+        ;   (((Type \== real;
                fail,is_float_int_number(A)),
               (number(B),
                C = B;
@@ -2642,7 +2642,7 @@ unfold_int_expr(EA $< EB,D,Cstr,Type0,R) ?-
         insert_dep_inst(dep(A,D,[R])),
         insert_dep_inst(dep(B,D,[R])),
         min_max_lazy(Type,Min,Max,_),
-        ((fail,(Type \== real;
+        (((Type \== real;
            fail,is_float_int_number(B),
            FI = 1),
           (number(A),C = A;
@@ -2655,7 +2655,7 @@ unfold_int_expr(EA $< EB,D,Cstr,Type0,R) ?-
             ;   NA = C),
             Inter = [NA..Max],
             Goal = in_intervals_reif(Type,B,Inter,R)
-        ;   ((fail,(Type \== real;
+        ;   (((Type \== real;
                fail,is_float_int_number(A),
                FI = 1),
               (number(B),C = B;
@@ -2745,7 +2745,7 @@ unfold_int_expr(EA $=< EB,D,Cstr,Type0,R) ?-
         insert_dep_inst(dep(A,D,[R])),
         insert_dep_inst(dep(B,D,[R])),
         min_max_lazy(Type,Min,Max,_),
-        ((fail,(Type \== real;
+        (((Type \== real;
            fail,is_float_int_number(B)),
           (number(A),C = A;
            number(EA),to_real(Type,EA,C)),
@@ -2759,7 +2759,7 @@ unfold_int_expr(EA $=< EB,D,Cstr,Type0,R) ?-
             ;   NC = C),
             Inter = [NC..Max],
             Goal = in_intervals_reif(Type,B,Inter,R)
-        ;   ((fail,(Type \== real;
+        ;   (((Type \== real;
                fail,is_float_int_number(A)),
               (number(B),C = B;
                number(EB),to_real(Type,EB,C)),
@@ -5818,10 +5818,7 @@ isNaN(F,R) :-
                 protected_unify(R,RR),
                 (R == 0 ->
                     ensure_not_NaN(F)
-                ;   (R == 1 ->
-                        protected_unify(F,nan)
-                    ;   % on laisse l'autre  travailler
-                        true))
+                ;   true)
             ;   my_suspend(isNaN(F,R),0,[trigger(isNaN),(F,R)->suspend:constrained])))),
     set_priority(Prio),
     wake_if_other_scheduled(Prio).
@@ -6295,8 +6292,7 @@ to_real(Type,X,FX) :-
 to_real1(real,X,FX) ?- !,
     (getval(check_sat_vars,1)@eclipse ->
         FX = X
-    ;   rational(X,RX),
-        term_string(RX,SX),
+    ;   term_string(X,SX),
         unfold_real_expr(realString(SX),0,_,real,FX)).
     %norm_zero(real,X,FX).
 to_real1(_Type,nan,FX) ?- !,
@@ -6600,11 +6596,6 @@ unfold_real_expr(float_from_raw_uintN(EA),D,Cstr,Type,R) :-
     ;   Size == 64,
         Type = float_double),
     !,
-    unfold_int_expr(isNaN(as(R,Type)),D,CN,bool,Bool),
-    insert_dep_inst(dep(R,D,[A,Bool])),
-    make_conj(CA,CN,CAN),
-    make_conj(CAN,float_from_raw_uintN(Type,A,R),Cstr).
-/*
     ((number(A);
       number(R))
     ->
@@ -6612,7 +6603,6 @@ unfold_real_expr(float_from_raw_uintN(EA),D,Cstr,Type,R) :-
         blocked_call(float_from_raw_uintN(Type,A,R))
     ;   insert_dep_inst(dep(R,D,[A])),
         make_conj(CA,float_from_raw_uintN(Type,A,R),Cstr)).
-*/
 unfold_real_expr(float_from_int(EA),D,Cstr,float_simple,R) :- !,
     unfold_real_expr(float_from_int(rne,EA),D,Cstr,float_simple,R).
 unfold_real_expr(float_from_int(Rnd0,EA),D,Cstr,float_simple,R) :-
@@ -10145,35 +10135,27 @@ check_exists_fp_geq_reif(Cond,Type,A,B,Bool,Continue) :-
     ;   Continue = 1).
 
 
-gt_real_reif(Type,A,A,Bool) ?-
-    check_not_NaN(A),
-    !,
-    protected_unify(Bool,0).
-gt_real_reif(Type,A,B,Bool) ?-
-    Type \== real,
-    is_fzero(A),
-    is_fzero(B),
-    !,
-    protected_unify(Bool,0).
 gt_real_reif(Type,A,B,Bool) :-
-    (nonvar(Bool) ->
-        (Bool == 1 ->
-            launch_gt_real(Type,A,B)
-        ;   % Bool = 0
-            launch_geq_real(Type,B,A))
-    ;   ((getval(check_sat_vars,1)@eclipse,
-          Type == real,
-          once (number(A),
-                rational(A,RA);
-                is_real_box_rat(A,RA)),
-          once (number(B),
-                rational(B,RB);
-                is_real_box_rat(B,RB)))
-        ->
-            (RA > RB ->
-                protected_unify(Bool,1)
-            ;   protected_unify(Bool,0))
-        ;   gt_real_reif_bis(Type,A,B,Bool))).
+    (A == B ->
+        protected_unify(Bool,0)
+    ;   (nonvar(Bool) ->
+            (Bool == 1 ->
+                launch_gt_real(Type,A,B)
+            ;   % Bool = 0
+                launch_geq_real(Type,B,A))
+        ;   ((getval(check_sat_vars,1)@eclipse,
+              Type == real,
+              once (number(A),
+                    rational(A,RA);
+                    is_real_box_rat(A,RA)),
+              once (number(B),
+                    rational(B,RB);
+                    is_real_box_rat(B,RB)))
+            ->
+                (RA > RB ->
+                    protected_unify(Bool,1)
+                ;   protected_unify(Bool,0))
+            ;   gt_real_reif_bis(Type,A,B,Bool)))).
 
 gt_real_reif_bis(Type,A,B,Bool) :-
     get_priority(Prio),
@@ -10222,32 +10204,9 @@ check_exists_gt_real_reif(Type,A,B,Bool,Continue) :-
     ;   Continue = 1).
 
 
-geq_real_reif(Type,A,A,Bool) ?-
-    check_not_NaN(A),
-    !,
-    protected_unify(Bool,1).
-geq_real_reif(Type,A,B,Bool) ?-
-    Type \== real,
-    is_fzero(A),
-    is_fzero(B),
-    !,
-    protected_unify(Bool,1).
 geq_real_reif(Type,A,B,Bool) :-
-    get_priority(Prio),
-    set_priority(1),
     not_int(Bool,NotBool),
-    gt_real_reif(Type,B,A,NotBool),
-    (nonvar(Bool) ->
-        (Bool == 1 ->
-            protected_unify(NotBool,0)
-        ;   protected_unify(NotBool,1))
-    ;   (nonvar(NotBool) ->
-            (NotBool == 1 ->
-                protected_unify(Bool,0)
-            ;   protected_unify(Bool,1))
-        ;   true)),
-    set_priority(Prio),
-    wake_if_other_scheduled(Prio).
+    gt_real_reif(Type,B,A,NotBool).
 /*
 geq_real_reif(Type,A,B,Bool) :-
     gt_real_reif(Type,B,A,NotBool),
@@ -10294,9 +10253,11 @@ float_from_raw_uintN(Type,Size,Int,Res) :-
            Res == R,
            check_not_NaN(Res)))
         ->
+            kill_suspension(S),
             protected_unify(Int,IInt),
             protected_unify(R,Res)
-        ;   check_before_susp_float_from_raw_uintN(Type,Size,Int,Res))),
+        ;   true),
+        check_before_susp_float_from_raw_uintN(Type,Size,Int,Res)),
     set_priority(Prio),
     wake_if_other_scheduled(Prio).
 
@@ -10304,10 +10265,10 @@ check_before_susp_float_from_raw_uintN(Type,Size,Int,Res) :-
     float_from_raw_uintN_inst(Type,Size,Int,Res,Continue),
     (var(Continue) ->
         true
-    ;   ((true;check_not_NaN(Res)) ->
+    ;   (check_not_NaN(Res) ->
             my_suspend(float_from_raw_uintN(Type,Size,Int,Res),
                        0,(Int,Res)->suspend:constrained),
-            ((true;get_sign(Res,_)) ->
+            (get_sign(Res,_) ->
                 true
             ;   % A VERIFIER SUR UnitTest QF_*BVFP* !!!
                 chk_nan(not(isZero((as(Res,Type)))),
@@ -10315,14 +10276,10 @@ check_before_susp_float_from_raw_uintN(Type,Size,Int,Res) :-
                                 as(0.0,Type) $>= as(Res,Type),
                                 as(Res,Type) $>= as(0.0,Type)),
                         as(1,bool)))
-        ;   get_saved_cstr_suspensions(LS),
-            ((member((_,isNaN(R,B)),LS),
-              R == Res)
-            ->
-                protected_unify(B,Bool)
-            ;   int_vars(bool,Bool),
-                isNaN(Res,Bool)),
-           my_suspend(float_from_raw_uintN(Type,Size,Int,Res),0,Bool->suspend:inst))).
+        ;   int_vars(bool,Bool),
+            my_suspend(float_from_raw_uintN(Type,Size,Int,Res),
+                       0,Bool->suspend:inst),
+            isNaN(Res,Bool))).
 
 float_from_raw_uintN_inst(Type,Size,Int,Res,Continue) :-
     (integer(Int) ->
@@ -11155,7 +11112,6 @@ cdiv_crem(A,B,Q,R) :-
     mult_real(real,B,Q,BQ),
     % A = BQ + R
     add_real(real,BQ,R,A),
-/*
     % cas à gérer explicitement pour forcer
     % les signes de A et B 
     chk_nan(as(A,real) $= as(0.0,real),
@@ -11168,7 +11124,6 @@ cdiv_crem(A,B,Q,R) :-
                     chk_nan(as(B,real) $> as(0.0,real),
                             as(Q,real) $=< as(0.0,real),
                             as(Q,real) $>= as(0.0,real)))),
-*/
     check_cdiv_crem(A,B,Q,BQ,R),
     set_priority(P),
     wake_if_other_scheduled(P).
@@ -11177,53 +11132,22 @@ cdiv_crem(A,B,Q,R) :-
 check_cdiv_crem(A,B,Q,BQ,R) :-
     get_priority(P),
     set_priority(1),
-    check_cdiv_crem_inst_free(A,B,Q,BQ,R,Continue),
-    (nonvar(Continue) ->
-        check_cdiv_crem1(A,B,Q,BQ,R)
-    ;   true),
+    check_cdiv_crem1(A,B,Q,BQ,R),
     set_priority(P),
     wake_if_other_scheduled(P).
 
-check_cdiv_crem_inst_free(A,B,Q,BQ,R,Continue) ?- !,
-    (A == 0.0 ->
-        protected_unify(Q,0.0),
-        protected_unify(R,0.0);
-    (B == 1 ->
-        protected_unify(Q,A),
-        protected_unify(R,0.0);
-    (B == -1 ->
-        protected_unify(R,0.0),
-        op_real(real,A,Q);
-    (R == 0 ->
-        mult_real(real,B,Q,A);
-    (A == B ->
-        protected_unify(Q,1.0),
-        protected_unify(R,0.0);
-    (A == R ->
-        protected_unify(BQ,0.0),
-        protected_unify(Q,0.0);
-    ((Q == 0.0;
-      BQ == 0.0)
-    ->
-        protected_unify(Q,0.0),
-        protected_unify(BQ,0.0),
-        protected_unify(A,R);
-    ((is_inst_box(B),
-      once (is_inst_box(A);
-            is_inst_box(Q)))
-    ->
-        div_real(real,A,B,RQ),
-        truncate(real,RQ,Q),
-        mult_real(real,B,Q,BQ),
-        add_real(real,BQ,R,A);
-    Continue = 1)))))))).
-
-is_inst_box(A) :-
-    once (nonvar(A);
-          is_real_box_rat(A,_)).
-
+check_cdiv_crem1(A,B,Q,BQ,A) ?- !,
+    protected_unify(BQ,0.0),
+    protected_unify(Q,0.0).
+check_cdiv_crem1(A,B,Q,BQ,R) :-
+    nonvar(A),
+    nonvar(B),
+    !,
+    div_real(real,A,B,RQ),
+    truncate(real,RQ,Q),
+    mult_real(real,B,Q,BQ),
+    add_real(real,BQ,R,A).
 check_cdiv_crem1(A,B,Q,BQ,R) :-
-/*
     ((not not_zero(A),
       not not_zero(Q),
       (nonvar(A);
@@ -11232,21 +11156,18 @@ check_cdiv_crem1(A,B,Q,BQ,R) :-
        is_real_box_rat(B,_)))
     ->
         true
-    ;   
-*/
-    % A FAIRE: anti_congr,gestion des opposés ...
-    save_cstr_suspensions((A,B,Q,BQ,R)),
-    get_saved_cstr_suspensions(LS1),
-    attached_suspensions(cdcr,LST),
-    (foreach(S,LST),
-     fromto(LS1,ILS,OLS,LS) do
-        (get_suspension_data(S,goal,GS) ->
-            OLS = [(S,GS)|ILS]
-        ;   OLS = ILS)),
-    (member((_,check_cdiv_crem(_,_,_,_,_)),LS) ->
+    ;   % A FAIRE: anti_congr,gestion des opposés ...
+        save_cstr_suspensions((A,B,Q,BQ,R)),
+        get_saved_cstr_suspensions(LS1),
+        attached_suspensions(cdcr,LST),
+        (foreach(S,LST),
+         fromto(LS1,ILS,OLS,LS) do
+            (get_suspension_data(S,goal,GS) ->
+                OLS = [(S,GS)|ILS]
+            ;   OLS = ILS)),
         (foreach((S,G),LS),
          foreach(Unif,LUnif),
-         param(A,B,Q,BQ,R,Stop) do
+         param(A,B,Q,BQ,R) do
             (G = check_cdiv_crem(AA,BB,QQ,BBQQ,RR) ->
                 (AA == A ->
                     (BB == B ->
@@ -11258,9 +11179,7 @@ check_cdiv_crem1(A,B,Q,BQ,R) :-
                     ;   (RR == R ->
                             % R = A - BBQQ et R = A - BQ
                             % donc BBQQ = BQ
-                            ((QQ == Q,
-                              not_zero(Q))
-                            ->
+                            (QQ == Q ->
                                 % R = A - BBQ et R = A - BQ
                                 % donc BB == B
                                 Stop =  1,
@@ -11290,7 +11209,9 @@ check_cdiv_crem1(A,B,Q,BQ,R) :-
                             % donc RR = OpA + BQ
                             % donc RR = -R
                             Stop = 1,
-                            Unif = (op_real_bis(real,Q,QQ),
+                            Unif = (set_lazy_domain(real,Q,QQ),
+                                    op_real_bis(real,Q,QQ),
+                                    set_lazy_domain(real,RR),
                                     op_real_bis(real,R,RR))
                         ;   ((is_op_real(real,B,OpB),
                               BB == OpB)
@@ -11302,18 +11223,19 @@ check_cdiv_crem1(A,B,Q,BQ,R) :-
                                 % donc RR = -R
                                 Stop = 1,
                                 Unif = (protected_unify(Q,QQ),
+                                        set_lazy_domain(real,BBQQ),
                                         op_real_bis(real,BQ,BBQQ),
+                                        set_lazy_domain(real,RR),
                                         op_real_bis(real,R,RR))
                             ;   Unif = true))
                     ;    Unif = true))
             ;   Unif = true)),
         (foreach(U,LUnif) do
-            call_priority(U,2))
-    ;   true),
-    (nonvar(Stop) ->
-        true
-    ;   my_suspend(check_cdiv_crem(A,B,Q,BQ,R),0,
-                   [trigger(cdcr),(A,B,Q,BQ,R)->suspend:constrained])).
+            call_priority(U,2)),
+        (var(Stop) ->
+            my_suspend(check_cdiv_crem(A,B,Q,BQ,R),0,
+                       [trigger(cdcr),(A,B,Q,BQ,R)->suspend:constrained])
+        ;   true)).
 
 same_abs(Type,A,X,LSusp,Rel,NLSusp) :-
     (Type = real ->
@@ -12849,7 +12771,6 @@ dvar_size_check_real(real,V,Size) ?- !,
             real_int_size(V,Size)
         ;   dvar_size(float_double,V,Size))
     ;   Size = 1.0Inf).
-
 dvar_size_check_real(Type,V,Size) :-
     dvar_size(Type,V,Size).