1 - Prolog

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 23

UNIVERSIDAD NACIONAL PEDRO RUIZ GALLO FACULTAD DE CIENCIAS FSICAS Y MATEMTICAS ESCUELA PROFESIONAL DE COMPUTACIN E INFORMTICA

INTELIGENCIA ARTIFICIAL
UNIDAD II: Introduccin AL Lenguaje de programacin Lgica
3. FUNDAMENTOS DE PROLOG........................................................................................................................................2 3.1 PROGRAMACIN LGICA ...........................................................................................................................................3 3.2 PROGRAMAS EN PROLOG .........................................................................................................................................3 3.3 COMENTARIOS .......................................................................................................................................................... 13 4. 5. ENTORNO DE DESARROLLO PROLOG ...................................................................................................................... 13 FUNDAMENTOS DE VISUAL PROLOG ........................................................................................................................ 14

Docente: Ing. Mara Ncida Malca Quispe

3. FUNDAMENTOS DE PROLOG
PROLOG es un lenguaje interpretado basado en la lgica de predicados de primer orden. Puede ser visto como un lenguaje de programacin o como un demostrador mecnico de teoremas. Un predicado representa una propiedad o relacin de un determinado objeto del universo del discurso. Un predicado de primer orden es aquel que se refiere a propiedades de objetos y relaciones entre ellos: Ejm: rubia(sara). moreno(carlos). novia(sara,carlos). primos(X,Y):-progenitor(A,X),progenitor(B,Y),hermanos(A,B). La lgica de predicados de primer orden estudia razonamientos de tipo deductivo, exactos (true/false) y basados en predicados de primer orden. Fue implementado a principios de los aos 70 por Alain Colmerauer y junto con Lisp son los lenguajes que histricamente se han utilizado para construir aplicaciones en gran parte de las ramas de IA. En Prolog, las soluciones se alcanzan deduciendo lgicamente una cosa de algo ya conocido. Un programa Prolog no es una secuencia de acciones, sino una coleccin de hechos, junto con una secuencia de reglas para extraer conclusiones a partir de los hechos. Prolog es un lenguaje declarativo, lo que significa que un programa escrito en Prolog est mucho ms cercano al lenguaje natural que los lenguajes imperativos (Basic, C, Pascal, etc). El lenguaje incluye una mquina de inferencia, que no es ms que un procedimiento general para razonar acerca de la informacin. Esta mquina de inferencia se encarga de responder a las preguntas que se realicen al sistema, intentando deducir la informacin a partir de los hechos conocidos y de las reglas del programa. Aunque Prolog no permite escribir programas mediante sentencias del lenguaje natural (el compilador sera increblemente complejo), la sintaxis est bastante cercana. Concretamente, se usa un subconjunto de la lgica de predicados para representar la informacin. Por ejemplo: Lenguaje natural Un coche es divertido. Una rosa es roja. A Juan le gusta un coche si es divertido. Lgica de Predicados divertido(coche). roja(rosa). gusta(juan,Coche) si divertido(Coche).

Prolog es un lenguaje declarativo e interpretado. Esto quiere decir que el lenguaje se usa para representar conocimientos sobre un determinado dominio y las relaciones entre objetos de ese dominio. A partir de ese conocimiento, el propio sistema deduce respuestas a cuestiones que se le planteen, es decir, realiza una inferencia. El dominio lo constituyen un conjunto de objetos, y el conocimiento se formaliza mediante un conjunto de relaciones (reglas) que describen de forma simultnea propiedades de los objetos y sus interacciones. Por tanto, escribir un programa de Prolog consiste en declarar el conocimiento disponible acerca de: Objetos: Tanto sus propiedades (por ejemplo, X es par, X es un hombre) como las relaciones entre ellos (por ejemplo, X es mltiplo de Y, X es padre de Y). Reglas: Determinan interacciones lgicas entre los objetos, del tipo si ocurren q y r, entonces ocurre p.

Docente: Ing. Mara Ncida Malca Quispe

La ventaja de este tipo de lenguaje frente a lenguajes procedimentales (como Java, C) es que no hay que preocuparse de cmo resolver algo; la desventaja es que la resolucin automtica no siempre es eficiente.

3.1

PROGRAMACIN LGICA
La programacin lgica implica el uso de: Hechos y reglas para representar la informacin Deducciones para responder consultas

Los programadores proporcionamos los hechos y las reglas, mientras que el lenguaje usa la deduccin para calcular respuestas a consultas. Un programa lgico se configura como un conjunto de hechos (asertos o proposiciones) y de reglas lgicas previamente establecidas, que generan conclusiones ya sea a partir de una serie de preguntas o cuestiones lgicas, de modo que tales conjuntos de hechos o asertos y reglas permitirn deducir nuevos hechos. Un programa se estructura de la siguiente forma: Lgica + Control + Estructuras de datos = Programa , donde: A. Lgica: Constituida por a. Hechos: Que permiten establecer relaciones entre objetos o propiedades de stos. Ejemplo: Chita es amiga de Tarzan OBJETOS: Chita y Tarzan RELACION: amiga

