diff --git a/Src/COLIBRI/realarith.pl b/Src/COLIBRI/realarith.pl index 50fd3165b24a2c07bfc6fa5e7296dee675e1fd39..3bd2216e898ad8423e03f821cbb922a15abd2973 100755 --- a/Src/COLIBRI/realarith.pl +++ b/Src/COLIBRI/realarith.pl @@ -3840,24 +3840,26 @@ set_interval_box(Var,Min,Max) :- %% avec une autre contrainte produisant une rbox %% pour les memes arguments check_rbox_cstrs(3,Goal) :- - %% Arite 3 - Goal =.. [F,Type,A0,B0,C], - check_rbox_rat(A0,A), - check_rbox_rat(B0,B), + % Arite 3 + Goal =.. [F,Type,A0,B0,C], + check_rbox_rat(A0,A), + (occurs(F,(power_real,inv_power_real)) -> + B = B0 + ; check_rbox_rat(B0,B)), var(C), !, (occurs(F,(add_real1,mult_real1)) -> - number_sort(0,=<,[A,B],[NA,NB]) - ; (NA,NB) = (A,B)), + number_sort(0,=<,[A,B],[NA,NB]) + ; (NA,NB) = (A,B)), Key =.. [F,Type,NA,NB], (check_seen_expr(Key,NC,Type) -> protected_unify(C,NC) ; add_seen_expr(Key,C,Type)), make_box_rat(F,A,B,C). check_rbox_cstrs(2,Goal) :- - %% Arite 2 - Goal =.. [F,Type,A,B], - var(B), + % Arite 2 + Goal =.. [F,Type,A,B], + var(B), !, Key =.. [F,Type,A], (check_seen_expr(Key,NB,Type) -> @@ -15063,162 +15065,165 @@ power_real_type(Type,A,N,B) :- ; fp_power(as(A,Type),as(N,int)) $= as(B,Type)). power_real(Type,A,2,B) ?- !, - %% square_real est plus efficace car - %% elle a une projection inverse + % square_real est plus efficace car + % elle a une projection inverse ensure_not_NaN((A,B)), set_lazy_domain(Type,A), - set_lazy_domain(Type,B), + set_lazy_domain(Type,B), check_no_float_error(Type,(A,B)), - square_real(Type,A,B). + square_real(Type,A,B). power_real(Type,A,N,B) :- - integer(N), - N >= 0, - N =< 2^53, - mreal:set_typed_intervals(A,Type,[-1.0Inf..1.0Inf]), - mreal:set_typed_intervals(B,Type,[-1.0Inf..1.0Inf]), + integer(N), + N >= 0, + N =< 2^53, + mreal:set_typed_intervals(A,Type,[-1.0Inf..1.0Inf]), + mreal:set_typed_intervals(B,Type,[-1.0Inf..1.0Inf]), ensure_not_NaN((A,B)), - (Type == real -> - true - ; launch_float_number(A), - launch_float_number(B)), - (N == 0 -> - protected_unify(B = 1.0) - ; (N == 1 -> - protected_unify(A = B) - ; same_float_int_number_status(Type,A,B), + (Type == real -> + true + ; launch_float_number(A), + launch_float_number(B)), + (N == 0 -> + protected_unify(B = 1.0) + ; (N == 1 -> + protected_unify(A = B) + ; same_float_int_number_status(Type,A,B), power_real_interval(Type,A,N,B), - (mod(N,2,0) -> - mreal:set_typed_intervals(B,Type,[0.0..1.0Inf]) - ; true), - power_real1(Type,A,N,B))). + (mod(N,2,0) -> + mreal:set_typed_intervals(B,Type,[0.0..1.0Inf]) + ; true), + power_real1(Type,A,N,B))). power_real1(Type,A,N,B) :- - get_priority(Prio), - set_priority(1), - same_float_int_number_status(Type,A,B), + get_priority(Prio), + set_priority(1), + same_float_int_number_status(Type,A,B), power_real_bis(Type,A,N,B), - set_priority(Prio), - wake_if_other_scheduled(Prio). + set_priority(Prio), + wake_if_other_scheduled(Prio). power_real_bis(Type,Val1,N,Val) :- - save_cstr_suspensions((Val1,Val)), - power_real_2_args_equal(Type,Val1,N,Val,Continue0), - (var(Continue0) -> - true - ; check_exists_power_real(Type,Val1,N,Val), - check_delta_power_real_int(Type,Val1,N,Mod2,Val), + save_cstr_suspensions((Val1,Val)), + power_real_2_args_equal(Type,Val1,N,Val,Continue0), + (var(Continue0) -> + true + ; check_exists_power_real(Type,Val1,N,Val), + check_delta_power_real_int(Type,Val1,N,Mod2,Val), power_real_inst(Type,Val1,N,Val,Continue0), check_launch_power_int(Type,Val1,N,Val,Continue0,Continue), - (nonvar(Continue) -> - power_real_rec(Type,Val1,N,Val), - % Ajouter des inegalites quand c est possible ici - % gt_real_ineq(Type,Val,Val1), - check_before_susp_power_real(Type,Val1,N,Val) - ; true)). + (nonvar(Continue) -> + (ground((Val1,N)) -> + % Val rationnel ? + true + ; power_real_rec(Type,Val1,N,Val)), + % Ajouter des inegalites quand c est possible ici + % gt_real_ineq(Type,Val,Val1), + check_before_susp_power_real(Type,Val1,N,Val) + ; true)). check_launch_power_int(Type,A,N,B,Continue,_) :- var(Continue), !. check_launch_power_int(Type,A,N,B,_,Continue) :- - ((term_variables((A,B),[_,_]), - is_float_int_number(A), - is_float_int_number(B), - is_inside_mantissa(Type,A), + ((term_variables((A,B),[_,_]), + is_float_int_number(A), + is_float_int_number(B), + is_inside_mantissa(Type,A), is_inside_mantissa(Type,B)) - -> - cast_real_int(Type,A,IA), - power(IA,N,IB), - cast_real_int(Type,B,IB) - ; Continue = 1). + -> + cast_real_int(Type,A,IA), + power(IA,N,IB), + cast_real_int(Type,B,IB) + ; Continue = 1). check_delta_power_real_int(Type,A,N,Mod2,B) :- ((Type == real, is_float_int_number(A), exists_delta_Rel(A,B,Rel,_,_)) -> - (Mod2 == 0 -> - Rel \== '>', - (Rel == '>=' -> - %% Donc A = B et A :: [0,1] - mreal:set_typed_intervals(A,real,[0.0,1.0]), - protected_unify(A = B) - ; (Rel == '=<' -> - true - ; %% A <> B - mreal:set_typed_intervals(A,real,[-1.0Inf .. -1.0, + (Mod2 == 0 -> + Rel \== '>', + (Rel == '>=' -> + % Donc A = B et A :: [0,1] + mreal:set_typed_intervals(A,real,[0.0,1.0]), + protected_unify(A = B) + ; (Rel == '=<' -> + true + ; % A <> B + mreal:set_typed_intervals(A,real,[-1.0Inf .. -1.0, 2.0 .. 1.0Inf]), mreal:set_typed_intervals(B,real,[-1.0Inf .. -1.0, - 1.0..1.0Inf]))) - ; %% A et B de meme signe - (Rel == '<' -> - %% A > 1 - mreal:dvar_remove_smaller(A,2.0), - float_of_rat(real,rtn,RMinB,MinB), + 1.0..1.0Inf]))) + ; % A et B de meme signe + (Rel == '<' -> + % A > 1 + mreal:dvar_remove_smaller(A,2.0), + float_of_rat(real,rtn,RMinB,MinB), RMinB is 2_1^N, - float_of_rat(real,rtn,RMinB,MinB), + float_of_rat(real,rtn,RMinB,MinB), mreal:dvar_remove_smaller(B,MinB) - ; (Rel == '=<' -> - %% A >= -1 - mreal:dvar_remove_smaller(A,-1.0), - mreal:dvar_remove_smaller(B,-1.0) - ; (Rel == '>' -> - %% A < -1 - mreal:dvar_remove_greater(A,-2.0), - RMaxB is -2_1^N, + ; (Rel == '=<' -> + % A >= -1 + mreal:dvar_remove_smaller(A,-1.0), + mreal:dvar_remove_smaller(B,-1.0) + ; (Rel == '>' -> + % A < -1 + mreal:dvar_remove_greater(A,-2.0), + RMaxB is -2_1^N, float_of_rat(real,rtp,RMaxB,MaxB), - mreal:dvar_remove_greater(B,MaxB) - ; (Rel == '>=' -> - %% A =< 1 - mreal:dvar_remove_greater(A,1.0), - mreal:dvar_remove_greater(B,1.0) - ; %% Rel = '#' - mreal:set_typed_intervals(A,real,[-1.0Inf.. -2.0, 2.0..1.0Inf]), - mreal:set_typed_intervals(B,real,[-1.0Inf.. -2.0, 2.0..1.0Inf])))))) - ; true). + mreal:dvar_remove_greater(B,MaxB) + ; (Rel == '>=' -> + % A =< 1 + mreal:dvar_remove_greater(A,1.0), + mreal:dvar_remove_greater(B,1.0) + ; % Rel = '#' + mreal:set_typed_intervals(A,real,[-1.0Inf.. -2.0, 2.0..1.0Inf]), + mreal:set_typed_intervals(B,real,[-1.0Inf.. -2.0, 2.0..1.0Inf])))))) + ; true). %% Val^N = Val power_real_2_args_equal(Type,Val,N,Val,_) ?- !, - (Type == real -> + (Type == real -> (mod(N,2,0) -> Inter = [0.0,1.0] - ; Inter = [-1.0,0.0,1.0]) + ; Inter = [-1.0,0.0,1.0]) ; (mod(N,2,0) -> Inter = [0.0,1.0,1.0Inf] - ; Inter = [-1.0Inf,-1.0,-0.0,0.0,1.0,1.0Inf])), - mreal:set_typed_intervals(Val,Type,Inter). + ; Inter = [-1.0Inf,-1.0,-0.0,0.0,1.0,1.0Inf])), + mreal:set_typed_intervals(Val,Type,Inter). %% Val^N = -Val power_real_2_args_equal(Type,Val1,N,Val,Continue) :- - get_saved_cstr_suspensions(LSusp), - ((member((Susp,op_real1(Type,X,Y)),LSusp), - (X == Val1, Y == Val; - X == Val, Y == Val1)) - -> - % Val1: [-1.0Inf,-1.0,-0.0], Val: [0.0,1.0,1.0Inf], N pair - mod(N,2,0), + get_saved_cstr_suspensions(LSusp), + ((member((Susp,op_real1(Type,X,Y)),LSusp), + (X == Val1, Y == Val; + X == Val, Y == Val1)) + -> + % Val1: [-1.0Inf,-1.0,-0.0], Val: [0.0,1.0,1.0Inf], N pair + mod(N,2,0), (Type == real -> mreal:set_typed_intervals(Val1,real,[-1.0,0.0]), mreal:set_typed_intervals(Val,real,[0.0,1.0]) ; mreal:set_typed_intervals(Val1,Type,[-1.0Inf,-1.0,-0.0]), mreal:set_typed_intervals(Val,Type,[0.0,1.0,1.0Inf])) - ; Continue = 1). + ; Continue = 1). check_exists_power_real(Type,A,N,B) :- - ((var(A), - get_saved_cstr_suspensions(LSusp), - member((Susp,power_real1(Type,X,N,Y)),LSusp), - ( X == A, (U1,U2) = (Y,B) - ; Type == real, mod(N,2,1), var(Y),Y == B, (U1,U2) = (X,A))) - -> - kill_suspension(Susp), - protected_unify(U1 = U2) - ; true). + ((var(A), + get_saved_cstr_suspensions(LSusp), + member((Susp,power_real1(Type,X,N,Y)),LSusp), + ( X == A, (U1,U2) = (Y,B) + ; Type == real, mod(N,2,1), var(Y),Y == B, (U1,U2) = (X,A))) + -> + kill_suspension(Susp), + protected_unify(U1 = U2) + ; true). check_before_susp_power_real(Type,Val1,N,Val) :- - power_real_inst(Type,Val1,N,Val,Continue), - (var(Continue) -> - true - ; ndelta:disable_delta_check, + power_real_inst(Type,Val1,N,Val,Continue), + (var(Continue) -> + true + ; ndelta:disable_delta_check, check_other_power_ineqs_from_res(Type,N,Val1,Val), ndelta:allow_delta_check, @@ -15438,36 +15443,36 @@ power_real_inst(Type,Val1,N,Val,Continue) :- ; Continue = 1)). power_real_rec(Type,Val1,N,Val) :- - mreal:dvar_domain(Val1,Dom1), - mreal:dvar_domain(Val,Dom), - power_real_rec(Type,Val1,N,Val,Dom1,Dom). + mreal:dvar_domain(Val1,Dom1), + mreal:dvar_domain(Val,Dom), + power_real_rec(Type,Val1,N,Val,Dom1,Dom). power_real_rec(Type,Val1,N,Val,Dom1,Dom) :- - %% Val = exp(Val1) - mreal:dom_interval(Dom1,LInter1), - power_real_interval_list(Type,LInter1,N,PowLInter), - mreal:list_to_typed_dom(Type,PowLInter,PowDom), - mreal:dom_intersection(Dom,PowDom,NDom,_), - mreal:dvar_set(Val,NDom), - %% Val1 ~= pow(Val,1/N) - mreal:dvar_domain(Val,NewDom), - mreal:dom_interval(NewDom,NLInter), - inv_power_real_interval_list(Type,NLInter,N,InvPowLInter), - mreal:list_to_typed_dom(Type,InvPowLInter,InvPowDom), - mreal:dom_intersection(Dom1,InvPowDom,NDom1,_), - mreal:dvar_set(Val1,NDom1), - mreal:dvar_domain(Val1,NewDom1), - % = necessaire - (NewDom1 = Dom1 -> - %% On a fini - true - ; power_real_rec(Type,Val1,N,Val,NewDom1,NewDom)). + % Val = exp(Val1) + mreal:dom_interval(Dom1,LInter1), + power_real_interval_list(Type,LInter1,N,PowLInter), + mreal:list_to_typed_dom(Type,PowLInter,PowDom), + mreal:dom_intersection(Dom,PowDom,NDom,_), + mreal:dvar_set(Val,NDom), + % Val1 ~= pow(Val,1/N) + mreal:dvar_domain(Val,NewDom), + mreal:dom_interval(NewDom,NLInter), + inv_power_real_interval_list(Type,NLInter,N,InvPowLInter), + mreal:list_to_typed_dom(Type,InvPowLInter,InvPowDom), + mreal:dom_intersection(Dom1,InvPowDom,NDom1,_), + mreal:dvar_set(Val1,NDom1), + mreal:dvar_domain(Val1,NewDom1), + % = necessaire + (NewDom1 = Dom1 -> + % On a fini + true + ; power_real_rec(Type,Val1,N,Val,NewDom1,NewDom)). %% Typage et calcul de la projection directe %% Utilise aussi pour l'evaluation power_real_interval(A,2,B) ?- !, - square_real_interval(A,B). + square_real_interval(A,B). power_real_interval(A,N,B) :- getval(float_eval,Type)@eclipse, integer(N), @@ -15484,13 +15489,13 @@ power_real_interval_type(Type,A,N,B) :- ; set_lazy_domain(Type,B))). power_real_interval(_,A,0,B) ?- !, - protected_unify(B = 1.0). + protected_unify(B = 1.0). power_real_interval(Type,A,1,B) ?- !, -% set_lazy_domain(Type,A), - mreal:set_typed_intervals(A,Type,[-1.0Inf..1.0Inf]), - protected_unify(B = A). + % set_lazy_domain(Type,A), + mreal:set_typed_intervals(A,Type,[-1.0Inf..1.0Inf]), + protected_unify(B = A). power_real_interval(Type,A,N,B) :- - N > 1, + N > 1, ((Type == real, check_rbox_rat(A,RatA)) -> @@ -15517,56 +15522,56 @@ power_real_interval(Type,A,N,B) :- %% Pour simplif_node power_real_intervals(IV,N,NIV) :- - getval(float_eval,Type)@eclipse, - integer(N), - N >= 0, - N =< 2^53, + getval(float_eval,Type)@eclipse, + integer(N), + N >= 0, + N =< 2^53, set_lazy_domain(Tyep,NIV), - power_interval_real(Type,IV,N,NIV). + power_interval_real(Type,IV,N,NIV). power_real_interval_list(Type,[],N,[]). power_real_interval_list(Type,[I|L],N,[NI|NL]) :- - power_interval_real(Type,I,N,NI), - power_real_interval_list(Type,L,N,NL). + power_interval_real(Type,I,N,NI), + power_real_interval_list(Type,L,N,NL). power_interval_real(Type,I,N,NI) :- - (float(I) -> - power_real_value(Type,I,N,Low,High) - ; min_max_inter(I,Min,Max), - ((mod(N,2,0), - Min < 0.0) - -> - (Max >= 0.0 -> - %% I AUTOUR DE 0 - Low = 0.0, - norm_zero_op(Type,Min,OpMin), - NMax is max(OpMin,Max), - power_real_max(Type,NMax,N,High) - ; %% I NEGATIF - norm_zero_op(Type,Max,OpMax), - power_real_min(Type,OpMax,N,Low), - norm_zero_op(Type,Min,OpMin), - power_real_max(Type,OpMin,N,High)) - ; power_real_min(Type,Min,N,Low), - power_real_max(Type,Max,N,High))), - interval_from_bounds(Low,High,NI). + (float(I) -> + power_real_value(Type,I,N,Low,High) + ; min_max_inter(I,Min,Max), + ((mod(N,2,0), + Min < 0.0) + -> + (Max >= 0.0 -> + % I AUTOUR DE 0 + Low = 0.0, + norm_zero_op(Type,Min,OpMin), + NMax is max(OpMin,Max), + power_real_max(Type,NMax,N,High) + ; % I NEGATIF + norm_zero_op(Type,Max,OpMax), + power_real_min(Type,OpMax,N,Low), + norm_zero_op(Type,Min,OpMin), + power_real_max(Type,OpMin,N,High)) + ; power_real_min(Type,Min,N,Low), + power_real_max(Type,Max,N,High))), + interval_from_bounds(Low,High,NI). power_real_value(real,Val,N,L,H) :- - power_real_value(Val,N,L,H). + power_real_value(Val,N,L,H). power_real_value(float_double,Val,N,PVal,PVal) :- - pow_double(Val,N,PVal0), - norm_zero(float_double,PVal0,PVal). + pow_double(Val,N,PVal0), + norm_zero(float_double,PVal0,PVal). power_real_value(float_simple,Val,N,PVal,PVal) :- - pow_float(Val,N,PVal0), - norm_zero(float_simple,PVal0,PVal). + pow_float(Val,N,PVal0), + norm_zero(float_simple,PVal0,PVal). %% N >= 1, mode real power_real_value(Val,1,Val,Val) :- !. power_real_value(0.0,N,0.0,0.0) :- !. power_real_value(Val,N,L,H) :- - pow_real_min_max(Val,N,L,H). + pow_real_min_max(Val,N,L,H). pow_real_min_max(Val,N,L,H) :- rational(Val,RatVal), @@ -15622,75 +15627,75 @@ power_real_max(Type,Val,N,H) :- inv_power_real_interval_list(Type,[],N,[]). inv_power_real_interval_list(Type,[I|L],N,NL) :- - inv_power_real_interval(Type,I,N,NL,ENL), - inv_power_real_interval_list(Type,L,N,ENL). + inv_power_real_interval(Type,I,N,NL,ENL), + inv_power_real_interval_list(Type,L,N,ENL). inv_power_real_interval(Type,Min..Max,N,L,EL) :- !, - (Min >= 0.0 -> - min_inv_power_real(Type,Min,N,Low), - max_inv_power_real(Type,Max,N,High), - (Low > High -> - L = EL - ; interval_from_bounds(Low,High,NI), - (mod(N,2,0) -> - norm_zero_op(Type,Low,OpLow), - norm_zero_op(Type,High,OpHigh), - interval_from_bounds(OpHigh,OpLow,OpNI), - L = [OpNI,NI|EL] - ; L = [NI|EL])) - ; % Min < 0.0 - % N est impair car on a enleve les negatifs - % pour les N pairs - OpMin is -Min, - (Max < 0.0 -> - OpMax is -Max, - max_inv_power_real(Type,OpMin,N,OpLow), - min_inv_power_real(Type,OpMax,N,OpHigh), - norm_zero_op(Type,OpLow,Low), - norm_zero_op(Type,OpHigh,High) - ; % Min =< 0.0 et Max >= 0.0 - max_inv_power_real(Type,OpMin,N,OpLow), - norm_zero_op(Type,OpLow,Low), - max_inv_power_real(Type,Max,N,High)), - (Low > High -> - L = EL - ; interval_from_bounds(Low,High,NI), - L = [NI|EL])). + (Min >= 0.0 -> + min_inv_power_real(Type,Min,N,Low), + max_inv_power_real(Type,Max,N,High), + (Low > High -> + L = EL + ; interval_from_bounds(Low,High,NI), + (mod(N,2,0) -> + norm_zero_op(Type,Low,OpLow), + norm_zero_op(Type,High,OpHigh), + interval_from_bounds(OpHigh,OpLow,OpNI), + L = [OpNI,NI|EL] + ; L = [NI|EL])) + ; % Min < 0.0 + % N est impair car on a enleve les negatifs + % pour les N pairs + OpMin is -Min, + (Max < 0.0 -> + OpMax is -Max, + max_inv_power_real(Type,OpMin,N,OpLow), + min_inv_power_real(Type,OpMax,N,OpHigh), + norm_zero_op(Type,OpLow,Low), + norm_zero_op(Type,OpHigh,High) + ; % Min =< 0.0 et Max >= 0.0 + max_inv_power_real(Type,OpMin,N,OpLow), + norm_zero_op(Type,OpLow,Low), + max_inv_power_real(Type,Max,N,High)), + (Low > High -> + L = EL + ; interval_from_bounds(Low,High,NI), + L = [NI|EL])). inv_power_real_interval(Type,Val,N,L,EL) :- - (Val < 0.0 -> - % N est impair - OpVal is -Val, - min_inv_power_real(Type,OpVal,N,OpHigh), - max_inv_power_real(Type,OpVal,N,OpLow), - (OpLow < OpHigh -> - L = EL - ; norm_zero_op(Type,OpLow,Low), - norm_zero_op(Type,OpHigh,High), - interval_from_bounds(Low,High,NI), - L = [NI|EL]) - ; min_inv_power_real(Type,Val,N,Low), - max_inv_power_real(Type,Val,N,High), - (Low > High -> - L = EL - ; interval_from_bounds(Low,High,NI), - (mod(N,2,0) -> - (number(NI) -> - norm_zero_op(Type,NI,OpNI) - ; norm_zero_op(Type,Low,OpLow), - norm_zero_op(Type,High,OpHigh), - interval_from_bounds(OpHigh,OpLow,OpNI)), - L = [OpNI,NI|EL] - ; L = [NI|EL]))). + (Val < 0.0 -> + % N est impair + OpVal is -Val, + min_inv_power_real(Type,OpVal,N,OpHigh), + max_inv_power_real(Type,OpVal,N,OpLow), + (OpLow < OpHigh -> + L = EL + ; norm_zero_op(Type,OpLow,Low), + norm_zero_op(Type,OpHigh,High), + interval_from_bounds(Low,High,NI), + L = [NI|EL]) + ; min_inv_power_real(Type,Val,N,Low), + max_inv_power_real(Type,Val,N,High), + (Low > High -> + L = EL + ; interval_from_bounds(Low,High,NI), + (mod(N,2,0) -> + (number(NI) -> + norm_zero_op(Type,NI,OpNI) + ; norm_zero_op(Type,Low,OpLow), + norm_zero_op(Type,High,OpHigh), + interval_from_bounds(OpHigh,OpLow,OpNI)), + L = [OpNI,NI|EL] + ; L = [NI|EL]))). inv_powN_val(float_simple,ValpN,N,InvValpN) :- !, - InvN is 1/N, - pow_float(ValpN,InvN,InvValpN). + InvN is 1/N, + pow_float(ValpN,InvN,InvValpN). inv_powN_val(Type,ValpN,N,InvValpN) :- - InvN is 1/N, - pow_double(ValpN,InvN,InvValpN). + InvN is 1/N, + pow_double(ValpN,InvN,InvValpN). %% Pour memoriser le resultat de check_reachable_from_power %% entre les appels a min_inv_power_real et max_inv_power_real @@ -15702,190 +15707,190 @@ inv_powN_val(Type,ValpN,N,InvValpN) :- % invariant Val >= 0 check_reachable_from_pow0(real,Val,N,Unreachable,Low,High,ValpInvN) :- !, - (getval(reachable_from_pow,(real,Val,N,Unreachable,Low,High,ValpInvN)) -> - true - ; inv_powN_val(real,Val,N,ValpInvN0), - power_real_value(real,ValpInvN0,N,LVal0,HVal0), - ((LVal0 == Val, - HVal0 == Val) - -> - ValpInvN = ValpInvN0 - ; (LVal0 >= Val -> - check_down_reachable_from_pow_real(ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) - ; % LVal0 < Val, HVal0 =< Val - check_up_reachable_from_pow_real(ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN))), - setval(reachable_from_pow,(real,Val,N,Unreachable,Low,High,ValpInvN))). + (getval(reachable_from_pow,(real,Val,N,Unreachable,Low,High,ValpInvN)) -> + true + ; inv_powN_val(real,Val,N,ValpInvN0), + power_real_value(real,ValpInvN0,N,LVal0,HVal0), + ((LVal0 == Val, + HVal0 == Val) + -> + ValpInvN = ValpInvN0 + ; (LVal0 >= Val -> + check_down_reachable_from_pow_real(ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) + ; % LVal0 < Val, HVal0 =< Val + check_up_reachable_from_pow_real(ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN))), + setval(reachable_from_pow,(real,Val,N,Unreachable,Low,High,ValpInvN))). % double ou simple check_reachable_from_pow0(Type,Val,N,Unreachable,Low,High,ValpInvN) :- - (getval(reachable_from_pow,(Type,Val,N,Unreachable,Low,High,ValpInvN)) -> - true - ; inv_powN_val(Type,Val,N,ValpInvN0), - power_real_value(Type,ValpInvN0,N,Val0,_), - (Val0 == Val -> - ValpInvN = ValpInvN0 - ; (Val0 > Val -> - check_down_reachable_from_pow(Type,ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) - ; % Val0 < Val - check_up_reachable_from_pow(Type,ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN))), - setval(reachable_from_pow,(Type,Val,N,Unreachable,Low,High,ValpInvN))). + (getval(reachable_from_pow,(Type,Val,N,Unreachable,Low,High,ValpInvN)) -> + true + ; inv_powN_val(Type,Val,N,ValpInvN0), + power_real_value(Type,ValpInvN0,N,Val0,_), + (Val0 == Val -> + ValpInvN = ValpInvN0 + ; (Val0 > Val -> + check_down_reachable_from_pow(Type,ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) + ; % Val0 < Val + check_up_reachable_from_pow(Type,ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN))), + setval(reachable_from_pow,(Type,Val,N,Unreachable,Low,High,ValpInvN))). check_up_reachable_from_pow_real(ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) :- !, - % On cherche un End tel que pow(Start,N) =< Val et pow(End,N) > Val - choose_end_narrow_pow_real(ValpInvN0,4,Val,N,ValpInvN0,Start,End), - power_real_value(real,End,N,LEndpN,HEndpN), - ((LEndpN == Val, - HEndpN == Val) - -> - ValpInvN = End - ; get_number_of_double_floats_between(Start,End,Nb), - check_up_reachable_from_pow_real(Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). + % On cherche un End tel que pow(Start,N) =< Val et pow(End,N) > Val + choose_end_narrow_pow_real(ValpInvN0,4,Val,N,ValpInvN0,Start,End), + power_real_value(real,End,N,LEndpN,HEndpN), + ((LEndpN == Val, + HEndpN == Val) + -> + ValpInvN = End + ; get_number_of_double_floats_between(Start,End,Nb), + check_up_reachable_from_pow_real(Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). % Delta > 0, on avance en doublant la distance a chaque fois choose_end_narrow_pow_real(ValpInvN0,Delta,Val,N,OStart,Start,End) :- - get_nth_double_float_from(ValpInvN0,Delta,End0), - power_real_value(real,End0,N,_,HEnd0pN), - ((End0 < 1.0Inf, - HEnd0pN =< Val) - -> - NDelta is 2*Delta, - choose_end_narrow_pow_real(ValpInvN0,NDelta,Val,N,End0,Start,End) - ; Start = OStart, - End = End0). + get_nth_double_float_from(ValpInvN0,Delta,End0), + power_real_value(real,End0,N,_,HEnd0pN), + ((End0 < 1.0Inf, + HEnd0pN =< Val) + -> + NDelta is 2*Delta, + choose_end_narrow_pow_real(ValpInvN0,NDelta,Val,N,End0,Start,End) + ; Start = OStart, + End = End0). % invariant: pow(Start,N) =< Val < pow(End,N) check_up_reachable_from_pow_real(Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN) :- !, - (Nb == 2 -> - Try = End - ; Rank is (Nb-1) div 2, - get_nth_float_from(real,Start,Rank,Try)), - power_real_value(real,Try,N,LTrypN,HTrypN), - ((LTrypN == Val, - HTrypN == Val) - -> - ValpInvN = Try - ; (HTrypN =< Val -> - (Nb == 2 -> - % Start et End sont trop petits pour atteindre Val - Unreachable = 1, - Low = End, - get_next_float(real,Low,High) - ; NNb is Nb - Rank, - check_up_reachable_from_pow_real(Try,End,Val,N,NNb,Unreachable,Low,High,ValpInvN)) - ; % HTrypN > Val - (Nb == 2 -> - % Start trop petit et Try trop grand - Unreachable = 1, - Low = Start, - High = Try - ; NNb is Rank + 1, - check_up_reachable_from_pow_real(Start,Try,Val,N,NNb,Unreachable,Low,High,ValpInvN)))). + (Nb == 2 -> + Try = End + ; Rank is (Nb-1) div 2, + get_nth_float_from(real,Start,Rank,Try)), + power_real_value(real,Try,N,LTrypN,HTrypN), + ((LTrypN == Val, + HTrypN == Val) + -> + ValpInvN = Try + ; (HTrypN =< Val -> + (Nb == 2 -> + % Start et End sont trop petits pour atteindre Val + Unreachable = 1, + Low = End, + get_next_float(real,Low,High) + ; NNb is Nb - Rank, + check_up_reachable_from_pow_real(Try,End,Val,N,NNb,Unreachable,Low,High,ValpInvN)) + ; % HTrypN > Val + (Nb == 2 -> + % Start trop petit et Try trop grand + Unreachable = 1, + Low = Start, + High = Try + ; NNb is Rank + 1, + check_up_reachable_from_pow_real(Start,Try,Val,N,NNb,Unreachable,Low,High,ValpInvN)))). check_down_reachable_from_pow_real(ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) :- !, - choose_start_narrow_pow_real(ValpInvN0,-4,Val,N,ValpInvN0,Start,End), - power_real_value(real,Start,N,LStartpN,HStartpN), - ((LStartpN == Val, - HStartpN == Val) - -> - ValpInvN = Start - ; get_number_of_double_floats_between(Start,End,Nb), - check_up_reachable_from_pow_real(Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). + choose_start_narrow_pow_real(ValpInvN0,-4,Val,N,ValpInvN0,Start,End), + power_real_value(real,Start,N,LStartpN,HStartpN), + ((LStartpN == Val, + HStartpN == Val) + -> + ValpInvN = Start + ; get_number_of_double_floats_between(Start,End,Nb), + check_up_reachable_from_pow_real(Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). % Delta < 0, on recule choose_start_narrow_pow_real(ValpInvN0,Delta,Val,N,OEnd,Start,End) :- - get_nth_double_float_from(ValpInvN0,Delta,Start0), - power_real_value(real,Start0,N,LStart0pN,_), - ((Start0 >= 0.0, - LStart0pN >= Val) - -> - NDelta is 2*Delta, - choose_start_narrow_pow_real(ValpInvN0,NDelta,Val,N,Start0,Start,End) - ; Start is max(0.0,Start0), - End = OEnd). + get_nth_double_float_from(ValpInvN0,Delta,Start0), + power_real_value(real,Start0,N,LStart0pN,_), + ((Start0 >= 0.0, + LStart0pN >= Val) + -> + NDelta is 2*Delta, + choose_start_narrow_pow_real(ValpInvN0,NDelta,Val,N,Start0,Start,End) + ; Start is max(0.0,Start0), + End = OEnd). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % double ou simple check_up_reachable_from_pow(Type,ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) :- - % On cherche un End tel que pow(Start,N) < Val et pow(End,N) >= Val - choose_end_narrow_pow(Type,ValpInvN0,4,Val,N,ValpInvN0,Start,End), - power_real_value(Type,End,N,EndpN,_), - (EndpN == Val -> - ValpInvN = End - ; get_number_of_floats_between(Type,Start,End,Nb), - check_up_reachable_from_pow(Type,Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). + % On cherche un End tel que pow(Start,N) < Val et pow(End,N) >= Val + choose_end_narrow_pow(Type,ValpInvN0,4,Val,N,ValpInvN0,Start,End), + power_real_value(Type,End,N,EndpN,_), + (EndpN == Val -> + ValpInvN = End + ; get_number_of_floats_between(Type,Start,End,Nb), + check_up_reachable_from_pow(Type,Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). % Delta > 0, on avance en doublant la distance a chaque fois choose_end_narrow_pow(Type,ValpInvN0,Delta,Val,N,OStart,Start,End) :- - get_nth_float_from(Type,ValpInvN0,Delta,End0), - power_real_value(Type,End0,N,_,HEnd0pN), - (HEnd0pN < Val -> - NDelta is 2*Delta, - choose_end_narrow_pow(Type,ValpInvN0,NDelta,Val,N,End0,Start,End) - ; Start = OStart, - End = End0). + get_nth_float_from(Type,ValpInvN0,Delta,End0), + power_real_value(Type,End0,N,_,HEnd0pN), + (HEnd0pN < Val -> + NDelta is 2*Delta, + choose_end_narrow_pow(Type,ValpInvN0,NDelta,Val,N,End0,Start,End) + ; Start = OStart, + End = End0). % invariant: pow(Start,N) < Val < pow(End,N) check_up_reachable_from_pow(Type,Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN) :- - (Nb == 2 -> - Try = End - ; Rank is (Nb-1) div 2, - get_nth_float_from(Type,Start,Rank,Try)), - power_real_value(Type,Try,N,TrypN,_), - (TrypN == Val -> - ValpInvN = Try - ; (TrypN < Val -> - (Nb == 2 -> - % Start et End sont trop petits pour atteindre Val - Unreachable = 1, - Low = End, - get_next_float(Type,Low,High) - ; NNb is Nb - Rank, - check_up_reachable_from_pow(Type,Try,End,Val,N,NNb,Unreachable,Low,High,ValpInvN)) - ; % TrypN > Val - (Nb == 2 -> - % Start trop petit et Try trop grand - Unreachable = 1, - Low = Start, - High = Try - ; NNb is Rank + 1, - check_up_reachable_from_pow(Type,Start,Try,Val,N,NNb,Unreachable,Low,High,ValpInvN)))). + (Nb == 2 -> + Try = End + ; Rank is (Nb-1) div 2, + get_nth_float_from(Type,Start,Rank,Try)), + power_real_value(Type,Try,N,TrypN,_), + (TrypN == Val -> + ValpInvN = Try + ; (TrypN < Val -> + (Nb == 2 -> + % Start et End sont trop petits pour atteindre Val + Unreachable = 1, + Low = End, + get_next_float(Type,Low,High) + ; NNb is Nb - Rank, + check_up_reachable_from_pow(Type,Try,End,Val,N,NNb,Unreachable,Low,High,ValpInvN)) + ; % TrypN > Val + (Nb == 2 -> + % Start trop petit et Try trop grand + Unreachable = 1, + Low = Start, + High = Try + ; NNb is Rank + 1, + check_up_reachable_from_pow(Type,Start,Try,Val,N,NNb,Unreachable,Low,High,ValpInvN)))). check_down_reachable_from_pow(Type,ValpInvN0,Val,N,Unreachable,Low,High,ValpInvN) :- - choose_start_narrow_pow(Type,ValpInvN0,-4,Val,N,ValpInvN0,Start,End), - power_real_value(Type,Start,N,StartpN,_), - (StartpN == Val -> - ValpInvN = Start - ; get_number_of_floats_between(Type,Start,End,Nb), - check_up_reachable_from_pow(Type,Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). + choose_start_narrow_pow(Type,ValpInvN0,-4,Val,N,ValpInvN0,Start,End), + power_real_value(Type,Start,N,StartpN,_), + (StartpN == Val -> + ValpInvN = Start + ; get_number_of_floats_between(Type,Start,End,Nb), + check_up_reachable_from_pow(Type,Start,End,Val,N,Nb,Unreachable,Low,High,ValpInvN)). % Delta < 0, on recule choose_start_narrow_pow(Type,ValpInvN0,Delta,Val,N,OEnd,Start,End) :- - get_nth_float_from(Type,ValpInvN0,Delta,Start0), - power_real_value(Type,Start0,N,LStart0pN,_), - (LStart0pN > Val -> - NDelta is 2*Delta, - choose_start_narrow_pow(Type,ValpInvN0,NDelta,Val,N,Start0,Start,End) - ; Start = Start0, - End = OEnd). + get_nth_float_from(Type,ValpInvN0,Delta,Start0), + power_real_value(Type,Start0,N,LStart0pN,_), + (LStart0pN > Val -> + NDelta is 2*Delta, + choose_start_narrow_pow(Type,ValpInvN0,NDelta,Val,N,Start0,Start,End) + ; Start = Start0, + End = OEnd). min_inv_power_real(Type,0.0,N,Min) :- !, - max_inv_power_real(Type,0.0,N,Max), - Min is -Max. + max_inv_power_real(Type,0.0,N,Max), + Min is -Max. min_inv_power_real(real,Val,N,Min) :- !, - check_reachable_from_pow0(Type,Val,N,Unreachable,Min0,_,HMin), - (nonvar(Unreachable) -> - Min = Min0 - ; %% en real HMin est le seul a atteindre Val (Err == 0) - Min = HMin). + check_reachable_from_pow0(Type,Val,N,Unreachable,Min0,_,HMin), + (nonvar(Unreachable) -> + Min = Min0 + ; % en real HMin est le seul a atteindre Val (Err == 0) + Min = HMin). % double ou simple min_inv_power_real(Type,Val,N,Min) :- - check_reachable_from_pow0(Type,Val,N,Unreachable,Min0,Max0,HMin), - (nonvar(Unreachable) -> - Min = Max0 - ; get_previous_float(Type,Val,PVal), - inv_powN_val(Type,PVal,N,LMin), - narrow_min_inv_pow(Type,Val,N,LMin,HMin,Min)). + check_reachable_from_pow0(Type,Val,N,Unreachable,Min0,Max0,HMin), + (nonvar(Unreachable) -> + Min = Max0 + ; get_previous_float(Type,Val,PVal), + inv_powN_val(Type,PVal,N,LMin), + narrow_min_inv_pow(Type,Val,N,LMin,HMin,Min)). @@ -15895,78 +15900,78 @@ min_inv_power_real(Type,Val,N,Min) :- % pow(Val,1/N) = HMin % On cherche Min par dichotomie entre LMin et HMin narrow_min_inv_pow(Type,Val,N,LMin,HMin,Min) :- - (LMin >= HMin -> - get_previous_float(Type,HMin,NLMin) - % A priori pow(NLMin,1/N) < Val - ; NLMin = LMin), - get_number_of_floats_between(Type,NLMin,HMin,Num), - narrow_min_inv_pow(Type,Val,N,NLMin,HMin,Num,Min). + (LMin >= HMin -> + get_previous_float(Type,HMin,NLMin) + % A priori pow(NLMin,1/N) < Val + ; NLMin = LMin), + get_number_of_floats_between(Type,NLMin,HMin,Num), + narrow_min_inv_pow(Type,Val,N,NLMin,HMin,Num,Min). narrow_min_inv_pow(Type,Val,N,LMin,HMin,Num,Min) :- - Rank is (Num-1) div 2, - get_nth_float_from(Type,LMin,Rank,Min0), - power_real_value(Type,Min0,N,Val0,_), - (Val0 == Val -> - (Min0 == LMin -> - Min = LMin - ; NNum is Rank + 1, - narrow_min_inv_pow(Type,Val,N,LMin,Min0,NNum,Min)) - ; % Val0 < Val - ((Num == 2, - Rank == 0) - -> - Min = HMin - ; % on ignore Min0, - get_next_float(Type,Min0,NLMin), - NNum is -1 + Num - Rank, - narrow_min_inv_pow(Type,Val,N,NLMin,HMin,NNum,Min))). + Rank is (Num-1) div 2, + get_nth_float_from(Type,LMin,Rank,Min0), + power_real_value(Type,Min0,N,Val0,_), + (Val0 == Val -> + (Min0 == LMin -> + Min = LMin + ; NNum is Rank + 1, + narrow_min_inv_pow(Type,Val,N,LMin,Min0,NNum,Min)) + ; % Val0 < Val + ((Num == 2, + Rank == 0) + -> + Min = HMin + ; % on ignore Min0, + get_next_float(Type,Min0,NLMin), + NNum is -1 + Num - Rank, + narrow_min_inv_pow(Type,Val,N,NLMin,HMin,NNum,Min))). max_inv_power_real(_,1.0Inf,N,1.0Inf) :- !. max_inv_power_real(real,Val,N,Max) :- !, - check_reachable_from_pow0(real,Val,N,Unreachable,_,Max0,LMax), - (nonvar(Unreachable) -> - Max = Max0 - ; %% en real LMax est le seul a atteindre Val (Err == 0) - Max = LMax). + check_reachable_from_pow0(real,Val,N,Unreachable,_,Max0,LMax), + (nonvar(Unreachable) -> + Max = Max0 + ; % en real LMax est le seul a atteindre Val (Err == 0) + Max = LMax). % double ou simple max_inv_power_real(Type,Val,N,Max) :- - check_reachable_from_pow0(Type,Val,N,Unreachable,Min0,Max0,LMax), - (nonvar(Unreachable) -> - Max = Min0 - ; get_next_float(Type,Val,NVal), - inv_powN_val(Type,NVal,N,HMax), - narrow_max_inv_pow(Type,Val,N,LMax,HMax,Max)). + check_reachable_from_pow0(Type,Val,N,Unreachable,Min0,Max0,LMax), + (nonvar(Unreachable) -> + Max = Min0 + ; get_next_float(Type,Val,NVal), + inv_powN_val(Type,NVal,N,HMax), + narrow_max_inv_pow(Type,Val,N,LMax,HMax,Max)). %% LMax atteint Val narrow_max_inv_pow(Type,Val,N,LMax,HMax,Max) :- - (LMax >= HMax -> - get_next_float(Type,LMax,NHMax) - % A priori pow(NHMax,N) > Val - ; NHMax = HMax), - get_number_of_floats_between(Type,LMax,NHMax,Num), - narrow_max_inv_pow(Type,Val,N,LMax,NHMax,Num,Max). + (LMax >= HMax -> + get_next_float(Type,LMax,NHMax) + % A priori pow(NHMax,N) > Val + ; NHMax = HMax), + get_number_of_floats_between(Type,LMax,NHMax,Num), + narrow_max_inv_pow(Type,Val,N,LMax,NHMax,Num,Max). % double ou simple narrow_max_inv_pow(Type,Val,N,LMax,HMax,Num,Max) :- - Rank is Num div 2, - get_nth_float_from(Type,LMax,Rank,Max0), - power_real_value(Type,Max0,N,Val0,_), - (Val == Val0 -> - (Max0 == HMax -> - Max = Max0 - ; NNum is Num - Rank, - narrow_max_inv_pow(Type,Val,N,Max0,HMax,NNum,Max)) - ; % Val0 > Val - ((Num == 2, - Rank == 1) - -> - Max = LMax - ; % on ignore Max0 - get_previous_float(Type,Max0,NHMax), - narrow_max_inv_pow(Type,Val,N,LMax,NHMax,Rank,Max))). + Rank is Num div 2, + get_nth_float_from(Type,LMax,Rank,Max0), + power_real_value(Type,Max0,N,Val0,_), + (Val == Val0 -> + (Max0 == HMax -> + Max = Max0 + ; NNum is Num - Rank, + narrow_max_inv_pow(Type,Val,N,Max0,HMax,NNum,Max)) + ; % Val0 > Val + ((Num == 2, + Rank == 1) + -> + Max = LMax + ; % on ignore Max0 + get_previous_float(Type,Max0,NHMax), + narrow_max_inv_pow(Type,Val,N,LMax,NHMax,Rank,Max))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Src/COLIBRI/simplex_ocaml/Makefile b/Src/COLIBRI/simplex_ocaml/Makefile index 479e6675481d628d6690b17217fdb9decaf25cca..1df2bd3e37b54863dd174cbaf2652ec1f11fc38c 100644 --- a/Src/COLIBRI/simplex_ocaml/Makefile +++ b/Src/COLIBRI/simplex_ocaml/Makefile @@ -23,15 +23,15 @@ windows_32: docker: - sudo docker build - -t simplex_ocaml_build < Dockerfile - sudo docker run -v $(PWD)/../../..:/home/opam/build -w /home/opam/build/Src/COLIBRI/simplex_ocaml/ --env DUNE_BUILD_DIR=_build_docker simplex_ocaml_build opam exec -- make + docker build - -t simplex_ocaml_build < Dockerfile + docker run -v $(shell pwd)/../../..:/home/opam/build -w /home/opam/build/Src/COLIBRI/simplex_ocaml/ --env DUNE_BUILD_DIR=_build_docker simplex_ocaml_build opam exec -- make cp _build_docker/default/simplex_ocaml.pl .. cp _build_docker/default/simplex_ocaml_mod.so ../lib/v5/x86_64_linux/simplex_ocaml.so cp _build_docker/default/simplex_ocaml_mod_v7.so ../lib/v7/x86_64_linux/simplex_ocaml.so test_version: - sudo docker build - -t simplex_ocaml_build < Dockerfile - sudo docker run -v $(PWD)/../../..:/home/opam/build -w /home/opam/build/Src/COLIBRI/simplex_ocaml/ --env DUNE_BUILD_DIR=_build_docker simplex_ocaml_build opam exec -- make all_version + docker build - -t simplex_ocaml_build < Dockerfile + docker run -v $(shell pwd)/../../..:/home/opam/build -w /home/opam/build/Src/COLIBRI/simplex_ocaml/ --env DUNE_BUILD_DIR=_build_docker simplex_ocaml_build opam exec -- make all_version clean: dune clean diff --git a/Src/COLIBRI/simplex_ocaml/dolmen/src/loop/typer.ml b/Src/COLIBRI/simplex_ocaml/dolmen/src/loop/typer.ml index 4f25f387db7d72bc8661c8bbba6b55acef238be8..5662c39df41ea9f80957eb2accba971f7467e2f3 100644 --- a/Src/COLIBRI/simplex_ocaml/dolmen/src/loop/typer.ml +++ b/Src/COLIBRI/simplex_ocaml/dolmen/src/loop/typer.ml @@ -163,6 +163,7 @@ module Make(S : State_intf.Typer with type ty_state := ty_state) = struct | None -> Format.fprintf fmt "<location missing>" let report_warning (T.Warning (_env, _fragment, warn)) = + let aux: type a. a T.warn -> _ = fun warn -> match warn with | T.Unused_type_variable v -> Some (fun fmt () -> Format.fprintf fmt @@ -190,7 +191,19 @@ module Make(S : State_intf.Typer with type ty_state := ty_state) = struct ) | Smtlib2_Ints.Restriction msg + -> Some (fun fmt () -> + Format.fprintf fmt + "This is a non-linear expression according to the smtlib spec.%a" + pp_hint msg + ) + | Smtlib2_Reals.Restriction msg + -> Some (fun fmt () -> + Format.fprintf fmt + "This is a non-linear expression according to the smtlib spec.%a" + pp_hint msg + ) + | Smtlib2_Reals_Ints.Restriction msg -> Some (fun fmt () -> Format.fprintf fmt @@ -212,6 +225,8 @@ module Make(S : State_intf.Typer with type ty_state := ty_state) = struct Format.fprintf fmt "Unknown warning, please report upstream, ^^" ) + in + aux warn (* Report type errors *) (* ************************************************************************ *) @@ -389,8 +404,10 @@ module Make(S : State_intf.Typer with type ty_state := ty_state) = struct Format.fprintf fmt "Forbidden array sort.%a" pp_hint msg (* Smtlib Arithmetic errors *) - | Smtlib2_Ints.Forbidden msg - | Smtlib2_Reals.Forbidden msg + | Smtlib2_Ints.Forbidden msg -> + Format.fprintf fmt "Non-linear expressions are forbidden by the logic.%a" pp_hint msg + | Smtlib2_Reals.Forbidden msg -> + Format.fprintf fmt "Non-linear expressions are forbidden by the logic.%a" pp_hint msg | Smtlib2_Reals_Ints.Forbidden msg -> Format.fprintf fmt "Non-linear expressions are forbidden by the logic.%a" pp_hint msg | Smtlib2_Reals_Ints.Expected_arith_type ty -> @@ -490,12 +507,18 @@ module Make(S : State_intf.Typer with type ty_state := ty_state) = struct T._error env fragment (Warning_as_error w) | Smtlib2_Ints.Restriction _, fragment + when conf.strict_typing -> + T._error env fragment (Warning_as_error w) | Smtlib2_Reals.Restriction _, fragment + when conf.strict_typing -> + T._error env fragment (Warning_as_error w) | Smtlib2_Reals_Ints.Restriction _, fragment when conf.strict_typing -> T._error env fragment (Warning_as_error w) | Smtlib2_Float.Real_lit, fragment + when conf.strict_typing -> + T._error env fragment (Warning_as_error w) | Smtlib2_Float.Bitv_extended_lit, fragment when conf.strict_typing -> T._error env fragment (Warning_as_error w) diff --git a/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/transformer.ml b/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/transformer.ml index bb1e003d8d64f9d71b2f9fddfbc0b8c62b9efe80..5ca22e28de3f6d18c9593e3e6884843073191ebf 100644 --- a/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/transformer.ml +++ b/Src/COLIBRI/simplex_ocaml/dolmen/src/standard/transformer.ml @@ -65,27 +65,27 @@ module Make let s = state checkpoint in match token with | None -> - Format.dprintf "Syntax error@ with@ missing@ token@ read,@ \ - please@ report upstream,@ ^^" + (fun fmt -> Format.fprintf fmt "Syntax error@ with@ missing@ token@ read,@ \ + please@ report upstream,@ ^^") | Some tok -> let tok_descr = Lexer.descr tok in begin match String.trim (Ty.error s) with | exception Not_found -> - Format.dprintf "Missing@ syntax@ error@ message (state %d),@ \ - please@ report@ upstream,@ ^^" s + (fun fmt -> Format.fprintf fmt "Missing@ syntax@ error@ message (state %d),@ \ + please@ report@ upstream,@ ^^" s) | "<YOUR SYNTAX ERROR MESSAGE HERE>" -> - Format.dprintf "Syntax error (state %d)@ while reading %a." - s Tok.print tok_descr + (fun fmt -> Format.fprintf fmt "Syntax error (state %d)@ while reading %a." + s Tok.print tok_descr) | msg -> begin match Misc.split_on_char '\n' msg with | error_no :: production :: l -> let expected = String.concat " " l in - Format.dprintf - "@[<v>@[<hv>(%s) while parsing %s,@ read %a,@]@ @[<hov>but expected %a.@]@]" - error_no production Tok.print tok_descr - Format.pp_print_text expected + (fun fmt -> Format.fprintf fmt + "@[<v>@[<hv>(%s) while parsing %s,@ read %a,@]@ @[<hov>but expected %a.@]@]" + error_no production Tok.print tok_descr + Format.pp_print_text expected) | _ -> - Format.dprintf "Syntax error (state %d)." s + (fun fmt -> Format.fprintf fmt "Syntax error (state %d)." s) end end @@ -129,7 +129,7 @@ module Make raise (Loc.Lexing_error (pos, err)) | exception Parser.Error -> let pos = Loc.of_lexbuf lexbuf in - let msg = Format.dprintf "" in + let msg fmt = Format.fprintf fmt "" in let () = k_exn () in raise (Loc.Syntax_error (pos, msg)) | exception e -> @@ -158,7 +158,7 @@ module Make if not Ty.incremental then begin (* If incremental mode is not supported, raise an error rather than do weird things. *) - let msg = Format.dprintf ": @[<hov>%a@]" + let msg fmt = Format.fprintf fmt ": @[<hov>%a@]" Format.pp_print_text "Input format does not support incremental parsing" in raise (Loc.Syntax_error (Loc.of_lexbuf lexbuf, msg)) diff --git a/Src/COLIBRI/simplex_ocaml/dune-workspace b/Src/COLIBRI/simplex_ocaml/dune-workspace index bd3920b49243a21fcb605acde4ff15471ef16636..f9fec08bd8fa58334397ce0a608777a3439c6176 100644 --- a/Src/COLIBRI/simplex_ocaml/dune-workspace +++ b/Src/COLIBRI/simplex_ocaml/dune-workspace @@ -1,4 +1,4 @@ (lang dune 1.0) (context default) -;(context (opam (switch 4.07.0) (targets native))) +;(context (name docker) (opam (switch 4.07) (targets native))) diff --git a/Src/COLIBRI/simplex_ocaml/parser.ml b/Src/COLIBRI/simplex_ocaml/parser.ml index c9b0ef3ecea5aeb140c02020a4896ed68e85662d..d4066cac901c4d8e86fcbf6c4c6000c84da7025f 100644 --- a/Src/COLIBRI/simplex_ocaml/parser.ml +++ b/Src/COLIBRI/simplex_ocaml/parser.ml @@ -1,6 +1,6 @@ module State = struct - (* include (Dolmen_loop.State : ((module type of Dolmen_loop.State) with type t := Dolmen_loop.State.t)) *) - include Dolmen_loop.State + include (Dolmen_loop.State : ((module type of Dolmen_loop.State) with type t := Dolmen_loop.State.t)) + (* include Dolmen_loop.State *) type error_state = { warns : string list; error : [ `No_error | `Error of string ] @@ -225,7 +225,7 @@ module Colibri_Builtins = struct let len = List.length args in let app env ast targs instantiation_explicit = let l = List.length args in - if not (Int.equal l len) + if not (l = len) then Dolmen_loop.Typer.T._error env (Dolmen_loop.Typer.T.Ast ast) (Dolmen_loop.Typer.T.Bad_op_arity (name, [len], l))