% query
%
% David H. D. Warren
%
% query population and area database to find countries
% of approximately equal population density
#ifndef MERCURY
#include "harness.cpp"
benchmark(_Data, Out) :-
query(Out).
data(_).
#else
:- module query.
:- interface.
:- import_module list, int, io.
:- type quad ---> quad(string, int, string, int).
:- pred benchmark(quad).
:- mode benchmark(out) is nondet.
:- pred main(io__state, io__state).
:- mode main(di, uo) is multidet.
:- implementation.
benchmark(Out) :-
query(Out).
main -->
( { benchmark(Out) } ->
{ Out = quad(C1, D1, C2, D2) },
io__write_string("quad(\""),
io__write_string(C1),
io__write_string("\", "),
io__write_int(D1),
io__write_string(", \""),
io__write_string(C2),
io__write_string("\", "),
io__write_int(D2),
io__write_string(")\n")
;
io__write_string("no solution\n")
).
:- pred query(quad).
:- mode query(out) is nondet.
:- pred density(string, int).
:- mode density(out, out) is nondet.
:- pred pop(string, int).
:- mode pop(in, out) is semidet.
:- mode pop(out, out) is multidet.
:- pred area(string, int).
:- mode area(in, out) is semidet.
:- mode area(out, out) is multidet.
#endif
#ifdef AQUARIUS_DECLS
:- mode((area(C, A) :-
ground(C),
deref(C)
)).
#endif
query(quad(C1, D1, C2, D2)) :-
density(C1, D1),
density(C2, D2),
D1 > D2,
T1 is 20 * D1,
T2 is 21 * D2,
T1 < T2.
density(C, D) :-
pop(C, P),
area(C, A),
D is P * 100 // A.
% populations in 100000s
pop("china", 8250).
pop("india", 5863).
pop("ussr", 2521).
pop("usa", 2119).
pop("indonesia", 1276).
pop("japan", 1097).
pop("brazil", 1042).
pop("bangladesh", 750).
pop("pakistan", 682).
pop("w_germany", 620).
pop("nigeria", 613).
pop("mexico", 581).
pop("uk", 559).
pop("italy", 554).
pop("france", 525).
pop("philippines", 415).
pop("thailand", 410).
pop("turkey", 383).
pop("egypt", 364).
pop("spain", 352).
pop("poland", 337).
pop("s_korea", 335).
pop("iran", 320).
pop("ethiopia", 272).
pop("argentina", 251).
#ifdef NUPROLOG_DECLS
:- area(C, A) when C.
#endif
#ifdef SICSTUS_DECLS
:- block area(-, ?).
#endif
% areas in 1000s of square miles
area("china", 3380).
area("india", 1139).
area("ussr", 8708).
area("usa", 3609).
area("indonesia", 570).
area("japan", 148).
area("brazil", 3288).
area("bangladesh", 55).
area("pakistan", 311).
area("w_germany", 96).
area("nigeria", 373).
area("mexico", 764).
area("uk", 86).
area("italy", 116).
area("france", 213).
area("philippines", 90).
area("thailand", 200).
area("turkey", 296).
area("egypt", 386).
area("spain", 190).
area("poland", 121).
area("s_korea", 37).
area("iran", 628).
area("ethiopia", 350).
area("argentina", 1080).