b. Reglas Lgicas: Expresan que un hecho depende de un grupo de otros hechos. Ejemplo: X es el abuelo paterno de Y si X es el padre de Z Z es el padre de Y B. Control: Inherente al sistema, son las estrategias a seguir para investigar las cuestiones lgicas. Ejemplo: estrategia de bsqueda primero en profundidad. C. Estructura de Datos: Son los elementos que soportan la base de conocimiento y cuestiones lgicas. Ejemplo: variables, listas, constantes, etc.

3.2

PROGRAMAS EN PROLOG

Los programas en Prolog se componen de clusulas de Horn que constituyen reglas del tipo "modus ponendo ponens", es decir, "Si es verdad el antecendente, entonces es verdad el consecuente": p1() p2() pm() p(t1, t1, , tn)

Cuerpo: Antecedente

Cabeza: Consecuente

, donde tan p como las pi son smbolos predicados con sus argumentos entre parntesis. Los argumentos de un predicado se les denominan trminos.
La regla anterior se interpreta como: Si se verifican p1, p2, y pn entonces se verifica p. Docente: Ing. Mara Ncida Malca Quispe 3

No obstante, en Prolog la forma de escribir las clusulas de Horn es al contrario de lo habitual. Primero se escribe el consecuente y luego el antecedente:

Las reglas son implicaciones lgicas, que pueden tener varios antecedentes pero un nico consecuente. Ejemplo humano(X) mortal(X). , que utilizando la sintaxis de Prolog se escribe: mortal(X):- humano(X). Las clusulas de Horn son expresiones condicionales, siendo el smbolo :-, el condicional o smbolo de implicacin (normalmente en lgica se utiliza el smbolo). As la clusula anterior podra leerse de la siguiente forma:

Cuando m=0, la clusula no tiene parte derecha (antecedente), en este caso diremos que se trata de un hecho o afirmacin.

Los hechos son afirmaciones que consideramos ciertas en el programa. Cuando la clusula no tiene parte izquierda, se trata de una pregunta; este tipo de clusulas se utilizan para realizar la entrada/salida del programa.

3.2.1

Predicados, Clusulas y Trminos En Prolog un programa est constituido por una secuencia de clusulas (a veces llamadas frmulas o sentencias). Estas clusulas deben representar todo el conocimiento necesario para resolver el problema. Se pueden diferenciar tres tipos de clusulas: Hechos (afirmaciones): Se puede representar objetos, propiedades de objetos, relaciones entre objetos. Reglas Consultas/Preguntas

Cada clusula puede estar formada por instancias de uno o varios predicados. Las clusulas deben terminar obligatoriamente en un punto (.) Los predicados expresan una relacin entre un conjunto de objetos, denominados trminos. Con un predicado podemos representar algo que sucede en el mundo real (hecho), o una regla (regla de inferencia), que nos permite deducir hechos que suceden en ese dominio mediante la aplicacin de la misma. Cada predicado est definido unvocamente por su nombre y su aridad. La aridad es el nmero de argumentos (parmetros, o trminos) de un predicado.

Docente: Ing. Mara Ncida Malca Quispe

Ejemplo, se tienen las siguientes clusulas (hechos): humano(pepe). humano(juan). Para referenciar este predicado se utiliza nicamente su nombre y aridad: humano/1. Cada predicado en Prolog puede estar definido por una o ms clusulas. En el ejemplo, humano/1 est definido por dos clusulas.

Aridad 0 1

Tipo de predicado

Representa Hechos simples o Proposiciones.

Predicado Llueve/0 alto/1 mujer/1 moreno/1 hombre/1

Instanciad de predicados llueve. alto(juan). mujer(X). moreno(X). hombre(Y). padre_de(jose,manuel). padre_de(Padre,Hijo). madre_de(Madre,Hijo). tiene(Per,Obj). le_gusta_a(X,Y). regala(Per1,Obj,Per2).

Mondico

Propiedades entre objetos.

>1

Polidico

Relaciones entre objetos.

padre_de/2 madre_de/2 tiene/2 le_gusta_a/2 regala/3

Todas las clusulas cuyas cabezas tienen el mismo nombre y aridad forman un predicado (o una definicin de procedimiento). Por ejemplo, veamos un predicado formado por tres clusulas, dos de las cuales son hechos y la otra es una regla: elefante(dumbo). elefante(jumbo). elefante(X):-gris(X),mamfero(X),tieneTrompa(X). Ntese que este predicado nos da tres formas distintas de llegar a la conclusin de que X es un elefante; o es dumbo, o es jumbo, o es gris, mamfero y tiene trompa.

Trminos

Docente: Ing. Mara Ncida Malca Quispe

3.2.2

Trminos Son construcciones simblicas que representan objetos del universo del discurso, y pueden ser: Trminos simples: constantes simblicas o numricas Ejemplo: a, x, juan, 2, caso_1, -1.73 Variables Ejemplo: Algo, X, Hombre, _caso_1 Trminos estructurados listas funciones Constantes Dan nombre a objetos concretos del dominio, representan individuos conocidos: juan, maria, 20 Hay dos clases de constantes: tomos y nmeros. tomo: Los tomos hacen las funciones de identificadores en Prolog. Un tomo puede ser cualquier combinacin de letras y nmeros (y algunos signos). Comenzar con una letra minscula. Pueden contener el carcter _ (subrayado). Si van entre comillas dobles ( ), puede contener cualquier carcter.

