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