generate(prob_ast_identifier(Type),b(identifier(Name),Type,[])) :-
Type = record(_) , ! ,
generate(atom([size:5,alph]),Name).
generate(prob_ast_identifier(Type),b(identifier(Name),NType,[])) :-
generate(atom([size:5,alph]),Name) ,
inner_type(Type,Inner,Outter) ,
generate_id_or_ast_aux2(Type,Inner,Outter,NType).
generate(id_or_ast(Type),Value) :-
random(0,4,R) ,
R =< 2 , ! ,
% remove options for type of identifier
% argument Type is like set(integer([small]))
inner_type(Type,Inner,Outter) ,
generate_id_or_ast_aux2(Type,Inner,Outter,NType) ,
generate(prob_ast_identifier(NType),Value).
generate(id_or_ast(Type),Value) :-
inner_type(Type,Inner,Outter) ,
generate_id_or_ast_aux(Type,Inner,Outter,NType) ,
generate(NType,Value).
generate(prob_ast_id_constraints(IDs),ConstraintPred) :-
generate(prob_ast_id_constraints(IDs,[]),ConstraintPred).
generate(prob_ast_id_constraints(b(Name,integer,Info),Options),ConstraintPred) :-
generate(prob_ast_set_expr(interval,Options),Interval) ,
ConstraintPred = b(member(b(Name,integer,Info),Interval),pred,[]).
generate(prob_ast_id_constraints(b(Name,set(InnerType),Info),_),ConstraintPred) :-
random_member(Pred,[equal,less,greater,greater_equal,less_equal]) ,
generate(prob_ast_integer([between(1,10)]),Integer) ,
Identifier = b(Name,set(InnerType),Info) ,
NewNode =.. [Pred,b(card(Identifier),integer,[]),Integer] ,
get_type_constraint(Identifier,InnerType,TypeConstraint) ,
ConstraintPred = b(conjunct(b(NewNode,pred,[]),TypeConstraint),pred,[]).
generate(prob_ast_id_constraints(b(Name,seq(InnerType),Info),_),ConstraintPred) :-
random_member(Pred,[equal,less,greater,greater_equal,less_equal]) ,
generate(prob_ast_integer([between(1,10)]),Integer) ,
NewNode =.. [Pred,b(size(b(Name,seq(InnerType),Info)),integer,[]),Integer] ,
ConstraintPred = b(NewNode,pred,[]).
generate(prob_ast_id_constraints([IDNode],Options),ConstraintPred) :-
generate(prob_ast_id_constraints(IDNode,Options),ConstraintPred).
generate(prob_ast_id_constraints([IDNode1,IDNode2|R],Options),ConstraintPred) :-
generate(prob_ast_id_constraints(IDNode1,Options),Constraint1) ,
generate(prob_ast_id_constraints(IDNode2,Options),Constraint2) ,
generate_identifier_constraint_aux(Constraint1,Constraint2,R,Options,ConstraintPred).
generate(prob_ast_id_constraints(_,_),b(truth,pred,[])).