| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | generate(prob_ast_sat(Options),ResultPred) :- | |
| 5 | generate(prob_ast_pred(Options),Pred) , | |
| 6 | get_id_amount_from_options(Options,AmountOfIDs) , | |
| 7 | adapt_id_amount(AmountOfIDs,Amount) , | |
| 8 | set_wd_option(Options, WD), | |
| 9 | insert_identifier_to_ast(WD,Pred,Amount,NewPred) , % defined in 'snippets.pl' | |
| 10 | set_identifier_constraints(NewPred,Options,ConstrainedPred) , | |
| 11 | extend_predicate_if_necessary(ConstrainedPred,AmountOfIDs,Options,ResultPred). | |
| 12 | ||
| 13 | set_identifier_constraints(Pred,Options,b(conjunct(Pred,Constraints),pred,[])) :- | |
| 14 | bsyntaxtree:find_typed_identifier_uses(Pred,[],ListOfIdentifier) , | |
| 15 | generate(prob_ast_id_constraints(ListOfIdentifier,Options),Constraints). | |
| 16 | ||
| 17 | get_id_amount_from_options(Options,AmountOfIDs) :- | |
| 18 | get_min_max_and_type(Options,(Min,Max),interval) , ! , | |
| 19 | NMax is Max + 1 , | |
| 20 | random(Min,NMax,AmountOfIDs). | |
| 21 | get_id_amount_from_options(Options,AmountOfIDs) :- | |
| 22 | get_min_max_and_type(Options,(Min,_),min) , ! , | |
| 23 | random(0,10,R) , | |
| 24 | AmountOfIDs is Min + R. | |
| 25 | get_id_amount_from_options(Options,AmountOfIDs) :- | |
| 26 | get_min_max_and_type(Options,(_,Max),max) , ! , | |
| 27 | random(0,Max,AmountOfIDs). | |
| 28 | get_id_amount_from_options(_,AmountOfIDs) :- | |
| 29 | random(0,10,AmountOfIDs). | |
| 30 | ||
| 31 | order_min_max(Min,Max,Min,Max) :- | |
| 32 | Min =< Max. | |
| 33 | order_min_max(Min,Max,Max,Min) :- | |
| 34 | Min > Max. | |
| 35 | ||
| 36 | get_min_max_and_type(Options,(NMin,NMax),interval) :- | |
| 37 | subset([minID:Min,maxID:Max],Options) , | |
| 38 | order_min_max(Min,Max,NMin,NMax). | |
| 39 | get_min_max_and_type(Options,(Min,_),min) :- | |
| 40 | member(minID:Min,Options). | |
| 41 | get_min_max_and_type(Options,(_,Max),max) :- | |
| 42 | member(maxID:Max,Options). | |
| 43 | ||
| 44 | % generate new predicate to conjunct with the current one if the minimum | |
| 45 | % amount of identifiers is not reached | |
| 46 | extend_predicate_if_necessary(Pred,AmountOfIDs,Options,ResultPred) :- | |
| 47 | bsyntaxtree:find_identifier_uses(Pred,[],IDs) , | |
| 48 | length(IDs,CurAmountOfIDs) , | |
| 49 | CurAmountOfIDs < AmountOfIDs , ! , | |
| 50 | MissingAmount is AmountOfIDs - CurAmountOfIDs , | |
| 51 | extend_predicate_if_necessary_aux(Pred,AmountOfIDs,MissingAmount,Options,ResultPred). | |
| 52 | extend_predicate_if_necessary(Pred,_,_,Pred). | |
| 53 | ||
| 54 | extend_predicate_if_necessary_aux(Pred,_,0,_,Pred). | |
| 55 | extend_predicate_if_necessary_aux(Pred,AmountOfIDs,MissingAmount,Options,ResultPred) :- | |
| 56 | generate(prob_ast_pred(Options),NewPred) , | |
| 57 | adapt_id_amount(MissingAmount,Amount) , | |
| 58 | set_wd_option(Options, WD), | |
| 59 | insert_identifier_to_ast(WD,NewPred,Amount,NewPredWithIDs) , ! , | |
| 60 | extend_predicate_if_necessary(b(conjunct(Pred,NewPredWithIDs),pred,[]),AmountOfIDs,Options,ResultPred). | |
| 61 | ||
| 62 | adapt_id_amount(Amount,2) :- | |
| 63 | Amount > 2. | |
| 64 | adapt_id_amount(Amount,Amount). | |
| 65 | ||
| 66 | shrink(Type,Value,Value) :- | |
| 67 | Type =.. [prob_ast_sat|_]. |