1 of 44

Introducción

al Paradigma Lógico

Paradigmas de Programación

2 of 44

Qué vimos hasta ahora

¿Qué es un programa?

3 of 44

Qué vimos hasta ahora

¿Qué es un programa?

4 of 44

La visión imperativa

  • Hay un estado inicial y un estado final
  • Las variables son posiciones de memoria donde almacenamos valores
  • Los valores se pueden pisar
  • Separamos estado vs. el algoritmo
  • Trabajamos con tres estructuras básicas de control
    • secuencia
    • selección
    • iteración

John Von Neumann

5 of 44

La visión funcional

  • También partimos de un estado inicial y llegamos a uno final, pero el estado es inmutable (generamos nuevos valores)
  • En lugar de cambiar el estado, generamos nuevos a partir de las transformaciones (funciones)
  • Las variables son matemáticas
  • ¿Cómo compartir estado entre funciones?
    • parámetros (valores recibidos)
    • valores de retorno (call & return)

John Mc Carthy, creador de LISP

6 of 44

Requerimientos

Dada una lista de películas queremos saber

  • si Leonardo Di Caprio actuó en “Once upon a time in Hollywood”
  • en qué películas actuó Leo Di Caprio
  • quiénes actuaron en “Once upon a time in Hollywood”

7 of 44

Requerimientos

Dada una lista de películas queremos

  • si Leonardo Di Caprio actuó en “Once upon a time in Hollywood”
  • en qué películas actuó Leo Di Caprio
  • quiénes actuaron en “Once upon a time in Hollywood”
  • ¿hizo alguna película Lorraine Bracco?

Googleame pib@

8 of 44

¿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"

]

9 of 44

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

10 of 44

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

11 of 44

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

...

12 of 44

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

13 of 44

Saber si un actor hizo alguna película

hizoAlgunaPelicula :: Actor -> [Pelicula] -> Bool

hizoAlgunaPelicula actor = any (elem actor . actores)

14 of 44

4 requerimientos, 4 funciones

¿Podríamos hacerlo sin desarrollar funciones? ¿usando la consola? ¡Seguro! Si no, pregúntale a un científico...

15 of 44

Pero no es cómodo

> elem "leo di caprio" $ (actores . head . filter ((== "Once upon a time in Hollywood") . titulo)) peliculas

True

16 of 44

Ok, les presentamos al paradigma lógico

Primero, reconocemos a las personas que siempre hacen la diferencia

  • Alain Colmerauer, en 1972 diseñó PROLOG junto con Philipe Roussel
  • Robert Kowalski, en la Univ. de Edinburgo, en 1974 sentó las bases del paradigma
  • Verónica Dahl es una investigadora argentino-canadiense reconocida mundialmente en el campo de la programación lógica

Alain Colmerauer

Robert Kowalski

Verónica Dahl

Phillipe Roussel

17 of 44

Ok, les presentamos al paradigma lógico

Ahora sí, vamos a resolver los cuatro requerimientos:

  • saber si Leonardo Di Caprio actuó en “Once upon a time in Hollywood”
  • en qué películas actuó Leo Di Caprio
  • quiénes actuaron en “Once upon a time in Hollywood”
  • si Lorraine Bracco hizo alguna película

Podés descargarte el proyecto en https://github.com/Prolog-Uqbar/peliculas-prolog

18 of 44

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).

19 of 44

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).

20 of 44

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

  • 2 es la cantidad de argumentos
  • también se llama aridad

y hay muchas cláusulas para ese predicado

21 of 44

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)

22 of 44

Consultas

Una aplicación en el paradigma lógico consiste en hacer consultas sobre una base de conocimientos.

23 of 44

Consultas

Una aplicación en el paradigma lógico consiste en hacer consultas sobre una base de conocimientos.

24 of 44

El camino de una consulta

ejecutamos Prolog

25 of 44

El camino de una consulta

ejecutamos Prolog

? actuo(leoDiCaprio, onceUponATimeInHollywood).

26 of 44

El camino de una consulta

ejecutamos Prolog

? actuo(leoDiCaprio, onceUponATimeInHollywood).

Motor de inferencia: donde está el algoritmo

while (...) {

if (...) {

}

}

27 of 44

El camino de una consulta

ejecutamos Prolog

? actuo(leoDiCaprio, onceUponATimeInHollywood).

Motor de inferencia: donde está el algoritmo

while (...) {

if (...) {

}

}

Base de conocimientos

28 of 44

El camino de una consulta

ejecutamos Prolog

? actuo(leoDiCaprio, onceUponATimeInHollywood).

Motor de inferencia: donde está el algoritmo

while (...) {

if (...) {

}

}

Base de conocimientos

29 of 44

Lo vemos en acción

Resolvemos cada requerimiento mediante consultas

  • si Leonardo Di Caprio actuó en “Once upon a time in Hollywood”

30 of 44

Lo vemos en acción

Resolvemos cada requerimiento mediante consultas

  • en qué películas actuó Leo Di Caprio

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.

31 of 44

Lo vemos en acción

Resolvemos cada requerimiento mediante consultas

  • quiénes actuaron en “Once upon a time in Hollywood”

Es interesante remarcar que no tuvimos que cambiar nada en nuestra base de conocimientos.

32 of 44

Lo vemos en acción

Resolvemos cada requerimiento mediante consultas

  • ¿hizo alguna película Lorraine Bracco?

La variable anónima ( _ ) indica que no nos interesa conocer los individuos que satisfacen la relación, solo si se cumple o no.

33 of 44

Tipos de consulta que hicimos

  • Individuales: se refieren a individuos

34 of 44

Tipos de consulta que hicimos

  • Existenciales: buscan determinar la existencia de los individuos que satisfacen una relación

35 of 44

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

36 of 44

Diferencias con la solución en Funcional

  • En Funcional tenemos 4 funciones, en Lógico el algoritmo está implícito en el motor, por eso no necesitamos hacer cambios en la base para resolver cada requerimiento. Pensar en resolverlo desde la consulta en Haskell exige un trabajo arduo, en Prolog es trivial.
  • En Funcional trabajamos con strings, en Lógico tenemos individuos (tipo de dato simple) que modelan una entidad
  • En Funcional los datos están organizados o agrupados siguiendo una jerarquía: la película agrupa actores, o los actores podrían tener la lista de películas. La relación es más flexible: la base de conocimiento nos permite jugar en ambos sentidos.

37 of 44

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.

38 of 44

¿Actuó en películas que ganaron un Oscar?

  • Vamos a definir el predicado suertude/1
  • Agregamos birdman, y sabemos que actuaron Emma Stone, Edward Norton, Andrea Riseborough, Zach Galifianakis y Michael Keaton.
  • make/1 como predicado para actualizar la base de conocimientos desde una sesión abierta

39 of 44

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

40 of 44

Principio de Universo Cerrado

Queremos reflejar que

  • “Esperando la carroza” no ganó el Oscar
  • China Zorrilla no actuó en “Once upon a time in Hollywood”
  • Alf no es actor (por ahora)

41 of 44

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.

42 of 44

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.

43 of 44

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).

44 of 44

¡Gracias!