3processSimpleFluent(Index, F=V, InitTime, QueryTime) :-
4 isThereASimpleFPList(Index, F=V, ExtendedPList),
5 setTheSceneSimpleFluent(ExtendedPList, F=V, InitTime, StPoint),
6 7 computeStartingPoints(F=V, InitTime, QueryTime, InitList),
8 9 10 11 addPoint(StPoint, InitList, CompleteInitList),
12 13 storeStartingPoints(Index, F=V, CompleteInitList),
14 15 holdsForSimpleFluent(F=V, NewIntervals, InitTime, QueryTime, CompleteInitList),
16 17 computesimpleFPList(NewIntervals, InitTime, RestrictedPeriods, Extension),
18 updatesimpleFPList(Index, F=V, RestrictedPeriods, Extension).
19
20
21isThereASimpleFPList(Index, F=V, ExtendedPList) :-
22 simpleFPList(Index, F=V, RestrictedList, Extension), !,
23 retract(simpleFPList(Index, F=V, _, _)),
24 amalgamatePeriods(Extension, RestrictedList, ExtendedPList).
25
27isThereASimpleFPList(_Index, _U, []).
28
29
30
37
39setTheSceneSimpleFluent(_EPList, F=V, InitTime, StPoint) :-
40 InitTime=<0,
41 (
42 initially(F=V), StPoint=[0]
43 ;
44 StPoint=[]
45 ), !.
46
49setTheSceneSimpleFluent([], _U, _InitTime, []) :- !.
50
52setTheSceneSimpleFluent(EPList, _U, InitTime, StPoint) :-
53 54 InitTimePlus1 is InitTime+1,
55 member((Start,End), EPList),
56 gt(End,InitTimePlus1),
57 StartMinus1 is Start-1,
58 (
59 StartMinus1=<InitTime, StPoint=[Start]
60 ;
61 StPoint=[]
62 ), !.
63
65setTheSceneSimpleFluent(_EPList, _U, _InitTime, []).
66
67
69
70computeStartingPoints(F=V, InitTime, QueryTime, InitList) :-
71 initList(F=V, InitTime, QueryTime, InitList).
72
74
75initList(F=V, InitTime, QueryTime, InitList) :-
76 EndTime is QueryTime+1,
77 setof(T, initPoint(F=V, InitTime, EndTime, T), InitList), !.
78
80
81initList(_, _, _, []).
82
83
84initPoint(F=V, InitTime, EndTime, NextTs) :-
85 initiatedAt(F=V, InitTime, Ts, EndTime),
86 nextTimePoint(Ts, NextTs).
87
88
90
91computeEndingPoints(F=V, InitTime, QueryTime, TerminList) :-
92 terminList(F=V, InitTime, QueryTime, TerminList).
93
94
96
97terminList(F=V, InitTime, QueryTime, TerminList) :-
98 EndTime is QueryTime+1,
99 setof(T, termPoint(F=V, InitTime, EndTime, T), TerminList), !.
100
102
103terminList(_, _, _, []).
104
105
106termPoint(F=V, InitTime, EndTime, NextTs) :-
107 broken(F=V, InitTime, Ts, EndTime),
108 nextTimePoint(Ts, NextTs).
109
110
113
114broken(U, Ts, Tf, T) :-
115 terminatedAt(U, Ts, Tf, T).
116
117broken(F=V1, Ts, Tstar, T) :-
118 broken_v2(F=V1, Ts, Tstar, T).
119
120broken(F=V1, Ts, Tstar, T) :-
121 rtec_v2, !,
122 broken_v2(F=V1, Ts, Tstar, T).
123
125broken(F=V1, Ts, Tstar, T) :-
126 initiatedAt(F=V2, Ts, Tstar, T),
127 (strong_initiates ; V1 \= V2).
128
130broken_v2(F=V1, Ts, Tstar, T) :-
131 simpleFluent(F=V2), \+V2=V1,
132 initiatedAt(F=V2, Ts, Tstar, T).
133 134
136strong_initiates :- fail.
140
141addPoint([], L, L) :- !.
142addPoint([P], L, [P|L]).
143
145
146storeStartingPoints(_, _, []) :- !.
147storeStartingPoints(Index, F=V, SPoints) :-
148 maxDurationUE(F=V, _, _),
149 retract(startingPoints(Index, F=V, _)), !,
150 assert(startingPoints(Index, F=V, SPoints)).
151storeStartingPoints(Index, F=V, SPoints) :-
152 maxDurationUE(F=V, _, _), !,
153 assert(startingPoints(Index, F=V, SPoints)).
154storeStartingPoints(Index, F=V, SPoints) :-
155 cyclic(F=V),
156 retract(startingPoints(Index, F=V, _)), !,
157 assert(startingPoints(Index, F=V, SPoints)).
158storeStartingPoints(Index, F=V, SPoints) :-
159 cyclic(F=V), !,
160 assert(startingPoints(Index, F=V, SPoints)).
161storeStartingPoints(_, _, _).
162
163
164
166
167holdsForSimpleFluent(_U, [], _InitTime, _QueryTime, []) :- !.
168
169holdsForSimpleFluent(U, PeriodList, InitTime, QueryTime, InitList) :-
170 171 computeEndingPoints(U, InitTime, QueryTime, TerminList),
172 makeIntervalsFromSEPoints(InitList, TerminList, PeriodList).
173
174
176
177makeIntervalsFromSEPoints(ListofStartingPoints, ListofEndingPoints, MaximalIntervals):-
178 rtec_v2, !, makeIntervalsFromSEPoints_v2(ListofStartingPoints, ListofEndingPoints, MaximalIntervals).
179
180makeIntervalsFromSEPoints(ListofStartingPoints, ListofEndingPoints, MaximalIntervals):-
181 makeIntervalsFromSEPoints_v1(ListofStartingPoints, ListofEndingPoints, MaximalIntervals).
182
185
186
189makeIntervalsFromSEPoints_v1([Ts], EPoints, Period) :-
190 member(Tf, EPoints),
191 Ts=<Tf,
192 (
193 Ts=Tf, !,
194 Period=[]
195 ;
196 197 !, Period=[(Ts,Tf)]
198 ).
199makeIntervalsFromSEPoints_v1([Ts], _EPoints, [(Ts,inf)]) :- !.
200
202makeIntervalsFromSEPoints([T|MoreTs], [T|MoreTf], Periods) :-
203 !, makeIntervalsFromSEPoints(MoreTs, MoreTf, Periods).
204
205makeIntervalsFromSEPoints_v1([Ts|MoreTs], [Tf|MoreTf], Periods) :-
206 Tf<Ts, !,
207 makeIntervalsFromSEPoints([Ts|MoreTs], MoreTf, Periods).
208
209makeIntervalsFromSEPoints_v1([Ts,T|MoreTs], [T|MoreTf], [(Ts,T)|MorePeriods]) :-
210 211 212 !, makeIntervalsFromSEPoints([T|MoreTs], [T|MoreTf], MorePeriods).
213
214makeIntervalsFromSEPoints_v1([Ts,Tnext|MoreTs], [Tf|MoreTf], [(Ts,Tf)|MorePeriods]) :-
215 216 Tf<Tnext, !,
217 makeIntervalsFromSEPoints([Tnext|MoreTs], MoreTf, MorePeriods).
218
219makeIntervalsFromSEPoints_v1([Ts,Tnext|MoreTs], [Tf|MoreTf], [(Ts,Tf)|MorePeriods]) :-
220 221 !, makeIntervalsFromSEPoints([Tnext|MoreTs], [Tf|MoreTf], [(Tnext,Tf)|MorePeriods]).
222
223makeIntervalsFromSEPoints_v1([Ts,_Tnext|_MoreTs], _EPoints, [(Ts,inf)]).
224
225
227makeIntervalsFromSEPoints_v2([Ts], EPoints, [Period]) :-
228 member(Tf, EPoints),
229 Ts<Tf, !,
230 Period = (Ts,Tf).
231
232makeIntervalsFromSEPoints_v2([Ts], _EPoints, [Period]) :- !,
233 Period = (Ts,inf). 234
235makeIntervalsFromSEPoints_v2([Ts,Tnext|MoreTs], EPoints, [Period|MorePeriods]) :-
236 member(Tf, EPoints),
237 Ts<Tf,
238 (
239 Tf<Tnext,
240 Period=(Ts,Tf),
241 append( _, [Tf|MoreEPoints], EPoints ), !,
242 makeIntervalsFromSEPoints([Tnext|MoreTs], MoreEPoints, MorePeriods)
243 ;
244 245 246 247 248 Period=(Ts,Tf),
249 MorePeriods=MoreX,
250 append( _, [Tf|MoreEPoints], EPoints ), !,
251 makeIntervalsFromSEPoints([Tnext|MoreTs], [Tf|MoreEPoints], [(Tnext,Tf)|MoreX])
252 ).
253
254makeIntervalsFromSEPoints_v2([Ts,_Tnext|_MoreTs], _EPoints, [(Ts,inf)]).
255
257
258
259computesimpleFPList([], _InitTime, [], []) :- !.
260
261computesimpleFPList([(Start,End)|Tail], InitTime, [(Start,End)|Tail], []) :-
262 Start>InitTime, !.
263
264computesimpleFPList([(Start,End)|Tail], InitTime, [(NewInitTime,End)|Tail], [(Start,NewInitTime)]) :-
265 nextTimePoint(InitTime, NewInitTime),
266 \+ NewInitTime = End, !.
267
268computesimpleFPList([Head|Tail], _InitTime, Tail, [Head]).
269
270
272
273updatesimpleFPList(_Index, _U, [], []) :- !.
274
275updatesimpleFPList(Index, F=V, NewPeriods, BrokenPeriod) :-
276 assert(simpleFPList(Index, F=V, NewPeriods, BrokenPeriod))