1:- ensure_loaded('pddl_wrapper').
    9orderEvents([Domain,Problem,Solution],Sorted) :-
   10	ProblemName = hygiene,
   11	Domain = domain(DomainName,_,_,_,_,_),
   12	view([domain,Domain]),
   13	Problem = problem(ProblemName,DomainName,_,_,_,_),
   14	view([problem,Problem]),
   15	view([solution,Solution]),
   16	Solution = solution(Steps),
   17	findall(at(Start,action(start,Term)),(member([Start,Action,Arguments,_],Steps),Term =.. [Action|Arguments]),ActionStarts),
   18	view([actionStarts,ActionStarts]),
   19	findall(at(End,action(end,Term)),(member([Start,Action1,Arguments1,Duration],Steps),Term =.. [Action1|Arguments1],End is Start + Duration),ActionEnds),
   20	view([actionEnds,ActionEnds]),
   21	findall(at(Time,proposition(Prop)),(init(Problem,at(Time,Prop)),float(Time),not(atomic(Prop))),Props),
   22	view([props,Props]),
   23	append(ActionStarts,ActionEnds,Tmp1),
   24	append(Tmp1,Props,Updates),
   25        predsort(mcompare,Updates,Sorted),!.
   32mcompare(Delta, at(A,_), at(B,_)) :-
   33	A == B;
   34	compare(Delta, A, B).
   35
   36updateWorlds([Domain,Problem,Solution],Sorted,Worlds) :-
   38	getInit(Problem,WorldN),
   39	view([sorted,Sorted]),
   40	view([init,WorldN]),
   41	iterateAndUpdate([Domain,Problem,Solution],Sorted,Sorted,WorldN)
   41.
   42
   43iterateAndUpdate([Domain,Problem,Solution],[],Sorted,World0).
   44iterateAndUpdate([Domain,Problem,Solution],Steps,Sorted,World0) :-
   45	Steps = [Step|Rest],
   46	view([step,Step]),
   47	view([world,World0]),
   48	updateWorld([Domain,Problem,Solution],Steps,Sorted,World0,Step,World1),
   49	iterateAndUpdate([Domain,Problem,Solution],Rest,Sorted,World1).
   50
   51updateWorld([Domain,Problem,Solution],Steps,Sorted,World0,Step,World1) :-
   52	(   (	Step = at(Time,action(Point,Action)),(number(Time) ; float(Time))) -> 
   53	    (	(   Point = start ->
   54		    (	Step = at(StartTime,action(start,Action)),
   55			member(at(EndTime,action(end,Action)),Sorted) ) ;
   56		    (	Step = at(EndTime,action(end,Action)),
   57			member(at(StartTime,action(start,Action)),Sorted) )
   58		),
   59		findall(at(Time2,Item2),(member(at(Time2,Item2),Sorted),Time2 >= StartTime, Time2 =< EndTime),Items),
   60		view([items,Items]),
   61		Action =.. [Predicate|Args],
   62		view([predicate,Predicate]),
   63		actions(Domain,durativeAction(Predicate,TypeSpec,Duration,Preconditions,Effects)),
   64		checkPreconditions([Step,Time,Point,Action,Items],durativeAction(Predicate,TypeSpec,Duration,Preconditions,Effects),Sorted,World0,World1))
   65	;   
   66	    true),
   67	World1 = World0.
   90checkPreconditions([Step,Time,Point,Action,Items],DurativeAction,Sorted,World0,World1) :-
   91	view([durativeAction,DurativeAction]),
   92	DurativeAction = durativeAction(Predicate,TypeSpec,Duration,Preconditions,Effects),
   93	findall([Var,Type],(member(are(Vars,Type),TypeSpec),member(Var,Vars)),VarSpecs),
   94	Action =.. [Predicate|Args],
   95	length(Args,Arity),
   96	length(VarSpecs,Arity),
   97	checkTypes(Args,VarSpecs),
   98	member(Precondition,Preconditions),
   99	(   Precondition = 'at start'(Condition) -> (true) ;
  100	    (	Precondition = 'at end'(Condition) -> (true) ;		
  101		(   Precondition = 'over all'(Condition) -> ( true) ; (true) ) ) ),
 holds(Precondition, World)
  105	
  106	true
  106.
  107
  108	
  110checkTypes(Args,VarSpecs) :-
  111	Args = [Arg|ArgsRest],
  112	VarSpecs = [[Var,Type]|VarSpecsRest],
  113	view([isa,isa(Arg,Type)]),
  114	checkTypes(ArgsRest,VarSpecsRest).
  115checkTypes([],[]).
  116
  117propagateEffects([Step,Time,Point,Action,Items],DurativeAction,Sorted,World0,World1) :-
  119	
  120	
  121	
  122	true
  122.
  123
  141getInit(problem(A,B,C,D,E,F),Init) :-
  142	findall(Assertion,init(problem(A,B,C,D,E,F),Assertion),Assertions),
  143	findall(Assertion,
  144		(   
  145		    member(Item,Assertions),
  146		    not(
  147			(   
  148			    (	
  149				Item = at(NumberOrFloat,Fluent),
  150				NumberOrFloat \= 0,
  151				(   
  152				    float(NumberOrFloat) ;
  153				    number(NumberOrFloat)
  154				)
  155			    ) ;
  156			    (	
  157				Item = set(Function,Value)
  158			    )
  159			)
  160		       ),
  161		    (	Item = at(0,Tmp) ->  (Assertion = Tmp) ; (Assertion = Item))
  162		),
  163		Init)