Vous êtes sur la page 1sur 12

3.

Prolog

Objetivo general Aprender como se puede representar conocimiento en prolog. Objetivos especficos Aprender las nociones bsicas del prolog. Aplicar la lgica de primer orden en un lenguaje de programacin declarativo lgico. Es un lenguaje declarativo e interpretado, en este tipo de lenguajes se representan los conocimientos sobre un determinado dominio y sus relaciones. A partir de ese conocimiento, se deducen las respuestas de las preguntas que se formularon, es decir se obtiene una inferencia. Prolog es un lenguaje de programacin que se utiliza mucho para resolver problemas que implican objetos y relaciones entre objetos. Est basado en la coincidencia sintctica, estructuras de datos basadas en rboles, backtracking automtico, declara hechos sobre objetos y sus relaciones, hacer preguntas sobre objetos y sus relaciones y definir reglas sobre objetos y sus relaciones. El conocimiento se formaliza mediante un conjunto de relaciones que describen las propiedades y sus iteraciones. Se declara el conocimiento disponible de: Objetos o Propiedades. o Relaciones. Reglas, las cuales determinan interacciones lgicas del tipo: si ocurre q, r, s y t entonces p.

Una ventaja es que no hay que preocuparse del cmo resolver algo, una desventaja es que la resolucin no siempre es eficiente. Un programa en prolog esta constituido por un conjunto de clusulas de Horn, tiene la siguiente forma: p(t1, t2, t3,, tn):-p1(..),,pm(..) con m>=0 Tanto p como los pi son smbolos predicados con sus argumentos entre parntesis, los argumentos de un predicado reciben el nombre de trminos. Las clusulas de Horn son expresiones condicionales, donde el smbolo :- es el smbolo condicional o de implicacin (en lgica se utiliza el smbolo ), la clusula anterior se lee de la siguiente manera: Si p1(.) Y p2 (..) YY pm(..) Entonces p(t1,t2,.,tm) Tambin se podra leer:

Es Cierto p(t1,t2,,tm) Si es Cierto p1() Y Es Cierto p2() Y. Y Es Cierto pm(.) Cuando m=0, no tiene parte derecha se trata de un hecho o afirmacin. p(t1,t2,.,tm) Cuando no tiene parte izquierda, se tiene una clusula negativa o pregunta, estas se utilizan para realizar la entrada y salida del programa: ?p1(),p2(),,pm() Un trmino ti puede ser: Un tomo (nmero, constante). Una variable. Una estructura (functor): f(t1,t2,,tm), donde los argumentos ti son a su vez trminos.

La sintaxis estndar del prolog (sintaxis de Edimburgo), los smbolos de tomos (constantes), functores y predicados comienzan con una letra minscula, los smbolos de variables comienzan con una letra mayscula. 3.1. Clusulas Los programas en prolog estn constituidos por clusulas, estas representan todo el conocimiento necesario para resolver el problema. Se diferencian 3 tipos de clusulas: Hechos (afirmaciones), representan: o Objetos. o Propiedades de objetos. o Relaciones entre objetos. Reglas. Consultas (clusulas negativas).

Un programa en prolog es una secuencia de clusulas, donde cada clusula puede estar formada por uno o varios predicados. Todas las clusulas terminan en punto. 3.2. Trminos Hay tres tipos de trminos: Constante: o tomo: en minsculas, ejemplo luis o Entero: solo dgitos y el +,-

o Real: dgitos el +,-,. Variable: comienzan con mayscula o con _ ejemplo Suma X _Y Estructura: termino compuesto por otros trminos ejemplo edad(luis,63) padre_de(luis,eva)

3.3. Hechos Es el mecanismo bsico para representar: Objetos/personas/conceptos. Propiedades de los objetos. Relaciones entre los objetos.

Ejemplo: padre(Luis). padre_de(Luis, Pedro). azul(Cielo). Una relacin esta definida por todas las instancias que aparecen con un predicado. Tipo de concepto Objetos/personas/concepto s Propiedades Relaciones Ejemplo Luis Pedro Cielo Padre Azul Padre_de Aridad Predicado/0 Predicado/1 Predicado/2,,/n

Los hechos se introducen en la base de hechos del intrprete de prolog mediante una asercin: ?-assert(padre_de(Luis, Pepe)). Ejemplos de base de hechos: amigos (Pedro, Antonio). amigos (Pedro, Flora). amigos (Pedro, Juan). amigos (Pedro,Vicente). amigos (Luis, Felipe). amigos (Luis, Maria). amigos (Luis, Vicente). amigos (Carlos, Paloma).

