4
5
7forget(InitTime) :-
8 input(unordered), !,
9 nextTimePoint(InitTime, NewInitTime),
10 11 findall(E, (happensAtIE(E, T), T=<InitTime, retract(happensAtIE(E, T))), _),
12 13 findall(U, (holdsAtIE(U, T), T=<InitTime, retract(holdsAtIE(U, T))), _),
14 15 findall(E, (holdsForIESI(E, (Start,End)), dealWithInputFluents(E, Start, End, InitTime, NewInitTime)), _).
16
18forget(InitTime) :-
19 nextTimePoint(InitTime, NewInitTime),
20 21 findall(E, dealWithInputEvents(E, InitTime), _),
22 23 findall(U, dealWithInputFluentsT(U, InitTime), _),
24 25 findall(U, dealWithInputFluentsI(U, InitTime, NewInitTime), _).
26
27
29dealWithInputFluents(_E, Start, _End, InitTime, _NewInitTime) :-
30 Start>InitTime, !.
31
33dealWithInputFluents(E, Start, End, InitTime, _NewInitTime) :-
34 End=<InitTime,
35 retract(holdsForIESI(E,(Start,End))), !.
36
38dealWithInputFluents(E, Start, End, _InitTime, NewInitTime) :-
39 retract(holdsForIESI(E,(Start,End))), !,
40 \+ NewInitTime=End,
41 assert(holdsForIESI(E,(NewInitTime,End))).
42
43
45dealWithInputEvents(E, InitTime) :-
46 happensAtIE(E,T),
47 (
48 T>InitTime, !
49 ;
50 retract(happensAtIE(E,T))
51 ).
52
54dealWithInputFluentsT(U, InitTime) :-
55 holdsAtIE(U,T),
56 (
57 T>InitTime, !
58 ;
59 retract(holdsAtIE(U,T))
60 ).
61
62
64dealWithInputFluentsI(U, InitTime, NewInitTime) :-
65 holdsForIESI(U, (Start, End)),
66 (
67 Start>InitTime, !
68 ;
69 End=<InitTime,
70 retract(holdsForIESI(U, (Start, End)))
71 ;
72 End>InitTime,
73 \+ NewInitTime=End,
74 retract(holdsForIESI(U, (Start, End))),
75 assert(holdsForIESI(U, (NewInitTime, End)))
76 ).
77
78
79
87
88inputProcessing(InitTime, QueryTime) :-
89 90 findall(F=V,
91 (
92 93 94 collectIntervals2(Index, F=V),
95 processIECollectI(Index, F=V, InitTime)
96 ), _),
97 98 99 findall(F=V,
100 (
101 102 103 buildFromPoints2(Index, F=V),
104 processIEBuildFP(Index, F=V, InitTime, QueryTime)
105 ), _).
106
107
109
110processIECollectI(Index, F=V, InitTime) :-
111 iePList(Index, F=V, RestrictedList, Extension), !,
112 retract(iePList(Index, F=V, _, _)),
113 amalgamatePeriods(Extension, RestrictedList, ExtendedPList),
114 115 setTheSceneSDFluent(ExtendedPList, InitTime, BrokenPeriod),
116 holdsForIE(collectIntervals, F=V, NewPeriods),
117 updateiePList(Index, F=V, NewPeriods, BrokenPeriod).
118
120processIECollectI(Index, F=V, _InitTime) :-
121 holdsForIE(collectIntervals, F=V, NewPeriods),
122 updateiePList(Index, F=V, NewPeriods, []).
123
124
126
127processIEBuildFP(Index, F=V, InitTime, QueryTime) :-
128 iePList(Index, F=V, RestrictedList, Extension), !,
129 retract(iePList(Index, F=V, _, _)),
130 amalgamatePeriods(Extension, RestrictedList, ExtendedPList),
131 132 setTheSceneSDFluent(ExtendedPList, InitTime, BrokenPeriod),
133 holdsForIE(buildFromPoints, F=V, NewPeriods, QueryTime),
134 updateiePList(Index, F=V, NewPeriods, BrokenPeriod).
135
137processIEBuildFP(Index, F=V, _InitTime, QueryTime) :-
138 holdsForIE(buildFromPoints, F=V, NewPeriods, QueryTime),
139 updateiePList(Index, F=V, NewPeriods, []).
140
141
143
145updateiePList(_Index, _U, [], []) :- !.
146
147updateiePList(Index, F=V, NewPeriods, BrokenPeriod) :-
148 assert(iePList(Index, F=V, NewPeriods, BrokenPeriod)).
149
150
152
154holdsForIE(collectIntervals, IE, L) :-
155 setof(SingleI, holdsForIESI(IE, SingleI), L), !.
156
159holdsForIE(collectIntervals, _IE, []).
160
161
163
164holdsForIE(buildFromPoints, IE, L, QueryTime) :-
165 166 167 setof(T, holdsAtIE(IE, T), PointList), !,
168 169 temporalDistance(TemporalDistance),
170 makeIntervalsFromAllPoints(PointList, TemporalDistance, QueryTime, [], L).
171
172holdsForIE(buildFromPoints, _IE, [], _QueryTime).
173
174
177
178makeIntervalsFromAllPoints([], _TemporalDistance, _QueryTime, L, L) :- !.
179
180makeIntervalsFromAllPoints([Start|Tail], TemporalDistance, QueryTime, Temp, L) :-
181 findEndofInterval([Start|Tail], TemporalDistance, QueryTime, End, Rest),
182 append(Temp, [(Start,End)], NewTemp),
183 makeIntervalsFromAllPoints(Rest, TemporalDistance, QueryTime, NewTemp, L).
184
185
186findEndofInterval([LastTime], _TemporalDistance, LastTime, inf, []) :- !.
187
188findEndofInterval([End], TemporalDistance, _LastTime, NextEnd, []) :-
189 !,
190 191 NextEnd is End+TemporalDistance-(End mod TemporalDistance).
192
193findEndofInterval([P1,P2|Tail], TemporalDistance, LastTime, NextP1, [P2|Tail]) :-
194 Diff is P2-P1,
195 Diff>TemporalDistance, !,
196 197 NextP1 is P1+TemporalDistance-(P1 mod TemporalDistance).
198
199findEndofInterval([P1,P2|Tail], TemporalDistance, LastTime, End, Rest) :-
200 findEndofInterval([P2|Tail], TemporalDistance, LastTime, End, Rest)