Ejemplo: Vlidos unatomo otro_atomo Atomo 2+3 un atomo Nmeros: Se utilizan para representar nmeros de forma que se puedan realizar operaciones aritmticas. Depende de la implementacin. Al menos integer y float (enteros y flotantes). No Vlidos un atomo _otro_atomo Atomo 2+3

Docente: Ing. Mara Ncida Malca Quispe

Variables Representan objetos cualesquiera del Universo u objetos desconocidos en ese momento, es decir, son las incgnitas del problema. Una variable est: instanciada cuando existe un objeto representado por ella. no instanciada cuando todava no se sabe lo que representa la variable.

Cuando una variable es instanciada su contenido no puede cambiar. Una variable puede ser instanciada a cualquier otro trmino, incluida otra variable. No son equivalentes a las variables en los lenguajes procedurales, sino a las variables lgicas o matemticas. El nombre de una variable ha de comenzar por una mayscula o _, y puede contener cualquier combinacin de letras, nmeros y el carcter subrayado (_). Ejemplo: Suma X2 _32 _ Algo _ El carcter subrayado _ solamente, es un tipo de variable especial que se denomina variable annima. sta se utiliza para escribir variables sin necesidad de darles un nombre. Cada aparicin del carcter subrayado representa una variable distinta. Esta variable no queda instanciada, pues no necesitaremos su valor. 3.2.3 Hechos, Consultas y Reglas Hechos Los hechos son el mecanismo bsico para representar: Objetos/personas/conceptos. Propiedades de los objetos. Relaciones entre los objetos.

En Prolog, una relacin entre objetos recibe el nombre de predicado. En el lenguaje natural, una relacin se expresa mediante sentencias. Por ejemplo: Juan tiene un perro. Elena tiene un coche. Juan tiene un libro.

Docente: Ing. Mara Ncida Malca Quispe

Por el contrario, en Prolog usamos un smbolo de predicado que contiene (entre parntesis) los distintos objetos a los que afecta dicho predicado. Por ejemplo, las tres sentencias anteriores se expresaran as: tiene(juan,perro). tiene(elena,coche). tiene(juan,libro). Los hechos no slo pueden expresar relaciones entre objetos, sino tambin propiedades de los mismos. Por ejemplo, las sentencias del lenguaje natural Juan es alto. o Elena es rubia. se expresaran en Prolog as: alto(juan). rubia(elena). Los hechos son las sentencias ms sencillas. Un hecho es una frmula: p(t1, ..., tn) , e indica que se verifica la relacin (predicado) p sobre los objetos (trminos) t1, ..., tn. Ejemplos: es_padre(abraham, isaac), es un hecho que indica Abraham es padre de Isaac es_hombre(abraham), es un hecho que indica Abraham es un hombre suma(3,2,5), es un hecho que indica la suma de 3 y 2 es 5 Un conjunto de hechos constituye un programa (la forma ms simple de programa lgico) que puede ser visto como una base de datos que describe una situacin. Por ejemplo, el siguiente programa refleja la base de datos de las relaciones familiares que se muestran en el siguiente grfico:

Todos los hechos de este programa son hechos de base (sin variables), pero tambin se pueden introducir hechos con variables como axiomas, por ejemplo: suma(0, X, X). En ellos, las variables se consideran cuantificadas universalmente. Es decir: x suma(0, x, x) Al igual que el hecho es_mujer(sarah) establece la verdad de la sentencia "Sarah es mujer", el hecho suma(0, X, X) establece la verdad para cualquier valor que pueda tomar la variable, es decir, nos dice que "para todo trmino x, la suma de 0 con x es x" . Equivale a un conjunto de hechos de base como seran: suma(0, 1, 1), suma(0, 2, 2), etc. Docente: Ing. Mara Ncida Malca Quispe 8

Algunas consideraciones para definir los hechos: El nombre de los objetos y relaciones empiezan una letra minscula. Primero se escribe la relacin y despus los objetos a modo de argumentos (trminos), entre parntesis y separados por comas (,). Se permite _ para separar caracteres. Al final debe aparecer un punto (.)

Consultas Una vez que se tiene el programa describiendo una situacin, se pueden hacer preguntas (consultas) para obtener informacin acerca de l. Por ejemplo, podemos hacer preguntas al Programa 1 del tipo siguiente:

Estas preguntas sencillas se llaman fines (metas). Como puede verse en la lectura de las preguntas, en stas se consideran las variables cuantificadas existencialmente. Tambin se pueden hacer preguntas ms complejas, como CONJUNCIN de metas, de la forma:

Reglas Las reglas nos permiten deducir hechos a partir de otros hechos. Por ejemplo, dadas los siguientes hechos: Juan tiene un perro. Elena tiene un coche. Juan tiene un libro. Juan es alto. Elena es rubia. , y las siguientes reglas: Pedro tiene todo lo que tiene Juan. Ana es rubia si lo es Elena. Podemos deducir los nuevos hechos: Pedro tiene un perro. Pedro tiene un libro. Ana es rubia.

Docente: Ing. Mara Ncida Malca Quispe

