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
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)))), 95 !.
96
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).
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),!.
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)).
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 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 327assert_ele('<->'(H,B)):-
328 pprint_ecp_cmt(green, '<->'(H,B)), !,
329 assert_ele('->'(H,B)),
330 assert_ele('->'(B,H)).
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),[]).
349
350assert_ele('<-'(H,B)):- conjuncts_to_list(B,BL), !, must(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
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
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
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).
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).
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 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
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).
566assert_axiom(H,B):-
567 assert_ele(axiom(H,B)).
568
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
592rect:- once(ect), 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), 601 wait_for_input([current_input],Was,0.5),
602 ( \+ make:modified_file(_Any) -> rect2;
603 ( Was \== [current_input] -> rect2; true)).
604
605
606
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 615 616 617 618 call(Out, 'examples/AkmanEtAl2004/ZooWorld.e'),
619 620 621 622
623 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]. 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]. 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.
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
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
815
816
819
821
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 ).
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)).
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):- 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).
882
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
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)).
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)).
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].
936
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):- !.
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) )