| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(random),[random_member/2]). | |
| 5 | ||
| 6 | % list of options: | |
| 7 | % extension, value (i.e. random value set) to generate a specific type of ast set | |
| 8 | % avl, list for specific type of value set, none for any set | |
| 9 | % any to generate either set or expression | |
| 10 | % size:Value to limit length of set | |
| 11 | ||
| 12 | generate(prob_ast_set(Options),Value) :- | |
| 13 | is_list(Options) , | |
| 14 | generate(ground_type,Type) , | |
| 15 | generate(prob_ast_set(Type,Options),Value). | |
| 16 | ||
| 17 | generate(prob_ast_set(Type),Value) :- | |
| 18 | generate(prob_ast_set(Type,[]),Value). | |
| 19 | ||
| 20 | generate(prob_ast_set(Type,Options),Value) :- | |
| 21 | member(Type,[integer(_),boolean(_),string(_),couple(_,_)]) , | |
| 22 | Type =.. [InnerType,_] , ! , | |
| 23 | ( member(extension,Options) | |
| 24 | -> delete(Options,extension,NOptions) , | |
| 25 | gen_type(Type,ast,NType) , | |
| 26 | generate(list(NType,NOptions),Set), | |
| 27 | Value = b(set_extension(Set),set(InnerType),[]) | |
| 28 | ; (member(avl,Options) ; member(list,Options) ; member(value,Options)) | |
| 29 | -> generate(prob_value_set(Type,Options),Set), | |
| 30 | Value = b(value(Set),set(InnerType),[]) | |
| 31 | ; % set or set expression | |
| 32 | member(any,Options) -> | |
| 33 | delete(Options,any,NOptions) , | |
| 34 | random_member(T,[set,expr]) , | |
| 35 | (T = set | |
| 36 | -> generate(ground_type,SetType) , | |
| 37 | generate(prob_ast_set(SetType,NOptions),Value) | |
| 38 | ; generate(prob_ast_set_expr(NOptions),Value)) | |
| 39 | ; random_member(SetOption,[[extension|Options],[value|Options]]) , | |
| 40 | generate(prob_ast_set(Type,SetOption),Value)). | |
| 41 | ||
| 42 | generate(prob_ast_set(empty([]),_),b(set_extension([]),set(InnerType),[])) :- | |
| 43 | generate(prob_type, InnerType). | |
| 44 | ||
| 45 | % set of several sets | |
| 46 | generate(prob_ast_set(SetTypeOptions,Options),b(Set,set(NType),[])) :- | |
| 47 | SetTypeOptions =.. [set,Type|InnerOptions] , | |
| 48 | (InnerOptions = [NOptions] | |
| 49 | -> true | |
| 50 | ; NOptions = InnerOptions) , | |
| 51 | (member(size:Size,Options) | |
| 52 | -> true | |
| 53 | ; random(1,10,Size)) , | |
| 54 | length(List,Size) , | |
| 55 | ( member(list,Options) | |
| 56 | -> maplist(generate(prob_value_set(Type,NOptions)),List) , | |
| 57 | Set = value(List) | |
| 58 | ; member(avl,Options) | |
| 59 | -> maplist(generate(prob_value_set(Type,NOptions)),List) , | |
| 60 | findall(Key-true,member(Key,List),AVLList) , | |
| 61 | list_to_avl(AVLList,AVL) , | |
| 62 | AVL \= empty, | |
| 63 | Set = value(avl_set(AVL)) | |
| 64 | ; maplist(generate(prob_ast_set(Type,NOptions)),List) , | |
| 65 | Set = set_extension(List)) , | |
| 66 | % remove options for node type | |
| 67 | inner_type(set(Type),_,Outter) , | |
| 68 | length(Outter,L) , | |
| 69 | nth1(L,Outter,NewInner,NewOutter) , | |
| 70 | surround_type(NewInner,NewOutter,NType). | |
| 71 | ||
| 72 | shrink(Type,Value,Shrunken) :- | |
| 73 | Type =.. [prob_ast_set|_] , | |
| 74 | minimize_set_expr(Value,Shrunken). |