Las reglas anteriores se codificaran en Prolog as: tiene(pedro,X):- tiene(juan,X). rubia(ana):- rubia(elena). Las reglas de inferencia se pueden definir como la especificacin de una relacin entre predicados y argumentos, que permiten plasmar el hecho de que si la parte derecha del predicado se cumple, se cumple la parte izquierda. El smbolo :- se pronuncia simplemente si, y sirve para separar las dos partes de la regla: la cabeza y el cuerpo. Desde el punto de vista lgico, el smbolo :- equivale a una implicacin de derecha a izquierda (). Las reglas son sentencias de la forma: A :- B1 , ... , Bn. , donde A y cada Bi son predicados. A es la cabeza de la regla y los Bi's componen el cuerpo de la regla. La correspondencia entre smbolos es la siguiente: Lgica de Primer Orden Prolog

:, ;

Ejemplo: Una regla que define la relacin ser hijo a partir de las relaciones dadas podra ser: es_hijo(X,Y) :- es_padre(Y,X), es_hombre(X). , que se leera de la forma: para cualesquiera X e Y, X es hijo de Y si Y es padre de X y X es hombre", ya que se corresponde con la frmula lgica: x y ( (es_padre(y,x) es_hombre(x)) es_hijo(x,y)) De igual forma se definiran otras relaciones mediante reglas: es_hija(X,Y) :- es_padre(Y,X), es_mujer(X). es_abuelo(X,Y) :- es_padre(X,Z), es_padre(Z,Y). La ltima regla podra leerse "para cualesquiera X e Y, X es abuelo de Y, si existe algn Z tal que X es padre de Z y Z es padre de Y", que se corresponde con la frmula:

x z ( z(es_padre(x,z) es_padre(z,y)) es_abuelo(x,y))


Con estas tres nuevas relaciones entre objetos y los hechos de base anteriores podemos crear el siguiente Programa 2.

Ahora podemos hacer preguntas al Programa 2 sobre las nuevas relaciones introducidas:

Docente: Ing. Mara Ncida Malca Quispe

10

Otras preguntas y respuestas a este programa seran:

g Como se observa, las reglas de inferencia permiten llevar a cabo la deduccin de metas. Para que las reglas de inferencia sean aplicables, en general, deber existir un conjunto de hechos sobre los que apoyarse para que las demostraciones se puedan realizar. Las metas representan los problemas especficos, basados en los problemas generales expresados en la base de conocimientos que deseamos que el demostrador automtico de teoremas resuelva. Si nos fijamos, para escribir programas en Prolog, siempre debemos tener en cuenta que el demostrador resuelve las metas comenzando por los predicados situados en la zona superior (de arriba a abajo), y para cada predicado el proceso de unificacin se lleva a cabo de izquierda a derecha.

Cuantificacin de Variables Los smbolos de cuantificacin para las variables, estn implcitamente determinados. Si las frmulas atmicas de un programa lgico contienen variables, el significado de estas es: Las variables que aparecen en los hechos estn cuantificadas universalmente.

Significa que a jorge le gusta cualquier cosa. Las variables que aparecen en la cabeza de las reglas estn cuantificadas universalmente.

Docente: Ing. Mara Ncida Malca Quispe

11

Las variables que aparecen en el cuerpo de la regla, pero no en la cabeza, estn cuantificadas existencialmente.

Significa que para toda pareja de personas, una ser el abuelo de otra si existe alguna persona de la cual, el primero es padre y a su vez es padre del segundo. Las variables que aparecen en las preguntas (metas) estn cuantificadas existencialmente.

Pregunta si existe algo que le guste a jorge, ya que utilizamos refutacin y por tanto negamos lo que queremos demostrar Conectivos Lgicas Siendo X e Y instancias de predicados, se tiene: La conjuncin y (X,Y) Objetivos separados que Prolog debe satisfacer, uno despus de otro, por orden Para que se satisfaga la secuencia se tendrn que satisfacer todos los objetivos. La disyuncin o (X;Y) Tendr xito si se cumple alguno de los objetivos que la componen. Tambin la podemos representar poniendo cada miembro de la disyuncin en una clusula aparte. La negacin lgica (not X) NO puede ser representada explcitamente en Prolog. Se puede utilizar el predicado estndar not. La implicacin o condicional (:-) Sirve para especificar que un hecho depende de un grupo de otros hechos. Se usa el smbolo :- para representar lo que llamamos una regla. La cabeza describe el hecho que se intenta definir; el cuerpo describe los objetivos que deben satisfacerse para que la cabeza sea cierta:

Clusulas Generales usando Variables El uso de variables en Prolog nos permite escribir sentencias de carcter general. Por ejemplo, la sentencia Pedro tiene todo lo que tiene Juan se puede escribir en Prolog as: tiene(pedro,Algo) :- tiene(juan,Algo). En una consulta simple, las variables nos pueden servir para que que Prolog encuentre un dato. Por ejemplo, la consulta: tiene(X,coche). , nos devuelve en la variable X el nombre de la persona que tiene un coche (o de las personas que lo tienen, si hay ms de una). La eleccin de un nombre adecuado para las variables suele hacer el programa ms legible. Por ejemplo, la consulta anterior estara mejor as: tiene(Persona,coche). Docente: Ing. Mara Ncida Malca Quispe 12

