BASES DE DATOS INCO - 1992 SOLUCION - PRACTICO 4 EJERCICIO 1. PRV(#PROV, NOM_PROV, CATEGORIA, CIUDAD_PROV) PRT(#PAR, NOM_PAR, COLOR, PESO, CIUDAD_PAR) PRY(#PROY, NOM_PROY, CIUDAD_PROY) PPC(#PROV, #PAR, #PROY, CANTIDAD) a) 2. Numero de proveedores que proveen al proyecto de numero 1 alguna parte roja. R(x) :- PPC(x,p,"1",u), PRT(p,n,"roja",a,c). R = ã ((å PPC) |><| (å PRT)) #prov #proy="1" color="roja" 3. Los numeros de los proyectos que proveen con partes rojas a algun proyecto de Londres o alguno de Paris. R(x) :- PPC(x,y,z,c), PRT(y,n,ROJO,pe,ci), PRY(z,np,LONDRES) R(x) :- PPC(x,y,z,c), PRT(y,n,ROJO,pe,ci), PRY(z,np,PARIS) R = ã (PPC |><| (å (PRT))|><| (å (PRY)) $1 $3=ROJO $3 = LONDRES U ã (PPC |><| (å (PRT)) |><| (å (PRY)) $1 $3=ROJO $3 = PARIS b) 1. Los numeros de los proveedores para aquellos que proveen a los proyectos de numero 1 y 2. { t / (]-u)(PPC(u) /\ t[1] = u[1] /\ u[3] = 1) /\ (]-v)(PPC(v) /\ t[1] = v[1] /\ v[3] = 2) } 2. Los numeros de proveedores que proveen al proyecto de numero 1 alguna parte roja. { t / (]-u)(PPC(u) /\ u[1] = t[1] /\ u[3]=1 /\ (]-v)(PRT(v) /\ u[2] = v[1] /\ v[3] = rojo ) ) } 3. Los numeros de proveedores que proveen con partes rojas a algun proyecto de Londres o alguno de Paris. { t / (]-u)(PPC(u) /\ u[1] = t[1] /\ (]-v)(PRY(v) /\ v[1] = u[3] /\ (v[3] = LONDRES \/ v[3] = PARIS) /\ (]-w)(PRT(w) /\ u[2] = w[1] /\ w[3] = ROJO ) ) ) } _s 4. Dar las parejas de ciudades, tales que un proveedor de la primera provee a un proyecto de la segunda. { t / (]-u)(PRV(u) /\ u[4] = t[1] /\ (]-v)(PPC(v) /\ v[1] = u[1] /\ (]-w)(PRY(w) /\ w[3] = t[2] /\ v[3] = w[1] ) ) ) } 5. Dar todas las triplas (CIUDAD, #PAR, CIUDAD), donde un proveedor de la primera ciudad provee con la parte especificada a un proyecto de la segunda ciudad; con la condicion de que las ciudades no deben ser la misma. { t / (]-u)(PRV(u) /\ u[4] = t[1] /\ (]-v)(PPC(v) /\ v[1] = u[1] /\ v[2] = t[2] /\ (]-w)(PRY(w) /\ w[3] = t[3] /\ v[3] = w[1] /\ w[3] <> u[4] ) ) ) } 6. Todos los numeros de partes tales que no hay otra parte con peso menor. { #P / (]-n)(]-c)(]-w1)(]-ci)(PRT(#P,n,c,w1,ci) /\ (@p)[(]-no)(]-co)(]-w2)(]-cit) (PRT(p,no,co,w2,cit) --> w1 <= w2) ] ) } 7. Dar los numeros de los proyectos provistos solamente por el proveedor de numero 9. { t / (]-v)(PRY(v) /\ v[1] = t[1] /\ (]-u)(PPC(u) /\ u[1] = 9 /\ u[3] = v[1] ) /\ ~(]-w)(PPC(w) /\ w[3] = v[1] /\ u[1] <> w[1] ) ) } 8. Nombre de los proveedores que proveen alguna parte (pero la misma) a todos los proyectos. { t / (]-prv) (PRV(prv) /\ t[1] = prv[2] /\ (]-ppc) (PPC(ppc) /\ ppc[1] = prv[1] /\ (V-pry) (PRY(pry) -> (]-x) (PPC(x) /\ x[1] = prv[1] /\ /\ x[2] = ppc[2] /\ x[3] = pry[1]) ) ) ) } EJERCICIO 2.(Julio '87) VIVE (NOMBRE_FUNCIONARIO, CIUDAD, CALLE) TRABAJA (NOMBRE_FUNCIONARIO, EMPRESA, SUELDO) UBICACION (EMPRESA, CIUDAD) JEFE (NOMBRE_FUNCIONARIO, NOMBRE_JEFE) _s a) Encontrar los funcionarios que viven en la misma ciudad y calle que su jefe. { t / (]-f)(VIVE(f) /\ f[1] = t[1] /\ (]-j) (VIVE(j) /\ j[2] = f[2] /\ j[3] = f[3] /\ (]-je) (JEFE(je) /\ je[1] = f[1] /\ je[2] = j[1] ) ) ) } b) Encontrar los funcionarios que ganan mas que cualquier empleado del "S.M.I.". { t / {]-ta) (TRABAJA(ta) /\ ta[1] = t[1] /\ (V-o) (TRABAJA(o) /\ o[2] = "S.M.I" --> ta[3] > o[3] ) ) } c) Asumiendo que una empresa puede estar en varias ciudades, dar las empresas ubicadas en todas las ciudades en que esta "IN.CA.". { t / (]-e)(UBICACION(e) /\ e[1] = t[1] /\ (]-i)(UBICACION(i) /\ i[1] = "IN.CA." /\ (V-c)(UBICACION(c) /\ c[1] = "IN.CA" --> (]-u)(UBICACION(u) /\ u[1] = e[1] /\ u[2] = c[2] ) ) ) ) } EJERCICIO 3. (Diciembre '87) VUELOS(NRO_VUELO,CIUDAD_ORIGEN,CIUDAD_DESTINO,HORA_SAL,HORA_LLEG,DIST) V_F (NRO_VUELO, FECHA, NRO_AVION, NRO_PILOTO) AVION(NRO_AVION, TIPO_AVION, HORAS_VUELO) PILOTOS(NRO_PILOTO, CANT_VUELOS) a) Numeros de piloto con menos de 10 vuelos que pilotearon a todos los aviones del tipo boing 737 de la compania. { t / (]-p) (PILOTOS(p) /\ p[1] = t[1] /\ p[2] < 10 /\ (V-a)(AVION(a) /\ a[2] = boing 737 --> (]-v) (V-F(v) /\ v[3] = a[1] /\ v[4] = p[1] ) ) ) } b) Numeros de los pilotos con la maxima cantidad de vuelos. { t/ (]-u)(PILOTOS(u) /\ u[1] = t[1] /\ (V-v)(PILOTOS(v) --> u[2] >= v[2] ) ) } _s c) Numero de los pilotos con mas de 30 vuelos que pilotearon solo aviones del tipo DC-10. { t / (]-p) (PILOTOS(p) /\ p[1] = t[1] /\ p[2] > 30 /\ (V-v)(V-F(v) /\ v[4] = p[1] ---> (]-a)(AVION(a) /\ a[1] = v[3] /\ a[2] = DC-10 ) ) ) } d) Ciudades tales que todo avion tipo boing 747 salio alguna vez de alli. { t / (]-v)(VUELOS(v) /\ v[2] = t[1] /\ (V-a)(AVION(a) /\ a[2] = Boing 747 ---> (]-vf)(]-vu)(V-F(vf) /\ VUELOS(v) /\ vf[3] = a[1] vf[1] = vu[1] /\ vu[2] = v[2] ) ) ) } EJERCICIO 4 (Diciembre '87) OBRAS (NRO_OBRA, DIRECTOR, TIPO_OBRA, FECHA_COMIENZO) TRABAJA(NRO_OBRERO, NRO_OBRA, FECHA, COD_TAREA) PERSONAL(NRO_OBRERO, NOM_OBRERO, ESPECIALIDAD) TAREAS(COD_TAREA, DESCRIPCION, DURACION) a) Dar las triplas (obra, cod_tarea, nro_obrero) tales que el obrero trabajo en la obra pero no realizo (en dicha obra) la tarea mencionada; siendo la tarea una de las efectivamente realizadas en la obra. { t / (]-ta)(TRABAJA(ta) /\ ta[2] = t[1] /\ ta[1] = t[3] /\ (]-o)(TRABAJA(o) /\ o[2] = ta[2] /\ o[4] = t[2] /\ ~(]-p)(TRABAJA(p) /\ p[1] = ta[1] /\ p[2] = ta[2] /\ o[4] = p[4] ) ) ) } b) Son los obreros que trabajaron en todas las obras que tienen como director a AL GUT. { t / (V-u)(OBRAS(u) /\ u[2] = "AL GUT" --> (]-v)(TRABAJA(v) /\ v[2] = u[1] /\ v[1] = t[1] ) ) } c) Obtiene los pares de obreros que trabajan en la misma obra y en la misma tarea. ã (å (TRABAJA |><| TRABAJA)) 1,5 2=6 /\ 4=8 1 <> 5 EJERCICIO 5. (Diciembre '88) LOCALES(#LOCAL, DIRECCION, CANTIDAD_MAQ, PROM_FICHAS, VALOR_FICHA) MAQUINAS(#MAQUINA, #JUEGO, #LOCAL) JUEGOS(#JUEGO, ORIGEN, TIPO) _s a) Tripletas (identificacion del local, direccion del local, identificacion del juego), tales que el juego esta solo en ese local. { t / (]-l)(LOCALES(l) /\ t[1] = l[1] /\ t[2] = l[2] /\ (]-m)(MAQUINAS(m) /\ m[3] = l[1] /\ m[2] = t[3] /\ ~(]-m2)(MAQUINAS(m2) /\ m2[2] = m[2] /\ m2[3] <> m[3] ) ) ) } b) Parejas (identificacion_local, prom_fichas_local) que entre los juegos del local estan todos los juegos de origen "JAPONES". {t / (]-l)(LOCALES(l) /\ t[1] = l[1] /\ t[2] = l[2] /\ (V-j)(JUEGOS(j) /\ j[2] = "JAPONES" ---> (]-m)(MAQUINAS(m) /\ m[3] = l[1] /\ m[2] = j[1] ) ) ) } c) Identificacion de los locales que tienen por lo menos un juego de cada uno de los tipos de los juegos de origen coreano. { t / (]-l)(LOCALES(l) /\ t[1] = l[1] /\ (V-j)(JUEGOS(j) /\ j[2] = "COREANO" ---> (]-m)(]-j2)(MAQUINAS(m) /\ JUEGOS(j2) /\ m[2] = j2[1] /\ m[3] = l[1] /\ j[3] = j2[3] ) ) ) } d) Locales que solo tienen juegos "bulgaros" A = ã (MAQUINAS |><| ( å JUEGOS) ) $3 $2 = "BULGARO" B = ã (MAQUINAS |><| ( å JUEGOS)) $3 $2 <> BULGARO SOL = A - B e) Parejas nro. de local, prom. de fichas de los locales que no tienen juegos de origen chino { t / (]-l)(LOCALES(l) /\ t[1] = l[1] /\ t[2] = l[4] /\ (V-m)(MAQUINAS(m) /\ (]-j)(JUEGOS(j) /\ m[3] = l[1] /\ m[2] = j[2] ---> j[3] <> CHINO ) ) ) } EJERCICIO 6. (Julio '88) a) Nombre de los estudiantes inscriptos a la vez en las materias Base de Datos y Arquitectura de Sistemas. _s { t / (]-e)(ESTUDIANTES(e) /\ e[2] = t[1] /\ (]-m)(]-m2)(MATERIA(m) /\ MATERIA(m2) /\ m[2] = Base de Datos /\ m2[2] = Arquitectura de Sistemas /\ (]-i)(]-i2)(INSCRIPCION(i) /\ INSCRIPCION(i2) i[1] = e[1] /\ i2[1] = e[1] /\ i[2] = m[1] /\ i2[2] = m2[1] ) ) ) } b) Nombre de los estudiantes que rindieron todos los parciales de la materia IC504 pero no se habian inscripto en dicha materia. { t / (]-e)(ESTUDIANTES(e) /\ t[1] = e[2] /\ (V-p)(PARCIAL(p) /\ p[2] = IC504 ---> (]-r)(RESULTADO(r) /\ r[2] = IC504 /\ r[3] = p[1] /\ r[1] = e[1] ) ) /\ ~(]-i) (INSCRIPCION(i) /\ i[1] = e[1] /\ i[2] = IC504 ) ) } c) Nombre de los profesores que dictaron alguna materia en la que nadie salvo ningun parcial. { t / (]-p)(PROFESOR(p) /\ t[1] = p[2] /\ (]-c)(CURSO(c) /\ p[1] = c[5] /\ (V-r)(RESULTADO(r) /\ r[2] = c[1] ---> r[4] < 3 ) ) ) } d) Nombre de los profesores que no dictaron cursos. ã ( ( ã (PROFESOR) - ã (CURSO) ) |><| PROFESOR) nombre nro_profesor nro_profesor e) Codigos de los parciales en donde salvaron todos los estudiantes que se inscribieron en la materia IC701 { t / (]-u)(RESULTADO(u) /\ u[1] = t[1] /\ u[2] = IC701 /\ (V-v)(INSCRIPCION(v) /\ v[2] = IC701 ---> (]-w)(RESULTADO(w) /\ w[2] = IC701 /\ w[1] = v[1] /\ w[3] = u[1] /\ w[4] >= 3 ) ) ) } EJERCICIO 7. (Marzo '89) REVISTA (codigo_revista, nombre_revista, pais_edicion) EJEMPLARES( codigo_revista, ano_publicacion, titulo_articulo) AUTORES (titulo_articulo, autor_articulo) a) Obtener los nombres de los autores que publicaron en todos los ejemplares de la revista ACM_TODS. _s { t / (]-a)(AUTORES(a) /\ t[1] = a[2] /\ (V-e)(EJEMPLAR(e) /\ (]-r)(REVISTA(r) /\ r[1] = e[1] /\ r[2] = ACM_TODS ---> (]-b)(AUTORES(b) /\ b[1] = e[3] /\ b[2] = a[2] ) ) ) ) } b) Obtener el ano de publicacion del primer numero de la revista ACM_SURVEYS { t / (]-r)(EJEMPLAR(r) /\ (]-p)(REVISTA(p) /\ p[1] = r[1] /\ p[2] = ACM-SURVEYS /\ t[1] = r[2] /\ ª((]-s)(EJEMPLAR(s) /\ (]-q)(REVISTA(q) /\ s[1] = q[1] /\ q[2] = ACM_SURVEYS /\ q[2] < r[2] ) ) ) ) ) } c) { t /(]-a)(AUTORES(a) /\ a[2] = 'JP' /\ t[1] = a[1] /\ ª ( (]-b) (AUTORES(b) /\ b[1] = a[1] /\ b[2] <> 'JP' ) ) ) } d) ã (AUTORES |><| å (EJEMPLAR ) |><| å (REVISTA) ) autor-articulo ano_publicacion = 1987 pais-edicion = alemania EJERCICIO 8 (Julio '89) PELICULAS( nro_pel, titulo, genero, duracion) VIDEO_CLUB (nro_vc, nombre_vc, direccion) SOCIOS ( nro_soc, nombre_soc, nro_vc) CATALOGO (nro_vc, nro_pel, cant_prestamos) a) Obtener los nombres de los socios que estan anotados en todos los videos clubes que tienen alguna pelicula de genero MUSICAL. { t / (]-s)(SOCIOS(s) /\ t[1] = s[2] /\ (]-v)(]-c)(]-p)(CATALOGO(c) /\ VIDEO_CLUB(v) /\ PELICULAS(p) /\ c[1] = v[1] /\ c[2] = p[1] /\ p[3] = MUSICAL ) /\ (V-c')(CATALOGO(c') /\ (]-p')(PELICULAS(p') /\ p'[3] = MUSICAL /\ c'[2] = p'[1] -----> s[3] = c'[1] ) ) } _s b) Obtener los nombres de los videos clubes tales que todos sus socios son exclusivos, o sea que no estan anotados en otro video club. R = { t / (]-v)(VIDEO_CLUB(v) /\ v[2] = t[1] /\ (V-s)(SOCIOS(s) /\ s[3] = v[1] ---> (~(]-s2)(SOCIOS(s2) /\ s2[1] = s[1] /\ s2[3] <> s[3] ) ) ) ) } c) Parejas (nombre_vc, direccion) de los videos clubes que no tienen peliculas de genero accion y tienen por lo menos una pelicula de duracion menor a los 120 minutos. R = { t / (]-v)(VIDEO_CLUB(v) /\ t[1] = v[1] /\ t[2] = v[2] /\ (]-p)(PELICULAS(p) /\ p[4] < 120 /\ (]-c)(CATALOGO(c) /\ c[1] = v[1] /\ c[2] = p[1] ) ) /\ ~(]-p2)(PELICULAS(p2) /\ p2[3] = accion /\ (]-c2)(CATALOGO(c2) /\ c2[1] = v[1] /\ c2[2] = p2[1] ) ) ) } d) Titulo de las peliculas tales que en todos los videos clubes donde estan existe alguna pelicula de genero "AVENTURA". A = ã ( å (CATALOGO |><| PELICULAS)) nro_vc genero = AVENTURA B = ã (CATALOGO |><| A) nro_pel C = ã CATALOGO nro_vc D = ã (( C - A) |><| CATALOGO) nro_pel R = ã ((B - D) |><| PELICULAS) titulo EJERCICIO 9 a) { x1, x2 / ((R(x1, x2) \/ Q(x1, x2)) /\ (]-y) (P(y) /\ x1 = y) } * No es una formula segura ya que en la conjuncion: (P(y) /\ x1 = y) no estan todas las variables libres limitadas. _s * Es independiente de dominio, ya que si (a,b) pertenece al resultado para un dominio D cualquiera, (a,b) satisface a la formula, y en particular satisface (R(x) \/ Q(x)). Por lo tanto o bien R(a,b) es verdadera o Q(a,b) es verdadera. Si R(a,b) es verdadera, entonces a pertenece ãS11T (R) y b pertenece ãS12T (R). O sea ambas pertenecen al DOM de la formula. Si Q(a,b) es verdadera, entonces a pertenece ãS11T (Q) y b pertenece ãS12T (Q). O sea ambas pertenecen al DOM de la formula. Entonces no importa cual sea el D que contenga al DOM de la formula que consideremos siempre obtendremos el mismo resultado. Por lo tanto es independiente de dominio. b) { x / (]-y) (P(x, y) \/ Q(x, y)) } * Cumple con la definicion de formula segura (SAFE), por lo tanto tambien es independiente de dominios. c) { u1, u2 / R(u1, u2) /\ (]-s1) (]-s2) (P(s1, s2) /\ s1 <> u2) } * No es una formula segura, ya que en la conjuncion : P(s1, s2) /\ s1 <> u2 no estan todas las variables libres limitadas. * Es independiente de dominio, ya que : Consideremos una tupla (a,b) que pertenezca al resultado considerando un dominio D cualquiera. Como (a,b) pertenece al resultado entonces satisface la formula, en particular R(a,b) es verdadera. Por lo tanto, a pertenece ãS11T (R) y b pertenece ãS12T (R), entonces a y b pertenecen al DOM de este formula. No importa cual sea el D que contenga al DOM de la formula que consideremos siempre obtendremos el mismo resultado. Por lo tanto es independiente de dominio. d) F = { x, z / (]-y) (P(y, x) \/ Q(y, z)) } * No es formula segura, ya que en la disyuncion : (P(y, x) \/ Q(y, z)) las formulas participates no tienen las mismas variables libres. * No es independiente de dominio, ya que : Consideremos el siguiente dominio D1 = DOM(F) U {a} donde a no pertenece a DOM(F). Sea (b,c) perteneciente a ãS11,2T (P), por lo tanto (b,c) pertenece al DOM(F) La tupla (b,a) pertenece a la solucion, segun el dominio D1, pero no segun DOM(F). Por lo tanto, esta formula no es independiente de dominio. e) F = { z / (]-x) (]-y) (P(x, y) /\ y <> z) } * No es formula segura, ya que en la disyuncion : (P(x, y) /\ y <> z) _s no estan todas las variables libres limitadas. * No es independiente de dominio, ya que : Consideremos el siguiente dominio D1 = DOM(F) U {a} donde a no pertenece a DOM(F). Sea (b,c) perteneciente a ãS11,2T (P), por lo tanto (b,c) pertenece al DOM(F) El elemento a pertenece a la solucion, segun el dominio D1, pero no segun DOM(F). Por lo tanto, esta formula no es independiente de dominio.