amigos (Carlos, Lucia). amigos (Carlos, Juan). amigos (Carlos, Vicente). amigos (Fernando, Eva). amigos (Fernando, Pedro). millonario(Pedro) millonario(Antonio) millonario(Flora) soltero(Pedro) soltero(Flora) soltero(Eva) soltero(Luis) padre_de(Carlos, Fernando). padre_de(Antonio, Maria). padre_de(Antonio, Carlos). 3.4. Consultas Es la forma para extraer conocimiento del programa: ?-amigos(Pedro, Antonio). ?-amigos(Pedro, Eva). ?-amigos(Pedro, Pepe). ?-amigos(Pedro, X). ?-amigos(Antonio, Pedro). Ejemplo: Mi amigo Vicente, busca amigos/as de mis amigos que sean millonarios/as y estn solteros/as. ?-amigos(X,Vicente),amigos(X,Y),millonario(Y),soltero(Y). Una consulta estar constituida por una o varias metas que prolog deber resolver. El intrprete de prolog devolver ms soluciones si se utiliza punto y coma, si no existen ms soluciones el interprete arroja no. 3.5. Equiparacin Permite comprobar si dos expresiones son equivalentes, el resultado es una sustitucin de trminos cuando esta es posible. Por ejemplo, en el caso de que una variable este libre y es equiparada con un valor numrico, se obtiene una instanciacin (asignacin) de la variable con dicho valor. Ejemplos: amigos(Pedro, Vicente) y amigos(Pedro, Vicente)

Son equiparables amigos(Pedro, Vicente) y amigos(X,Vicente) Son equiparables X=Pedro amigos(Pedro,Y) y amigos(X, Vicente) Son equiparables X= Pedro Y= Vicente amigos(X,X) y amigos(Pedro, Vicente) no son equiparables porque X= Pedro y X= Vicente no es posible Dos trminos T1 y T2 son equiparables si: T1, T2 son constantes => idnticas T1 o T2 es una variable => se equiparn instanciando el otro termino a la variable T1, T2 son estructuras => los trminos que los componen son equiparables manteniendo una instanciacin de las variables coherentes.

3.6. Reglas Establecen relaciones ms elaboradas entre objetos, por ejemplo, relaciones generalizadas o particularizadas, relaciones causa-efecto. 3.7. Esquema condicional En prolog la y lgica corresponde a la , y la o lgica corresponde a la definicin de varias clusulas para el mismo predicado. Esto es equivalente a usar ;. Ejemplo: P:-a,b. P:-c,d. P:-(a,b;c,d).

Ambas definiciones son equivalentes Ejemplo: hijo_de(X,Y):-padre_de(Y,X). familiares(X,Y):-padre_de(X,Y). familiares(X,Y):-padre_de(Y,X). 3.8. Reglas recursivas La recursin es una tcnica fundamental en Prolog, tanto para representar los datos como para procesarlos. Esto se debe ya que en prolog no existen las estructuras repetitivas.

Para definir reglas ms generales y flexibles, es necesario un mecanismo adicional, para esto se utiliza la recursividad, ejemplo: antecesor_de(X,Y):-padre_de(X,Y). antecesor_de(X,Y):-padre_de(X,Z),padre_de(Z,Y). antecesor_de(X,Y):-padre_de(X,Z1),padre_de(Z1,Z2), padre_de(Z2,Y). antecesor_de(X,Y):-padre_de(X,Z1),padre_de(Z1,Z2), padre_de(Z2,Z3) padre_de(Z3,Y).

La primera lnea me devuelve el nombre del pap, la siguiente la del abuelo, la siguiente el bisabuelo y la ltima el tatarabuelo. Pero esta manera no es eficiente, dado que no permite generalizar el concepto de antecesor. Prolog permite definir recursividad: antecesor_de(X,Y):-padre_de(X,Y). antecesor_de(X,Y):-padre_de(X,Z),antecesor_de(Z,Y). 3.9. Desigualdad Para comprobar si dos trminos son distintos, se disponen de diferentes operadores. Desigualdad: \== Comprueba si dos trminos son distintos, ejemplo si dos variables tienen distintos valores de instancia. Desigualdad aritmtica: =\= Verifica la desigualdad numrica entr dos expresiones. Ejemplos: Hermanos(X,Y):-padre_de(Z,X),padre_de(Z,Y),X\==Y. 3.10. Operadores de comparacin < <= > >= 3.11. Operadores y funciones aritmticas + Suma - Resta * Multiplicacin ^ Potencia / Divisin decimal // Divisin entera mod Residuo de una divisin entera

