4:- module(lps_pddl_convert,[ 5 6 assert_lps_pddl/1,
7 test_logicmoo_lps_pddl_reader/0,
8
9 test_lps_pddl_ereader/0,
10 test_logicmoo_pddl_reader_2/0,
11 test_logicmoo_lps_pddl_reader/2,test_logicmoo_lps_pddl_reader/1]). 12
13
14:- use_module(library(logicmoo_common)). 15
20:- use_module(library(logicmoo_lps)). 21:- use_module(library(wam_cl/sreader)). 22:- use_module(library(hyhtn_pddl/rsasak_pddl_parser)). 26
27:- use_module(library(lps_corner)). 28
29:- set_prolog_flag(lps_translation_only_HIDE,false). 30:- set_prolog_flag(lps_translation_only,false). 31
32
33assert_lps_pddl(Stuff):-
34 print_tree_cmt('Translating',green,Stuff),
35 assert_pddl([],Stuff).
36
37print_tree_cmt(Info,C,P):-
38 mention_o_s_l,
39 notrace((echo_format('~N'),
40 with_output_to(string(S), in_cmt((
41 format('~N~w: \n\n',[Info]),
42 print_tree(P)))),
43 to_ansi(C, C0),
44 real_ansi_format(C0, '~s', [S]))).
45
46
47:- export_transparent(with_lps_pddl_operators2/2). 48with_lps_pddl_operators2(M,Goal):-
49 setup_call_cleanup(push_operators(M:[op(900, fy, M:not), op(1200, xfx, M:then), op(1185, fx, M:if), op(1190, xfx, M:if), op(1100, xfy, M:else), op(1050, xfx, M:terminates), op(1050, xfx, M:initiates), op(1050, xfx, M:updates), op(1050, fx, M:observe), op(1050, fx, M:false), op(1050, fx, M:initially), op(1050, fx, M:fluents), op(1050, fx, M:events), op(1050, fx, M:prolog_events), op(1050, fx, M:actions), op(1050, fx, M:unserializable), op(999, fx, M:update), op(999, fx, M:initiate), op(999, fx, M:terminate), op(997, xfx, M:in), op(995, xfx, M:at), op(995, xfx, M:during), op(995, xfx, M:from), op(994, xfx, M:to), op(1050, xfy, M: ::), op(1200, xfx, M:(<-)), op(1050, fx, M:(<-)), op(700, xfx, M: <=)],Undo),
50 M:call(Goal),pop_operators(Undo)).
51
52:- export_transparent(with_lps_pddl_operators/1). 53with_lps_pddl_operators(MGoal):-
54 strip_module(MGoal,M,Goal),
55 with_lps_pddl_operators2(user,lps_pddl_convert:with_lps_pddl_operators2(M,M:Goal)).
56
57
58print_lps_pddl_syntax(Color,Lps):-
59 with_lps_pddl_operators2(user,
60 lps_pddl_convert:with_lps_pddl_operators2(pretty_clauses,pretty_clauses:clause_to_string(Lps,S))),
61 real_ansi_format(hfg(Color), '~N~s.~N', [S]),!.
62
63
64include_e_lps_pddl_file_now(Type,MFile):- strip_module(MFile,M,File), include_e_lps_pddl_file_now(Type,M,File).
65include_e_lps_pddl_file_now(Type,M,File):- absolute_file_name(File,AbsFile),File\==AbsFile,exists_file(AbsFile), !,include_e_lps_pddl_file_now(Type,M,AbsFile).
66
69include_e_lps_pddl_file_now(_Type,_Ctx,File):-
70 with_lisp_translation(File,assert_lps_pddl),!.
71
72
73load_e_lps_pddl_file(Type,File):- retractall(etmp:pddl_option(load(_), _)), include_e_lps_pddl_file(Type,File).
74load_e_lps_pddl_file(Type,File):- retractall(etmp:pddl_option(load(_), _)), include_e_lps_pddl_file(Type,File).
75
76
77include_e_lps_pddl_file(Type,File):- is_list(File), !, maplist(include_e_lps_pddl_file(Type),File).
78include_e_lps_pddl_file(Type,File):- wdmsg(include_e_lps_pddl_file(Type,File)),fail.
79include_e_lps_pddl_file(Type,File):- needs_resolve_local_files(File,Resolved),!,include_e_lps_pddl_file(Type,Resolved).
80include_e_lps_pddl_file(Type,File):- absolute_file_name(File,DB), exists_file(DB),!,
81 update_changed_files,
82 strip_module(_,M,_), prolog_statistics:time(M:include_e_lps_pddl_file_now(Type,File)),!.
83include_e_lps_pddl_file(Type,File):- throw(with_abs_paths(include_e_lps_pddl_file(Type),File)).
84
85
86test_logicmoo_lps_pddl_reader(File):- test_logicmoo_lps_pddl_reader(lps, File).
87test_logicmoo_lps_pddl_reader(Proc1,File):- load_e_lps_pddl_file(Proc1,File).
88
89solve_files_w_lps(DomainFile, ProblemFile):-
90 test_logicmoo_lps_pddl_reader(ProblemFile),!,
92 93 94 test_logicmoo_lps_pddl_reader(DomainFile),
95 !.
96
97test_logicmoo_lps_pddl_reader:-
98 test_logicmoo_lps_pddl_reader(pddl('*/*.pddl')).
99
100test_logicmoo_pddl_reader_2:-
101 test_logicmoo_lps_pddl_reader(pddl('benchmarks/*/*/*/*.pddl')).
102
103:- ensure_loaded(library(logicmoo/util_structs)). 104:- ensure_loaded(library(statistics)). 106
107test_lps_pddl_ereader:- !,
108 planner_solve_files(pddl('orig_pddl_parser/test/blocks/domain-blocks.pddl'),
109 pddl('orig_pddl_parser/test/blocks/blocks-03-0.pddl')),!.
110
111
112
113compound_name_arguments_maybe_zero(F,F,[]):- !.
114compound_name_arguments_maybe_zero(LpsM,F,ArgsO):- compound_name_arguments(LpsM,F,ArgsO).
115
116
117already_lps_pddl(Form):- var(Form),!,throw(var_already_lps_pddl(Form)).
118already_lps_pddl(:- _):-!.
119already_lps_pddl(option(_,_)):-!.
120already_lps_pddl(false(_)):-!.
121already_lps_pddl(mpred_prop(_,_)):-!.
122already_lps_pddl(sort(_)):-!.
123already_lps_pddl(subsort(_,_)):-!.
124
125into_term([A|List],Res):- atom(A),is_list(List),!, Res =.. [A|List].
126into_term([A|List],Res):- compound(A),is_list(List),!,append_termlist(A,List,Res),!.
127into_term(List,Res):- is_list(List),!,Res =..[t|List].
128into_term(Decl,t(Decl)).
129
134assert_pddl(Ctx,Form):- \+ compound_gt(Form,0),!,assert_lps(Ctx,Form).
135assert_pddl(Ctx,t(Type,Inst)):- atom(Type), M=..[Type,Inst],!,assert_pddl(Ctx,M),!.
137assert_pddl(Ctx,Form):- \+ is_list(Form),!,assert_lps(Ctx,Form).
138
139assert_pddl(Ctx,Form):-
140 Form = [ define, Decl|Rest],
141 into_term(Decl,Named),
142 assert_pddl([Named|Ctx],Rest),!.
143
144assert_pddl(Ctx,Form):- wdmsg(assert_pddl(Ctx,Form)),fail.
145assert_pddl(Ctx,Form):-
146 Form = [ action, Decl|Rest],
147 into_term(Decl,Named),
148 assert_pddl([Named|Ctx],Rest),!.
149
150assert_pddl(Ctx,[[KW,Data]|Rest]):-
151 kw_directive(KW,NewType),
152 kw_soon(Rest),
153 assert_pddl([NewType|Ctx],Data),
154 assert_pddl(Ctx,Rest),!.
155
156assert_pddl(Ctx,[[KW|Data]|Rest]):- Data\==[],
157 kw_directive(KW,NewType),
158 kw_soon(Rest),
159 assert_pddl([NewType|Ctx],Data),
160 assert_pddl(Ctx,Rest),!.
168
169assert_pddl([init|Ctx],Data):- map_pddl_list(assert_pddl([s(initially)|Ctx]),Data).
170
171assert_pddl(Ctx,Data):- \+ is_list(Data),!,assert_pddl(Ctx,[Data]).
172assert_pddl([AtomS|Ctx],Data):- atom(AtomS),atom_concat(Atom,'s',AtomS),!, map_pddl_list(assert_pddl([Atom|Ctx]),Data).
173assert_pddl([s(Pred)|Ctx],SData):- sterm2pterm(SData,Data), !,assert_lps([Pred|Ctx],Data).
174assert_pddl([One,Ctx],SData):- atom(One),!, sterm22pterm(SData,Data),!,assert_lps([One,Ctx],Data).
175
176assert_pddl(Ctx,Form):- assert_lps(Ctx,Form).
177
178
179assert_pddl_pairs(Ctx,[N,SV|Form]):- sterm2pterm(SV,V), assert_lps([N|Ctx],V),assert_pddl_pairs(Ctx,Form).
180assert_pddl_pairs(_,[]).
181
182
183sterm22pterm(SData,Data):- SData=Data,!.
184sterm22pterm(SData,Data):- sterm2pterm(SData,SSData),sterm2pterm(SSData,Data).
185
186kw_soon(Rest):-
187 (Rest ==[] ;
188 (Rest = [KW2|_],kw_directive(KW2,_));
189 (Rest = [[KW2|_]|_],kw_directive(KW2,_))).
190
191kw_directive(KW,NewType):- atom(KW), atom_concat(':',Stuff,KW), downcase_atom(Stuff,NewType),!.
192
193map_pddl_list(_Pred,[]).
194map_pddl_list(Pred1,[Item,'-',Type|List]):- atom(Type),Item1=..[Type,Item], !,
195 map_pddl_list(Pred1,[Item1|List]).
196map_pddl_list(Pred1,[[Item,'-',Type]|List]):- atom(Type),Item1=..[Type,Item], !,
197 map_pddl_list(Pred1,[Item1|List]).
198map_pddl_list(Pred1,[Item1|List]):- call(Pred1,Item1),map_pddl_list(Pred1,List).
199
200assert_lps(Lps):- assert_lps(lps_test_mod,Lps).
201
203assert_lps([action|Ctx],[Name,':parameters',Params|Form]):- sterm2pterm_list(Params,RParams),!, assert_pddl_pairs([action(Name,RParams)|Ctx],Form).
204assert_lps(Ctx,Form):- pprint_ecp_cmt(white,assert_lps(Ctx,Form)).
205assert_lps(Ctx,Form):- Ctx=[Pred|Rest],atom(Pred),is_list(Rest),NewForm=..Ctx, append_term(NewForm,Form,Data),assert_prolog(Data).
206assert_lps(Ctx,Form):- Ctx=[NewForm|Rest],is_list(Rest),append_termlist(NewForm,Rest,RData),append_term(RData,Form,Data),assert_prolog(Data).
207assert_lps(Ctx,Form):- assert_prolog(ctx(Ctx,Form)),!.
208
209assert_prolog(Lps):-
210 lps_xform(Lps,Prolog),!,
211 must_or_rtrace((Lps\==Prolog->(ignore(( 212 print_lps_pddl_syntax(yellow,Lps),
213 nop(pprint_ecp(yellow,Lps)))),
214 pprint_ecp_cmt(cyan,Prolog),pprint_ecp_cmt(white,"% ================================="))
215 ;assert_lps_pddl_try_harder(Lps))),!.
216
217lps_xform(Lps,Prolog):-
218 Ctx = db,
219 locally(current_prolog_flag(lps_translation_only_HIDE,true),
220 locally(t_l:lps_program_module(Ctx),
221 must_or_rtrace(lps_f_term_expansion_now(Ctx,Lps,Prolog)))),!.
222
223:- use_module(library(lps_syntax)). 224
225
226
232
233
234pddl_to_lps(_Top, X, X):- \+ compound(X),!.
235pddl_to_lps(_Top, X, X):- functor(X,_,1), arg(1,X,Var), is_ftVar(Var),!.
236pddl_to_lps(_Top,at(X,Y),loc_at(X,Y)).
237pddl_to_lps(_Top,metreqs(X),X).
238pddl_to_lps(_Top,'->'(at(F1,T1),initiates(E,F2,T2)),Becomes):- T1==T2,
239 Becomes = (F1->initiates(E,F2)).
240pddl_to_lps(_Top,'->'(at(F1,T1),terminates(E,F2,T2)),Becomes):- T1==T2,
241 Becomes = (F1->terminates(E,F2)).
242pddl_to_lps(_Top,'->'(holds_at(F1,T1),initiates(E,F2,T2)),Becomes):- T1==T2,
243 Becomes = (F1->initiates(E,F2)).
244pddl_to_lps(_Top,'->'(holds_at(F1,T1),terminates(E,F2,T2)),Becomes):- T1==T2,
245 Becomes = (F1->terminates(E,F2)).
246
247pddl_to_lps(Top,neg(X),Rest):- pddl_to_lps(Top,not(X),Rest).
248pddl_to_lps(_Top,holds_at(Fluent, Time),initially(Fluent)):- Time==start, !.
249pddl_to_lps(_Top,holds_at(Fluent, Time),initially(Fluent)):- Time==0, !.
250%pddl_to_lps(_Top,holds_at(Fluent, Time),at(Fluent, Time)):- !.
251pddl_to_lps([],happens_at(Event,Time),(observe Event at Time)):- !.
252pddl_to_lps(_Top,happens(Event,Time),(Event at Time)):- !.
254pddl_to_lps( [],initiates_at(Event,Fluent,Time),initiates(Event,Fluent)):- is_ftVar(Time), !.
255pddl_to_lps( [],terminates_at(Event,Fluent,Time),terminates(Event,Fluent)):- is_ftVar(Time), !.
256
257pddl_to_lps(_Top,initiates_at(Event,Fluent,Time),(Event initiates Fluent at Time)):- !.
258pddl_to_lps(_Top,terminates_at(Event,Fluent,Time),(Event terminates Fluent at Time)):- !.
259
260pddl_to_lps(_Top, not(exists(_,X)), not(X)):-!.
263
264pddl_to_lps(_Top, holds_at(Fluent, From, To),holds(Fluent, From, To)):- !.
265
266
267
269pddl_to_lps(_Top,Form,LpsO):- Form=..[EFP,X], argtype_pred(EFP,_), protify(EFP,X,Lps),!,flatten([Lps],LpsO).
270pddl_to_lps(_Top,X=Y,Lps):- callable(X),append_term(X,Y,Lps).
271pddl_to_lps(Top,','(X1,X2),(Lps1,Lps2)):- pddl_to_lps(Top,X1,Lps1),pddl_to_lps(Top,X2,Lps2).
272pddl_to_lps(Top,'<->'(X1,X2),[Lps1,Lps2]):- simply_atomic_or_conj(X1),simply_atomic_or_conj(X2), pddl_to_lps(Top,'->'(X1,X2),Lps1),pddl_to_lps(Top,'->'(X2,X1),Lps2).
273pddl_to_lps(_Top,'->'(X1,X2),(X2 if X1)):- simply_atomic_or_conj(X1),simply_atomic_or_conj(X2),!.
274pddl_to_lps(_Top,X1,X1):- simply_atomic(X1),!.
275pddl_to_lps(_Top,X1,false(Lps)):- \+ (X1 = false(_)), into_false_conj(X1,Lps),Lps\=not(_),!.
276pddl_to_lps(_Top,X,X):-!.
277
278into_false_conj(X1,Lps):- \+ (X1 = false(_)), into_pnf_conj(X1,Lps) -> Lps\=not(_),simply_atomic_or_conj(Lps).
279into_pnf_conj(X1,Lps):- pnf(X1,X2),nnf(X2,X3),conjuncts_to_list(X3,X3L),list_to_conjuncts(X3L,X4), Lps = X4.
280
281removes_at(F,_):- sent_op_f(F),!,fail.
282removes_at(F,F1):- atom_concat(F1,'_at',F),!.
284remove_time_arg(_Time,Holds,Holds):- \+ compound_gt(Holds,0),!.
285remove_time_arg(Time,Holds,HoldsMT):- \+ sub_var(Time,Holds),!,Holds=HoldsMT.
286remove_time_arg(Time,not(Holds),not(HoldsMT)):-!, remove_time_arg(Time,Holds,HoldsMT).
287remove_time_arg(Time,happens_at(Holds,T1),Holds):- T1==Time.
288remove_time_arg(Time,holds_at(Holds,T1),Holds):- T1==Time.
289remove_time_arg(Time,at(Holds,T1),Holds):- T1==Time.
290remove_time_arg(_Time,Holds,Holds):- \+ compound_gt(Holds,1),!.
291remove_time_arg(Time,Holds,HoldsMT):- Holds=..[F|Args],append(Left,[T1],Args),T1==Time,removes_at(F,F1),HoldsMT=..[F1|Left],!.
292remove_time_arg(Time,Holds,HoldsMT):- Holds=..[F|Args],maplist(remove_time_arg(Time),Args,Left),HoldsMT=..[F|Left],!.
293
294simply_atomic_or_conj(X1):- var(X1),!,fail.
295simply_atomic_or_conj((X1,X2)):- !, simply_atomic_or_conj(X1),simply_atomic_or_conj(X2).
296simply_atomic_or_conj(X1):- simply_atomic(X1).
297
298simply_atomic(X1):- var(X1),!,fail.
299simply_atomic(X1):- \+ compound_gt(X1,0),!.
300simply_atomic(not(X1)):-!, simply_atomic(X1).
301simply_atomic(at(X1,_)):-!, simply_atomic(X1).
302simply_atomic((_;_)):- !, fail.
303simply_atomic(X1):- compound_name_arguments(X1,F,Args), simply_atomic_f(F), maplist(simply_atomic_arg,Args).
304simply_atomic_f(F):- \+ sent_op_f(F).
305
306sent_op_f(F):- upcase_atom(F,FU),FU=F.
307
308simply_atomic_arg(A):- var(A);simply_atomic(A).
309
310assert_lps_pddl_try_harder_now((X2 if X1),(if X1 then X2)):- simply_atomic_or_conj(X1), simply_atomic_or_conj(X2).
311assert_lps_pddl_try_harder(Prolog):- assert_lps_pddl_try_harder_now(Prolog,Again),
312 lps_xform(lps_test_mod,Again,PrologAgain),Again\==PrologAgain,!,
313 print_lps_pddl_syntax(yellow,Again),
314 pprint_ecp_cmt(cyan,PrologAgain),
315 pprint_ecp_cmt(white,"% ================================="),
316 !.
317assert_lps_pddl_try_harder(Prolog):- pprint_ecp(red,Prolog).
318
319argtype_pred(event,events).
320argtype_pred(fluent,fluents).
321argtype_pred(action,actions).
322argtype_pred(predicate,predicates).
323argtype_pred(Action,Actions):- arg_info(domain,Action,arginfo),atom_concat(Action,"s",Actions).
324
325protify(both,Form,[Lps1,Lps2]):- protify(events,Form,Lps1),protify(action,Form,Lps2).
326protify(Type,Form,Lps):- is_list(Form),!,maplist(protify(Type),Form,Lps).
327protify(Type,Form,Lps):- argtype_pred(Type,LPSType), \+ callable(Form),!,Lps=..[LPSType,[Form]].
328protify(Type,Form,Lps):- argtype_pred(Type,LPSType), \+ compound(Form),!,Lps=..[LPSType,[Form/0]].
329protify(Type,F/A, Lps):- argtype_pred(Type,LPSType), integer(A),!,Lps=..[LPSType,[F/A]].
330protify(Type,(X1,X2),[Lps1,Lps2]):- !, protify(Type,X1,Lps1),protify(Type,X2,Lps2).
332protify(Event,X,LPS):- ((event) == Event), compound(X), arg(1,X,Agent),
333 is_agent(Agent),
334 !,protify(both,X,LPS).
335protify(Type,X,[mpred_prop(X,Type),LPS]):- argtype_pred(Type,LPSType),protify(LPSType,X,LPS).
336protify(LPSType,X,LPS):- cfunctor(X,F,A),cfunctor(_Lps,F,A),!,Pred=..[LPSType,[F/A]],LPS=[Pred].
337
338is_agent(Agent):- \+ atom(Agent),!,fail.
339is_agent(diver).
340is_agent(agent).
341is_agent(Agent):- call_u(subsort(Agent,agent)),!.
342
343:- fixup_exports.