Variables Annimas Cuando slo deseamos extraer cierta informacin de una consulta, se usa un tipo especial de variables denominadas variables annimas. En Prolog, una variable annima se denota por un smbolo de subrayado (_). Por ejemplo, consideremos la siguiente regla: hijo(X) :- padre (X,Y). La regla dice, para toda X, X tiene un hijo si X es el padre de alguna Y. Nosotros estamos definiendo la propiedad hijo el cual, no depende del nombre del hijo. Entonces, aqu hay un lugar en donde podemos usar una variable annima. Si rescribimos la clusula: hijo(X) :- padre(X,_). Asignacin de valores a las Variables En Prolog no existe una instruccin de asignacin. Esto resulta una de las diferencias fundamentales entre Prolog y el resto de lenguajes de programacin. Las variables en Prolog toman valores al ser igualadas a constantes en los hechos o reglas del programa. Hasta el momento en que una variable toma un valor, se dice que est desinstanciada; cuando ha tomado un valor, se dice que est instanciada (a dicho valor). Sin embargo, una variable slo permanece instanciada hasta el momento en que obtenemos una solucin. Despus, se desinstancia, y se procede a buscar nuevas soluciones. En consecuencia, no es posible utilizar las variables de Prolog para almacenar informacin.

3.3

COMENTARIOS

Los comentarios en un programa Prolog se pueden escribir de dos formas distintas: Si se trata de un comentario que ocupa varias lneas, debemos comenzarlo con /* y terminarlo con */ Cuando el comentario es breve, podemos usar el smbolo %, el cual provoca que todo lo que quede a su derecha en la misma lnea se considere un comentario.

4. ENTORNO DE DESARROLLO PROLOG


Prolog es un lenguaje de programacin seminterpretado. Su funcionamiento es muy similar a Java. El codigo fuente se compila a un cdigo de byte el cul se interpreta en una mquina virtual denominada Warren Abstract Machine (comnmente denominada WAM). Por eso, un entorno de desarrollo Prolog se compone de: Un compilador. Transforma el cdigo fuente en cdigo de byte. A diferencia de Java, no existe un standard al respecto. Por eso, el codigo de byte generado por un entorno de desarrollo no tiene por que funcionar en el intrprete de otro entorno. Un intrprete. Ejecuta el cdigo de byte. Un shell o top-level. Se trata de una utilidad que permite probar los programas, depurarlos, etc. Su funcionamiento es similar a los interfaces de lnea de comando de los sistemas operativos.

Docente: Ing. Mara Ncida Malca Quispe

13

Una biblioteca de utilidades. Estas bibliotecas son, en general, muy amplias. Muchos entornos incluyen (afortunadamente) unas bibliotecas standard-ISO que permiten funcionalidades bsicas como manipular cadenas, entrada/salida, etc.

Generalmente, los entornos de desarrollo ofrecen extensiones al lenguaje como pueden ser la programacin con restricciones, concurrente, orientada a objetos, etc. Existe un standard ISO que dicta las tpicas normas con respecto a la sintaxis del lenguaje y a las bibliotecas bsicas que se deben ofrecer. Actualmente el standard no contempla todos los aspectos del lenguaje, y adems, no todos los entornos siguen el standard al pie de la letra. Por eso, programas que funcionan en unos entornos podran no funcionar en otros, o lo que es peor, funcionar de forma diferente.

5. FUNDAMENTOS DE VISUAL PROLOG


Caractersticas del lenguaje Visual Prolog es un lenguaje de programacin de quinta generacin especialmente orientado al desarrollo de aplicaciones de bases de datos, interfaces basadas en lenguaje natural, parsers y compiladores, sistemas expertos, etc. Los tiempos de desarrollo de una aplicacin en Visual Prolog pueden llegar a ser hasta 10 veces menor que en otro lenguaje de programacin como C o Pascal, debido al alto nivel de abstraccin del lenguaje. Pese a ello, dispone de un compilador capaz de generar cdigo mquina tan eficiente como un buen compilador de C. Por otro lado, Visual Prolog es un lenguaje abierto, es decir, permite generar rutinas que se pueden invocar desde aplicaciones escritas en C, C++ o ensamblador. De forma anloga, una aplicacin en Visual Prolog puede invocar rutinas escritas en los lenguajes C, C++, Pascal o ensamblador.

Programas en Visual Prolog


Declarar algunos HECHOS sobre los objetos y sus relaciones. Definir algunas REGLAS sobre los objetos y sus relaciones Hacer PREGUNTAS sobre los objetos y sus relaciones.

Para la resolucin de preguntas (metas), utiliza la estrategia de primero hacia abajo (recorrido del rbol en profundidad). Por todo esto, el orden de las clusulas (hechos y reglas) de un determinado procedimiento es importante, para determina el orden en que las soluciones sern encontradas.

