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