% Data for the World Database.
% ---------------------------


% Interface.
% ---------

:-public
african/1,
american/1,
area/1,        area/2,
asian/1,
borders/2,
capital/1,     capital/2,
circle_of_latitude/1,
city/1,
continent/1,
country/1,
drains/2,
eastof/2,
european/1,
exceeds/2,
flows/2,
flows/3,
in/2,
latitude/1,    latitude/2,
longitude/1,   longitude/2,
northof/2,
ocean/1,
place/1,
person/1,
population/1,  population/2,
region/1,
rises/2,
river/1,
sea/1,
seamass/1,
southof/2,
westof/2.

:-op(500,xfy,--).

exceeds(X--U,Y--U) :- !, X > Y.
exceeds(X1--U1,X2--U2) :- ratio(U1,U2,M1,M2),
  P1 is X1*M1, P2 is X2*M2, P1 > P2.

ratio(thousand,million,1,1000).
ratio(million,thousand,1000,1).
ratio(ksqmiles,sqmiles,1000,1).
ratio(sqmiles,ksqmiles,1,1000).

area(X--ksqmiles).
capital(C) :- capital(X,C).
city(C) :- city(C,_,_).
country(C) :- country(C,_,_,_,_,_,_,_,_,_).
latitude(X--degrees).
longitude(X--degrees).
place(X) :- continent(X); region(X); seamass(X); country(X).
population(X--million).
population(X--thousand).
region(R) :- in_continent(R,_).

african(X) :- in(X,africa).
american(X) :- in(X,america).
asian(X) :- in(X,asia).
european(X) :- in(X,europe).

in(X,Y) :- var(X), nonvar(Y), !, contains(Y,X).
in(X,Y) :- in0(X,W), ( W=Y ; in(W,Y) ).

in0(X,Y) :- in_continent(X,Y).
in0(X,Y) :- city(X,Y,_).
in0(X,Y) :- country(X,Y,_,_,_,_,_,_,_,_).
in0(X,Y) :- flows(X,Y).

eastof(X1,X2) :- longitude(X1,L1), longitude(X2,L2), exceeds(L2,L1).
northof(X1,X2) :- latitude(X1,L1), latitude(X2,L2), exceeds(L1,L2).
southof(X1,X2) :- latitude(X1,L1), latitude(X2,L2), exceeds(L2,L1).
westof(X1,X2) :- longitude(X1,L1), longitude(X2,L2), exceeds(L1,L2).

circle_of_latitude(equator).
circle_of_latitude(tropic_of_cancer).
circle_of_latitude(tropic_of_capricorn).
circle_of_latitude(arctic_circle).
circle_of_latitude(antarctic_circle).

latitude(equator,0--degrees).
latitude(tropic_of_cancer,23--degrees).
latitude(tropic_of_capricorn,-23--degrees).
latitude(arctic_circle,67--degrees).
latitude(antarctic_circle,-67--degrees).

latitude(C,L--degrees) :- country(C,_,L,_,_,_,_,_,_,_).
longitude(C,L--degrees) :- country(C,_,_,L,_,_,_,_,_,_).
area(C,A--ksqmiles) :- country(C,_,_,_,A,_,_,_,_,_).
population(C,P--thousand) :- city(C,_,P).
population(C,P--million) :- country(C,_,_,_,_,_,P,_,_,_).
capital(C,Cap) :- country(C,_,_,_,_,_,_,_,Cap,_).

continent(africa).
continent(america).
continent(antarctica).
continent(asia).
continent(australasia).
continent(europe).

in_continent(scandinavia, europe).
in_continent(western_europe, europe).
in_continent(eastern_europe, europe).
in_continent(southern_europe, europe).
in_continent(north_america, america).
in_continent(central_america, america).
in_continent(caribbean, america).
in_continent(south_america, america).
in_continent(north_africa, africa).
in_continent(west_africa, africa).
in_continent(central_africa, africa).
in_continent(east_africa, africa).
in_continent(southern_africa, africa).
in_continent(middle_east,  asia).
in_continent(indian_subcontinent, asia).
in_continent(southeast_east, asia).
in_continent(far_east, asia).
in_continent(northern_asia, asia).

seamass(X) :- ocean(X).
seamass(X) :- sea(X).

ocean(arctic_ocean).
ocean(atlantic).
ocean(indian_ocean).
ocean(pacific).
ocean(southern_ocean).

sea(baltic).
sea(black_sea).
sea(caspian).
sea(mediterranean).
sea(persian_gulf).
sea(red_sea).

river(R) :- river(R,L).

rises(R,C) :- river(R,L), last(L,C).

drains(R,S) :- river(R,L), first(L,S).

flows(R,C) :- flows(R,C,_).

flows(R,C1,C2) :- river(R,L), links(L,C2,C1).

first([X|_],X).

last([X],X).
last([_|L],X) :- last(L,X).

links([X1,X2|_],X1,X2).
links([_|L],X1,X2) :- links(L,X1,X2).
