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). |