generate(prob_ast_pred,Value) :-
generate(prob_ast_pred([]),Value).
generate(prob_ast_conj,Value) :-
generate(prob_ast_pred([]),Value).
generate(prob_ast_disj(Options),Gen) :-
( member(disjuncts:AmountOfConj, Options)
-> true
; random(2, 20, AmountOfConj)
),
generate_conj_or_disj(disjunct, AmountOfConj, Options, Gen).
generate(prob_ast_conj(Options),Gen) :-
( member(conjuncts:AmountOfConj, Options)
-> true
; random(2, 20, AmountOfConj)
),
generate_conj_or_disj(conjunct, AmountOfConj, Options, Gen).
generate(prob_ast_pred(Options),Value) :-
member(preds(PredList), Options),
PredList \== [],
!,
generate_from_predlist(PredList, Options, Value).
generate(prob_ast_pred(Options),Value) :-
PredList = [conjunct,disjunct,implication,equivalence,negation,finite,
equal,not_equal,less_equal,less,greater_equal,greater,member,
not_member,subset,not_subset,subset_strict,not_subset_strict] , %truth,falsity
generate_from_predlist(PredList, Options, Value).
generate(prob_ast_pred(truth,_),b(truth,pred,[])).
generate(prob_ast_pred(falsity,_),b(falsity,pred,[])).
generate(prob_ast_pred(finite,Options),b(finite(Set),pred,[])) :-
generate(prob_ast_set(_,[any|Options]),Set).
generate(prob_ast_pred(negation,Options),b(negation(Value),pred,[])) :-
generate(prob_ast_pred(Options),Value).
generate(prob_ast_pred(Pred,Options),b(NewPred,pred,[])) :-
member(Pred,[conjunct,disjunct,implication,equivalence]) ,
generate(prob_ast_pred(Options),Value1) ,
generate(prob_ast_pred(Options),Value2) ,
NewPred =.. [Pred,Value1,Value2].
generate(prob_ast_pred(Pred,Options),b(NewPred,pred,[])) :-
member(Pred,[member,not_member]) ,
generate(ground_type(Options),Temp) ,
Temp =.. [TypeNoOpt|_] ,
Type =.. [TypeNoOpt,Options] ,
gen_type(Type,ast,NType) ,
generate(NType,Value) ,
generate(prob_ast_set(Type,Options),Set) ,
NewPred =.. [Pred,Value,Set].
generate(prob_ast_pred(Pred,Options),b(NewPred,pred,[])) :-
member(Pred,[subset,not_subset,subset_strict,not_subset_strict]) ,
generate(prob_ast_set_expr(Options),Value1) ,
Value1 = b(_,set(Type),_),
(Type = empty
-> generate(ground_type(Options),NType)
; inner_type(Type,Inner,Outter) ,
Temp =.. [Inner,Options] ,
surround_type(Temp,Outter,NType)) ,
generate(prob_ast_set(NType,Options),Value2) ,
NewPred =.. [Pred,Value1,Value2].
generate(prob_ast_pred(Pred,Options),b(NewPred,pred,[])) :-
member(Pred,[equal,not_equal]) ,
member(record,Options) , ! ,
generate(ground_type(Options),RecordType) ,
generate(prob_ast_record(RecordType,[list:2]),[Value1,Value2]) ,
NewPred =.. [equal,Value1,Value2].
generate(prob_ast_pred(Pred,Options),b(NewPred,pred,[])) :-
member(Pred,[equal,not_equal]) ,
% generate any value for equal, not_equal
% make sure both values are of the same type
(member(equal_seq,Options) ->
generate(prob_ast_seq_expr(Options),Value1);
generate(prob_ast_expr(Options),Value1)),
Value1 = b(_,Type,_) ,
inner_type(Type,Inner,Outter) ,
% if empty structure then just use an integer
(Inner = empty -> NInner = integer ; NInner = Inner) ,
Temp =.. [NInner,Options] ,
surround_type(Temp,Outter,TempType) ,
gen_type(TempType,ast,TType) ,
add_options(TType, Options, NType),
generate(NType,Value2) ,
Value1 = b(_,ActualType1,_),
Value2 = b(_,ActualType2,_),
ActualType1 == ActualType2,
NewPred =.. [Pred,Value1,Value2].
generate(prob_ast_pred(Pred,Options),b(NewPred,pred,[])) :-
member(Pred,[greater,greater_equal,less,less_equal]) ,
generate(prob_ast_int_expr([small|Options]),Value1) ,
generate(prob_ast_int_expr([small|Options]),Value2) ,
NewPred =.. [Pred,Value1,Value2].
generate(prob_ast_pred(exists,Options),b(exists(ListOfIDASTNodes,NewPredicate),pred,Info)) :-
(member(id,Options)
-> generate(prob_ast_pred(Options),Predicate)
; generate(prob_ast_pred([id|Options]),Predicate)) ,
set_wd_option(Options, WD),
% get a list of all used identifier nodes
b_ast_cleanup:find_identifier_uses(Predicate,[],TempListOfIDNodes),
% if there are no identifier just insert one instead of backtracking
(TempListOfIDNodes = []
-> insert_identifier_to_ast(WD,Predicate,2,NewPredicate),
b_ast_cleanup:find_identifier_uses(NewPredicate,[],ListOfIDNodes)
; ListOfIDNodes = TempListOfIDNodes ,
NewPredicate = Predicate) ,
b_ast_cleanup:find_typed_identifier_uses(NewPredicate,[],ListOfIDASTNodes),
Info = [used_ids(ListOfIDNodes)].
generate(prob_ast_pred(forall,Options),b(forall(ListOfIDASTNodes,IDConstraints,NewPredicate),pred,Info)) :-
(member(id,Options)
-> generate(prob_ast_pred(Options),Predicate)
; generate(prob_ast_pred([id|Options]),Predicate)) ,
set_wd_option(Options, WD),
% get a list of all used identifier nodes
b_ast_cleanup:find_identifier_uses(Predicate,[],TempListOfIDNodes),
(TempListOfIDNodes = []
-> insert_identifier_to_ast(WD,Predicate,2,NewPredicate),
b_ast_cleanup:find_identifier_uses(NewPredicate,[],ListOfIDNodes)
; TempListOfIDNodes = ListOfIDNodes ,
NewPredicate = Predicate) ,
% set constraints for every identifier (except of boolean, string)
% defined in prob_ast_identifier.pl
generate(prob_ast_id_constraints(ListOfIDNodes),IDConstraints),
b_ast_cleanup:find_typed_identifier_uses(NewPredicate,[],ListOfIDASTNodes),
Info = [used_ids(ListOfIDNodes)].