1 :- multifile generate/2.
2
3 :- use_module(synthesis(synthesis_util),[find_typed_identifier_uses_with_info/2]).
4
5 % return explicit bindings as terms bind/2 and the used identifier nodes
6 generate(prob_state_bindlist(AST),Bindings:TypedIDs) :-
7 find_typed_identifier_uses_with_info(AST,TypedIDs) ,
8 maplist(ast_ids_to_bindlist,TypedIDs,Bindings) , !.
9 % unbound bindlist
10 generate(prob_state_bindlist(AST,Options),Bindings:TypedIDs) :-
11 member(unbound,Options) ,
12 find_typed_identifier_uses_with_info(AST,TypedIDs) ,
13 findall(bind(ID,_),member(b(identifier(ID),_,_),TypedIDs),Bindings) , !.
14
15 % generate a binding for an identifier
16 ast_ids_to_bindlist(b(identifier(Name),record(FieldList),_),bind(Name,Record)) :-
17 FieldList = [field(_,Type)|_] ,
18 NType =.. [Type,[]] ,
19 findall(FieldName,member(field(FieldName,_),FieldList),NameList) ,
20 generate(prob_ast_record(NType,[names:NameList]),Record).
21 ast_ids_to_bindlist(b(identifier(Name),Type,_),bind(Name,Value)) :-
22 % add options to inner type for generation
23 inner_type(Type,Inner,Outter) ,
24 % options for integer, other types ignore this option
25 NewInner =.. [Inner,[small,positive,nozero]] ,
26 surround_type(NewInner,Outter,TempType) ,
27 gen_type(TempType,value,NewType) ,
28 generate(NewType,Value).