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) ) ) ),
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)