Prolog
Uso de estructuras: programas ejemplo
David Gelpi Fleta
[ correo ]
Laboratorio de Introduccin a los Sistemas Informticos Inteligentes Escuela Superior de Ingeniera Informtica - Universidad Vigo
Nota: Expos icin bas ada en el captulo 4 del libro Prolog: Programming for Articial Intelligence de Ivan Bratko - Ed. Pears on - contenido en la bibliografa recomendada de la as ignatura.
Prolog - ISII 05/06
2
Contenido
Bases de datos como ejemplo de informacin estructurada. Abstraccin de datos. Selectores Problema del viajante de comercio.
Prolog - ISII 05/06
3
Una base de datos en Prolog
familia
persona
persona
roberto
perez
fecha
trabaja
ana
perez
fecha
trabaja
.
persona
15
abril 1974
xunta
1700
marzo 1971 pasteleria 1500 [ ]
BBDD = conjunto de clusulas familia
familia( persona(roberto, perez, fecha(15, abril, 1974), trabaja(xunta,1700) ), persona(ana, perez, fecha(1, marzo, 1971), trabaja(pasteleria,1500) ), [ persona(eva, perez, fecha(21, julio, 2005), paro) ]).
eva
perez
fecha
paro
21
julio 2004
familia( estructura(, estructura(), ), estructura (), lista[ ] ).
Prolog - ISII 05/06
4
Prolog como lenguaje de consultas de BBDD
Prolog permite referirnos a un objeto sin especicar sus componentes individuales: indicamos slo la estructura.
Ejemplos: ?- familia( persona(_, porto,_,_),_,_) devuelve todas las familias de apellido porto ?- familia(_,_, [_,_,_ ]) devuelve todas las familias con tres hijos ?- familia(_, persona(Nombre, Apellido,_,_), [_,_,_ ]) devuelve el nombre y el apellido de todas las mujeres casadas que posean tres hijos.
As, podemos denir varios procedimientos para trabajar con las estructuras contenidas en la BBDD familia:
marido(X):- familia(X, _, _). esposa(X):- familia(_,X,_). hijo(X):- familia(_,_,Hijos), member(X,Hijos). existe(Persona):- marido(Persona) ; esposa(Persona) ; hijo(Persona). **cumpleaos(persona(_,_,Fecha,_),Fecha).
Prolog - ISII 05/06
5
Abstraccin de datos
Trataremos de organizar varias piezas de informacin en unidades naturales a ser posible de manera jerrquica. La informacin as conceptualmente. estructurada debe poseer signicado
Cada unidad de informacin debera ser fcilmente accesible en el programa. Los detalles de la implementacin de la estructura sern invisibles para el usuario de la estructura. El programador piensa en objetos y relaciones entre ellos, no en cmo est representada la informacin. Cmo se lleva a cabo esto en Prolog?:
Ejemplo BBDD familia: cada familia es una coleccin de piezas de informacin estas piezas se dividen en unidades naturales como persona o familia pueden ser tratadas como objetos simples
Prolog - ISII 05/06
6
Selectores
Un selector es una relacin que permite acceder a objetos sin conocer los detalles sobre cmo est representada la informacin. En nuestra BBDD familia permitir acceder a componentes particulares de una familia sin conocer los detalles de la gura de la transparencia 4. Selector:
selector( Objeto, Seleccin)
s elector es la relacin selector Objeto es el objeto que contiene a S eleccin ,el componente seleccionado. El nombre del s elector ser el mismo que el del Componente s eleccionado
Ejemplo: esposa( familia(_,Esposa,_), Esposa). hijos( familia(_,_,ListaHijos), ListaHijos).
Prolog - ISII 05/06
7
Mejoras en la implementacin de programas
Podemos escribir un programa mediante el conjunto de hechos que representan la informacin (bbdd) ms los selectores que permitan acceder a la informacin. El uso de selectores en un programa permite abstraernos de cmo est representada la informacin estructurada. Para manipular la informacin es suciente con conocer las relaciones denidas por los selectores. Los programas que emplean selectores resultan ms fciles de modicar: al variar la representacin de la informacin (base de conocimiento) no es necesario modicar la manera de acceder a ella (selectores). Variar la representacin de la informacin puede mejorar la eciencia del programa.
Programa hechos
(representacin)
+
Selectores
(acceso)
Prolog - ISII 05/06
8
Problema del viajante de comercio (TSP)
Este programa se emplea para planicar viajes en avin. Contesta a cuestiones como:
Qu das de la semana existe vuelo directo por la tarde entre dos determinadas ciudades? Cmo puedo viajar entre dos ciudades el martes? Si quiero visitar tres ciudades en determinado orden, empezando el martes y retornando el viernes, qu ruta debo seguir si slo dispongo de un vuelo al da? BBDD = conjunto de clusulas horario que contienen la informacin sobre los vuelos. Selectores: cmo consultar la informacin. Denir la BBDD con los horarios de los vuelos. Establecer qu consultas (selectores) extraen la informacin de la BBDD.
Programa = BBDD + Selectores.
Pasos en la implementacin del problema:
1. 2.
Prolog - ISII 05/06
9
TSP: BBDD
Denir la BBDD con los horarios de los vuelos: representacin de la informacin. horario(Lugar1, Lugar2, ListaVuelos).
Programa BBDD
(representacin)
ListaVuelos = [ Vuelo1, Vuelo2, , Vuelon] lista de items estructurados, separados por el operador /
LitaVuelos = [HoraSalida/ HoraLlegada/ NumVuelo/ ListaDias, ...]
HoraSalida estructura de dos componentes separados por el operador :
+
Selectores
(acceso)
HoraSalida = 9:40
ListaDias lista de das o el tomo todos
ListaDias = [lu, ma, mi, ju, vi, sa ]
Clusula horario:
horario( edimburgo, [9:40 / 10:50 / 13:40 / 14:50 / 19:40 / 20:50 / ]).
Prolog - ISII 05/06
londres, ba4733 / todos, % Vuelo1 ba4773 / todos, % Vuelo2 ba4833 / [lu,ma,mi,ju,vi,sa]
10
TSP: selectores
Denir los selectores del programa: cmo acceder a la informacin El principal problema es encontrar rutas entre dos ciudades dadas en un determinado da de las semana. selector( Objeto, Seleccin) ruta( Lugar1, Lugar2, Dia, Ruta) Una ruta (selector, relacin) es una secuencia de vuelos que satisfacen los siguientes criterios:
El origen de la ruta es Lugar1 El destino de la ruta es Lugar2 Todos los vuelos se encuentran en el mismo da de la semana, Da. Todos los vuelos en Ruta estn en la relacin horario. Existe suciente tiempo para realizar el trasbordo entre dos vuelos si la ruta consta de varios vuelos.
Programa hechos
(representacin)
+
Selectores
(acceso)
Objeto Ruta: lista de objetos estructurados separados por el operador / Ruta = [De/ Hacia/ NumVuelo/ HoraSalida ]
Prolog - ISII 05/06
11
TSP: selectores
La relacin ruta entre dos ciudades consta de dos reglas:
si existe vuelo directo:
ruta( Lugar1, Lugar2, Dia, [Lugar1/ Lugar2/ NumVuelo/ HoraSalida ]) :vuelo(Lugar1, Lugar2, Dia, NumVuelo, HoraSalida, HoraLlegada).
si existe vuelo indirecto entre las ciudades:
ruta( Lugar1, Lugar2, Dia, [Lugar1/ Lugar3/ NumVuelo/ HoraSalida| RestoRuta ]) :ruta(Lugar3, Lugar2, Dia, RestoRuta), vuelo(Lugar1, Lugar2, Dia, NumVuelo1, HoraSalida1, HoraLlegada1), salida(RestoRuta, HoraSalida2), trasbordo(HoraLlegada1, HoraSalida2).
Ahora debemos denir las relaciones que componen el selector ruta.
Prolog - ISII 05/06
12
TSP: resto de relaciones
% Selector ruta y relaciones vuelo( Lugar1, Lugar2, Dia, NumVuelo, HoraSalida, HoraLlegada):horario( Lugar1, Lugar2, ListaVuelos), member(HoraSalida/ HoraLlegada/ NumVuelo/ ListaDias, ListaVuelos), diaVuelo( Dia, ListaDias). diaVuelo( Dia, ListaDias):member( Dia, ListaDias). diaVuelo( Dia, todos):member(Dia,[lu,ma,mi,ju,vi,sa]). horaSalida( [P1/ P2/ NumVuelo/ Salida | _ ], Salida). trasbordo( Horas1:Minutos1, Horas2:Minutos2):60 * (Horas2 - Horas1) + Minutos2 - Minutos1 >= 40. member( X, [X | L ] ). member( X, [Y | L ] ):member( X, L).
Prolog - ISII 05/06
13
TSP: BBDD
% Base de datos con los vuelos
timetable( edinburgh, london, [9:40 / 10:50 / ba4733 / alldays, 13:40 / 14:50 / ba4773 / alldays, 19:40 / 20:50 / ba4833 / [mo,tu,we,th,fr,su] ] ). timetable( london, edinburgh, [9:40 / 10:50 / ba4732 / alldays, 11:40 / 12:50 / ba4752 / alldays, 18:40 / 19:50 / ba4822 / [mo,tu,we,th,fr] ] ). timetable( london, ljubljana, [ 13:20 / 16:20 / jp212 / [mo,tu,we,fr,su], 16:30 / 19:30 / ba473 / [mo,we,th,sa] ] ). timetable( london, zurich, [ 9:10 / 11:45 / ba614 / alldays, 14:45 / 17:20 / sr805 / alldays ] ). timetable( london, milan, [ 8:30 / 11:20 / ba510 / alldays, 11:00 / 13:50 / az459 / alldays ] ). timetable( ljubljana, zurich, [ 11:30 / 12:40 / jp322 / [tu,th] ] ). timetable( ljubljana, london, [ 11:10 / 12:20 / jp211 / [mo,tu,we,fr,su], 20:30 / 21:30 / ba472 / [mo,we,th,sa] ] ). timetable( milan, london, [ 9:10 / 10:00 / az458 / alldays, 12:20 / 13:10 / ba511 / alldays ] ). timetable( milan, zurich, [ 9:25 / 10:15 / sr621 / alldays, 12:45 / 13:35 / sr623 / alldays ] ). timetable( zurich, ljubljana, [ 13:30 / 14:40 / jp323 / [tu,th] ] ). Prolog - ISII 05/06
14
TSP: cuestiones
Qu das de la semana hay vuelo directo por la tarde de Ljubliana a Londres?:
?- vuelo( ljuljana, london, Dia, _, HoraSalida: _, _), HoraSalida >= 18. Dia = lu; Dia = mi; ...
Cmo puedo viajar de Ljubljana a Edimburgo en martes?:
?- ruta(ljubljana, edimburgo, ma, Ruta). Ruta= [ljubljana/ zurich/ jp322/ 11:30, zurich/ londres/ sr806/ 16:10, londres/ edimburgo/ ba4822/ 18:40 ]
Prolog - ISII 05/06
15