int(b(Expression,_,_),Value) :-
Expression =.. [Type,_,_] ,
member(Type,[add,minus,multiplication,div,power_of,modulo]) ,
% catch too big numbers or evaluation errors
(catch(eval(b(Expression,_,_),Value), E, (fuzzing:interrupt_exception(E) -> throw(E) ; fail))
-> true
; int(b(max_int,_,_),Value)).
int(b(max_int,_,_),3).
int(b(min_int,_,_),-1).
int(b(integer(Value),_,_),Value).
int(int(Value),Value).
int(b(card(Set),_,_),Value) :-
sint(Set,ValueSet) ,
length(ValueSet,Value).
int(b(unary_minus(Expr),_,_),Value) :-
int(Expr,Temp) ,
Value is -(Temp).
int(b(max(b(set_extension([]),set(_),_)),integer,_),0).
int(b(min(b(set_extension([]),set(_),_)),integer,_),0).
int(b(max(b(set_extension(ProBValueList),set(integer),_)),integer,_),Max) :-
maplist(ast_to_value,ProBValueList,List) ,
max_member(Max,List).
int(b(min(b(set_extension(ProBValueList),set(integer),_)),integer,_),Min) :-
maplist(ast_to_value,ProBValueList,List) ,
min_member(Min,List).
int(b(max(b(value([]),set(integer),[])),integer,[]),0).
int(b(min(b(value([]),set(integer),[])),integer,[]),0).
int(b(max(b(value(avl_set(empty)),set(integer),[])),integer,[]),0).
int(b(min(b(value(avl_set(empty)),set(integer),[])),integer,[]),0).
int(b(max(b(value(Set),set(integer),_)),integer,_),Max) :-
is_list(Set) ,
max_member(MaxMem,Set) ,
MaxMem = int(Max).
int(b(min(b(value(Set),set(integer),_)),integer,_),Min) :-
is_list(Set) ,
min_member(MinMem,Set) ,
MinMem = int(Min).
int(b(max(b(value(avl_set(Set)),set(integer),_)),integer,_),Max) :-
avl_to_list(Set,Temp) ,
findall(Key,member(Key-_,Temp),List) ,
max_member(MaxMem,List) ,
MaxMem = int(Max).
int(b(min(b(value(avl_set(Set)),set(integer),_)),integer,_),Min) :-
avl_to_list(Set,Temp) ,
findall(Key,member(Key-_,Temp),List) ,
min_member(MinMem,List) ,
MinMem = int(Min).