Sei sulla pagina 1di 2

Prolog VII – Problema General de Búsqueda en Grafos

En Prolog V planteamos el problema particular de la búsqueda en dígrafos sin circuitos y


presentamos una solución en términos de la forma declarativa recursiva. En esta sección
emplearemos la forma declarativa recursiva para el caso general de búsqueda en grafos
no dirigidos y que puedan contener circuitos. Además, con el auxilio de las listas,
podremos obtener el camino de cada una de las soluciones.

1. Tipificación del Problema. Dados el estado inicial Vi y el estado objetivo Vo, el


problema consiste en encontrar, dentro de su espacio de estados, uno o más caminos
solución entre aquellos.
La primera cuestión es cómo está definido el espacio de estados, tenemos dos
posibilidades:

a. El conjunto de reglas que lo describen se especifican de forma extensiva, es


decir, una regla por cada transición posible entre estados. Entonces, cada regla
se aplica una y sólo una vez. Un ejemplo de este tipo de espacio de estados:
una red de puntos interconectados entre sí.

b. El número de reglas que lo describen es menor que el número de transiciones


posibles entre estados, es decir, una o más reglas se pueden aplicar más de
una vez. En este caso el conjunto de reglas se especifican de forma compacta.
Un ejemplo de este tipo de espacio de estados: el problema de las dos jarras de
agua, que está especificado por sólo 6 reglas.

Estando el espacio de estados asociado a un grafo que contenga circuitos, la forma de


evitarlos durante la búsqueda, dependerá de cómo está definido el espacio de
estados:

a. Forma extensiva: por cada regla que se aplica, para generar un estado sucesor,
eliminar ésta y todas aquellas que generen ese estado sucesor.

b. Forma compacta: en este caso, no podemos eliminar cada regla que se aplica.
Por lo tanto deberemos tener registrados cada uno de los estados generados y
rechazar las reglas que produzcan un nuevo estado que ya se había generado
anteriormente. Por rechazar una regla queremos significar buscar otra en
lugar de ésa.

En esta sección abordaremos el problema de evitación de circuitos según procede la


forma compacta, es decir, por rechazo de regla, para lo cual, deberemos disponer de
una lista con los estados generados. Más adelante, en Prolog IX, veremos cómo se
pueden eliminar reglas, durante la búsqueda, usando predicados dinámicos.

1
2. Forma declarativa recursiva general – Caso del espacio de estados especificado en la
forma extensiva. Sea G el grafo ponderado asociado a ese espacio de estados, definido
por G = {conectado(vi,vj,dij)}. Sean V1 y V2 los estados inicial y objetivo,
respectivamente. Para el caso de búsqueda hacia delante, la implementación es:

% Predicado Auxiliar recursivo


camino(V2,V2,LV2,LV2,SD2,SD2,CV2,CV2). % objetivo de corte

camino(V1,V2,LV1,LV2,SD1,SD2,CV1,CV2):-
(conectado(V1,VX,DX) ; conectado(VX,V1,DX)), % conexión no dirigida
not esMiembro(VX,LV1), % evitar circuitos
agregado(VX,LV1,LVX), % camino actual
SDX is SD1 + DX, % acumulación distancias
CVX is CV1 + 1, % cuenta vértices
camino(VX,V2,LVX,LV2,SDX,SD2,CVX,CV2). % camino restante

%==============================================
% Predicado Principal con búsqueda hacia delante
%=======================================
camino(V1,V2,LV,SD,CV):- camino(V1,V2,[V1],LVX,0,SD,1,CV),
invertida(LVX,LV).
% Predicados Utilitarios:
esMiembro(X,[X|_ ].
esMiembro(X,[_|T):- esMiembro(X,T).

agregado(X,L,[X|L]).

invertida(L1,L2):- invertida(L1,[],L2).

invertida([],L,L).
invertida([H|T],S1,S2):- invertida(T,[H|S1],S2).

Notar que la lista de vértices LVX de un camino solución tendrá orden inverso al orden
recorrido puesto que el predicado agregado(X,L1,L2) agrega en la cabeza, entonces el
primero en ser agregado será finalmente el último cuando se termine de agregar. Por
eso es que tenemos que invertir el orden de los vértices. Si la búsqueda se realiza
desde el estado objetivo V2 hacia el estado inicial V1, es decir, hacia atrás, no habrá
necesidad de invertir la lista LV:

%================================================
% Predicado Principal con búsqueda hacia atrás en el auxiliar
%================================================
camino(V1,V2,LV,SD,CV):- camino(V2,V1,[V2],LV,0,SD,1,V).

Potrebbero piacerti anche