abs valor absoluto max valor mximo entre dos nmeros min valor mnimo entre dos nmeros round redondea al entero ms prximo integer trunca a la parte entera float convierte en un valor real 3.12. Igualdad y asignacin Se disponen de 4 tipos de igualdad: Igualdad aritmtica: =:= comprueba la igualdad numrica de las expresiones argumento. igual1(X,Y):-X=:=Y. Identidad: == comprueba si los trminos argumento son iguales. igual2(X,Y):-X==Y Unificacin: = comprueba si los trminos argumento son unificables (equiparables). Es equivalente a la asignacin directa entre variables en un lenguaje procedimental. Genera errar si la unificacin no es posible. igual3(X,Y):-X=Y. Una definicin equivalente sera: igual4(X,X). Asignacin: is evala la segunda expresin e intenta asignar el valor obtenido a la variable, no es conmutativo. incremento(X,Y):-Y is X+1. Una definicin similar a la de igualdad sera: igual5(X,Y):- X is Y. A continuacin se muestra una tabla comparativa de todas las posibilidades existentes: Operador =:= == = Ejemplo igual1 igual2 igual3 Igual?(3,3). yes Yes Yes Igual?(1,3). No No No Igual?(1+2,3). Yes No No Igual?(3,1+2). Yes No No Igual?(X,1+2). * No X=1+2 Igual?(1+2,X). * No X=1+2 Igual?(3,X). * No X=3 Igual?(X,3). * No X=3 Igual? ** Yes Yes (hola,hola). Igual?(1.0,1). Yes No No Igual?(1,1.0). Yes No No Igual?(1.0,1.0). Yes Yes Yes Igual?(1.1,1.1). Yes Yes Yes *Excepcin: variable X libre. **Error: hola no es funcin (o expresin) vlida. = igual4 Yes No No No X=1+2 X=1+2 X=3 X=3 Yes No No Yes Yes is igual5 Yes No No Yes X=3 * * X=3 Yes No*** Yes*** Mo*** Yes***

***prolog tiene tendencia a convertir valores reales en enteros. En el segundo argumento del operador is detecta que se puede convertir a entero. 3.13. Negacin not est implementado como negacin por fallo, quiere decir que se evala como falso cualquier cosa que prolog no este en capacidad de verificar que su predicado argumento es cierto. Ejemplo: saldo_cuenta(maria,1000). saldo_cuenta(flora,3000000). saldo_cuenta(Antonio,2000000). padre_de(Antonio,maria). millonario(X):-saldo_cuenta(X,Y),Y>1000000. pobre(X):-not millonario(X) 3.14. Backtracking Es el mecanismo que incorporan los sistemas de programacin lgica para encontrar refutaciones dentro del espacio de bsqueda asociado a un programa. Este mecanismo permite probar nuevas opciones cuando se termina una derivacin con o sin xito (reevaluacin). Esto consiste en retroceder desde un nodo terminal de un rbol de bsqueda hasta el ltimo nodo con alguna rama no explorada deshaciendo las ligaduras establecidas a partir de ese nodo. La reevaluacin la realiza automticamente el sistema despus de una derivacin sin xito, y el usuario la puede provocar despus de una derivacin con xito. Con estos mecanismos, el lenguaje de clusulas de Horn se puede tomar como lenguaje de programacin y el significado de un programa ser el conjunto de todas las relaciones demostrables entre todos los objetos del programa (semntica operacional). 3.15. Semntica operacional de prolog Un programa en prolog se ejecuta de la siguiente manera: El programa que son hechos y reglas. Un motor de inferencia.

El motor de inferencia, es un mecanismo de invocacin de procedimientos.

3.16. Salida del intrprete

halt/0 Termina la ejecucin del intrprete Prolog, cerrando todos los ficheros abiertos. halt(+Status) Termina la ejecucin del intrprete con un determinado estado, el estado es un nmero entero. 3.17. Entrada y 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. current_op(?Precedence,?Type,?Name): Devuelve xito cuando Name est definido como un operador de tipo Type cuya precedencia es Precedence. (Otros predicados relacionados con este, op/3). display(+Term): Escribe el trmino Term sobre la salida estndar del dispositivo. Este predicado suele emplearse normalmente para examinar la representacin interna de un trmino. flush: Vuelca la salida de un programa sobre la salida estndar actual (ver flush_output/1). get(-Char): Lee de la entrada actual caracteres y unifica Char con el prximo carcter introducido (distinto al carcter blanco). Char se unifica con -1 si se trata del final de un fichero. get0(-Char): Lee de la entrada actual caracteres y unifica Char con el prximo carcter introducido. Char se unifica con -1 si se trata del final de un fichero. nl: Escribe una lnea en blando (carcter newline) sobre la salida estndar actual . op(+Precedence,+Type,+Name): Declara a Name como un operador de tipo Type con una precedencia Precedence. put(+Char): Escribe el carcter Char sobre la salida estndar del dispositivo. read(-Term): Lee un trmino desde la entrada estndar del dispositivo. skip(+Char): Lee y salta caracteres desde la entrada estndar hasta que encuentra el carcter Char. tab(+Amount): Escribe un nmero dado (Amount) de espacios en blanco en la salida estndar del dispositivo (Amount debe ser una expresin que pueda evaluarse como un entero positivo). write(+Term): Escribe el trmino Term sobre la salida estndar.

