| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(lists),[nth1/4, is_list/1]). | |
| 5 | :- use_module(library(random)). | |
| 6 | ||
| 7 | generate(prob_ast_identifier(Type),b(identifier(Name),Type,[])) :- | |
| 8 | Type = record(_) , ! , | |
| 9 | generate(atom([size:5,alph]),Name). | |
| 10 | ||
| 11 | generate(prob_ast_identifier(Type),b(identifier(Name),NType,[])) :- | |
| 12 | generate(atom([size:5,alph]),Name) , | |
| 13 | inner_type(Type,Inner,Outter) , | |
| 14 | generate_id_or_ast_aux2(Type,Inner,Outter,NType). | |
| 15 | ||
| 16 | % either generate an identifier or an expression | |
| 17 | generate(id_or_ast(Type),Value) :- | |
| 18 | random(0,4,R) , | |
| 19 | R =< 2 , ! , | |
| 20 | % remove options for type of identifier | |
| 21 | % argument Type is like set(integer([small])) | |
| 22 | inner_type(Type,Inner,Outter) , | |
| 23 | generate_id_or_ast_aux2(Type,Inner,Outter,NType) , | |
| 24 | generate(prob_ast_identifier(NType),Value). | |
| 25 | ||
| 26 | generate(id_or_ast(Type),Value) :- | |
| 27 | inner_type(Type,Inner,Outter) , | |
| 28 | generate_id_or_ast_aux(Type,Inner,Outter,NType) , | |
| 29 | generate(NType,Value). | |
| 30 | ||
| 31 | % generate constraints for a list of identifier nodes | |
| 32 | generate(prob_ast_id_constraints(IDs),ConstraintPred) :- | |
| 33 | generate(prob_ast_id_constraints(IDs,[]),ConstraintPred). | |
| 34 | ||
| 35 | generate(prob_ast_id_constraints(b(Name,integer,Info),Options),ConstraintPred) :- | |
| 36 | generate(prob_ast_set_expr(interval,Options),Interval) , | |
| 37 | ConstraintPred = b(member(b(Name,integer,Info),Interval),pred,[]). | |
| 38 | ||
| 39 | generate(prob_ast_id_constraints(b(Name,set(InnerType),Info),_),ConstraintPred) :- | |
| 40 | random_member(Pred,[equal,less,greater,greater_equal,less_equal]) , | |
| 41 | generate(prob_ast_integer([between(1,10)]),Integer) , | |
| 42 | Identifier = b(Name,set(InnerType),Info) , | |
| 43 | NewNode =.. [Pred,b(card(Identifier),integer,[]),Integer] , | |
| 44 | get_type_constraint(Identifier,InnerType,TypeConstraint) , | |
| 45 | ConstraintPred = b(conjunct(b(NewNode,pred,[]),TypeConstraint),pred,[]). | |
| 46 | ||
| 47 | generate(prob_ast_id_constraints(b(Name,seq(InnerType),Info),_),ConstraintPred) :- | |
| 48 | random_member(Pred,[equal,less,greater,greater_equal,less_equal]) , | |
| 49 | generate(prob_ast_integer([between(1,10)]),Integer) , | |
| 50 | NewNode =.. [Pred,b(size(b(Name,seq(InnerType),Info)),integer,[]),Integer] , | |
| 51 | ConstraintPred = b(NewNode,pred,[]). | |
| 52 | ||
| 53 | generate(prob_ast_id_constraints([IDNode],Options),ConstraintPred) :- | |
| 54 | generate(prob_ast_id_constraints(IDNode,Options),ConstraintPred). | |
| 55 | ||
| 56 | generate(prob_ast_id_constraints([IDNode1,IDNode2|R],Options),ConstraintPred) :- | |
| 57 | generate(prob_ast_id_constraints(IDNode1,Options),Constraint1) , | |
| 58 | generate(prob_ast_id_constraints(IDNode2,Options),Constraint2) , | |
| 59 | generate_identifier_constraint_aux(Constraint1,Constraint2,R,Options,ConstraintPred). | |
| 60 | % skip boolean, string | |
| 61 | generate(prob_ast_id_constraints(_,_),b(truth,pred,[])). | |
| 62 | ||
| 63 | generate_identifier_constraint_aux(Constraint1,Constraint2,R,Options,ConstraintPred) :- | |
| 64 | R \= [] , | |
| 65 | generate(prob_ast_id_constraints(R,Options),RConstraints) , | |
| 66 | ConstraintPred = b(conjunct(b(conjunct(Constraint1,Constraint2),pred,[]),RConstraints),pred,[]). | |
| 67 | generate_identifier_constraint_aux(Constraint1,Constraint2,[],_,ConstraintPred) :- | |
| 68 | ConstraintPred = b(conjunct(Constraint1,Constraint2),pred,[]). | |
| 69 | ||
| 70 | get_type_constraint(Identifier,InnerType,TypeConstraint) :- | |
| 71 | get_set_type(InnerType,SetType) , ! , | |
| 72 | TypeConstraint = b(subset(Identifier,SetType),pred,[]). | |
| 73 | get_type_constraint(_,_,b(truth,pred,[])). | |
| 74 | ||
| 75 | get_set_type(InnerType,SetType) :- | |
| 76 | ground(InnerType) , ! , | |
| 77 | get_set_type_aux(0,InnerType,SetType). | |
| 78 | get_set_type(_,SetType) :- | |
| 79 | random(0,3,R) , | |
| 80 | get_set_type_aux(R,_,SetType). | |
| 81 | get_set_type_aux(0,integer,b(integer_set('INTEGER'),set(integer),[])). | |
| 82 | get_set_type_aux(1,integer,b(integer_set('NATURAL'),set(integer),[])). | |
| 83 | get_set_type_aux(2,integer,b(integer_set('NATURAL1'),set(integer),[])). | |
| 84 | get_set_type_aux_(set(Type),b(pow_subset(Node),set(Type),[])) :- | |
| 85 | get_set_type(Type,Node). | |
| 86 | ||
| 87 | generate_id_or_ast_aux(_,InnerType,OutterType,NType) :- | |
| 88 | \+is_list(InnerType) , | |
| 89 | NewInner =.. [InnerType,[]] , | |
| 90 | surround_type(NewInner,OutterType,Temp) , | |
| 91 | gen_type(Temp,ast,NType). | |
| 92 | generate_id_or_ast_aux(Type,InnerType,_,NType) :- | |
| 93 | is_list(InnerType) , | |
| 94 | gen_type(Type,ast,NType). | |
| 95 | ||
| 96 | generate_id_or_ast_aux2(_,InnerType,OutterType,NType) :- | |
| 97 | is_list(InnerType) , | |
| 98 | length(OutterType,L) , | |
| 99 | nth1(L,OutterType,NewInner,NewOutter) , | |
| 100 | surround_type(NewInner,NewOutter,NType) . | |
| 101 | generate_id_or_ast_aux2(_,InnerType,OutterType,NType) :- | |
| 102 | compound(InnerType) , | |
| 103 | % split inner to get rid of options | |
| 104 | InnerType =.. [NewInner|_] , | |
| 105 | surround_type(NewInner,OutterType,NType). | |
| 106 | generate_id_or_ast_aux2(Type,InnerType,_,Type) :- | |
| 107 | \+is_list(InnerType). | |
| 108 | ||
| 109 | % don't shrink identifier | |
| 110 | shrink(prob_ast_identifier(_),Value,Value). |