paises.pl forzar las carga de los predicados del Cia Fact Book
y construir unos predicados ''adaptadores'' para extraer a partir de los hechos originales (predicados bgfact/3)
unos nuevos predicados más manejables.
:- ensure_loaded('cia-worldfactbook-data.pl').
landBounderies(Pais, Valores) :- bgfact(Pais,'LandBounderies',Valores).
naturalResources(Pais, Valores) :- bgfact(Pais,'NaturalResources',Valores).
...
agriculture(Pais, Valores) :- bgfact(Pais,'Agriculture',Valores).
afinidad_politica(Pais1, Pais2, Afinidad)
que cuantifique la ''afinidad'' entre dos países en base a su pertenencia a organizaciones internacionales.
Da valores cercanos a 1 para conjuntos similares y cercanos a 0 para conjuntos diferentes.
Otra media similar sería el coeficiente Dice [wikipedia]
lists de SWI-prolog [manual]
que incluye los predicados intersection(+Set1, +Set2, -Set3), union(+Set1, +Set2, -Set3) y length(List, Length).
:- ensure_loaded('cia-worldfactbook-data.pl').
landBounderies(Pais, Valores) :- bgfact(Pais,'LandBounderies',Valores).
naturalResources(Pais, Valores) :- bgfact(Pais,'NaturalResources',Valores).
...
agriculture(Pais, Valores) :- bgfact(Pais,'Agriculture',Valores).
library(lists).
coeficiente_jaccard(Lista1, Lista2, Valor) :-
intersection(Lista1, Lista2, Interseccion),
length(Interseccion, A),
union(Lista1, Lista2, Union),
length(Union, B),
Valor is float(A) / float(B).
afinidad_politica(Pais1, Pais2, Afinidad) :-
memberOf(Pais1, Organizaciones1),
memberOf(Pais2, Organizaciones2),
coeficiente_jaccard(Organizaciones1, Organizaciones2, Afinidad).
Desde el promt de swi-prolog se puede comprobar la ''similaridad'' entre pares de paises.
?- consult('paises.pl').
?- afinidad_politica('Spain', 'France', X).
?- afinidad_politica('Sudan', 'France', X).
?- afinidad_politica('Germany', 'France', X).
Por ejemplo: ''similaridad'' basada en
NaturalResources] (con un peso de 0.40)
Agriculture] (con un peso de 0.30)
Industries] (con un peso de 0.3)
LandBoundaries para definir un predicado vecino(Pais1, Pais2)
...
vecino(Pais1, Pais2) :- landBounderies(Pais1, Vecinos),
member(Pais2, Vecinos).
y usar ese predicado para encontrar ''rutas'' entre paises o para encontrar la lista de paises que están a menos de K saltos de uno dado.
ExportCommodities para identificar paises que son competidores comerciales de uno dado
combinarlo con la lista/predicado ImportCommodities para identificar posibles paises que podría aliarse comercialmente y complementar
sus exportaciones.