1:- use_module(library('linda/client'),
2 [ linda_client/1,
3 close_client/0,
4 in/1,
5 6 in_noblock/1,
7 out/1,
8 rd/1,
9 rd/2,
10 rd_noblock/1,
11 bagof_rd_noblock/3,
12 linda_timeout/2,
13 shutdown_server/0]). 14:- use_module(library(system)). 15:- multifile hap/2. 16:- dynamic hap/2. 17
18:- dynamic timestamp/1. 19timestamp(0).
20
21history_dyn(T,Tnew,Closed,Blocking):-
22 hap(Event,Time),
23 Time > T, !,
24 write_debug('Cached event: '), writeln_debug(h(Event,Time)),
25 h(Event,Time),
26 history_dyn(Time,Tnew,Closed,Blocking).
27history_dyn(T,T,Closed,Blocking):-
28 29 get_single_event(Blocking,Closed,_,Event),
30 (Event = h(_,Time)
31 -> history_dyn_directional(Time,_Tnew,Closed,Blocking)
32 ; 33 34 35 true
36 ).
37
39get_new_events(Blocking,Closed):-
40 get_new_events(Blocking,Closed,_).
41get_new_events(Blocking,Closed,Pattern):-
42 copy_term(Pattern,E),
43 in_noblock(h(E,T)),!,
44 assertz(hap(E,T)),
45 write_debug('Received event: '), writeln_debug(h(E,T)),
46 h(E,T),
47
62 get_new_events(Blocking,Closed,Pattern).
63get_new_events(_,Closed,_):-
64 rd_noblock(close_history),!, Closed=closed,
65 close_history.
66get_new_events(blocking,Closed,Pattern):-
67 rd([close_history,h(_,_)],_),
68 get_new_events(blocking,Closed,Pattern).
69get_new_events(nonblocking,_Closed,_).
70
72get_single_event(_Blocking,_Closed,Pattern,h(E,T)):-
73 copy_term(Pattern,E),
74 in_noblock(h(E,T)),!,
75 assertz(hap(E,T)),
76 write_debug('Received event: '), writeln_debug(h(E,T)),
77 h(E,T).
78get_single_event(_,Closed,_,Event):-
79 rd_noblock(close_history),!, Closed=closed, Event=closed,
80 close_history.
81get_single_event(nonblocking,_,_,none).
82
83out_event(Event,Time):-
84 (var(Time)
85 -> compute_time(NewTime), Time=NewTime
86 87 88 ; true),
89 out(h(Event,Time)),
90 write_debug('Output event: '),
91 writeln_debug(h(Event,Time)).
92
93out_event_once(Event,_):- hap(Event1,_), variant(Event,Event1), !.
94out_event_once(Event,Time):-
95 (var(Time)
96 -> compute_time(NewTime), Time=NewTime
97 ; true),
98 out(h(Event,Time)),
99 write_debug('Output event: '),
100 writeln_debug(h(Event,Time)).
101
104run_dyn(Blocking):-
105 load_ics,
106 current_time(0),
107 society_goal,
108 history_dyn(-inf,TLast,Closed,nonblocking),
109 110 111 (nonvar(Closed) 112 -> true;
113 history_dyn(TLast,_,_,Blocking)
114 ).
115
116run_dyn_argument(Blocking):-
117 load_ics,
118 current_time(0),
119 society_goal,
120 history_dyn(-inf,_TLast,_Closed,Blocking), 121 once(abd(finished_reasoning,1)),
122 no_more_messages.
123
124no_more_messages:-
125 rd(_), fail.
126no_more_messages:-
127 rd_noblock(leave_dialogue).
128
135
136run_dyn_argument_directional(Blocking):-
137 load_ics,
138 init_linda_time(IniTime),
139 current_time(IniTime),
140 society_goal,
141 history_dyn_directional(-inf,_TLast,_Closed,Blocking), 142 once(abd(finished_reasoning,1)),
143 144 145 146 147 148 no_more_incoming_messages.
149
150run_dyn_argument_directional_closed(Blocking):-
151 load_ics,
152 init_linda_time(IniTime),
153 current_time(IniTime),
154 society_goal,
155 history_dyn_directional(-inf,_TLast,_Closed,Blocking), 156 close_history,
157 once(abd(finished_reasoning,1)),
158 159 160 161 162 163 no_more_incoming_messages.
164
165
166send_message(Sender,Receiver,Content,Time):-
167 168 out_event_once(tell(Sender,Receiver,Content),Time), 169 170 171 172 (var(Time)
173 -> true
174 ; assertz(hap(tell(Sender,Receiver,Content),Time))).
175
178
179
182history_dyn_directional(T,Tnew,Closed,Blocking):-
183 hap(Event,Time),
184 Time > T, !,
185 write_debug('Cached event: '), writeln_debug(h(Event,Time)),
186 h(Event,Time),
187 history_dyn_directional(Time,Tnew,Closed,Blocking).
188history_dyn_directional(_T,Tnew,Closed,Blocking):-
189 me(ME),
190 get_single_event(Blocking,Closed,tell(_,ME,_),Event),
191 (Event = h(_,Time)
192 -> history_dyn_directional(Time,Tnew,Closed,Blocking)
193 ; 194 195 196 true
197 ).
198
204history_dyn_directional(T,_Tnew,_Closed,_Blocking):-
205 206 \+(( hap(_,Time),
207 Time > T
208 )),
209 210 \+(( me(ME),
211 rd_noblock(h(tell(_,ME,_),_))
212 )),!,
213 214 fail.
216history_dyn_directional(T,Tnew,Closed,Blocking):-
217 history_dyn_directional(T,Tnew,Closed,Blocking).
222
223
227
230no_more_incoming_messages:-
231 me(ME),
232 rd([leave_dialogue,h(tell(_,ME,_),_)],X),
233 (X = leave_dialogue
234 -> true
235 ; fail
236 ).
237
238
241init_linda_time(N):-
242 rd_noblock(linda_time(N)),!.
243init_linda_time(0):-
244 out(linda_time(0)).
245
246compute_time(Time):-
247 in(linda_time(Time)),
248 NewTime is Time+1,
249 out(linda_time(NewTime)).
250
253
254connect:-
255 ['../linda_server/hostname.pl'],
256 hostname(HN),
257 linda_client(HN).