Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ingeniería Informática
Ingeniería Técnica en Informática
Departamento de Lenguajes y
Ciencias de la Computación
Universidad de Málaga
Contenido
1. Grafos
2. Espacios de estados
A⊆ N × N
∀ x, y. (x, y) ∈ A ⇒ (y, x) ∈ A
a b
c
Las representaciones más comunes son:
listas de adyacencia
matriz de adyacencia
% arco(+ident,?nodo,?nodo)
arco(g1,a,b). arco(a92,malaga,sevilla).
arco(g1,b,c). arco(a92,malaga,granada).
arco(g1,c,a). arco(a92,granada,almeria).
es_nodo(Id,X):-arco(Id,X,_).
es_nodo(Id,X):-arco(Id,_,X).
arista(a,b).
arista(b,a). a b
arista(b,c).
arista(c,b).
arista(c,a). c
arista(a,c).
A A A’
A’ = A ∪ { (y,x) / (x,y) ∈ A }
arco(a,b). a b
arco(b,c).
arco(c,a).
c
A’ = A ∪ { (y,x) / (x,y) ∈ A }
arista(X,Y) :- arco(X,Y).
arista(Y,X) :- arco(X,Y).
conectados(X,X) :-
es_nodo(X).
conectados(X,Y) :-
arco(X,Z),
conectados(Z,Y).
:- es_nodo(b). :- arco(b,Z2),conectados(Z2,b).
Z2/c
:- conectados(c,b).
:- arco(c,Z3),conectados(Z3,b).
Z3/a
% conectados(?X,?Y,+Visitados)
conectados(X,X,_) :-
es_nodo(X).
conectados(X,Y,Visitados) :-
arco(X,Z),
no_esta(Z,Visitados),
conectados(Z,Y,[Z|Visitados]).
camino(X,Y,Cs) :-
camino(X,Y,[X],Cs).
% camino(?X,?Y,+Visitados,?Camino)
camino(X,X,Visitados,Cs) :-
inversa(Visitados,Cs).
camino(X,Y,Visitados,Cs) :-
arco(X,Z),
no_esta(Z,Visitados),
camino(Z,Y,[Z|Visitados],Cs).
camino(X,Y,[X|Cs]) :-
camino(X,Y,[X],Cs).
% camino(?X,?Y,+Visitados,?Camino)
camino(X,X,_,[]).
camino(X,Y,Visitados,[Z|Cs]) :-
arco(X,Z),
no_esta(Z,Visitados),
camino(Z,Y,[Z|Visitados],Cs).
A⊆ T × N × N
Un AF es un quíntupla Q,Q
Q Qo,FF,A
A,δδ donde:
Q es un conjunto de estados
Q es un estado inicial (Q
Q ∈ Q)
F es un conjunto de estados finales (F F ⊆ Q)
A es un alfabeto
δ es una función de transición δ:QQ × A → Q
c q2 f
a
b
q0 q1 d
q4
e
c
q3 f
Estado inicial Qo
definimos el procedimiento inicial/1
mediante el único hecho inicial(q0).
Estados finales F
definimos el procedimiento final/1
mediante el hecho final(q4).
% reconoce(+Estado,+Cadena)
reconoce(Q,'$') :-
final(Q).
reconoce(Q,cinta(C,Resto)) :-
delta(Q,C,QN),
reconoce(QN,Resto).
delta(q1,c,q3).
reconoce(Q,'$') :-
delta(q2,d,q2). final(Q).
delta(q2,f,q4).
delta(q3,e,q3). % automata/1
delta(q3,f,q4). automata(Cadena) :-
inicial(Q0),
% inicial/1
reconoce(Q0,Cadena),
inicial(q0). write_ln('cadena aceptada').
% final/1
final(q4).
X X
X X
X X
X X
Grafos y espacios de estados 24
El salto del caballo (II)
Podemos enfocar este problema como un camino hamiltoniano:
los nodos son los escaques del tablero (i,j): 1
i,j N
los arcos son los movimientos del caballo
(i-2,j-1) (i-2,j+1)
(i-1,j+2)
(i-1,j-2)
(i,j)
(i+1,j+2)
(i+1,j-2)
(i+2,j-1) (i+2,j+1)
% es_nodo/1
nodo(1,1). nodo(1,2) ... nodo(1,N).
nodo(2,1). nodo(2,2) ... nodo(2,N).
...
nodo(N,1). nodo(N,2) ... nodo(N,N).
% arco/2
arco((1,1),(2,3)). arco((1,1),(3,2)).
...
¿Cómo podemos representar los nodos y arcos de forma
genérica?
Grafos y espacios de estados 26
El salto del caballo (IV)
arcos: hasta 8 vecinos legales
direccion(-2,+1). direccion(-2,-1).
direccion(+2,+1). direccion(+2,-1).
direccion(-1,+2). direccion(-1,-2).
direccion(+1,+2). direccion(+1,-2).
% arco(+Origen,?Destino,+Tamaño)
arco((X,Y),(NX,NY),N) :-
direccion(Dx,Dy),
NX is X + Dx,
NY is Y + Dy,
NX > 0, NX =< N, % dentro del tablero
NY > 0, NY =< N.
camino(X,Y,[X|Cs]) :-
camino(X,Y,[X],Cs).
% camino(?X,?Y,+Visitados,?Camino)
camino(X,X,_,[]).
camino(X,Y,Visitados,[Z|Cs]) :-
arco(X,Z),
no_esta(Z,Visitados),
camino(Z,Y,[Z|Visitados],Cs).
% salta(?Ei,+N,+Pasos_por_dar,+Visitados,?Camino)
salta(_,_,0,_,[]).
salta((X,Y),N,K,Visitados,[(NX,NY)|Rec]) :-
K > 0,
arco((X,Y),N,(NX,NY)),
no_esta((NX,NY),Visitados),
K1 is K-1,
salta((NX,NY),N,K1,[(NX,NY)|Visitados],Rec).
e b
d c
Grafos y espacios de estados 30
Espacios de estados
Espacios de estados y búsquedas (I)
Formalismo para representar y resolver problemas en IA
Ciclo a
b a c b c
1 2 3 1 2 3
a Solución
b
Estado final
c
Grafos y espacios de estados 1 2 3 33
Espacios de estados y búsquedas (III)
El estado inicial es único
búsqueda en profundidad
búsqueda en anchura
búsqueda por profundización progresiva
búsqueda heurística (por ejemplo, A*)
a
b c
1 2 3
a
b c
1 2 3
1 2 3
resolver(Problema,[Eo|Solucion]) :-
estado_inicial(Problema,Eo),
resolver(Problema,Eo,[Eo],Solucion).
resolver(Problema,En,_,[]) :-
estado_final(Problema,En).
resolver(Problema,Ei,Visitados,[En|Es]) :-
mover(Problema,Ei,En),
no_esta(En,Visitados),
resolver(Problema,En,[En|Visitados],Es).
max_cap_x(5). % MX
max_cap_y(8). % MY
mover((_,Y),(0,Y)). % vaciar X
mover((X,_),(X,0)). % vaciar Y
mover((_,Y),(MX,Y)):- % llenar X
max_cap_x(MX).
mover((X,_),(X,MY)):- % llenar Y
max_cap_y(MY).
% verter X en Y (entero)
mover((X,Y),(0,NY)) :-
max_cap_y(MY),
NY is Y+X,
NY =< MY.
% verter X en Y (parcialmente)
mover((X,Y),(NX,MY)) :-
max_cap_y(MY),
NX is X-(MY-Y),
NX > 0.