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