A diferencia de otras versiones de Prolog, Visual Prolog es un compilador de Prolog con tipos. Esto significa que hay que declarar los tipos de los objetos sobre los que acta cada predicado. De esta forma, el compilador Prolog puede generar cdigo mquina tan eficiente como un programa compilado en C o Pascal. En general, un programa Visual Prolog incluye cuatro secciones bsicas: clauses, predicates, domains, y goal. La seccin clauses forma el ncleo de un programa Visual Prolog. Aqu es donde aparecen los hechos y las reglas con los que el sistema va a trabajar para ejecutar un objetivo. La seccin predicates contiene la declaracin de los predicados definidos en la seccin clauses, indicando el tipo de sus argumentos. La seccin domains se emplea para declarar dominios (tipos de datos) que no estn predefinidos en el sistema. Docente: Ing. Mara Ncida Malca Quispe 14

La seccin goal contiene el objetivo inicial que provoca el comienzo de la ejecucin del programa (algo as como el cuerpo principal del programa).

a) La seccin clauses En la seccin clauses se incluyen la definicin de hechos y reglas. Una restriccin del lenguaje es que todas las clusulas que definan un mismo predicado deben aparecer consecutivamente en el programa. Una secuencia de clusulas definiendo un mismo predicado, se llama un procedimiento. Cuando Prolog intenta resolver un objetivo, comienza a recorrer todas las clusulas de la seccin clauses en el orden de aparicin de las mismas. Cada vez que encuentra una clusula a la que se pueda igualar el objetivo, se anota la posicin de la misma para la bsqueda de soluciones alternativas (backtracking). Sintaxis de las reglas Una regla est compuesta por dos partes: la cabeza y el cuerpo, separados por el smbolo :- (que se interpreta como un si). La sintaxis genrica para una regla es: cabeza :- subobjetivo1, subobjetivo2, ..., subobjetivoN. Los subobjetivos en el cuerpo de una regla se pueden interpretar como llamadas a procedimiento, las cuales, si tienen xito, provocarn que ciertas variables se instancien a ciertos valores. Es decir, desde el punto de vista procedural, la regla anterior se interpreta as: para ejecutar el procedimiento cabeza, hay que ejecutar las llamadas a procedimiento subobjetivo1, subobjetivo2,. . . , subobjetivoN. Para ejecutar una regla con xito, todos los subobjetivos del cuerpo deben de poder ejecutarse tambin con xito. Si al menos uno de ellos falla, Prolog intenta la ejecucin de otra regla alternativa (si la hay). En esto consiste el mecanismo de backtracking.

b) La seccin predicates Si definimos un predicado en la seccin clauses, debemos declararlo en la seccin predicates, o bien Visual Prolog nos dar un error. Declarar un predicado sirve para decirle al sistema cul es el tipo de los argumentos de un predicado. Visual Prolog incluye un nmero importante de predicados predefinidos (built-in predicates), como, por ejemplo, write, read, +, sqrt, etc. Este tipo de predicados no deben ser declarados en la seccin predicates. Se puede encontrar informacin sobre los predicados predefinidos en el men de ayuda de Visual Prolog.

Cmo declarar predicados definidos por el usuario Una declaracin de predicado comienza con el nombre del predicado. A continuacin, entre parntesis, aparecen los tipos de sus (cero o ms) argumentos. nombrePredicado(tipo_arg1,tipo_arg2,...,tipo_argN) Observa que, a diferencia de lo que ocurre en la seccin clauses, aqu no terminamos la declaracin con un punto. El nombre de un predicado debe comenzar con una letra (minscula), seguida de cualquier nmero de letras, dgitos o subrayados. Los nombres de predicado tienen una longitud mxima de 250 caracteres. En los nombres de los predicados no pueden aparecer espacios en blanco, signos aritmticos, asteriscos, u otros caracteres no alfanumricos (nicamente son vlidos a..z, A..Z y 0..9). Docente: Ing. Mara Ncida Malca Quispe 15

Los argumentos de un predicado deben pertenecer a un dominio. El dominio puede ser un dominio estndar, o bien un dominio definido en la seccin domains. Veamos algunos ejemplos:

Si declaramos un predicado mi predicado en la seccin predicates como sigue: predicates mi_predicado(symbol, integer)

, entonces no es necesario declarar los dominios de sus argumentos en la seccin domains, ya que symbol e integer son dominios estndar. Sin embargo, si declaramos el predicado as: predicates mi_predicado(nombre, numero) , entonces necesitaremos declarar los dominios nombre y nmero en la seccin domains. Por ejemplo, si queremos definirlos simplemente del tipo symbol e integer, respectivamente, lo haramos as: domains nombre = symbol numero = integer predicates mi_predicado(nombre, numero)

El siguiente fragmento de programa muestra una declaracin de dominios y predicados algo ms compleja: domains person, activity = symbol car, make, color = symbol mileage, years_on_road, cost = integer predicates likes(person, activity) parent(person, person) can_buy(person, car) car(make, mileage, years_on_road, color, cost) green(symbol) ranking(symbol, integer)

Cuando declaramos un argumento del tipo symbol, estamos indicndole al compilador que slo podr contener una constante alfanumrica, mientras que integer hace referencia a un nmero entero.

c) La seccin domains La seccin domains nos permite conseguir esencialmente dos cosas:

Docente: Ing. Mara Ncida Malca Quispe

16

