| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(random),[random_member/2]). | |
| 5 | ||
| 6 | generate(prob_ast_set_expr,Value) :- | |
| 7 | generate(prob_ast_set_expr([]),Value). | |
| 8 | ||
| 9 | % Options: | |
| 10 | % id to enable random generation of identifier | |
| 11 | % all expressions are well-defined unless option not-well-defined-values is given | |
| 12 | ||
| 13 | % Expr :: set(_) | |
| 14 | generate(prob_ast_set_expr(Options),Value) :- | |
| 15 | is_list(Options) , | |
| 16 | random_member(Expr,[interval,union,intersection,set_subtraction,bool_set,string_set, | |
| 17 | general_union,general_intersection,empty_set]) , | |
| 18 | generate(prob_ast_set_expr(Expr,Options),Value). | |
| 19 | ||
| 20 | generate(prob_ast_set_expr(interval,Options),b(Interval,set(integer),[])) :- | |
| 21 | ( member(posInterval,Options) | |
| 22 | -> generate(prob_ast_integer([between(0,15)|Options]),Node1) | |
| 23 | ; member(negInterval,Options) | |
| 24 | -> generate(prob_ast_integer([between(-15,0)|Options]),Node1) | |
| 25 | ; generate(prob_ast_integer([between(-15,15)|Options]),Node1)) , | |
| 26 | Node1 = b(integer(Value1),_,_) , | |
| 27 | (member(maxInterval:S,Options) | |
| 28 | -> % interval with given maximum size | |
| 29 | random(0,S,R) , | |
| 30 | Value2 is Value1 + R , | |
| 31 | Node2 = b(integer(Value2),integer,[]) | |
| 32 | ; generate(prob_ast_integer([small|Options]),Node2) , | |
| 33 | Node2 = b(integer(Value2),_,_)) , | |
| 34 | % get value from ast node | |
| 35 | (Value1 =< Value2 | |
| 36 | -> Interval = interval(Node1,Node2) | |
| 37 | ; Interval = interval(Node2,Node1)). | |
| 38 | ||
| 39 | generate(prob_ast_set_expr(empty_set,_),b(set_extension([]),set(InnerType),[])) :- | |
| 40 | generate(prob_type, InnerType). | |
| 41 | ||
| 42 | generate(prob_ast_set_expr(bool_set,Options),Value) :- | |
| 43 | (member(id,Options) | |
| 44 | -> generate(id_or_ast(set(boolean([]))),Value) | |
| 45 | ; generate(prob_ast_set(boolean([]),Options),Value)). | |
| 46 | ||
| 47 | generate(prob_ast_set_expr(string_set,Options),Value) :- | |
| 48 | (member(id,Options) | |
| 49 | -> generate(id_or_ast(set(string([]))),Value) | |
| 50 | ; generate(prob_ast_set(string([]),Options),Value)). | |
| 51 | ||
| 52 | generate(prob_ast_set_expr(Expr,Options),b(NewPred,set(Type),[])) :- | |
| 53 | member(Expr,[union,intersection,set_subtraction]) , | |
| 54 | generate(prob_ast_set(Options),Set1) , | |
| 55 | Set1 = b(_,set(Type),_) , | |
| 56 | inner_type(Type,Inner,Outter) , | |
| 57 | NewInner =.. [Inner,[]] , % no options | |
| 58 | surround_type(NewInner,Outter,NType) , ! , | |
| 59 | (member(id,Options) , Type \= empty -> | |
| 60 | generate(id_or_ast(set(NType)),Set2) | |
| 61 | ; generate(prob_ast_set(NType,Options),Set2)) , | |
| 62 | NewPred =.. [Expr,Set1,Set2]. | |
| 63 | ||
| 64 | generate(prob_ast_set_expr(Expr,Options),b(NewPred,Type,[])) :- | |
| 65 | member(Expr,[general_union,general_intersection]) , | |
| 66 | generate(ground_type,SetType) , | |
| 67 | (member(id,Options) | |
| 68 | -> generate(id_or_ast(set(SetType)),Set) | |
| 69 | ; generate(prob_ast_set(SetType,Options),Set)) , | |
| 70 | Set = b(_,Type,_) , | |
| 71 | SetOfSet = b(set_extension([Set]),set(Type),[]) , | |
| 72 | NewPred =.. [Expr,SetOfSet]. | |
| 73 | ||
| 74 | shrink(Type,Expression,Shrunken) :- | |
| 75 | Type =.. [prob_ast_set_expr|_] , | |
| 76 | minimize_set_expr(Expression,Shrunken). | |
| 77 | ||
| 78 | shrink(Type,Value,Shrunken) :- | |
| 79 | Type =.. [prob_ast_set_expr|_] , | |
| 80 | % defined in prob_ast_minimize_int_expr.pl | |
| 81 | get_inner_expr(Value,Shrunken). |