12:-module(htncode,[]). 13
14
15:-multifile(user:push_env_ctx/0). 16:-dynamic(user:push_env_ctx/0). 17
22
23
24
26:- ensure_loaded(library(logicmoo_common)). 27:- ensure_loaded(library(planner_api)). 28:- use_module(library(logicmoo_planner)). 29
30:- kb_shared(baseKB:mpred_prop/3). 31
32:- ensure_loaded(library(logicmoo/util_structs)). 33:- ensure_loaded(library(logicmoo/util_bb_env)). 34:- prolog_load_context(file,File),ain(user:env_source_file(File)). 35
36:-op(500,fx,env_call). 38
44
45:- style_check(-singleton). 46:-use_module(library(system)). 47
49:- dynamic op_num/1.
50:- dynamic sum/1. 52:- dynamic methodC/7, operatorC/5, my_stats/1. 54:- dynamic tp_node/6,tn/6. 55:- dynamic solved_node/2. 56:- dynamic closed_node/6. 57:- dynamic gsubstate_classes/3. 58:- dynamic current_num/2. 59:- dynamic produce/4,goal_related/1. 61:- dynamic gsstates/3,gpred/2. 63:- dynamic kill_file/1,solution_file/1. 65:- op(100,xfy,'=>'). 66
67:- dynamic htn_task/3. 68:- multifile htn_task/3. 69:- dynamic planner_task/3. 70htn_task(Id,Goal,Init):-planner_task(Id,Goal,Init).
71
74:-dynamic sorts/2,
75 objects/2,
76 predicates/1,
77 atomic_invariants/1,
78 substate_classes/3,
79 method/6,
80 operator/4,
81 inconsistent_constraint/1. 82
90
91op_num(0).
92my_stats(0).
93solution_file(fred).
94
96solve(Id) :-
97 htn_task(Id,Goal,Init),
98 once(planner_interface(Goal,Init,Sol,_)),
107 clean.
108
109display_sol([]).
110display_sol([H|T]) :-
111 write(H),
112 nl,
113 display_sol(T).
114
115clean:-
116 retractall(op_num(_)),
117 retractall(current_num(_,_)),
118 retractall(node(_,_,_,_,_)),
119 retractall(tn(_,_,_,_,_,_)),
120 retractall(gpredicates(_,_)),
121 retractall(gsubstate_classes(_,_,_)),
122 retractall(methodC(_,_,_,_,_,_,_)),
123 retractall(operatorC(_,_,_,_,_)),
124 retractall(goal_related(_)),
125 retractall(produce(_,_,_,_)),
126 retractall(solved_node(_,_)),
127 retractall(tp_node(_,_,_,_,_,_)),
128 retractall(closed_node(_,_,_,_,_,_)),
129 retractall(score_list(_)),
130 assert(op_num(0)),
131 assert(my_stats(0)).
132
133planner_interface(G,I, SOLN,NODES):-
134 time(ground_hierarchy),
135 change_op_representation,
136 find_relate_state,
137 retract(op_num(_)),
138 assert(op_num(0)),
139 statistics(runtime,[_,Time]),
140 (retract(my_stats(_)) ; true),
141 assert(my_stats(Time)),
142 make_problem_into_node(I, G, Node),
143 assert(Node),
144 start_solve(SOLN,NODES).
145planner_interface(G,I, SOLN,NODES):-
146 tell(user),nl,write('failure in initial node'),!.
147
148
149
151
153getN_name(node(Name, _, _, _,_), Name).
154getN_pre(node(_,Pre, _, _, _), Pre).
155getN_decomp(node(_, _, Decomp,_,_), Decomp).
156getH_temp(node(_, _, _,Temps, _), Temps).
157getN_statics(node(_,_,_,_,Statics), Statics).
158
160start_solve(SOLN,NODES):-
161 kill_file(Kill),
162 file_exists(Kill).
164
165start_solve(Sol,OPNUM):-
166 retract(final_node(Node)),
167 retractall(current_num(_,_)),
168 getN_statics(Node,Statics),
169 statics_consist(Statics),
170 extract_solution(Node,Sol,SIZE),
171 statistics(runtime,[_,CP]),
172 TIM is CP/1000,
173 retract(op_num(OPNUM)),
174 assert(op_num(0)),
175 nl, nl, write('CPU Time = '),write(CP),nl,
176 write('TIME TAKEN = '),write(TIM),
177 write(' SECONDS'),nl,
178 write('Solution SIZE = '),write(SIZE),nl,
179 write('Operator Used = '),write(OPNUM),nl,
180 write('Solution:\n '),writeq(Sol),nl,
181 write('***************************************'),
182 assert(time_taken(CP)),
183 assert(soln_size(SIZE)),
184 assert(plan_used(OPNUM)),
185 retractall(tn(_,_,_,_,_,_)),!.
186
187start_solve(Sol,OPNUM):-
188 select_node(Node),
190 191 process_node(Node),
192 start_solve(Sol,OPNUM),!.
193start_solve(Sol,OPNUM):-
194 tell(user), write('+++ task FAILED +++'),
195 clean.
196
198
200process_node(Node) :-
201 getN_name(Node, Name),
202 getN_pre(Node, Pre),
203 getN_decomp(Node, Dec),
204 getH_temp(Node, Temps),
205 getN_statics(Node, Statics),
206 expand_decomp(Dec,Pre,Post,Temps,Temp1,Statics,Statics1,Dec1),
207 statics_consist(Statics),
208 assert_node(Name,Pre,Dec1,Temp1,Statics1).
209
210assert_node(Name,Pre,Decomp,Temp,Statics):-
211 all_HP_expanded(Decomp),
212 assert(final_node(node(Name,Pre,Decomp,Temp,Statics))),!.
213assert_node(Name,Pre,Dec,Temp,Statics):-
214 gensym_special(root,SYM),
215 assert(node(SYM,Pre,Dec,Temp,Statics)),!.
216
217all_HP_expanded([]):-!.
218all_HP_expanded([step(HPid,Name,_,_,exp(TN))|THPS]):-
219 all_HP_expanded(THPS),!.
221expand_decomp([],Post,Post,Temp,Temp,Statics,Statics,[]):-!.
223expand_decomp([step(HPid,Name,Pre0,Post0,exp(TN))|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,State1,Post1,exp(TN))|Decomp1]):-
224 state_achieved(Pre0,Pre,State1),
225 state_change(State1,Pre0,Post0,Post1),
226 statics_consist(Statics),
227 expand_decomp(Decomp,Post1,Post,Temp,Temp1,Statics,Statics1,Decomp1),!.
228
230expand_decomp([step(HPid,ACH,Pre0,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,Decomp1):-
231 ACH=..[achieve|_],
232 state_achieved(Pre0,Pre,State),
233 statics_consist(Statics),
234 expand_decomp_ach([step(HPid,ACH,State,Post0,unexp)|Decomp],State,Post,Temp,Temp1,Statics,Statics1,Decomp1),!.
261expand_decomp([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(TN))|Decomp1]):-
262 methodC(Name,Pre0,Post0,Statics0,Temp0,achieve(ACH),Dec0),
263 append_cut(Statics0,Statics,Statics2),
264 statics_consist(Statics2),
265 remove_unneed(Statics2,[],Statics3),
266 state_achieved(Pre0,Pre,State1),
268 statics_consist(Statics3),
269 apply_method1(HPid,TN,Name,State1,Pre0,ACH,Post0,State,Statics3,Temp0,Dec0),
274 retract(op_num(N)),
275 N1 is N+1,
276 assert(op_num(N1)),
278 expand_decomp(Decomp,State,Post,Temp,Temp1,Statics2,Statics1,Decomp1),!.
279
280
281
282
283
284
285
286
288expand_decomp([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(Name))|Decomp1]):-
289 operatorC(Name,Pre0,Post0,Cond,Statics0),
290 append_cut(Statics0,Statics,Statics2),
291 statics_consist(Statics2),
292 remove_unneed(Statics2,[],Statics21),
293 state_achieved(Pre0,Pre,State1),
294 state_change(State1,Pre0,Post0,State2),
295 cond_state_change(State2,Cond,State),
297 statics_consist_instance(Statics0),
299 retract(op_num(N)),
300 N1 is N+1,
301 assert(op_num(N1)),
302 expand_decomp(Decomp,State,Post,Temp,Temp1,Statics21,Statics1,Decomp1),!.
303
305expand_decomp([step(HP,N,Pre0,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,Decomp1):-
306 get_another_step(step(HP2,N2,Pre2,Post2,Exp),Pre,Statics,
307 HP,Temp,Temp2,Decomp,Decomp2),
308 expand_decomp([step(HP2,N2,Pre2,Post2,Exp),step(HP,N,Pre0,Post0,unexp)|Decomp2],Pre,Post,Temp2,Temp1,Statics,Statics1,Decomp1).
309
334
336get_another_step(A,Pre,Statics,HP,Temp,Temp1,[],Dec2):-fail.
337get_another_step(step(HP2,Name2,Pre2,Post2,Exp),Pre,Statics,HP,Temp,[before(HP2,HP)|Temp],Dec,Dec2):-
338 member(step(HP2,Name2,Pre2,Post2,Exp),Dec),
339 not(necessarily_before(HP,HP2, Temp)),
340 state_achieved(Pre2,Pre,_),
341 statics_consist(Statics),
342 list_take(Dec,[step(HP2,Name2,Pre2,Post2,Exp)],Dec2).
343
347expand_decomp_ach([step(HPid,ACH,Pre,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,Decomp1):-
348 state_achieved(Post0,Pre,State),
349 statics_consist(Statics),
352 remove_temp(Temp,HPid,Temp,Temp2),
353 expand_decomp(Decomp,State,Post,Temp2,Temp1,Statics,Statics1,Decomp1),!.
354
356expand_decomp_ach([step(HPid,ACH,Pre,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,ACH,Pre,Post0,exp(TN))|Decomp1]):-
357 expand_hp(HPid,TN,ACH,Pre,Post0,State,Statics,Statics2),
358 expand_decomp(Decomp,State,Post,Temp,Temp1,Statics2,Statics1,Decomp1),!.
359
361expand_hp(HPid,TN,ACH,Pre,Post,State,Statics,Statics1):-
362 direct_expand_hp(HPid,TN,ACH,Pre,Post,State,Statics,Statics1),!.
366expand_hp(HPid,TN,ACH,Pre,Post,State,Statics,Statics1):-
367 make_to_steps1(Pre,Post,Steps),
368 gensym_special(tp,TP),
369 get_all_related_goal(Post),
370 get_score(100,[],Steps,Score),
371 assert(tp_node(TP,Pre,Post,Statics,Score,Steps)),
372 fwsearch(TN,Statics1,State),
373 clean_temp_nodes.
374
378make_to_steps1(Pre,[],[]):-!.
379make_to_steps1(Pre,[se(Sort,Obj,SE)|Post],Steps):-
380 state_achieved([se(Sort,Obj,SE)],Pre,_),
381 make_to_steps1(Pre,Post,Steps),!.
382make_to_steps1(Pre,[se(Sort,Obj,SE)|Post],[step(HP,achieve(se(Sort,Obj,SE)),undefd,[se(Sort,Obj,SE)],unexp)|Steps]):-
383 objects(Sort,Objls), 384 gensym_special(hp,HP),
385 make_to_steps1(Pre,Post,Steps),!.
386make_to_steps1(Pre,[se(Sort,Obj,SE)|Post],[step(HP,achieve(se(Sort,Obj,SE)),undefd,[se(Sort,Obj,SE)],unexp)|Steps]):-
387 var(Obj),
388 gensym_special(hp,HP),
389 make_to_steps1(Pre,Post,Steps),!.
390make_to_steps1(Pre,[se(SortN,Obj,SE)|Post],[step(HP,achieve(se(PSort,Obj,SE)),undefd,[se(PSort,Obj,SE)],unexp)|Steps]):-
391 not(var(Obj)),
392 find_prim_sort(SortN,PSortls),
393 member(PSort,PSortls),
394 objects(PSort,Objls),
395 member(Obj,Objls),
396 gensym_special(hp,HP),
397 make_to_steps1(Pre,Post,Steps),!.
398
399
401get_all_related_goal(Goal):-
402 retractall(goal_related(_)),
403 assert(goal_related(Goal)),
404 get_all_related_goal1(Goal,States),
405 retractall(goal_related(_)),
406 assert(goal_related(States)),!.
408
409get_all_related_goal1([],States):-
410 setof(State,goal_related(State),States1),
411 set_flatten(States1,[],States),!.
412get_all_related_goal1([se(Sort,Obj,SE)|Rest],States):-
413 produce(se(Sort,Obj,SE1),A,OPre,ST),
414 state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
415 retract(goal_related(List)),
416 set_append_e(List,OPre,List1),
417 assert(goal_related(List1)),
418 fail.
419get_all_related_goal1([se(SortN,Obj,SE)|Rest],States):-
420 nonvar(Obj),
421 objects(Sort,Objls),
422 not(not(member(Obj,Objls))),
423 produce(se(Sort,Obj,SE1),A,OPre,ST),
424 state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
425 retract(goal_related(List)),
426 set_append_e(List,OPre,List1),
427 assert(goal_related(List1)),
428 fail.
429get_all_related_goal1([se(SortN,Obj,SE)|Rest],States):-
430 var(Obj),
431 find_prim_sort(SortN,Sortls),
432 member(Sort,Sortls),
433 produce(se(Sort,Obj,SE1),A,OPre,ST),
434 state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
435 retract(goal_related(List)),
436 set_append_e(List,OPre,List1),
437 assert(goal_related(List1)),
438 fail.
439get_all_related_goal1([se(Sort,Obj,SE)|Rest],States):-
440 get_all_related_goal1(Rest,States).
441
444take_out_achieved(Pre,[se(Sort,Obj,SE)],[],[se(Sort,Obj,SE)]):-!.
445take_out_achieved(Pre,[],Post,Post):-!.
448take_out_achieved(Pre,[se(Sort,Obj,ST)|Post],Post0,Post1):-
449 var(Obj),
450 append(Post0,[se(Sort,Obj,ST)],Post2),
451 take_out_achieved(Pre,Post,Post2,Post1),!.
452take_out_achieved(Pre,[se(Sort,Obj,ST)|Post],Post0,Post1):-
453 member(se(Sort,Obj,ST1),Pre),
454 append_diff(Sort,Obj,ST,ST1,Post0,Post2),
455 list_take(Pre,[se(Sort,Obj,ST1)],Pre2),
456 take_out_achieved(Pre2,Post,Post2,Post1),!.
457
459append_diff(Sort,Obj,ST,ST1,Post0,Post0):-
460 not_conflict(Sort,Obj,ST,ST1,STN),!.
461append_diff(Sort,Obj,ST,ST1,Post0,Post1):-
462 append(Post0,[se(Sort,Obj,ST)],Post1),!.
464
466direct_expand_hp(HPid,Tn0,ACH,Pre,Post,Pre1,Statics,Statics):-
467 tn(Tn0,Name,Pre0,Post0,Temp0,Decomp0),
468 state_achieved(Pre0,Pre,State1),
469 state_achieved(Post,Post0,_),
470 state_change(State1,Pre0,Post0,Pre1),
471 statics_consist(Statics),
473 retract(op_num(N)),
474 N1 is N+1,
475 assert(op_num(N1)),!.
477
480direct_expand_hp(HPid,Name,Name,Pre,Post,State,Statics,Statics1):-
481 operatorC(Name,Pre0,Post0,Cond,Statics0),
482 append_cut(Statics0,Statics,Statics1),
483 statics_consist(Statics11),
484 remove_unneed(Statics11,[],Statics1),
485 post_instant(Post0,Cond,Statics1,Post),
486 state_achieved(Pre0,Pre,State1),
487 state_change(State1,Pre0,Post0,State2),
488 cond_state_change(State2,Cond,State3),
489 state_achieved(Post,State3,State),
490 statics_consist_instance(Statics0),
493 retract(op_num(N)),
494 N1 is N+1,
495 assert(op_num(N1)),!.
496
499direct_expand_hp(HPid,Name,ACH,Pre,Post,State,Statics,Statics1):-
500 operatorC(Name,Pre0,Post0,Cond,Statics0),
501 append_cut(Statics0,Statics,Statics2),
502 statics_consist(Statics2),
503 remove_unneed(Statics2,[],Statics1),
504 post_instant(Post0,Cond,Statics1,Post),
505 state_achieved(Pre0,Pre,State1),
506 state_change(State1,Pre0,Post0,State2),
507 cond_state_change(State2,Cond,State3),
508 state_achieved(Post,State3,State),
509 statics_consist(Statics1),
512 retract(op_num(N)),
513 N1 is N+1,
514 assert(op_num(N1)),!.
515
518direct_expand_hp(HPid,TN,ACH,Pre,Post,State1,Statics,Statics1):-
519 methodC(Name,Pre0,Post0,Statics0,Temp0,achieve(ACH0),Dec0),
520 append_cut(Statics0,Statics,Statics2),
521 statics_consist(Statics2),
522 remove_unneed(Statics2,[],Statics1),
523 post_instant(Post0,[],Statics1,Post),
524 state_achieved(Pre0,Pre,Pre1),
525 state_achieved(Post,Post0,Post01),
526 statics_consist(Statics1),
527 apply_method1(HPid,TN,Name,Pre1,Pre0,ACH0,Post01,State1,Statics1,Temp0,Dec0),!.
528
532apply_method(HPid,TN,Name,Pre,Pre0,Post0,State,Statics,Temp,Dec):-
533 make_dec0(HPid,Dec,Temp,Dec0,Temp0),
534 expand_method(Dec0,Pre,Post,Temp0,Temp1,Statics,Statics1,Dec1),
535 state_achieved(Post0,Post,State),
536 statics_consist(Statics),
539 retract(op_num(N)),
540 N1 is N+1,
541 assert(op_num(N1)),
542 make_tn(TN,Name,Pre,State,Temp1,Dec1),!.
543
544make_dec0(HPid,Dec,Temp,Dec0,Temp0):-
545 make_dec01(HPid,1,Dec,Dec0),
546 change_temp(HPid,Temp,[],Temp0),!.
547make_dec1(HPid,Pre,ACH,Statics,Temp,Dec,Temp1,Dec1):-
548 state_achieved(ACH,Pre,_),
549 make_dec01(HPid,1,Dec,Dec1),
550 change_temp(HPid,Temp,[],Temp1).
551make_dec1(HPid,Pre,ACH,Statics,Temp,Dec,[before(STID0,STID1)|Temp1],[step(STID0,achieve(ACH),Pre,ACH,unexp)|Dec1]):-
552 gensym_num(HPid,0,STID0),
553 gensym_num(HPid,1,STID1),
554 make_dec01(HPid,1,Dec,Dec1),
555 change_temp(HPid,Temp,[],Temp1),!.
556
557make_dec01(HPid,_,[],[]):-!.
558make_dec01(HPid,Num,[HDec|TDec],[step(STID,HDec,undefd,undefd,unexp)|TDec0]):-
559 operatorC(HDec,_,_,_,_),
560 gensym_num(HPid,Num,STID),
561 Num1 is Num + 1,
562 make_dec01(HPid,Num1,TDec,TDec0).
563make_dec01(HPid,Num,[HDec|TDec],[step(STID,HDec,undefd,undefd,unexp)|TDec0]):-
564 methodC(HDec,_,_,_,_,_,_),
565 gensym_num(HPid,Num,STID),
566 Num1 is Num + 1,
567 make_dec01(HPid,Num1,TDec,TDec0).
568
569change_temp(HPid,[],Temp2,Temp2):-!.
570change_temp(HPid,[before(N1,N2)|Temp],Temp2,[before(ST1,ST2)|Temp0]):-
571 gensym_num(HPid,N1,ST1),
572 gensym_num(HPid,N2,ST2),
573 change_temp(HPid,Temp,Temp2,Temp0),!.
574
577expand_method([],Post,Post,Temp,Temp,Statics,Statics,[]):-!.
578expand_method([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(TN))|Decomp1]):-
579 tn(TN,Name,Pre0,Post0,Temp0,Decomp0),
580 state_achieved(Pre0,Pre,State1),
581 state_change(State1,Pre0,Post0,State),
582 statics_consist(Statics),
584 retract(op_num(N)),
585 N1 is N+1,
586 assert(op_num(N1)),
588 expand_method(Decomp,State,Post,Temp,Temp1,Statics,Statics1,Decomp1).
589expand_method([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(Name))|Decomp1]):-
590 operatorC(Name,Pre0,Post0,Cond,Statics0),
591 append_cut(Statics0,Statics,Statics2),
592 statics_consist(Statics2),
593 remove_unneed(Statics2,[],Statics21),
594 post_instant(Post0,Cond,Statics21,Post0),
595 state_achieved(Pre0,Pre,State1),
596 state_change(State1,Pre0,Post0,State2),
597 cond_state_change(State2,Cond,State3),
598 state_achieved(Post0,State3,State),
599 statics_consist_instance(Statics0),
602 retract(op_num(N)),
603 N1 is N+1,
604 assert(op_num(N1)),
605 expand_method(Decomp,State,Post,Temp,Temp1,Statics21,Statics1,Decomp1).
606expand_method([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(TN))|Decomp1]):-
607 methodC(Name,Pre0,Post0,Statics0,Temp0,ACH,Dec0),
608 append_cut(Statics0,Statics,Statics2),
609 statics_consist(Statics2),
610 remove_unneed(Statics2,[],Statics21),
611 post_instant(Post0,[],Statics21,Post0),
612 state_achieved(Pre0,Pre,State1),
613 statics_consist(Statics21),
614 apply_method(HPid,TN,Name,State1,Pre0,Post0,State,Statics21,Temp0,Dec0),
615 expand_method(Decomp,State,Post,Temp,Temp1,Statics21,Statics1,Decomp1).
617
621apply_method1(HPid,TN,Name,Pre,Pre0,ACH,Post0,State,Statics,Temp,Dec):-
622 make_dec1(HPid,Pre,ACH,Statics,Temp,Dec,Temp2,Dec2),
623 expand_decomp(Dec2,Pre,Post,Temp2,Temp1,Statics,Statics1,Dec1),
624 state_achieved(Post0,Post,State),
627 retract(op_num(N)),
628 N1 is N+1,
629 assert(op_num(N1)),
630 make_tn(TN,Name,Pre,State,Temp1,Dec1),!.
631
632
634
636fwsearch(TN,ST,State):-
637 retract(solved_node(ST,step(HP,Name,Pre,State,exp(TN)))).
638fwsearch(TN,ST,State):-
639 select_tnode(tp_node(TP,Pre,Post,Statics,Score,Dec)),
640 assert(closed_node(TP,Pre,Post,Statics,Score,Dec)),
641 expand_node(Statics,Statics1,Pre,Post,Dec,[],Dec1),
642 assert_tnode(TP,Pre,Post,Statics1,Score,Dec1),
643 solved_node(_,_), 644 fwsearch(TN,ST,State).
645fwsearch(TN,ST,State):-
646 tp_node(TP,Pre,Post,Statics,Score,Dec),
647 fwsearch(TN,ST,State).
648
649clean_temp_nodes:-
650 retractall(current_num(tp,_)),
651 retractall(tp_node(_,_,_,_,_,_)),
652 retractall(closed_node(_,_,_,_,_,_)),!.
653
655expand_node(Statics,Statics,Pre,Post,[],List,List):-
656 state_achieved(Post,Pre,_),!.
657expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,_,Post0,unexp)|Rest],List,Dec1):-
658 state_achieved(Post0,Pre,_),
659 expand_node(Statics,Statics1,Pre,Post,Rest,List,Dec1),!.
660expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,_,Post0,unexp)|Rest],List,Dec1):-
661 direct_expand_hp(HP,TN,Name,Pre,Post0,State,Statics,Statics2),
662 append(List,[step(HP,Name,Pre,State,exp(TN))],List2),
663 remove_achieved_rest(State,Statics2,Rest,Rest1),
664 make_to_steps(State,Post,Steps,Rest1),
665 append(Rest1,Steps,Rest2),
666 expand_node(Statics2,Statics1,State,Post,Rest2,List2,Dec1).
667expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,_,Post0,unexp)|Rest],List,Dec1):-
668 apply_op(Statics,Statics1,[step(HP,Name,Pre,Post0,unexp)|Rest],List,Dec1).
669expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,Pre0,Post0,exp(TN))|TDec],List,Dec1):-
670 append(List,[step(HP,Name,Pre0,Post0,exp(TN))],List2),
671 expand_node(Statics,Statics1,Post0,Post,TDec,List2,Dec1),!.
672
673remove_achieved_rest(State,Statics,[],[]):-!.
674remove_achieved_rest(State,Statics,[step(HP,Name,_,Post0,unexp)|Rest],Rest1):-
675 state_achieved(Post0,State,_),
676 remove_achieved_rest(State,Statics,Rest,Rest1),!.
677remove_achieved_rest(State,Statics,[HP|Rest],[HP|Rest1]):-
678 remove_achieved_rest(State,Statics,Rest,Rest1),!.
679
682apply_op(Statics,Statics1,[step(HP,Name,Pre,[se(Sort,Obj,SE)],unexp)|Rest],List,Dec):-
683 produce(se(Sort,Obj,SE1),OP,OPre,ST),
684 append_cut(Statics,ST,Statics2),
685 statics_consist(Statics2),
686 remove_unneed(Statics2,[],Statics1),
687 state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
688 instantiate(OPre,Statics1),
689 not(member(step(_,OP,_,_,_),Rest)),
690 make_to_steps(Pre,OPre,Steps,Rest),
691 change_head_state(Pre,Steps,Steps1),
692 append(List,Steps1,List2),
693 append(List2,[step(HP,OP,undefd,[se(Sort,Obj,SE)],unexp)|Rest],Dec).
695apply_op(Statics,Statics1,[step(HP,Name,Pre,[se(SortN,Obj,SE)],unexp)|Rest],List,Dec):-
696 find_prim_sort(SortN,PSortls),
697 member(Sort,PSortls),
698 produce(se(Sort,Obj,SE1),OP,OPre,ST),
699 append_cut(Statics,ST,Statics2),
700 statics_consist(Statics2),
701 remove_unneed(Statics2,[],Statics1),
702 state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
703 instantiate(OPre,Statics1),
704 not(member(step(_,OP,_,_,_),Rest)),
705 make_to_steps(Pre,OPre,Steps,Rest),
706 change_head_state(Pre,Steps,Steps1),
707 append(List,Steps1,List2),
708 append(List2,[step(HP,OP,undefd,[se(Sort,Obj,SE)],unexp)|Rest],Dec).
710
713make_to_steps(Pre,[],[],Rest):-!.
714make_to_steps(Pre,[se(Sort,Obj,SE)|Post],Steps,Rest):-
715 state_achieved([se(Sort,Obj,SE)],Pre,_),
716 make_to_steps(Pre,Post,Steps,Rest),!.
717make_to_steps(Pre,[se(Sort,Obj,SE)|Post],Steps,Rest):-
718 member(step(_,achieve(se(Sort,Obj,SE)),_,_),Rest),
719 make_to_steps(Pre,Post,Steps,Rest),!.
720make_to_steps(Pre,[se(Sort,Obj,SE)|Post],[step(HP,achieve(se(Sort,Obj,SE)),undefd,[se(Sort,Obj,SE)],unexp)|Steps],Rest):-
721 gensym_special(hp,HP),
722 make_to_steps(Pre,Post,Steps,Rest),!.
723
724change_head_state(Pre,[step(HP,A,undefd,B,unexp)|Steps],[step(HP,A,Pre,B,unexp)|Steps]):-!.
725
727instantiate([],Statics).
728instantiate([se(Sort,Obj,SE)|States],Statics):-
729 nonvar(Obj),
730 instantiate(States,Statics),!.
731instantiate([se(Sort,Obj,SE)|States],Statics):-
732 ground(SE),
733 instantiate(States,Statics),!.
734instantiate([se(Sort,Obj,SE)|States],Statics):-
735 var(Obj),
736 get_sort_objects(Sort,Objls),
737 member(Obj,Objls),
738 statics_consist_instance(Statics),
739 instantiate(States,Statics).
740
741
743select_tnode(tp_node(HPid,Pre,Post,Statics,Score,Dec)) :-
744 retractall(score_list(LS)),
745 assert(score_list([])),
746 lowest_score(Score),
747 retract(tp_node(HPid,Pre,Post,Statics,Score,Dec)),!.
749
751lowest_score(LScore):-
752 tp_node(HPid,Pre,Post,Statics,Score,Dec),
753 retract(score_list(LS)),
754 assert(score_list([Score|LS])),
755 fail.
756lowest_score(LScore):-
757 retract(score_list(D)),
758 sort(D,[LScore|SD]).
759
760:- style_check(-discontiguous). 762assert_tnode(TP,Pre,Post,Statics,Score1,Dec):-
763 all_HP_expanded(Dec),
764 combine_exp_steps2(Dec,OneDec),
765 assert(solved_node(Statics,OneDec)),!.
766
767combine_exp_steps2([OneDec],OneDec):-!.
768combine_exp_steps2([Dec1,Dec2|Rest],OneDec):-
769 combine_steps1(Dec1,Dec2,OneDec1),
770 combine_exp_steps2([OneDec1|Rest],OneDec),!.
775assert_tnode(TP,Pre,Post,Statics,Score,Dec):-
776 combine_exp_steps(Dec,ExpDec,UnexpDec),
777 assert_tnode1(TP,Pre,Post,Statics,Score,ExpDec,UnexpDec),!.
778
779:- style_check(+discontiguous). 780
781assert_tnode1(TP,Pre,Post,Statics,Score,ExpDec,UnexpDec):-
782 existing_node(ExpDec,UnexpDec,Statics).
783assert_tnode1(TP,Pre,Post,Statics,Score,ExpDec,UnexpDec):-
784 get_score(Score,ExpDec,UnexpDec,Score1),
785 gensym_special(tp,TP1),
786 append(ExpDec,UnexpDec,Dec),
787 assert(tp_node(TP1,Pre,Post,Statics,Score1,Dec)),!.
788
790combine_exp_steps([step(A,B,C,D,unexp)|Rest],[],[step(A,B,C,D,unexp)|Rest]):-!.
791combine_exp_steps([step(A,B,C,D,exp(TN)),step(A1,B1,C1,D1,unexp)|Rest],[step(A,B,C,D,exp(TN))],[step(A1,B1,C1,D1,unexp)|Rest]):-!.
792combine_exp_steps([step(A1,B1,C1,D1,exp(TN1)),step(A2,B2,C2,D2,exp(TN2))|Rest],ExpDec,UnexpDec):-
793 combine_steps1(step(A1,B1,C1,D1,exp(TN1)),step(A2,B2,C2,D2,exp(TN2)),ExpDec1),
794 combine_exp_steps([ExpDec1|Rest],ExpDec,UnexpDec),!.
795
796combine_steps1(step(HP1,Name1,Pre1,Post1,exp(TN1)),step(HP2,Name2,Pre2,Post2,exp(TN2)),step(HP,achieve(Post2),Pre1,Post2,exp(TN))):-
797 find_only_changed(Pre1,Post2,[],Pre0,[],Post0),
798 not(isemptylist(Post0)),
799 gensym_special(hp,HP),
800 gensym_special(tn,TN),
801 assert(tn(TN,achieve(Post0),Pre0,Post0,[before(TN1,TN2)],[step(HP1,Name1,Pre1,Post1,exp(TN1)),step(HP2,Name2,Pre2,Post2,exp(TN2))])),!.
802
804existing_node([step(_,_,Pre,Post,exp(TN))],UnexpDec,Statics):-
805 tp_node(_,_,_,Statics0,_,[step(_,_,Pre0,Post0,exp(TN0))|Rest]),
806 append_st(Statics,Statics0,Statics1),
807 all_equal(Pre,Pre0,Statics1),
808 all_equal(Post,Post0,Statics1),
809 existing_node([],UnexpDec,Statics1).
810existing_node([step(_,_,Pre,Post,exp(TN))],UnexpDec,Statics):-
811 closed_node(_,_,_,Statics0,_,[step(_,_,Pre0,Post0,exp(TN0))|Rest]),
812 append_st(Statics,Statics0,Statics1),
813 all_equal(Pre,Pre0,Statics1),
814 all_equal(Post,Post0,Statics1),
815 existing_node([],UnexpDec,Statics1).
816existing_node([],[step(_,Name,Pre,_,unexp)|Rest],Statics):-
817 tp_node(_,_,_,Statics0,_,[step(_,Name,Pre0,_,_,unexp)|Rest]),
818 append_st(Statics,Statics0,Statics1),
819 all_equal(Pre,Pre0,Statics1).
820existing_node([],[step(_,Name,Pre,_,unexp)|Rest],Statics):-
821 closed_node(_,_,_,Statics0,_,[step(_,Name,Pre0,_,_,unexp)|Rest]),
822 append_st(Statics,Statics0,Statics1),
823 all_equal(Pre,Pre0,Statics1).
824
825
826
827
828
829
830
831all_equal([],[],Statics):-
832 statics_consist(Statics),!.
833all_equal([se(Sort,Obj,SE)|Pre],[se(Sort,Obj,SE1)|Pre1],Statics):-
834 is_achieved(SE,SE1),
835 all_equal(Pre,Pre1,Statics),!.
836all_equal([se(Sort,Obj,SE)|Pre],Pre1,Statics):-
837 member(se(Sort,Obj,SE1),Pre1),
838 list_take(Pre1,[se(Sort1,Obj1,SE1)],Pre2),
839 all_equal(Pre,Pre1,Statics),!.
840
841get_score(Score,[],UnExpDec,Score1):-
842 length(UnExpDec,Len),
843 Score1 is Score+Len,!.
844get_score(Score,[step(HP,Name,Pre0,Post0,exp(TN))],UnExpDec,Score1):-
845 goal_related(States),
846 state_achieved_Num(Post0,States,0,Num),
847 length(UnExpDec,Len),
848 Score1 is Score-Num,!.
849
853state_achieved_Num([],Pre0,Num,Num):-!.
854state_achieved_Num([se(Sort,Obj,SE)|Post],Pre0,N,Num):-
855 member(se(Sort,Obj,SE0),Pre0),
856 state_achieved([se(Sort,Obj,SE0)],[se(Sort,Obj,SE)],_),
857 N1 is N+1,
858 state_achieved_Num(Post,Pre0,N1,Num),!.
859state_achieved_Num([se(Sort,Obj,SE)|Post],Pre0,N,Num):-
860 state_achieved_Num(Post,Pre0,N,Num),!.
861
866find_relate_state:-
867 operatorC(A,Pre,Post,Cond,ST),
868 assert_related_states(A,Pre,Post,Cond,ST),
869 fail.
870find_relate_state.
871
872assert_related_states(A,Pre,Post,Cond,ST):-
873 assert_related_states1(A,Pre,Post,ST),
874 assert_related_states2(A,Pre,Cond,ST).
875
878assert_related_states1(A,Pre,[],ST):-!.
880assert_related_states1(A,Pre,[se(Sort,Obj,SE)|Post],ST):-
881 member_e(se(Sort,Obj,SE),Pre),
882 assert_related_states1(A,Pre,Post,ST),!.
884assert_related_states1(A,Pre,[se(Sort,Obj,SE)|Post],ST):-
885 assert(produce(se(Sort,Obj,SE),A,Pre,ST)),
886 assert_related_states1(A,Pre,Post,ST),!.
887
890assert_related_states2(A,Pre,SC,ST):-
891 make_sc_primitive(SC,PSC),
892 assert_related_states21(A,Pre,PSC,ST).
893
894assert_related_states21(A,Pre,[],ST):-!.
895assert_related_states21(A,Pre,[sc(Sort,Obj,SE=>SS)|Trans],ST):-
896 rem_statics([se(Sort,Obj,SE)],[se(Sort,Obj,SER)],St1),
897 rem_statics([se(Sort,Obj,SS)],[se(Sort,Obj,SSR)],St2),
898 append_cut(ST,St1,ST1),
899 append_cut(ST1,St2,ST21),
900 remove_unneed(ST21,[],ST2),
901 append_cut(Pre,[se(Sort,Obj,SER)],Pre1),
902 assert(produce(se(Sort,Obj,SSR),A,Pre1,ST2)),
903 assert_related_states21(A,Pre,Trans,ST),!.
904
908pre_changed_Num([],Pre0,Num,Num):-!.
909pre_changed_Num([se(Sort,Obj,SE)|Pre],Pre0,N,Num):-
910 state_achieved([se(Sort,Obj,SE)],Pre0,_),
911 N1 is N+1,
912 pre_changed_Num(Pre,Pre0,N1,Num),!.
913pre_changed_Num([se(Sort,Obj,SE)|Pre],Pre0,N,Num):-
914 pre_changed_Num(Pre,Pre0,N,Num),!.
915
916
917
922remove_temp([],HP1,List,List):-!.
923remove_temp([before(HP1,HP2)|Temp],HP1,List,Temp1):-
924 remove_temp_before(List,before(HP1,HP2),List2),
925 remove_temp(Temp,HP1,List2,Temp1),!.
926remove_temp([before(HP2,HP1)|Temp],HP1,List,Temp1):-
927 remove_temp_after(List,before(HP2,HP1),List2),
928 remove_temp(Temp,HP1,List2,Temp1),!.
929remove_temp([before(HPX,HPY)|Temp],HP1,List,Temp1):-
930 remove_temp(Temp,HP1,List,Temp1),!.
931
933remove_temp_before([],before(HP1,HP2),[]):-!.
934remove_temp_before([before(HP1,HP2)|T],before(HP1,HP2),T1):-
935 remove_temp_before(T,before(HP1,HP2),T1),!.
936remove_temp_before([before(HP3,HP1)|T],before(HP1,HP2),[before(HP3,HP2)|T1]):-
937 remove_temp_before(T,before(HP1,HP2),T1),!.
938remove_temp_before([before(HPX,HPY)|T],before(HP1,HP2),[before(HPX,HPY)|T1]):-
939 remove_temp_before(T,before(HP1,HP2),T1),!.
941remove_temp_after([],before(HP1,HP2),[]):-!.
942remove_temp_after([before(HP2,HP1)|T],before(HP2,HP1),T1):-
943 remove_temp_after(T,before(HP2,HP1),T1),!.
944remove_temp_after([before(HP1,HP3)|T],before(HP2,HP1),[before(HP2,HP3)|T1]):-
945 remove_temp_after(T,before(HP2,HP1),T1),!.
946remove_temp_after([before(HPX,HPY)|T],before(HP2,HP1),[before(HPX,HPY)|T1]):-
947 remove_temp_after(T,before(HP2,HP1),T1),!.
948
949remove_dec(HPid,[],[]):-!.
950remove_dec(HPid,[step(HPid,_,_,_,_)|Dec],Dec1):-
951 remove_dec(HPid,Dec,Dec1),!.
952remove_dec(HPid,[step(A,B,C,D,F)|Dec],[step(A,B,C,D,F)|Dec1]):-
953 remove_dec(HPid,Dec,Dec1),!.
954
958state_achieved(undefd,State,State):-!.
959state_achieved(State1,State2,State3):-
960 state_achieved1(State1,State2,State3).
961
962state_achieved1([],State2,State2).
963state_achieved1([se(Sort,Obj,ST1)|State1],State2,[se(Sort,Obj,STN)|State]):-
964 get_sort_objects(Sort,Objls),
965 member(Obj,Objls),
966 member(se(Sort,Obj,ST2),State2),
967 not_conflict(Sort,Obj,ST1,ST2,STN),
968 list_take(State2,[se(Sort,Obj,ST2)],State21),
969 state_achieved1(State1,State21,State).
970state_achieved1([se(Sort1,Obj,ST1)|State1],State2,[se(Sort,Obj,STN)|State]):-
971 not(objects(Sort1,Objls)),
972 find_prim_sort(Sort1,Sortls),
973 member(se(Sort,Obj,ST2),State2),
974 member(Sort,Sortls),
975 not_conflict(Sort,Obj,ST1,ST2,STN),
976 list_take(State2,[se(Sort,Obj,ST2)],State21),
977 state_achieved1(State1,State21,State).
978
980not_conflict(Sort,Obj,ST,ST1,NewST):-
981 gsubstate_classes(Sort,Obj,Substateclasses),
982 member(State0,Substateclasses),
983 is_achieved(ST,State0),
984 is_achieved(ST1,State0),
985 set_append_e(ST,ST1,NewST),!.
986
988is_achieved([],_):-!.
989is_achieved([H|T], State) :-
990 is_statics(H),
991 is_achieved(T,State),!.
992is_achieved([H|T], State) :-
993 member(H,State),
994 is_achieved(T,State),!.
995
997is_statics(ne(A,B)):-!.
998is_statics(is_of_sort(A,B)):-!.
999is_statics(is_of_primitive_sort(A,B)):-!.
1000is_statics(Pred):-
1001 functor(Pred,FF,NN),
1002 functor(Pred1,FF,NN),
1003 atomic_invariants(Atom),
1004 member(Pred1,Atom),!.
1005
1006
1008
1012state_change([],Pre0,Post0,[]):-!.
1013state_change(Pre,[],[],Pre):-!.
1016state_change([se(Sort,Obj,SE)|Pre],Pre0,Post0,[se(Sort,Obj,NewSS)|State]):-
1017 member(se(Sort,Obj,SE0),Pre0),
1018 member(se(Sort,Obj,SS0),Post0),
1019 not_conflict(Sort,Obj,SE,SE0,_),
1020 state_change1(SE,SE0,SS0,NewSS),
1021 list_take(Pre0,[se(Sort,Obj,SE0)],Pre1),
1022 list_take(Post0,[se(Sort,Obj,SS0)],Post1),
1023 state_change(Pre,Pre1,Post1,State),!.
1026state_change([se(Sort,Obj,SE)|Pre],Pre0,Post0,[se(Sort,Obj,SE)|State]):-
1027 state_change(Pre,Pre0,Post0,State),!.
1028
1029state_change1([],SE0,SS0,SS0):-!.
1030state_change1([HSE|TSE],SE0,SS0,SS1):-
1031 member(HSE,SE0),
1032 state_change1(TSE,SE0,SS0,SS1),!.
1033state_change1([HSE|TSE],SE0,SS0,[HSE|SS1]):-
1034 state_change1(TSE,SE0,SS0,SS1),!.
1040cond_state_change([],Cond,[]):-!.
1041cond_state_change(State,[],State):-!.
1042cond_state_change([se(Sort,Obj,SE)|Pre],Cond,[se(Sort,Obj,NewSS)|State]):-
1043 member(sc(Sort1,Obj,SE0=>SS0),Cond),
1044 statics_consist([is_of_sort(Obj,Sort1),is_of_sort(Obj,Sort)]),
1045 not_conflict(Sort,Obj,SE,SE0,_),
1046 state_change1(SE,SE0,SS0,NewSS),
1047 cond_state_change(Pre,Cond,State),!.
1048cond_state_change([se(Sort,Obj,SE)|Pre],Cond,[se(Sort,Obj,SE)|State]):-
1049 cond_state_change(Pre,Cond,State),!.
1050
1054post_changed(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
1055 member(se(Sort,Obj,SE0),Post0),
1056 state_achieved([se(Sort,Obj,SE0)],[se(Sort,Obj,SE)],_),
1057 statics_consist(Statics).
1058post_changed(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
1059 member(sc(Sort,Obj,SE1=>SS),Cond),
1060 state_achieved([se(Sort,Obj,SS)],[se(Sort,Obj,SE)],_),
1061 statics_consist(Statics).
1062post_changed(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
1063 post_changed(Post0,Cond,Statics,Post).
1064
1065all_achieved([],Statics,Post).
1066all_achieved([se(Sort,Obj,SL)|Pre],Statics,Post):-
1067 not(member(se(Sort,Obj,SR),Post)),
1068 all_achieved(Pre,Statics,Post).
1069all_achieved([se(Sort,Obj,SL)|Pre],Statics,Post):-
1070 member(se(Sort,Obj,SR),Post),
1071 is_achieved(SL,SR),
1072 statics_consist_instance(Statics),
1073 all_achieved(Pre,Statics,Post).
1074
1075
1079post_instant(Post0,Cond,Statics,[]):-!.
1080post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
1081 member(se(Sort,Obj,SE0),Post0),
1082 statics_consist(Statics).
1083post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
1084 member(sc(Sort,Obj,SE1=>SS),Cond),
1085 statics_consist(Statics).
1086post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
1087 member(sc(Sort0,Obj,SE1=>SS),Cond),
1088 not(objects(Sort0,_)),
1089 subsorts(Sort0,Sortls),
1090 not(not(member(Sort,Sortls))),
1091 statics_consist(Statics).
1092post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
1093 post_instant(Post0,Cond,Statics,Post),!.
1095
1099
1100make_problem_into_node(I,goal(L,TM,STATS), NN) :-
1101 make_problem_up(L, STEPS),
1102 make_num_hp(TM,Temp),
1103 sort_steps(STEPS,Temp,STEPS1),
1104 make_ss_to_se(I,I_Pre),
1105 NN = node(root,I_Pre,STEPS1 ,Temp, STATS),!.
1106
1108make_problem_up([],[]):-!.
1109make_problem_up([achieve(L)|R],[step(HP,achieve(L1),undefd,[L1],unexp)|RS]):-
1110 1111 make_ss_to_se([L],[L1]),
1112 gensym_special(hp,HP),
1113 make_problem_up(R, RS),!.
1114make_problem_up([achieve(L)|R],[step(HP,achieve(L1),undefd,L1,unexp)|RS]):-
1115 1116 make_ss_to_se(L,L1),
1117 gensym_special(hp,HP),
1118 make_problem_up(R, RS),!.
1119make_problem_up([O|R],[step(HP,O,undefd,undefd,unexp)|RS]):-
1120 methodC(O,Pre,Post,Statics1,Temp,ACH,Dec),
1121 gensym_special(hp,HP),
1122 make_problem_up(R, RS),!.
1123make_problem_up([O|R],
1124 [step(HP,O,undefd,undefd,unexp)|RS]):-
1125 operatorC(O,Pre,Post,Cond,Statics1),
1126 gensym_special(hp,HP),
1127 make_problem_up(R, RS),!.
1128
1129make_num_hp([],[]):-!.
1130make_num_hp([before(N1,N2)|TM],[before(H1,H2)|Temp]):-
1131 gensym_num(hp,N1,H1),
1132 gensym_num(hp,N2,H2),
1133 make_num_hp(TM,Temp),!.
1134
1137sort_steps(Steps,[],Steps):-!.
1138sort_steps([Steps|[]],[],[Steps]):-!.
1139sort_steps(Steps,Temp,OrderedST):-
1140 steps_in_temp(Temp,[],ST),
1141 sort_steps1(Temp,ST,OrderedSTID),
1142 sort_steps2(Steps,OrderedSTID,[],OrderedST),!.
1143
1145steps_in_temp([],ST,ST):-!.
1146steps_in_temp([before(H1,H2)|TT],List,ST):-
1147 set_append_e(List,[H1,H2],List1),
1148 steps_in_temp(TT,List1,ST),!.
1149
1151sort_steps1(Temp,[],[]):-!.
1152sort_steps1(Temp,[HP1|TST],[HPF|OST]):-
1153 earliest_step(HP1,HPF,Temp,TST,TST1),
1154 sort_steps1(Temp,TST1,OST),!.
1155
1156earliest_step(HPF,HPF,Temp,[],[]):-!.
1157earliest_step(HP1,HPF,Temp,[HP2|TST],[HP1|TST1]):-
1158 member(before(HP2,HP1),Temp),
1159 earliest_step(HP2,HPF,Temp,TST,TST1),!.
1160earliest_step(HP1,HPF,Temp,[HP2|TST],[HP2|TST1]):-
1161 earliest_step(HP1,HPF,Temp,TST,TST1),!.
1162
1164sort_steps2(OtherST,[],OrderedST1,OrderedST):-
1165 append(OrderedST1,OtherST,OrderedST),!.
1166sort_steps2(Steps,[HP|THPS],List,OrderedST):-
1167 member(step(HP,N,Pre,Post,F),Steps),
1168 append(List,[step(HP,N,Pre,Post,F)],List1),
1169 list_take(Steps,[step(HP,N,Pre,Post,F)],Steps1),
1170 sort_steps2(Steps1,THPS,List1,OrderedST),!.
1171sort_steps2(Steps,[HP|THPS],List,OrderedST):-
1172 sort_steps2(Steps,THPS,List,OrderedST),!.
1174
1176make_ss_to_se([],[]):-!.
1177make_ss_to_se([ss(Sort,Obj,Post)|TPost],[se(Sort,Obj,Post)|TPre]):-
1178 make_ss_to_se(TPost,TPre),!.
1179make_ss_to_se([se(Sort,Obj,Post)|TPost],[se(Sort,Obj,Post)|TPre]):-
1180 make_ss_to_se(TPost,TPre),!.
1181
(Node,PHPs,SIZE1) :-
1187 1188 getN_decomp(Node, HPs),
1189 push_to_primitive(HPs,[],PHPs),
1190 pprint(PHPs,1,SIZE),
1191 SIZE1 is SIZE -1,!.
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1215change_op_representation :-
1216 method(A,B,C,Stat,T,Dec),
1217 make_ss_to_se(B,B0),
1218 make_se_primitive(B0,B1),
1219 make_sc_primitive(C,C1),
1220 get_preconditions(C1,B1,Pre,Post),
1221 rem_statics(Post, PostR,St1),
1222 rem_statics(Pre, PreR,St2),
1223 append_cut(St1,St2,Statics),
1224 append_cut(Stat,Statics,Statics1),
1225 remove_unneed(Statics1,[],Statics2),
1226 get_achieval(A,Dec,T,Dec1,T1,ACH),
1227 assert(methodC(A,PreR,PostR,Statics2,T1,achieve(ACH),Dec1)),
1228 fail.
1229change_op_representation :-
1230 operator(A,B,C,D),
1231 make_ss_to_se(B,B0),
1232 make_se_primitive(B0,B1),
1233 make_sc_primitive(C,C1),
1235 1236 get_preconditions(C1,B1,Pre,Post),
1237 rem_statics(Post, PostR,St1),
1238 rem_statics(Pre, PreR,St2),
1239 append_cut(St1,St2,Statics1),
1240 remove_unneed(Statics1,[],Statics),
1241 statics_consist(Statics),
1242 assert(operatorC(A,PreR,PostR,D,Statics)),
1243 fail.
1244change_op_representation:-
1245 retractall(current_num(sm,_)),!.
1246
1247get_preconditions([],Prev,Prev,Prev) :-!.
1248get_preconditions([sc(S,X,From =>To)|Rest],Prev,[se(S,X,From1)|Pre],[se(S,X,To1)|Post]):-
1249 member_e(se(S,X,PSE),Prev),
1250 append(PSE,From,From1),
1251 append(PSE,To,To1),
1252 list_take(Prev,[se(S,X,PSE)],Prev1),
1253 get_preconditions(Rest,Prev1, Pre,Post),!.
1254get_preconditions([sc(S,X,From =>To)|Rest],Prev,[se(S,X,From)|Pre],[se(S,X,To)|Post]):-
1255 get_preconditions(Rest,Prev, Pre,Post),!.
1256get_preconditions([],Prev,Prev,Prev) :-!.
1257
1259get_achieval(A,Dec,T,Dec1,T1,Achieval):-
1260 retractall(current_num(sm,_)),
1261 make_dec(A,Dec,Dec1,T,T1,[],Achieval),!.
1262make_dec(A,[],[],Temp,Temp,Achieval,Achieval):-!.
1263make_dec(A,[HD|TD],TD1,Temp,Temp1,Achieval,Achieval1):-
1264 HD=..[achieve|Goal],
1265 current_num(sm,Num),
1266 replace_achieval_temp(Temp,Temp0,Num),
1267 make_ss_to_se(Goal,Goal0),
1268 append(Achieval,Goal0,Achieval0),
1269 make_dec(A,TD,TD1,Temp0,Temp1,Achieval0,Achieval1),!.
1270make_dec(A,[HD|TD],TD1,Temp,Temp1,Achieval,Achieval1):-
1271 HD=..[achieve|Goal],
1272 not(current_num(sm,Num)),
1273 replace_achieval_temp(Temp,Temp0,1),
1274 make_ss_to_se(Goal,Goal0),
1275 append(Achieval,Goal0,Achieval0),
1276 make_dec(A,TD,TD1,Temp0,Temp1,Achieval0,Achieval1).
1277make_dec(A,[HD|TD],[HD|TD1],Temp,Temp1,Achieval,Achieval1):-
1278 HD=..[DecName|Goal],
1279 DecName\==achieve,
1280 gensym_special(sm,SM),
1281 current_num(sm,Num),
1282 make_dec(A,TD,TD1,Temp,Temp1,Achieval,Achieval1),!.
1283
1285replace_achieval_temp(Temp,Temp1,Num):-
1286 change_all_numbers(Temp,Num,Temp00),
1287 tidy_temp(Temp00,Temp1).
1288
1289change_all_numbers([],Num,[]):-!.
1290change_all_numbers([HTemp|TTemp],Num,[HTemp00|TTemp00]):-
1291 HTemp=..[before|Nums],
1292 change_nums(Nums,Num,Nums1),
1293 HTemp00=..[before|Nums1],
1294 change_all_numbers(TTemp,Num,TTemp00).
1295
1296change_nums([],Num,[]):-!.
1297change_nums([Num1|TN],Num,[Num1|TN1]):-
1298 Num1<Num,
1299 change_nums(TN,Num,TN1),!.
1300change_nums([Num1|TN],Num,[Num2|TN1]):-
1301 Num1>Num,
1302 Num2 is Num1-1,
1303 change_nums(TN,Num,TN1),!.
1304change_nums([Num|TN],Num,[0|TN1]):-
1305 change_nums(TN,Num,TN1),!.
1306
1308tidy_temp(Temp,Temp1):-
1309 member(before(Num,0),Temp),
1310 list_take(Temp,[before(Num,0)],Temp0),
1311 change_laters(Temp0,Num,Temp01),
1312 tidy_temp(Temp01,Temp1).
1313tidy_temp([],[]):-!.
1314tidy_temp([before(0,Num)|Temp],Temp0):-
1315 tidy_temp(Temp,Temp0),!.
1316tidy_temp([before(Num1,Num2)|Temp],[before(Num1,Num2)|Temp0]):-
1317 tidy_temp(Temp,Temp0),!.
1318
1319change_laters([before(0,Num2)|Temp],Num,[before(Num,Num2)|Temp0]):-
1320 change_laters(Temp,Num,Temp0).
1321change_laters([before(Num1,0)|Temp],Num,[before(Num1,0)|Temp0]):-
1322 change_laters(Temp,Num,Temp0).
1323change_laters([before(Num1,Num2)|Temp],Num,[before(Num1,Num2)|Temp0]):-
1324 change_laters(Temp,Num,Temp0).
1325
1327make_se_primitive([],[]).
1328make_se_primitive([se(Sort,Obj,ST)|SE],[se(Sort,Obj,ST)|SE0]):-
1329 find_prim_sort(Sort,[Sort]),!,
1330 make_se_primitive(SE,SE0).
1331make_se_primitive([se(Sort,Obj,ST)|SE],[se(PSort,Obj,ST)|SE0]):-
1332 find_prim_sort(Sort,PSorts),
1333 member(PSort,PSorts),
1334 make_se_primitive(SE,SE0).
1335
1337make_sc_primitive([],[]).
1338make_sc_primitive([sc(Sort,Obj,SE1=>SE2)|ST],[sc(Sort,Obj,SE1=>SE2)|ST0]):-
1339 find_prim_sort(Sort,[Sort]),!,
1340 make_sc_primitive(ST,ST0).
1341make_sc_primitive([sc(Sort,Obj,SE1=>SE2)|ST],[sc(PSort,Obj,SE1=>SE2)|ST0]):-
1342 find_prim_sort(Sort,PSorts),
1343 member(PSort,PSorts),
1344 make_sc_primitive(ST,ST0).
1346make_tn(TN,Name,Pre,Post,Temp,Dec):-
1347 gensym_special(tn,TN),
1348 find_only_changed(Pre,Post,[],Pre1,[],Post1),
1350 assert(tn(TN,Name,Pre1,Post1,Temp,Dec)),!.
1351
1352find_only_changed([],[],Pre,Pre,Post,Post):-!.
1354find_only_changed([se(Sort,Obj,ST)|Pre],[se(Sort,Obj,ST)|Post],Pre0,Pre1,Post0,Post1):-
1355 find_only_changed(Pre,Post,Pre0,Pre1,Post0,Post1),!.
1356find_only_changed([se(Sort,Obj,ST)|Pre],Post,Pre0,Pre1,Post0,Post1):-
1357 member(se(Sort,Obj,ST1),Post),
1358 list_take(Post,[se(Sort,Obj,ST1)],Post2),
1359 append_changed(se(Sort,Obj,ST),se(Sort,Obj,ST1),Pre0,Pre3,Post0,Post3),
1360 find_only_changed(Pre,Post2,Pre3,Pre1,Post3,Post1),!.
1361find_only_changed([se(Sort,Obj,ST)|Pre],Post,Pre0,Pre1,Post0,Post1):-
1362 member(se(SortN,Obj,ST1),Post),
1363 list_take(Post,[se(SortN,Obj,ST1)],Post2),
1364 append_changed(se(Sort,Obj,ST),se(SortN,Obj,ST1),Pre0,Pre3,Post0,Post3),
1365 find_only_changed(Pre,Post2,Pre3,Pre1,Post3,Post1),!.
1367
1370append_changed(se(Sort,Obj,ST),se(Sort1,Obj,ST1),Pre0,Pre0,Post0,Post0):-
1371 not_conflict(Sort,Obj,ST,ST1,_),!.
1372append_changed(se(Sort,Obj,ST),se(Sort1,Obj,ST1),Pre0,Pre3,Post0,Post3):-
1373 append(Pre0,[se(Sort,Obj,ST)],Pre3),
1374 append(Post0,[se(Sort,Obj,ST1)],Post3),!.
1375
1376
1377
1379push_to_primitive([],PHPs,PHPs) :-!.
1380push_to_primitive([step(HPID,_,_,_,exp(TN))|HPs],List,PHPs) :-
1381 tn(TN,Name,Pre,Post,Temp,Dec),
1382 push_to_primitive(Dec,List,Dec1),
1383 push_to_primitive(HPs,Dec1,PHPs),!.
1384push_to_primitive([step(HPID,_,_,_,exp(Name))|HPs],List,PHPs):-
1385 append(List,[Name],List1),
1386 push_to_primitive(HPs,List1,PHPs),!.
1387
1388
1390
1391possibly_before(I,J,Temps) :-
1392 \+ necessarily_before(J,I,Temps), !.
1393
1394necessarily_before(J,I,Temps) :-
1395 member(before(J,I),Temps),!.
1396necessarily_before(J,I,Temps) :-
1397 member(before(J,Z),Temps),
1398 necessarily_before(Z,I,Temps),!.
1399
1401
1403select_node(node(Name,Pre,Temp,Decomp,Statics)) :-
1404 retract(node(Name,Pre,Temp,Decomp,Statics)),
1409 !.
1410
1411is_of_primitive_sort(X,Y) :-
1412 objects(Y,L),member(X,L).
1413is_of_sort(X,Y) :-
1414 is_of_primitive_sort(X,Y).
1415is_of_sort(X,Y) :-
1416 sorts(Y,SL),member(Z,SL),is_of_sort(X,Z).
1417
1418find_all_upper([],[]).
1419find_all_upper([HVars|TV],[HSorts|TS]):-
1420 uppersorts(HSorts,Upsorts),
1421 member(HVars,Upsorts),
1422 find_all_upper(TV,TS).
1423
1425find_prim_sort(Sort,PS):-
1426 subsorts(Sort,Subsorts),
1427 split_prim_noprim(Subsorts,PS,NP),!.
1428
1430get_sort_objects(Sort,Objs):-
1431 find_prim_sort(Sort,PSorts),
1432 get_objects1(PSorts,Objls),
1433 flatten(Objls,[],Objs),!.
1434
1435get_objects1([],[]):-!.
1436get_objects1([PS1|RS],[Objls1|Objls]):-
1437 objects(PS1,Objls1),
1438 get_objects1(RS,Objls),!.
1439
1441subsorts(Sort,Subsorts):-
1442 sort_down([Sort],[Sort],Subsorts),!.
1443
1444sort_down([],Subsorts,Subsorts):-!.
1445sort_down([HOpen|TOpen],List,Sortslist):-
1446 sorts(HOpen,Sorts),
1447 append(List,Sorts,List1),
1448 append(TOpen,Sorts,Open1),
1449 sort_down(Open1,List1,Sortslist),!.
1450sort_down([HOpen|TOpen],List,Sortslist):-
1451 sort_down(TOpen,List,Sortslist),!.
1452
1454uppersorts(Sort,Uppersorts):-
1455 objects(Sort,Objls),
1456 sort_up(Sort,[Sort],Uppersorts),!.
1457uppersorts(Sort,Uppersorts):-
1458 sorts(Sort,Sortls),
1459 sort_up(Sort,[Sort],Uppersorts),!.
1460uppersorts(Obj,Sortls):-
1461 objects(Sort,Objls),
1462 member(Obj, Objls),
1463 sort_up(Sort,[Sort],Sortls),!.
1464
1465sort_up(Sort, List,Sortslist):-
1466 sorts(non_primitive_sorts,NPSorts),
1467 sort_up1(Sort,NPSorts,NPSorts,List,Sortslist),!.
1468
1469sort_up1(Sort,[],NPSorts,Sortslist,Sortslist):-!.
1470sort_up1(Sort,[HNPSorts|TNPSorts],NPSorts,List,Sortslist):-
1471 sorts(HNPSorts,Sorts),
1472 member(Sort,Sorts),
1473 append(List, [HNPSorts], List1),
1474 sort_up(HNPSorts,List1,Sortslist),!.
1475sort_up1(Sort,[HNPSorts|TNPSorts],NPSorts,List,Sortslist):-
1476 sort_up1(Sort,TNPSorts,NPSorts,List,Sortslist),!.
1477
1479split_prim_noprim([],[],[]):-!.
1480split_prim_noprim([HS|TS],[HS|TP],NP):-
1481 objects(HS,Obj),
1482 split_prim_noprim(TS,TP,NP),!.
1483split_prim_noprim([HS|TS],PS,[HS|NP]):-
1484 split_prim_noprim(TS,PS,NP),!.
1485
1486
1487
1488
1489
1491statics_consist_instance([]):-!.
1492statics_consist_instance(Statics) :-
1493 get_invariants(Invs),
1494 statics_consist_instance0(Invs,Statics).
1495
1496statics_consist_instance0(Invs,[]):-!.
1497statics_consist_instance0(Invs,[ne_back(A,B)|TStatics]):-
1498 not(A==B),
1499 statics_consist_instance0(Invs,TStatics).
1500statics_consist_instance0(Invs,[ne(A,B)|TStatics]):-
1501 append(TStatics,[ne_back(A,B)],TStatics1),
1502 statics_consist_instance0(Invs,TStatics1),!.
1503statics_consist_instance0(Invs,[is_of_sort(Obj,Sort)|TStatics]):-
1504 is_of_sort(Obj,Sort),
1505 statics_consist_instance0(Invs,TStatics).
1506statics_consist_instance0(Invs,[is_of_primitive_sort(Obj,Sort)|TStatics]):-
1507 is_of_primitive_sort(Obj,Sort),
1508 statics_consist_instance0(Invs,TStatics).
1509statics_consist_instance0(Invs,[Pred|TStatics]):-
1510 member(Pred,Invs),
1511 statics_consist_instance0(Invs,TStatics).
1512
1515statics_consist([]):-!.
1516statics_consist(Statics):-
1517 get_invariants(Invs),
1518 statics_consist1(Invs,Statics),!.
1519
1520statics_consist1(Invs,[]):-!.
1521statics_consist1(Invs,[ne_back(A,B)|TStatics]):-
1522 not(A==B),
1523 statics_consist1(Invs,TStatics),!.
1524statics_consist1(Invs,[ne(A,B)|TStatics]):-
1525 append(TStatics,[ne_back(A,B)],TStatics1),
1526 statics_consist1(Invs,TStatics1),!.
1527statics_consist1(Invs,[is_of_sort(Obj,Sort)|TStatics]):-
1528 get_sort_objects(Sort,Objs),
1529 obj_member(Obj,Objs),
1530 statics_consist1(Invs,TStatics),!.
1531statics_consist1(Invs,[is_of_primitive_sort(Obj,Sort)|TStatics]):-
1532 objects(Sort,Objs),
1533 obj_member(Obj,Objs),
1534 statics_consist1(Invs,TStatics),!.
1535statics_consist1(Invs,[Pred|TStatics]):-
1536 pred_member(Pred,Invs),
1537 statics_consist1(Invs,TStatics),!.
1538
1540
1542get_invariants(Invs) :-
1543 atomic_invariants(Invs),!.
1544
1545rem_statics([ss(S,X,Preds)|Post], [ss(S,X,PredR)|PostR],Rt1) :-
1546 filter_list(Preds, is_a_dynamic_pred,PredR),
1547 filter_list(Preds, is_a_static_pred, R),
1548 rem_statics(Post, PostR,Rt),
1549 append(Rt,[is_of_sort(X,S)|R],Rt1),!.
1550rem_statics([se(S,X,Preds)|Post], [se(S,X,PredR)|PostR],Rt1) :-
1551 filter_list(Preds, is_a_dynamic_pred,PredR),
1552 filter_list(Preds, is_a_static_pred, R),
1553 rem_statics(Post, PostR,Rt),
1554 append(Rt,[is_of_sort(X,S)|R],Rt1),!.
1555rem_statics([], [],[]) :-!.
1556
1557
1558
1560
1561isemptylist([]):-!.
1562
1563
1564member_cut(X,[X|_]) :- !.
1565member_cut(X,[_|Y]) :- member_cut(X,Y),!.
1566
1567member_e(X,[Y|_]):-
1568 X==Y,!.
1569member_e(X,[Y|L]):-
1570 var(Y),
1571 member_e(X,L),!.
1572member_e(ss(Sort,Obj,SE),[ss(Sort,Obj1,SE)|_]):-
1573 Obj==Obj1,!.
1574member_e(se(Sort,Obj,SE),[se(Sort,Obj1,SE)|_]):-
1575 Obj==Obj1,!.
1576member_e(sc(Sort,Obj,SE1=>SE2),[sc(Sort,Obj1,SE1=>SE2)|_]):-
1577 Obj==Obj1,!.
1578member_e(X,[Y|L]):- member_e(X,L),!.
1581u_mem_cut(_,[]):-!,fail.
1582u_mem_cut(X,[Y|_]) :- X == Y,!.
1583u_mem_cut(X,[_|L]) :- u_mem_cut(X,L),!.
1584
1585
1590obj_member(X,[X|[]]):-!.
1591obj_member(X,List):-
1592 obj_member0(X,List),!.
1593obj_member0(X,[Y|_]):-
1594 var(X),!. 1595obj_member0(X,[Y|_]):-
1596 X==Y,!.
1597obj_member0(X,[_|Y]) :- obj_member0(X,Y),!.
1598
1603pred_member(ne(A,B),List):-
1604 A\==B,!.
1605pred_member(is_of_sort(A,B),List):-
1606 get_sort_objects(B,Objls),
1607 obj_member(A,Objls),!.
1608pred_member(is_of_primitive_sort(A,B),List):-
1609 objects(B,Objls),
1610 obj_member(A,Objls),!.
1611pred_member(X,List):-
1612 setof(X,member(X,List),Refined),
1613 pred_member0(X,Refined),!.
1614pred_member0(X,[X|[]]):-!.
1615pred_member0(X,Y):-
1616 pred_member1(X,Y),!.
1617pred_member1(X,[Y|_]):-
1618 X=..[H|XLs],
1619 Y=..[H|YLs],
1620 vequal(XLs,YLs),!.
1621pred_member1(X,[_|Y]):- pred_member1(X,Y),!.
1622
1623
1624
1625append_cut([],L,L) :- !.
1626append_cut([H|T],L,[H|Z]) :- append_cut(T,L,Z),!.
1627
1631append_st(ST1,ST2,ST):-
1632 append_cut(ST1,ST2,ST0),
1633 remove_unneed(ST0,[],ST),!.
1634
1637remove_unneed([],C,C):-!.
1638remove_unneed([A|B], Z, C):-
1639 var(A),
1640 member_e(A,Z),
1641 remove_unneed(B, Z, C),! .
1642remove_unneed([A|B], Z, C):-
1643 var(A),
1644 append(Z,[A],D),
1645 remove_unneed(B, D, C),!.
1646remove_unneed([A|B], Z, C):-
1647 ground(A),
1648 remove_unneed(B, Z, C),!.
1649remove_unneed([A|B], Z, C):-
1650 A=..[ne|Paras],
1651 append(Z,[A],D),
1652 remove_unneed(B, D, C),!.
1653remove_unneed([A|B], Z, C):-
1654 A=..[Pred|Paras],
1655 same_var_member(A,Z),
1656 remove_unneed(B, Z, C),!.
1657remove_unneed([A|B], Z, C):-
1658 append(Z,[A],D),
1659 remove_unneed(B, D, C),!.
1660
1661same_var_member(Pred,[Pred1|List]):-
1662 var(Pred1),
1663 same_var_member(Pred,List),!.
1664same_var_member(Pred,[Pred1|List]):-
1665 Pred==Pred1,!.
1666same_var_member(Pred,[Pred1|List]):-
1667 Pred=..[H|T],
1668 Pred1=..[H|T1],
1669 same_var_member1(T,T1),!.
1670same_var_member(Pred,[Pred1|List]):-
1671 same_var_member(Pred,List),!.
1672
1673same_var_member1([],[]):-!.
1674same_var_member1([H1|T],[H2|T]):-
1675 var(H1),
1676 H1==H2,!.
1677same_var_member1([H|T1],[H|T2]):-
1678 var(T1),
1679 T1==T2,!.
1680same_var_member1([H1|T1],[H2|T2]):-
1681 H1==H2,
1682 same_var_member1(T1,T2),!.
1683
1684
1688set_append_e(A,B,C):-
1689 append_cut(A,B,D),
1690 remove_dup(D,[],C),!.
1691
1693remove_dup([],C,C):-!.
1694remove_dup([A|B],Z,C) :-
1695 member_e(A, Z),
1696 remove_dup(B, Z, C),! .
1697remove_dup([A|B], Z, C):-
1698 append(Z,[A],D),
1699 remove_dup(B, D, C),!.
1700
1701vequal([],[]):-!.
1702vequal([X|XLs],[Y|YLs]):-
1703 var(X),
1704 vequal(XLs,YLs),!.
1705vequal([X|XLs],[Y|YLs]):-
1706 var(Y),
1707 vequal(XLs,YLs),!.
1708vequal([X|XLs],[Y|YLs]):-
1709 X==Y,
1710 vequal(XLs,YLs),!.
1711
1712
1714
1716is_a_static_pred(X) :-
1717 atomic_invariants( A ),
1718 not( not( member(X,A) )),!.
1719is_a_static_pred(ne(_,_)) :-!.
1720is_a_static_pred(is_of_sort(_,_)) :-!.
1721
1722is_a_dynamic_pred(X) :-
1723 not( is_a_static_pred(X) ),!.
1724
1728
1729filter_list([X|Rest],Op,[X|Rest1]) :-
1730 Op =.. OL,
1731 append(OL,[X],OL1),
1732 Pred =.. OL1,
1733 call(Pred),
1734 filter_list(Rest,Op,Rest1),!.
1735filter_list([_|Rest],Op,Rest1) :-
1736 filter_list(Rest,Op,Rest1),!.
1737filter_list([],_,[]).
1738
1739
1740
1749
1750file_exists(Filename):-exists_file(Filename).
1751
1754subtract([],_,[]):-!.
1755subtract([A|B],C,D) :-
1756 member(A,C),
1757 subtract(B,C,D),!.
1758subtract([A|B],C,[A|D]) :-
1759 subtract(B,C,D),!.
1760
1762
1763list_take(R,[E|R1],R2):-
1764 remove_el(R,E,RR),
1765 list_take(RR,R1,R2),!.
1766list_take(R,[_|R1],R2):-
1767 list_take(R,R1,R2),!.
1768list_take(A,[],A) :- !.
1769
1770 1772remove_el([],_,[]) :- ! .
1773remove_el([A|B],A,B) :- ! .
1774remove_el([A|B],C,[A|D]) :-
1775 remove_el(B,C,D) .
1776
1778
1779gensym_special(Root,Atom) :-
1780 getnum(Root,Num),
1781 name(Root,Name1),
1782 name(Num,Name2),
1783 append(Name1,Name2,Name),
1784 name(Atom,Name).
1785
1786getnum(Root,Num) :-
1787 retract(current_num(Root,Num1)),!,
1788 Num is Num1+1,
1789 asserta(current_num(Root,Num)).
1790
1791getnum(Root,1) :- asserta(current_num(Root,1)).
1792
1793
1795
1796gensym_num(Root,Num,Atom):-
1797 name(Root,Name),
1798 name(Num,Name1),
1799 append(Name,Name1,Name2),
1800 name(Atom,Name2),!.
1801
1802
1804pprint([],SIZE,SIZE):-!.
1805pprint([HS|TS],Size0,SIZE):-
1806 list(HS),
1807 pprint(HS,Size0,Size1),
1808 pprint(TS,Size1,SIZE),!.
1809pprint([HS|TS],Size0,SIZE):-
1812 Size1 is Size0+1,
1813 pprint(TS,Size1,SIZE),!.
1814
1815
1817
1818flatten([HO|TO], List, O_List):-
1819 append(HO, List, List_tmp),
1820 flatten(TO, List_tmp, O_List),!.
1821flatten([H|TO], List,O_List):-
1822 append([H], List, List_tmp),
1823 flatten(TO, List_tmp, O_List).
1824flatten([], [HList|T], O_List):-
1825 HList = [],
1826 flatten(T, [], O_List).
1827flatten([], [HList|T], O_List):-
1828 list(HList),
1829 flatten([HList|T],[], O_List),!.
1830flatten([], L,L):-!.
1831
1833set_flatten([HO|TO], List, O_List):-
1834 set_append_e(HO, List, List_tmp),
1835 set_flatten(TO, List_tmp, O_List),!.
1836set_flatten([H|TO], List,O_List):-
1837 set_append_e([H], List, List_tmp),
1838 set_flatten(TO, List_tmp, O_List).
1839set_flatten([], [HList|T], O_List):-
1840 HList = [],
1841 set_flatten(T, [], O_List).
1842set_flatten([], [HList|T], O_List):-
1843 list(HList),
1844 set_flatten([HList|T],[], O_List),!.
1845set_flatten([], L,L):-!.
1846
1849list(A) :-
1850 var(A) ,
1851 ! ,
1852 fail .
1853list(A) :-
1854 functor(A,'.',_).
1856:- assert(time_taken(0)). 1857:- assert(soln_size(0)). 1858:- assert(plan_used(0)). 1859
1860solve(N,FN):-
1861 N < FN,
1862 tell(user),
1863 nl,write('task '), write(N),write(': '),nl,
1864 solution_file(F),
1865 tell(F),
1866 nl,write('task '), write(N),write(': '),nl,
1867 solve(N),
1868 Ni is N+1,
1869 solve(Ni,FN).
1870solve(FN,FN):-
1871 tell(user),nl,write('task '),
1872 write(FN),write(': '),nl,
1873 solution_file(F),
1874 tell(F),
1875 nl,write('task '),
1876 write(FN),write(': '),nl,
1877 solve(FN),
1878 retractall(sum(_)),
1879 assert(sum(0)),
1880 sum_time(CP),
1881 retractall(sum(_)),
1882 assert(sum(0)),
1883 sum_size(SIZE),
1884 TIM is CP /1000,
1885 retractall(sum(_)),
1886 assert(sum(0)),
1887 sum_plan(PLAN),
1888 retractall(time_taken(_)),
1889 retractall(soln_size(_)),
1890 retractall(plan_used(_)),
1891 nl,write('total time '),write(TIM),write(' seconds'),
1892 nl,write('total size '),write(SIZE),
1893 nl,write('plan used '),write(PLAN),
1894 nl,
1895 told.
1896
1897sum_time(TIM):-
1898 time_taken(CP),
1899 retract(sum(N)),
1900 N1 is N +CP,
1901 assert(sum(N1)),
1902 fail.
1903sum_time(TIM):-
1904 sum(TIM).
1905sum_size(SIZE):-
1906 soln_size(S),
1907 retract(sum(N)),
1908 N1 is N +S,
1909 assert(sum(N1)),
1910 fail.
1911sum_size(SIZE):-
1912 sum(SIZE).
1913
1914
1915sum_plan(Plan):-
1916 plan_used(PL),
1917 retract(sum(N)),
1918 N1 is N +PL,
1919 assert(sum(N1)),
1920 fail.
1921sum_plan(Plan):-
1922 sum(Plan).
1923
1924
1926ground_hierarchy:-
1927 ground_predicates,
1928 ground_substate_class,!.
1929
1932ground_predicates:-
1933 predicates(Preds),
1934 grounding_preds(Preds),
1935 collect_grounded_pred,!.
1936
1937grounding_preds([]).
1939grounding_preds([HPred|TP]):-
1940 functor(HPred,FF,NN),
1941 functor(APred,FF,NN),
1942 atomic_invariants(Atom),
1943 member(APred,Atom),
1944 ground_all_var_atom(HPred),
1945 grounding_preds(TP).
1947grounding_preds([HPred|TP]):-
1948 functor(HPred,FF,NN),
1949 functor(GPred,FF,NN),
1950 ground_all_var(GPred,HPred),
1951 grounding_preds(TP).
1952
1954collect_grounded_pred:-
1955 gpred(Pred,_),
1956 setof(GPred,gpred(Pred,GPred),GPredls),
1957 retractall(gpred(Pred,_)),
1958 assert(gpredicates(Pred,GPredls)),
1959 fail.
1960collect_grounded_pred.
1961
1964ground_substate_class:-
1965 substate_classes(Sort,Obj,Substate),
1966 find_prim_sort(Sort,PS),
1967 assert_subclass(PS,Obj,Substate),
1968 fail.
1969ground_substate_class:-
1970 collect_grounded_substates.
1971
1972assert_subclass([],Obj,Substate).
1973assert_subclass([HS|TS],Obj,Substate):-
1974 assert(gsstates(HS,Obj,Substate)),
1975 assert_subclass(TS,Obj,Substate).
1976
1977collect_grounded_substates:-
1978 gsstates(Sort,Obj,_),
1979 setof(SStates,gsstates(Sort,Obj,SStates),GSStates),
1980 retractall(gsstates(Sort,Obj,_)),
1981 all_combined(GSStates,GSStates0),
1982 assert(gsubstate_classes(Sort,Obj,GSStates0)),
1983 fail.
1984collect_grounded_substates.
1985
1986all_combined(SStates,CSStates):-
1987 xprod(SStates,CSStates1),
1988 flat_interal(CSStates1,CSStates),!.
1989
1990flat_interal([],[]):-!.
1991flat_interal([HSS1|TSS1],[HSS|TSS]):-
1992 flatten(HSS1,[],HSS),
1993 flat_interal(TSS1,TSS),!.
1994
1995ground_all_var_atom(HPred):-
1996 functor(HPred,FF,NN),
1997 functor(GPred,FF,NN),
1998 functor(APred,FF,NN),
1999 atomic_invariants(Atom),
2000 member(APred,Atom),
2001 GPred=..[Name|Vars],
2002 APred=..[Name|Sorts],
2003 ground_all_var_atom0(Vars,Sorts),
2004 assert_gpred(GPred),
2005 fail.
2006ground_all_var_atom(HPred).
2007
2008ground_all_var_atom0([],[]).
2009ground_all_var_atom0([HVars|TV],[HSorts|TS]):-
2010 subsorts(HSorts,Subsorts),
2011 split_prim_noprim(Subsorts,PSorts,NPSorts),
2012 member(LS,PSorts),
2013 objects(LS,Objls),
2014 member(HVars,Objls),
2015 ground_all_var_atom0(TV,TS).
2016ground_all_var_atom0([HVar|TV],[HASorts|TS]):-
2017 objects(Sorts,Objls),
2018 member(HASorts,Objls),
2019 HVar=HASorts,
2020 ground_all_var_atom0(TV,TS).
2021
2022ground_all_var(GPred,HPred):-
2023 GPred=..[Name|Vars],
2024 HPred=..[Name|Sorts],
2025 ground_all_var0(Vars,Sorts),
2026 not(inconsistent_constraint([GPred])),
2027 assert_gpred(GPred),
2028 fail.
2029ground_all_var(GPred,HPred).
2030
2031ground_all_var0([],[]).
2032ground_all_var0([HVars|TV],[HSorts|TS]):-
2033 objects(HSorts,Objls),
2034 member(HVars,Objls),
2035 ground_all_var0(TV,TS).
2036ground_all_var0([HVars|TV],[HSorts|TS]):-
2037 subsorts(HSorts,Subsorts),
2038 split_prim_noprim(Subsorts,PSorts,NPSorts),
2039 member(LS,PSorts),
2040 objects(LS,Objls),
2041 member(HVars,Objls),
2042 ground_all_var0(TV,TS).
2043
2045
2046assert_gpred(GPred):-
2047 functor(GPred,FF,NN),
2048 functor(UPred,FF,NN),
2049 assert_gpred0(GPred,UPred),!.
2050
2051assert_gpred0(GPred,UPred):-
2052 GPred=..[Name|PSorts],
2053 UPred=..[Name|Vars],
2054 get_obj_sort(Vars,PSorts),
2055 assert(gpred(UPred,GPred)),
2056 fail.
2057assert_gpred0(GPred,UPred).
2058
2059get_obj_sort([],[]):-!.
2060get_obj_sort([HVars|TV],[HObj|TS]):-
2061 objects(HVars,Objls),
2062 member(HObj,Objls),
2063 get_obj_sort(TV,TS),!.
2064
2065delete_all_nodes :-
2066 retractall(node(_,_,_,_,_)),
2067 retractall(final_node(_)),
2068 retractall(tp_node(_,_,_,_,_,_)),
2069 retractall(closed_node(_,_,_,_,_,_)),
2070 retractall(solved_node(_,_,_)).
2071delete_all_nodes :- !.
2072
2073
2076xprod(A,B,C) :-
2077 xprod([A,B],C) .
2078
2079xprod([],[]).
2080xprod(A,E) :-
2081 xprod(A,B,C,D) ,
2082 F =..[^,C,D] ,
2083 call(setof(B,F,E)) .
2084
2085xprod([X],[A],A,member(A,X)) .
2086xprod([X,Y],[A,B],C,(D,E)) :-
2087 C =..[^,A,B] ,
2088 D =..[member,A,X] ,
2089 E =..[member,B,Y] .
2090xprod([X|Y],[A|E],D,(F,G)) :-
2091 D =..[^,A,C] ,
2092 F =..[member,A,X] ,
2093 xprod(Y,E,C,G).
2094
2095
2096:- include(translog4). 2097
2098:- fixup_exports.
htncode
% Provides a prolog database env % % % % Logicmoo Project PrologMUD: A MUD server written in Prolog % Maintainer: Douglas Miles % Denton, TX 2005, 2010, 2014 % Dec 13, 2035 % */