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 % */

   12:-module(htncode,[]).
   13
   14:-multifile(user:push_env_ctx/0).   15:-dynamic(user:push_env_ctx/0).   16
   17/* ***********************************/
   18/* Douglas Miles 2005, 2010, 2014 */
   19/* Denton, TX */
   20/* ***********************************/
   21
   22% [Required] Load the Logicmoo Library Utils
   23:- ensure_loaded(library(logicmoo_common)).   24:- ensure_loaded(library(planner_api)).   25:- use_module(library(logicmoo_planner)).   26
   27:- kb_shared(baseKB:mpred_prop/3).   28
   29:- ensure_loaded(library(logicmoo/util_structs)).   30:- ensure_loaded(library(logicmoo/util_bb_env)).   31:- prolog_load_context(file,File),ain(user:env_source_file(File)).   32
   33:-op(500,fx,env_call).
   34/* htncode.pl */

   35
   36/* Donghong Liu */

   37/* University of Huddersfield */

   38/* September 2002 */

   39/* **********************************/

   40/* gipohyhtn.pl */
   41/* HyHTN planning: do preprocess first  */
   42/* make all method and operators primitive */
   43
   44
   45planner_failure(Why,Info):-dmsg(error,Why-Info),banner_party(error,'FAILURE_PLANNER'),print_message(error,'FAILURE_PLANNER'(Why,Info)),!. %sleep(2).
   46
   47:-thread_local t_l:doing/1.   48
   49statistics_runtime(CP):-statistics(runtime,[_,CP0]), (CP0==0 -> CP= 0.0000000000001 ; CP is (CP0/1000)) .  % runtime WAS process_cputime
   50statistics_walltime(CP):-statistics(walltime,[_,CP0]), (CP0==0 -> CP= 0.0000000000001 ; CP is (CP0/1000)) .  % runtime WAS process_cputime
   51
   52
   53
   54/*
   55 * GIPO COPYRIGHT NOTICE, LICENSE AND DISCLAIMER.
   56 *
   57 * Copyright 2001 - 2003 by R.M.Simpson W.Zhao T.L.McCLuskey D Liu D. Kitchin
   58 *
   59 * Permission to use, copy, modify, and distribute this software and its
   60 * documentation for any purpose and without fee is hereby granted,
   61 * provided that the above copyright notice appear in all copies and that
   62 * both the copyright notice and this permission notice and warranty
   63 * disclaimer appear in supporting documentation, and that the names of
   64 * the authors or their employers not be used in advertising or publicity 
   65 * pertaining to distribution of the software without specific, written 
   66 * prior permission.
   67 *
   68 * The authors and their employers disclaim all warranties with regard to 
   69 * this software, including all implied warranties of merchantability and 
   70 * fitness.  In no event shall the authors or their employers be liable 
   71 * for any special, indirect or consequential damages or any damages 
   72 * whatsoever resulting from loss of use, data or profits, whether in an 
   73 * action of contract, negligence or other tortious action, arising out of 
   74 * or in connection with the use or performance of this software.
   75 */
   76 /* gipohyhtn.pl */
   77/* HyHTN planning: do preprocess first  */
   78/* make all method and operators primitive */
   79%:-use_module(library(system)).
   80/*********************** initialisation**************/
   81:-dynamic my_stats/1. 
   82
   83
   84:-multifile(on_call_decl_hyhtn/0).   85:-export(on_call_decl_hyhtn/0).   86% Tasks
   87on_call_decl_hyhtn :- decl_env_mpred_dom([kb(dom,tasks),stubType(dyn)], ( htn_task/3, planner_task/3, planner_task_slow/3 )).
   88
   89on_call_decl_hyhtn :- decl_env_mpred_dom([stubType(dyn),kb(dom,cache)],(temp_assertIndivConds/1)). % Used for grounding operators
   90on_call_decl_hyhtn :- decl_env_mpred_dom([stubType(dyn),kb(dom,cache)],(is_of_primitive_sort/2, is_of_sort/2)).
   91on_call_decl_hyhtn :- decl_env_mpred_dom([stubType(dyn),kb(dom,cache)],(methodC/7, opParent/6,operatorC/5,gOperator/3)).
   92on_call_decl_hyhtn :- decl_env_mpred_dom([stubType(dyn),kb(dom,cache)],(objectsC/2,objectsD/2,atomic_invariantsC/1)).% Used only dynamic objects
   93on_call_decl_hyhtn :- decl_env_mpred_dom([stubType(dyn),kb(dom,cache)],(objectsOfSort/2)).      % Used to store all objects of a sort
   94on_call_decl_hyhtn :- decl_env_mpred_dom([stubType(dyn),kb(dom,cache) /*stubType(with_pred(bb_op(_)))*/],(related_op/2, gsubstate_classes/3, gsstates/3)).  
   95
   96on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)],(initial_state/1)). 
   97on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache) /*stubType(with_pred(bb_op(_)))*/],(op_score/2)). 
   98on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)/*stubType(rec_db)*/],(node/5,final_node/1)).
   99on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)],(tp_goal/3,closed_node/6,solved_node/2, goal_related_search/1)). 
  100%on_call_decl_hyhtn :- decl_env_mpred_task([stubType(rec_db),kb(node,cache)],(goal_related/3)).
  101on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)],(goal_related/3)).
  102on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)],(current_num/2)).
  103on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)],(tn/6)). % Used to store full expanded steps
  104on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)],(tp_node/6)).
  105% on_call_decl_hyhtn :- decl_env_mpred_task([stubType(dyn),kb(node,cache)],(tp_node_cached/6)).
  106% on_call_decl_hyhtn :- decl_env_mpred_task([stubType(with_pred(gvar_list(tnodeSORTED))),kb(node,cache)],tp_node/6).
  107
  108% Tasks
  109on_call_decl_hyhtn :- decl_env_mpred_dom([kb(dom,tasks),stubType(dyn)], ( htn_task/3, planner_task/3, planner_task_slow/3 )).
  110
  111% Contents of a OCLh Domain
  112on_call_decl_hyhtn :-  
  113  decl_env_mpred_dom([kb(dom,file),stubType(dyn)],[domain_name/1,sorts/2,substate_classes/3,objects/2,predicates/1,inconsistent_constraint/1,atomic_invariants/1,
  114  implied_invariant/2,operator/4,
  115   % oper/4,
  116   method/6]).
  117
  118:-export(call_decl_hyhtn/0).  119
  120% :- rtrace.
  121
  122call_decl_hyhtn:-must(doall(on_call_decl_hyhtn)).
  123
  124% :- % 
  125  %  call_decl_hyhtn.
  126
  127
  128
  129%%% ON :- initialization( profiler(_,walltime) ).
  130%%% ON :- initialization(user:use_module(library(swi/pce_profile))).
  131% :- qcompile_libraries.
  132
  133
  134% :- rtrace.
  135tryff(Call):- predicate_property(Call,_),!,once(tryf((Call,assert(passed_test_try(Call))))),fail.
  136tryf(Call):- predicate_property(Call,_),!,catch(Call,E,dmsg(E = Call)).
  137trye(Call):- catch(Call,E,((dmsg(error(E , Call)),throw(trace),Call))).
  138
  139:-dynamic(passed_test_try/1).  140:-dynamic(testing_already/0).  141
  142check_passed_any:-not(not(passed_test_try(_))),nl,listing(passed_test_try/1).
  143
  144ttm:-retractall(passed_test_try(_)),fail.
  145ttm:-testing_already,!.
  146ttm:-asserta(testing_already), make, retractall(testing_already),fail.
  147
  148
  149:-export(banner_party/2).(E,BANNER):- 
  151  ansicall(yellow,(
  152      format("% xxxxxxxxxxxxxxx ~w xxxxxxxxxxxxxxxxxxx~n",[E]),            
  153      forall(t_l:doing(X),dmsg(E,doing(X))),
  154      dmsg5(E,BANNER), 
  155       format("% xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~n",[]))).
  156      
  157      
  158subst_eq_h(A,B,C,D):- nd_subst(A,B,C,D),!.
  159subst_eq_h(A,B,C,D):- throw(trace), nd_subst(A,B,C,D),!.
  160
  161
  162:-export(term_expansion_alias/2).  163term_expansion_alias(In,Out):-term_expansion_alias([],In,Out).
  164term_expansion_alias(Not,In,Out):-term_alias(I,O),not(member(I,Not)),subst_eq_h(In,I,O,M), In\=@=M,!, term_expansion_alias([I|Not],M,Out).
  165term_expansion_alias(_Not,InOut,InOut).
  166term_alias(cond,se).
  167term_alias(se,se).
  168term_alias(state,ss).
  169term_alias(trans,sc).
  170term_alias(ne,dif).
  171term_alias(neq,dif).
  172% term_alias(htn_task,planner_task).
  173term_alias(startOcl,start).
  174term_alias(startOCL,start).
  175
  176
  177%get_tasks(B, C, D) :-%show_call(get_env_ctx(A)),!, 
  178%  if_defined(get_tasks(_A, B, C, D)).
  179
  180
  181tasks:- 
  182 Call = get_tasks(N,Goal,State),
  183   setof(Call,Call,List),list_to_set(List,Set),!,
  184   env_info(kb(dom,file)),!,
  185   once((ignore(forall(member(Call,Set),
  186     locally(t_l:doing(tasks(N,Goal)),
  187      ((
  188      must(nonvar(Goal)),must(nonvar(State)),
  189      ignore(N=Goal),      
  190      must((term_expansion_alias((Goal:-State),(GGoal:-GState)))),
  191      must(nonvar(GGoal)),must(nonvar(GState)),
  192      banner_party(informational,('GOAL'(N):-GGoal)),
  193      must(((once( once(startOCL(GGoal,GState))*->banner_party(informational,'SUCCESSS');banner_party(error,'FAILUR!!!!!!!!!!!!!!!!!!!!!!!!!!!E')))))))))))).
  194
  195t:- once(run_header_tests).
  196
  197tt:-catch(ttm,E,dmsg(E)),!.
  198
  199tt:-tryff((tasks)).
  200tt:-tryff((task1)).
  201tt:-tryff((task2)).
  202tt:-tryff((task3)).
  203tt:-tryff((task4)).
  204tt:-tryff((task5)).
  205tt:-tryff((task6)).
  206tt:-tryff((task7)).
  207tt:-tryff((task8)).
  208tt:-tryff((task9)).
  209tt:-tryff((task10)).
  210tt:-tryff((task11)).
  211tt:-tryff((task22)).
  212tt:-tryff((task33)).
  213tt:-tryff((task44)).
  214tt:-check_passed_any,!.
  215
  216
  217tdom:-tdom([htn1,ty,ocl1,r3]).
  218tdom2:-tdom([ocl2,htn2,htn3,htn4]).
  219
  220tdomfile(F):-tdomcall(load_data_file(F)).
  221tdomcall(Call):- trye(once((env_clear_doms_and_tasks,trye(Call),tt))).
  222
  223tdom([]):-!.
  224tdom([H|T]):- !, tdom(H),tdom(T).
  225tdom(H):- predicate_property(H,_),!, throw(trace),call(H).
  226tdom(F):- tdom1(F),!.
  227tdom(F):- expand_file_name(F,List),List\=[],!,tdom1(List).
  228tdom(F):- throw(tdom(F)).
  229
  230tdom1([]):-!.
  231tdom1([H|T]):- !, tdom(H),tdom(T).
  232tdom1(F):- tdom2(F),!.
  233tdom1(FIn):- atom(FIn),tdom2(FIn).
  234
  235tdom2(FIn):- tdom3(FIn),!.
  236tdom2(FIn):- atom_concat('domains_ocl/',FIn,F), tdom3(F),!.
  237
  238tdom3(FIn):- tdom4(FIn).
  239tdom3(FIn):- atom_concat(FIn,'htn',F),tdom4(F).
  240tdom3(FIn):- atom_concat(FIn,'ocl',F),tdom4(F).
  241
  242tdom4(F):- exists_file(F),!,tdomfile(F).
  243
  244
  245:- discontiguous(post_header_hook/0).  246post_header_hook:-retractall(canDoTermExp).
  247% user:term_expansion(In,Out):- canDoTermExp,term_expansion_hyhtn(In,M),In\=@=M,expand_term(M,Out).
  248% user:goal_expansion(In,Out):- canDoTermExp,term_expansion_hyhtn(In,M),In\=@=M,expand_goal(M,Out).
  249post_header_hook:-asserta(canDoTermExp).
  250
  251:-export(env_clear_doms_and_tasks/0).  252env_clear_doms_and_tasks:- env_clear(kb(dom,file)),env_clear(kb(dom,tasks)),env_clear(kb(dom,cache)),!.
  253   
  254:- op(100,xfy,( /*ocluser*/ocl:('=>'))).  255
  256% :-set_prolog_flag(verbose_file_search,true).
  257post_header_hook:-set_prolog_flag(verbose_load,full).
  258post_header_hook:-use_module(library(lists)).
  259
  260% :- must((current_op(P,FXY,(-)),arg(_,v(fy,fx),FXY),P =< 300)).
  261:- style_check(-singleton).  262:- style_check(+discontiguous).  263
  264
  265%post_header_hook:-use_module(library(system)).
  266:-if(exists_source(library(gui_tracer))).  267post_header_hook:- user:use_module(library(gui_tracer)),catch(guitracer,_,true).
  268:-endif.  269post_header:- !.
  270post_header:- dmsg(post_header),fail, forall(clause(post_header_hook,G),G). 
  271
  272
  273:- discontiguous(header_tests/0).  274
  275run_tests(Call) :- 
  276  statistics_runtime(InTime),  
  277  locally(doing(run_tests(Call)),
  278   call_cleanup(Call, 
  279  ((
  280 statistics_runtime(OutTime),
  281  Time is OutTime - InTime,
  282  banner_party(informational,runtests(Call) = time(Time)))))).
  283 
  284run_header_tests :- run_tests(forall(clause(header_tests,G),run_tests(G))).
  285
  286
  287:-export(test_ocl/1).  288test_ocl(File):- forall(filematch(File,FM),test_ocl0(FM)).
  289test_ocl0(File):- time(locally(t_l:doing(test_ocl(File)), 
  290   once((env_clear_doms_and_tasks,clean_problem,l_file(File),tasks)))).
  291
  292header_tests :-test_ocl('domains_ocl/*.ocl').
  293
  294
  295:- style_check(-singleton).  296:- style_check(-discontiguous).  297%:-use_module(library(system)).
  298
  299%:- asserta(t_l:disable_px).
  300
  301
  302:-use_module(library(system)).
  303
  304
  305
  306:- dynamic htn_task/3.
  307:- multifile htn_task/3.
  308:- dynamic planner_task/3.
  309
  310htn_task(Id,Goal,Init):-planner_task(Id,Goal,Init).
  311
  312% The following elements are expected in the sort engineered domain model
  313% 
  314:-dynamic  
  315
  316  domain_name/1,
  317  sorts/2,
  318  objects/2,
  319  predicates/1,
  320  atomic_invariants/1,
  321  substate_classes/3,
  322  method/6,
  323  operator/4,
  324  implied_invariant/2,
  325  inconsistent_constraint/1.
  326  
  327:-discontiguous  
  328  domain_name/1,
  329  sorts/2,
  330  objects/2,
  331  predicates/1,
  332  atomic_invariants/1,
  333  substate_classes/3,
  334  method/6,
  335  operator/4,
  336  implied_invariant/2,
  337  inconsistent_constraint/1.  338
  339
  340%  ss class expressions
  341%  invariants:
  342%   atomic invariants
  343%   -ve invariants
  344%   +ve invariants
  345%  operators
  346
  347
  348% for boot..
  349:- dynamic kill_file/1,solution_file/1.
  350%
  351my_stats(0).
  352solution_file(fred).
  353
  354
  355%:-set_prolog_flag(unknown,fail).
  356%:- unknown(error,fail).
  357:- dynamic gsstates/3, gpred/2.
  358:- op(100,xfy,'=>').
  359%---------------------structure--------------------
  360% for whole search:
  361% node(Nodeid, Precond, Decomps, Temp, Statics)
  362% tn(Tnid, Name, Precond, Postcond,Temp, Decomps)
  363% tn is a full expanded node, it has fixed decomps and postcondtion
  364% step(HPid,ActName,Precond,Postcond,Expansion)
  365% for fwsearch achieve(Goal) only:
  366% tp_goal(Pre,Goal,Statics)
  367% goal_related(se(Sort,Obj,SEpre),Opls,LengthToGoal)
  368% tp_node(TPid,Pre,Statics,from(Parentid),Score,Steps)
  369% closed_node(TPid,Pre,from(Parentid),Score,Steps)
  370%---------------------structure end--------------------
  371
  372:- dynamic op_num/1. 
  373:- dynamic sum/1.
  374%:- dynamic initial_node/1, final_node/1.
  375:- dynamic methodC/7, operatorC/5, my_stats/1.
  376%%:- dynamic node/7,,solved_node/5.
  377:- dynamic tp_node/6,tn/6.
  378:- dynamic solved_node/2.
  379:- dynamic closed_node/6.
  380:- dynamic gsubstate_classes/3.
  381:- dynamic current_num/2.
  382:- dynamic produce/4,goal_related/1. %%,achieved_goal/1.
  383
  384incr_op_num:- flag(op_num,X,X+1).
  385set_op_num(X):-flag(op_num,_,X).
  386current_op_num(X):- flag(op_num,X,X).
  387
  388
  389
  390startOCL(Goal,Init):-
  391  clean_problem,
  392   dmsg('OCL-PLANNER-TASK'(Goal)),
  393	must(planner_interface(Goal,Init,Sol,_,TNLst)),
  394        show_result_and_clean(F,Id,Sol,TNLst).
  395
  396
  397get_tasks(N,Goal,State):- htn_task(N,Goal,State).
  398% get_tasks(N,Goal,State):- ocl:htn_task(N,Goal,State).
  399get_tasks(N,Goal,State):- env_call planner_task(N,Goal,State).
  400
  401:- set_op_num(0).  402:-asserta(my_stats(0)).  403
  404l_file(File):- \+ exists_file(File),!,forall(filematch(File,FM),l_file(FM)).
  405l_file(F):- env_consult(ocl:F).
  406l_file(F):-
  407   if_defined(/*ocluser*/ocl:force_reload_mpred_file(F),
  408              if_defined(/*ocluser*/ocl:with_mpred_consult(/*ocluser*/ocl:consult(F)),/*ocluser*/ocl:consult(F))).
  409
  410solve_file(F):-with_filematch(l_file(wfm(F))), doall(solve(_)).
  411solve:- solve_file(test_hyhtn).
  412
  413
  414
  415solve(Id) :- fail,
  416	no_repeats(get_tasks(Id,Goal,Init)),
  417	planner_interface(Goal,Init,Sol,_),
  418        show_result_and_clean(_,Id,Sol,[Id]).
  419
  420solve(Id) :-
 
  421	htn_task(Id,Goal,Init),
  422	once(planner_interface(Goal,Init,Sol,_)),
  423%	solution_file(F),
  424%	gensym_num(F,Id,TRF),
  425%	tell(user),
  426%	write('TASK '),write(Id),nl,
  427%	write('SOLUTION'),nl,
  428%	display_sol(Sol),
  429%	write('END FILE'),nl,
  430%	told,
  431	clean_problem.
  432
  433show_result_and_clean(F,Id,Sol,TNLst):-
  434   %ignore(solution_file(F)),
  435	tell(user),
  436	format('~NSOLUTION for TASK ~w~n',[Id]),
  437	display_sol(Sol),
  438        %write_out_test_data('.preClean',Id),
  439      %  write('END FILE'),nl,nl,
  440	nop((reverse(TNLst,TNForward), display_details(TNForward), write('END PLANNER RESULT'))),
  441	told,
  442	clean_problem.        
  443
  444write_out_test_data(_MoreID,_Id):-!.
  445write_out_test_data(MoreID,Id):-
  446  must((
  447    
  448    (var(Id)->statistics(walltime,[Id,_]);true),
  449    (push_env_ctx-> A= pushed_ ; A=nonpushed_ ),
  450    atom_concat(A,Id,TN),atom_concat(TN,MoreID,TTN),
  451      lws(TTN))),!.
  452
  453display_sol([]).
  454display_sol([H|T]) :-
  455	write(H),
  456	nl,
  457	display_sol(T).
  458
  459display_details([]):-!.
  460display_details([H|T]):-!,display_details(H),display_details(T),!.
  461display_details(tn(TN,Name,Pre,Post,Temp,Dec)):-
  462%    write('method::Description:'),write(';'),
  463    nl,write('BEGIN METHOD'),nl,write(TN),write(';'),
  464    nl,write('Name:'),write(Name),write(';'),
  465    nl,write('Pre-condition:'),write(Pre),write(';'),
  466%    write('Index Transitions:'),write(Pre),write('=>'),write(Post1),write(';'),
  467    nl,write('Index Transitions:'),write('=>'),write(Post),write(';'),
  468%    write('Static:'),write(';'),
  469    nl,write('Temporal Constraints:'),write(Temp),write(';'),
  470    nl,write('Decomposition:'),write(Dec),write(';'),
  471    nl.
  472
  473display_details(H):-dmsg((display_details:-H)).
  474
  475clean_problem:-
	
  476	retractall(current_num(_,_)),
  477	retractall(node(_,_,_,_,_)),
  478	retractall(tn(_,_,_,_,_,_)),
  479	retractall(gpredicates(_,_)),
  480	retractall(gsubstate_classes(_,_,_)),
  481	retractall(methodC(_,_,_,_,_,_,_)),
  482	retractall(operatorC(_,_,_,_,_)),
  483	retractall(goal_related(_)),
  484	retractall(produce(_,_,_,_)),
  485	retractall(solved_node(_,_)),
  486	retractall(tp_node(_,_,_,_,_,_)),
  487	retractall(closed_node(_,_,_,_,_,_)),
  488	retractall(score_list(_)),
  489	set_op_num(0),
  490	assert(my_stats(0)).
  491
  492planner_interface(G,I, SOLN,NODES):-
  493	time(ground_hierarchy),
  494	change_op_representation,
  495	find_relate_state,
  496        set_op_num(0),
  497        statistics(runtime,[_,Time]),
  498        (retract(my_stats(_)) ; true),
  499        assert(my_stats(Time)),
  500        make_problem_into_node(I, G, Node),
  501        assert(Node),
  502	start_solve(SOLN,NODES).
  503planner_interface(G,I, SOLN,NODES):-
  504	tell(user),nl,write('failure in initial node'),!.
  505
  506
  507	
  508/******************** HP ADT *********************/

  509
  510% node(Name, Precond ,Decomps, Temp, Statics)
  511getN_name(node(Name, _, _, _,_),  Name).
  512getN_pre(node(_,Pre, _, _, _),  Pre).
  513getN_decomp(node(_, _, Decomp,_,_),  Decomp).
  514getH_temp(node(_, _, _,Temps, _),  Temps).
  515getN_statics(node(_,_,_,_,Statics),  Statics).
  516
  517%Ron  21/9/01 - Try to give a closedown method
  518start_solve(SOLN,NODES):-
  519	kill_file(Kill),
  520	file_exists(Kill).
  521%	write('Found kill file'),nl.
  522
  523start_solve(Sol,OPNUM):-
  524   retract(final_node(Node)),
  525   retractall(current_num(_,_)),
  526   getN_statics(Node,Statics),
  527   statics_consist(Statics),
  528   extract_solution(Node,Sol,SIZE),
  529   statistics(runtime,[_,CP]),
  530   TIM is CP/1000,
  531   current_op_num(OPNUM),
  532   set_op_num(0),
  533   nl, nl, write('CPU Time = '),write(CP),nl,
  534   write('TIME TAKEN = '),write(TIM),
  535   write(' SECONDS'),nl,
  536   write('Solution SIZE = '),write(SIZE),nl,
  537   write('Operator Used = '),write(OPNUM),nl,
  538   write('Solution:\n '),writeq(Sol),nl,
  539   write('***************************************'),
  540   assert(time_taken(CP)),  
  541   assert(soln_size(SIZE)),
  542   assert(plan_used(OPNUM)),
  543   retractall(tn(_,_,_,_,_,_)),!.
  544
  545start_solve(Sol,OPNUM):-
  546   select_node(Node),
  547%   nl,write('processing '),write(Node),nl,
  548            % expand/prove its hps
  549   process_node(Node),
  550   start_solve(Sol,OPNUM),!.
  551start_solve(Sol,OPNUM):-
  552    tell(user), write('+++ task FAILED +++'),
  553    clean_problem.
  554
  555/******************************** MAIN LOOP **********/

  556
  557% expand a node..
  558process_node(Node) :-
  559   getN_name(Node,  Name),
  560   getN_pre(Node, Pre),
  561   getN_decomp(Node, Dec),
  562   getH_temp(Node, Temps),
  563   getN_statics(Node, Statics),
  564   expand_decomp(Dec,Pre,Post,Temps,Temp1,Statics,Statics1,Dec1),
  565   statics_consist(Statics),
  566   assert_node(Name,Pre,Dec1,Temp1,Statics1).
  567
  568assert_node(Name,Pre,Decomp,Temp,Statics):-
  569   all_HP_expanded(Decomp),
  570   assert(final_node(node(Name,Pre,Decomp,Temp,Statics))),!.
  571assert_node(Name,Pre,Dec,Temp,Statics):-
  572   gensym_special(root,SYM),
  573   assert(node(SYM,Pre,Dec,Temp,Statics)),!.
  574
  575all_HP_expanded([]):-!.
  576all_HP_expanded([step(HPid,Name,_,_,exp(TN))|THPS]):-
  577   all_HP_expanded(THPS),!.
  578/************ expand every step *********************/

  579expand_decomp([],Post,Post,Temp,Temp,Statics,Statics,[]):-!.
  580%0-1 if the step has expand already, get the state change, go to next
  581expand_decomp([step(HPid,Name,Pre0,Post0,exp(TN))|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,State1,Post1,exp(TN))|Decomp1]):-
  582   state_achieved(Pre0,Pre,State1),
  583   state_change(State1,Pre0,Post0,Post1),
  584   statics_consist(Statics),
  585   expand_decomp(Decomp,Post1,Post,Temp,Temp1,Statics,Statics1,Decomp1),!.
  586
  587%0-2. if it is an achieve action
  588expand_decomp([step(HPid,ACH,Pre0,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,Decomp1):-
  589   ACH=..[achieve|_],
  590   state_achieved(Pre0,Pre,State),
  591   statics_consist(Statics),
  592   expand_decomp_ach([step(HPid,ACH,State,Post0,unexp)|Decomp],State,Post,Temp,Temp1,Statics,Statics1,Decomp1),!.
  593/*
  594% 1. if the step's Name is match a exist TN also Pre meet, return TN
  595% tn(Tn0,Name,Pre0,Post0,Temp0,Decomp)is a task network
  596% which was generated by previous process,
  597% it has been decomposed to ordered primitive operators
  598% and has all states changes defiend
  599expand_decomp([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(Tn0))|Decomp1]):-
  600   tn(Tn0,Name,Pre0,Post0,Temp0,Decomp0),
  601   state_achieved(Pre0,Pre,State1),
  602   statics_consist(Statics),
  603   state_change(State1,Pre0,Post0,State),
  604%   nl,write('step '),write(HPid),
  605   incr_op_num,
  606%   write('can be expand by tn '),write(Tn0),nl,
  607   expand_decomp(Decomp,State,Post,Temp,Temp1,Statics,Statics1,Decomp1),!.
  608*/

  609% 2. if HP's name meet an method,
  610% and it's precondition and achieve goals are achieved
  611% expand it and make it to that TNs
because the conditions are not ground at upper level so it have to be push down to the ground level to find all the state changes
  617expand_decomp([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(TN))|Decomp1]):-
  618   methodC(Name,Pre0,Post0,Statics0,Temp0,achieve(ACH),Dec0),
  619   append_cut(Statics0,Statics,Statics2),
  620   statics_consist(Statics2),
  621   remove_unneed(Statics2,[],Statics3),
  622   state_achieved(Pre0,Pre,State1),
  623%   state_achieved(ACH,State1,State11),
  624   statics_consist(Statics3),
  625   apply_method1(HPid,TN,Name,State1,Pre0,ACH,Post0,State,Statics3,Temp0,Dec0),
  626%   apply_method(HPid,TN,Name,State11,Pre0,Post0,State,Statics21,Temp0,Dec0),
  627% changed here for if there are too many unordered tasks
  628% apply_method1 is directly apply method even it's achieve goal not achieved
  629%   nl,write('step '),write(HPid),
  630   incr_op_num,
  631%   write('can be expand by method '),write(Name),nl,
  632   expand_decomp(Decomp,State,Post,Temp,Temp1,Statics2,Statics1,Decomp1),!.
  633
  634
  635
  636
  637
  638
  639
  640
  641% 3. if HP's name and it's Pre meet an operator, return operator's name
  642expand_decomp([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(Name))|Decomp1]):-
  643   operatorC(Name,Pre0,Post0,Cond,Statics0),
  644   append_cut(Statics0,Statics,Statics2),
  645   statics_consist(Statics2),
  646   remove_unneed(Statics2,[],Statics21),
  647   state_achieved(Pre0,Pre,State1),
  648   state_change(State1,Pre0,Post0,State2),
  649   cond_state_change(State2,Cond,State),
  650%   nl,write('step '),write(HPid),
  651   statics_consist_instance(Statics0),
  652%   write('can be expand by operator '),write(Name),nl,
  653   incr_op_num,
  654   expand_decomp(Decomp,State,Post,Temp,Temp1,Statics21,Statics1,Decomp1),!.
  655
  656% 4. get another step which matchs and not after it before it to give a try
  657expand_decomp([step(HP,N,Pre0,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,Decomp1):-  
  658   get_another_step(step(HP2,N2,Pre2,Post2,Exp),Pre,Statics,
  659                                  HP,Temp,Temp2,Decomp,Decomp2),
  660   expand_decomp([step(HP2,N2,Pre2,Post2,Exp),step(HP,N,Pre0,Post0,unexp)|Decomp2],Pre,Post,Temp2,Temp1,Statics,Statics1,Decomp1).
  661
  662/*
  663% 5. if HP's name meet an method,
  664% and it's precondition  achieved
  665% but failed to match achieve_goals
  666% expand it and make it to that TNs
  667expand_decomp([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(TN))|Decomp1]):-
  668   methodC(Name,Pre0,Post0,Statics0,Temp0,achieve(ACH),Dec0),
  669   append_cut(Statics0,Statics,Statics2),
  670   statics_consist(Statics2),
  671   remove_unneed(Statics2,[],Statics3),
  672   state_achieved(Pre0,Pre,State1),
  673   statics_consist(Statics3),
  674   apply_method1(HPid,TN,Name,State1,Pre0,ACH,Post0,State,Statics3,Temp0,Dec0),
  675   % need to expand achieve goals first
  676   expand_decomp(Decomp,State,Post,Temp,Temp1,Statics3,Statics1,Decomp1),!.
  677
  678% 6. if all above failed
  679% get another step which matchs and not after it before it to give a try
  680expand_decomp([step(HP,N,Pre0,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,Decomp1):-  
  681   get_another_step(step(HP2,N2,Pre2,Post2,Exp),Pre,Statics,
  682                                  HP,Temp,Temp2,Decomp,Decomp2),
  683   expand_decomp([step(HP2,N2,Pre2,Post2,Exp),step(HP,N,Pre0,Post0,unexp)|Decomp2],Pre,Post,Temp2,Temp1,Statics,Statics1,Decomp1).
  684*/

  685% Else fail expand
  686
  687% get another step which is not after it before it
  688get_another_step(A,Pre,Statics,HP,Temp,Temp1,[],Dec2):-fail.
  689get_another_step(step(HP2,Name2,Pre2,Post2,Exp),Pre,Statics,HP,Temp,[before(HP2,HP)|Temp],Dec,Dec2):-
  690   member(step(HP2,Name2,Pre2,Post2,Exp),Dec),
  691   not(necessarily_before(HP,HP2, Temp)),
  692   state_achieved(Pre2,Pre,_),
  693   statics_consist(Statics),
  694   list_take(Dec,[step(HP2,Name2,Pre2,Post2,Exp)],Dec2).
  695
  696% expand the achieve goal
  697% 1.if the ACH is achieved already
  698%   remove it from decomposion and do the next
  699expand_decomp_ach([step(HPid,ACH,Pre,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,Decomp1):-
  700   state_achieved(Post0,Pre,State),
  701   statics_consist(Statics),
  702%   nl,write('step '),write(HPid),
  703%   write('is already achieved'),nl,
  704   remove_temp(Temp,HPid,Temp,Temp2),
  705   expand_decomp(Decomp,State,Post,Temp2,Temp1,Statics,Statics1,Decomp1),!.
  706
  707% 2.take out the already achieved states before expanding
  708expand_decomp_ach([step(HPid,ACH,Pre,Post0,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,ACH,Pre,Post0,exp(TN))|Decomp1]):-
  709   expand_hp(HPid,TN,ACH,Pre,Post0,State,Statics,Statics2),
  710   expand_decomp(Decomp,State,Post,Temp,Temp1,Statics2,Statics1,Decomp1),!.
  711
  712% directly achieve HP's Pre and Post by operator,method or tn
  713expand_hp(HPid,TN,ACH,Pre,Post,State,Statics,Statics1):-
  714   direct_expand_hp(HPid,TN,ACH,Pre,Post,State,Statics,Statics1),!.
  715% else, nothing directly can achieve HP's Pre and Post
  716% assert a temporely node for forward search
  717% tp_node(Name, Precond, Postcond, Statics,Score,Temp,Decomps)
  718expand_hp(HPid,TN,ACH,Pre,Post,State,Statics,Statics1):-
  719   make_to_steps1(Pre,Post,Steps),
  720   gensym_special(tp,TP),
  721   get_all_related_goal(Post),
  722   get_score(100,[],Steps,Score),
  723   assert(tp_node(TP,Pre,Post,Statics,Score,Steps)),
  724   fwsearch(TN,Statics1,State),
  725   clean_temp_nodes.
  726
  727% make the achieve goal states [se(..),se(..),..] to separate steps
  728% remove states that have been achieved by precondition
  729% by same them for declobber
  730make_to_steps1(Pre,[],[]):-!.
  731make_to_steps1(Pre,[se(Sort,Obj,SE)|Post],Steps):-
  732   state_achieved([se(Sort,Obj,SE)],Pre,_),
  733   make_to_steps1(Pre,Post,Steps),!.
  734make_to_steps1(Pre,[se(Sort,Obj,SE)|Post],[step(HP,achieve(se(Sort,Obj,SE)),undefd,[se(Sort,Obj,SE)],unexp)|Steps]):-
  735   objects(Sort,Objls),%Sort is primitive 
  736   gensym_special(hp,HP),
  737   make_to_steps1(Pre,Post,Steps),!.
  738make_to_steps1(Pre,[se(Sort,Obj,SE)|Post],[step(HP,achieve(se(Sort,Obj,SE)),undefd,[se(Sort,Obj,SE)],unexp)|Steps]):-
  739   var(Obj),
  740   gensym_special(hp,HP),
  741   make_to_steps1(Pre,Post,Steps),!.
  742make_to_steps1(Pre,[se(SortN,Obj,SE)|Post],[step(HP,achieve(se(PSort,Obj,SE)),undefd,[se(PSort,Obj,SE)],unexp)|Steps]):-
  743   not(var(Obj)),
  744   find_prim_sort(SortN,PSortls),
  745   member(PSort,PSortls),
  746   objects(PSort,Objls),
  747   member(Obj,Objls),
  748   gensym_special(hp,HP),
  749   make_to_steps1(Pre,Post,Steps),!.
  750
  751
  752% get all the states that can achieve the goal state
  753get_all_related_goal(Goal):-
  754    retractall(goal_related(_)),
  755    assert(goal_related(Goal)),
  756    get_all_related_goal1(Goal,States),
  757    retractall(goal_related(_)),
  758    assert(goal_related(States)),!.
  759%    tell(user),write(States),nl,told,!.
  760
  761get_all_related_goal1([],States):-
  762    setof(State,goal_related(State),States1),
  763    set_flatten(States1,[],States),!.
  764get_all_related_goal1([se(Sort,Obj,SE)|Rest],States):-
  765    produce(se(Sort,Obj,SE1),A,OPre,ST),
  766    state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
  767    retract(goal_related(List)),
  768    set_append_e(List,OPre,List1),
  769    assert(goal_related(List1)),
  770    fail.
  771get_all_related_goal1([se(SortN,Obj,SE)|Rest],States):-
  772    nonvar(Obj),
  773    objects(Sort,Objls),
  774    not(not(member(Obj,Objls))),
  775    produce(se(Sort,Obj,SE1),A,OPre,ST),
  776    state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
  777    retract(goal_related(List)),
  778    set_append_e(List,OPre,List1),
  779    assert(goal_related(List1)),
  780    fail.
  781get_all_related_goal1([se(SortN,Obj,SE)|Rest],States):-
  782    var(Obj),
  783    find_prim_sort(SortN,Sortls),
  784    member(Sort,Sortls),
  785    produce(se(Sort,Obj,SE1),A,OPre,ST),
  786    state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
  787    retract(goal_related(List)),
  788    set_append_e(List,OPre,List1),
  789    assert(goal_related(List1)),
  790    fail.
  791get_all_related_goal1([se(Sort,Obj,SE)|Rest],States):-
  792    get_all_related_goal1(Rest,States).
  793
  794%   find out the difference of Pre and Post0 to expand
  795% if only one Obj in Post, don't do check.
  796take_out_achieved(Pre,[se(Sort,Obj,SE)],[],[se(Sort,Obj,SE)]):-!.
  797take_out_achieved(Pre,[],Post,Post):-!.
  798% Pre conditions are all instantiated states
  799% only Post conditions have variables
  800take_out_achieved(Pre,[se(Sort,Obj,ST)|Post],Post0,Post1):-
  801    var(Obj),
  802    append(Post0,[se(Sort,Obj,ST)],Post2),
  803    take_out_achieved(Pre,Post,Post2,Post1),!.
  804take_out_achieved(Pre,[se(Sort,Obj,ST)|Post],Post0,Post1):-
  805    member(se(Sort,Obj,ST1),Pre),
  806    append_diff(Sort,Obj,ST,ST1,Post0,Post2),
  807    list_take(Pre,[se(Sort,Obj,ST1)],Pre2),
  808    take_out_achieved(Pre2,Post,Post2,Post1),!.
  809 
  810% append only the different one
  811append_diff(Sort,Obj,ST,ST1,Post0,Post0):-
  812    not_conflict(Sort,Obj,ST,ST1,STN),!.
  813append_diff(Sort,Obj,ST,ST1,Post0,Post1):-
  814    append(Post0,[se(Sort,Obj,ST)],Post1),!.
  815% ---------------------------------------------------
  816 
  817%1. if an achieve action meets an TN Pre and post meet
  818direct_expand_hp(HPid,Tn0,ACH,Pre,Post,Pre1,Statics,Statics):-
  819   tn(Tn0,Name,Pre0,Post0,Temp0,Decomp0),
  820   state_achieved(Pre0,Pre,State1),
  821   state_achieved(Post,Post0,_),
  822   state_change(State1,Pre0,Post0,Pre1),
  823   statics_consist(Statics),
  824%   nl,write('step '),write(HPid),
  825    incr_op_num,
  826    !.
  827%    write('can be expand by tn '),write(Tn0),nl,!.
  828
  829%2. if an action's name meets is an operator's,
  830%    return 
  831direct_expand_hp(HPid,Name,Name,Pre,Post,State,Statics,Statics1):-
  832   operatorC(Name,Pre0,Post0,Cond,Statics0),
  833   append_cut(Statics0,Statics,Statics1),
  834   statics_consist(Statics11),
  835   remove_unneed(Statics11,[],Statics1),
  836   post_instant(Post0,Cond,Statics1,Post),
  837   state_achieved(Pre0,Pre,State1),
  838   state_change(State1,Pre0,Post0,State2),
  839   cond_state_change(State2,Cond,State3),
  840   state_achieved(Post,State3,State),
  841   statics_consist_instance(Statics0),
  842%   nl,write('step '),write(HPid),
  843%   write('can be expand by operator '),write(Name),nl,
  844   incr_op_num,
  845   !.
  846
  847%2. if an achieve action meets an operator's Pre and post meet,
  848%    return 
  849direct_expand_hp(HPid,Name,ACH,Pre,Post,State,Statics,Statics1):-
  850   operatorC(Name,Pre0,Post0,Cond,Statics0),
  851   append_cut(Statics0,Statics,Statics2),
  852   statics_consist(Statics2),
  853   remove_unneed(Statics2,[],Statics1),
  854   post_instant(Post0,Cond,Statics1,Post),
  855   state_achieved(Pre0,Pre,State1),
  856   state_change(State1,Pre0,Post0,State2),
  857   cond_state_change(State2,Cond,State3),
  858   state_achieved(Post,State3,State),
  859   statics_consist(Statics1),
  860%   nl,write('step '),write(HPid),
  861%   write('can be expand by operator '),write(Name),nl,
  862   incr_op_num,
  863   !.
  864
  865%3. if an achieve action meets a method's pre and post,
  866%    expand it and make it to that TNs
  867direct_expand_hp(HPid,TN,ACH,Pre,Post,State1,Statics,Statics1):-
  868   methodC(Name,Pre0,Post0,Statics0,Temp0,achieve(ACH0),Dec0),
  869   append_cut(Statics0,Statics,Statics2),
  870   statics_consist(Statics2),
  871   remove_unneed(Statics2,[],Statics1),
  872   post_instant(Post0,[],Statics1,Post),
  873   state_achieved(Pre0,Pre,Pre1),
  874   state_achieved(Post,Post0,Post01),
  875   statics_consist(Statics1),
  876   apply_method1(HPid,TN,Name,Pre1,Pre0,ACH0,Post01,State1,Statics1,Temp0,Dec0),!.
  877
  878% apply_method/10: apply method in the HP
  879% when the method name's precondition and achieve goals are achieved
  880% no extra operators are bring in while expansion
  881apply_method(HPid,TN,Name,Pre,Pre0,Post0,State,Statics,Temp,Dec):-
  882   make_dec0(HPid,Dec,Temp,Dec0,Temp0),
  883   expand_method(Dec0,Pre,Post,Temp0,Temp1,Statics,Statics1,Dec1),
  884   state_achieved(Post0,Post,State),
  885   statics_consist(Statics),
  886%   nl,write('step '),write(HPid),
  887%   write('can be expand by method '),write(Name),nl,
  888   incr_op_num,
  889   make_tn(TN,Name,Pre,State,Temp1,Dec1),!.
  890
  891make_dec0(HPid,Dec,Temp,Dec0,Temp0):-
  892    make_dec01(HPid,1,Dec,Dec0),
  893    change_temp(HPid,Temp,[],Temp0),!.
  894make_dec1(HPid,Pre,ACH,Statics,Temp,Dec,Temp1,Dec1):-
  895   state_achieved(ACH,Pre,_),
  896   make_dec01(HPid,1,Dec,Dec1),
  897   change_temp(HPid,Temp,[],Temp1).
  898make_dec1(HPid,Pre,ACH,Statics,Temp,Dec,[before(STID0,STID1)|Temp1],[step(STID0,achieve(ACH),Pre,ACH,unexp)|Dec1]):-
  899   gensym_num(HPid,0,STID0),
  900   gensym_num(HPid,1,STID1),
  901   make_dec01(HPid,1,Dec,Dec1),
  902   change_temp(HPid,Temp,[],Temp1),!.
  903   
  904make_dec01(HPid,_,[],[]):-!.
  905make_dec01(HPid,Num,[HDec|TDec],[step(STID,HDec,undefd,undefd,unexp)|TDec0]):-
  906   operatorC(HDec,_,_,_,_),
  907   gensym_num(HPid,Num,STID),
  908   Num1 is Num + 1,
  909   make_dec01(HPid,Num1,TDec,TDec0).
  910make_dec01(HPid,Num,[HDec|TDec],[step(STID,HDec,undefd,undefd,unexp)|TDec0]):-
  911   methodC(HDec,_,_,_,_,_,_),
  912   gensym_num(HPid,Num,STID),
  913   Num1 is Num + 1,
  914   make_dec01(HPid,Num1,TDec,TDec0).
  915
  916change_temp(HPid,[],Temp2,Temp2):-!.
  917change_temp(HPid,[before(N1,N2)|Temp],Temp2,[before(ST1,ST2)|Temp0]):-
  918   gensym_num(HPid,N1,ST1),
  919   gensym_num(HPid,N2,ST2),
  920   change_temp(HPid,Temp,Temp2,Temp0),!.
  921
  922% expand_method/8 expand method without bring in any other operators
  923% that is: all achieve goals are achieved
  924expand_method([],Post,Post,Temp,Temp,Statics,Statics,[]):-!.
  925expand_method([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(TN))|Decomp1]):-
  926   tn(TN,Name,Pre0,Post0,Temp0,Decomp0),
  927   state_achieved(Pre0,Pre,State1),
  928   state_change(State1,Pre0,Post0,State),
  929   statics_consist(Statics),
  930%   nl,write('step '),write(HPid),
  931    incr_op_num,
  932%    write('can be expand by tn '),write(TN),
  933   expand_method(Decomp,State,Post,Temp,Temp1,Statics,Statics1,Decomp1).
  934expand_method([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(Name))|Decomp1]):-
  935   operatorC(Name,Pre0,Post0,Cond,Statics0),
  936   append_cut(Statics0,Statics,Statics2),
  937   statics_consist(Statics2),
  938   remove_unneed(Statics2,[],Statics21),
  939   post_instant(Post0,Cond,Statics21,Post0),
  940   state_achieved(Pre0,Pre,State1),
  941   state_change(State1,Pre0,Post0,State2),
  942   cond_state_change(State2,Cond,State3),
  943   state_achieved(Post0,State3,State), 
  944   statics_consist_instance(Statics0),
  945%   nl,write('step '),write(HPid),
  946%   write('can be expand by operator '),write(Name),nl,
  947    incr_op_num,
  948   expand_method(Decomp,State,Post,Temp,Temp1,Statics21,Statics1,Decomp1).
  949expand_method([step(HPid,Name,undefd,undefd,unexp)|Decomp],Pre,Post,Temp,Temp1,Statics,Statics1,[step(HPid,Name,Pre0,Post0,exp(TN))|Decomp1]):-
  950   methodC(Name,Pre0,Post0,Statics0,Temp0,ACH,Dec0),
  951   append_cut(Statics0,Statics,Statics2),
  952   statics_consist(Statics2),
  953   remove_unneed(Statics2,[],Statics21),
  954   post_instant(Post0,[],Statics21,Post0),
  955   state_achieved(Pre0,Pre,State1),
  956   statics_consist(Statics21),
  957   apply_method(HPid,TN,Name,State1,Pre0,Post0,State,Statics21,Temp0,Dec0),
  958   expand_method(Decomp,State,Post,Temp,Temp1,Statics21,Statics1,Decomp1).
  959% --------------------end of apply_method/10---------------------
  960
  961% apply_method1/11: apply method in the HP
  962% when the method name's precondition achieved
  963% but need bring in operators while expansion
  964apply_method1(HPid,TN,Name,Pre,Pre0,ACH,Post0,State,Statics,Temp,Dec):-
  965   make_dec1(HPid,Pre,ACH,Statics,Temp,Dec,Temp2,Dec2),
  966   expand_decomp(Dec2,Pre,Post,Temp2,Temp1,Statics,Statics1,Dec1),
  967   state_achieved(Post0,Post,State),
  968%   nl,write('step '),write(HPid),
  969%   write('can be expand by method '),write(Name),nl,
  970   incr_op_num,
  971   make_tn(TN,Name,Pre,State,Temp1,Dec1),!.
  972
  973
  974% --------------------end of apply_method1/11---------------------
  975
  976% forward search for operators can't directly solved
  977fwsearch(TN,ST,State):-
  978   retract(solved_node(ST,step(HP,Name,Pre,State,exp(TN)))).
  979fwsearch(TN,ST,State):-
  980   select_tnode(tp_node(TP,Pre,Post,Statics,Score,Dec)),
  981   assert(closed_node(TP,Pre,Post,Statics,Score,Dec)),
  982   expand_node(Statics,Statics1,Pre,Post,Dec,[],Dec1),
  983   assert_tnode(TP,Pre,Post,Statics1,Score,Dec1),
  984   solved_node(_,_),%expand every possible way until find solution
  985   fwsearch(TN,ST,State).
  986fwsearch(TN,ST,State):-
  987   tp_node(TP,Pre,Post,Statics,Score,Dec),
  988   fwsearch(TN,ST,State).
  989
  990clean_temp_nodes:-
  991   retractall(current_num(tp,_)),
  992   retractall(tp_node(_,_,_,_,_,_)),
  993   retractall(closed_node(_,_,_,_,_,_)),!.
  994
  995% expand all way possible to achieve the Post
  996expand_node(Statics,Statics,Pre,Post,[],List,List):-
  997   state_achieved(Post,Pre,_),!.
  998expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,_,Post0,unexp)|Rest],List,Dec1):-
  999   state_achieved(Post0,Pre,_),
 1000   expand_node(Statics,Statics1,Pre,Post,Rest,List,Dec1),!.
 1001expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,_,Post0,unexp)|Rest],List,Dec1):-
 1002   direct_expand_hp(HP,TN,Name,Pre,Post0,State,Statics,Statics2),
 1003   append(List,[step(HP,Name,Pre,State,exp(TN))],List2),
 1004   remove_achieved_rest(State,Statics2,Rest,Rest1),
 1005   make_to_steps(State,Post,Steps,Rest1),
 1006   append(Rest1,Steps,Rest2),
 1007   expand_node(Statics2,Statics1,State,Post,Rest2,List2,Dec1).
 1008expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,_,Post0,unexp)|Rest],List,Dec1):-
 1009   apply_op(Statics,Statics1,[step(HP,Name,Pre,Post0,unexp)|Rest],List,Dec1).
 1010expand_node(Statics,Statics1,Pre,Post,[step(HP,Name,Pre0,Post0,exp(TN))|TDec],List,Dec1):-
 1011   append(List,[step(HP,Name,Pre0,Post0,exp(TN))],List2),
 1012   expand_node(Statics,Statics1,Post0,Post,TDec,List2,Dec1),!.
 1013
 1014remove_achieved_rest(State,Statics,[],[]):-!.
 1015remove_achieved_rest(State,Statics,[step(HP,Name,_,Post0,unexp)|Rest],Rest1):-
 1016   state_achieved(Post0,State,_),
 1017   remove_achieved_rest(State,Statics,Rest,Rest1),!.
 1018remove_achieved_rest(State,Statics,[HP|Rest],[HP|Rest1]):-
 1019   remove_achieved_rest(State,Statics,Rest,Rest1),!.
 1020
 1021/* add an operator that can achieve the goal related states*/

 1022% This is only applied when it can't be directly achieved
 1023apply_op(Statics,Statics1,[step(HP,Name,Pre,[se(Sort,Obj,SE)],unexp)|Rest],List,Dec):-
 1024    produce(se(Sort,Obj,SE1),OP,OPre,ST),
 1025    append_cut(Statics,ST,Statics2),
 1026    statics_consist(Statics2),
 1027    remove_unneed(Statics2,[],Statics1),
 1028    state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
 1029    instantiate(OPre,Statics1),
 1030    not(member(step(_,OP,_,_,_),Rest)),
 1031    make_to_steps(Pre,OPre,Steps,Rest),
 1032    change_head_state(Pre,Steps,Steps1),
 1033    append(List,Steps1,List2),
 1034    append(List2,[step(HP,OP,undefd,[se(Sort,Obj,SE)],unexp)|Rest],Dec).
 1035%    tell(user),write('+'),told.
 1036apply_op(Statics,Statics1,[step(HP,Name,Pre,[se(SortN,Obj,SE)],unexp)|Rest],List,Dec):-
 1037    find_prim_sort(SortN,PSortls),
 1038    member(Sort,PSortls),
 1039    produce(se(Sort,Obj,SE1),OP,OPre,ST),
 1040    append_cut(Statics,ST,Statics2),
 1041    statics_consist(Statics2),
 1042    remove_unneed(Statics2,[],Statics1),
 1043    state_achieved([se(Sort,Obj,SE)],[se(Sort,Obj,SE1)],_),
 1044    instantiate(OPre,Statics1),
 1045    not(member(step(_,OP,_,_,_),Rest)),
 1046    make_to_steps(Pre,OPre,Steps,Rest),
 1047    change_head_state(Pre,Steps,Steps1),
 1048    append(List,Steps1,List2),
 1049    append(List2,[step(HP,OP,undefd,[se(Sort,Obj,SE)],unexp)|Rest],Dec).
 1050%    tell(user),write('+'),told.
 1051
 1052% make the achieve goal states [se(..),se(..),..] to separate steps
 1053% remove the states that have been achieved by precondition
 1054make_to_steps(Pre,[],[],Rest):-!.
 1055make_to_steps(Pre,[se(Sort,Obj,SE)|Post],Steps,Rest):-
 1056   state_achieved([se(Sort,Obj,SE)],Pre,_),
 1057   make_to_steps(Pre,Post,Steps,Rest),!.
 1058make_to_steps(Pre,[se(Sort,Obj,SE)|Post],Steps,Rest):-
 1059   member(step(_,achieve(se(Sort,Obj,SE)),_,_),Rest),
 1060   make_to_steps(Pre,Post,Steps,Rest),!.
 1061make_to_steps(Pre,[se(Sort,Obj,SE)|Post],[step(HP,achieve(se(Sort,Obj,SE)),undefd,[se(Sort,Obj,SE)],unexp)|Steps],Rest):-
 1062   gensym_special(hp,HP),
 1063   make_to_steps(Pre,Post,Steps,Rest),!.
 1064
 1065change_head_state(Pre,[step(HP,A,undefd,B,unexp)|Steps],[step(HP,A,Pre,B,unexp)|Steps]):-!.
 1066
 1067% instantiate the object in lhs states
 1068instantiate([],Statics).
 1069instantiate([se(Sort,Obj,SE)|States],Statics):-
 1070   nonvar(Obj),
 1071   instantiate(States,Statics),!.
 1072instantiate([se(Sort,Obj,SE)|States],Statics):-
 1073   ground(SE),
 1074   instantiate(States,Statics),!.
 1075instantiate([se(Sort,Obj,SE)|States],Statics):-
 1076   var(Obj),
 1077   get_sort_objects(Sort,Objls),
 1078   member(Obj,Objls),
 1079   statics_consist_instance(Statics),
 1080   instantiate(States,Statics).
 1081
 1082
 1083% select a tp_node with lowest score
 1084select_tnode(tp_node(HPid,Pre,Post,Statics,Score,Dec)) :-
 1085   retractall(score_list(LS)),
 1086   assert(score_list([])),
 1087   lowest_score(Score),
 1088   retract(tp_node(HPid,Pre,Post,Statics,Score,Dec)),!.
 1089%   tell(user),nl,write('new level'),nl,told,!.
 1090
 1091% find the lowest_score of tp_node
 1092lowest_score(LScore):-
 1093     tp_node(HPid,Pre,Post,Statics,Score,Dec),
 1094     retract(score_list(LS)),
 1095     assert(score_list([Score|LS])),
 1096     fail.
 1097lowest_score(LScore):-
 1098     retract(score_list(D)),
 1099     sort(D,[LScore|SD]).
 1100
 1101:- style_check(-discontiguous).
 1102% assert tp_node if all HP expand, assert solved_node
 1103assert_tnode(TP,Pre,Post,Statics,Score1,Dec):-
 1104   all_HP_expanded(Dec),
 1105   combine_exp_steps2(Dec,OneDec),
 1106   assert(solved_node(Statics,OneDec)),!.
 1107
 1108combine_exp_steps2([OneDec],OneDec):-!.
 1109combine_exp_steps2([Dec1,Dec2|Rest],OneDec):-
 1110   combine_steps1(Dec1,Dec2,OneDec1),
 1111   combine_exp_steps2([OneDec1|Rest],OneDec),!.
 1112% else combine the steps of expanded steps
 1113% make it to [step(_,...,exp()),step(_,...,unexp)]
 1114% that makes possible to find the repeated nodes
 1115% also makes possible to make operator chains for later use
 1116assert_tnode(TP,Pre,Post,Statics,Score,Dec):-
 1117   combine_exp_steps(Dec,ExpDec,UnexpDec),
 1118   assert_tnode1(TP,Pre,Post,Statics,Score,ExpDec,UnexpDec),!.
 1119
 1120:- style_check(+discontiguous).
 1121
 1122assert_tnode1(TP,Pre,Post,Statics,Score,ExpDec,UnexpDec):-
 1123   existing_node(ExpDec,UnexpDec,Statics).
 1124assert_tnode1(TP,Pre,Post,Statics,Score,ExpDec,UnexpDec):-
 1125   get_score(Score,ExpDec,UnexpDec,Score1),
 1126   gensym_special(tp,TP1),
 1127   append(ExpDec,UnexpDec,Dec),
 1128   assert(tp_node(TP1,Pre,Post,Statics,Score1,Dec)),!.
 1129
 1130% combine the expanded steps to one
 1131combine_exp_steps([step(A,B,C,D,unexp)|Rest],[],[step(A,B,C,D,unexp)|Rest]):-!.
 1132combine_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]):-!.
 1133combine_exp_steps([step(A1,B1,C1,D1,exp(TN1)),step(A2,B2,C2,D2,exp(TN2))|Rest],ExpDec,UnexpDec):-
 1134    combine_steps1(step(A1,B1,C1,D1,exp(TN1)),step(A2,B2,C2,D2,exp(TN2)),ExpDec1),
 1135    combine_exp_steps([ExpDec1|Rest],ExpDec,UnexpDec),!.
 1136
 1137combine_steps1(step(HP1,Name1,Pre1,Post1,exp(TN1)),step(HP2,Name2,Pre2,Post2,exp(TN2)),step(HP,achieve(Post2),Pre1,Post2,exp(TN))):-
 1138    find_only_changed(Pre1,Post2,[],Pre0,[],Post0),
 1139    not(isemptylist(Post0)),
 1140    gensym_special(hp,HP),
 1141    gensym_special(tn,TN),
 1142    assert(tn(TN,achieve(Post0),Pre0,Post0,[before(TN1,TN2)],[step(HP1,Name1,Pre1,Post1,exp(TN1)),step(HP2,Name2,Pre2,Post2,exp(TN2))])),!.
 1143
 1144% already been.
 1145existing_node([step(_,_,Pre,Post,exp(TN))],UnexpDec,Statics):-
 1146    tp_node(_,_,_,Statics0,_,[step(_,_,Pre0,Post0,exp(TN0))|Rest]),
 1147    append_st(Statics,Statics0,Statics1),
 1148    all_equal(Pre,Pre0,Statics1),
 1149    all_equal(Post,Post0,Statics1),
 1150    existing_node([],UnexpDec,Statics1).
 1151existing_node([step(_,_,Pre,Post,exp(TN))],UnexpDec,Statics):-
 1152    closed_node(_,_,_,Statics0,_,[step(_,_,Pre0,Post0,exp(TN0))|Rest]),
 1153    append_st(Statics,Statics0,Statics1),
 1154    all_equal(Pre,Pre0,Statics1),
 1155    all_equal(Post,Post0,Statics1),
 1156    existing_node([],UnexpDec,Statics1).
 1157existing_node([],[step(_,Name,Pre,_,unexp)|Rest],Statics):-
 1158    tp_node(_,_,_,Statics0,_,[step(_,Name,Pre0,_,_,unexp)|Rest]),
 1159    append_st(Statics,Statics0,Statics1),
 1160    all_equal(Pre,Pre0,Statics1).
 1161existing_node([],[step(_,Name,Pre,_,unexp)|Rest],Statics):-
 1162    closed_node(_,_,_,Statics0,_,[step(_,Name,Pre0,_,_,unexp)|Rest]),
 1163    append_st(Statics,Statics0,Statics1),
 1164    all_equal(Pre,Pre0,Statics1).
 1165
 1166
 1167
 1168
 1169all_equal([],[],Statics):-
 1170    statics_consist(Statics),!.
 1171all_equal([se(Sort,Obj,SE)|Pre],[se(Sort,Obj,SE1)|Pre1],Statics):-
 1172    is_achieved(SE,SE1),
 1173    all_equal(Pre,Pre1,Statics),!.
 1174all_equal([se(Sort,Obj,SE)|Pre],Pre1,Statics):-
 1175    member(se(Sort,Obj,SE1),Pre1),
 1176    list_take(Pre1,[se(Sort1,Obj1,SE1)],Pre2),
 1177    all_equal(Pre,Pre1,Statics),!.
 1178
 1179get_score(Score,[],UnExpDec,Score1):-
 1180    length(UnExpDec,Len),
 1181    Score1 is Score+Len,!.
 1182get_score(Score,[step(HP,Name,Pre0,Post0,exp(TN))],UnExpDec,Score1):-
 1183    goal_related(States),
 1184    state_achieved_Num(Post0,States,0,Num),
 1185    length(UnExpDec,Len),
 1186    Score1 is Score-Num,!.
 1187
 1188%-------------------------------------------
 1189% the number of postcondition achieved 
 1190% the more the better
 1191state_achieved_Num([],Pre0,Num,Num):-!.
 1192state_achieved_Num([se(Sort,Obj,SE)|Post],Pre0,N,Num):-
 1193    member(se(Sort,Obj,SE0),Pre0),
 1194    state_achieved([se(Sort,Obj,SE0)],[se(Sort,Obj,SE)],_),
 1195    N1 is N+1,
 1196    state_achieved_Num(Post,Pre0,N1,Num),!.
 1197state_achieved_Num([se(Sort,Obj,SE)|Post],Pre0,N,Num):-
 1198    state_achieved_Num(Post,Pre0,N,Num),!.
 1199
 1200% the states that can achieve a state
 1201% that is:
 1202% for a state in the rhs of operator
 1203% all the states in the lhs
 1204find_relate_state:-
 1205   operatorC(A,Pre,Post,Cond,ST),
 1206   assert_related_states(A,Pre,Post,Cond,ST),
 1207   fail.
 1208find_relate_state.
 1209
 1210assert_related_states(A,Pre,Post,Cond,ST):-
 1211   assert_related_states1(A,Pre,Post,ST),
 1212   assert_related_states2(A,Pre,Cond,ST).
 1213
 1214% find relate in nec
 1215% the sorts here are primitive
 1216assert_related_states1(A,Pre,[],ST):-!.
 1217%when prev
 1218assert_related_states1(A,Pre,[se(Sort,Obj,SE)|Post],ST):-
 1219   member_e(se(Sort,Obj,SE),Pre),
 1220   assert_related_states1(A,Pre,Post,ST),!.
 1221%when nec
 1222assert_related_states1(A,Pre,[se(Sort,Obj,SE)|Post],ST):-
 1223   assert(produce(se(Sort,Obj,SE),A,Pre,ST)),
 1224   assert_related_states1(A,Pre,Post,ST),!.
 1225
 1226% find relate in conditional
 1227% the sorts here are not primitive
 1228assert_related_states2(A,Pre,SC,ST):-
 1229   make_sc_primitive(SC,PSC),
 1230   assert_related_states21(A,Pre,PSC,ST).
 1231
 1232assert_related_states21(A,Pre,[],ST):-!.
 1233assert_related_states21(A,Pre,[sc(Sort,Obj,SE=>SS)|Trans],ST):-
 1234   rem_statics([se(Sort,Obj,SE)],[se(Sort,Obj,SER)],St1),
 1235   rem_statics([se(Sort,Obj,SS)],[se(Sort,Obj,SSR)],St2),
 1236   append_cut(ST,St1,ST1),
 1237   append_cut(ST1,St2,ST21),
 1238   remove_unneed(ST21,[],ST2),
 1239   append_cut(Pre,[se(Sort,Obj,SER)],Pre1),
 1240   assert(produce(se(Sort,Obj,SSR),A,Pre1,ST2)),
 1241   assert_related_states21(A,Pre,Trans,ST),!.
 1242
 1243%-------------------------------------------
 1244% the number of state change compare with precondition
 1245% the less the better
 1246pre_changed_Num([],Pre0,Num,Num):-!.
 1247pre_changed_Num([se(Sort,Obj,SE)|Pre],Pre0,N,Num):-
 1248    state_achieved([se(Sort,Obj,SE)],Pre0,_),
 1249    N1 is N+1,
 1250    pre_changed_Num(Pre,Pre0,N1,Num),!.
 1251pre_changed_Num([se(Sort,Obj,SE)|Pre],Pre0,N,Num):-
 1252    pre_changed_Num(Pre,Pre0,N,Num),!.
 1253
 1254
 1255
 1256%-------------------------------------------
 1257% remove HP1 from the temp list
 1258% if  HP1<HP2, then all HP3<HP1 => HP3<HP2
 1259% if  HP2<HP1, then all HP1<HP3 => HP2<HP3
 1260remove_temp([],HP1,List,List):-!.
 1261remove_temp([before(HP1,HP2)|Temp],HP1,List,Temp1):-
 1262    remove_temp_before(List,before(HP1,HP2),List2),
 1263    remove_temp(Temp,HP1,List2,Temp1),!.
 1264remove_temp([before(HP2,HP1)|Temp],HP1,List,Temp1):-
 1265    remove_temp_after(List,before(HP2,HP1),List2),
 1266    remove_temp(Temp,HP1,List2,Temp1),!.
 1267remove_temp([before(HPX,HPY)|Temp],HP1,List,Temp1):-
 1268    remove_temp(Temp,HP1,List,Temp1),!.
 1269
 1270% if  HP1<HP2, remove HP1<HP2, and change all HP3<HP1 => HP3<HP2
 1271remove_temp_before([],before(HP1,HP2),[]):-!.
 1272remove_temp_before([before(HP1,HP2)|T],before(HP1,HP2),T1):-
 1273   remove_temp_before(T,before(HP1,HP2),T1),!.
 1274remove_temp_before([before(HP3,HP1)|T],before(HP1,HP2),[before(HP3,HP2)|T1]):-
 1275   remove_temp_before(T,before(HP1,HP2),T1),!.
 1276remove_temp_before([before(HPX,HPY)|T],before(HP1,HP2),[before(HPX,HPY)|T1]):-
 1277   remove_temp_before(T,before(HP1,HP2),T1),!.
 1278% if  HP2<HP1, remove HP2<HP1, and change all HP1<HP3 => HP2<HP3
 1279remove_temp_after([],before(HP1,HP2),[]):-!.
 1280remove_temp_after([before(HP2,HP1)|T],before(HP2,HP1),T1):-
 1281   remove_temp_after(T,before(HP2,HP1),T1),!.
 1282remove_temp_after([before(HP1,HP3)|T],before(HP2,HP1),[before(HP2,HP3)|T1]):-
 1283   remove_temp_after(T,before(HP2,HP1),T1),!.
 1284remove_temp_after([before(HPX,HPY)|T],before(HP2,HP1),[before(HPX,HPY)|T1]):-
 1285   remove_temp_after(T,before(HP2,HP1),T1),!.
 1286
 1287remove_dec(HPid,[],[]):-!.
 1288remove_dec(HPid,[step(HPid,_,_,_,_)|Dec],Dec1):-
 1289   remove_dec(HPid,Dec,Dec1),!.
 1290remove_dec(HPid,[step(A,B,C,D,F)|Dec],[step(A,B,C,D,F)|Dec1]):-
 1291   remove_dec(HPid,Dec,Dec1),!.
 1292   
 1293/******************************************************/

 1294% state2 is achieved by state1(or they are not conflict)
 1295% the output state is the combination of the two states
 1296state_achieved(undefd,State,State):-!.
 1297state_achieved(State1,State2,State3):-
 1298    state_achieved1(State1,State2,State3).
 1299
 1300state_achieved1([],State2,State2).
 1301state_achieved1([se(Sort,Obj,ST1)|State1],State2,[se(Sort,Obj,STN)|State]):-
 1302    get_sort_objects(Sort,Objls),
 1303    member(Obj,Objls),
 1304    member(se(Sort,Obj,ST2),State2),
 1305    not_conflict(Sort,Obj,ST1,ST2,STN),
 1306    list_take(State2,[se(Sort,Obj,ST2)],State21),
 1307    state_achieved1(State1,State21,State).
 1308state_achieved1([se(Sort1,Obj,ST1)|State1],State2,[se(Sort,Obj,STN)|State]):-
 1309    not(objects(Sort1,Objls)),
 1310    find_prim_sort(Sort1,Sortls),
 1311    member(se(Sort,Obj,ST2),State2),
 1312    member(Sort,Sortls),
 1313    not_conflict(Sort,Obj,ST1,ST2,STN),
 1314    list_take(State2,[se(Sort,Obj,ST2)],State21),
 1315    state_achieved1(State1,State21,State).
 1316
 1317% two states not conflict
 1318not_conflict(Sort,Obj,ST,ST1,NewST):-
 1319    gsubstate_classes(Sort,Obj,Substateclasses),
 1320    member(State0,Substateclasses),
 1321    is_achieved(ST,State0),
 1322    is_achieved(ST1,State0),
 1323    set_append_e(ST,ST1,NewST),!.
 1324
 1325% all the element in list1 are static or in list2
 1326is_achieved([],_):-!.
 1327is_achieved([H|T], State) :-
 1328    is_statics(H),
 1329    is_achieved(T,State),!.
 1330is_achieved([H|T], State) :-
 1331    member(H,State),
 1332    is_achieved(T,State),!.
 1333
 1334% check if a predicate is statics or not
 1335is_statics(ne(A,B)):-!.
 1336is_statics(is_of_sort(A,B)):-!.
 1337is_statics(is_of_primitive_sort(A,B)):-!.
 1338is_statics(Pred):-
 1339    functor(Pred,FF,NN),
 1340    functor(Pred1,FF,NN),
 1341    atomic_invariants(Atom),
 1342    member(Pred1,Atom),!.
 1343    
 1344    
 1345%-------------------------------------------
 1346
 1347/************ state changes by actions ********/

 1348% if an object's state meet the precondition
 1349% it change to the postcondition
 1350state_change([],Pre0,Post0,[]):-!.
 1351state_change(Pre,[],[],Pre):-!.
 1352% if a obj pre achieves action's pre
 1353% change the obj's post state with action's post
 1354state_change([se(Sort,Obj,SE)|Pre],Pre0,Post0,[se(Sort,Obj,NewSS)|State]):-
 1355    member(se(Sort,Obj,SE0),Pre0),
 1356    member(se(Sort,Obj,SS0),Post0),
 1357    not_conflict(Sort,Obj,SE,SE0,_),
 1358    state_change1(SE,SE0,SS0,NewSS),
 1359    list_take(Pre0,[se(Sort,Obj,SE0)],Pre1),
 1360    list_take(Post0,[se(Sort,Obj,SS0)],Post1),
 1361    state_change(Pre,Pre1,Post1,State),!.
 1362% if a obj state not defined in  action's pre
 1363% move it to its post
 1364state_change([se(Sort,Obj,SE)|Pre],Pre0,Post0,[se(Sort,Obj,SE)|State]):-
 1365    state_change(Pre,Pre0,Post0,State),!.
 1366
 1367state_change1([],SE0,SS0,SS0):-!.
 1368state_change1([HSE|TSE],SE0,SS0,SS1):-
 1369    member(HSE,SE0),
 1370    state_change1(TSE,SE0,SS0,SS1),!.
 1371state_change1([HSE|TSE],SE0,SS0,[HSE|SS1]):-
 1372    state_change1(TSE,SE0,SS0,SS1),!.
 1373%-------------------------------------------
 1374%-------------------------------------------
 1375/************ state changes by conditions ********/

 1376% for all the object's state meet the precondition
 1377% it change to the postcondition
 1378cond_state_change([],Cond,[]):-!.
 1379cond_state_change(State,[],State):-!.
 1380cond_state_change([se(Sort,Obj,SE)|Pre],Cond,[se(Sort,Obj,NewSS)|State]):-
 1381    member(sc(Sort1,Obj,SE0=>SS0),Cond),
 1382    statics_consist([is_of_sort(Obj,Sort1),is_of_sort(Obj,Sort)]),
 1383    not_conflict(Sort,Obj,SE,SE0,_),
 1384    state_change1(SE,SE0,SS0,NewSS),
 1385    cond_state_change(Pre,Cond,State),!.
 1386cond_state_change([se(Sort,Obj,SE)|Pre],Cond,[se(Sort,Obj,SE)|State]):-
 1387    cond_state_change(Pre,Cond,State),!.
 1388
 1389%-------------------------------------------
 1390% check that an action's state change
 1391% included changes of the goal states need to be achieved
 1392post_changed(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
 1393    member(se(Sort,Obj,SE0),Post0),
 1394    state_achieved([se(Sort,Obj,SE0)],[se(Sort,Obj,SE)],_),
 1395    statics_consist(Statics).
 1396post_changed(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
 1397    member(sc(Sort,Obj,SE1=>SS),Cond),
 1398    state_achieved([se(Sort,Obj,SS)],[se(Sort,Obj,SE)],_),
 1399    statics_consist(Statics).
 1400post_changed(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
 1401    post_changed(Post0,Cond,Statics,Post).
 1402
 1403all_achieved([],Statics,Post).
 1404all_achieved([se(Sort,Obj,SL)|Pre],Statics,Post):-
 1405    not(member(se(Sort,Obj,SR),Post)),
 1406    all_achieved(Pre,Statics,Post).
 1407all_achieved([se(Sort,Obj,SL)|Pre],Statics,Post):-
 1408    member(se(Sort,Obj,SR),Post),
 1409    is_achieved(SL,SR),
 1410    statics_consist_instance(Statics),
 1411    all_achieved(Pre,Statics,Post).
 1412
 1413
 1414%-------------------------------------------
 1415% instantiate a bit
 1416% use action's state change include the postcondition
 1417post_instant(Post0,Cond,Statics,[]):-!.
 1418post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
 1419    member(se(Sort,Obj,SE0),Post0),
 1420    statics_consist(Statics).
 1421post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
 1422    member(sc(Sort,Obj,SE1=>SS),Cond),
 1423    statics_consist(Statics).
 1424post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
 1425    member(sc(Sort0,Obj,SE1=>SS),Cond),
 1426    not(objects(Sort0,_)),
 1427    subsorts(Sort0,Sortls),
 1428    not(not(member(Sort,Sortls))),
 1429    statics_consist(Statics).
 1430post_instant(Post0,Cond,Statics,[se(Sort,Obj,SE)|Post]):-
 1431    post_instant(Post0,Cond,Statics,Post),!.
 1432/******************************* NODE ADT *********************/

 1433
 1434%node(Name, Precond, Decomps, Temp, Statics)
 1435% When inputting new methods etc filter all statics into
 1436% static slot
 1437
 1438make_problem_into_node(I,goal(L,TM,STATS),  NN) :-
 1439     make_problem_up(L, STEPS),
 1440     make_num_hp(TM,Temp),
 1441     sort_steps(STEPS,Temp,STEPS1),
 1442     make_ss_to_se(I,I_Pre),
 1443     NN = node(root,I_Pre,STEPS1 ,Temp, STATS),!.
 1444
 1445% make problem to steps
 1446make_problem_up([],[]):-!.
 1447make_problem_up([achieve(L)|R],[step(HP,achieve(L1),undefd,[L1],unexp)|RS]):- 
 1448                             %preconditon here is undefd
 1449    make_ss_to_se([L],[L1]),
 1450    gensym_special(hp,HP),
 1451    make_problem_up(R, RS),!.
 1452make_problem_up([achieve(L)|R],[step(HP,achieve(L1),undefd,L1,unexp)|RS]):- 
 1453                             %preconditon here is undefd
 1454    make_ss_to_se(L,L1),
 1455    gensym_special(hp,HP),
 1456    make_problem_up(R, RS),!.
 1457make_problem_up([O|R],[step(HP,O,undefd,undefd,unexp)|RS]):-
 1458    methodC(O,Pre,Post,Statics1,Temp,ACH,Dec),
 1459    gensym_special(hp,HP),
 1460    make_problem_up(R, RS),!.
 1461make_problem_up([O|R],     
 1462           [step(HP,O,undefd,undefd,unexp)|RS]):-
 1463    operatorC(O,Pre,Post,Cond,Statics1),
 1464    gensym_special(hp,HP),
 1465    make_problem_up(R, RS),!.
 1466
 1467make_num_hp([],[]):-!.
 1468make_num_hp([before(N1,N2)|TM],[before(H1,H2)|Temp]):-
 1469    gensym_num(hp,N1,H1),
 1470    gensym_num(hp,N2,H2),
 1471    make_num_hp(TM,Temp),!.
 1472
 1473%**************sort steps*********************************
 1474% sort steps by temporal constraints.
 1475sort_steps(Steps,[],Steps):-!.
 1476sort_steps([Steps|[]],[],[Steps]):-!.
 1477sort_steps(Steps,Temp,OrderedST):-
 1478   steps_in_temp(Temp,[],ST),
 1479   sort_steps1(Temp,ST,OrderedSTID),
 1480   sort_steps2(Steps,OrderedSTID,[],OrderedST),!.
 1481
 1482% find out the steps in temporal constraints.
 1483steps_in_temp([],ST,ST):-!.
 1484steps_in_temp([before(H1,H2)|TT],List,ST):-
 1485   set_append_e(List,[H1,H2],List1),
 1486   steps_in_temp(TT,List1,ST),!.
 1487
 1488% sort the steps_id(hps) by temporal constraints.
 1489sort_steps1(Temp,[],[]):-!.
 1490sort_steps1(Temp,[HP1|TST],[HPF|OST]):-
 1491   earliest_step(HP1,HPF,Temp,TST,TST1),
 1492   sort_steps1(Temp,TST1,OST),!.
 1493   
 1494earliest_step(HPF,HPF,Temp,[],[]):-!.
 1495earliest_step(HP1,HPF,Temp,[HP2|TST],[HP1|TST1]):-
 1496   member(before(HP2,HP1),Temp),
 1497   earliest_step(HP2,HPF,Temp,TST,TST1),!.
 1498earliest_step(HP1,HPF,Temp,[HP2|TST],[HP2|TST1]):-
 1499   earliest_step(HP1,HPF,Temp,TST,TST1),!.
 1500
 1501% sort the steps, put the unordered steps in the front
 1502sort_steps2(OtherST,[],OrderedST1,OrderedST):-
 1503   append(OrderedST1,OtherST,OrderedST),!.
 1504sort_steps2(Steps,[HP|THPS],List,OrderedST):-
 1505   member(step(HP,N,Pre,Post,F),Steps),
 1506   append(List,[step(HP,N,Pre,Post,F)],List1),
 1507   list_take(Steps,[step(HP,N,Pre,Post,F)],Steps1),
 1508   sort_steps2(Steps1,THPS,List1,OrderedST),!.
 1509sort_steps2(Steps,[HP|THPS],List,OrderedST):-
 1510   sort_steps2(Steps,THPS,List,OrderedST),!.
 1511%*******************************************************
 1512
 1513% replace ss to se
 1514make_ss_to_se([],[]):-!.
 1515make_ss_to_se([ss(Sort,Obj,Post)|TPost],[se(Sort,Obj,Post)|TPre]):-
 1516     make_ss_to_se(TPost,TPre),!.
 1517make_ss_to_se([se(Sort,Obj,Post)|TPost],[se(Sort,Obj,Post)|TPre]):-
 1518     make_ss_to_se(TPost,TPre),!.
 1519
 1520%*******************************************************
 1521% extract_solution(Node,..
 1522% recurvise routine to work down tree and
 1523% print out a linearisation of it
 1524extract_solution(Node,PHPs,SIZE1) :-
 1525       % its the name of a hierarchical op......
 1526   getN_decomp(Node, HPs),
 1527   push_to_primitive(HPs,[],PHPs),
 1528   pprint(PHPs,1,SIZE),
 1529   SIZE1 is SIZE -1,!.
 1530
 1531
 1532
 1533
 1534
 1535
 1536
 1537
 1538
 1539
 1540
 1541
 1542
 1543
 1544
 1545
 1546
 1547
 1548
 1549
 1550/************ change_op_representation ***********/

 1551% make pre and post explicit
 1552% filter out statics and put in a new slot
 1553change_op_representation :-    
 1554    method(A,B,C,Stat,T,Dec),
 1555    make_ss_to_se(B,B0),
 1556    make_se_primitive(B0,B1),
 1557    make_sc_primitive(C,C1),
 1558    get_preconditions(C1,B1,Pre,Post),
 1559    rem_statics(Post, PostR,St1),
 1560    rem_statics(Pre, PreR,St2),
 1561    append_cut(St1,St2,Statics),
 1562    append_cut(Stat,Statics,Statics1),
 1563    remove_unneed(Statics1,[],Statics2),
 1564    get_achieval(A,Dec,T,Dec1,T1,ACH),
 1565    assert(methodC(A,PreR,PostR,Statics2,T1,achieve(ACH),Dec1)),
 1566    fail.
 1567change_op_representation :-
 1568    operator(A,B,C,D),
 1569    make_ss_to_se(B,B0),
 1570    make_se_primitive(B0,B1),
 1571    make_sc_primitive(C,C1),
 1572%    make_sc_primitive(D,D1),
 1573	%can't do that because it narrow the conditional change 
 1574    get_preconditions(C1,B1,Pre,Post),
 1575    rem_statics(Post, PostR,St1),
 1576    rem_statics(Pre, PreR,St2),
 1577    append_cut(St1,St2,Statics1),
 1578    remove_unneed(Statics1,[],Statics),
 1579    statics_consist(Statics),
 1580    assert(operatorC(A,PreR,PostR,D,Statics)),
 1581    fail.
 1582change_op_representation:-
 1583    retractall(current_num(sm,_)),!.
 1584
 1585get_preconditions([],Prev,Prev,Prev) :-!.
 1586get_preconditions([sc(S,X,From =>To)|Rest],Prev,[se(S,X,From1)|Pre],[se(S,X,To1)|Post]):-
 1587     member_e(se(S,X,PSE),Prev),
 1588     append(PSE,From,From1),
 1589     append(PSE,To,To1),
 1590     list_take(Prev,[se(S,X,PSE)],Prev1),
 1591     get_preconditions(Rest,Prev1, Pre,Post),!.
 1592get_preconditions([sc(S,X,From =>To)|Rest],Prev,[se(S,X,From)|Pre],[se(S,X,To)|Post]):-
 1593     get_preconditions(Rest,Prev, Pre,Post),!.
 1594get_preconditions([],Prev,Prev,Prev) :-!.
 1595
 1596% get all achieve goals out
 1597get_achieval(A,Dec,T,Dec1,T1,Achieval):-
 1598     retractall(current_num(sm,_)),
 1599     make_dec(A,Dec,Dec1,T,T1,[],Achieval),!.
 1600make_dec(A,[],[],Temp,Temp,Achieval,Achieval):-!.
 1601make_dec(A,[HD|TD],TD1,Temp,Temp1,Achieval,Achieval1):-
 1602     HD=..[achieve|Goal],
 1603     current_num(sm,Num),
 1604     replace_achieval_temp(Temp,Temp0,Num),
 1605     make_ss_to_se(Goal,Goal0),
 1606     append(Achieval,Goal0,Achieval0),
 1607     make_dec(A,TD,TD1,Temp0,Temp1,Achieval0,Achieval1),!.
 1608make_dec(A,[HD|TD],TD1,Temp,Temp1,Achieval,Achieval1):-
 1609     HD=..[achieve|Goal],
 1610     not(current_num(sm,Num)),
 1611     replace_achieval_temp(Temp,Temp0,1),
 1612     make_ss_to_se(Goal,Goal0),
 1613     append(Achieval,Goal0,Achieval0),
 1614     make_dec(A,TD,TD1,Temp0,Temp1,Achieval0,Achieval1).
 1615make_dec(A,[HD|TD],[HD|TD1],Temp,Temp1,Achieval,Achieval1):-
 1616     HD=..[DecName|Goal],
 1617     DecName\==achieve,
 1618     gensym_special(sm,SM),
 1619     current_num(sm,Num),
 1620     make_dec(A,TD,TD1,Temp,Temp1,Achieval,Achieval1),!.
 1621
 1622% get rid of the achievals in temp orders
 1623replace_achieval_temp(Temp,Temp1,Num):-
 1624     change_all_numbers(Temp,Num,Temp00),
 1625     tidy_temp(Temp00,Temp1).
 1626
 1627change_all_numbers([],Num,[]):-!.
 1628change_all_numbers([HTemp|TTemp],Num,[HTemp00|TTemp00]):-
 1629     HTemp=..[before|Nums],
 1630     change_nums(Nums,Num,Nums1),
 1631     HTemp00=..[before|Nums1],
 1632     change_all_numbers(TTemp,Num,TTemp00).
 1633
 1634change_nums([],Num,[]):-!.
 1635change_nums([Num1|TN],Num,[Num1|TN1]):-
 1636    Num1<Num,
 1637    change_nums(TN,Num,TN1),!.
 1638change_nums([Num1|TN],Num,[Num2|TN1]):-
 1639    Num1>Num,
 1640    Num2 is Num1-1,
 1641    change_nums(TN,Num,TN1),!.
 1642change_nums([Num|TN],Num,[0|TN1]):-
 1643    change_nums(TN,Num,TN1),!.
 1644
 1645% since assumed achieval only happen at first, so only change the after ones
 1646tidy_temp(Temp,Temp1):-
 1647     member(before(Num,0),Temp),
 1648     list_take(Temp,[before(Num,0)],Temp0),
 1649     change_laters(Temp0,Num,Temp01),
 1650     tidy_temp(Temp01,Temp1).
 1651tidy_temp([],[]):-!.
 1652tidy_temp([before(0,Num)|Temp],Temp0):-
 1653     tidy_temp(Temp,Temp0),!.
 1654tidy_temp([before(Num1,Num2)|Temp],[before(Num1,Num2)|Temp0]):-
 1655     tidy_temp(Temp,Temp0),!.
 1656
 1657change_laters([before(0,Num2)|Temp],Num,[before(Num,Num2)|Temp0]):-
 1658     change_laters(Temp,Num,Temp0).
 1659change_laters([before(Num1,0)|Temp],Num,[before(Num1,0)|Temp0]):-
 1660     change_laters(Temp,Num,Temp0).
 1661change_laters([before(Num1,Num2)|Temp],Num,[before(Num1,Num2)|Temp0]):-
 1662     change_laters(Temp,Num,Temp0).
 1663
 1664% change the states to primitive states
 1665make_se_primitive([],[]).
 1666make_se_primitive([se(Sort,Obj,ST)|SE],[se(Sort,Obj,ST)|SE0]):-
 1667    find_prim_sort(Sort,[Sort]),!,
 1668    make_se_primitive(SE,SE0).
 1669make_se_primitive([se(Sort,Obj,ST)|SE],[se(PSort,Obj,ST)|SE0]):-
 1670    find_prim_sort(Sort,PSorts),
 1671    member(PSort,PSorts),
 1672    make_se_primitive(SE,SE0).
 1673
 1674% change the state changes to primitive states
 1675make_sc_primitive([],[]).
 1676make_sc_primitive([sc(Sort,Obj,SE1=>SE2)|ST],[sc(Sort,Obj,SE1=>SE2)|ST0]):-
 1677    find_prim_sort(Sort,[Sort]),!,
 1678    make_sc_primitive(ST,ST0).
 1679make_sc_primitive([sc(Sort,Obj,SE1=>SE2)|ST],[sc(PSort,Obj,SE1=>SE2)|ST0]):-
 1680    find_prim_sort(Sort,PSorts),
 1681    member(PSort,PSorts),
 1682    make_sc_primitive(ST,ST0).
 1683% ------------ end of change operator ----------------------
 1684make_tn(TN,Name,Pre,Post,Temp,Dec):-
 1685    gensym_special(tn,TN),
 1686    find_only_changed(Pre,Post,[],Pre1,[],Post1),
 1687%    tell(user),nl,write(tn(TN,Name,Pre1,Post1,Temp,Dec)),nl,told,
 1688    assert(tn(TN,Name,Pre1,Post1,Temp,Dec)),!.
 1689
 1690find_only_changed([],[],Pre,Pre,Post,Post):-!.
 1691% just a lazy check if they are in exactly same sequence
 1692find_only_changed([se(Sort,Obj,ST)|Pre],[se(Sort,Obj,ST)|Post],Pre0,Pre1,Post0,Post1):-
 1693    find_only_changed(Pre,Post,Pre0,Pre1,Post0,Post1),!.
 1694find_only_changed([se(Sort,Obj,ST)|Pre],Post,Pre0,Pre1,Post0,Post1):-
 1695    member(se(Sort,Obj,ST1),Post),
 1696    list_take(Post,[se(Sort,Obj,ST1)],Post2),
 1697    append_changed(se(Sort,Obj,ST),se(Sort,Obj,ST1),Pre0,Pre3,Post0,Post3),
 1698    find_only_changed(Pre,Post2,Pre3,Pre1,Post3,Post1),!.
 1699find_only_changed([se(Sort,Obj,ST)|Pre],Post,Pre0,Pre1,Post0,Post1):-
 1700    member(se(SortN,Obj,ST1),Post),
 1701    list_take(Post,[se(SortN,Obj,ST1)],Post2),
 1702    append_changed(se(Sort,Obj,ST),se(SortN,Obj,ST1),Pre0,Pre3,Post0,Post3),
 1703    find_only_changed(Pre,Post2,Pre3,Pre1,Post3,Post1),!.
 1704% other fail. 
 1705
 1706% append  only changed states
 1707% not_conflict here means not changed
 1708append_changed(se(Sort,Obj,ST),se(Sort1,Obj,ST1),Pre0,Pre0,Post0,Post0):-
 1709    not_conflict(Sort,Obj,ST,ST1,_),!.
 1710append_changed(se(Sort,Obj,ST),se(Sort1,Obj,ST1),Pre0,Pre3,Post0,Post3):-
 1711    append(Pre0,[se(Sort,Obj,ST)],Pre3),
 1712    append(Post0,[se(Sort,Obj,ST1)],Post3),!.
 1713
 1714
 1715
 1716%***********print out solution**************************   
 1717push_to_primitive([],PHPs,PHPs) :-!.
 1718push_to_primitive([step(HPID,_,_,_,exp(TN))|HPs],List,PHPs) :-
 1719   tn(TN,Name,Pre,Post,Temp,Dec),
 1720   push_to_primitive(Dec,List,Dec1),
 1721   push_to_primitive(HPs,Dec1,PHPs),!.
 1722push_to_primitive([step(HPID,_,_,_,exp(Name))|HPs],List,PHPs):-
 1723   append(List,[Name],List1),
 1724   push_to_primitive(HPs,List1,PHPs),!.
 1725
 1726
 1727/*********** TEMPORAL AND DECLOBBERING ************/

 1728
 1729possibly_before(I,J,Temps) :-
 1730    \+ necessarily_before(J,I,Temps), !.
 1731
 1732necessarily_before(J,I,Temps) :-
 1733    member(before(J,I),Temps),!.
 1734necessarily_before(J,I,Temps) :-
 1735    member(before(J,Z),Temps),
 1736    necessarily_before(Z,I,Temps),!.
 1737
 1738/********** retracting, asserting and reporting nodes *****************/

 1739
 1740/***** SOLUTION ******/

 1741select_node(node(Name,Pre,Temp,Decomp,Statics)) :-
 1742   retract(node(Name,Pre,Temp,Decomp,Statics)),
 1743%   nl,nl,write(Name),write(' RETRACTED'),nl,nl,
 1744%   tell(user),
 1745%   nl,nl,write(Name),write(' RETRACTED'),nl,nl,
 1746%   tell(FF),
 1747    !.
 1748
 1749is_of_primitive_sort(X,Y) :-
 1750    objects(Y,L),member(X,L).
 1751is_of_sort(X,Y) :-
 1752    is_of_primitive_sort(X,Y).
 1753is_of_sort(X,Y) :-
 1754    sorts(Y,SL),member(Z,SL),is_of_sort(X,Z).
 1755
 1756find_all_upper([],[]).
 1757find_all_upper([HVars|TV],[HSorts|TS]):-
 1758     uppersorts(HSorts,Upsorts),
 1759     member(HVars,Upsorts),
 1760     find_all_upper(TV,TS).
 1761     
 1762% find out primitive sorts of a sort.
 1763find_prim_sort(Sort,PS):-
 1764  subsorts(Sort,Subsorts),
 1765  split_prim_noprim(Subsorts,PS,NP),!.
 1766
 1767% find out the objects of a sort
 1768get_sort_objects(Sort,Objs):-
 1769   find_prim_sort(Sort,PSorts),
 1770   get_objects1(PSorts,Objls),
 1771   flatten(Objls,[],Objs),!.
 1772
 1773get_objects1([],[]):-!.
 1774get_objects1([PS1|RS],[Objls1|Objls]):-
 1775   objects(PS1,Objls1),
 1776   get_objects1(RS,Objls),!.
 1777
 1778% find subsorts of a sort(include).
 1779subsorts(Sort,Subsorts):-
 1780  sort_down([Sort],[Sort],Subsorts),!.
 1781
 1782sort_down([],Subsorts,Subsorts):-!.
 1783sort_down([HOpen|TOpen],List,Sortslist):-
 1784  sorts(HOpen,Sorts),
 1785  append(List,Sorts,List1),
 1786  append(TOpen,Sorts,Open1),
 1787  sort_down(Open1,List1,Sortslist),!.
 1788sort_down([HOpen|TOpen],List,Sortslist):-
 1789  sort_down(TOpen,List,Sortslist),!.
 1790  
 1791% find uppersorts of a sort or object(include).
 1792uppersorts(Sort,Uppersorts):-
 1793  objects(Sort,Objls),
 1794  sort_up(Sort,[Sort],Uppersorts),!.
 1795uppersorts(Sort,Uppersorts):-
 1796  sorts(Sort,Sortls),
 1797  sort_up(Sort,[Sort],Uppersorts),!.
 1798uppersorts(Obj,Sortls):-
 1799  objects(Sort,Objls),
 1800  member(Obj, Objls),
 1801  sort_up(Sort,[Sort],Sortls),!.
 1802
 1803sort_up(Sort, List,Sortslist):-
 1804  sorts(non_primitive_sorts,NPSorts),
 1805  sort_up1(Sort,NPSorts,NPSorts,List,Sortslist),!.
 1806
 1807sort_up1(Sort,[],NPSorts,Sortslist,Sortslist):-!.
 1808sort_up1(Sort,[HNPSorts|TNPSorts],NPSorts,List,Sortslist):-
 1809  sorts(HNPSorts,Sorts),
 1810  member(Sort,Sorts),
 1811  append(List, [HNPSorts], List1),
 1812  sort_up(HNPSorts,List1,Sortslist),!. 
 1813sort_up1(Sort,[HNPSorts|TNPSorts],NPSorts,List,Sortslist):-
 1814  sort_up1(Sort,TNPSorts,NPSorts,List,Sortslist),!.
 1815
 1816% find out primitive sorts from a sorts list.
 1817split_prim_noprim([],[],[]):-!.
 1818split_prim_noprim([HS|TS],[HS|TP],NP):-
 1819     objects(HS,Obj),
 1820     split_prim_noprim(TS,TP,NP),!.		
 1821split_prim_noprim([HS|TS],PS,[HS|NP]):-
 1822     split_prim_noprim(TS,PS,NP),!.
 1823
 1824
 1825
 1826
 1827
 1828% check for statics consist and instanciate them
 1829statics_consist_instance([]):-!.
 1830statics_consist_instance(Statics) :-
 1831   get_invariants(Invs),
 1832   statics_consist_instance0(Invs,Statics).
 1833
 1834statics_consist_instance0(Invs,[]):-!.
 1835statics_consist_instance0(Invs,[ne_back(A,B)|TStatics]):-
 1836   not(A==B),
 1837   statics_consist_instance0(Invs,TStatics).
 1838statics_consist_instance0(Invs,[ne(A,B)|TStatics]):-
 1839   append(TStatics,[ne_back(A,B)],TStatics1),
 1840   statics_consist_instance0(Invs,TStatics1),!.
 1841statics_consist_instance0(Invs,[is_of_sort(Obj,Sort)|TStatics]):-
 1842   is_of_sort(Obj,Sort),
 1843   statics_consist_instance0(Invs,TStatics).
 1844statics_consist_instance0(Invs,[is_of_primitive_sort(Obj,Sort)|TStatics]):-
 1845   is_of_primitive_sort(Obj,Sort),
 1846   statics_consist_instance0(Invs,TStatics).
 1847statics_consist_instance0(Invs,[Pred|TStatics]):-
 1848   member(Pred,Invs),
 1849   statics_consist_instance0(Invs,TStatics).
 1850
 1851% check for statics consist without instanciate them
 1852% only instance the variable when there is one choice of from the ground lists
 1853statics_consist([]):-!.
 1854statics_consist(Statics):-
 1855   get_invariants(Invs),
 1856   statics_consist1(Invs,Statics),!.
 1857   
 1858statics_consist1(Invs,[]):-!.
 1859statics_consist1(Invs,[ne_back(A,B)|TStatics]):-
 1860   not(A==B),
 1861   statics_consist1(Invs,TStatics),!.
 1862statics_consist1(Invs,[ne(A,B)|TStatics]):-
 1863   append(TStatics,[ne_back(A,B)],TStatics1),
 1864   statics_consist1(Invs,TStatics1),!.
 1865statics_consist1(Invs,[is_of_sort(Obj,Sort)|TStatics]):-
 1866   get_sort_objects(Sort,Objs),
 1867   obj_member(Obj,Objs),
 1868   statics_consist1(Invs,TStatics),!.
 1869statics_consist1(Invs,[is_of_primitive_sort(Obj,Sort)|TStatics]):-
 1870   objects(Sort,Objs),
 1871   obj_member(Obj,Objs),
 1872   statics_consist1(Invs,TStatics),!.
 1873statics_consist1(Invs,[Pred|TStatics]):-
 1874   pred_member(Pred,Invs),
 1875   statics_consist1(Invs,TStatics),!.
 1876
 1877/***************** local utils *****************/

 1878
 1879/*********** DOMAIN MODEL FUNCTIONS *****************/

 1880get_invariants(Invs) :-
 1881    atomic_invariants(Invs),!.
 1882
 1883rem_statics([ss(S,X,Preds)|Post], [ss(S,X,PredR)|PostR],Rt1) :-
 1884    filter_list(Preds, is_a_dynamic_pred,PredR),
 1885    filter_list(Preds, is_a_static_pred, R),
 1886    rem_statics(Post, PostR,Rt),
 1887    append(Rt,[is_of_sort(X,S)|R],Rt1),!.
 1888rem_statics([se(S,X,Preds)|Post], [se(S,X,PredR)|PostR],Rt1) :-
 1889    filter_list(Preds, is_a_dynamic_pred,PredR),
 1890    filter_list(Preds, is_a_static_pred, R),
 1891    rem_statics(Post, PostR,Rt),
 1892    append(Rt,[is_of_sort(X,S)|R],Rt1),!.
 1893rem_statics([], [],[]) :-!.
 1894
 1895
 1896
 1897/***************** STATICS ************************/

 1898
 1899isemptylist([]):-!.
 1900
 1901
 1902member_cut(X,[X|_]) :- !.
 1903member_cut(X,[_|Y]) :- member_cut(X,Y),!.
 1904
 1905member_e(X,[Y|_]):-
 1906     X==Y,!.
 1907member_e(X,[Y|L]):-
 1908     var(Y),
 1909     member_e(X,L),!.
 1910member_e(ss(Sort,Obj,SE),[ss(Sort,Obj1,SE)|_]):-
 1911     Obj==Obj1,!.
 1912member_e(se(Sort,Obj,SE),[se(Sort,Obj1,SE)|_]):-
 1913     Obj==Obj1,!.
 1914member_e(sc(Sort,Obj,SE1=>SE2),[sc(Sort,Obj1,SE1=>SE2)|_]):-
 1915     Obj==Obj1,!.
 1916member_e(X,[Y|L]):- member_e(X,L),!.
 1917% u_mem in ob_utils is SLOW!?.
 1918% this is a fast impl.
 1919u_mem_cut(_,[]):-!,fail.
 1920u_mem_cut(X,[Y|_]) :- X == Y,!.
 1921u_mem_cut(X,[_|L]) :- u_mem_cut(X,L),!.
 1922
 1923
 1924% check if object X is a member of a objects list
 1925% 1. if it is not a variable, check if it is in the list
 1926% 2. X is a variable, and the list only has one objects, make X as that obj
 1927% 3. X is a variable, but the list has more than one objects, leave X unchange
 1928obj_member(X,[X|[]]):-!. 
 1929obj_member(X,List):-     
 1930    obj_member0(X,List),!.
 1931obj_member0(X,[Y|_]):-
 1932    var(X),!.%if X is var, but Y not, the leave X as that variable
 1933obj_member0(X,[Y|_]):-
 1934    X==Y,!.
 1935obj_member0(X,[_|Y]) :- obj_member0(X,Y),!.
 1936
 1937% check if a predicate is a member of a ground predicate list,
 1938% 1. when only one predicates found
 1939% just used in binding the predicates to a sort without instantiate it
 1940% for efficiency, instantiate the variable if the list only have one atom
 1941pred_member(ne(A,B),List):-
 1942    A\==B,!.
 1943pred_member(is_of_sort(A,B),List):-
 1944    get_sort_objects(B,Objls),
 1945    obj_member(A,Objls),!.
 1946pred_member(is_of_primitive_sort(A,B),List):-
 1947    objects(B,Objls),
 1948    obj_member(A,Objls),!.
 1949pred_member(X,List):-
 1950    setof(X,member(X,List),Refined),
 1951    pred_member0(X,Refined),!.
 1952pred_member0(X,[X|[]]):-!.
 1953pred_member0(X,Y):-
 1954    pred_member1(X,Y),!.
 1955pred_member1(X,[Y|_]):-
 1956    X=..[H|XLs],
 1957    Y=..[H|YLs],
 1958    vequal(XLs,YLs),!.
 1959pred_member1(X,[_|Y]):- pred_member1(X,Y),!.
 1960	
 1961
 1962
 1963append_cut([],L,L) :- !.
 1964append_cut([H|T],L,[H|Z]) :- append_cut(T,L,Z),!.
 1965
 1966% remove the constants that no need
 1967% instanciate the viables that all ready been bind
 1968% ------------------------------------------
 1969append_st(ST1,ST2,ST):-
 1970    append_cut(ST1,ST2,ST0),
 1971    remove_unneed(ST0,[],ST),!.
 1972
 1973% remove the constants that no need
 1974% instanciate the variables that all ready been bind
 1975remove_unneed([],C,C):-!.
 1976remove_unneed([A|B], Z, C):-
 1977    var(A),
 1978    member_e(A,Z),
 1979    remove_unneed(B, Z, C),! .
 1980remove_unneed([A|B], Z, C):-
 1981    var(A),
 1982    append(Z,[A],D),
 1983    remove_unneed(B, D, C),!.
 1984remove_unneed([A|B], Z, C):-
 1985    ground(A),
 1986    remove_unneed(B, Z, C),!.
 1987remove_unneed([A|B], Z, C):-
 1988    A=..[ne|Paras],
 1989    append(Z,[A],D),
 1990    remove_unneed(B, D, C),!.
 1991remove_unneed([A|B], Z, C):-
 1992    A=..[Pred|Paras],
 1993    same_var_member(A,Z),
 1994    remove_unneed(B, Z, C),!.
 1995remove_unneed([A|B], Z, C):-
 1996    append(Z,[A],D),
 1997    remove_unneed(B, D, C),!.
 1998
 1999same_var_member(Pred,[Pred1|List]):-
 2000     var(Pred1),
 2001     same_var_member(Pred,List),!.
 2002same_var_member(Pred,[Pred1|List]):-
 2003     Pred==Pred1,!.
 2004same_var_member(Pred,[Pred1|List]):-
 2005     Pred=..[H|T],
 2006     Pred1=..[H|T1],
 2007     same_var_member1(T,T1),!.
 2008same_var_member(Pred,[Pred1|List]):-
 2009     same_var_member(Pred,List),!.
 2010
 2011same_var_member1([],[]):-!.
 2012same_var_member1([H1|T],[H2|T]):-
 2013     var(H1),
 2014     H1==H2,!.
 2015same_var_member1([H|T1],[H|T2]):-
 2016     var(T1),
 2017     T1==T2,!.
 2018same_var_member1([H1|T1],[H2|T2]):-
 2019     H1==H2,
 2020     same_var_member1(T1,T2),!.
 2021
 2022	
 2023% set_append_e: list1 + list2 -> list
 2024% no duplicate, no instanciation
 2025% ------------------------------------------
 2026set_append_e(A,B,C):-
 2027    append_cut(A,B,D),
 2028    remove_dup(D,[],C),!.
 2029
 2030% remove duplicate
 2031remove_dup([],C,C):-!.
 2032remove_dup([A|B],Z,C) :-
 2033    member_e(A, Z),
 2034    remove_dup(B, Z, C),! .
 2035remove_dup([A|B], Z, C):-
 2036    append(Z,[A],D),
 2037    remove_dup(B, D, C),!.
 2038
 2039vequal([],[]):-!.
 2040vequal([X|XLs],[Y|YLs]):-
 2041    var(X),
 2042    vequal(XLs,YLs),!.    
 2043vequal([X|XLs],[Y|YLs]):-
 2044    var(Y),
 2045    vequal(XLs,YLs),!.
 2046vequal([X|XLs],[Y|YLs]):-
 2047    X==Y,	
 2048    vequal(XLs,YLs),!.
 2049
 2050
 2051% append_st: append two statics
 2052
 2053/* is X is in the atomic_invariants then by defn its a static. */

 2054is_a_static_pred(X) :-
 2055        atomic_invariants( A ),
 2056        not( not( member(X,A) )),!.
 2057is_a_static_pred(ne(_,_)) :-!.
 2058is_a_static_pred(is_of_sort(_,_)) :-!.
 2059 
 2060is_a_dynamic_pred(X) :-
 2061        not( is_a_static_pred(X) ),!.
 2062 
 2063/* filter_list(X,condition(args),XO)
 2064 
 2065 XO is reduced list */

 2066
 2067filter_list([X|Rest],Op,[X|Rest1]) :-
 2068        Op =.. OL,
 2069        append(OL,[X],OL1),
 2070        Pred =.. OL1,
 2071        call(Pred),
 2072        filter_list(Rest,Op,Rest1),!.
 2073filter_list([_|Rest],Op,Rest1) :-
 2074        filter_list(Rest,Op,Rest1),!.
 2075filter_list([],_,[]).
 2076
 2077
 2078
 2079% ----------------------utilities---------------------
 2080/*
 2081not(X):- \+X.
 2082member(X,[X|_]).
 2083member(X,[_|L]) :- member(X,L).
 2084append([],L,L):-!.
 2085append([H|T],L,[H|Z]) :- append(T,L,Z),!.
 2086 */

 2087
 2088file_exists(Filename):-exists_file(Filename).
 2089
 2090% subtract(A,B,C): subtract B from A
 2091% -------------------------------------
 2092subtract([],_,[]):-!.
 2093subtract([A|B],C,D) :-
 2094        member(A,C),
 2095        subtract(B,C,D),!.
 2096subtract([A|B],C,[A|D]) :-
 2097        subtract(B,C,D),!.
 2098
 2099/* arg1 - arg2 = arg3 */

 2100
 2101list_take(R,[E|R1],R2):-
 2102        remove_el(R,E,RR),
 2103        list_take(RR,R1,R2),!.
 2104list_take(R,[_|R1],R2):-
 2105        list_take(R,R1,R2),!.
 2106list_take(A,[],A) :- !.
 2107
 2108				% remove_el: list * el -> list-el 
 2109% ----------------------------------
 2110remove_el([],_,[]) :- ! .
 2111remove_el([A|B],A,B) :- ! .
 2112remove_el([A|B],C,[A|D]) :-
 2113        remove_el(B,C,D) .
 2114
 2115/* generate symbol predicate  (from file futile)*/

 2116
 2117gensym_special(Root,Atom) :-
 2118                        getnum(Root,Num),
 2119                        name(Root,Name1),
 2120                        name(Num,Name2),
 2121                        append(Name1,Name2,Name),
 2122                        name(Atom,Name).
 2123
 2124getnum(Root,Num) :-
 2125                        retract(current_num(Root,Num1)),!,
 2126                        Num is Num1+1,
 2127                        asserta(current_num(Root,Num)).
 2128
 2129getnum(Root,1) :- asserta(current_num(Root,1)).
 2130
 2131
 2132/************ end of change_op_representation ***********/

 2133
 2134gensym_num(Root,Num,Atom):-
 2135     name(Root,Name),
 2136     name(Num,Name1),
 2137     append(Name,Name1,Name2),
 2138     name(Atom,Name2),!.
 2139
 2140
 2141%*******************************************************   
 2142pprint([],SIZE,SIZE):-!.
 2143pprint([HS|TS],Size0,SIZE):-
 2144    list(HS),
 2145    pprint(HS,Size0,Size1),
 2146    pprint(TS,Size1,SIZE),!.
 2147pprint([HS|TS],Size0,SIZE):-
 2148%    write('step '),write(Size0),write(': '),
 2149%    write(HS),nl,
 2150    Size1 is Size0+1,
 2151    pprint(TS,Size1,SIZE),!.
 2152
 2153
 2154% list of lists -> list
 2155
 2156flatten([HO|TO], List, O_List):-
 2157	append(HO, List, List_tmp),
 2158	flatten(TO, List_tmp, O_List),!.
 2159flatten([H|TO], List,O_List):-
 2160	append([H], List, List_tmp),
 2161	flatten(TO, List_tmp, O_List).
 2162flatten([], [HList|T], O_List):-
 2163	HList = [],
 2164	flatten(T, [], O_List).
 2165flatten([], [HList|T], O_List):-
 2166	list(HList),
 2167	flatten([HList|T],[], O_List),!.
 2168flatten([], L,L):-!.
 2169
 2170% flatten with no duplicate
 2171set_flatten([HO|TO], List, O_List):-
 2172	set_append_e(HO, List, List_tmp),
 2173	set_flatten(TO, List_tmp, O_List),!.
 2174set_flatten([H|TO], List,O_List):-
 2175	set_append_e([H], List, List_tmp),
 2176	set_flatten(TO, List_tmp, O_List).
 2177set_flatten([], [HList|T], O_List):-
 2178	HList = [],
 2179	set_flatten(T, [], O_List).
 2180set_flatten([], [HList|T], O_List):-
 2181	list(HList),
 2182	set_flatten([HList|T],[], O_List),!.
 2183set_flatten([], L,L):-!.
 2184
 2185% list: [el1,el2, ...] --> bool
 2186% -----------------------------
 2187list(A) :-
 2188        var(A) ,
 2189        ! ,
 2190        fail .
 2191list(A) :-
 2192        functor(A,'.',_).
 2193% ***********************for multy tasks*****************
 2194:- assert(time_taken(0)).
 2195:- assert(soln_size(0)).
 2196:- assert(plan_used(0)).
 2197
 2198solve(N,FN):-
 2199   N < FN,
 2200   tell(user),
 2201   nl,write('task '), write(N),write(': '),nl,
 2202   solution_file(F),
 2203   tell(F),
 2204   nl,write('task '), write(N),write(': '),nl,
 2205   solve(N),
 2206   Ni is N+1,
 2207   solve(Ni,FN).
 2208solve(FN,FN):-
 2209   tell(user),nl,write('task '),
 2210   write(FN),write(': '),nl,
 2211   solution_file(F),
 2212   tell(F),
 2213   nl,write('task '),
 2214   write(FN),write(': '),nl,
 2215   solve(FN),
 2216   retractall(sum(_)),
 2217   assert(sum(0)),
 2218   sum_time(CP),
 2219   retractall(sum(_)),
 2220   assert(sum(0)),
 2221   sum_size(SIZE),
 2222   TIM is CP /1000,
 2223   retractall(sum(_)),
 2224   assert(sum(0)),
 2225   sum_plan(PLAN),
 2226   retractall(time_taken(_)),
 2227   retractall(soln_size(_)),
 2228   retractall(plan_used(_)),
 2229   nl,write('total time '),write(TIM),write(' seconds'),
 2230   nl,write('total size '),write(SIZE),
 2231   nl,write('plan used '),write(PLAN),
 2232   nl,
 2233   told.
 2234
 2235sum_time(TIM):-
 2236   time_taken(CP),
 2237   retract(sum(N)),
 2238   N1 is N +CP,
 2239   assert(sum(N1)),
 2240   fail.
 2241sum_time(TIM):-
 2242   sum(TIM).
 2243sum_size(SIZE):-
 2244   soln_size(S),
 2245   retract(sum(N)),
 2246   N1 is N +S,
 2247   assert(sum(N1)),
 2248   fail.
 2249sum_size(SIZE):-
 2250   sum(SIZE).
 2251   
 2252   
 2253sum_plan(Plan):-
 2254   plan_used(PL),
 2255   retract(sum(N)),
 2256   N1 is N +PL,
 2257   assert(sum(N1)),
 2258   fail.
 2259sum_plan(Plan):-
 2260   sum(Plan).
 2261   
 2262   
 2263%ground the hierarchy structure of HTN planning domain
 2264ground_hierarchy:-
 2265     ground_predicates,
 2266     ground_substate_class,!.
 2267
 2268% grounding predicates to object level
 2269% assert in prolog database as gpredicates(Pred,GPredls)
 2270ground_predicates:-
 2271     predicates(Preds),
 2272     grounding_preds(Preds),
 2273     collect_grounded_pred,!.
 2274
 2275grounding_preds([]).
 2276% if it is statics, only choose within atomic_invariants
 2277grounding_preds([HPred|TP]):-
 2278     functor(HPred,FF,NN),
 2279     functor(APred,FF,NN),
 2280     atomic_invariants(Atom),
 2281     member(APred,Atom),
 2282     ground_all_var_atom(HPred),
 2283     grounding_preds(TP).
 2284% else, combine all the objects
 2285grounding_preds([HPred|TP]):-
 2286     functor(HPred,FF,NN),
 2287     functor(GPred,FF,NN),
 2288     ground_all_var(GPred,HPred),
 2289     grounding_preds(TP).
 2290
 2291% collect all the grounded predicates together
 2292collect_grounded_pred:-
 2293     gpred(Pred,_),
 2294     setof(GPred,gpred(Pred,GPred),GPredls),
 2295     retractall(gpred(Pred,_)),
 2296     assert(gpredicates(Pred,GPredls)),
 2297     fail.
 2298collect_grounded_pred.
 2299
 2300% grounding substate_class to primary sort level
 2301% assert in prolog database as gsubstate_class(Sort,Obj,States)
 2302ground_substate_class:-
 2303     substate_classes(Sort,Obj,Substate),
 2304     find_prim_sort(Sort,PS),
 2305     assert_subclass(PS,Obj,Substate),
 2306     fail.
 2307ground_substate_class:-
 2308     collect_grounded_substates.
 2309
 2310assert_subclass([],Obj,Substate).
 2311assert_subclass([HS|TS],Obj,Substate):-
 2312     assert(gsstates(HS,Obj,Substate)),
 2313     assert_subclass(TS,Obj,Substate).
 2314
 2315collect_grounded_substates:-
 2316     gsstates(Sort,Obj,_),
 2317     setof(SStates,gsstates(Sort,Obj,SStates),GSStates),
 2318     retractall(gsstates(Sort,Obj,_)),
 2319     all_combined(GSStates,GSStates0),
 2320     assert(gsubstate_classes(Sort,Obj,GSStates0)),
 2321     fail.
 2322collect_grounded_substates.
 2323
 2324all_combined(SStates,CSStates):-
 2325     xprod(SStates,CSStates1),
 2326     flat_interal(CSStates1,CSStates),!.
 2327
 2328flat_interal([],[]):-!.
 2329flat_interal([HSS1|TSS1],[HSS|TSS]):-
 2330     flatten(HSS1,[],HSS),
 2331     flat_interal(TSS1,TSS),!.
 2332
 2333ground_all_var_atom(HPred):-
 2334     functor(HPred,FF,NN),
 2335     functor(GPred,FF,NN),
 2336     functor(APred,FF,NN),
 2337     atomic_invariants(Atom),
 2338     member(APred,Atom),
 2339     GPred=..[Name|Vars],
 2340     APred=..[Name|Sorts],
 2341     ground_all_var_atom0(Vars,Sorts),
 2342     assert_gpred(GPred),
 2343     fail.
 2344ground_all_var_atom(HPred).
 2345
 2346ground_all_var_atom0([],[]).
 2347ground_all_var_atom0([HVars|TV],[HSorts|TS]):-
 2348     subsorts(HSorts,Subsorts),
 2349     split_prim_noprim(Subsorts,PSorts,NPSorts),
 2350     member(LS,PSorts),
 2351     objects(LS,Objls),
 2352     member(HVars,Objls),
 2353     ground_all_var_atom0(TV,TS).
 2354ground_all_var_atom0([HVar|TV],[HASorts|TS]):-
 2355     objects(Sorts,Objls),
 2356     member(HASorts,Objls),
 2357     HVar=HASorts,
 2358     ground_all_var_atom0(TV,TS).
 2359
 2360ground_all_var(GPred,HPred):-
 2361     GPred=..[Name|Vars],
 2362     HPred=..[Name|Sorts],
 2363     ground_all_var0(Vars,Sorts),
 2364     not(inconsistent_constraint([GPred])),
 2365     assert_gpred(GPred),
 2366     fail.
 2367ground_all_var(GPred,HPred).
 2368
 2369ground_all_var0([],[]).
 2370ground_all_var0([HVars|TV],[HSorts|TS]):-
 2371     objects(HSorts,Objls),
 2372     member(HVars,Objls),
 2373     ground_all_var0(TV,TS).
 2374ground_all_var0([HVars|TV],[HSorts|TS]):-
 2375     subsorts(HSorts,Subsorts),
 2376     split_prim_noprim(Subsorts,PSorts,NPSorts),
 2377     member(LS,PSorts),
 2378     objects(LS,Objls),
 2379     member(HVars,Objls),
 2380     ground_all_var0(TV,TS).
 2381
 2382% assert grounded predicates with related upper level predicates
 2383
 2384assert_gpred(GPred):-
 2385     functor(GPred,FF,NN),
 2386     functor(UPred,FF,NN),
 2387     assert_gpred0(GPred,UPred),!.
 2388
 2389assert_gpred0(GPred,UPred):-
 2390     GPred=..[Name|PSorts],
 2391     UPred=..[Name|Vars],
 2392     get_obj_sort(Vars,PSorts),
 2393     assert(gpred(UPred,GPred)),
 2394     fail.
 2395assert_gpred0(GPred,UPred).
 2396
 2397get_obj_sort([],[]):-!.
 2398get_obj_sort([HVars|TV],[HObj|TS]):-
 2399     objects(HVars,Objls),
 2400     member(HObj,Objls),
 2401     get_obj_sort(TV,TS),!.
 2402
 2403delete_all_nodes :-
 2404	retractall(node(_,_,_,_,_)),
 2405	retractall(final_node(_)),
 2406	retractall(tp_node(_,_,_,_,_,_)),
 2407	retractall(closed_node(_,_,_,_,_,_)),
 2408	retractall(solved_node(_,_,_)).
 2409delete_all_nodes :- !.
 2410
 2411
 2412% xprod: list * list --> (list X list)
 2413% -----------------------------------
 2414xprod(A,B,C) :-
 2415        xprod([A,B],C) .
 2416 
 2417xprod([],[]).
 2418xprod(A,E) :-
 2419        xprod(A,B,C,D) ,
 2420        F =..[^,C,D] ,
 2421        call(setof(B,F,E)) .
 2422 
 2423xprod([X],[A],A,member(A,X)) .
 2424xprod([X,Y],[A,B],C,(D,E)) :-
 2425        C =..[^,A,B] ,
 2426        D =..[member,A,X] ,
 2427        E =..[member,B,Y] .
 2428xprod([X|Y],[A|E],D,(F,G)) :-
 2429        D =..[^,A,C] ,
 2430        F =..[member,A,X] ,
 2431        xprod(Y,E,C,G).
 2432
 2433
 2434:- include(translog4_domain).
 2435:- include(translog4_ops).
 2436%:- include(translog4_ops2).
 2437%:- include(translog4_ops3).

 2438:- include(translog4_problems).
 2439
 2440:- fixup_exports.