writeq(+Term): Escribe el trmino Term sobre la salida estndar (sita el trmino entre comillas). En este predicado, los trminos pueden ser vueltos a leer con el predicado read/1. 3.18. Entrada y Salida desde Fichero close(+Stream): Cierra el fichero especificado por Stream. display(+Stream,+Term): Muestra un trmino Term que se encuentra en el fichero especificado por Stream. get(+Stream, -Char): Lee el siguiente carcter imprimible de un fichero y unifica su correspondiente valor ASCII con Char. get0(+Stream, -Char): Lee el siguiente carcter de un fichero y unifica su correspondiente valor ASCII con Char. nl(+Stream): Escribe una lnea en blanco en el fichero especificado. open(+SrcDest,+Mode,?Stream): Apertura del fichero especificado por SrcDest (especifica un fichero Unix), el Mode puede ser de lectura (read), escritura (write) o para realizar una ampliacin del mismo (append). El trmino Stream puede ser una variable (se instanciar a un entero que identifica mi fichero), o un tomo (en este caso se trata de un identificador de fichero). En caso de no existir el fichero lo crea. put(+Stream,+Char): Escribe el carcter Char, en el fichero Stream. read(+Stream,-Term): Lee un trmino desde un fichero. see(+SrcDest): Abre un fichero para lectura y se sita al comienzo del mismo. seeing(?SrcDest): Unifica el nombre del fichero abierto actualmente con SrcDest . seen: Cierra el fichero actualmente abierto, y devuelve la entrada estndar del dispositivo al teclado del terminal. skip(+Stream,+Char): Lee y salta caracteres desde un fichero (Stream) hasta que encuentra el carcter Char. tab(+Stream,+Amount): Escribe un nmero dado (Amount) de espacios en blanco un fichero (Stream). tell(+SrcDest): Abre un fichero para escritura como si se tratase de la salida estndar. telling(?SrcDest): Devuelve el nombre de el fichero abierto por tell (unifica el nombre del actual fichero de salida con SrcDest). told: Cierra el fichero que se encuentre actualmente abierto, y devuelve la salida estndar del dispositivo a la pantalla del terminal.

write(+Stream,+Term): Escribe el trmino Term sobre el fichero Stream. writeq(+Term): Escribe el trmino Term sobre el fichero Stream (los inserta entrecomillados). 3.19. Funciones del Sistema [+Filespec]: Lee las clusulas contenidas en el fichero especificado y las inserta en la base de datos (es una accin similar a ejecutar el predicado consult). chdir(+Path): Cambia el directorio de trabajo al directorio Path. consult(+File): Lee un fichero con formato Prolog (el fichero va sin extensin aunque por defecto buscar el fichero File o File.pl, toma las clusulas que encuentre en ese fichero y las inserta en la base de datos delete_file(+File): Borra el fichero especificado. exists_file(+File): Produce xito cuando el fichero especificado existe (esto no implica que el usuario disponga de permiso de lectura o escritura sobre ese fichero). halt: Finaliza la ejecucin del intrprete de Prolog o de la aplicacin compilada. listing: Lista todos los predicados de la base de datos. listing(+Pred): Lista todos los predicados especificados por Pred. rename_file(+File1,+File2): Renombra File1 como File2. size_file(+File,-Size): Unifica la variable Size con el nmero de caracteres contenidos en File. shell: Inicia un shell interactivo con Unix. El shell finaliza al teclear exit. shell(+Command): Ejecuta un comando de Unix. statistics: Muestra una tabla con informacin estadstica acerca de la utilizacin del sistema. 3.20. Funciones para la Depuracin de Programas debug: Arranca el depurador (detendr la ejecucin de los programas en los puntos espas). debugging: Imprime el estado del depurador y los puntos espas sobre la salida actual. nodebug: Detiene el depurador (quita el modo traza y no se detiene en ningn punto espa).

nospy(+Pred): Borra el punto espa situado en el predicado especificado. nospyall: Borra todos los puntos espa del programa. notrace: Detiene el proceso de traza del programa. spy(+Pred): Sita un punto espa en el todos los predicados especificados por Pred. trace: Arranca el proceso de traza del programa. tracing: Devuelve xito cuando el proceso de traza est activado.

Vous aimerez peut-être aussi