| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(random),[random_member/2]). | |
| 5 | ||
| 6 | generate(prob_ast_seq_expr,Value) :- | |
| 7 | generate(prob_ast_seq_expr([]),Value). | |
| 8 | ||
| 9 | % Options: | |
| 10 | % id to enable random generation of identifier | |
| 11 | % not-well-defined | |
| 12 | ||
| 13 | % Expr :: seq(_) | |
| 14 | generate(prob_ast_seq_expr(Options),Value) :- | |
| 15 | random_member(Expr,[empty_sequence,front,tail,rev,concat,insert_front,insert_tail, | |
| 16 | restrict_front,restrict_tail,general_concat]) , | |
| 17 | generate(prob_ast_seq_expr(Expr,Options),Value). | |
| 18 | ||
| 19 | generate(prob_ast_seq_expr(empty_sequence,_),b(sequence_extension([]),seq(empty),[])). | |
| 20 | ||
| 21 | generate(prob_ast_seq_expr(general_concat,Options),b(general_concat(SeqOfSeq),SeqType,[])) :- | |
| 22 | generate(ground_type,Ground) , | |
| 23 | generate(prob_ast_seq(seq(Ground),Options),SeqOfSeq) , | |
| 24 | SeqOfSeq = b(_,seq(SeqType),_). | |
| 25 | ||
| 26 | generate(prob_ast_seq_expr(Type,Options),b(NewExpr,SeqType,[])) :- | |
| 27 | member(Type,[front,tail,rev]) , | |
| 28 | generate(ground_type,InnerType) , | |
| 29 | (member(id,Options) | |
| 30 | -> generate(id_or_ast(seq(InnerType)),Seq) | |
| 31 | ; generate(prob_ast_seq(InnerType,Options),Seq)) , | |
| 32 | Seq = b(_,SeqType,_) , | |
| 33 | NewExpr =.. [Type,Seq]. | |
| 34 | ||
| 35 | % not well defined when trying to restrict front by | |
| 36 | % more values than the sequence contains | |
| 37 | generate(prob_ast_seq_expr(Type,Options),b(NewExpr,SeqType,[])) :- | |
| 38 | member(not-well-defined,Options) , | |
| 39 | member(Type,[restrict_front,restrict_tail]) , | |
| 40 | generate(prob_ast_seq_expr(Options),Seq) , | |
| 41 | Seq = b(_,SeqType,_) , | |
| 42 | generate(prob_ast_integer([small,positive]),Value) , | |
| 43 | NewExpr =.. [Type,Seq,Value]. | |
| 44 | % generate integer in the range of the sequence size | |
| 45 | generate(prob_ast_seq_expr(Type,Options),b(NewExpr,SeqType,[])) :- | |
| 46 | member(Type,[restrict_front,restrict_tail]) , | |
| 47 | generate(ground_type,Ground) , | |
| 48 | generate(prob_ast_seq(Ground,[extension|Options]),Seq) , | |
| 49 | Seq = b(sequence_extension(Set),SeqType,_) , | |
| 50 | length(Set,Length) , | |
| 51 | generate(prob_ast_integer([small,between(0,Length)]),Value) , | |
| 52 | NewExpr =.. [Type,Seq,Value]. | |
| 53 | ||
| 54 | generate(prob_ast_seq_expr(concat,Options),b(concat(Seq1,Seq2),seq(Type),[])) :- | |
| 55 | generate(prob_ast_seq_expr(Options),Seq1) , | |
| 56 | Seq1 = b(_,seq(Type),_) , | |
| 57 | (Type = empty | |
| 58 | -> Seq2 = b(sequence_extension([]),seq(empty),[]) | |
| 59 | ; inner_type(Type,Inner,Outter) , | |
| 60 | NewInner =.. [Inner,[]] , % no options | |
| 61 | surround_type(NewInner,Outter,NType) , | |
| 62 | (member(id,Options) , Type \= empty | |
| 63 | -> generate(id_or_ast(seq(NType)),Seq2) | |
| 64 | ; generate(prob_ast_seq(NType,Options),Seq2))). | |
| 65 | ||
| 66 | generate(prob_ast_seq_expr(insert_front,Options),b(insert_front(Value,ValueSeq),seq(SeqType),[])) :- | |
| 67 | generate(prob_ast_seq_expr(Options),ValueSeq) , | |
| 68 | ValueSeq = b(_,seq(Type),_) , | |
| 69 | (Type = empty | |
| 70 | -> generate(ground_type,NType) , | |
| 71 | NType =.. [SeqType,_] | |
| 72 | ; inner_type(Type,Inner,Outter) , | |
| 73 | NewInner =.. [Inner,[]] , | |
| 74 | surround_type(NewInner,Outter,NType) , | |
| 75 | Type = SeqType) , | |
| 76 | (member(id,Options) | |
| 77 | -> generate(id_or_ast(seq(NType)),Value) | |
| 78 | ; gen_type(NType,ast,GenType) , | |
| 79 | generate(GenType,Value)). | |
| 80 | ||
| 81 | generate(prob_ast_seq_expr(insert_tail,Options),b(insert_tail(ValueSeq,Value),seq(SeqType),[])) :- | |
| 82 | generate(prob_ast_seq_expr(Options),ValueSeq) , | |
| 83 | ValueSeq = b(_,seq(Type),_) , | |
| 84 | (Type = empty | |
| 85 | -> generate(ground_type,NType) , | |
| 86 | NType =.. [SeqType,_] | |
| 87 | ; inner_type(Type,Inner,Outter) , | |
| 88 | NewInner =.. [Inner,[]] , | |
| 89 | surround_type(NewInner,Outter,NType) , | |
| 90 | Type = SeqType) , | |
| 91 | (member(id,Options) | |
| 92 | -> generate(id_or_ast(seq(NType)),Value) | |
| 93 | ; gen_type(NType,ast,GenType) , | |
| 94 | generate(GenType,Value)). | |
| 95 | ||
| 96 | shrink(Type,Value,Shrunken) :- | |
| 97 | Type =.. [prob_ast_seq_expr|_] , | |
| 98 | minimize_seq_expr(Value,Shrunken). | |
| 99 | ||
| 100 | shrink(Type,Value,Shrunken) :- | |
| 101 | Type =.. [prob_ast_seq_expr|_] , | |
| 102 | % defined in prob_ast_minimize_int_expr.pl | |
| 103 | get_inner_expr(Value,Shrunken). |