Base de Datos Relacionales y Archivos en Prolog
-
Upload
jason-anderson -
Category
Documents
-
view
211 -
download
7
Transcript of Base de Datos Relacionales y Archivos en Prolog
BASE DE DATOS
MANEJO DE ARCHIVOS EN
ALARCON TAMBO, HARRY JACK
CURSO DE INTELIGENCIA ARTIFICIAL 2012
BASE DE DATOS RELACIONALES
Y
MANEJO DE ARCHIVOS EN
ALARCON TAMBO, HARRY JACK
QUINTO TAZA, CARLOS
CURSO DE INTELIGENCIA ARTIFICIAL 2012-I
FCM - UNMSM
ELACIONALES
MANEJO DE ARCHIVOS EN
PROGRAMACIÓN LÓGICA Y BASES DE DATOS
OBJETIVOS
� Analizar las similitudes entre las bases de datos relacionales y prolog.
� Operadores básicos del álgebra relacional y su codificación.
� Implementar una regla prolog para cada operador algebraico.
FUNDAMENTOS
El algebra relacional está relacionado con:
� La teoría de conjuntos.
CLASIFICACIÓN DE LOS OPERADORES
1. OPERADORES UNARIOS:
Operan sobre una sola relación.
π es el operador de proyección y se denota con la letra P del alfabeto griego.
σ es el operador de selección y se denota con la letra S del alfabeto griego.
SINTAXIS
πXE : Donde E es una expresión algebraica (EA) y x es una lista de atributos.
σθE : Donde θ es una expresión boolena y E es una EA.
¿CÓMO FUNCIONA EL OPERADOR DE PROYECCIÓN?
πXE se lee: la proyección de E sobre X.
Para simplificar supongamos que E es una relación (tabla) r; entonces este operador muestra
solamente las columnas de r que correspondan a los atributos que están en X y oculta todos
los demás.
Ejemplo de proyección:
VEAMOS COMO SE HACE EN PROLOG:
¿CÓMO FUNCIONA EL OPERADOR DE SELECCIÓN?
σθE se lee: la selección de E según θ.
Nuevamente para simplificar supongamos que E es una relación r; entonces este operador
muestra solamente los elementos (filas) de r para las cuales la evaluación de θ sea verdadera.
Ejemplo de selección:
VEAMOS COMO SE HACE EN PROLOG:
2. OPERADORES BINARIOS
Operan sobre dos relaciones.
� X es el operador Producto Cartesiano.
� U es el operador Unión.
� - es el operador Diferencia.
SINTAXIS Y SEMÁNTICA
E1XE2: Da la combinación de cada elemento de E1 con cada uno de los elementos de E2.
E1UE2: Da todos los elementos que pertenecen a E1 y/o a E2.
E1 - E2: Da todos los elementos que pertenecen a E1 y que no pertenecen a E2.
Ejemplo del operador producto cartesiano:
VEAMOS COMO SE HACE EN PROLOG
Ejemplo del operador unión:
VEAMOS COMO SE HACE EN PROLOG
Ejemplo del operador diferencia:
VEAMOS COMO SE HACE EN PROLOG
RESUMEN
OPERADORES UNARIOS
OPERADORES BINARIOS
EQUIVALENCIAS
MANEJO DE ARCHIVOS EN PROLOG
Hasta ahora hemos manejado nuestra base de datos temporalmente en memoria, ahora nos
interesa poder INSERTAR, BORRAR y GUARDAR nuestros hechos en tiempo real en una fuente
externa para poder consultarlos nuevamente.
Veremos algunos comandos útiles para esto:
tell(mi archivo.xxx’)
Usando archivos con tell(‘archivo.xxx’) se abre al archivo ‘archivo.xxx’ y redirige la escritura
hacia él. Sobrescribe la información si el archivo existiese.
told
Se usa junto con tell para cerrar el archivo y guardar.
:- dynamic name/n
dynamic se usa para definir a un predicado como dinámico lo que le dota con la particularidad
de redefinirse en tiempo de ejecución, con name (nombre del predicado) y n (número de
atributos del mismo).
assert(predicado(nuevo_atrib1,nuevo_atrib2,….,nuevo_atribn))
Permite agregar un hecho a nuestro base de datos en tiempo de ejecución, es necesario definir
a nuestro predicado primeramente como dinámico.
retract(predicado(atrib1, atrib2,…., atribn))
Permite borrar un hecho de nuestro base de datos en tiempo de ejecución, es necesario definir
a nuestro predicado primeramente como dinámico.
EJERCICIOS RESUELTOS EN PROLOG
1) BASE DE DATOS RELACIONALES
Dada estas tablas de suministradores-partes:
TABLA DE SUMINISTRADORES (sumin)
Scodigo Snombre Estatus ciudad
s1 Juan 20 Madrid
s2 Pedro 10 Castellón
s3 Raquel 30 Alicante
s4 María 20 valencia
S5 Luis 30 Castellón
TABLA DE SUMINISTROS (partes)
Pcodigo Pnombre Color Peso Ciudad
p1 mesa verde 20 Castellón
p2 silla verde 6 Castellón
p3 armario azul 60 Alicante
p4 sofá amarillo 55 Valencia
p5 cama marrón 20 Madrid
p6 librería roja 70 Castellón
TABLA DE SUMINISTRADORES-PARTES (s_p)
Scodigo Pcodigo Cantidad
s1 p1 300
s1 p2 200
s1 p3 400
s1 p4 300
s1 p5 700
s1 p6 300
s2 p1 300
s2 p2 400
s3 p2 200
s4 p2 200
s4 p4 300
s4 p5 400
Resolver en PROLOG las siguientes consultas:
a) Nombre de los suministradores que suministran al menos una parte roja.
b) Nombres de los suministradores que no suministran la parte p2.
c) Nombre de los suministradores que suministran al menos todas las partes que
suministra el suministrador s2.
d) Nombre de los suministradores que suministran solo partes de Castellón.
e) Nombre de las partes que hayan sido suministradas por todos los suministradores.
f) Nombre de los suministradores "al por mayor" (que nunca suministran partes en una
cantidad menor a 400 piezas).
g) Nombre de los suministradores y la cantidad total de partes que han suministrado.
h) Calcular la media de las cantidades totales que han suministrado todos los suministradores.
Primeramente definimos nuestra base de datos en prolog, así:
Y lo guardamos con el nombre datos.pl
a)
b)
c)
d)
e)
f)
g)
h)
2) MANEJO DE ARCHIVOS
Usando la tabla de suministradores anterior:
TABLA DE SUMINISTRADORES (sumin)
Scodigo Snombre Estatus ciudad
s1 Juan 20 Madrid
s2 Pedro 10 Castellón
s3 Raquel 30 Alicante
s4 María 20 valencia
S5 Luis 30 Castellón
Vamos a hacer un programa que busque, añada y guarda nuestra base de hechos
dinámicamente.
• Primeramente creamos nuestra base de datos en prolog asi:
Lo guardamos en el disco duro C: como datos2.pl (será nuestra base de datos inicial)
• Luego creamos un nuevo archivo consulta.pl donde estarán nuestras programas que
modificaran nuestra base de datos.
Comenzamos:
dynamic sumin/4. Para dinamizar nuestro predicado sumin. (para añadir nuevos hechos).
El proceso “inicio” lanza el programa y consulta nuestra base de datos existente(datos2.pl) ,
enseguida nos manda a proceso_principal que es el bucle principal del programa.
proceso_principal nos pide un nombre para poder ver si se encuentra en nuestra base de
datos consultada (datos2.pl) ese nombre se guarda en la variable Nombre enseguida nos
manda al proceso “respuesta” que evaluara el nombre ingresado.
Si el usuario ingresa “parar” abrimos datos2.pl y graba nuestra base de datos modificada.
Enseguida salimos del programa.
Si el usuario proporciona un Nombre que esta en la base de datos, este proceso nos muestra
su código, Estatus y ciudad del suministrador. Enseguida nos redirige a proceso_principal para
que ingresemos otro Nombre a evaluar o parar para grabar los cambios y salir.
Si el nombre suministrado no esta en la base de datos el proceso “respuesta” nos pide su
código, Estatus y ciudad del nuevo suministrador y lo inserta usando el predicado assert.
Veamos el programa en ejecución:
Vemos que si ingresamos “juan” como ya se encuentra en la base de datos inicial, nos
proporciona sus datos almacenados en nuestra base de datos.
Si ingresamos el nombre “carlos”, el programa no lo encuentra en nuestra base de datos,
entonces nos pide los datos de el y lo agrega a la base de datos.
Si ingresamos parar, el programa graba los cambios en la base de datos y finaliza el programa.
Vemos que el archivo datos2.pl se ha modificado y ha añadido un nuevo hecho:
sumin(s8,carlos,22,sjl).
BIBLIOGRAFIA
• [Bratko, 90] I. Bratko. PROLOG. Programming for Artificial Intelligence. Second Edition. Addison- Wesley. 1990. (puntos 4.1 y 4.2)
• [Clocksin 93] Clocksin, W.F., Mellish, C.S., Programación en PROLOG. Colección Ciencia Informática, 2ª edición. Editorial Gustavo Gili, S.A., 1993. (Capítulo 7, puntos 7.8 y 7.9)
• [Date, 93] C.J.Date, Introducción a los Sistemas de bases de datos. Volumen I. Quinta edición. Ed. Addison-Wesley Iberoamericana, 1993.