Podemos darle nombres particulares a ciertos dominios, pese a que stos ya estn predefinidos (dominios estndar), facilitando la legibilidad del programa, y se detecta un mayor nmero de errores en tiempo de compilacin.

Permite declarar estructuras de datos complejas que no estn predefinidas.

Por ejemplo, supongamos que queremos declarar un predicado que vamos a usar para escribir la siguiente relacin: Paco es un hombre de 45 aos. Usando los dominios estndar, podramos declarar el siguiente predicado: predicates persona(symbol, symbol, integer) Aunque la declaracin es correcta, resultara mucho ms legible el cdigo si lo hacemos as: domains nombre, sexo = symbol edad = integer predicates persona(nombre, sexo, edad)

Adems, con una declaracin de esta forma, el compilador detectara que la siguiente clusula es incorrecta: mismo_sexo(X,Y) :- persona(X,Sex,_), persona(Sex,Y,_).

, mientras que con la declaracin original la compilara sin problemas (ya que los dos primeros argumentos eran symbol).

d) La seccin goal Esencialmente, la seccin goal contiene lo mismo que aparece en el cuerpo de cualquier regla, es decir, no es ms que una secuencia de subobjetivos. La nica diferencia es que la secuencia de subobjetivos en la seccin goal se ejecuta automticamente al ejecutar el programa (sera equivalente al cuerpo principal del programa). Si alguno de los subobjetivos de goal falla, el programa completo falla (pese a que, desde un punto de vista externo, esto no marca ninguna diferencia, simplemente se termina la ejecucin).

Dominios Estndar Visual Prolog dispone de varios dominios estndar que se pueden emplear en la declaracin de los predicados. Estos dominios no deben declararse en la seccin domains. Los dominios estndar para los nmeros enteros son:

Docente: Ing. Mara Ncida Malca Quispe

17

En general, los dominios integer y unsigned suelen ser suficientes y, adems, se adaptan bien a la plataforma en que se est trabajando. La siguiente tabla muestra el resto de dominios estndar de Visual Prolog:

Los objetos de tipo symbol y string se pueden intercambiar sin problemas. Sin embargo, Visual Prolog los almacena de forma distinta: un objeto de tipo symbol se almacena en una tabla de smbolos, y se identifica nicamente por la direccin en la que est almacenado (el ajuste entre este tipo de objetos resulta muy eficiente) un objeto de tipo string se almacena como un vector de caracteres (con lo que el ajuste entre este tipo de objetos es algo ms lento, ya que tiene que comparar los dos strings carcter a carcter). La eleccin de uno u otro dominio depender del uso que le vayamos a dar en el programa. Por ejemplo, si no vamos a necesitar acceder a los caracteres del objeto, lo ms adecuado sera definirlo como symbol. Observa que las secciones predicates, clauses y goal son obligatorias en todos los programas. La seccin domains, por ejemplo, es opcional. Concretamente, si todos los dominios empleados en la seccin predicates son estndar, la seccin domains no es necesaria.

Algunos Predicados Estndar Existe un conjunto de predicados predefinidos en Prolog que podrs utilizar en tus programas.

Docente: Ing. Mara Ncida Malca Quispe

18

Predicados (operadores) de comparacin


X e Y han de estar instanciadas a dos valores numricos; comprueba que la primera sea menor que la segunda. X e Y han de estar instanciadas a dos valores numricos; comprueba que la primera sea mayor que la segunda. X e Y han de estar instanciadas a dos valores numricos; comprueba que la primera sea menor o igual que la segunda. X e Y han de estar instanciadas a dos valores numricos; comprueba que la primera sea mayor o igual que la segunda. Unifica X a Y.

X<Y X>Y X <= Y X >= Y X=Y

Entrada/Salida estndar

A continuacin, se muestran algunos predicados bsicos para poder realizar operaciones de entrada/salida desde/sobre el terminal de salida de la computadora.
nl readln(-Term) readreal(-Term) readint(-Term) write(+Term) writef(+Term) Escribe el trmino Term sobre la salida estndar. Escribe una lnea en blanco (caracter newline) sobre la salida estndar actual. Lee un trmino desde la entrada estndar del dispositivo.

La seccin constants En un programa, es posible definir constantes simblicas dentro de la seccin constants. La sintaxis es la siguiente: constants <id> = <definicion> , donde <id> es el nombre de la constante simblica, y <definition> es el valor que le estamos asignando a dicha constante. Por ejemplo, podemos encontrar una declaracin de constantes como esta: constants cero = 0 uno = 1 dos = 2 cien = (10*(10-1)+10) pi = 3.141592653

Como es habitual, antes de realizar la compilacin del programa, Visual Prolog reemplaza la aparicin de cada constante simblica en el cdigo por su valor. Existen, sin embargo, unas pocas restricciones sobre el uso de constantes simblicas: La definicin de una constante no puede autoreferenciarse. Por ejemplo: error = 2*error , generara un mensaje de error. El sistema no distingue entre maysculas y minsculas en los nombre de constantes. Por tanto, aunque se declare una constante: Docente: Ing. Mara Ncida Malca Quispe 19

