1/*
    2% NomicMUD: A MUD server written in Prolog
    3%
    4% Some parts used Inform7, Guncho, PrologMUD and Marty's Prolog Adventure Prototype
    5% 
    6% July 10, 1996 - John Eikenberry 
    7% Copyright (C) 2004 Marty White under the GNU GPL
    8% 
    9% Dec 13, 2035 - Douglas Miles
   10%
   11%
   12% Logicmoo Project changes:
   13%
   14% Main file.
   15%
   16*/

   17% =========================================
   18% Goal/Plan translating
   19% =========================================
   20:- module(ec_loader,[load_e/1, needs_proccess/2,process_ec/2]).

   21
   22:- use_module(library(logicmoo_utils_all)).
   23
   24:- if(\+ current_prolog_flag(lm_no_autoload,_)).
   25:- set_prolog_flag(lm_no_autoload,false).
   26:- wdmsg("WARNING: PFC_AUTOLOAD").
   27:- endif.
   28
   29:- if(\+ current_prolog_flag(lm_pfc_lean,_)).
   30:- set_prolog_flag(lm_pfc_lean,false).
   31:- wdmsg("WARNING: PFC_NOT_LEAN").
   32:- endif.
   33
   34%:- use_module(library(pfc_lib)).
   35:- use_module(library(pfc)).
   36:- baseKB:export(baseKB:spft/3).
   37:- system:import(baseKB:spft/3).
   38
   39export_transparent(P):-
   40  export(P),
   41  module_transparent(P).
   42:- reexport(library('ec_planner/ec_planner_dmiles')).
   43:- reexport(library('ec_planner/ec_reader')).
   44
   45
   46:- export_transparent(e_reader_teste/0).
   47e_reader_teste:- with_e_sample_tests(load_e),e_reader_teste2.
   48
   49e_reader_teste2:- 
   50     convert_to_axiom(fff,
   51  ((holds_at(beWaiter3(waiterOf(Restaurant)), Time),
   52    exists([Agent], holds_at(knowOrder(waiterOf(Restaurant), Agent, Food), Time))) ->
   53       ( happens(order(waiterOf(Restaurant),
   54                      cookOf(Restaurant),
   55                      Food),
   56                Time))),O),
   57     assert_ready(e,O).
   58
   59:- export_transparent(e_reader_testec/0).
   60e_reader_testec:- with_e_sample_tests(load_e_pl).
   61
   62:- export_transparent(load_e/1).
   63load_e(F):- cond_load_e(always,F).
   64
   65:- export_transparent(cond_load_e/2).
   66cond_load_e(Cond,F):- needs_resolve_local_files(F, L), !, maplist(cond_load_e(Cond), L).  
   67cond_load_e(_,F):- is_filename(F), \+ atom_concat(_,'.e',F), !.
   68cond_load_e(changed,'foundations/EC.e').
   69cond_load_e(changed,'foundations/Root.e').
   70cond_load_e(Cond,F):- etmp:ec_option(load(F), loading), Cond\==recursed, !.
   71cond_load_e(changed,F):- etmp:ec_option(load(F), loaded),!.
   72cond_load_e(Cond,F):- Req = [pl],
   73   \+ nb_current('$output_lang',Req), !,
   74   locally(b_setval('$output_lang',Req), cond_load_e(Cond,F)).
   75cond_load_e(Cond,F):-
   76   pprint_ecp_cmt(green, loading(Cond, F)),
   77   setup_call_cleanup(
   78      set_ec_option(load(F), loading),
   79      e_to_pl(assert_ele, current_output, F),
   80      set_ec_option(load(F), unknown)),   
   81   set_ec_option(load(F), loaded).
   82
   83:- export_transparent(load_e_pl/1).
   84load_e_pl(F):- needs_resolve_local_files(F, L), !, maplist(load_e_pl, L).  
   85load_e_pl(F):-
   86  calc_where_to(outdir('.', pl), F, OutputName), !,
   87 ( 
   88 (( ( fail, \+ should_update(OutputName))) -> true ;
   89  setup_call_cleanup(open(OutputName, write, Outs),
   90  (maplist(format(Outs,'~N~q.~n'),
   91    [( :- include(library('ec_planner/ec_test_incl'))),
   92     ( :- expects_dialect(pfc))]), 
   93  with_output_to(Outs, cond_load_e(always,F))),
   94  close(Outs)))), %trace, %consult(OutputName),
   95  !.
   96
   97/*
   98 
   99 state constraints:  
  100
  101      holds_at(Fluent)
  102          implies/equivalent_to
  103      holds_at(Fluent)
  104
  105
  106 effect axioms:  
  107
  108      happens(Event)
  109           terminates/initiates/releases
  110      holds_at(Fluent)
  111       
  112
  113 trigger axioms: 
  114  
  115      holds_at(Fluent)/happens(Event)
  116           triggers
  117      happens(Event)
  118
  119
  120 precondition axioms:  
  121  
  122      happens(Event)
  123           implies
  124      holds_at(Fluent)
  125
  126 
  127
  128happens(doorLock(Agent,Door),Time) -> 
  129  holds_at(awake(Agent),Time) &
  130  holds_at(doorUnlocked(Door),Time) &
  131  holds_at(nearPortal(Agent,Door),Time)
  132
  133
  134
  135
  136   
  137axiom(
  138 terminates(doorLock(Agent,Door),
  139            doorUnlocked(Door),Time), [])
  140
  141becomes 
  142...
  143
  144axiom(
  145 terminates(doorLock(Agent,Door),
  146            doorUnlocked(Door),Time),
  147   [ holds_at(awake(Agent),Time) &
  148     holds_at(doorUnlocked(Door),Time) &
  149     holds_at(nearPortal(Agent,Door),Time)]).
  150 
  151*/

  152functors_are(F,E):- \+ is_list(E), conjuncts_to_list(E, L), !, functors_are(F, L).
  153functors_are(\+ F,L):-  nonvar(F), !, forall(member(E,L), \+ functor_is(F, E)).
  154functors_are((F1,F2),L):- !,  
  155  partition(functors_are(F1),L,[_|_],RestOf),
  156  functors_are(F2,RestOf).
  157%functors_are((F1;F2),L):-  !, nonvar(F1), (functors_are(F1,L);functors_are(F2,L)).
  158functors_are(F,L):- maplist(functor_is(F),L).
  159
  160
  161functor_is(F, not(E)):- !, compound(E), functor_is(F, E).
  162functor_is(F, exists(_, E)):- !, compound(E), functor_is(F, E).
  163functor_is(F,(F1;F2)):- !, functor_is(F,F1), functor_is(F,F2).
  164functor_is(F,(F1,F2)):- !, functor_is(F,F1), functor_is(F,F2).
  165functor_is(\+ F,P):- !, nonvar(F), !,  \+ functor_is(F,P).
  166functor_is((F1;F2),P):- !, nonvar(F1), (functor_is(F1,P);functor_is(F2,P)).
  167functor_is(F,P):- compound(P), compound_name_arity(P,F,_).
  168
  169:- export_transparent(set_mpred_props/2).
  170set_mpred_props(MF,E):- strip_module(MF,M,P),MF==P,!,must(set_mpred_props(M:P,E)).
  171set_mpred_props(M:F/A,E):- !, (var(A)-> true ; ain(mpred_prop(M,F,A,E))).
  172set_mpred_props(M:P,E):- \+ compound(P),!,set_mpred_props(M:P/_,E).
  173set_mpred_props(M:P,E):- compound_name_arity(P,F,A),set_mpred_props(M:F/A,E),
  174   assert_ready(red, (==>meta_argtypes(P))),
  175   ain(meta_argtypes(P)).
  176
  177
  178
  179is_4th_order(axiom).
  180is_4th_order(F):- upcase_atom(F,UD),upcase_atom(F,UD).
  181
  182get_arg_type(argIsa(W),1,W).
  183get_arg_type(F, Nth,Type):- arg_info(_,F,VTypes), compound(VTypes), arg(Nth,VTypes,Type), !.
  184get_arg_type(F,_,axiom_head):- is_4th_order(F),!.
  185
  186coerce_arg_to_type(Time, axiom_head, H, HH):- !, show_fix_axiom_head(Time, H, HH).
  187
  188coerce_arg_to_type(_, axiom, HB, HB):- compound_gt(HB, 0), HB=..[RelType|_], fixed_already(RelType), !.
  189coerce_arg_to_type(Time, axiom, HB, axiom(AxHB,[])):-  coerce_arg_to_type(Time, axiom_head, HB, AxHB), !.
  190coerce_arg_to_type(Time, axiom, H, HH):- fix_assert(Time, H, HH).
  191coerce_arg_to_type(_Time, fluent, H, H):-
  192   assert_ele(fluent(H)).
  193
  194
  195fixed_already(mpred_prop).
  196fixed_already(meta_argtypes).
  197fixed_already(abducible).
  198fixed_already(executable).
  199fixed_already(axiom).
  200fixed_already(F):- arg_info(domain,F,_).
  201fixed_already(F):- arg_info(abducible,F,_).
  202
  203fix_assert(Time, HT:-B, HTO:-B):- !, 
  204  fix_assert(Time, HT, HTO).
  205fix_assert(Time, HT, HTO):- 
  206 fix_argtypes(Time, 1, [argIsa(axiom)], HT, HTM),!,
  207 fix_assert_pass2(Time, HTM, HTO).
  208
  209fix_assert_pass2(_, HB, HB):- HB=..[RelType|_], fixed_already(RelType), !.
  210fix_assert_pass2(Time, G, axiom(GG, [])):- must(show_fix_axiom_head(Time, G, GG)),!.
  211
  212
  213fix_argtypes(Time, NthArg, [F|_], HT, HTO):-
  214    get_arg_type(F,NthArg,Type), 
  215    coerce_arg_to_type(Time,Type,HT,HTO),!.
  216fix_argtypes(_, _NthArg, _Type, HB, HB):- \+ compound_gt(HB, 0), !.
  217fix_argtypes(Time, _NthArg, Type, HT, HTO):-
  218 compound_name_arguments(HT, F, L), 
  219 fix_argtypes(Time, 1, [F|Type], L, LL),
  220 compound_name_arguments(HTO, F, LL).
  221
  222fix_numbered_argtypes(Time, NthArg, FType, [H|T], [HH|TT]):- !,
  223  fix_argtypes(Time, NthArg, FType, H, HH),
  224  NthArgPlus1 is NthArg + 1,
  225  fix_numbered_argtypes(Time, NthArgPlus1, FType, T, TT).
  226fix_numbered_argtypes(_Time, _NthArg, _FType, [], []).
  227
  228
  229:- export_transparent(fix_axiom_head/3).
  230fix_axiom_head(_, X, Y):-  (\+ callable(X);\+ compound(X)), !, X=Y.
  231fix_axiom_head(_T, option(X,Y),option(X,Y)):-!.
  232fix_axiom_head(T, X\=Y, O):- must(fix_axiom_head(T, not(X=Y), O)).
  233fix_axiom_head(T, P, PP):- cvt0(T, P,PP),!.
  234fix_axiom_head(T, neg(I),O):- !, fix_axiom_head(T, I,M), correct_holds(neg, not(M), O). 
  235fix_axiom_head(T, not(I),O):- !, fix_axiom_head(T, I,M), correct_holds(neg, not(M), O). 
  236fix_axiom_head(T, happens(F, T1, T2), O):- T1==T2, fix_axiom_head(T, happens(F, T1), O).
  237fix_axiom_head(_, equals(X,Y),equals(X,Y)).
  238fix_axiom_head(T, HT, HTTerm):-  
  239 compound_name_arguments(HT, F, L),
  240 upcase_atom(F,U),downcase_atom(F,U),
  241 maplist(show_fix_axiom_head(T),L,LL),
  242 ( LL\==L -> compound_name_arguments(HTTerm, F, LL) ; HT = HTTerm ), !.
  243
  244fix_axiom_head(_, G, G):- functor_skel(G,P), syntx_term_check(predicate(P)),!.
  245fix_axiom_head(T, G, happens(G,T)):- functor_skel(G,P), (syntx_term_check(event(P));executable(P)),!.
  246fix_axiom_head(T, G, holds_at(G,T)):- functor_skel(G,P), syntx_term_check(fluent(P)),!.
  247fix_axiom_head(T, G, Gs):- fix_goal_add_on_arg( T, G, Gs, _TExtra),!.
  248fix_axiom_head(_, G, G):- functor(G,F,A), already_good(F,A),!.
  249%fix_axiom_head(T,(G1,G2),GGs):- !, fix_axiom_head(T,G1,GG1),fix_axiom_head(T,G2,GG2).
  250fix_axiom_head(T, P, PP):-  
  251   P =..[F|Args],functor(P,F,A), arg_info(AxH,F,Arity),!,
  252   functor(Arity,_,N), 
  253   must(correct_ax_args(T,F,A,Args,AxH,Arity,N,PP)).
  254%fix_axiom_head(T, P, P).
  255%fix_axiom_head(T,X,Y):- trace, ec_to_ax(T, X,Y).
  256fix_axiom_head(_, P, call(P)):- predicate_property(P,foreign),!.
  257fix_axiom_head(_, holds_at(G, T), holds_at(G, T)):-!.
  258fix_axiom_head(T, G, GG):- trace, GG = holds_at(G, T).
  259
  260:- export(show_fix_axiom_head/3).
  261show_fix_axiom_head(T, HT, HTTermO):- 
  262    fix_axiom_head(T, HT, HTTermO),!,
  263    ignore((HT\==HTTermO,dmsg(fix_axiom_head(HT):- HTTermO))),!.
  264show_fix_axiom_head(T, HT, HTTermO):-  
  265 compound_name_arguments(HT, F, L),
  266 upcase_atom(F,U),downcase_atom(F,U),
  267 maplist(show_fix_axiom_head(T),L,LL),
  268 compound_name_arguments(HTTerm, F, LL),
  269 show_fix_axiom_head(T, HTTerm, HTTermO).
  270show_fix_axiom_head(T, HT, HTTermO):- trace, rtrace(fix_axiom_head(T, HT, HTTermO)),!.
  271
  272
  273
  274assert_ready(Type,'==>'(Value)):- 
  275   pprint_ecp(Type,'==>'(Value)),
  276   mpred_fwc('==>'(Value)),
  277   fix_assert(_Time,Value,ValueO),
  278   assertz_if_new(user:ec_current_domain_db(ValueO,_)).
  279assert_ready(Type,Value):- 
  280   pprint_ecp(Type,Value),
  281   mpred_fwc(Value),
  282   fix_assert(_Time,Value,ValueO),
  283   assertz_if_new(user:ec_current_domain_db(ValueO,_)).
  284
  285:- export_transparent(assert_ele/1).
  286assert_ele(EOF) :- notrace((EOF == end_of_file)),!.
  287assert_ele(SS):- notrace(is_list(SS)),!,maplist(assert_ele,SS).
  288assert_ele(I):- notrace(\+ callable(I)),!,assert_ele(uncallable(I)).
  289assert_ele(_):- notrace((echo_format('~N'), fail)).
  290assert_ele(translate(Event, Outfile)):- !, mention_s_l, echo_format('% translate: ~w  File: ~w ~n',[Event, Outfile]).
  291assert_ele(load(S0)):- !, assert_ele(load(changed,S0)).
  292assert_ele(include(S0)):- !, assert_ele(load(always,S0)).
  293assert_ele(load(How,S0)):- 
  294  resolve_local_files(S0,SS), 
  295  (SS\==[] ->
  296   maplist(cond_load_e(How), SS);
  297   pprint_ecp_cmt(red, load(How,S0))),!.
  298assert_ele(ec_current_domain_db(P)):- !, assert_ready(pl, ec_current_domain_db(P)).
  299
  300assert_ele(HB):- \+ compound_gt(HB, 0), !, assert_axiom(HB, []).
  301
  302assert_ele(HB):- HB=..[=, Function, Value],
  303  %get_functor(RelSpec,F), get_mpred_prop(Function,function),
  304  must(compound(Function)),
  305  append_term(Function,Value,Predicate), !,
  306  assert_ele(Predicate).
  307
  308assert_ele(HB):- HB=..[function, RelSpec, RetType], 
  309  append_term(RelSpec,RetType,PredSpec),
  310  assert_ele(functional_predicate(PredSpec)),
  311  %assert_ele(function(RelSpec)),
  312  get_functor(RelSpec,F),
  313  assert_ele(==>resultIsa(F, RetType)).
  314
  315assert_ele(HB):- HB=..[RelType,RelSpec],arg_info(domain,RelType,arginfo), !, 
  316  assert_ready(blue, HB),
  317  assert_ready(red, (==>(mpred_prop(RelSpec, RelType)))),
  318  must(set_mpred_props(RelSpec,RelType)).
  319
  320assert_ele(HB):- functor(HB,F, L), arg_info(abducible,F,Args),Args=..[v|ArgL], length(ArgL,L), !, assert_ready(yellow, ==>(HB)).
  321assert_ele(subsort(F, W)):- !, maplist(assert_ready(yellow),[sort(F),sort(W),subsort(F, W)]).
  322assert_ele(option(X,Y)):- set_ec_option(X,Y), maplist(assert_ready(yellow),[:- set_ec_option(X,Y)]).
  323assert_ele(xor(XORS)):- conjuncts_to_list(XORS,List),  !, assert_ready(red, ==>xor(List)).
  324assert_ele(t(F, W)):- !, maplist(assert_ready(yellow),[==>(sort(F)), ==>(t(F, W))]).
  325                                                    
  326  %locally(b_setval('$output_lang',[ec]), assert_ele(P)).
  327assert_ele('<->'(H,B)):- 
  328  pprint_ecp_cmt(green, '<->'(H,B)), !,
  329  assert_ele('->'(H,B)),
  330  assert_ele('->'(B,H)).
  331% assert_ele(not(holds_at(H,T))):- assert_ele(holds_at(neg(H),T)).
  332assert_ele(Cvt1):- cvt0(_T, Cvt1,Cvt2), Cvt1\=@=Cvt2, !, assert_ele(Cvt2).
  333
  334assert_ele(directive(F)):- !, assert_ele(next_axiom_uses(F)).
  335
  336assert_ele(initially(F)):- !, assert_axiom(initially(F),[]).
  337/*
  338assert_ele('->'(H,B)):- nonvar(B),
  339  B=(BP,(B1;B2)),!,
  340  assert_ele('->'(H,(BP,B1))), 
  341  must(assert_ele('->'(H,(BP,B2)))),!.
  342
  343assert_ele('->'(B,H)):- nonvar(B),
  344  B=(BP,(B1;B2)),!,
  345  assert_ele('->'((BP,B1),H)),assert_ele('->'((BP,B2),H)).
  346
  347assert_ele('->'(B,H)):- nonvar(B),B=((B1;B2)),!,assert_ele('->'(B1,H)),assert_ele('->'(B2,H)).
  348*/

  349
  350assert_ele('<-'(H,B)):- conjuncts_to_list(B,BL), !, must(assert_axiom(H,BL)).
  351% assert_ele((H :- B)):- (H=not(_);is_axiom_head(H)), !, conjuncts_to_list(B,BL), assert_axiom(H,BL).
  352assert_ele((H :- B)):- !,  assert_ready(pl, (H :- B)).
  353assert_ele(axiom(H,B)):- echo_format('~N'), !,
  354  correct_axiom_time_args(t,H,B,HH,BB),
  355  assert_ready(pl, axiom(HH,BB)).
  356assert_ele(HB):- correct_holds(outward,HB, HBC), HB\=@=HBC, !, assert_ele(HB).
  357
  358% , assert_ready(e, HB),
  359%assert_ele(SS):- syntx_term_check(SS),!.
  360
  361assert_ele('->'(Body,EffectAx)):- EffectAx=..[Effect|_],
  362  member(Effect,[initiates,terminates,releases]),
  363  conjuncts_to_list_body(Body, Conds), 
  364  assert_axiom(EffectAx, Conds).
  365assert_ele(EffectAx):- EffectAx=..[Effect|_],
  366  member(Effect,[initiates,terminates,releases]),
  367  assert_axiom(EffectAx, []).
  368
  369/*
  370assert_ele(if(happens(A,T),Holds)):- 
  371  assert_m_axiom(if(not(Holds),not(happens(A,T)))).
  372*/

  373assert_ele(happens(A,T)):-  !, assert_axiom(happens(A,T), [is_time(T)]).
  374
  375assert_ele('->'(B,H)):-  conjuncts_to_list_body(B,BL), !, assert_axiom(H,BL).
  376
  377assert_ele(H):- compound_name_arity(H, F, 2),
  378  needs_cononicalization(F),
  379  e_to_ec(H,P), !, assert_m_axiom(P).
  380assert_ele(not(H)):-  !,  assert_m_axiom(not(H)).
  381
  382assert_ele(SS):- echo_format('~N'), 
  383  assert_ready(red, SS).
  384
  385correct_axiom_time_args(Stem,H,B,HH,BB):- 
  386  visit_time_args(Stem,[],H,HH,Mid),
  387  visit_time_args(Stem,Mid,B,BBs,Out),
  388  append(BBs,Out,BB),!.
  389
  390/*
  391ForAll([event,animal,time],
  392 HoldsAt(DoneBy(event,animal),time) <->
  393 (Happens(event,time) &
  394  ((Exists([gate], event=Close(animal,gate))) |
  395   (Exists([animal1].  event=GetOff(animal,animal1)))|
  396   (Exists([animal1].  event=Mount(animal,animal1)))|
  397   (Exists([position].  event=Move(animal,position)))|
  398   (Exists([gate].  event=Open(animal,gate))) |
  399   (Exists([human1].  event=ThrowOff(animal,human1)))))).
  400*/

  401
  402cvt0(_, P, _):- \+ callable(P),!, fail.
  403cvt0(_, X\=Y, diff(X,Y)) :- !.
  404cvt0(_, X=Y, Equals):- !,as_equals(X,Y,Equals).
  405cvt0(T, holds_at(not(H),T),O):- !, cvt0(T, holds_at(neg(H),T), O).
  406%cvt0(T, P, call(P)):- predicate_property(P,foreign),!.
  407%cvt0(_, not(exists(_Vars, holds_at(P, Time))),not(holds_at(neg(P), Time))).
  408cvt0(_, holds_at(N,AT),initially(N)):- AT==0,!.
  409cvt0(T, not(I),not(O)) :- cvt0(T,I,O).
  410                                                    
  411
  412needs_cononicalization(',').
  413needs_cononicalization(';').
  414needs_cononicalization('exists').
  415needs_cononicalization('all').
  416needs_cononicalization('if').
  417needs_cononicalization('iff').
  418needs_cononicalization('equiv').
  419needs_cononicalization('implies').
  420needs_cononicalization('->').
  421needs_cononicalization('<->').
  422needs_cononicalization('and').
  423needs_cononicalization('xor').
  424needs_cononicalization('or').
  425needs_cononicalization('&').
  426needs_cononicalization('|').
  427needs_cononicalization('dia').
  428needs_cononicalization('box').
  429needs_cononicalization('cir').
  430needs_cononicalization(X):-  fix_predname(X, Y),!, X\==Y, needs_cononicalization(X).
  431
  432
  433
  434
  435negations_inward_to_list(C,L):- negations_inward(C,I),conjuncts_to_list(I, L).
  436%  must(convert_to_axiom(lsvm(L,F,Vs,M),HB,NEWHB)),
  437%  do_process_ec(assert_ele,M, NEWHB),
  438conjuncts_to_list_body(Body, Conds):- 
  439  conjuncts_to_list(Body, CondsL),
  440  maplist(negations_inward_to_list,CondsL,CondsLI),
  441  append(CondsLI,Conds).
  442  
  443
  444
  445assert_ele_clauses(X,L,L):- is_list(L), !, 
  446 length(L,N), 
  447 ((N > 19, false )
  448  -> 
  449   (assert_ready(magenta,
  450         todo_later1(N,X)),
  451     maplist(pprint_ecp_cmt(blue),L),
  452      sleep(1.0))
  453   ; maplist(assert_ele_clauses(X,L),L)).
  454
  455
  456assert_ele_clauses(_X,_L,(H:-B)):- !,
  457  pprint_ecp_cmt(red,(H:-B)),
  458  conjuncts_to_list_body(B, BL),
  459  assert_axiom(H , BL).
  460assert_ele_clauses(_X,_L,H):-  
  461  assert_axiom(H , []). 
  462
  463assert_m_axiom(X):- 
  464  pprint_ecp_cmt(green, X),
  465  with_output_to(string(_), clausify_pnf(X,Conds)), 
  466  conjuncts_to_list(Conds,CondsL),
  467  assert_ele_clauses(X,CondsL,CondsL).
  468
  469:- export_transparent(assert_axiom/2).
  470assert_axiom(EffectAx, append3(L1,L2,LL)):- 
  471   conjuncts_to_list_body(L1,LL1),conjuncts_to_list_body(L2,LL2),
  472   append([LL1,LL2,LL],L12),!,
  473   assert_axiom(EffectAx, L12).
  474
  475assert_axiom(EffectAx, B) :- \+ is_list(B), !,
  476  conjuncts_to_list_body(B,Bs),
  477  assert_axiom(EffectAx, Bs).
  478
  479assert_axiom(Conds, []):- is_list(Conds),!,
  480   maplist(assert_ele,Conds).
  481assert_axiom(happens(A,T), []):- !,
  482   assert_axiom(happens(A,T), [is_time(T)]).  
  483
  484assert_axiom(Conds, [happens(A,T)]):-
  485   conjuncts_to_list(Conds, B ), 
  486   functors_are(\+ happens, B), !,
  487   assert_axiom(requires(A,T),Conds),!.
  488
  489assert_axiom(EffectAx, Some) :- 
  490    show_fix_axiom_head(Time,EffectAx,New),    
  491    New\=@=EffectAx, !,
  492    must_maplist(show_fix_axiom_head(Time),Some,SomeL),
  493    must(assert_axiom(New, SomeL)).
  494
  495assert_axiom(H,B) :- 
  496    semi_legit_time(H,Time),
  497    maplist(show_fix_axiom_head(Time),B,BL),
  498    BL\=@=B,!,
  499    assert_axiom(H,BL).
  500
  501  
  502
  503assert_axiom(Conds, [happens(A,T)]):-
  504   conjuncts_to_list_body(Conds, B ), 
  505   functors_are(\+ happens, B), !,
  506   %trace,
  507   debug_var(when,T),
  508   assert_axiom(requires(A,T),holds_at(metreqs(A),T)),
  509   assert_axiom(holds_at(requirements(A),T),B).
  510
  511
  512assert_axiom(H,B):- compound_name_arity(H, F, 2), 
  513  needs_cononicalization(F), !,
  514  list_to_conjuncts(B, BB),
  515  assert_m_axiom('->'(BB,H)).
  516
  517
  518
  519
  520/*
  521assert_axiom(EffectAx, Some):- select(E,Some,Rest), E = (A;B), !, nnf(A,NotA), nnf(B,NotB),
  522   assert_axiom(EffectAx, append3(A,NotB,Rest)),
  523   assert_axiom(EffectAx, append3(B,NotA,Rest)).
  524*/

  525assert_axiom(EffectAx, Some):- use_proxy_kr, Some=[_,_|_],  member(E,Some), E = (_;_), 
  526   term_variables(E,Vars),
  527   gensym(disj_,Ref),
  528   P =.. [Ref|Vars],
  529   subst(Some,E,P,NewSome), !,
  530   assert_ele('->'(E,P)),
  531   assert_axiom(EffectAx, NewSome).
  532
  533assert_axiom(EffectAx, Some):- use_proxy_kr, select(E,Some,Rest), E = (_;_), Rest\==[], !,
  534   term_variables(E,Vars),
  535   gensym(disj_,Ref),
  536   P =.. [Ref|Vars],
  537   assert_ele('->'(E,P)),
  538   assert_axiom(EffectAx, [P|Rest]).
  539
  540assert_axiom(EffectAx, Some):- breakup_ors, select(E,Some,Rest), E = (A;B), !,
  541   assert_axiom(EffectAx, [A|Rest]),
  542   assert_axiom(EffectAx, [B|Rest]).
  543
  544assert_axiom(EffectAx, Some):- select(E,Some,Rest), E = (A,B), !,
  545   conjuncts_to_list_body((A,B), Conds),
  546   append(Conds,Rest,BReast),
  547   assert_axiom(EffectAx, BReast).
  548
  549
  550assert_axiom(EffectAx, B):-
  551  semi_legit_time(EffectAx,T),
  552  fix_goal(T,B,Bs), B\=@=Bs, !, 
  553  assert_axiom(EffectAx, Bs).
  554assert_axiom(EffectAx, B):-
  555  EffectAx=..[Effect,Event,Fluent,T],
  556  member(Effect,[initiates,terminates,releases]),
  557  assert_effect(Effect,Event,Fluent,T,B).
  558/*
  559assert_axiom((A1,A2), B):- 
  560  assert_axiom(A1, [possible(A2)|B]),
  561  assert_axiom(A2, [possible(A1)|B]).
  562assert_axiom(A1;A2, B):- 
  563  assert_axiom(A1, [not(A2)|B]),
  564  assert_axiom(A2, [not(A1)|B]).
  565*/

  566assert_axiom(H,B):- 
  567  assert_ele(axiom(H,B)).
  568
  569% Normals
  570assert_effect(Effect,Event,Fluent,T,B):- \+ callable(Event), !,
  571  EffectAx=..[Effect,Event,Fluent,T],
  572  assert_ele(axiom(EffectAx,B)).
  573assert_effect(Effect,(A1,A2),Fluent,T,B):- !,
  574   assert_effect(Effect,A1,Fluent,T,[possible(A2)|B]),
  575   assert_effect(Effect,A2,Fluent,T,[possible(A1)|B]).
  576assert_effect(Effect,(A1;A2),Fluent,T,B):- !,
  577   assert_effect(Effect,A1,Fluent,T,[possible(not(A2))|B]),
  578   assert_effect(Effect,A2,Fluent,T,[possible(not(A2))|B]).
  579assert_effect(Effect,Event,Fluent,T,B):-
  580  EffectAx=..[Effect,Event,Fluent,T],
  581  assert_ele(axiom(EffectAx,B)).
  582
  583breakup_ors:- fail.
  584use_proxy_kr:- fail.
  585
  586:- include(ec_nnf).
  587
  588
  589:- export_transparent(rect/0).    
  590
  591% recompiles and restart tests everytime source is updated
  592rect:- once(ect), % first run
  593   repeat,
  594   wait_for_input([current_input],Was,0.5), 
  595   make:modified_file(_Any),
  596   once(ect), 
  597   Was == [current_input]. 
  598
  599rect2:- 
  600   once(ect), % first 
  601   wait_for_input([current_input],Was,0.5), 
  602   ( \+ make:modified_file(_Any) -> rect2; 
  603   ( Was \== [current_input] -> rect2; true)). 
  604  
  605                         
  606
  607% event calc tests
  608:- export_transparent(ect/0).
  609ect:- call(call,ect1).
  610
  611:- export_transparent(ect1/0).
  612ect1:- 
  613   cls, make,  Out = cond_load_e(always),
  614 % call(Out, 'examples/FrankEtAl2003/Story1.e'),
  615 % call(Out, 'ecnet/GSpace.e'),
  616 % call(Out, 'ecnet/Diving.e'),
  617 % call(Out, 'ecnet/RTSpace.e'),
  618  call(Out, 'examples/AkmanEtAl2004/ZooWorld.e'),
  619  % call(Out, 'ectest/ec_reader_test_ecnet.e'),
  620   % call(Out, 'ecnet/SpeechAct.e'),
  621   %call(Out, 'ecnet/Kidnapping.e'),
  622   
  623   % cond_load_e(always,'examples/Mueller2006/Exercises/MixingPaints.e'),
  624   list_undefined,
  625   list_void_declarations,  
  626  !.
  627
  628
  629
  630fix_goal_add_on_arg(T, G, G0, [b(T,T2),b(T2,end)]):- G =.. [F,A], already_good(F,2), G0 =.. [F,A,T].%, next_t(T,T2).
  631fix_goal_add_on_arg(T, G, G0, [b(T,T2),b(T2,end)]):- G =.. [F,A,B], already_good(F,3), G0 =.. [F,A,B,T]. %, next_t(T,T2).
  632
  633
  634:- export_transparent(fix_goal/3).
  635
  636
  637to_axiom_head(T,G,GG) :-  notrace(fix_axiom_head(T,G,GG)),!.
  638to_axiom_head(T,G,GG) :- fix_axiom_head(T,G,GG),!.
  639
  640
  641fix_goal(_, Nil,[]):- Nil==[],!.
  642fix_goal(T,[G|Gs],GGs):- !, fix_goal(T,G,G0),fix_goal(T,Gs,Gs0),append(G0,Gs0,GGs),!.
  643fix_goal(T,(G,Gs),GGs):- !, fix_goal(T,G,G0),fix_goal(T,Gs,Gs0),append(G0,Gs0,GGs),!.
  644fix_goal(T,{Gs},GGs):- !, fix_goal(T,Gs,GGs).
  645fix_goal(T, G, GGs):- fix_axiom_head(T,G,GG),!, listify(GG,GGs).
  646fix_goal(T, G, [Gs| TExtra]):- fix_goal_add_on_arg( T, G, Gs, TExtra),!.
  647fix_goal(T, G, [GGs]):- to_axiom_head(T,G,GGs),!.
  648fix_goal(T, G, [holds_at(G, T)]).
  649
  650
  651ec_to_ax(_, X,Y):-  (\+ callable(X) ; \+ compound(X)), !, X=Y.
  652%ec_to_ax(T, (Pre -> iff(HB,BH)), HBO):- ec_to_ax(T, (iff((Pre,HB),(Pre,BH))), HBO).
  653%ec_to_ax(T, or(Pre , '->'(HB,BH)), HBO):- ec_to_ax(T, '->'(or(Pre , HB),BH), HBO).
  654%ec_to_ax(T, (H<-B),O):- !, into_axiom(T,H,B,O).
  655ec_to_ax(T, '->'(B,H),O):- !, into_axiom(T,H,B,O).
  656ec_to_ax(T, '<->'(HB1,HB2),[A,B]):- !, ec_to_ax(T, '->'(HB1,HB2),A),ec_to_ax(T, '->'(HB2,HB1),B).
  657ec_to_ax(T, axiom(H,B),O):- into_axiom(T,H,B,O), !.
  658ec_to_ax(_, axiom(H,B), axiom(H,B)):- !.
  659ec_to_ax(T, X,Y):- fix_axiom_head(T, X,Y),X=Y,!.
  660ec_to_ax(T, X,Y):- fix_axiom_head(T, X,XY),ec_to_ax(T, XY,Y).
  661ec_to_ax(_, X,X).
  662
  663to_axiom_body(T,G,GGs) :-  fix_goal(T,G,GGs).
  664
  665%into_axiom(T,H,happens(E,T),OUT):- into_axiom(T,not(happens(E,T)),not(H),OUT).
  666into_axiom(T,H,B,'->'(ABNonList,AH)):- to_axiom_head(T1,H,AH),
  667  to_axiom_body(T2,B,AB),!,ignore(T=T1),ignore(T2=T1),
  668  list_to_conjuncts(AB, ABNonList),!.
  669
  670
  671
  672
  673
  674as_equals(X,Y,equals(X,Y)).
  675as_equals(X,Y,Equals):- compound(X),append_term(X,Y, Equals).
  676as_equals(X,Y,equals(X,Y)).
  677
  678
  679syntx_term_check(G):- clause(G,_).
  680syntx_term_check(G):- clause(ec_current_domain_db(G, _),_).
  681
  682functor_skel(G,P):- compound(G), compound_name_arity(G,F,A), compound_name_arity(P,F,A),!.
  683functor_skel(G,P):- atom(G),P=G.
  684
  685between_r(H,L,N):- nonvar(N),!,between(L,H,N).
  686between_r(H,L,N):- Hm1 is H - L, !, between(L,H,NN), N is NN + Hm1.
  687
  688can_be_time_arg(Var):- var(Var),!.
  689can_be_time_arg(_+_):-!.
  690can_be_time_arg(_-_):-!.
  691can_be_time_arg(A):- atom(A).
  692
  693semi_legit_time(V):- \+ compound_gt(V,0), !, fail.
  694semi_legit_time(happens(_,T1),T1).
  695semi_legit_time(happens(_,_,T2),T2):- can_be_time_arg(T2).
  696semi_legit_time(happens(_,T1,_),T1):- can_be_time_arg(T1).
  697semi_legit_time(not(Holds),T):- !, semi_legit_time(Holds,T).
  698semi_legit_time(Holds1,T1):- 
  699   functor(Holds1,F,_),
  700   time_arg(F,N),
  701   arg(N,Holds1,T1).
  702semi_legit_time(Holds1,T1):- 
  703   functor(Holds1,_,A), 
  704   member(P1,[number,string,atom]),
  705   (arg(A,Holds1,T1);arg(_,Holds1,T1)), 
  706   T1\==[], call(P1,T1).
  707
  708:- export_transparent(compare_on_time_arg/3).
  709compare_on_time_arg(Result,Holds1,Holds2):- 
  710   (((semi_legit_time(Holds1,T1),semi_legit_time(Holds2,T2),
  711      compare(Result,T1,T2), Result\== (=))) 
  712     -> true;
  713        compare_on_time_arg(Result,Holds1,Holds2)).
  714
  715time_arg(b, N):- between(1,2,N).
  716time_arg(beq, N):- between(1,2,N).
  717time_arg(holds_at, 2).
  718time_arg(is_time, 1).
  719time_arg(happens, N):- between_r(3,2,N), N\=1.
  720time_arg(clipped, N):- between_r(3,1,N), N\=2.
  721time_arg(declipped, N):- between_r(3,1,N), N\=2.
  722
  723:- export_transparent(fix_time_args/3).
  724fix_time_args(T,G,Gss):- \+ is_list(G), conjuncts_to_list_body(G, Gs), !,fix_time_args(T,Gs,Gss)   .
  725fix_time_args(T,[G|Gs],Gss):- 
  726  semi_legit_time(G,ST),
  727  fix_time_args1(ST,[G|Gs],Gs0),
  728  fix_time_args2(T,Gs0,Gss).
  729
  730fix_time_args2(_,Gs,Gss):-
  731  Gss = [b(start,now),b(now,aft),b(aft,end)|Gs].
  732
  733visit_time_args(_,In,[],[],In).
  734visit_time_args(Stem,In,[G|Gs],[GO|GsO],Out):- !, 
  735    visit_time_args(Stem,In,G,GO,Mid),
  736    visit_time_args(Stem,Mid,Gs,GsO,Out).
  737visit_time_args(Stem,In,holds_at(A,T1),holds_at(A,T1R),Out):- 
  738   correct_time_arg(Stem,In,T1,T1R,Out).
  739visit_time_args(Stem,In,happens(A,T1,T2),happens(A,T1R,T2R),Out):- 
  740   correct_time_arg(Stem,In,T1,T1R,B0),
  741   correct_time_arg(Stem,B0,T2,T2R,Out).
  742visit_time_args(Stem,In,happens(A,T1),happens(A,T1R),Out):- 
  743   correct_time_arg(Stem,In,T1,T1R,Out).
  744visit_time_args(Stem,In,b(T1,T2),b(T1R,T2R),Out):- 
  745   correct_time_arg(Stem,In,T1,T1R,B0),
  746   correct_time_arg(Stem,B0,T2,T2R,Out).
  747visit_time_args(Stem,In,not(G),not(GG),Out):- !, visit_time_args(Stem,In,G,GG,Out).
  748visit_time_args(Stem,In,beq(T1,T2),beq(T1R,T2R),Out):- 
  749   correct_time_arg(Stem,In,T1,T1R,B0),
  750   correct_time_arg(Stem,B0,T2,T2R,Out).
  751visit_time_args(Stem,In,clipped(T1,A,T2),clipped(T1R,A,T2R),Out):- 
  752   correct_time_arg(Stem,In,T1,T1R,B0),
  753   correct_time_arg(Stem,B0,T2,T2R,Out).
  754visit_time_args(Stem,In,declipped(T1,A,T2),declipped(T1R,A,T2R),Out):- 
  755   correct_time_arg(Stem,In,T1,T1R,B0),
  756   correct_time_arg(Stem,B0,T2,T2R,Out).
  757visit_time_args(_,In,G,G,In).
  758
  759correct_time_arg(_Stem,In, TN, TN, In):- var(TN), !.
  760correct_time_arg(_Stem,In, TN, TN, In):- atom(TN), !.
  761correct_time_arg(Stem, In, TN, TpN, Out):- number(TN), !, correct_time_arg(Stem,In, Stem+TN, TpN, Out).
  762correct_time_arg(_Stem,In, v, _, In):- !.
  763correct_time_arg(_Stem,In, TN, TpN, In):- lookup_time_val(TN,TpN,In),!.
  764correct_time_arg(Stem,In, TN, TpN, [ignore(TN=TpN)|Out]):-  number(TN), !, correct_time_arg(Stem,In, Stem+TN, TpN, Out).
  765correct_time_arg(Stem,In, T-N, TpN, Out):- number(N), N<0, NN is abs(N),!,correct_time_arg(Stem,In, T+NN, TpN, Out).
  766correct_time_arg(Stem,In, T+N, TpN, Out):- number(N), N<0, NN is abs(N),!,correct_time_arg(Stem,In, T-NN, TpN, Out).
  767correct_time_arg(Stem,In, Now+N, T, [ignore(Now+N=T)|Out]):- concat_time_arg_syms, number(N), N>1, NN is N-1, correct_time_arg(_Stem,In, Now+1, Tm2, Mid),
  768  correct_time_arg(Stem, Mid, Tm2+NN, T, Out).
  769correct_time_arg(Stem,In, Now-N, T, [ignore(Now-N=T)|Out]):- concat_time_arg_syms, number(N), N<1, NN is N+1, correct_time_arg(_Stem,In, Now-1, Tm2, Mid),
  770  correct_time_arg(Stem, Mid, Tm2-NN, T, Out).
  771correct_time_arg(_Stem,In, T+0, T, In):-!.
  772correct_time_arg(_Stem,In, T-0, T, In):-!.
  773correct_time_arg(_Stem,In, T-N, TN, Out):- !, t_plus_or_minus_1(In, T-N, TN, Out).
  774correct_time_arg(_Stem,In, T+N, TN, Out):- !, t_plus_or_minus_1(In, T+N, TN, Out).
  775correct_time_arg(_Stem,In, TN, TN, In).
  776
  777concat_time_arg_syms:- fail.
  778
  779lookup_time_val(TN,TpN,In):- copy_term(TN,TNS),member(ignore(TNS=TpN),In),TNS=@=TN,!.
  780
  781t_plus_or_minus_1(In, TN, TpN, In):- lookup_time_val(TN,TpN,In).
  782t_plus_or_minus_1(In, T+1, TN, In):- memberchk(b(T,TN),In),!.
  783t_plus_or_minus_1(In, T-1, TN, In):- memberchk(b(TN,T),In),!.
  784t_plus_or_minus_1(In, T-1, TN, [b(TN,T),ignore(T-1=TN)|In]):- next_t(TN,T),!.
  785t_plus_or_minus_1(In, T+1, TN, [b(T,TN),ignore(T+1=TN)|In]):- next_t(T,TN),!.
  786t_plus_or_minus_1(In, T+N, TN, [b(T,TN),ignore(T+N=TN)|In]):- atom_concat(T,N,TN).
  787t_plus_or_minus_1(In, T-N, TN, [b(TN,T),ignore(T-N=TN)|In]):- atomic_list_concat([T,N],minus,TN).
  788
  789
  790next_t(t,start).
  791next_t(start,now).
  792next_t(now,aft).
  793next_t(aft,Aft_1):- var(Aft_1),!,gensym(aft_,Aft_1).
  794
  795
  796fix_time_args1(T,G,Gs):- 
  797  visit_time_args(T,[],G,Gs,_Mid).
  798
  799
  800
  801already_good(happens, 2).
  802already_good(happens, 3).
  803already_good(holds_at, 2).
  804already_good(b, 2).
  805already_good(is, 2).
  806already_good(diff, 2).
  807already_good(dif, 2).
  808already_good(terms_or_rels,3).
  809already_good(F,A):- functor(P,F,A),syntx_term_check(abducible(PP)),compound(PP),PP=P.
  810already_good(F,A):- functor(P,F,A),syntx_term_check(predicate(PP)),compound(PP),PP=P.
  811
  812
  813
  814%predicate, option range load fluent event noninertial xor completion
  815
  816
  817%special_directive('!').
  818%special_directive('neg').
  819
  820% builtin_pred(releasedAt).
  821
  822%xfr_body(true,[]).
  823
  824
  825
  826:- export_transparent(get_linfo/1).

  827get_linfo(lsvm(L,F,Vs,M)):- 
  828  quietly((must(s_l(F,L)),!,
  829  '$current_source_module'(M),
  830  nb_current('$variable_names',Vs))).
  831
  832
  833:- export_transparent(process_ec/1).

  834:- export_transparent(process_ec/1).
  835process_ec( HB ):- notrace(must(get_linfo(T))), process_ec( T, HB ).
  836%:- export_transparent(process_ec/2).
  837%process_ec( _, HB , T):- !,process_ec( T, HB ).
  838
  839:- export_transparent(process_ec/2).
  840:- export_transparent(process_ec/2).
  841process_ec( _, HB ):- assert_ele(HB).
  842
  843process_ec( lsvm(L,S,Vs,M), HB ):-  
  844  must(convert_to_axiom(lsvm(L,S,Vs,M),HB,NEWHB)),
  845  do_process_ec(assertz,M, NEWHB).
  846
  847merge_into_body(X,_Y,Z):- Z = X.
  848
  849:- export_transparent(do_process_ec/3).
  850:- export_transparent(do_process_ec/3).
  851do_process_ec(_Why, M, NonCallable) :- assertion((current_module(M),callable(NonCallable))), fail.
  852do_process_ec(Why, M, NEWHB):- is_list(NEWHB), !, maplist(do_process_ec(Why, M), NEWHB).
  853do_process_ec(_Why, M, (:- GOAL)):- !, must(M:GOAL).
  854do_process_ec(_Why, M, (?- GOAL)):- !, (M:forall(GOAL, true)).
  855% How to? M:assertz('$source_location'(S, L):NEWHB),
  856%do_process_ec(Why, M, NEWHB):- wdmsg(do_process_ec(Why, M, NEWHB)),fail.
  857do_process_ec(Why, M, NEWHB):- M:call(Why, NEWHB).
  858
  859:- export_transparent(convert_to_axiom/3).
  860convert_to_axiom(T, M:H, [M:HH]):- !, convert_to_axiom(T, H, HH).
  861convert_to_axiom(T, (H:-B),[(HH:- B)]):- !, convert_to_axiom(T, H,HH).
  862convert_to_axiom(_, abducible(H), abducible(H)):- !.
  863convert_to_axiom(_, t(C, E), List):- !, to_fact_head([sort(C),t(C, E)],List).
  864
  865convert_to_axiom(L,[H|T],ABC):- % trace, 
  866   once((convert_to_axiom(L,H,A), convert_to_axiom(L,T,B),append(A,B,AB))), 
  867   AB\=@= [H|T],
  868   convert_to_axiom(L,AB,ABC).
  869
  870convert_to_axiom(T, (Pre -> '<->'(HB,BH)), HBO):-
  871  convert_to_axiom(T, ('<->'((Pre,HB),(Pre,BH))), HBO),!.
  872
  873convert_to_axiom(T, '<->'(HB,BH), HBOO):-
  874  convert_to_axiom(T, '->'(HB,BH), HBO1),
  875   convert_to_axiom(T, '<-'(HB,BH), HBO2),
  876  flatten([HBO1,HBO2],HBO),
  877  convert_to_axiom1(T,HBO,HBOO),!.
  878
  879convert_to_axiom(T, exists(Vars,B->H), HBO):- conjoin(H,some(Vars),Conj), !, convert_to_axiom(T, B -> Conj , HBO).
  880%convert_to_axiom(T, exists(Vars,Info), HBO):- !, convert_to_axiom(T, Info, HB), 
  881%  merge_into_body(HB,some(Vars),HBO).
  882
  883%  compound_name_arity(P,F,A),compound_name_arity(PP,F,A).
  884
  885
  886convert_to_axiom(T, X, O):- nop(debug_var('AxTime',Time)), ec_to_ax(Time, X,Y), 
  887  (is_list(Y)->convert_to_axiom1(T, Y, O); (X\=Y -> convert_to_axiom(T, Y, O);convert_to_axiom1(T, Y, O))), !.
  888convert_to_axiom(T, Y, O):- convert_to_axiom1(T, Y, O).
  889
  890% convert_to_axiom1(T, '->'(E,B), HBO2):- convert_to_axiom(T, precond(B,E), HBO2).
  891to_fact_head(H,List):- H=List.
  892
  893
  894convert_to_axiom1(_, EOF, []) :- EOF = end_of_file,!.
  895convert_to_axiom1(T, P, O):- is_axiom_head(P),!, convert_to_axiom1(T, axiom(P), O).
  896convert_to_axiom1(T, axiom(P), O):- convert_to_axiom1(T, axiom(P ,[]), O).
  897convert_to_axiom1(_LSV, axiom(X,Y), [axiom(X,Y)]).
  898convert_to_axiom1(LSV, Pred, [ec_current_domain_db(Pred,LSV)]).
  899
  900
  901is_axiom_head(P):- compound_name_arity(P,F,_), arg_info(axiom_head,F,_),!.
  902is_axiom_head(P):- functor_skel(P, G), syntx_term_check(predicate(G)),!.
  903
  904
  905arg_info(domain,fluent,arginfo).
  906arg_info(domain,predicate,arginfo).
  907arg_info(domain,function,arginfo).
  908arg_info(domain,functional_predicate,arginfo).
  909arg_info(domain,event,arginfo).
  910
  911arg_info(domain,reified_sort,arginfo).
  912
  913arg_info(abducible,noninertial,v(pred)).
  914arg_info(abducible,completion,v(pred)).
  915
  916arg_info(abducible,sort,v(sort)).
  917arg_info(abducible,subsort,v(sort,sort)).
  918arg_info(abducible,range,v(atomic,int,int)).
  919arg_info(abducible,t,v(sort,term)).
  920%arg_info(domain,axiom,v(axiom,list)).
  921
  922arg_info(axiom_head,happens,v(event,time)).
  923arg_info(axiom_head,holds_at,v(fluent,time)).
  924arg_info(axiom_head,initially,v(fluent)).
  925arg_info(axiom_head,initiates,v(event,fluent,time)).
  926arg_info(axiom_head,terminates,v(event,fluent,time)).
  927arg_info(axiom_head,releases,v(event,fluent,time)).
  928arg_info(axiom_head,trajectory,v(fluent,time,fluent,offset)).
  929%arg_info(axiom_head,releasesAt,v(fluent,time)).
  930
  931correct_ax_args(T,F,A,Args,axiom_head,_Arity,N, PP):-  N is A +1 ,!, append(Args,[T],NewArgs), PP =.. [F|NewArgs].
  932correct_ax_args(_T,F,A,Args,axiom_head,_Arity,N,PP):- A=N, PP =.. [F|Args].
  933correct_ax_args(_T,F,1,Args,domain,arginfo,0,PP):- PP =.. [F|Args].
  934correct_ax_args(_T,F,2,[P,R],domain,arginfo,0,PP):- append_term(P,R,AB),PP =.. [F,AB].
  935%orrect_ax_args(_4456,function,2,[side1(portal),location],domain,arginfo,0,_4470))
  936
  937%correct_ax_args(_T,initiates,2,[go(_1694),at(_1694)],axiom_head,3,v(event,fluent,time),_1684)
  938%failed_must(correct_ax_args(_T,initiates,2,[go(_1694),at(_1694)],axiom_head,3,v(event,fluent,time),_1684))
  939
  940
  941
  942
  943
  944
  945
  946
  947needs_process_axiom(C):- \+ compound(C), !, fail.
  948needs_process_axiom(axiom(_,_)).
  949needs_process_axiom(axiom(_)).
  950needs_process_axiom(abducible(_)).
  951needs_process_axiom(executable(_)).
  952needs_process_axiom(P):- compound_name_arity(P,F,A),needs_process_axiom_fa(F,A).
  953
  954needs_process_axiom_fa(F,_):- arg_info(_,F,_).
  955needs_process_axiom_fa(iff,2).
  956needs_process_axiom_fa('<-',2).
  957needs_process_axiom_fa('->',2).
  958
  959
  960:- export_transparent(needs_proccess/2).
  961needs_proccess(PA,_):- \+ compound(PA),!,fail.
  962needs_proccess(PA, process_ec):- needs_process_axiom(PA),!.
  963needs_proccess((H :- _B),How):- nonvar(H),!,needs_proccess(H,How).
  964needs_proccess( _M:H, How):- nonvar(H),!,needs_proccess(H,How).
  965
  966
  967
  968:- export_transparent(hook_ec_axioms/2).
  969:- export_transparent(hook_ec_axioms/2).
  970
  971:- (prolog:(import(hook_ec_axioms/2))).
  972
  973hook_ec_axioms(What, File):- var(File), !, current_input(Input), hook_ec_axioms(What, Input).
  974hook_ec_axioms(What, file(_File,AbsFile)):- !, hook_ec_axioms(What, file(AbsFile)).
  975hook_ec_axioms(What, file(AbsFile)):- !, hook_ec_axioms(What, AbsFile).
  976hook_ec_axioms(What, File):- fail, 
  977    prolog_load_context(module, M),
  978    dmsg(hook_ec_axioms(M, What, File)),fail.
  979hook_ec_axioms(_What, _File):- !.
  980/*
  981hook_ec_axioms(_What, File):- atom(File), exists_file(File),
  982    forall(((clause(axiom(_, _), _Body, Ref), File==S)),
  983       erase(Ref)),!.
  984*/

  985
  986:- multifile(user:message_hook/3).
  987:- dynamic(user:message_hook/3).
  988:- export_transparent(user:message_hook/3).
  989user:message_hook(load_file(start(_Level, File)),_,_):- hook_ec_axioms(load,File),fail.
  990user:message_hook(include_file(start(_Level, File)),_,_):- hook_ec_axioms(include,File),fail.
  991:- multifile(prolog:make_hook/2).
  992:- export_transparent(prolog:make_hook/2).
  993prolog:make_hook(before, Files):-  maplist(hook_ec_axioms(make(before)),Files), fail.
  994
  995:- multifile prolog:message//1.
  996prolog:message(welcome) -->  {hook_ec_axioms(welcome, welcome),fail}.
  997
  998
  999
 1000
 1001
 1002:- multifile(user:term_expansion/4).
 1003:- dynamic(user:term_expansion/4).
 1004:- export_transparent(user:term_expansion/4).
 1005:- user:import(ec_loader:needs_proccess/2).
 1006:- user:import(ec_loader:process_ec/2).
 1007user:term_expansion(In,P,Out,PO):- 
 1008  notrace((nonvar(P),compound(In), In\=(:- _), 
 1009      needs_proccess(In, Type),PO=P)),
 1010  Out = ( :- call(Type, In) )