
:-object travel.

	var cities = [].

	cities(C) :-
		cities := C.

	destination(C) :-
		member(C, cities).

:-end_object travel.


:-object agency.

	var cities = [].

	agency(L) :-
		member(O,L),
		format('agency: ~w~n', [O]),
		O <- destination(X),
		add(X),
		fail.
	agency(_) :-
		run(2).

	run(0).
	run(I) :-
		%% accept(destination(_)),
		accept(any),
		N is I - 1,
		run(N).

	destination(C) :-
		member(C, cities).

	add(X) :-
		append([X], cities, R),
		cities := R,
		format('cities: ~w~n', [cities]).

:-end_object agency.


:-object pxgoto.

	main :-
		T1 := new(travel),
		T2 := new(travel),
		T3 := new(travel),

		T1<-cities([atlanta, austin]),
		T2<-cities([berkeley, berlin, boston]),
		T3<-cities([cleveland, copenhagen, chicago]),

		A := new(agency([T1, T2, T3])),
		list_all_cities(A),
		A <- destination(berkeley),
		format('end of main (1)~n').
	main :-
		format('end of main (2)~n').

	list_all_cities(A) :-
		A <- destination(C),
		format('destination ~w~n', [C]),
		fail.
	list_all_cities(_ok_).

:-end_object pxgoto.