constants Dos = 2 , en el programa habr que emplearla en minsculas (para evitar que se confunda con una variable). Es decir, escribiremos: goal A = dos, write(A). , y no: goal A = Dos, write(A). (lo que producira un error). Pueden aparecer varias secciones de declaracin de constantes en un programa, pero estas deben declararse siempre antes de la primera vez que se usen. La declaracin de una constante es vlida desde el punto en el que se define hasta el final del fichero fuente, pero no pueden declararse varias constantes con el mismo identificador.

Aridad mltiple La aridad de un predicado es el nmero de argumentos que tiene. Podemos definir varios predicados con el mismo nombre y distinta aridad. Visual Prolog permite la definicin de un predicado con distintas aridades, exigiendo nicamente que sus definiciones deben aparecer agrupadas tanto en la seccion predicates como en la seccin clauses. Por lo dems, cada versin del predicado con una aridad distinta se considera como un predicado completamente distinto.

Ejemplo: domains person = symbol predicates nondeterm father(person) nondeterm father(person,person) clauses father(adam,seth). father(abraham,isaac). father(Man):goal father(X). father(Man,_).

Variables lgicas, sustituciones e instancias. Una variable lgica significa la especificacin de algo indeterminado. Por ejemplo padre(juan,X). , para obtener la respuesta X=maria (si est definido en la base de conocimientos)

Docente: Ing. Mara Ncida Malca Quispe

20

Una consulta que contiene variables se debe comprender como encontrar los valores que se pueden asignar a la variable para que la consulta sea una consecuencia lgica del programa (verdadero). Las variables tienen aqu un significado distinto al del que tienen en los lenguajes del paradigma imperativo: no son una posicin de memoria, sino una incgnita, una indeterminacin de la identidad de los valores que cumplen una relacin. En este paradigma de programacin, una variable una vez ligada a un valor no puede cambiar de estado.

Sea el siguiente programa: predicates prueba clauses prueba:- Resultado = 3 + 2, write (Resultado), nl,Resultado = 3 - 2, write (Resultado). goal prueba. Donde el predicado write emite por pantalla variables o literales, y nl emite un carcter <ENTER>, qu sucede al ejecutarse? Aparece en pantalla: 5 false.

Para entender el concepto de variable, veamos paso por paso cada hecho. Prueba ser verdadero si se logran verificar los cuatro antecedentes: Resultado debe ser igual a 3 + 2. Como inicialmente Resultado no est ligado a ningn valor, se produce una asignacin de Resultado a 5. El siguiente hecho imprime el valor 5 por pantalla, y como ambos hechos se cumplen, la sentencia continua (el objetivo es probar que prueba es verdadero). Luego se imprime un <ENTER> y continua con el siguiente hecho, que pide que la variable Resultado sea igual a 3 2. Resultado ya est asignado a 5, por lo tanto, se produce una comparacin 5 = 1, y por lo tanto, el predicado prueba falla.

En resumen: La variable, una vez ligada a un valor, no puede volverse a asignar a otro, y por eso el hecho X = X + 1 es siempre falso.

Principio de Funcionamiento La Programacin Prolog se basa en la generacin de una Base de Conocimiento y la posterior consulta a la misma en busca de hechos explcitamente declarados u otros que se puedan inferir de los antedichos (mediante el empleo de reglas). Sea el siguiente programa Prolog: domains nombre=symbol predicates varon(nombre) mujer(nombre) Docente: Ing. Mara Ncida Malca Quispe 21

clauses varon(marcos). varon(nicolas). mujer(victoria). mujer(laura). goal varon(Quien).

Al ejecutar el programa anterior, prolog buscar unificar (match) la consulta con las clusulas. Su respuesta ser: Quien= marcos Quien= nicolas Si la consulta fuera mujer(victoria), la respuesta sera: True (verdadero)

De esto se desprende que una consulta puede ser una bsqueda o una validacin (V/F). Pero la potencia de Prolog se manifiesta cuando usamos relaciones mltiples y reglas, por ejemplo: domains nombre=symbol predicates progenitor(nombre,nombre) varon(nombre) mujer(nombre) padre(nombre,nombre) clauses varon(juan). varon(carlos). mujer(paola). mujer(mirta). progenitor(mirta,juan). progenitor(carlos,paola). padre(X,Y):- progenitor(X,Y),varon(X).

1 Consulta: padre(X, juan): rbol de objetivos:

Docente: Ing. Mara Ncida Malca Quispe

22

2 Consulta: padre(mirta,juan).

En primer lugar se aparea la consulta padre(mirta,juan) con la cabeza de la regla: padre(X,Y) :-progenitor(X,Y),varon(X) , unificando mirta a X y juan a Y, ahora deja una marca para el Backtraking y aumenta un nivel de interioridad buscando solucin a progenitor(mirta,juan) y a varon(mirta) desde el principio. La primera resulta Verdadera, pero la segunda Falsa, por lo que la unificacin de la consulta original con esta regla result ser intil. Es aqu donde el interprete regresa al estado donde dej la marca y sigue analizando la clusula siguiente a padre(X,Y):-progenitor(X,Y),varon(X). Como esta es la ltima clusula el anlisis termina y la respuesta ser que la afirmacin padre(mirta,juan) es Falsa.

Docente: Ing. Mara Ncida Malca Quispe

23

También podría gustarte