1% =========================================
    2% Goal/Plan translating
    3% =========================================
    4:- module(lps_pddl_convert,[%load_e/1, needs_proccess/3,process_ec/2,fix_time_args/3,fix_goal/3, 
    5  %brk_on_bind/1,assert_axiom_2/2,
    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
   16/*export_transparent(P):-
   17  export(P),
   18  module_transparent(P).
   19*/
   20:- use_module(library(logicmoo_lps)).   21:- use_module(library(wam_cl/sreader)).   22:- use_module(library(hyhtn_pddl/rsasak_pddl_parser)).   23% system:pddl_current_domain(X):- wdmsg(pddl_current_domain(X)),fail.
   24%:- user:use_module(library('pddl_planner/pddl_planner_dmiles')).
   25%:- use_module(library(pddl_planner/pddl_reader)).
   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
   67%include_e_lps_pddl_file_now(_Type,_Ctx,File):- 
   68%   with_lisp_translation(File,pprint_ecp(yellow)),!.
   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),!,
   91%  parseProblem(ProblemFile,PStuff),%break,
   92  %pprint_ecp(blue,PStuff),!, break,
   93  %parseDomain(DomainFile,Stuff), pprint_ecp(yellow,Stuff),!, % break,
   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)).  105%:- ensure_loaded(library(logicmoo_util_bb_env)).
  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
  130%assert_pddl(Ctx,_,include(F)):- include_e_lps_pddl_file_now(Type,Ctx:F).
  131%assert_pddl(Ctx,_,load(F)):- include_e_lps_pddl_file_now(Type,Ctx:F). 
  132%assert_pddl(Ctx,_,include(F)):- !, with_e_file(assert_pddl(Ctx),current_output, [pddl(F)]). 
  133%assert_pddl(Ctx,_,load(X)):- nop(assert_pddl(Ctx,include(X))),!.
  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),!.
  136%assert_pddl(Ctx,Form):- already_lps_pddl(Form),!,assert_lps(Ctx,Form).
  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),!.
  161/*
  162assert_pddl(Ctx,[KW,Data|Rest]):- Data\==[],
  163  kw_directive(KW,NewType),
  164  kw_soon(Rest),
  165  assert_pddl([NewType|Ctx],Data),
  166  assert_pddl(Ctx,Rest),!.
  167*/
  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
  202% assert_lps([_Ctx],Form):- Form ==[], 
  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(( /*(Form\==Prolog,Lps==Prolog)-> */
  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
  227% [waiter,agent,food,time]
  228% HoldsAt(BeWaiter1(waiter),time) ->
  229% Initiates(Order(agent,waiter,food),
  230%           BeWaiter2(waiter),
  231%           time).
  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)):- !.
  253% observe(from(muestra_del_general('+86-555000001'),to(2,3)))
  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)):-!.
  261%pddl_to_lps(_Top, not(initially(X)),(initially not X)):-!.
  262%pddl_to_lps(_Top, not(holds_at(X,T)),holds_at(not(X),T)).
  263
  264pddl_to_lps(_Top, holds_at(Fluent, From, To),holds(Fluent, From, To)):- !.
  265
  266
  267
  268%pddl_to_lps(_Top,happensAt(Event,Time),at(observe(Event),Time)):- !.
  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),!.
  283%removes_at(F,F1):- F=F1.
  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).
  331%protify(Type,X,Lps):- cfunctor(X,F,A),Lps=(F/A).
  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.