PROLOG (III): Un primer programa

El ciclo de programación es escribir y probar. Para escribir un programa podemos usar desde un sencillo Bloc de Notas, a un editor como el ZeroBrane Studio (el que uso últimamente y al que me aficioné desarrollando en LUA) a un entorno como Eclipse.

Sencillo programa genearologico en PROLOG

Vamos a analizar este primer programa:Los comentarios se pueden escribir entre «/*» «*/» o tras el signo «%«

Los hechos se escriben como relación(valor1,valor2) y así «José es el padre de Juan» se codifica como «padre(jose, juan).» Las sentencias se terminan en «.» y los valores comienzan por minuscula y el nombre de las variables con mayusculas.

Una regla (Clausula de Horn, cláusulas con al menos un literal positivo) como «la abuela es la madre de la madre o la madre del padre» se codifica como » abuela(A,C) :- madre(A,B), madre(B,C) ; madre(A,B), padre(B,C):«. Siendo «:-» el equivalente del «if» condicional la «,» es un «AND LOGICO» o «Y gramatical» y el «;» el «OR LOGICO» o «O gramatical«.

La forma de aprender a programar es programando, así que imagine cualquier campod e conocimiento y escriba su programa en PROLOG.

Antes de ejecutar nuestro programas tenemos que asegurarnos que el interprete va a poder localizar el fuente, para poderlo cargar e interpretar. Para ello lo primero que debemos conocer es cual es el directorio de trabajo de nuestro interprete, cosa que podemos conocer con el comando «working_directory(CWD, CWD).» o con «pwd»(Les sonará a los que han trabajado con UNIX alguna vez), en el caso que queramos modificar el directorio de trabajo por, por ejemplo «//Users/Juan/Applications/» ejecutariamos el comando de nuevo pero como «working_directory(CWD,»//Users/Juan/Applications/»).» Para conocer el contenido del directorio de trabajo usamos el comando, que en nuestro caso sería «directory_files(«/applications/»,DIR).»

En todos estos comandos el primer campo es el de entrada «+» y el segundo la salida ««.

Si nuestro programa se llama «familia.pl» podemos conocer su path absoluto con el comando «absolute_file_name(«prolog-1.pl»,A).» que en nuestro caso responde con «A = ‘/Users/Juan/Applications/prolog-1.pl’.«

Para cargar en memoria el programa ejecutamos el comando «consult(«/Users/Juan/Applications/familia.pl»).» , «consult(familia)» o su equivalente «[familia].» Si queremos recargar el programa podemos hacer «reconsult(familia)«

Ahora ya podemos comenzar a interpelar a nuestra base de conocimientos

En la primera entrada preguntamos «¿De quién es padre jose?» a lo que nos responde «juan», en la segunda «¿Es jose el padre de juan» a lo que nos responde «true» (cierto), en la tercera «¿jose es el padre de mariajo?» a los que nos responde «false» (falso), en la cuarta «¿Cómo se llaman los nietos de jose?» a lo que nos responde primeramente «damian» tras lo cual da «false» cuando le pedimos más con «;», la quinta es una repetición

De nuevo le invito a jugar con su imaginación a la hora de preguntar a la base de conocimiento

En el primer caso preguntamos por los hijos de jose o los de arturo mediante «;«, y en el segundo por los hijos comunes con «,«

Un listado exhaustivo de todos hechos se consigue con el comando findall, cuyo formato es findall(+Template, :Goal, -Bag) así para encontrar todos los hijos de cualquier padre haremos «findall(X,padre(_,X),Lista)«y nos devolverá «Lista = [juan, mariajo, damian]«

Si encontramos algún problema en la ejecución podemos invocar el modo de traceo mediante «trace» y salir de él con «nodebuger».

Por ultimo debe ser consciente que una misma base de conocimiento puede codificarse de muchas formas, por ejemplo la definición de padre y madre puede escribirse de la siguiente forma

Una posibilidad de las reglas en PROLOG es la recursividad, que permite una regla llamarse a si misma. Con el ejemplo del calculo del Factorial de un número lo veremos con facilidad

La primera regla define que el factorial de 0 es 1. En la segunda regla damos en N el valor del cual queremos calcular el valor de su factorial que nos devuelve en F, en donde Nsea mayor que 0, decrementa el valor de N, invoca a factorial y multiplica el resultado parcial por el valor de N

En entradas sucesivas analizaremos otros aspectos del lenguaje y por último hablaremos de manuales de usuarios (user manual) o cursos que le ayuden a profundizar en el manual de referencia de SWI-PROLOG que es muy extenso y poco didáctico como todos los «references manuals»