Introducción
al Paradigma Lógico
Paradigmas de Programación
Qué vimos hasta ahora
¿Qué es un programa?
Qué vimos hasta ahora
¿Qué es un programa?
La visión imperativa
John Von Neumann
La visión funcional
John Mc Carthy, creador de LISP
Requerimientos
Dada una lista de películas queremos saber
Requerimientos
Dada una lista de películas queremos
Googleame pib@
¿Lo hacemos en Funcional?
Si me lo pedís así...
type Actor = String
data Pelicula = Pelicula {
actores :: [Actor],
titulo :: String
} deriving (Eq, Ord, Show)
peliculas :: [Pelicula]
peliculas = [
Pelicula ["ray liotta", "lorraine bracco"] "Good Fellas",
Pelicula ["leo di caprio", "brad pitt"] "Once upon a time in Hollywood"
]
Saber si un actor estuvo en una película
Por ejemplo, si Leonardo Di Caprio actuó en “Once upon a time in Hollywood”
buscarPelicula :: String -> [Pelicula] -> Pelicula
buscarPelicula tituloPelicula = head . filter ((== tituloPelicula) . titulo)
actuo :: Actor -> String -> [Pelicula] -> Bool
actuo actor tituloPelicula = elem actor . actores . buscarPelicula tituloPelicula
Saber si un actor estuvo en una película
Por ejemplo, si Leonardo Di Caprio actuó en “Once upon a time in Hollywood”
buscarPelicula :: String -> [Pelicula] -> Pelicula
buscarPelicula tituloPelicula = head . filter ((== tituloPelicula) . titulo)
actuo :: Actor -> String -> [Pelicula] -> Bool
actuo actor tituloPelicula = elem actor . actores . buscarPelicula tituloPelicula
peliculas
f
Saber en qué películas actuó un actor
Necesitamos una nueva función, pero podemos delegar en la primera... solo que no calza tan bien la llamada a actuo, nos convendría más que el título de la película que buscamos esté como tercer parámetro. Se puede cambiar la definición original, pero eso cambia cosas como la eta-reduction y la forma en cómo la invocamos.
peliculasDondeActuo :: Actor -> [Pelicula] -> [String]
peliculasDondeActuo actor peliculas =
(map titulo . filter (\pelicula -> actuo actor (titulo pelicula) peliculas)) peliculas
peliculas
f
...
Saber quiénes actuaron en una película
quienesActuaron :: String -> [Pelicula] -> [Actor]
quienesActuaron tituloPelicula = actores . buscarPelicula tituloPelicula
delegamos en una función (por suerte) que nos permite encontrar una película. También podríamos conocer a la película y sería más fácil:
actores onceUponATime
¿Qué pasa si le damos una película que no existe?
*Library Library> quienesActuaron "esperando la carroza" peliculas
*** Exception: Prelude.head: empty list
Saber si un actor hizo alguna película
hizoAlgunaPelicula :: Actor -> [Pelicula] -> Bool
hizoAlgunaPelicula actor = any (elem actor . actores)
4 requerimientos, 4 funciones
¿Podríamos hacerlo sin desarrollar funciones? ¿usando la consola? ¡Seguro! Si no, pregúntale a un científico...
Pero no es cómodo
> elem "leo di caprio" $ (actores . head . filter ((== "Once upon a time in Hollywood") . titulo)) peliculas
True
Ok, les presentamos al paradigma lógico
Primero, reconocemos a las personas que siempre hacen la diferencia
Alain Colmerauer
Robert Kowalski
Verónica Dahl
Phillipe Roussel
Ok, les presentamos al paradigma lógico
Ahora sí, vamos a resolver los cuatro requerimientos:
Podés descargarte el proyecto en https://github.com/Prolog-Uqbar/peliculas-prolog
Paso 1: definir nuestra base de conocimiento
actuo(leoDiCaprio, wolfOfWallStreet).
actuo(margotRobbie, wolfOfWallStreet).
actuo(leoDiCaprio, onceUponATimeInHollywood).
actuo(bradPitt, onceUponATimeInHollywood).
actuo(margotRobbie, onceUponATimeInHollywood).
actuo(joePesci, goodFellas).
actuo(robertDeNiro, goodFellas).
actuo(rayLiotta, goodFellas).
actuo(lorraineBracco, goodFellas).
actuo(leoDiCaprio, catchMeIfYouCan).
actuo(tomHanks, catchMeIfYouCan).
Paso 1: definir nuestra base de conocimiento
actuo(leoDiCaprio, wolfOfWallStreet).
actuo(margotRobbie, wolfOfWallStreet).
actuo(leoDiCaprio, onceUponATimeInHollywood).
actuo(bradPitt, onceUponATimeInHollywood).
actuo(margotRobbie, onceUponATimeInHollywood).
actuo(joePesci, goodFellas).
actuo(robertDeNiro, goodFellas).
actuo(rayLiotta, goodFellas).
actuo(lorraineBracco, goodFellas).
actuo(leoDiCaprio, catchMeIfYouCan).
actuo(tomHanks, catchMeIfYouCan).
Qué tiene una base de conocimiento
actuo(leoDiCaprio, wolfOfWallStreet).
actuo(margotRobbie, wolfOfWallStreet).
actuo(leoDiCaprio, onceUponATimeInHollywood).
actuo(bradPitt, onceUponATimeInHollywood).
actuo(margotRobbie, onceUponATimeInHollywood).
actuo(joePesci, goodFellas).
actuo(robertDeNiro, goodFellas).
actuo(rayLiotta, goodFellas).
actuo(lorraineBracco, goodFellas).
actuo(leoDiCaprio, catchMeIfYouCan).
actuo(tomHanks, catchMeIfYouCan).
cláusulas
(relaciones)
hay un predicado: actuo/2
y hay muchas cláusulas para ese predicado
Qué tiene una base de conocimiento
actuo(leoDiCaprio, wolfOfWallStreet).
actuo(margotRobbie, wolfOfWallStreet).
actuo(leoDiCaprio, onceUponATimeInHollywood).
actuo(bradPitt, onceUponATimeInHollywood).
actuo(margotRobbie, onceUponATimeInHollywood).
actuo(joePesci, goodFellas).
actuo(robertDeNiro, goodFellas).
actuo(rayLiotta, goodFellas).
actuo(lorraineBracco, goodFellas).
actuo(leoDiCaprio, catchMeIfYouCan).
actuo(tomHanks, catchMeIfYouCan).
individuos
(átomos)
Consultas
Una aplicación en el paradigma lógico consiste en hacer consultas sobre una base de conocimientos.
Consultas
Una aplicación en el paradigma lógico consiste en hacer consultas sobre una base de conocimientos.
El camino de una consulta
ejecutamos Prolog
El camino de una consulta
ejecutamos Prolog
? actuo(leoDiCaprio, onceUponATimeInHollywood).
El camino de una consulta
ejecutamos Prolog
? actuo(leoDiCaprio, onceUponATimeInHollywood).
Motor de inferencia: donde está el algoritmo
while (...) {
if (...) {
}
}
El camino de una consulta
ejecutamos Prolog
? actuo(leoDiCaprio, onceUponATimeInHollywood).
Motor de inferencia: donde está el algoritmo
while (...) {
if (...) {
}
}
Base de conocimientos
El camino de una consulta
ejecutamos Prolog
? actuo(leoDiCaprio, onceUponATimeInHollywood).
Motor de inferencia: donde está el algoritmo
while (...) {
if (...) {
}
}
Base de conocimientos
Lo vemos en acción
Resolvemos cada requerimiento mediante consultas
Lo vemos en acción
Resolvemos cada requerimiento mediante consultas
Cuando consultamos Peliculas con mayúscula, no es un individuo concreto sino una variable, una incógnita. Lo que busca Prolog es resolver esa incógnita encontrando qué individuos satisfacen esa relación => hacen que el predicado actuo/2 sea verdadero. Más adelante profundizaremos sobre este tema.
Lo vemos en acción
Resolvemos cada requerimiento mediante consultas
Es interesante remarcar que no tuvimos que cambiar nada en nuestra base de conocimientos.
Lo vemos en acción
Resolvemos cada requerimiento mediante consultas
La variable anónima ( _ ) indica que no nos interesa conocer los individuos que satisfacen la relación, solo si se cumple o no.
Tipos de consulta que hicimos
Tipos de consulta que hicimos
Las consultas no devuelven, se satisfacen o no
Imagine there’s no functions
No assignation too...
Queries find which atoms
can make the facts come true,
imagine Prolog people... reading knowledge bases... youhooo...
I know Prolog it’s deprecated
or at least nobody cares
But someday you’ll find SQL
and the concepts will be the same
Diferencias con la solución en Funcional
Diferencias con la solución en Funcional
Pero sobre todo, la diferencia es de paradigma: en Funcional pensamos en funciones, en Lógico pensamos en relaciones que son más abarcativas.
¿Actuó en películas que ganaron un Oscar?
Predicados monádicos y poliádicos
suertude(Actor):-actuo(Actor, Pelicula), oscar(Pelicula).
un solo individuo: expresa una característica
más de un individuo: modela relaciones entre esos individuos
Poliádico
Monádico
Principio de Universo Cerrado
Queremos reflejar que
Principio de Universo Cerrado
¿Qué hago si no encuentro algo en la base?
Opción 1: Te digo que no lo se.
Opción 2: Asumo que lo que yo no se, no es verdad. Yo tengo todo el conocimiento en mi base.
Principio de Universo Cerrado
¿Qué hago si no encuentro algo en la base?
Opción 1: Te digo que no lo se.
Opción 2: Asumo que lo que yo no se, no es verdad. Yo tengo todo el conocimiento en mi base.
Prolog trabaja con la segunda opción que computacionalmente es más simple, por eso el Principio de Universo Cerrado propone que el universo comienza y termina en la base de conocimientos. Todo lo que no está en la base no existe, se presume falso.
Definición por extensión
La definición de predicados que hicimos en la base equivale a una definición de conjunto por extensión.
animal(tigre).�animal(oso).�animal(elefante).
¡Gracias!