Hallar el valor máximo y mínimo una base de conocimiento en PROLOG

publicado por: Anonymous

me dejaron realizar el siguiente programa en PROLOG, pero debido a que soy un poco inexperto en este lenguaje se me ha dificultado realizar la operación de mayor y menor población de cada país, al igual la de mayor territorio, en la cual compara un valor predefinido de una variable pero, pienso que hacerlo así es incorrecto si no que mas bien se necesita ordenar los valores de la base de conocimientos de territorio y muestre el nombre de el país mayor y de ahí el nombre de el país menor, pero en condiciones por separado.

Aquí anexo mi código de antemano mucha gracias por tomarse el tiempo por responder.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PROLOG BASE DE CONOCIMIENTO PAÍSES %
% V 0.1 %
% 01/10/2018 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Planteamiento del problema ---------------------------------------------------------------
%Se tienen en una base de conocimiento los países de América del Norte y América Central.
% de los cuales se quiere conocer:
% 1.- Su Territorio el Mayor Territorio y el menor territorio de todos los países de la
% base de conocimiento.
% 2.- Con que países tienen fronteras los países de la base de conocimiento.
% 3.- El tamaño de la población entre los cuales dar el menor y mayor país con población.
%Base de conocimiento General.
pais(mexico).
pais(estados_unidos).
pais(canada).
pais(belize).
pais(honduras).
pais(guatemala).
pais(nicaragua).
pais(panama).
pais(costa_rica).
pais(el_salvador).
%Colindancias.
vecino(mexico,estados_unidos).
vecino(mexico,belize).
vecino(mexico,guatemala).
vecino(estados_unidos,mexico).
vecino(estados_unidos,canada).
vecino(canada,estados_unidos).
vecino(guatemala,belize).
vecino(guatemala,mexico).
vecino(guatemala,honduras).
vecino(guatemala,el_salvador).
vecino(belize,guatemala).
vecino(belize,mexico).
vecino(honduras,guatemala).
vecino(honduras,el_salvador).
vecino(honduras,nicaragua).
vecino(el_salvador,honduras).
vecino(el_salvador,guatemala).
vecino(nicaragua,honduras).
vecino(nicaragua,costa_rica).
vecino(costa_rica,nicaragua).
vecino(costa_rica,panama).
vecino(panama,costa_rica).
%funcion de fronteras
colindancias(X,Y):-vecino(X,Y).
%Tamaño del Territorio
territorio(mexico,1964375).
territorio(estados_unidos,9147593).
territorio(canada,9984670).
territorio(belize,22966).
territorio(honduras,112492).
territorio(guatemala,108889).
territorio(nicaragua,130373).
territorio(panama,75420).
territorio(costa_rica,51100).
territorio(el_salvador,21041).
%Tamaño de la poblacion.
pob(mexico,120437599).
pob(estados_unidos,320344593).
pob(canada,37067013).
pob(belize,380010).
pob(honduras,9126789).
pob(guatemala,17382396).
pob(nicaragua,6279344).
pob(panama,4158023).
pob(costa_rica,5003000).
pob(el_salvador,7415233).
%Condiciones sobre el menor o mayor territorio.
%al parecer si agrego el el > no me itera el ciclo y no arroja ningún valor
%al igual con el < no funciona
mayorTerr(X):-M = 32034459,territorio(X,M).
menorTerr(X):-L = 22966,territorio(X,L).
%Condiciones de Poblacion.
mayorpob(X):-M=320344593,pob(X,M).
menorpob(X):-L=380010,pob(X,L).

solución

Primero debes definir un predicado que encuentre el mayor elemento de una lista de tuplas, siendo el segundo elemento el que utilizaremos para comparar. El mayor elemento de una lista con un sólo elemento es ese elemento. El mayor elemento de una lista con cabeza H y cola T es el mayor elemento entre H y el máximo elemento de T:

max([X],X).
max([(X1,Y1)|T], (Xm,Ym)) :-
    max(T,(X2,Y2)),
    ( Y1 >= Y2, Xm=X1, Ym=Y1 ;
      Xm=X2, Ym=Y2), !.

Por ejemplo:

?- max([(a,3),(b,1),(c,5)], X).
X = (c,5).

Ahora, para encontrar el país que tiene la mayor población, debes obtener una lista con todos los países junto a sus poblaciones, y buscar el mayor elemento mediante el predicado max/2:

mayorpob(X) :- findall((A,B), pob(A,B), L), max(L, (X,_)).

En este caso, findall/3 busca todos los pares (A,B) que satisfacen el objetivo pob(A,B), y los almacena en la lista L. Puedes definir el resto de predicados de forma análoga.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *