- Repaso y ejercicio
Comenzamos haciendo un breve repaso,
contestamos dudas que se plantearon sobre algunos ejercicios de la guía
1. Viendo el ejercicio 4 vimos cómo surge la duda entre modelar algo
como un predicado o como un individuo, es decir entre sereno(nico) y es(nico,sereno).
Mencionamos que la ventaja de la segunda es que me permite hacer la consulta es(nico, X)
y obtener todas las características de una persona. Igualmente vimos
que en este ejercicio no se aprovecha esa ventaja, por lo tanto podemos
mantener la otra posibilidad.
Luego resolvimos entre todos el ejercicio 4 de la guía.
- Functores
Hasta
acá habíamos trabajado con dos tipos de individuos: átomos y números.
Los functores nos permiten tener individuos compuestos, que se
describen en función de sus características (parámetros del functor) y
un nombre. Utilizamos functores para modelar fechas, por ejemplo fecha(8,4,2010) representaría la fecha de hoy.
Lamentablemente
en prolog los predicados se escriben parecido que los functores... ¡es
importante no confundir los dos conceptos! (en realidad eso tiene una
motivación, pero es para más adelante, por ahora es sólo una pequeña
molestia y no hay que confundirse.
También vimos que podemos
armar functores en cualquier lugar y que no es necesario definirlos de
antemano. Por ahora trabajamos con functores que tienen números como
parámetros, pero pueden tener cualquier individuo como parámetros,
incluyendo por ejemplo a otros functores.
- Unificación y pattern matching
Arrancamos
diciendo que el objetivo del prolog ante una consulta con variables va
a ser encontrar valores para esas variables que satisfagan la consulta.
Hablamos de que las variables tienen dos estados: libre y ligada. ¿Cómo saber dentro de un predicado si una variable está libre o ligada?
- Los parámetros estarán libres o ligados dependiendo de la consulta que nos han hecho (si es individual, existencial o variable).
- Las variables que sólo se usan localmente arrancarán siempre estando libres.
- Si una variable aparece más de una vez en el cuerpo de un predicado (que es lo más probable), sólo la primera de ellas puede estar libre, luego estará ligada por ese primer uso.
Podemos entonces extender nuestro conocimiento sobre los tipos de consulta, entonces consultas variables
serán únicamente las que usen variables libres, en cambio si uso
variables ligadas eso es equivalente a usar los individuos con los que
están ligadas y por lo tanto no serían consultas variables.
También vimos muchos ejemplos de cómo se pueden unificar (o matchear)
dos expresiones (individuos, variables, individuos parcialmente
definidos) y vimos el mecanismo que utiliza el prolog para llevarlo a
cabo.
- Inversibilidad
Hasta acá todos los predicados que habíamos hecho eran totalmente inversibles.
Ahora el hecho de utilizar functores nos pone por primera vez ante la
presencia de un predicado con limitaciones en cuanto a inversibilidad: Cuando
un predicado tiene como parámetro a un functor, debemos asegurarnos de
ligar todas sus componentes dentro del cuerpo de la regla para que este
predicado pueda considerarse totalmente inversible sin salvedades.
El ejemplo que utilizamos fue:
año(fecha(_,_,A), A).
Ahí
se puede ver que si no le proporcionamos el primer parámetro, el motor
no va a tener forma de ligar las dos primeras componentes de la fecha,
correspondientes al día y mes respectivamente. Y por lo tanto las
consultas que utilicen una variable como primer parámetro no tendrían
sentido.
Se puede destacar que no se produce un error al usar el
predicado de esa manera, simplemente pasa que las consultas podrían no
resultar útiles.
- Aritmética en un lenguaje lógico
Aprendimos los rudimentos necesarios para utilizar operaciones aritméticas en el lenguaje Prolog.
Aquí se agrega otro problema de inversibilidad: todo lo que esté a la derecha del is tiene que estar totalmente ligado.
|
|