PROLOG (III): Un primer programa

 Posted on 

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.

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 campo de 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


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

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

Para leer más:

Comentarios

Entradas populares de este blog

SDR - Software Defined Radio - IIIb: Receptores RSP o MSI (MSI3001: MSI2500 + MSI001)

Antena exterior logarítmica UHF/VHF : Metronic 425010 - Ia Características

ESP32 LoRa for dummys - Inicio