34
41
42:- module(planner_external_interface, [
43 planner_program/2,
44 planner_workspace/2,
45 planner_workspace_program/3,
46 planner_requirement/3,
47 planner_init/3,
48 planner_predicate/3,
49 planner_function/3,
50 planner_type/3,
51 planner_object/3,
52 planner_derived/4,
53 planner_axiom/3,
54 planner_action/4,
55 planner_copy_workspace/2,
56 planner_load_file/2,
57 planner_current_program/1,
58 planner_add_program/1,
59 planner_remove_program/1,
60 planner_current_workspace/1,
61 planner_add_workspace/1,
62 planner_remove_workspace/1,
63 planner_current_workspace_program/2,
64 planner_add_workspace_program/2,
65 planner_remove_workspace_program/2,
66 planner_current_requirement/2,
67 planner_add_requirement/2,
68 planner_remove_requirement/2,
69 planner_current_init/2,
70 planner_add_init/2,
71 planner_remove_init/2,
72 planner_current_predicate/2,
73 planner_add_predicate/2,
74 planner_remove_predicate/2,
75 planner_current_function/2,
76 planner_add_function/2,
77 planner_remove_function/2,
78 planner_current_type/2,
79 planner_add_type/2,
80 planner_remove_type/2,
81 planner_current_object/2,
82 planner_add_object/2,
83 planner_remove_object/2,
84 planner_current_derived/3,
85 planner_add_derived/3,
86 planner_remove_derived/3,
87 planner_current_axiom/2,
88 planner_add_axiom/2,
89 planner_remove_axiom/2,
90 planner_current_action/3,
91 planner_add_action/3,
92 planner_remove_action/3,
93 planner_get_plan/3,
94 planner_get_plan/4,
95 planner_apply_step/3,
96 planner_apply_step/4,
97 ensure_external_planners/0,
98 planner_debug/1,
99 make_api/0
100
101 ]).
102
103make_api:-
104 maplist(make_one_api,
105 [program/2, % program(Program)
106 workspace/2, % workspace(Opr,W)
107 workspace_program/3, % workspace_program(Opr,W,Program)
108 requirement/3, % requirement(Opr,W,Require)
109 init/3, % init(Opr,W,Fact)
110 predicate/3, % predicate(Opr,W,Predicate)
111 function/3, % function(Opr,W,Function)
112 type/3, % type(Opr,W,Sort)
113 object/3, % object(Opr,W,Object)
114 derived/4, % derived(Opr,W,Fact,Conditions)
115 axiom/3, % axiom(Opr,W,Axiom)
116 action/4]). % action(Opr,W,Action,Info)
117make_exports:-
118 maplist(make_one_export,
119 [program/2, % program(Program)
120 workspace/2, % workspace(Opr,W)
121 workspace_program/3, % workspace_program(Opr,W,Program)
122 requirement/3, % requirement(Opr,W,Require)
123 init/3, % init(Opr,W,Fact)
124 predicate/3, % predicate(Opr,W,Predicate)
125 function/3, % function(Opr,W,Function)
126 type/3, % type(Opr,W,Sort)
127 object/3, % object(Opr,W,Object)
128 derived/4, % derived(Opr,W,Fact,Conditions)
129 axiom/3, % axiom(Opr,W,Axiom)
130 action/4]).
131
132make_one_export(F/Am1):- A is Am1-1,
133 make_one_export_fa(current,F,A),
134 make_one_export_fa(add,F,A),
135 make_one_export_fa(remove,F,A),!.
136
137make_one_export_fa(C,F,A):- format('\n planner_~w_~w/~w, ',[C,F,A]).
138
139make_one_api(F/4):- !,
140 make_one_api_34(current,"+Workspace, ?",F,nondet,"Gets each",?,", Conds"),
141 make_one_api_34(add,"+Workspace, +",F,det,"Adds one",+,", Conds"),
142 make_one_api_34(remove,"+Workspace, +",F,det,"Removes one",-,", Conds"),!.
143
144make_one_api(F/3):- !,
145 make_one_api_34(current,"+Workspace, ?",F,nondet,"Gets each",?,""),
146 make_one_api_34(add,"+Workspace, +",F,det,"Adds one",+,""),
147 make_one_api_34(remove,"+Workspace, +",F,det,"Removes one",-,""),!.
148
149make_one_api(F/2):- !,
150 make_one_api_2(current,"?",F,nondet,"Gets each",?,""),
151 make_one_api_2(add,"+",F,det,"Adds one",+,""),
152 make_one_api_2(remove,"+",F,det,"Removes one",-,""),!.
153
154make_one_api_2(Current,Mode,F,Det,String,Quest,ExtraArgs):-
155 make_one_api_234(Current,Mode,F,Det,String,Quest,"",ExtraArgs).
156make_one_api_34(Current,Mode,F,Det,String,Quest,ExtraArgs):-
157make_one_api_234(Current,Mode,F,Det,String,Quest,"Workspace, ",ExtraArgs).
158
159
160make_one_api_234(Current,Mode,F,Det,String,Quest,WSC,ExtraArgs):-
161 toPropercase(F,CapsF),
162 (Quest=='?' -> From = "contained in";
163 Quest=='+' -> From = "into";
164 Quest=='-' -> From = "from"),
165 upcase_atom(F,UP),
166 format('
167%! planner_~w_~w(~w~w~w) is ~w.
168%
169% ~w ~w ~w the Workspace.
170%
171% (PDDL''s :~w directive)
172%
173planner_~w_~w(~w~w~w):-
174 planner_~w(~w, ~w~w~w).
175
176',[Current,F,Mode,CapsF,ExtraArgs,Det,
177 String,CapsF,From,
178 UP,
179 Current,F,WSC,CapsF,ExtraArgs,
180 F,Quest,WSC,CapsF,ExtraArgs]).
189planner_current_program(Program):-
190 planner_program(?, Program).
199planner_add_program(Program):-
200 planner_program(+, Program).
209planner_remove_program(Program):-
210 planner_program(-, Program).
219planner_current_workspace(Workspace):-
220 planner_workspace(?, Workspace).
229planner_add_workspace(Workspace):-
230 planner_workspace(+, Workspace).
239planner_remove_workspace(Workspace):-
240 planner_workspace(-, Workspace).
249planner_current_workspace_program(Workspace, Workspace_Program):-
250 planner_workspace_program(?, Workspace, Workspace_Program).
259planner_add_workspace_program(Workspace, Workspace_Program):-
260 planner_workspace_program(+, Workspace, Workspace_Program).
269planner_remove_workspace_program(Workspace, Workspace_Program):-
270 planner_workspace_program(-, Workspace, Workspace_Program).
279planner_current_requirement(Workspace, Requirement):-
280 planner_requirement(?, Workspace, Requirement).
289planner_add_requirement(Workspace, Requirement):-
290 planner_requirement(+, Workspace, Requirement).
299planner_remove_requirement(Workspace, Requirement):-
300 planner_requirement(-, Workspace, Requirement).
309planner_current_init(Workspace, Init):-
310 planner_init(?, Workspace, Init).
319planner_add_init(Workspace, Init):-
320 planner_init(+, Workspace, Init).
329planner_remove_init(Workspace, Init):-
330 planner_init(-, Workspace, Init).
339planner_current_predicate(Workspace, Predicate):-
340 planner_predicate(?, Workspace, Predicate).
349planner_add_predicate(Workspace, Predicate):-
350 planner_predicate(+, Workspace, Predicate).
359planner_remove_predicate(Workspace, Predicate):-
360 planner_predicate(-, Workspace, Predicate).
369planner_current_function(Workspace, Function):-
370 planner_function(?, Workspace, Function).
379planner_add_function(Workspace, Function):-
380 planner_function(+, Workspace, Function).
389planner_remove_function(Workspace, Function):-
390 planner_function(-, Workspace, Function).
399planner_current_type(Workspace, Type):-
400 planner_type(?, Workspace, Type).
409planner_add_type(Workspace, Type):-
410 planner_type(+, Workspace, Type).
419planner_remove_type(Workspace, Type):-
420 planner_type(-, Workspace, Type).
429planner_current_object(Workspace, Object):-
430 planner_object(?, Workspace, Object).
439planner_add_object(Workspace, Object):-
440 planner_object(+, Workspace, Object).
449planner_remove_object(Workspace, Object):-
450 planner_object(-, Workspace, Object).
459planner_current_derived(Workspace, Derived, Conds):-
460 planner_derived(?, Workspace, Derived, Conds).
469planner_add_derived(Workspace, Derived, Conds):-
470 planner_derived(+, Workspace, Derived, Conds).
479planner_remove_derived(Workspace, Derived, Conds):-
480 planner_derived(-, Workspace, Derived, Conds).
489planner_current_axiom(Workspace, Axiom):-
490 planner_axiom(?, Workspace, Axiom).
499planner_add_axiom(Workspace, Axiom):-
500 planner_axiom(+, Workspace, Axiom).
509planner_remove_axiom(Workspace, Axiom):-
510 planner_axiom(-, Workspace, Axiom).
519planner_current_action(Workspace, Action, Conds):-
520 planner_action(?, Workspace, Action, Conds).
529planner_add_action(Workspace, Action, Conds):-
530 planner_action(+, Workspace, Action, Conds).
539planner_remove_action(Workspace, Action, Conds):-
540 planner_action(-, Workspace, Action, Conds).
541
542
543planner_copy_workspace(Workspace,NewWorkspace):-
544 (var(NewWorkspace)->gensym(Workspace,NewWorkspace);true),
545 forall(mdata:ws_data(Workspace,P,V),call_ws_data_hook(+,NewWorkspace,P,V)).
546
547planner_load_file(W,FileName):- planner_missing(planner_load_file(W,FileName)).
557planner_workspace(Opr,Workspace):-
558 call_settings_data(Opr,ws_data(Workspace,isa,tWorkspace)).
569planner_program(Opr,Program):- call_settings_data(Opr,current_planner_program(Program)).
570
571
572planner_data_template(current_planner_program(_Program)).
573planner_data_template(ws_data(_W,_P,_D)).
574
575pre_existing_clause(MData,R):- strip_module(MData,M,Data),
576 clause(M:Data,true,R),clause(MCData,true,R),strip_module(MCData,_,CData),Data=@=CData,!.
577
578:- dynamic(mdata:current_planner_program/1).
579:- dynamic(mdata:ws_data/3).
580
581to_mdata(Data,mdata:BData):- strip_module(Data,_,BData).
582
583call_ws_data_hook(Opr,W,Prop,DataL):-
584 check_opr(W,Opr),
585 forall(delistify_data(DataL,Data),
586 call_settings_data(Opr,ws_data(W,Prop,Data))).
587
588call_settings_data(Opr,Data):- to_mdata(Data,MData), call_settings_mdata(Opr,MData).
589call_settings_mdata(?,MData):- !, call(MData).
590call_settings_mdata(+,MData):- !, (pre_existing_clause(MData,_R)->true;
591 (asserta(MData),planner_debug(asserta(MData)))).
592call_settings_mdata(-,MData):- ignore(call(MData)),retractall(MData).
593
594delistify_data(DataL,Data):- is_list(DataL),!,member(Data,DataL).
595delistify_data(Data,Data).
596
598planner_workspace_program(Opr,W,Program):-
599 (call_settings_data(Opr,ws_data(W,program,Program))
600 *->true;
601 call_settings_data(Opr,current_planner_program(Program))).
602
603
605planner_requirement(Opr,W,Require):- call_ws_data_hook(Opr,W,requirement,Require).
606
608planner_init(Opr,W,Fact):-
609 glean_objs(Opr,W,Fact),
610 call_ws_data_hook(Opr,W,init,Fact).
611
613planner_predicate(Opr,W,Predicate):-
614 glean_types(Opr,W,Predicate),
615 call_ws_data_hook(Opr,W,predicate,Predicate).
616
618planner_function(Opr,W,Function):-
619 glean_types(Opr,W,Function),
620 call_ws_data_hook(Opr,W,function,Function).
621
623planner_type(Opr,W,Type):-
624 glean_types(Opr,W,Type),
625 call_ws_data_hook(Opr,W,type,Type).
626
628planner_object(Opr,W,Object):-
629 glean_types(Opr,W,Object),
630 call_ws_data_hook(Opr,W,object,Object).
631
633planner_derived(Opr,W,Fact,Cond) :- Cond==[], !, planner_init(Opr,W,Fact).
634planner_derived(Opr,W,Fact,Condition) :-
635 FULL= derived(Fact,Condition),
636 numbervars(FULL),
637 call_ws_data_hook(Opr,W,derived,FULL).
638
639
641planner_axiom(Opr,W,Axiom):- call_ws_data_hook(Opr,W,axiom,Axiom).
642
644planner_action(Opr,W,Action,InfoList):- glean_types(Opr,W,Action),
645 numbervars(InfoList),
646 planner_action_info(Opr,W,Action,InfoList),
647 !.
648
649planner_action_info(Opr,W,Action,InfoList):-
650 is_list(InfoList),!,maplist(planner_action(Opr,W,Action),InfoList).
651planner_action_info(Opr,W,Action,Type:Info):-!,
652 call_ws_data_hook(Opr,W,action,act_inf(Action,Type,Info)).
653planner_action_info(Opr,W,Action,Info):-
654 call_ws_data_hook(Opr,W,action,act_inf(Action,meta,Info)).
658planner_get_plan(W,Goal,Plan):-
659 planner_workspace_program(?,W,Planner),
660 planner_get_plan(Planner,W,Goal,Plan).
663planner_get_plan(Planner,W,Goal,Plan):-
664 check_workspace(W),
665 ignore(Plan=[s1,s2,s3]),
666 planner_missing(planner_get_plan(Planner,W,Goal,Plan)).
669planner_apply_step(W,Step,NewWorkspace):-
670 planner_workspace_program(?,W,Planner),
671 planner_apply_step(Planner,W,Step,NewWorkspace).
674planner_apply_step(Planner,W,Step,NewWorkspace):-
675 check_workspace(W),
676 (var(NewWorkspace)->gensym(W,NewWorkspace);true),
677 check_workspace(NewWorkspace),
678 planner_missing(planner_apply_step(Planner,W,Step,NewWorkspace)).
679
680
681ensure_external_planners.
682
683glean_types(Opr,W,Any):- Opr == +,!,
684 check_opr(W,Opr),
685 forall((sub_term(Sub,Any),
686 compound(Sub),member(Sub,[_-Type, Type:_])),
687 planner_type(Opr,W,Type)).
688glean_types(_,_,_).
689
690
691glean_objs(Opr,W,Any):- Opr == +,!,
692 forall((sub_term(Sub,Any),
693 compound(Sub),member(Sub,[Obj-_])),
694 planner_object(Opr,W,Obj)),
695 forall((sub_term(Obj,Any),
696 atom(Obj)),planner_object(Opr,W,Obj)).
697glean_objs(_,_,_).
698
699check_opr(W,+):- check_workspace(W).
700check_opr(W,del):- check_workspace(W).
701check_opr(W,?):- check_workspace(W).
702check_opr(_Workspace,Opr):- throw(opr_missing(Opr)).
703
704check_workspace(W):- mdata:ws_data(W,isa,tWorkspace),!.
705check_workspace(W):- asserta(mdata:ws_data(W,isa,tWorkspace)).
706
707planner_debug(Info):- format('~N% ~q.~n',[Info]).
708
709planner_missing(Goal):- !,planner_debug(g(Goal)).
710planner_missing(Goal):- throw(planner_missing(Goal)).
711
712
713