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 sequence | |
8 | % avl, list for specific type of value sequence | |
9 | % any to generate either sequence or expression | |
10 | % size:Value to limit length of sequence | |
11 | ||
12 | generate(prob_ast_seq(Options),Value) :- | |
13 | is_list(Options) , | |
14 | generate(ground_type,Type) , | |
15 | generate(prob_ast_seq(Type,Options),Value). | |
16 | ||
17 | generate(prob_ast_seq(Type),Value) :- | |
18 | generate(prob_ast_seq(Type,[]),Value). | |
19 | ||
20 | generate(prob_ast_seq(Type,Options),Value) :- | |
21 | member(Type,[integer(_),boolean(_),string(_)]) , | |
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(sequence_extension(Set),seq(InnerType),[]) | |
28 | ; member(avl,Options) | |
29 | -> generate(prob_value_seq(Type,Options),Seq), | |
30 | Value = b(value(Seq),seq(InnerType),[]) | |
31 | ; member(list,Options) | |
32 | -> generate(prob_value_seq(Type,Options),Set), | |
33 | Value = b(value(Set),seq(InnerType),[]) | |
34 | ; % any value sequence | |
35 | member(value,Options) | |
36 | -> generate(prob_value_seq(Type,Options),Seq), | |
37 | Value = b(value(Seq),seq(InnerType),[]) | |
38 | ; % sequence or sequence expression | |
39 | member(any,Options) | |
40 | -> random_member(T,[seq,expr]) , | |
41 | (T = seq | |
42 | -> generate(ground_type,SeqType) , | |
43 | generate(prob_ast_seq(SeqType,[]),Value) | |
44 | ; generate(prob_ast_seq_expr([well-defined]),Value)) | |
45 | ; random_member(SeqOption,[[extension|Options],[value|Options]]) , | |
46 | generate(prob_ast_seq(Type,SeqOption),Value)). | |
47 | ||
48 | generate(prob_ast_seq(empty_sequence,_),b(sequence_extension([]),seq(empty),[])). | |
49 | ||
50 | % sequence of several sequences | |
51 | generate(prob_ast_seq(SeqTypeOptions,Options),b(Seq,seq(NType),[])) :- | |
52 | SeqTypeOptions =.. [seq,Type|InnerOptions] , | |
53 | (InnerOptions = [NOptions] | |
54 | -> true | |
55 | ; NOptions = InnerOptions) , | |
56 | (member(size:Size,Options) | |
57 | -> true | |
58 | ; random(1,10,Size)) , | |
59 | length(List,Size) , | |
60 | ( member(list,Options) | |
61 | -> maplist(generate(prob_value_seq(Type,NOptions)),List) , | |
62 | Seq = value(List) | |
63 | ; member(avl,Options) | |
64 | -> maplist(generate(prob_value_seq(Type,NOptions)),List) , | |
65 | findall(Key-true,member(Key,List),AVLList) , | |
66 | list_to_avl(AVLList,AVL) , | |
67 | Seq = value(avl_set(AVL)) | |
68 | ; maplist(generate(prob_ast_seq(Type,NOptions)),List) , | |
69 | Seq = sequence_extension(List)) , | |
70 | % remove options for node type | |
71 | inner_type(seq(Type),_,Outter) , | |
72 | length(Outter,L) , | |
73 | nth1(L,Outter,NewInner,NewOutter) , | |
74 | surround_type(NewInner,NewOutter,NType). | |
75 | ||
76 | shrink(prob_ast_seq,Value,Shrunken) :- | |
77 | shrink(prob_ast_seq_expr,Value,Shrunken). |