Programación Lógica
GRAFOS EN PROLOG Un Grafo es otra estructura de datos que es ampliamente usada en los algoritmos actuales. En esta clase describiremos una representación de grafos en PROLOG y desarrollaremos algunos programas para operaciones de grafo típicas (coloreado, bsqueda!.
REPRESENTACIÓN "n grafo es usualmente definido como un par (#, (#,E!, donde # es un con$unto de %&rtices y E es un con$unto de arcos o aristas (edges!. 'ay mucas representaciones posibles de grafos en PROLOG, mostraremos dos de ellas.
Representación A mantiene los %&rtices y arcos en dos listas diferentes (con$untos!)
g([Vertice, ...],[e(Vertice1,Vertice2,Valor), ...])
*otar, que &sta representación es apropiada para grafos dirigidos tambi&n como para grafos no dirigidos. En caso de grafos no dirigidos, uno puede agregar cada una de los arcos no dirigidos e(#+,#,'! como dos arcos dirigidos e(#+,#,'!, e(#,#+,'! o, me$or, es posible a$ustar el acceso al procedimiento arco (definido aba$o!.
Representación B est- basada en la idea de %ecindad (adyacencia! y el grafo es representado como
una lista de %&rtices y sus %ecinos.
[Vertice-[Vertice2-Valor, ...], ...]
En este caso, la representación representación de grafos grafos no dirigidos dirigidos contiene contiene cada uno de los arcos dos %eces.
Procedimiento para acceder a los arcos en la representación . arco(g(Es,Vs),V1,V2,Valor) :miembro(e(V1,V2,Valor),Vs).
Docente: Ing. Arturo Díaz Pulido
Programación Lógica
/i el grafo es no dirigido, el procedimiento arco puede ser a$ustado de la siguiente forma) arco(g(Es,Vs),V1,V2,Valor) :miembro(e(V1,V2,Valor),Vs) ; miembro(e(V2,V1,Valor),Vs).
Procedimiento arco para la representación 0. arco(Grafo,V1,V2,Valor) :miembro(V1-NB,Grafo), miembro(V2-Valor,NB).
ora, es posible definir el procedimiento para encontrar la %ecindad de un %&rtice usando el procedimiento arco. veci!a!(Grafo,V,NB) :setof(V1-E,arco(Grafo,V,V1,E),NB).
En caso de la representación 0 es me$or (m-s eficiente! definir la %ecindad directamente. veci!a!(Grafo,V,NB) :- miembro(V1-NB,Grafo).
*otar, que algunos grafos no usan %alores en los arcos mientras otros asignan %alores tambi&n a los %&rtices. En esos casos, los procedimientos de arriba tienen que ser reescritos por consiguiente.
Docente: Ing. Arturo Díaz Pulido
Programación Lógica
BÚSQUEA Otro grupo de algoritmos con relación a grafos son los de bsqueda (sobre el grafo!. En &sta clase presentaremos dos algoritmos) bsqueda simple que encuentra el camino entre dos %&rtices y el algoritmo de 1i$2stra el cual encuentra el camino de distancia mínima desde un %&rtice a todos los %&rtices. El siguiente programa encuentra un camino desde %&rtice a otro %&rtice. El mismo programa puede ser usado para encontrar un camino en grafos dirigidos y no dirigidos dependiendo de la definición del procedimiento arco. *otar, que usamos acumulador para que contenga parte del camino y pre%enir ciclos.
" camio(#Grafo,#$tart,#$to%,-&amio) camio(Grafo,$tart,$to%,&amio) :camio1(Grafo,$tart,$to%,[$tart],&amio).
camio1(Grafo,$to%,$to%,&amio,&amio). camio1(Grafo,$tart,$to%,'ct&amio,&amio) :$tart$to%, arco(Grafo,$tart,*ro+imo), omiembro(*ro+imo,'ct&amio), camio1(Grafo,*ro+imo,$to%,[*ro+imo'ct&amio],&amio).
omiembro(,[]). omiembro(,[/0]) :/, omiembro(,0).
E! a!"orit#o $e i%&stra es bien conocido por encontrar el camino mínimo en grafos con arcos (no negati%os!. quí est- su implementación en PROLOG el cual encuentra la distancia mínima a todos los %&rtices desde un %&rtice dado.
" mi!ist(#Grafo,#$tart,-iist) mi!ist(Grafo,$tart,iist) :!i34stra(Grafo,[],[$tart-5],iist).
Docente: Ing. Arturo Díaz Pulido
Programación Lógica
" !i34stra(#Grafo,#&erra!oVertices,#'biertoVertices,-istacias) !i34stra(,iist,[],iist). !i34stra(Grafo,&erra!o,'bierto,iist) :escogerv('bierto,V-,6est'bierto), veci!a!(Grafo,V,NB), !istacia a V
"
NB
es
7a
lista
!e
v8rtices
a!9acetes
#
!iff(NB,&erra!o,N7evoNB), merge(N7evoNB,6est'bierto,,N7evo'bierto), !i34stra(Grafo,[V-&erra!o],N7evo'bierto,iist).
" escogerv(#'biertoVertices,-Vertice0oE+%a!,-6est'biertoVertices) escogerv([0],iV,6est) :escogermiv(0,,iV,6est).
escogermiv([],iV,iV,[]). escogermiv([0],,iV,[26est]) :V1-1, V-, (1 -< *ro+imo,2 ; *ro+imo,2), escogermiv(0,*ro+imo,iV,6est).
" !iff(#=ista>fVertices,#&erra!o,-=ista>fNo&erra!oVertices) !iff([],,[]). !iff([0],&erra!o,=) :V-, (miembro(V-,&erra!o) -< =N7evo0 ; =[N7evo0]), !iff(0,&erra!o,N7evo0).
" me?clar(#=ista>fVertices,#>l!'biertoVertices,-'ll'biertoVertices) me?clar([],=,,=). me?clar([V1-10],'bierto,,N7evo'bierto) :(remover('bierto,V1-2,6est'bierto) -< V is mi(2,#1)
Docente: Ing. Arturo Díaz Pulido
Programación Lógica
; 6est'bierto'bierto,V is #1), N7evo'bierto[V1-V$7b'bierto], me?clar(0,6est'bierto,,$7b'bierto).
remover([0],,0). remover([0],,[N0]) :, remover(0,,N0).
3omparar el procedimiento remo%er con el procedimiento borrar (parte de coloreado!. 4#es la diferencia5 E6tiende el programa de arriba en una forma que tambi&n encuentre el camino mínimo (no sólo la distancia mínima! a todos los %&rtices.
Docente: Ing. Arturo Díaz Pulido