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