viernes, 22 de febrero de 2013

prolog.

Prolog: una introducción a la programación lógica Cuando se piensa en programación, lo que usualmente viene a la mente son funciones, ciclos, condicionales y variables. Conocemos los lenguajes C, C++, Java, C# y demás viejos amigos. Pensamos en algoritmos; una secuencia de pasos apoyados por estructuras de control. El paradigma imperativo de programación es, sin duda, el más utilizado y conocido por la mayoría de la gente. Pocas veces nos imaginamos un lenguaje de programación en donde no necesitamos decirle a la computadora una secuencia de instrucciones; donde el flujo de control sea irrelevante y no necesitamos de for, if, llamadas a métodos y demás artilugios de la programación imperativa. Siendo ésta la revista Paradigmas, usaremos este espacio para cambiar el paradigma de programación al que estamos acostumbrados: el Paradigma Declarativo. Lleva este nombre porque el programador declara lo que debe resultar del cómputo; en contraste con ordenar cómo se debe de llegar al resultado. Es decir, describimos el problema en lugar de implementar un algoritmo para su solución. Una rama del paradigma declarativo es la programación lógica; estrechamente ligada a la Inteligencia Artificial. Programación lógica significa el definir hechos y relaciones combinados con lógica matemática para describir la solución a un problema. Prolog es probablemente el lenguaje lógico más conocido en la actualidad. Nacido en la década de los 70’s en Francia, fue concebido originalmente como un procesador del lenguaje natural (Francés). Existen actualmente muchas implementaciones de Prolog, las cuales pueden ser descargadas gratuitamente, como por ejemplo SWI-Prolog. Tras escribir código Prolog, uno tiene que correrlo en un intérprete y realizar consultas para obtener resultados. Dichas consultas sólo pueden verse en modo de línea de comandos dentro del programa intérprete; pero por medio de librerías externas, se pueden crear interfaces gráficas en otro lenguaje de programación como Java, con Prolog integrado para hacer consultas lógicas. Muchas veces, el proceso por el cual se resuelve un problema es por unificación de variables, el cual será explicado más adelante. Para resolver un problema en Prolog, uno necesita crear una base de conocimientos a partir de aserciones de hechos. Un hecho se define de la forma: Propiedad(x). Lo anterior quiere decir “x tiene propiedad”. Por ejemplo, digamos que queremos hacer un programa que nos diga las relaciones familiares de los personajes de Los Simpson. Nuestra base de conocimientos puede decir quién es hombre y quién es mujer: hombre(abraham). mujer(mona). hombre(homero). mujer(paty). mujer(selma). mujer(marge). hombre(bart). mujer(lisa). mujer(maggie). Ahora necesitamos definir las relaciones entre nuestros personajes. Esto también se hace por medio de hechos, de la siguiente manera: Relación(x,y). Lo anterior significa: “x tiene relación con y”. Podemos entonces hacer relaciones como las que siguen: progenitor(homero,bart). progenitor(marge,bart). progenitor(homero,lisa). progenitor(marge,lisa). progenitor(marge,maggie). progenitor(abraham,homero). progenitor(mona,homero). Ahora, supongamos que queremos saber quiénes son las hermanas o los abuelos de una determinada persona. Podríamos utilizar hechos…pero entonces no estaríamos programando, sino meramente declarando relaciones. Podemos hacer que Prolog deduzca las relaciones. Para esto declaramos una regla de inferencia. Una regla de inferencia es una serie de proposiciones lógicas separadas por comas. Se van evaluando una a una y si alguna resulta devolver falso, toda la proposición resulta falsa. Por ejemplo, para deducir quién es el abuelo de alguien debemos encontrar al hombre que es el padre del padre de la persona. Aquí se usa la llamada unificación de variables. Esto quiere decir que cuando le hacemos una consulta al intérprete de Prolog, le decimos que nos busque todos los valores posibles de alguna variable (denotada con mayúscula) dada cierta regla lógica. Por ejemplo, consideremos los siguientes enunciados: abuelo(X,Y):- hombre(Y), progenitor(P,X),progenitor(Y,P). //Y es abuelo de X si Y es hombre, existe un P tal que P es progenitor de X y Y es progenitor de P. abuela(X,Y):- mujer(Y), progenitor(P,X),progenitor(Y,P). //Y es abuela de X si Y es mujer, existe un P tal que P es progenitor de X y Y es progenitor de P. hermano(X,Y):- hombre(Y), progenitor(E,X),progenitor(E,Y), X \= Y. // Y es hermano de X si Y es hombre, existe un E que sea progenitor de X y de Y, y Y no es la misma persona que X. hermana(X,Y):- mujer(Y), progenitor(E,X),progenitor(E,Y), X \= Y. // Y es hermana de X si Y es mujer, existe un E que sea progenitor de X y de Y, y Y no es la misma persona que X.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.