generate(prob_ast_seq_expr,Value) :-
generate(prob_ast_seq_expr([]),Value).
generate(prob_ast_seq_expr(Options),Value) :-
random_member(Expr,[empty_sequence,front,tail,rev,concat,insert_front,insert_tail,
restrict_front,restrict_tail,general_concat]) ,
( member(nonEmpty,Options)
-> Expr \== empty_sequence
; true
) ,
generate(prob_ast_seq_expr(Expr,Options),Value).
generate(prob_ast_seq_expr(empty_sequence,Options),Out) :-
( member(nonEmpty,Options)
-> Out = b(sequence_extension([b(integer(1),integer,[])]),seq(integer),[])
; Out = b(sequence_extension([]),seq(integer),[])
).
generate(prob_ast_seq_expr(general_concat,Options),b(general_concat(SeqOfSeq),SeqType,[])) :-
generate(ground_type(Options),Ground) ,
generate(prob_ast_seq(seq(Ground,Options),Options),SeqOfSeq) ,
SeqOfSeq = b(_,seq(SeqType),_).
generate(prob_ast_seq_expr(Type,Options),b(NewExpr,SeqType,[])) :-
member(Type,[front,tail,rev]) ,
generate(ground_type(Options),InnerType) ,
( member(not-well-defined,Options)
-> NOptions = Options
; NOptions = [nonEmpty|Options]
),
( (member(id,Options), \+ member(not-well-defined,Options))
-> generate(id_or_ast(seq(InnerType)),Seq)
; generate(prob_ast_seq(InnerType,NOptions),Seq)) ,
functor(InnerType, InnerTypeB, _),
SeqType = seq(InnerTypeB),
Seq = b(_,SeqType,_) ,
!,
NewExpr =.. [Type,Seq].
generate(prob_ast_seq_expr(Type,Options),b(NewExpr,SeqType,[])) :-
member(not-well-defined,Options) ,
member(Type,[restrict_front,restrict_tail]) ,
!,
generate(prob_ast_seq_expr(Options),Seq) ,
Seq = b(_,SeqType,_) ,
generate(prob_ast_integer([small,positive]),Value) ,
!,
NewExpr =.. [Type,Seq,Value].
generate(prob_ast_seq_expr(Type,Options),b(NewExpr,SeqType,[])) :-
member(Type,[restrict_front,restrict_tail]) ,
generate(ground_type(Options),Ground) ,
generate(prob_ast_seq(Ground,[extension|Options]),Seq) ,
Seq = b(sequence_extension(Set),SeqType,_) ,
length(Set,Length) ,
generate(prob_ast_integer([small,between(0,Length)]),Value) ,
!,
NewExpr =.. [Type,Seq,Value].
generate(prob_ast_seq_expr(concat,Options),b(concat(Seq1,Seq2),seq(Type),[])) :-
generate(prob_ast_seq_expr(Options),Seq1) ,
Seq1 = b(_,seq(Type),_) ,
( (Type = empty, \+ member(nonEmpty,Options))
-> Seq2 = b(sequence_extension([]),seq(integer),[])
; inner_type(Type,Inner,Outter) ,
NewInner =.. [Inner,Options] ,
surround_type(NewInner,Outter,TType) ,
add_options(TType, Options, NType),
( (member(id,Options), (Type \= empty; member(nonEmpty,Options)))
-> generate(id_or_ast(seq(NType)),Seq2)
; generate(prob_ast_seq(NType,Options),Seq2)
)
).
generate(prob_ast_seq_expr(insert_front,Options),Gen) :-
generate(prob_ast_seq_expr(Options),ValueSeq) ,
ValueSeq = b(_,seq(Type),_) ,
( Type = empty
-> generate(ground_type(Options),NType) ,
NType =.. [SeqType,_]
; inner_type(Type,Inner,Outter) ,
NewInner =.. [Inner,Options] ,
surround_type(NewInner,Outter,TType) ,
add_options(TType, Options, NType),
Type = SeqType
) ,
( member(id,Options)
-> generate(id_or_ast(NType),Value)
; gen_type(NType,ast,GenType) ,
generate(GenType,Value)
),
!,
Gen = b(insert_front(Value,ValueSeq),seq(SeqType),[]).
generate(prob_ast_seq_expr(insert_tail,Options),Gen) :-
generate(prob_ast_seq_expr(Options),ValueSeq) ,
ValueSeq = b(_,seq(Type),_) ,
( Type = empty
-> generate(ground_type(Options),NType) ,
NType =.. [SeqType,_]
; inner_type(Type,Inner,Outter) ,
NewInner =.. [Inner,Options] ,
surround_type(NewInner,Outter,TType) ,
add_options(TType, Options, NType),
Type = SeqType
) ,
( member(id,Options)
-> generate(id_or_ast(NType),Value)
; gen_type(NType,ast,GenType) ,
generate(GenType,Value)
),
!,
Gen = b(insert_tail(ValueSeq,Value),seq(SeqType),[]).