2
8
11
12
13
14:-op(600,xfy,--). 15
16
19
20database(X):- catch(database_u(X),E,(dbug(error(E,database_u(X))),trace,call(X))).
21
22database_u(aggregate(X,Y,Z)) :- aggregate(X,Y,Z).
23database_u(one_of(X,Y)) :- one_of(X,Y).
24database_u(ratio(X,Y,Z)) :- ratio(X,Y,Z).
25database_u(cardinality(X,Y)) :- cardinality(X,Y).
26database_u(african(X)) :- african(X).
27database_u(american(X)) :- american(X).
28database_u(area(X)) :- area(X).
29database_u(area(X,Y)) :- area(X,Y).
30database_u(asian(X)) :- asian(X).
31database_u(borders(X,Y)) :- borders(X,Y).
32database_u(capital(X)) :- capital(X).
33database_u(capital(X,Y)) :- capital(X,Y).
34database_u(circle_of_latitude(X)) :- circle_of_latitude(X).
35database_u(city(X)) :- city(X).
36database_u(continent(X)) :- continent(X).
37database_u(country(X)) :- country(X).
38database_u(drains(X,Y)) :- drains(X,Y).
39database_u(eastof(X,Y)) :- eastof(X,Y).
40database_u(european(X)) :- european(X).
41database_u(exceeds(X,Y)) :- exceeds(X,Y).
42database_u(flows(X,Y)) :- flows(X,Y).
43database_u(flows(X,Y,Z)) :- flows(X,Y,Z).
44database_u(in(X,Y)) :- in(X,Y).
45database_u(latitude(X)) :- latitude(X).
46database_u(latitude(X,Y)) :- latitude(X,Y).
47database_u(longitude(X)) :- longitude(X).
48database_u(longitude(X,Y)) :- longitude(X,Y).
49database_u(northof(X,Y)) :- northof(X,Y).
50database_u(ocean(X)) :- ocean(X).
51database_u(place(X)) :- place(X).
53database_u(population(X)) :- population(X).
54database_u(population(X,Y)) :- population(X,Y).
55database_u(region(X)) :- region(X).
56database_u(rises(X,Y)) :- rises(X,Y).
57database_u(river(X)) :- river(X).
58database_u(sea(X)) :- sea(X).
59database_u(seamass(X)) :- seamass(X).
60database_u(southof(X,Y)) :- southof(X,Y).
61database_u(westof(X,Y)) :- westof(X,Y).
62
63:-op(500,xfy,--). 64
66exceeds(X--_,Y--_):- (var(X);var(Y)),!,fail.
67exceeds(X--U1,Y--U2) :- U1=U2, !, X > Y.
68exceeds(X1--U1,X2--U2) :- ratio(U1,U2,M1,M2), X1*M1 > X2*M2.
69
70ratio(thousand,million,1,1000).
71ratio(million,thousand,1000,1).
72ratio(ksqmiles,sqmiles,1000,1).
73ratio(sqmiles,ksqmiles,1,1000).
74
75area(_X--ksqmiles).
76capital(C) :- capital(_X,C).
77city(C) :- city(C,_,_).
78country(C) :- country(C,_, _,_,_, _,_,_, _,_).
79latitude(_X--degrees).
80longitude(_X--degrees).
81place(X) :- continent(X); region(X); seamass(X); country(X).
82population(_X--million).
83population(_X--thousand).
84region(R) :- in_continent(R,_).
85
86african(X) :- in(X,africa).
87american(X) :- in(X,america).
88asian(X) :- in(X,asia).
89european(X) :- in(X,europe).
90
91in(X,Y) :- var(X), nonvar(Y), !, contains(Y,X).
92in(X,Y) :- in0(X,W), ( W=Y ; in(W,Y) ).
93
94in0(X,Y) :- in_continent(X,Y).
95in0(X,Y) :- city(X,Y,_).
96in0(X,Y) :- country(X,Y,_,_,_, _,_,_, _,_).
97in0(X,Y) :- flows(X,Y).
98
99eastof(X1,X2) :- longitude(X1,L1), longitude(X2,L2), exceeds(L2,L1).
100northof(X1,X2) :- latitude(X1,L1), latitude(X2,L2), exceeds(L1,L2).
101southof(X1,X2) :- latitude(X1,L1), latitude(X2,L2), exceeds(L2,L1).
102westof(X1,X2) :- longitude(X1,L1), longitude(X2,L2), exceeds(L1,L2).
103
104circle_of_latitude(equator).
105circle_of_latitude(tropic_of_cancer).
106circle_of_latitude(tropic_of_capricorn).
107circle_of_latitude(arctic_circle).
108circle_of_latitude(antarctic_circle).
109
110latitude(equator,0--degrees).
111latitude(tropic_of_cancer,23--degrees).
112latitude(tropic_of_capricorn,-23--degrees).
113latitude(arctic_circle,67--degrees).
114latitude(antarctic_circle,-67--degrees).
115
116latitude(C,L--degrees) :- country(C,_,L,_,_,_,_,_,_,_).
117longitude(C,L--degrees) :- country(C,_,_,L,_,_,_,_,_,_).
118area(C,A--ksqmiles) :- country(C,_,_,_,A,_,_,_,_,_).
119population(C,P--thousand) :- city(C,_,P).
120population(C,P--million) :- country(C,_,_,_,_,_,P,_,_,_).
121capital(C,Cap) :- country(C,_,_,_,_,_,_,_,Cap,_).
122
123continent(africa).
124continent(america).
125continent(antarctica).
126continent(asia).
127continent(australasia).
128continent(europe).
129
130in_continent(scandinavia, europe).
131in_continent(western_europe, europe).
132in_continent(eastern_europe, europe).
133in_continent(southern_europe, europe).
134in_continent(north_america, america).
135in_continent(central_america, america).
136in_continent(caribbean, america).
137in_continent(south_america, america).
138in_continent(north_africa, africa).
139in_continent(west_africa, africa).
140in_continent(central_africa, africa).
141in_continent(east_africa, africa).
142in_continent(southern_africa, africa).
143in_continent(middle_east, asia).
144in_continent(indian_subcontinent, asia).
145in_continent(southeast_east, asia).
146in_continent(far_east, asia).
147in_continent(northern_asia, asia).
148
149seamass(X) :- ocean(X).
150seamass(X) :- sea(X).
151
152ocean(arctic_ocean).
153ocean(atlantic).
154ocean(indian_ocean).
155ocean(pacific).
156ocean(southern_ocean).
157
158sea(baltic).
159sea(black_sea).
160sea(caspian).
161sea(mediterranean).
162sea(persian_gulf).
163sea(red_sea).
164
165river(R) :- river(R,_L).
166
167rises(R,C) :- river(R,L), last(L,C).
168
169drains(R,S) :- river(R,L), first(L,S).
170
171flows(R,C) :- flows(R,C,_).
172
173flows(R,C1,C2) :- river(R,L), links(L,C2,C1).
174
175first([X|_],X).
176
179
180links([X1,X2|_],X1,X2).
181links([_|L],X1,X2) :- links(L,X1,X2)