LÓGICA DE PRIMER ORDEN Y AMPLIACIÓN DE LÓGICA

4É%6+%#5 

Faraón Llorens Largo

DEPARTAMENTO DE CIENCIA DE LA COMPUTACIÓN E INTELIGENCIA ARTIFICIAL Universidad de Alicante

PROLOG

Contenido

1.

PROLOG Y EL LENGUAJE DE LA LÓGICA DE PRIMER ORDEN ......................................3 1.1. PREDICADOS ....................................................................................................................................3 1.2. TÉRMINOS .......................................................................................................................................4 1.3. CONECTIVAS LÓGICAS ....................................................................................................................6

2.

ESTRUCTURA DE UN PROGRAMA............................................................................................9 2.1. PREGUNTAS .....................................................................................................................................9

3.

SINTAXIS ........................................................................................................................................12 3.1. CARACTERES .................................................................................................................................12 3.2. ESTRUCTURAS ...............................................................................................................................13 3.3. OPERADORES.................................................................................................................................13

4.

ESTRUCTURAS DE DATOS ........................................................................................................17 4.1. ÁRBOLES .......................................................................................................................................17 4.2. LISTAS ...........................................................................................................................................17

5.

ESTRUCTURAS DE CONTROL..................................................................................................21 5.1. 5.2. 5.3. 5.4. RECURSIÓN....................................................................................................................................21 UNIFICACIÓN .................................................................................................................................22 REEVALUACIÓN .............................................................................................................................23 EL CORTE ......................................................................................................................................25

6.

PREDICADOS DE ENTRADA Y SALIDA..................................................................................29 6.1. LECTURA Y ESCRITURA DE TÉRMINOS .........................................................................................29 6.2. LECTURA Y ESCRITURA DE CARACTERES .....................................................................................30 6.3. LECTURA Y ESCRITURA EN FICHEROS ..........................................................................................31

7.

MODIFICACIÓN DE LA BASE DE CONOCIMIENTOS.........................................................33 7.1. ADICIÓN DE BASES DE CONOCIMIENTO EXTERNAS ......................................................................33 7.2. MANIPULACIÓN DE LA BASE DE CONOCIMIENTOS ........................................................................34 7.3. COMPONENTES DE ESTRUCTURAS.................................................................................................37

8. 9.

DEPURACIÓN DE PROGRAMAS PROLOG ............................................................................40 PROGRAMACIÓN EN PROLOG ................................................................................................43 9.1. 9.2. 9.3. 9.4. ENTORNO DE TRABAJO .................................................................................................................43 ESTILO DE PROGRAMACIÓN EN PROLOG .......................................................................................43 INTERPRETACIÓN PROCEDIMENTAL DE LOS PROGRAMAS PROLOG ................................................44 VENTAJAS DE PROLOG ..................................................................................................................46

10. 11. 12.

PROGRAMA EJEMPLO: FORMAS NORMALES ...................................................................47 PREDICADOS PREDEFINIDOS..................................................................................................51 SISTEMAS PROLOG.....................................................................................................................54 PROLOG-2 .................................................................................................................................54

12.1.

© 1996-2000 Faraón Llorens

Página i

..............................................................................................................................................2..................................55 ANEXO: CUADRO COMPARATIVO DE LAS DIFERENTES NOTACIONES PARA PROGRAMACIÓN LÓGICA ..................57 13..........................58 Página ii © 1996-2000 Faraón Llorens ........... BIBLIOGRAFÍA ............................................LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA 12......................... SWI-PROLOG..................................................................

2 3 © 1996-2000 Faraón Llorens Página 1 . David Warren3. En Proc. 1973. 1970. estamos expresando una relación entre un objeto (Jorge) y otro objeto en particular (una moto). estas relaciones tienen un orden específico (Jorge posee la moto y no al contrario). SUNY and Stone Brook. IFIP. ou un formalisme pouranalyser et synthétiser des phrases sur ordinateur.. H. PROLOG es un lenguaje de programación para ordenadores que se basa en el lenguaje de la Lógica de Primer Orden y que se utiliza para resolver problemas en los que entran en juego objetos y relaciones entre ellos. no es la única realización posible. Por otra parte. Las investigaciones de Kowalski proporcionaron el marco teórico. Computer Science Dpt. Kowalski. 1974. y se pretende que sea el lenguaje nativo de las máquinas de la quinta generación ("Fifth Generation Kernel Language". también solemos usar reglas para describir relaciones: "dos personas son hermanas si ambas son hembras y tienen los mismos padres". El lenguaje PROLOG juega un importante papel dentro de la Inteligencia Artificial. ya que equilibra por un lado la preservación de las propiedades del modelo abstracto de Programación Lógica y por el otro lado consigue que la implementación sea eficiente. mientras que los trabajos de Colmerauer dieron origen al actual lenguaje de programación. septiembre. Colmerauer. La expansión y el uso de este lenguaje propició la aparición de la normalización del lenguaje Prolog con la norma ISO (propuesta de junio de 1993). Université de Montreal. Como veremos más adelante. R. si bien uno de los principales protagonistas de su desarrollo y promoción fue Robert Kowalski2 de la Universidad de Edimburgh. Un Systeme de Communication HommeMachine en Français. PROLOG es una realización aproximada del modelo de computación de Programación Lógica sobre una máquina secuencial. Amsterdam. cuando realizamos una pregunta (¿Tiene Jorge una moto?) lo que estamos haciendo es indagando acerca de una relación. New York. pero sí es la mejor elección práctica. era un primer intento de diseñar un lenguaje de programación que posibilitara al programador especificar sus problemas en lógica. A. Internal Report 43. Kanoui. Colmerauer. Predicate Logic as a Programming Language. Les Systèmes-Q. desarrolló el primer compilador de Prolog (WAM – “Warren Abstract Machine”). Pasero. The runtime environment for a prolog compiler using a copy algorithm. Se pretendía usar la lógica formal como base para un lenguaje de programación. Además. es decir. Groupe de Recherche en Intelligence Artificielle.PROLOG El lenguaje de programación PROLOG (“PROgrammation en LOGique”) fue creado por Alain Colmerauer y sus colaboradores alrededor de 1970 en la Universidad de Marseille-Aix1. Technical Report 83/052. P. FGKL) que quería que fueran Sistemas de Procesamiento de Conocimiento. Es un lenguaje para el procesamiento de información simbólica. Roussel y R. Más aún. Lo que lo diferencia de los demás es el énfasis sobre la especificación del problema. construyendo el primer interprete Prolog. Por ejemplo. de la Universidad de Edimburgh. Warren. D. Université d’AixMarseille. cuando decimos "Jorge tiene una moto". 1983. 1 A. esto es lo que hacemos en Prolog. Desde luego.

al mismo tiempo.. get. .. nos permite un cierto control y operatividad. Prolog incluye algunos predicados predefinidos metalógicos. ==. . (write.. ). otros extra-lógicos.). Prolog ofrece un sistema de programación práctico que tiene algunas de las ventajas de claridad y declaratividad que ofrecería un lenguaje de programación lógica y.) y un tercer grupo que nos sirven para expresar información de control de como realizar alguna tarea ( el corte. .LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA Una de las ventajas de la programación lógica es que se especifica qué se tiene que hacer (programación declarativa). Página 2 © 1996-2000 Faraón Llorens . que tienen un efecto lateral. nonvar. y no cómo se debe hacer (programación imperativa)... A pesar de esto. ajenos al ámbito de la Lógica de Primer Orden. (var. Por tanto..

1. Además. Los términos hacen referencia a los objetos que intervienen y los predicados a las propiedades o relaciones entre estos objetos.Per tiene el pelo de color oscuro */ moreno(jorge). y relaciones entre ellos. /* hombre(Per) <. arg2. 1. En Prolog los llamaremos hechos. • Primero se escribe la relación o propiedad: predicado • Y los objetos se escriben separándolos mediante comas y encerrados entre paréntesis: argumentos."). Ejemplos (ej01. . • Al final del hecho debe ir un punto (". llamadas fórmulas moleculares. predicados monádicos.PROLOG 1. Debemos tener en cuenta que: • Los nombres de todos los objetos y relaciones deben comenzar con una letra minúscula. mujer(chelo). hombre(felix).. utilizaremos en Prolog constantes atómicas. */ */ /* moreno(Per) <.Per es una mujer mujer(clara). predicados poliádicos.. PROLOG Y EL LENGUAJE DE LA LÓGICA DE PRIMER ORDEN La Lógica de Primer Orden analiza las frases sencillas del lenguaje (fórmulas atómicas o elementales) separándolas en Términos y Predicados. /* Predicados poliádicos: RELACIONES */ © 1996-2000 Faraón Llorens Página 3 . Tanto para los símbolos de predicado como para los argumentos.pl): /* Predicados monádicos: PROPIEDADES */ /* mujer(Per) <.. PREDICADOS Se utilizan para expresar propiedades de los objetos.Per es un hombre hombre(jorge). argn ). hombre(borja). dichas fórmulas atómicas se pueden combinar mediante Conectivas permitiéndonos construir fórmulas más complejas. simbolo_de_predicado ( arg1.

1. Además.Hijo-a) <. trabajando en una aritmética estándar independiente del lenguaje.Obj) <..clara). . TÉRMINOS Los términos pueden ser constantes o variables.Cualquier cadena de caracteres encerrada entre comillas simples (').Per posee el objeto Obj */ tiene(jorge.borja). Hay dos clases de constantes: • Átomos: existen tres clases de constantes atómicas: .Obj.a X le gusta Y */ le_gusta_a(clara. es_padre_de(felix. las constantes atómicas de Prolog también se utilizan para representar propiedades y relaciones entre los objetos del dominio. por tanto. vía hardware. clara). consistentes en al menos un dígito.Cadenas de letras. En la práctica se toma como dominio el Universo de Herbrand.informatica).388. le_gusta_a(jorge. le_gusta_a(clara.Enteros: en la implementación de Prolog-2 puede utilizarse cualquier entero que el intervalo [-223.Per2) <.Per1 regala Obj a Per2 */ regala(jorge. resuelven eficientemente el manejo de los números y de las operaciones aritméticas. . en la práctica.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA /* tiene(Per. opcionalmente un punto decimal y más dígitos. dígitos y subrayado (_) empezando por letra minúscula.Madre es la madre de Hijo-a */ es_madre_de(chelo. . como ya hemos dicho. le_gusta_a(jorge.8.clara).608. la programación lógica lo deja en sus manos.388. clara).607]. Las constantes se utilizan para dar nombre a objetos concretos del dominio.Hijo-a) <.moto). • Números: se utilizan para representar números de forma que se puedan realizar operaciones aritméticas.Reales: decimales en coma flotante. /* regala(Per1. representan individuos conocidos de nuestro Universo. un «+» o «-» y más dígitos. cuantificamos los términos.Padre es el padre de Hijo-a */ es_padre_de(felix.Y) <. © 1996-2000 Faraón Llorens Página 4 .informatica). /* es_madre_de(Madre. dicho de otra manera.jorge). .. .223-1]=[-8. /* es_padre_de(Padre. Dependen del ordenador y la implementación4. 4 Los ordenadores.2. es_madre_de(chelo. ":-". flores.borja). opcionalmente E. y suponemos definido un dominio no vacío en el cual toman valores (Universo del Discurso).Combinaciones especiales de signos: "?-". Para saber cuántos individuos del universo cumplen una determinada propiedad o relación. /* le_gusta_a(X.

Ejemplos de variables: X Sumando Primer_factor _indice _ (variable anónima) Una variable está instanciada cuando existe un objeto determinado representado por ella. Las variables anónimas no están compartidas entre sí. todas las variables están cuantificadas universalmente aunque ya no escribamos explícitamente el cuantificador (paso 6ª de la transformación a forma clausal : eliminación de cuantificadores universales). gusta(jorge. por tanto. todas las variables que aparecen están cuantificadas universalmente. equivale a la fórmula ∀x gusta(jorge.X). Como veremos más adelante. la manipulación de datos en la programación lógica se realiza por medio de la unificación. pero implícitamente sí que lo están. podemos utilizar la variable anónima (_). Así. Pero veamos que significado tienen dependiendo de su ubicación. Y está no instanciada cuando todavía no se sabe lo que representa la variable.2E-3 nº no válidos 123. es decir. y.x) y significa que a jorge le gusta cualquier cosa © 1996-2000 Faraón Llorens Página 5 . es decir. será tomado por Prolog como una variable. Explícitamente Prolog no utiliza los símbolos de cuantificación para las variables.2e3 1.2E+3 1.23 1. Se diferencian de los átomos en que empiezan siempre con una letra mayúscula o con el signo de subrayado (_).PROLOG Ejemplos de constantes: átomos válidos f vacio juan_perez 'Juan Perez' a352 átomos no válidos 2mesas Vacio juan-perez _juan 352a números válidos -123 1. son las incógnitas del problema.2E3 1.2 1. deberemos ir con cuidado ya que cualquier identificador que empiece por mayúscula.2+3 Las variables se utilizan para representar objetos cualesquiera del Universo u objetos desconocidos en ese momento. cuando una variable es instanciada su contenido no puede cambiar. Si las fórmulas atómicas de un programa lógico contienen variables. 1. Para trabajar con objetos desconocidos cuya identidad no nos interesa. el significado de estas es : • Las variables que aparecen en los hechos están cuantificadas universalmente ya que en una cláusula todas las variables que aparecen están cuantificadas universalmente de modo implícito. ya que proceden de la notación en forma clausal. En general. Prolog no soporta asignación destructiva de variables.

“y”.y) ∨ ∀z ¬[padre(x.y) ∨ ¬∃z [padre(x. buscando objetivos coincidentes en la Base de Datos. equivale a la fórmula ∀x ∀y ∀z [abuelo(x.” y consiste en objetivos separados que Prolog debe satisfacer. CONECTIVAS LÓGICAS Puede que nos interese trabajar con sentencias más complejas.y)] ] ∀x ∀y [ ∃z [padre(x.Z).LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA • Las variables que aparecen en la cabeza de las reglas (átomos afirmados) están cuantificadas universalmente. una será el abuelo de otra si existe alguna persona de la cuál el primero es padre y a su vez es padre del segundo • Las variables que aparecen en las preguntas están cuantificadas existencialmente. negación e implicación.y)] ] ∀x ∀y [abuelo(x. intentará satisfacerlos por orden. fórmulas moleculares.padre(X. “o”. pero no en la cabeza. Se utiliza un punto y coma “.z) ∧ padre(z. la representaremos poniendo una coma entre los objetivos “.x) ≡ ¬∃x gusta(jorge. Página 6 © 1996-2000 Faraón Llorens .z) ∧ padre(z. tendrá éxito si se cumple alguno de los objetivos que la componen. La conjunción. padre(Z. uno después de otro: X.z) ∧ padre(z.3. Las variables que aparecen en el cuerpo de la regla (átomos negados). Las conectivas que se utilizan en la Lógica de Primer Orden son: conjunción. están cuantificadas existencialmente.z) ∨ ¬padre(z. abuelo(X. poniendo cada miembro de la disyunción en una cláusula aparte. Para que se satisfaga la secuencia se tendrán que satisfacer todos los objetivos.” colocado entre los objetivos: X.y)] ∀x ∀y [abuelo(x.Y) :.y) ] que significa que para toda pareja de personas.Y Cuando se le da a Prolog una secuencia de objetivos separados por comas. disyunción.y)] → abuelo(x.y) ∨ ¬padre(x. La disyunción. como se puede ver en el ejemplo es_hijo_de. ?.gusta(jorge. 1. que constarán de fórmulas atómicas combinadas mediante conectivas.Y La disyunción lógica también la podemos representar mediante un conjunto de sentencias alternativas. ya que utilizamos refutación y por tanto negamos lo que queremos demostrar.X) equivale a la fórmula ∀x ¬gusta(jorge. es decir.x) y que pregunta si existe algo que le guste a jorge.Y).

La cabeza describe el hecho que se intenta definir. On.jorge). On. No es una verdadera negación.Y) :le_gusta_a(X. en el sentido de la Lógica. el cuerpo describe los objetivos que deben satisfacerse para que la cabeza sea cierta. Así.. Ejemplos (ej01..jorge). cuando X se instancia a algún objeto. sirve para significar que un hecho depende de un grupo de otros hechos.On.. Por último. En Prolog se usa el símbolo “:-” para representar lo que llamamos una regla: cabeza_de_la_regla :. © 1996-2000 Faraón Llorens Página 7 . entonces ..chocolate). . O2. la regla: C :. todas las X de dicha regla también se instancian a ese objeto ( ámbito de la variable ). Llamaremos cláusulas de un predicado tanto a los hechos como a las reglas.. . le_gusta_a(jorge. daremos una serie de definiciones. /* Condicional: REGLAS */ /* novios(Per1.O2. se deben llamar para su ejecución los objetivos O1.O1..cuerpo_de_la_regla.Per1 y Per2 son novios */ novios(X.PROLOG La negación lógica no puede ser representada explícitamente en Prolog.clara). /* Disyunción de predicados */ le_gusta_a(clara. /* o también como */ \+ le_gusta_a(clara.. Una colección de cláusulas forma una Base de Conocimientos.” Otra forma de verla es como una implicación lógica “al revés” o “hacia atrás”: cuerpo_de_la_regla → cabeza_de_la_regla Un mismo nombre de variable representa el mismo objeto siempre que aparece en la regla. Así. O2.”. La representamos con el predicado predefinido not o con \+: not(X) o \+ X La implicación o condicional...Per2) <. /* Negación de predicados */ not(le_gusta_a(clara. En castellano solemos utilizar las palabras “si .. le_gusta_a(clara.jorge)).” o procedimentalmente como: “Para ejecutar el procedimiento C. sino que se representa implícitamente por la falta de aserción : “no”..Y)..pl): /* Conjunción de predicados */ le_gusta_a(clara. sino una negación “por fallo”. puede ser leída declarativamente como: “La demostración de la cláusula C se sigue de la demostración de los objetivos O1..jorge).. tendrá éxito si el objetivo X fracasa.

es_madre_de(Y. sería : */ es_hijo_de(X.X).LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA le_gusta_a(Y.Y).es_madre_de(Y. es_padre_de(P.X).X) .Y) :. es_hijo_de(X.Per1 es la hermana de Per2 */ hermana_de(X.Y) :.X). /* Ejemplo de disyunción con . con . /* 2. es_madre_de(M. */ Página 8 © 1996-2000 Faraón Llorens . es_padre_de(P.Y) :.es_padre_de(Y. y con diferentes cláusulas */ /* 1. /* hermana_de(Per1.Y).X)).X).Per2) <.mujer(X).(es_padre_de(Y.Y) :.X). es_madre_de(M. con cláusulas diferentes quedaría: es_hijo_de(X.

Ejecución del programa: Demostración de un Teorema en este Universo. Por todo esto. Prolog adopta una estrategia de primero hacia abajo (recorrido del árbol en profundidad). demostración de que una conclusión se deduce de las premisas (afirmaciones previas). si cabe. • definir algunas REGLAS sobre los objetos y sus relaciones.1. ESTRUCTURA DE UN PROGRAMA El hecho de programar en Prolog consiste en dar al ordenador un Universo finito en forma de hechos y reglas. es falso. proporcionando los medios para realizar inferencias de un hecho a otro. el orden de las cláusulas (hechos y reglas) de un determinado procedimiento es importante en Prolog. 2. La regla de resolución no nos dice que cláusulas elegir ni que literales unificar dentro de cada cláusula. A continuación. Programa Prolog: Conjunto de afirmaciones (hechos y reglas) representando los conocimientos que poseemos en un determinado dominio o campo de nuestra competencia. y lo que no. ya que determina el orden en que las soluciones serán encontradas. y si responde “no” es que no lo ha podido © 1996-2000 Faraón Llorens Página 9 . si se hacen las preguntas adecuadas. e incluso puede conducir a fallos en el programa. es decir. Prolog considera que todo lo que hay en la Base de Datos es verdad. PREGUNTAS Las preguntas son las herramientas que tenemos para recuperar la información desde Prolog. De manera que si Prolog responde “yes” es que ha podido demostrarlo. y • hacer PREGUNTAS sobre los objetos y sus relaciones. Programa Prolog Base de Conocimientos + Motor de Inferencia Un sistema Prolog está basado en un comprobador de teoremas por resolución para cláusulas de Horn. Más importante es. Al hacer una pregunta a un programa lógico queremos determinar si esa pregunta es consecuencia lógica del programa. Prolog buscará las respuestas en dicho Universo y las presentará en la pantalla. Para la búsqueda de cláusulas alternativas para satisfacer el mismo objetivo. La estrategia de resolución particular que utiliza Prolog es una forma de resolución de entrada lineal (árbol de búsqueda estándar). el orden de las metas a alcanzar dentro del cuerpo de una regla.PROLOG 2. La programación en Prolog consiste en: • declarar algunos HECHOS sobre los objetos y sus relaciones.

decimos que Prolog está intentando resatisfacer la pregunta. Ejemplos (ej01. argn ). Prolog queda ahora a la espera de nuevas instrucciones. sacando el mensaje “More (y/n) ?”5: .X).capital_de(madrid. éste efectuará una búsqueda por toda la Base de Datos intentando encontrar hechos que coincidan con la pregunta. y marca el lugar donde lo encontró.. Ejemplos (ej01. ?. Cuando se hace una pregunta a Prolog.jorge).le_gusta_a(jorge.le_gusta_a(jorge.si pulsamos “y”+<RETURN> reanudará la búsqueda comenzando donde había dejado la marca.cafe).. Entonces Prolog hará que la variable se instancie con el argumento que esté en su misma posición en el hecho. Dos hechos “coinciden” (se pueden unificar) si sus predicados son el mismo (se escriben de igual forma) y si cada uno de los respectivos argumentos son iguales entre sí..pl): ?. . no Cuando a Prolog se le hace una pregunta con una variable.cafe).españa).LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA demostrar (no debe interpretarse como “falso” si no que con lo que Prolog conoce no puede demostrar su veracidad).jorge). saca por pantalla los objetos que representan ahora las variables.le_gusta_a(clara.simbolo_de_predicado ( arg1.si pulsamos “n”+<RETURN> cesará la búsqueda. Cuando encuentra un hecho que empareje. © 1996-2000 Faraón Llorens Página 10 . Prolog realiza la búsqueda por la Base de Datos en el orden en que se introdujo. dicha variable estará inicialmente no instanciada. Para activar la nueva búsqueda de soluciones basta con pulsar ". Lo descrito aquí es como funciona el Prolog-2. arg2. Prolog entonces recorre la Base de Datos en busca de un hecho que empareje con la pregunta: los símbolos de predicado y el número de argumentos sean iguales. no 5 Depende de la implementación.le_gusta_a(clara. El SWIProlog no saca mensaje y queda a la espera.le_gusta_a(jorge. . X=clara More (y/n)? y X=informatica More (y/n)? y no La conjunción y el uso de variables pueden combinarse para hacer preguntas muy interesantes: ?.pl): ?. y emparejen los argumentos.". yes ?. no ?.

le_gusta_a(clara. le_gusta_a(jorge. le_gusta_a(jorge. ?. no ?. yes ?.X). no ?. no ?. le_gusta_a(jorge.X). Para ello. Prolog intentará resatisfacer el primer objetivo.hermana_de(clara.hermana_de(borja.X).cafe)).X). yes ?. Si el segundo objetivo no se satisface. X=jorge More (y/n)? y X=informatica More (y/n)? y X=clara More (y/n)? y X=informatica More (y/n)? y no ?.PROLOG ?. marcándolo en la Base de Conocimientos e instanciando la variable X.le_gusta_a(clara.cafe).borja).X). Es importante recordar que cada objetivo guarda su propio marcador de posición.not(le_gusta_a(clara.hermana_de(clara. primero averiguamos si hay algo que le guste a Clara.le_gusta_a(clara. averiguamos si a Jorge le gusta ese objeto X ya instanciado. X=borja More (y/n)? n yes Piensa que ocurriría si a la pregunta de que si queremos más soluciones le contestamos que sí. yes ?.le_gusta_a(jorge.X).informatica).not(le_gusta_a(jorge. Luego. ¿ Cómo lo solucionarías ? © 1996-2000 Faraón Llorens Página 11 .jorge)).le_gusta_a(clara.cafe).cafe). X=informatica More (y/n)? n yes Hemos buscado algo que le guste tanto a Clara como a Jorge.

Cada carácter tiene un entero entre 0 y 127 asociado a él. 9. U.. CARACTERES Los nombres de constantes y variables se construyen a partir de cadenas de caracteres. dígitos numéricos: 0. G. 1. SINTAXIS La sintaxis de un lenguaje describe la forma en la que se nos está permitido juntar palabras entre sí. 7.. F. Página 12 © 1996-2000 Faraón Llorens . k. */ %. t. q. % Esto es también comentario mujer(chelo). 3. . V. R. I. C. este es su código ASCII ("American Standard Code for Information Interchange"). D. u. r.. H.. M. E. 8. l. Los programas en Prolog se construyen a partir de términos. retorno de carro. comentario de una sola línea Ejemplo : /* Esto es un comentario de más de una línea */ % mujer(Per) <. signos: !"#$%&'()=-^|/\{}[]_@+*. g. j. Z. c.1.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA 3. N. s. Q.. x. o. B. Un término es una constante. J. Prolog reconoce dos tipos de caracteres: • Imprimibles: hacen que aparezca un determinado signo en la pantalla del ordenador.? • No imprimibles: no aparecen en forma de signo en la pantalla. T. Y.:<>. comentario . v.2 Estilo De Programación En Prolog). w. e. Se dividen en cuatro categorías: letras mayúsculas: A. Para escribir un comentario lo encerraremos entre los signos /* y */ o desde el símbolo % hasta el final de línea. pero los debemos añadir a nuestros programas para aclararlos y que el propio programa quede documentado (Ver apartado 9. z. S. K. L. f. una variable o una estructura. b. h. p. pero realizan una determinada acción: nueva línea. 6. P. n.. y. X. Todo término se escribe como una secuencia de caracteres. d. Prolog pasa por alto los comentarios. 5. /* . 3. letras minúsculas: a. Así.. 4. i. m.Per es una mujer mujer(clara). O. 2. W.

autor y año de edición. 1201 (depende de la implementación).. Las estructuras se verán con más detalle en el apartado 7. cuena). OPERADORES En Prolog están predefinidos los operadores aritméticos y relacionales típicos.3. 1985) Como se puede ver. y sus componentes (argumentos).PROLOG 3. comp2. en Prolog. © 1996-2000 Faraón Llorens Página 13 . libro(logica_informatica. A su vez el autor puede ser una estructura con dos componentes: nombre y apellido. Postfijo: el operador se escribe detrás de sus argumentos. ESTRUCTURAS Una estructura es un único objeto que se compone de una colección de otros objetos.2. Las componentes están encerradas entre paréntesis y separadas por comas.3 Componentes De Estructuras. Como podrás comprobar cuando trabajes más a fondo en Prolog. El operador más prioritario tendrá una precedencia 1 y el menos. lo que facilita su tratamiento. podemos tener una estructura con el nombre libro. que tiene tres componentes: titulo. con la precedencia habitual entre ellos: ^ mod * / + = \= =< >= < > Para poder leer expresiones que contengan operadores necesitamos conocer los siguientes atributos: * POSICIÓN: Prefijo: el operador va delante de sus argumentos.. compn ) Por ejemplo. llamados componentes. 3.. el nombre se escribe justo antes de abrir el paréntesis: nombre ( comp1. autor(jose. * PRECEDENCIA: Nos indica el orden en que se realizan las operaciones. Infijo: el operador se escribe entre los argumentos. la sintaxis para las estructuras es la misma que para los hechos. Una estructura se escribe en Prolog especificando su nombre. . hay muchas ventajas en representar incluso los mismos programas Prolog como estructuras.

Ejemplo: El operador . e y un argumento indicando que puede contener operadores de la misma clase de precedencia o menor.c sea interpretada como (a . x un argumento indicando que cualquier operador del argumento debe tener una clase de precedencia estrictamente menor que este operador. y no como a . Nombre) donde: Precedencia es un entero indicando la clase de precedencia.c.b) . Para conocer las propiedades de los operadores ya definidos podemos utilizar el predicado predefinido: current_op(Precedencia.3) -2 = 4 .2 = 2 7 .contenga un operador de precedencia estrictamente menor: 7-3-2 (7 . Operador Potencia Producto División División entera Resto división entera Suma Signo positivo Resta Signo negativo Igualdad Distinto Menor que Menor o igual que Mayor que Mayor o igual que Evaluación aritmética Símbolo ^ ó ** * / // mod + + = \= < =< > >= is Precedencia Especificador 200 xfx 400 yfx 400 yfx 400 yfx 400 yfx 500 yfx 500 fx 500 yfx 500 fx 700 xfx 700 xfx 700 xfx 700 xfx 700 xfx 700 xfx 700 xfx Tabla 1: Operadores aritméticos y relacionales predefinidos en SWI-Prolog Para la posición-asociatividad utilizamos átomos especiales del tipo: xfx xfy yfy yfx xf yf fx fy que nos ayudan a ver el uso del posible operador. uno a cada lado del argumento.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA *ASOCIATIVIDAD: Sirve para quitar la ambigüedad en las expresiones en las que hay dos operadores. que tienen la misma precedencia. Especificador es un átomo indicando la posición y la asociatividad.c) ya que la x tras la f exige que el argumento que va tras el primer .2) = 7 .b .1 = 6 correcta incorrecta Página 14 © 1996-2000 Faraón Llorens .declarado como yfx determina que la expresión a . representando f al operador. y Nombre es un átomo indicando el nombre que queremos que tenga el operador. Especificador.(3 .(b .

acuario).6. /* signo(Dia. horoscopo(cancer.6).21.21.MesFin) <pertenecen al signo del horoscopo Signo los nacidos entre el DiaIni del MesIni y el DiaFin del MesFin */ horoscopo(aries. Signo).DiaIni.DiaFin.9.21. horoscopo(geminis.10).9).5).M1. Dia>=D1) . horoscopo(virgo.21.21.21.5.21.11. yes ?.7). horoscopo(sagitario. Ejemplo (ej02. Al trabajar con expresiones aritméticas y relacionales. Signo=leo More (y/n)? no 5.21. horoscopo(capricornio. tauro).7.21.2.Nombre).21. los argumentos de estas estructuras deben ser constantes numéricas o variables instanciadas a constantes numéricas.21.8.Signo) <. horoscopo(acuario.21.op(Precedencia.2). horoscopo(leo.M2). horoscopo(libra. utilizaremos el predicado predefinido op. horoscopo(tauro. cuya sintaxis es: ?. ( Mes=M2. ( ( Mes=M1.signo(7.21.21.pl): /* horoscopo(Signo.21. 8.PROLOG Gráficamente sería: - - 2 7 - 7 3 correcta 3 incorrecta 2 Si queremos declarar en Prolog un nuevo operador que sea reconocido por el sistema con una posición.12. 8.21.1).4).Mes.3.21.3).21.D1. Dia=<D2) ).MesIni. clase de precedencia y asociatividad determinadas.12).21.Signo) :. horoscopo(escorpio.D2.Mes.21.21. ?. y © 1996-2000 Faraón Llorens Página 15 .21.8). no ?.4. horoscopo(piscis.horoscopo(Signo.los nacidos el Dia de Mes pertenecen al signo del zodiaco Signo */ signo(Dia.21.Especificador.signo(7.21.11).signo(8.1.10.

habitantes/km2.signo(7.7.S). Y si preguntamos . superficie(X.la superficie.poblacion(X.Signo) .1149). El predicado de evaluación es el operador infijo is: X is Y donde: Y X es un término que se interpreta como una expresión aritmética. ?. con todos sus valores instanciados.432).Den) <. de la provincia Prov es Sup */ superficie(alicante. puede ser una variable o una constante numérica.la población. superficie(castellon. /* superficie(Prov. ¿ Por qué ? Los operadores no hacen que se efectúe ningún tipo de operación aritmética.X. N=6 ?.P).11).N is N+1. X=191’500 ?.pl): /* poblacion(Prov. no Página 16 © 1996-2000 Faraón Llorens . no ?. de la provincia Prov es Den */ densidad(X.signo(X. /* densidad(Prov.N=4. en miles de habitantes.7). yes ?.6). X).Y) :. poblacion(castellon.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA ?. superficie(valencia. N is 4+1.6 is 4+2.Signo) Piensa que ocurrirá si preguntamos ?. Ejemplo (ej03.Sup) <.6=4+2. Y is P/S. poblacion(valencia.densidad(alicante. en miles de km2.2066).Pob) <. no ?. de la provincia Prov es Pob */ poblacion(alicante.la densidad de población.N is 4+2.

ÁRBOLES Es más fácil entender la forma de una estructura complicada si la escribimos como un árbol en el que el nombre es un nodo y los componentes son las ramas. estructuras) u otras listas. © 1996-2000 Faraón Llorens Página 17 . ( a.”. el resto de la lista. Las listas pueden representarse como un tipo especial de árbol. Los elementos de una lista pueden ser cualquier término (constantes.1.PROLOG 4. autores(clocksin. . La cabeza y la cola de una lista son componentes de una estructura cuyo nombre es “. ( a. [] ) y la lista de tres elementos [a. Una lista puede definirse recursivamente como: * una lista vacía []. ( b. ESTRUCTURAS DE DATOS 4. Así. Ejemplo: libro(titulo(prolog). variables. mellish)) libro titulo autores prolog clocksin mellish 4. . es decir. sin elementos. o * una estructura con dos componentes: cabeza: primer argumento cola: segundo argumento. c] podría escribirse . la lista que contiene un solo elemento a es . [] ) ) ) siempre terminando con la lista vacía. LISTAS Las listas son unas estructuras de datos muy comunes en la programación no numérica. ( c. El final de una lista se suele representar como una cola que contiene la lista vacía. b. Una lista es una secuencia ordenada de elementos que puede tener cualquier longitud.2.

maullo]. 2ª aproximación: recogida de parámetros miembro(E. Ejemplo: Procedimiento miembro que comprueba si un determinado elemento pertenece a una lista. c]. [gato. gato] el el X+Y Cola (lista) [b. Existe. miembro(E. las listas anteriores quedarían como [a] y [a. gato]. [gato. maullo] ] [ [gato. c] [] (no tiene) [maullo] [ [gato. una notación especial en Prolog para representar la lista con cabeza X (elemento) y cola Y (lista): [X|Y] Ejemplos: Lista [a.L=[X|Y]). maullo] ] [el. c] [a] [] [ [el.L=[X|Y]). que es un tipo de notación más manejable. Página 18 © 1996-2000 Faraón Llorens . ayer] [X+Y.el término Elem pertenece a la lista Lista Definición intuitiva: Una determinada carta está en un mazo de cartas si es la primera o si está en el resto del mazo. y toda la lista encerrada entre corchetes. 1ª aproximación: traducción literal miembro(E. maullo]. Como no sabemos de antemano el tamaño de las listas deberemos utilizar la recursividad para recorrer las listas. ayer] [x+y] Diseño de procedimientos de manejo de listas: Vamos a utilizar la técnica de refinamientos sucesivos para el diseño de procedimientos de manejo de listas.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA · a [] a · · b c · [] En Prolog utilizaremos una notación más sencilla de las listas que dispone a los elementos de la misma separados por comas.L) :. tambien.X=E. Así. b.[X|Y]) :. Lista) <. b. maullo] [el. miembro(E.L) :. x+y] Cabeza (elemento) a a (no tiene) [el. Esquema de la relación: miembro(Elem.Y). X=E.

Y). Operaciones con listas: (ej04. /* insertar(Elem.L).[E|L]).Z).L). subconjunto([].ultimo(X.Y).[Z|L]. /* es_lista(Lista) <. /* subconjunto(L1.el término Elem pertenece a Lista */ miembro(X.L1. permutación([X|Y].L2) <.Elem es el ultimo elemento de Lista */ ultimo(X. nel([X|Y].nel(Y.L2) <.L) :. 4ª aproximación: ahorro de espacio en memoria (variable anónima) miembro(X. concatena([X|L1].PROLOG miembro(E.Y).la lista L2 es una permutación de lista L1 */ permutacion([].Lista) <.[_|Y]) :.[X]).L.Y. /* inversa(Lista.[Z|M]) :.miembro(E.0).[X|Y].inversa(Y.miembro(E. miembro(X.Z).Y).Z).[X|_]).L2) <.concatenación de las listas L1 y L2 dando lugar a la lista L3 */ concatena([]. concatena(Z.miembro(X.[X|Z]) :. borrar(X.pl) /* miembro(Elem.se inserta el elemento Elem en la lista L1 obteniéndose la lista L2 */ insertar(E.[X|L3]) :.borrar(X.[X].Z).Inver es la inversa de la lista Lista */ inversa([]. es_lista([_|_]).N) <.L2.permutacion(Y. /* permutacion(L1.[X|Y]).[X|Y]) :.Z). /* borrar(Elem.L.M). N is M+1.el numero de elementos de la lista Lista es N */ nel([].L).L2) <.L3) <.miembro(X.[X|Y]) :.[]).Inver) <.miembro(X.[_|Y]) :.[]).Y).L3).L.se borra el elemento Elem de la lista L1 obteniéndose la lista L2 */ borrar(X.Z) :. 3ª aproximación: unificación de variables miembro(X.M). /* nel(Lista.L2. ultimo(X.la lista L1 es un subconjunto de lista L2 */ subconjunto([X|Y]. inversa([X|Y]. insertar(E. /* ultimo(Elem.Y). miembro(E. Preguntas: © 1996-2000 Faraón Llorens Página 19 .Z) :. subconjunto(Y.L.insertar(E. miembro(X.[_|Y]) :.[X|Y]. /* concatena(L1.[X|_]).Lista es una lista */ es_lista([]).L2. insertar(X.Lista) <.L1.concatena(L1.N) :.Y).

d]).b]).d]. L=[d.N.Modifica el procedimiento borrar para que borre el elemento que ocupa la posición n de la lista: ?.d.L).b. no ?.c.b.b]).L).e] ?. N=3 3.b. L1=[].[a.d].c.e].[a.d.d].c].d.elemento(E. 2.b.b.e]).[a.[c. L2=[a. Ejercicios: 1.b.d]).nel([a.L.e]]).Escribe un procedimiento que obtenga el elemento que ocupa la posición n de una lista o la posición que ocupa el elemento e: ?.c. E=c ?.[a.b] More (y/n)? y L1=[a].LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA ?.[c.b]. E=a More (y/n)? y E=b More (y/n)? y no ?..b.elemento(c.c].b.e] ?.c]).miembro(E.[a.e]).3. L=[a.c.miembro(d. N=4 ?. L2=[] More (y/n)? y no Comprueba el funcionamiento de las restantes operaciones con listas y prueba con diferentes tipos de ejemplos.[d.[d.. L=[a.concatena(L1.b.[a.b. L2=[b] More (y/n)? y L1=[a.b.L2.e]).es_lista([a. yes ?.[a.N)..concatena([a.b.b.c.d] Página 20 © 1996-2000 Faraón Llorens .miembro(d.[a.miembro(d.c.borrar(3.c.[a.concatena([a.e].Comprueba el funcionamiento de las restantes operaciones con listas y prueba con diferentes tipos de ejemplos. no ?. yes ?.

Evolución de los parámetros: lista con un elemento menos nel([_|Y]. ESTRUCTURAS DE CONTROL 5. M1=M2+1=2 ?. d]. N is M+1. _L130) ? creep © 1996-2000 Faraón Llorens Página 21 . para así poder unificar en un momento dado con la cláusula de la condición de parada.d].trace.nel([[b.1.d].PROLOG 5.M1).nel([].nel([a.c].N).M2). En la recursión encontramos dos partes: • la primera parte en la que descendemos y construimos el árbol hasta encontrar el valor que unifica con la condición de parada • una segunda parte en la que ascendemos por el árbol asignando valores a las variables que teníamos pendientes en las sucesivas llamadas.M). _L104) ? creep Call: ( 8) nel([d]. ?.nel([d].c]. _G309) ? creep Call: ( 7) nel([[b.M3). Ejemplo: Procedimiento que calcula el número de elementos de una lista: S S Condición de parada: lista vacía nel([].notrace. Fijémonos en cómo algunos predicados de manejo de listas vistos en el punto anterior están definidos recursivamente. c]. RECURSIÓN Las definiciones recursivas se encuentran frecuentemente en los programas Prolog.0). [b.[b.N). N=M1+1=3 ?. En la recursividad debemos tener cuidado en que se cumplan las “condiciones de límite” (punto de parada cuando utilizamos recursividad).c].N) :. es decir.d].nel(Y. c]. d]. Call: ( 6) nel([a. Ejemplo: ?. M2=M3+1=1 M3=0 N=3 ?. _L117) ? creep Call: ( 9) nel([]. el cuerpo de la cláusula se llama a sí mismo. Podemos observar que en la llamada de la cláusula recursiva al menos uno de los argumentos crece o decrece.[b.nel([a.

[b.Y).hijo(Y. madre(X.Y) :. uno de los cuales está en la cabeza de una cláusula y el otro en el cuerpo de otra cláusula. 5. c]. La unificación constituye uno de los mecanismos esenciales de Prolog. 2) ? creep _G309 is 2 + 1 ? creep 3 is 2 + 1 ? creep nel([a. 1) ? creep _L104 is 1 + 1 ? creep 2 is 1 + 1 ? creep nel([[b. UNIFICACIÓN La unificación («matching») aplicada junto con la regla de resolución es lo que nos permite obtener respuestas a las preguntas formuladas a un programa lógico. c].c]. c]. [b. Prolog intentará hacerlos coincidir (unificarlos) mediante las siguientes reglas: • Una variable puede instanciarse con cualquier tipo de término. Recursión circular: padre(X. d]. y si Y está instanciada a Página 22 © 1996-2000 Faraón Llorens .[b.trace(nel). d].A). persona(adán). _L267) T Exit: ( 10) nel([]. c]. d]. Recursión a izquierdas: persona(X) :. d]. 3) ? creep ?. [b. y consiste en buscar instancias comunes a dos átomos. _G292) T Call: ( 8) nel([[b.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA Exit: ^ Call: ^ Exit: Exit: ^ Call: ^ Exit: Exit: ^ Call: ^ Exit: Exit: N = 3 Yes ( ( ( ( ( ( ( ( ( ( 9) 9) 9) 8) 8) 8) 7) 7) 7) 6) nel([].d]. d].padre(B. _L241) T Call: ( 9) nel([d]. c].2. d]. 2) T Exit: ( 7) nel([a. nel/2: call redo exit fail T Call: ( 7) nel([a.nel([a. _L254) T Call: ( 10) nel([]. Si X es una variable no instanciada.persona(Y). 0) ? creep _L117 is 0 + 1 ? creep 1 is 0 + 1 ? creep nel([d].X).B) :. hijo(A. y naturalmente con otra variable. 3) N = 3 Yes Deberemos tener cuidado de no escribir recursiones circulares (entrada en un bucle que no terminaría nunca) y de evitar la recursión a izquierdas (cuando una regla llama a un objetivo que es esencialmente equivalente al objetivo original). 1) T Exit: ( 8) nel([[b. que causarían que Prolog no terminara nunca.N). c]. 0) T Exit: ( 9) nel([d].

Evidentemente.juan=juan.juan) ?.X=juan. X=juan ?. Un objetivo con el predicado no igual (\=) se satisface si el = fracasa.juan=pepe. busca en la Base de Conocimientos desde su comienzo.X=Y. entonces X e Y son iguales. puede iniciarse la reevaluación pulsando la tecla «y» cuando Prolog acaba de dar una solución y pregunta «More (y/n) ?».9 \= 8. Ejemplos: ?. no ?.letra(C)=palabra(C).“juan”=juan. yes ?.amigo(pepe. no 5.1024=1024. y todos y cada uno de estos argumentos son unificables. X=juan. X=Y. X=juan.PROLOG cualquier término. yes ?.3. • Los números y los átomos sólo serán iguales a sí mismos. Vamos a ver dos conceptos ya utilizados y relacionados directamente con la reevaluación: • Satisfacer un objetivo: cuando Prolog intenta satisfacer un objetivo. X=juan.'juan'=juan. Y=amigo(pepe. Y=juan ?. el objetivo se satisface y las dos variables quedan compartidas (cuando una de ellas quede instanciada también lo hará la otra).juan)=amigo(pepe. Y=juan ?. con lo que se pone en marcha el proceso de generación de soluciones múltiples. y fracasa si el = se satisface. y X quedará instanciada a lo que valga Y. REEVALUACIÓN La reevaluación («backtracking») consiste en volver a mirar lo que se ha hecho e intentar resatisfacer los objetivos buscando una forma alternativa de hacerlo. yes ?. y: © 1996-2000 Faraón Llorens Página 23 . El predicado de igualdad (=) es un operador infijo que intentará unificar ambas expresiones.juan)=Y. • Dos estructuras son iguales si tienen el mismo nombre y el mismo número de argumentos.f(X. no ?. Si ambas están no instanciadas.X).Y)=f(A). Si se quieren obtener más de una respuesta a una pregunta dada. también se pueden instanciar con una variable. no ?. yes ?amigo(pepe.

el objetivo ha fallado. animal(cocodrilo). Y=hormiga More (y/n)? y X=mosca. /* gusta(X.Y) :.logica).espejo). gusta(X. .mosca).Y es un buen regalo para X */ regalo(X. e intentaremos resatisfacer el objetivo anterior.animal(X).si no encuentra ningún hecho o cabeza de regla que unifique.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA . animal(mosca). marca el lugar en la base de conocimientos e instancia todas las variables previamente no instanciadas que coincidan. Ejemplo (ej05. en cuyo caso. Y=espejo More (y/n)? y X=cocodrilo. X=mono.Y) <.si encuentra un hecho o la cabeza de una regla que pueda unificar con el objetivo. gusta(mosca.pl): /* animal(Anim) <.a X le gusta Y */ gusta(mono. Si es una regla lo encontrado. para ello intentará encontrar una cláusula alternativa para el objetivo. animal(araña). Gusta(alumno.regalo(X. gusta(cocodrilo. gusta(araña.banana). animal(gallina). Y=mosca More (y/n)? y X=cocodrilo.hormiga). Y=mono More (y/n)? y X=cocodrilo. Y=banana More (y/n)? y X=araña. Y=araña More (y/n)? y X=cocodrilo. Y=mosca More (y/n)? y X=araña. ?. se dejan sin instanciar todas las variables instanciadas al elegir la cláusula previa.animal(X).X) :.Y).Y). gusta(araña. intentará satisfacer los subobjetivos del cuerpo de dicha regla. Y=cocodrilo Página 24 © 1996-2000 Faraón Llorens . • Resatisfacer un objetivo: Prolog intentará resatisfacer cada uno de los subobjetivos por orden inverso. /* regalo(X.Y) <.Anim es un animal */ animal(mono). La búsqueda la empezamos desde donde habíamos dejado el marcador de posición del objetivo.

añadir nuevos hechos y/o reglas y estudiar como se van generando las sucesivas respuestas. ~~~ Se trata de una impureza en lo referente al control. el control en Prolog es fijo y viene dado de forma automática por la implementación del lenguaje: recursión. Es decir. ! . unificación y reevaluación automática.Optimización del tiempo de ejecución: no malgastando tiempo intentando satisfacer objetivos que de antemano sabemos que nunca contribuirán a una solución. convirtiendo en inaccesibles todos los marcadores de las metas que se encuentran a su izquierda. Esto es.4. De esta manera Prolog nos proporciona la ventaja de centrarnos en los aspectos lógicos de la solución. sin necesidad de considerar aspectos del control. Su utilidad vienen dada por: . Es un mecanismo muy delicado. lo que te permitirá ir viendo los pasos que sigue prolog para obtener las distintas respuestas. Ejercicio: Alterar el orden de los hechos de la base de conocimientos anterior. 5. El corte se representa por el objetivo “!” que se satisface inmediatamente y no puede resatisfacerse de nuevo.Optimización de memoria: al no tener que registrar puntos de reevaluación para un examen posterior. Los usos comunes del corte se pueden dividir en tres áreas según la intención con la que lo hayamos colocado: © 1996-2000 Faraón Llorens Página 25 . el corte puede conducirnos a programas difíciles de leer y validar. Además. y que puede marcar la diferencia entre un programa que funcione y uno que no funcione.PROLOG More (y/n)? y no Intenta entender porqué Prolog genera estas respuestas y en este determinado orden (Estrategias de resolución). Intenta entender por qué Prolog genera estas respuestas y en este determinado orden. EL CORTE El corte permite decirle a Prolog cuales son las opciones previas que no hace falta que vuelva a considerar en un posible proceso de reevaluación. . Te puede ayudar si activas la opción de traza mediante el predicado predefinido trace. se convierte en una valla que impide que la reevaluación la atraviese en su vuelta hacia atrás. ~~~.

Sum) <.Cociente) <. Ejemplo (ej06.. sumatorio(N1. deberá fracasar el objetivo. S is N+S1.natural(Y).natural(C).b.. que expresado sin utilizar el corte quedaría: a :. Si las metas siguientes fracasan.S) :. 2). a :.S1). c. el cual siempre fracasa como objetivo. natural(X) :. d. X is Y+1. por tanto. a :.d.b. Así.B. Y2 > A.not(b). El uso del corte con esta finalidad es semejante a simular un “if-then-else” ( si b entonces c sino d ): a :.pl): /* sumatorio(Num. en la cual puede que Prolog acabe intentando satisfacer b dos veces. !. Ejemplo (ej06.N1 is N-1.Cociente es el resultado de la division entera de Dividendo entre Divisor */ diventera(A.1) :. lo que hace que se desencadene el proceso de reevaluación. Y2 is (C+1)*B.!.ADVERTENCIA DE QUE SE VA POR MAL CAMINO: se informa a Prolog que haga fracasar el objetivo sin intentar encontrar soluciones alternativas.Sum es el sumatorio desde 1 hasta Num */ sumatorio(1. !. sumatorio(N.Num es un numero perteneciente a los Naturales */ natural(0). Este programa Prolog va generando números naturales hasta encontrar un C que cumpla la condición: B*C =< A < B*(C+1) Página 26 © 1996-2000 Faraón Llorens . Estudia que ocurriría si no hubiésemos puesto el corte en la primera cláusula.pl): /* natural(Num) <..Divisor.TERMINACIÓN DE LA GENERACIÓN DE SOLUCIONES MÚLTIPLES: se informa a Prolog que deseamos finalizar la generación de soluciones alternativas mediante reevaluación. Y1 =< A.C) :. Y1 is C*B. debemos sopesar las ventajas de un programa claro sin cortes frente a uno que sea más rápido. c. Se utiliza en combinación con el predicado de fallo fail.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA 1). /* diventera(Dividendo. 3). si ha pasado el corte ha encontrado la regla correcta para resolver el objetivo.CONFIRMACIÓN DE LA ELECCIÓN DE UNA REGLA: se informa a Prolog que va por buen camino.

concatena([a.E2.pl): /* concatena(L1.b.!. pero sólo uno de ellos es el que nos interesa y será el que pase la condición.[Y|L2]) :. /* sust(E1.E2. sust(E1.L2) <.d.b. X=[d. borrar(E.d. Así. sust(E1.[d. o incluso beneficioso.b.[E2|L2]) :. pero si tenemos el objetivo ?.L1.[].[]).E2.L1.concatena(X.L2) :.L1.L1.e].L2 es la lista resultado de borrar todas las ocurrencias del elemento Elem de la lista L1 */ borrar(_.[X|L3]) :. sust(E1. concatena([X|L1].[]).[a.concatena([a.e] ?. Y=[a.!.L2.L.[].c].L3).L2.L3 es la lista-conjunto unión de las © 1996-2000 Faraón Llorens Página 27 . el mismo corte puede provocar un comportamiento extraño si la regla se utiliza de otra forma.L2). borrar(E. el corte al final de la regla impide que en un posible proceso de reevaluación entremos en un bucle infinito: hemos encontrado la única solución y no hay ninguna razón para volver a buscar otra.L3) <. Ejemplos de uso del corte (ej06.X).L2) <.L2).b.L2.b.X.b.L) :. la respuesta es “no”.PROLOG siendo A el dividendo y B el divisor de la división. no hay garantía de que los resultados sean razonables si empiezan a aparecer objetivos de otra forma.sust(E1.[E|L1].e]).L2 es la lista resultado de sustituir en lista L1 todas las ocurrencias del elemento E1 por E2 */ sust(_.L2).c.E2.E2.c] More (y/n)? y no ante la petición de nuevas soluciones.pl): /* borrar(Elem.!.[A|L2]) :.concatena(L1.Y. aunque de hecho existan otras posibles soluciones a la pregunta.[Y|L1].c].[A|L1]. borrar(E.L3) <. X=[a. cuando se utiliza una regla de una forma dada. La regla natural va generando infinitos números naturales.c]). Así. /* union(L1.borrar(E. X=[].[a. Discusión del "corte" Mientras que un corte puede ser inofensivo.c. cuando consideramos objetivos de la forma ?.[E1|L1]. Sólo es posible utilizar el corte de una forma fiable si se tiene una visión clara de cómo se van a utilizar las reglas.L2). La conclusión sería que si se introducen cortes para obtener un comportamiento correcto cuando los objetivos son de una forma.L2.L1.L1. el siguiente predicado (ej06.concatenacion de las listas L1 y L2 dando lugar a la lista L3 */ concatena([].e] el corte resulta muy adecuado._.

L).b.[a.L2.c.d.L2).L3).b]. ?.a.d.sust(a.d.L2. union([X|L1].b.L).L).c.L).LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA listas-conjuntos L1 y L2 union([].borrar(a.c.b. L=[b.L.d.c]. L=[c.b.b] */ Página 28 © 1996-2000 Faraón Llorens .union(L1.[a.b.f.L3) :.b.[a. union(L1.[X|L3]) :.b]. !.miembro(X.union([a.L2.f.a.L3).a.b] ?.b.a.d. union([X|L1].L2.c.b. L=[b.d].d.d] ?.

Instancia X al término leído. aparecen los predicados de Entrada/Salida. 6. si X no estaba instanciada. PREDICADOS DE ENTRADA Y SALIDA Vamos a introducir una nueva ampliación sobre Prolog que no tiene nada que ver con la lógica. nl tab(X) display(X) © 1996-2000 Faraón Llorens Página 29 . término. Nueva Línea: la salida posterior se presenta en la siguiente línea de la pantalla. se sacará por pantalla una variable numerada de forma única (por ejemplo _69). los comparará y se satisfará o fracasará dependiendo del éxito de la comparación. Debe ir seguido de un punto “.. X debe estar instanciada a un entero. lo saca por pantalla. Desplaza el cursor a la derecha X espacios. aceptando entradas del usuario y presentando salidas al mismo.” y un “retorno de carro”.. .se evaluan siempre a verdad . Pero puede que estemos interesados en una mayor interacción entre programa y usuario. excepto que pasa por alto cualquier declaración de operadores que se haya hecho. Así. el único modo de comunicar información a y desde Prolog es a través del proceso de unificación entre nuestras preguntas y las cláusulas del programa.1. Hasta ahora. que para mantener la consistencia del sistema cumplen: .nunca se pueden resatisfecer: la reevaluación continua hacia la izquierda .PROLOG 6. Se comporta como “write”. LECTURA Y ESCRITURA DE TÉRMINOS Escritura de términos write(X) Si X está instanciada a un término. Si X si que está instanciada. Lectura de términos read(X) Lee el siguiente término que se teclee desde el ordenador. Si X no está instanciada.tiene un efecto lateral (efecto no lógico durante su ejecución): entrada o salida de un carácter.

ibl(X). LECTURA Y ESCRITURA DE CARACTERES El carácter es la unidad más pequeña que se puede leer y escribir.lista] . ibl([X|Y]) :write(X). saca por pantalla el carácter correspondiente a ese código ASCII.5). tab(1). es decir saca por pantala los elementosa de la lista separados por un espacio y terminado en salto de línea */ ibl([]) :.. los comparará satisfaciéndose o fracasando.escribe en pantalla la lista L de códigos ASCII en forma de cadena de caracteres */ Página 30 © 1996-2000 Faraón Llorens . nl. 8+5*6 +(8.6)) yes ?. 8*5+6 +(*(8.nl. [esto. get0(X) Igual que el anterior. Escritura de caracteres put(X) Si X está instanciada a un entero entre 0.nl.pl): /* ibl(L) <.write(8*5+6). display(8*5+6). nl.X=[esto. error.(lista. instanciando X al primer carácter imprimible que se teclee.una.nl.pl): /* escribe_cadena(L) <.imprime la lista L de forma bonita..(una. Si X ya está instanciada. ibl(Y).lista].es.255. display e ibl */ ?.(esto.write(8+5*6).. display(8+5*6).es.write(X).6) yes ?. Ejemplos (ej07.una.[])))) esto es una lista yes 6. Si X no está instanciada o no es entero. Prolog trata a los caracteres en forma de enteros correspondientes a su código ASCII.. Lectura de caracteres get(X) Lee caracteres desde el teclado.*(5. /* Diferencia entre write.2.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA Ejemplos (ej07.(es. sin importarle el tipo de carácter tecleado.display(X).

114.108.111. se hace que los caracteres aparezcan en la pantalla. Prolog yes 6. Se pueden tener abiertos varios ficheros. Al final del fichero. Posiblemente queramos leer y escribir sobre ficheros almacenados en discos magnéticos. Si X no está instanciada. si conmutamos el canal de salida activo sin cerrarlos (told).103]). Los ficheros tienen una longitud determinada. se satisface si es el nombre del fichero actual de salida. tell(X) © 1996-2000 Faraón Llorens Página 31 . ?. puede generarse un fin de fichero tecleando el carácter de control ASCII 26 o control-Z. En Prolog los nombres de ficheros se representan como átomos. producirá un error.put(111). Prolog yes ?.escribe_cadena([80. escribe_cadena([X|Y]) :. Pero pueden escribirse términos y caracteres sobre ficheros utilizando los mismos predicados que se acaban de ver. Crea un nuevo fichero con ese nombre.put(80).111. y dirige la salida hacia la pantalla. Al leer de este fichero se hace que la información de entrada venga desde el teclado. escribe_cadena(Y). hay una marca especial de fin de fichero. sin destruir lo escrito previamente. Escritura sobre ficheros Si X está instanciada al nombre de un fichero. Este el modo normal de funcionamiento.PROLOG escribe_cadena([]).3. contienen un cierto número de caracteres.put(108). Si X no está instanciada o no es un nombre de fichero.put(114). Si X está instanciada. y al escribir. LECTURA Y ESCRITURA EN FICHEROS Existe un fichero predefinido llamado user.put(103). permitiéndonos escribir sobre ellos en varios momentos diferentes. es decir. la instanciará al nombre del telling(X) fichero que es el canal de salida activo. cambia el canal de salida activo.put(111). told Cierra el fichero para escritura. La única diferencia es que cuando queramos escribir o leer en un fichero debemos cambiar el canal de salida activo o el canal de entrada activo. Cada uno de estos tendrá un nombre de fichero que utilizamos para identificarlo. Cuando la entrada viene del teclado.put(X). respectivamente.

. . seen Cierra el fichero para lectura. . se satisface si es el nombre del fichero actual de entrada.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA Lectura de ficheros see(X) Si X está instanciada al nombre de un fichero.. write(C)... /* Secuencia normal de lectura */ .. write(B). told... producirá un error. seen... . La primera vez que se satisface. la instanciará al nombre del fichero que es el canal de entrada activo. y dirige la entrada hacia el teclado.. tell(fichero). el fichero pasa a estar abierto y empezamos al comienzo del fichero. tell(fichero). /* Conmutación de ficheros */ . tell(fichero). seeing(X) Si X no está instanciada. see(fichero). read(X). cambia el canal de entrada activo al fichero especificado. write(A). Ejemplos: /* Secuencia normal de escritura */ . Página 32 © 1996-2000 Faraón Llorens . . tell(user). write(X).. Si X está instanciada. told. Si X no está instanciada o no es un nombre de fichero.

y no otras posibles con el mismo nombre que tuviese el sistema de alguna consulta anterior. al final de las ya existentes. con la ventaja añadida de que lo podremos modificar y ampliar en cualquier momento. © 1996-2000 Faraón Llorens Página 33 . dígitos y el carácter subrayado. Si queremos que Prolog lea nuevas cláusulas de un fichero que hemos preparado previamente. También es interesante cuando queremos asegurarnos que se utilizan las cláusulas que vamos a leer. sin destruir las anteriores. 7. reconsult(Fichero) El predicado predefinido reconsult actúa como el consult excepto que. Como argumento pasamos un átomo con el nombre del fichero del que queremos leer las cláusulas. podemos utilizar los predicados consult y reconsult. eliminando o modificando cláusulas. la barra invertida «\» para el directorio o el punto «. se pone el nombre en la lista tal cual. Pero esto dependerá del sistema Prolog utilizado. Si se quiere consultar un fichero. MODIFICACIÓN DE LA BASE DE CONOCIMIENTOS Vamos a estudiar una serie de predicados predefinidos en Prolog que nos permitirán manipular la Base de Conocimientos consultando. Consiste en poner los nombres de los ficheros en una lista y darla como objetivo a satisfacer.» para la extensión6) deberemos encerrarlo entre comillas simples.PROLOG 7.pro». Recordemos que un átomo está formado por letras. de existir cláusulas para un mismo predicado (nombre y aridad). La mayor parte de las implementaciones permiten una notación especial que permite consultar una lista de ficheros. consult(Fichero) El predicado predefinido consult añade las cláusulas existentes en el fichero de nombre Fichero a la base de conocimientos de Prolog. Así. mientras que si se quiere reconsultar se pone el nombre precedido de un signo “-”. Esto será conveniente cuando tengamos que trabajar con programas de tamaño considerable y no queramos teclear cada vez todas las cláusulas. podremos crear el programa con un editor de textos y guardarlo para posteriores usos. añadiendo. ya que de esta manera la nueva versión sustituye a la anterior errónea. toma la extensión «.1. Si queremos que contenga otros caracteres (los dos puntos «:» para la unidad. Se suele utilizar para la corrección de errores mientras se está realizando el programa. 6 Por defecto. ADICIÓN DE BASES DE CONOCIMIENTO EXTERNAS En Prolog los ficheros se utilizan principalmente para almacenar programas y no perderlos al apagar el ordenador. Prolog-2. uno tras otro: la notación en forma de lista. las nuevas sustituyen a las existentes.

a:prac1 reconsulted ?. lpo\prac1 consulted ?.miercoles) .pro’].'a:prueba2']. /* asignatura/2 */ asignatura(logica.-'prueba'.consult(fichero). fichero1 consulted fichero2 reconsulted prueba reconsulted a:prueba2 consulted ?.reconsult(fichero). /* asignatura/1 */ asignatura(logica) . MANIPULACIÓN DE LA BASE DE CONOCIMIENTOS Veamos ahora los predicados predefinidos que podemos utilizar para ver (listing).martes) . asignatura(programacion. fichero consulted ?. Ejemplos : ?.consult(‘prac1. yes Página 34 © 1996-2000 Faraón Llorens . asignatura(matematicas) . obtener (clause). prac1.pro consulted ?.[-‘a:\lpo\prac1.[‘lpo\prac1’].pro reconsulted 7. El predicado de aridad 0 listing (sin parámetro) muestra todas las cláusulas de la Base de Conocimientos.[fichero1.-fichero2.lunes) . añadir (assert) o quitar (retract y abolish) cláusulas de nuestra base de conocimientos: listing listing(Predicado) Todas las cláusulas que tienen como predicado el átomo al que está instanciada la variable Predicado son mostradas por el fichero de salida activo (por defecto la pantalla). a:\lpo\prac1.listing(asignatura). asignatura(programacion) . asignatura(matematicas. fichero reconsulted ?.pro’).LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA Ejemplos: ?.2.reconsult(‘a:prac1’).

Cuerpo) Se hace coincidir Cabeza con la cabeza y Cuerpo con el cuerpo de una cláusula existente en la Base de Conocimientos. se irán eliminando. las cláusulas que coincidan. El predicado asserta la añade al principio (letra «a») y assertz la añade al final (letra «z») de cualquier otra cláusula del mismo tipo que hubiese en la base de conocimientos.assert(asignatura(logica)).lunes) . Clausula debe estar previamente instanciada a una cláusula. Un hecho es considerado como una cláusula cuyo cuerpo es true.listing(asignatura/2). asignatura(matematicas.asignatura(X) no ?. asignatura(logica. yes ?. asignatura(programacion. En todos los casos.assertz(asignatura(programacion)). yes clause(Cabeza. assert(Clausula) asserta(Clausula) assertz(Clausula) Estos predicados permiten añadir nuevas cláusulas a la base de conocimientos. sucesivamente. © 1996-2000 Faraón Llorens Página 35 . Para ello. Ejemplos : ?. Clausula debe estar instanciada y se quitará la primera cláusula de la base de conocimientos que empareje con ella.PROLOG ?. yes ?.asserta(asignatura(matematicas)).miercoles) . Por lo menos Cabeza debe estar instanciada. Dicha cláusula queda incorporada a la base de conocimientos y no se pierde aunque se haga reevaluación. X = matematicas More (y/n)? y X = logica More (y/n)? y X = programacion More (y/n)? y no retract(Clausula) Este predicado nos permite eliminar una cláusula de nuestra base de conocimientos. yes ?.martes) . Si se resatisface el objetivo.asignatura(X).

abolish(asignatura. Ejemplos : ?. yes ?. yes ?. yes ?. asignatura(programacion.Aridad) Retira de la Base de Conocimientos todas las cláusulas del predicado Predicado.listing(asignatura). asignatura(matematicas) .lunes) .martes) . yes Página 36 © 1996-2000 Faraón Llorens . /* asignatura/1 */ asignatura(matematicas) . X = matematicas More (y/n)? n yes ?.retract(asignatura(X)). asignatura(matematicas. asignatura(logica) .retract(asignatura(logica)).LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA Ejemplos : ?. /* asignatura/1 */ asignatura(matematicas) . asignatura(programacion) . /* asignatura/1 */ asignatura(programacion) .miercoles) .miercoles) . yes ?. Debe estar identificado completamente el predicado : nombre y aridad.2). asignatura(matematicas.abolish(asignatura/1).listing(asignatura).listing(asignatura). /* asignatura/2 */ asignatura(logica. yes abolish(Predicado/Aridad) abolish(Predicado. asignatura(programacion) .listing(asignatura).listing(asignatura). /* asignatura/1 */ asignatura(logica) . yes ?. /* asignatura/2 */ asignatura(logica. yes ?. asignatura(programacion) .martes) .lunes) . asignatura(programacion.

yes 7.3. Así.cuando Nombre y Aridad están instanciados. Nieto). E = libro(_.teniendo Estructura instanciada.PROLOG ?. N = 0 ?. Se puede utilizar básicamente de dos maneras : . F = . . por lo que Estructura queda instanciada a una estructura con el nombre y el número de argumentos dados.functor(3+2.N). Padre). =. arg. N = 2 ?. Ejemplos : ?. Nieto) :.. Veamos ahora una de sus ventajas : el considerar a las propias cláusulas como estructuras nos permite manipularlas (construir.Aridad) Estructura es una estructura con nombre Nombre y aridad (número de argumentos) Aridad.listing(asignatura). y por tanto hace corresponder a Nombre con el nombre de dicha estructura y Aridad con un entero que indica el número de argumentos.padre(Abuelo.functor(logica.2). como estructuras.N).c].F. padre(Padre. modificar. la siguiente regla la considera Prolog constituida como la estructura de la figura : abuelo(Abuelo.functor([a.. F = logica.) con los predicados de construcción y acceso a los componentes de las estructuras functor._) © 1996-2000 Faraón Llorens Página 37 . añadir.functor(E. y name.F. eliminar. . :- abuelo .Nombre.F. F = +. COMPONENTES DE ESTRUCTURAS Como ya hemos comentado anteriormente Prolog considera los hechos y las reglas.libro.N). . e incluso los mismos programas. N = 2 ?. Abuelo Nieto padre padre Abuelo Padre Padre Nieto functor(Estructura..b.

[+.Clausula =.2. [asignatura.3). los dos primeros argumentos instanciados. L = [p.p(x.Estructura..arg(1..[a. por lo menos.) nos permite acceder a argumentos de estructuras de las que no conocemos de antemano el número de componentes.x.arg(2.+. Si Estructura está instanciada. Arg = 1+2 ?. Arg = a ?.f(y)..11) name(Atomo.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA ?.logica.arg(2. Página 38 © 1996-2000 Faraón Llorens . Arg = f(y) ?. y sirve para acceder a un determinado argumento de una estructura.3].functor(3+2+1. Se debe utilizar con. y cuyos argumentos serán los distintos elementos de la lista.c].f(y)). Lista El predicado univ (=. E = 2+3 ?.Arg).Argumento) El argumento de la estructura Estructura que ocupa la posición Posicion es Argumento. como crear la lista de caracteres correspondientes al átomo.+.p(x.f(y). Clausula = asignatura(logica. Ejemplos : ?.Lista) Atomo es un átomo formado por los caracteres de la lista Lista (códigos ASCII).11]. Si Lista está instanciada.Arg).z] ?. yes Estructura =. creará una estructura cuyo functor será la cabeza de la lista. tanto crear un átomo con los caracteres de la lista de códigos ASCII. Puede.. yes arg(Posicion.E =. L..logica). Lista será una lista cuyo primera componente (cabeza) es el functor de la estructura y el resto (cola) los distintos argumentos de dicha estructura.1+2+3.lunes.asignatura(logica. no ?.lunes.2).b.Arg). Ejemplos : ?.functor(3+2+1.z) =.lunes).arg(1.

L).name(Atomo.103]).[80.111.114.111.PROLOG Ejemplos : ?.“hola”). yes © 1996-2000 Faraón Llorens Página 39 .name(hola.name(logica.108. Prolog ?. L = “logica” ?.

M). los errores semánticos se refieren a incorrecciones en el razonamiento o la interpretación. Estos predicados son : trace. En cambio hay tipos de errores difíciles de detectar. y Prolog nos informa de ellos inmediatamente que consultamos el programa.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA 8. notrace.. ya que es raro que nuestros programas funcionen a la primera. no cerrar comillas en una cadena. • Los errores sintácticos hacen referencia a la estructura gramatical de las sentencias (falta del punto al final de un hecho o una regla. Y aquí es donde entran en juego los predicados predefinidos que veremos a continuación y que nos facilitarán el seguimiento de la traza. DEPURACIÓN DE PROGRAMAS PROLOG Por último. por contra. spy. debugging y nodebug. La gran mayoría de los errores cometidos son de este tipo.M).P. y siempre es de agradecer cualquier tipo de ayuda que nos pueda prestar el interprete.padres(X. • Por otro lado. padres(Y. y por ello nos proporciona una limitada ayuda. Ejemplos : interpretación razonamiento padre(felix. Son.. nospy. . complicados de descubrir ya que el ordenador no puede saber lo que nosotros pretendemos.Y) :. Solamente pueden ser descubiertos siguiendo el proceso de inferencia paso a paso (traza de la ejecución). pero sin embargo son fáciles de localizar y corregir.).borja) ¿quién es el padre? hermanos(X. Los errores en programación pueden ser clasificados en dos grandes grupos : errores sintácticos y errores semánticos. veremos una serie de predicados predefinidos para supervisar el funcionamiento de los programas Prolog durante su ejecución que nos permitirán la depuración y corrección de nuestros programas. Muchos de estos errores son fácilmente identificables y por tanto se pueden corregir sin dificultad. Ejemplo : hombre[jorge). ¡una persona es hermano de sí mismo ! Pero antes de continuar debemos repasar algunos conceptos ya vistos : • • • • Call : se intenta satisfacer dicho predicado Exit : el predicado ha tenido éxito y se ha satisfecho Fail : el objetivo ha fracasado Redo : se intenta resatisfacer el objetivo al haber fracasado un predicado posterior Página 40 © 1996-2000 Faraón Llorens .P.

Podemos utilizar las siguientes opciones del modo traza : Opción <return> «a» «c» «e» «f» «g» Nombre retorno de carro abort continue exit fail goal stack «l» «r» «s» leap retry skip Descripción continua con la traza retorna a Prolog continua con la traza abandona el sistema Prolog hace fallar a ese objetivo muestra la pila de objetivos cumplidos que nos han permitido llegar al objetivo actual realiza la pausa solamente en los puntos espía intenta de nuevo satisfacer el objetivo salta el modo interactivo hasta que se cumple o falla ese objetivo notrace Su efecto es el inverso del predicado anterior. spy Predicado Fija un punto espía en el predicado Predicado para poder seguir su funcionamiento. Predicado debe ser : • un átomo : se ponen puntos espía en todos los predicados con ese átomo. A partir de la consecución de este objetivo. viendo los distintos objetivos que intenta satisfacer y el resultado de esta acción. [iniciar. pidiéndonos que confirmemos cada paso. hay una interacción entre el programador y la máquina Prolog. iniciar/1. • una estructura (functor/aridad) : sólo establecería puntos espía en aquellos predicados con dicho functor y número de argumentos. es decir. • una lista : situaría puntos espía en todos los lugares especificados por cada uno de los elementos de la lista.PROLOG trace Activa el seguimiento exhaustivo de la traza de la ejecución de las metas posteriores a la consecución de este objetivo. pertenece]. Ejemplos : ????spy spy spy spy iniciar. independientemente del número de argumentos que tengan. desactiva la traza. © 1996-2000 Faraón Llorens Página 41 . iniciar/0.

There are spypoints set on : iniciar/0 iniciar/1 pertenece/2 nodebug Retira todos los puntos espía activos en ese momento. Página 42 © 1996-2000 Faraón Llorens . Ejemplo : ?.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA nospy Predicado Elimina los puntos espía especificados en Predicado (determinado de manera análoga a la referida en el punto anterior) debugging Permite ver una lista con los puntos espía que se han establecido hasta el momento.debugging.

Dichos mecanismos contribuyen a dar mayor potencia y expresividad al lenguaje. Prolog ofrece mecanismos de control típicos de cualquier lenguaje imperativo y no puras propiedades o relaciones entre objetos. al igual que los lenguajes procedimentales. © 1996-2000 Faraón Llorens Página 43 . así como un buen estilo de programación.2. estaremos en condiciones de hacer las preguntas de las que queramos obtener respuesta o que resuelvan el problema. ENTORNO DE TRABAJO En la siguiente figura podemos ver un esquema de la forma de trabajo en Prolog. pero violan su naturaleza lógica. necesitan de una metodología para construir y mantener programas largos. Posteriormente desde Prolog deberemos consultar el fichero deseado. Una vez consultada la base de conocimientos correspondiente. ESTILO DE PROGRAMACIÓN EN PROLOG Los lenguajes de Programación Lógica. Mediante un editor de texto escribiremos nuestra Base de Conocimientos compuesta por distintos hechos y reglas que reflejan nuestro conocimiento acerca del problema a formalizar. PROGRAMACIÓN EN PROLOG 9.1.PROLOG 9. Base de Conocimientos: • Hechos • Reglas Preguntas Consultar  Guardar 9. Adoptando un estilo apropiado de programación podemos beneficiarnos de esta doble naturaleza de Prolog. Este ciclo se repetirá continuamente (editar-guardar-consultar-preguntar) hasta que demos por finalizado nuestro trabajo. Para poder utilizarlo deberemos guardarlo en disco (disco duro o disquete).

LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA

• Metodología de Diseño “top-down”: descomponemos el problema en subproblemas y los resolvemos. Para ello solucionamos primero los pequeños problemas: implementación “bottom-up”. Esto nos va a permitir una mejor depuración («debugged») de nuestros programas, ya que cada pequeño trozo de programa puede ser probado inmediatamente y, si lo necesita, corregido. • Una vez analizado el problema y separado en trozos, el siguiente paso es decidir como representar y manipular tanto los objetos como las relaciones del problema. Debemos elegir los nombres de los predicados, variables, constantes y estructuras de manera que aporten claridad a nuestros programas (palabras o nombres mnemónicos que estén relacionados con lo que hacen). • El siguiente paso es asegurarse de que la organización y la sintaxis del programa sea clara y fácilmente legible: - Llamamos procedimiento al conjunto de cláusulas para un predicado dado. Agruparemos por bloques los procedimientos de un mismo predicado (mismo nombre y mismo número de argumentos). Así, cada cláusula de un procedimiento comenzará en una línea nueva, y dejaremos una línea en blanco entre procedimientos. - Si el cuerpo de una regla es lo bastante corto, lo pondremos en una línea; sino, se escriben los objetivos de las conjunciones indentados y en líneas separadas. - Primero se escriben los hechos, y luego las reglas. - Es recomendable añadir comentarios y utilizar espacios y líneas en blanco que hagan el programa más legible. El listado del programa debe estar “autodocumentado”. Debemos incluir para cada procedimiento y antes de las cláusulas el esquema de la relación. - Agrupar los términos adecuadamente. Dividir el programa en partes razonablemente autocontenidas (por ejemplo, todos los procedimientos de procesado de listas en un mismo fichero). - Evitar el uso excesivo del corte. - Cuidar el orden de las cláusulas de un procedimiento. Siempre que sea posible escribiremos las condiciones limite de la recursividad antes de las demás cláusulas. Las cláusulas “recogetodo” tienen que ponerse al final.

9.3. INTERPRETACIÓN PROCEDIMENTAL PROLOG

DE

LOS

PROGRAMAS

Página 44

© 1996-2000 Faraón Llorens

PROLOG

Podemos realizar una interpretación de los programas Prolog desde un punto de vista más cercano a los lenguajes de programación. Si estamos intentando resolver un determinado problema, tenemos que: • las preguntas son los objetivos o problemas a resolver. Si las preguntas Pi contienen variables xi, la interpretación que hacemos es que debemos hallar los valores de xi que resuelvan los problemas Pi. ?- P1 , ..., Pm. una regla es interpretada como un procedimiento o método para resolver un subproblema. Así, ante un problema B que empareje con A con µ=UMG(A,B), el problema original se reduce a resolver los subproblemas A1µ , ..., Amµ. A :- A1 , ..., Am. un hecho es interpretado como un procedimiento que resuelve de forma directa un determinado problema. A.

De forma general, cuando tenemos que resolver un determinado problema B, buscamos un procedimiento, directo (A.) o no (A :- A1 , ..., Am.), que empareje con él (µ=UMG(A,B)). Esto tiene lugar en dos fases: 1. Una primera fase que afecta a las variables del procedimiento (A1 , ..., Am), de forma que se transfiere la entrada del problema B al procedimiento que trata de resolverlo. Tendremos por tanto un unificador de entrada µe. 2. Una segunda fase que afecta a las variables del problema a resolver (B), que transfiere la salida del procedimiento una vez resuelto. Tendremos por ello un unificador de salida µs. Un programa lógico se compone de un conjunto de procedimientos (directos o hechos y compuestos o reglas). Su ejecución consistirá en su activación por medio de una pregunta objetivo o problema a resolver. Dicha pregunta irá activando distintos procedimientos para su resolución. Los programas lógicos son más abstractos que los programas convencionales ya que no incorporan control sobre los procedimientos invocados ni el orden en que deben realizarse. Los programas lógicos expresan únicamente la lógica de los métodos que resuelven el problema y son, por tanto, más fáciles de comprender, de verificar y de modificar. Otra característica destacable de los programas lógicos viene dada por los parámetros de los procedimientos, que en este caso son argumentos de predicados y que por tanto no tienen dirección, es decir, igual pueden servir como parámetros de entrada como de salida dependiendo del contexto en el cual se haya invocado el procedimiento. Así, los parámetros dados en forma de constante en la llamada son considerados como parámetros de entrada y el resto de parámetros son computados como parámetros de salida. Ejemplo:
Sea el siguiente programa en prolog: padresDe(clara,felix,chelo). padresDe(borja,felix,chelo).

© 1996-2000 Faraón Llorens

Página 45

LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA

hermanos(X,Y) :- padresDe(X,P,M), padresDe(Y,P,M). Si lanzamos el objetivo ?- hermanos(clara,borja). nos contestará que sí. Aquí, los dos argumentos, tanto “clara” como “borja”, son considerados como parámetros de entrada. Por otra lado, si lanzamos el objetivo ?- hermanos(clara,X). nos responde que si X=borja el problema queda solucionado. En este caso el primer argumento, “clara”, es considerado como parámetro de entrada y el segundo, X, es considerado como parámetro de salida, obteniéndose como respuesta si X=borja.

En comparación con los programas convencionales, los programas lógicos son no deterministas, en el sentido de que: - la estrategia de resolución por medio de la cual se van probando procedimientos alternativos no está determinada - el orden de ejecución dentro de los subobjetivos no está determinada. Esta propiedad la perdemos al tomar decisiones concretas a la hora de realizar la resolución (SLD-Resolución) y es lo que ocurre con Prolog. Para conseguir repeticiones de la misma orden, estructura repetitiva de los lenguajes de programación, mediante Prolog deberemos utilizar procedimientos recursivos (como se ha visto detalladamente al manejar listas).

9.4. VENTAJAS DE PROLOG
Prolog, y en general los lenguajes de programación lógica, tienen las siguientes ventajas frente a los lenguajes clásicos (procedimentales): ƒExpresividad: un programa (base de conocimiento) escrito en prolog puede ser leído e interpretado intuitivamente. Son, por tanto, más entendibles, manejables y fáciles de mantener. ƒEjecución y búsqueda incorporada en el lenguaje: dada una descripción prolog válida de un problema, automáticamente se obtiene cualquier conclusión válida. ƒModularidad: cada predicado (procedimiento) puede ser ejecutado, validado y examinado independiente e individualmente. Prolog no tiene variables globales, ni asignación. Cada relación está autocontenida, lo que permite una mayor modularidad, portabilidad y reusabilidad de relaciones entre programas. ƒPolimorfismo: se trata de un lenguaje de programación sin tipos, lo que permite un alto nivel de abstracción e independencia de los datos (objetos). ƒManejo dinámico y automático de memoria.

Página 46

© 1996-2000 Faraón Llorens

!.yfx.PL */ /* Programa : " FORMAS NORMALES " */ /* Lee una fórmula del Cálculo de */ /* Proposiciones. PROGRAMA EJEMPLO: Formas Normales El siguiente programa comprueba si una fórmula del Cálculo de Proposiciones es una fórmula bien formada (fbf) y la transforma a Forma Normal Conjuntiva (FNC) y a Forma Normal Disyuntiva (FND): (ej08.FND).pl) /*************************************************************/ /* */ /* Departamento de Ciencia de la Computación e I. */ /* */ /*************************************************************/ /* Declaración de conectivas lógicas ?. Jesús Castel Faraón Llorens */ /* */ /* S.yfx.PROLOG 10.op(100. O. */ /*-----------------------------------------------------------*/ /* PROGRAMA PRINCIPAL */ menu :.FND). ?. : MS-DOS (Windows) */ /* Interprete : SWI-Prolog */ /* Fichero : EJ08.op(200. !.imp).op(100. ?. leer(Formula). hacer('a') :. */ /* */ /* Se lanza con : */ /* ?.yfx.op(10. ?.cabecera.yfx. ?.coimp). */ /* Universidad de Alicante */ /* */ /* LOGICA DE PRIMER ORDEN */ /* Prolog */ /* */ /* M. hacer('A') :. /* Fin Programa Principal */ /*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/ /* Determinar si es una Fórmula Bien Formada */ © 1996-2000 Faraón Llorens Página 47 .o).cabecera. formaNormal(Formula. fail. comprueba si es una */ /* Fórmula Bien Formada.fbf(Formula). X=0.integer(X).no).cabecera.y). escribirFormasNormales(FNC. ayuda. fail. fail. y la transforma */ /* a Forma Normal Conjuntiva (FNC) y a */ /* Forma Normal Disyuntiva (FND).fx.FNC.A. hacer(Formula) :.menu. repeat.op(200.!. hacer(Formula). hacer(X) :. ayuda.

fbf(P). /* negar(Form.fbf(Q).Q1).'). quitarImplicadores(P.F1).!.P).Form1) <.P1) :.!.Q1).P1).!.atom(P). fbf((P imp Q)) :.q.normalizarNegadores(P.!. fbf((P coimp Q)) :. nl.fbf(Q).FND).(P1 o Q1)) :. fbf(_) :.P1).normalizarNegadores(P. quitarImplicadores(Q.P1) :. fbf((P o Q)) :.nl. /* normalizarNegadores(Form.Fnc. normalizarNegadores((P y Q).F2).((no P1) o Q1)) :!. quitarImplicadores((no P).quitarImplicadores(P.fbf(Q).Fnd) <.quitarImplicadores(P.Form1) <.P1).Q1).Form es una fórmula bien formada (fbf) del Cálculo de Proposiciones */ fbf((no P)) :.[p.fbf(P).Prop es una variable proposicional */ proposicion(X) :.(P1 y Q1)) :.Form1 es la fbf resultado de eliminar implicadores y coimplicadores a la fbf Form */ quitarImplicadores((P imp Q).P1). fail.(P1 o Q1)) :!.v]).!.Form1 es la fbf resultado de negar la fbf Form. quitarImplicadores(Q.proposicional'). normalizarNegadores(Q.!.P1).P1). quitarImplicadores(Q.!. normalizarNegadores(P.quitarImplicadores(P. Página 48 © 1996-2000 Faraón Llorens . quitarImplicadores((P o Q).!. negar(P.negar(P.quitarImplicadores(P.(((no P1) o Q1) y ((no Q1) o P1))) :!.fbf(P). write('¡ERROR! : Formula erronea.nl. /*-----------------------------------------------------------*/ /* Transformar a Forma Normal */ /* formaNormal(Form.FNC. negar((P y Q).fail.P1). proposicion(_) :.normalizarNegadores(P.(no P1)) :.negar(P.Form1 es la fbf resultado de normalizar los negadores a la fbf Form */ normalizarNegadores((no P).t.!.Fnc es la Forma Normal Conjuntiva y Fnd es la Forma Normal Disyuntiva de Form */ formaNormal(Formula.P1).(P1 o Q1)) :.fbf(Q). normalizarNegadores(Q.quitarImplicadores(P. !.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA /* fbf(Form) <. exteriorizarDisyuntor(F2. fbf(P) :.u.r. negar(Q. /* quitarImplicadores(Form.(P1 y Q1)) :!.!.(P1 y Q1)) :.negar(P.P1).!.fbf(P).Q1).!.nl. nl. quitarImplicadores((P coimp Q).FND) :.miembro(X. exteriorizarConjuntor(F2. write('¡ERROR! no es simbolo de var.(no P)).!.FNC). normalizarNegadores((P o Q). quitarImplicadores(Q.proposicion(P).P).P1).Q1). nl.fbf(P). /* proposicion(Prop) <.!. negar(Q.P1).quitarImplicadores(Formula. Vuelve a introducirla.Q1). negar((P o Q).Q1).Q1).!. fbf((P y Q)) :. normalizarNegadores(F1. quitarImplicadores((P y Q). teniendo en cuenta la Eliminación del Doble Negador y las leyes de De Morgan */ negar((no P).Form1) <.s.

exteriorizarDisyuntor(P.nl.write(' Introduce la formula terminada en punto (. write('________________FORMAS NORMALES').P1).P).R) :.nl.Q1).P1). exteriorizarConjuntor((P y Q). exteriorizarConjuntor(P.nl.P1). /**** ESCRIBIR la formula en FNC y FND ****/ escribirFormasNormales(FNC.(P1 y Q1)) :.Q1).nl. /**** LEER lee una formula del Calculo de proposicions ****/ leer(F) :. exteriorizarDisyuntor((Q y R). exteriorizarConjuntor((P o R). exteriorizarDisyuntor((P y R).nl.write('no negacion').nl.(P1 y Q1)) :.R) :.Form1) <.write('o disyuncion'). write(' Tecnologia Informatica y Computacion'). fnd1((P1 y Q1).P).nl. exteriorizarDisyuntor(Q. nl.PROLOG /* exteriorizarConjuntor(Form.Q1).!.nl.(P1 y Q1)) :!.nl.nl.Q1).write('y conjuncion'). exteriorizarDisyuntor(P. fnd1(((P o Q) y R). write(' Forma Normal Conjuntiva'). write('Proposiciones. exteriorizarConjuntor(P. tab(20).P).nl.Q1). exteriorizarConjuntor(Q.!. tab(20). exteriorizarDisyuntor((P o Q). exteriorizarDisyuntor((R y Q). nl.'). exteriorizarDisyuntor(P.(P1 o Q1)) :!.P1).nl. exteriorizarConjuntor(Q.nl. exteriorizarConjuntor((R o Q).Form1 es la fbf resultado de exteriorizar los conjuntores de la fbf Form */ exteriorizarConjuntor((P o Q).P1). © 1996-2000 Faraón Llorens Página 49 .nl.Form1) <.Q1).Form1 es la fbf resultado de exteriorizar los Disyuntores de la fbf Form */ exteriorizarDisyuntor((P y Q).write(' ( 0 Terminar / A Ayuda )').nl.P1).write(' El programa lee una formula del Calculo de'). exteriorizarConjuntor((R o P).nl.nl.Q1).nl.P). read(F).write('FORMA NORMAL CONJUNTIVA:'). fnc1((R o (P y Q)). fnd1(P. write(' Las conectivas usadas son:').Q1). exteriorizarDisyuntor((R y P). fnc1((P1 o Q1).(P1 o Q1)) :. exteriorizarDisyuntor(Q.nl.nl. exteriorizarConjuntor((Q o R). write('una Formula Bien Formada (fbf). tab(20).!. /* exteriorizarDisyuntor(Form. tab(20).R). tab(20).!. fnd1((R y (P o Q)). nl.FND) :. write('Practicas PROLOG_______________________________').write('imp implicador').(P1 o Q1)) :. y la transforma a').P1).)').nl.write('coimp coimplicador'). write('(FNC) y a Forma Normal Disyuntiva (FND)'). /*-----------------------------------------------------------*/ /* Pantalla de Ayuda */ ayuda :. fnc1(P.!. write('FORMA NORMAL DISYUNTIVA:'). nl. /*-----------------------------------------------------------*/ /* Procedimientos diversos */ cabecera :.write(' FORMULA : ').nl.write(FNC). exteriorizarConjuntor(P.write('Logica de Primer Orden Dpto. comprueba que es').nl.!. fnc1(((P y Q) o R).P1).R).

LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA nl.Y). /***************** FIN DEL PROGRAMA ************************/ Página 50 © 1996-2000 Faraón Llorens .miembro(X. miembro(X. /* miembro(Elem.[_|Y]) :.write(FND).Lista) <.[X|_]).el término Elem pertenece a lista Lista */ miembro(X.

Y not(X) 2... Predicado menor que Ordenación de términos.-Y.Control del programa: Objetivo que siempre se cumple Objetivo que siempre fracasa Corte.Clasificación de términos: Se cumple si X es en ese momento una variable no instanciada Se cumple si X no es una variable sin instanciar en ese momento Se cumple si X representa en ese momento un número o un átomo Se cumple si X representa en ese momento un átomo de Prolog Se cumple si X representa en ese momento un número Se cumple si X representa en ese momento un número entero Se cumple si X representa en ese momento un número real var(X) nonvar(X) atomic(X) atom(X) numeric(X) integer(X) real(X) 4. Predicado mayor que © 1996-2000 Faraón Llorens Página 51 . 1..Operadores aritméticos y relacionales: Se cumple si puede hacer X e Y iguales (unificarlos) Se cumple si X=Y fracasa Igualdad más estricta Se cumple si fracasa == Predicado menor que Predicado mayor que Predicado mayor o igual que Predicado menor o igual que Ordenación de términos..Construcción de objetivos compuestos (conectivas lógicas): Conjunción de objetivos Disyunción de objetivos Se cumple si fracasa el intento de satisfacer X 3.PROLOG 11.Z] Notación más cómoda para consult y reconsult halt Salir del sistema Prolog consult(X) reconsult(Y) X.Y X. Fuerza al sistema Prolog a mantener ciertas elecciones Sirve para generar soluciones múltiples mediante el mecanismo de reevaluación call(X) Se cumple si tiene éxito el intento de satisfacer X (instanciada a un término) true fail ! repeat X=Y X\=Y X==Y X\==Y X < Y X > Y X >= Y X =< Y X @< Y X @> Y 5. PREDICADOS PREDEFINIDOS Vamos a ver algunos predicados predefinidos que ofrecen la mayoría de los sistemas Prolog..Adición de Bases de Conocimiento externas: Añadir las cláusulas del fichero X a la base de conocimiento Las cláusulas leídas de fichero Y sustituyen a las existentes para el mismo predicado [X.

Z) Declara el operador de nombre Z con clase de precedencia X y posición-asociatividad Y current_op(X..Manipulación de la Base de Conocimiento: Se escriben en el fichero de salida activo todas las cláusulas Siendo X un átomo. que se intentará hacer coincidir con X X & Y Operador concatenación de cadenas de caracteres X + Y Operador suma X .Y. se escriben en el fichero de salida activo todas las cláusulas que tienen como predicado dicho átomo listing listing(X) Página 52 © 1996-2000 Faraón Llorens . que se intentará hacer coincidir con X X is_string Y Se evalúa la expresión a la que está instanciada Y para dar como resultado una cadena.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA Ordenación de términos. Predicado menor o igual que Se evalúa la expresión a la que esta instanciada Y para dar como resultado un número.Z) Busca el operador ya declarado de nombre Z con clase de precedencia X y posición-asociatividad Y X @>= Y X @=< Y X is Y 6.. que pasa a ser la pantalla 8.Manejo de ficheros: Abre el fichero X y lo define como canal de entrada activo Se cumple si el nombre del canal de entrada activo coincide con X Cierra el canal de entrada activo.Y Operador resta X * Y Operador de multiplicación X / Y Operador de división X // Y Operador de división entera X mod Y Operador de resto de la división entera X ^ Y Operador de exponenciación op(X.Y.Predicados de Entrada y Salida: Se cumple si X puede hacerse corresponder con el siguiente carácter encontrado en el canal de entrada activo (en código ASCII) get(X) Se cumple si X puede hacerse corresponder con el siguiente carácter imprimible encontrado en el canal de entrada activo skip(X) Lee y pasa por alto todos los caracteres del canal de entrada activo hasta que encuentra un carácter que coincida con X read(X) Lee el siguiente término del canal de entrada activo put(X) Escribe el entero X como un carácter en el canal de salida activo nl Genera una nueva línea en el canal de salida activo tab(X) Escribe X espacios en el canal de salida activo write(X) Escribe el término X en el canal de salida activo display(X) Escribe el término X en el canal de salida activo. y retorna al teclado Abre el fichero X y lo define como canal de salida activo Se cumple si X coincide con el nombre del canal de salida activo Cierra con un fin de fichero el canal de salida activo. pasando por alto las declaraciones de operadores get0(X) see(X) seeing(X) seen tell(X) telling(X) told 7. Predicado mayor o igual que Ordenación de términos..

A) E=. generando la traza de la ejecución de las metas siguientes..L 10.L) Los caracteres del átomo A tienen por ASCII los números de la lista L functor(E.Construcción y acceso a componentes de estructuras: E es una estructura con nombre F y número de argumentos N El argumento número N de la estructura E es A Predicado univ. L es la lista cuya cabeza es el functor de la estructura E y la cola sus argumentos name(A.PROLOG clause(X.Depuración de programas Prolog: trace Activación de un seguimiento exhaustivo..N) arg(N. notrace Desactiva el seguimiento exhaustivo spy P Fijación de puntos espía nospy P Elimina los puntos espía especificados debugging Ver qué puntos espía se han establecido hasta el momento nodebug Retira todos los puntos espía activos en ese momento © 1996-2000 Faraón Llorens Página 53 .F..Y) assert(X) asserta(X) assertz(X) retract(X) abolish(X) Se hace coincidir X con la cabeza e Y con el cuerpo de una cláusula existente en la base de conocimiento Permite añadir la nueva cláusula X a la base de conocimiento Permite añadir la nueva cláusula X al principio de la base de conocimiento Permite añadir la nueva cláusula X al final de la base de conocimiento Permite eliminar la primera cláusula de la base de conocimiento que empareje con X Retira de la Base de Conocimiento todas las cláusulas del predicado X 9.E.

uk/archive/logic-prog. Se puede ejecutar tanto desde disco duro como desde disquete. de forma que el lector puede acceder a ellos.uga. tecleando: prolog2 Si da problemas durante el arranque. tanto en versiones comerciales como de libre distribución. Si no.000 bytes. Por razones de facilitar el acceso a dichos sistemas. convertido ya en un estandar. El software lo podemos encontrar via ftp en la siguiente dirección: ftp://ai. instalarlos en su máquina y así ejecutar los ejemplos de este anexo (y lo más importante.comlab.ac.pro y lo reconsulta. añadir la línea: FILES=20 El sistema Prolog-2 posee un editor integrado. Es una implementación del Prolog de Edinburgh descrito por Clocksin y Mellish en el libro “Programación en Prolog”.edit(fichero).SYS contenga una línea que nos permita tener abiertos al menos 20 archivos.edit(fichero. El fichero es automáticamente reconsultado después de su edición.html 12.200000). Sólo están libres para la edición 128.1. vamos a comentar dos sistemas Prolog de libre distribución para ordenadores PC. Si se quiere una lista más extensa de implementaciones del lenguaje Prolog. edita el fichero fichero. Encontraremos mayor información sobre esta implementación en los libros “The Prolog-2 User Guide” y “The Prolog-2 Encyclopaedia” de Tony Dodd publicados por Ablex Publishing Corporation.ox. probar todo aquello que se le ocurra). Página 54 © 1996-2000 Faraón Llorens . la llamada al editor deberá ser del tipo: ?. Así: ?. con las direcciones donde localizarlas. al que accedemos con el predicado predefinido edit.edu/pub/prolog Su principal ventaja es que se puede trabajar sobre sistemas DOS muy sencillos. PROLOG-2 Prolog-2 es un sistema Prolog de Dominio Público de “Expert Systems Ltd”.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA 12. SISTEMAS PROLOG Existen gran cantidad de implementaciones del lenguaje de programación lógica Prolog. comprobar que el fichero CONFIG. Si necesitamos más. se puede visitar la página Web: http://gruffle.

bat” . y al salir. un editor de ficheros de textos en ASCII especialmente diseñado para entornos con disponibilidad de memoria limitada (necesita únicamente 55 K). que como el anterior sigue el estándar de Edinburgh.000 bytes de memoria. Para añadir cláusulas a Prolog podemos editar el fichero mediante edit.uva. ya que el predicado predefinido edit invoca al fichero de lotes “edit. indicado por el prompt “C:”. SWI-PROLOG SWI-Prolog es un compilador Prolog de Dominio Público. El editor que utiliza por defecto el sistema Prolog-2 es PrEd (“Program Editor”). Incorpora una iluminación automática para el emparejamiento de paréntesis y otros símbolos delimitadores. como lo reconsulta automáticamente. así como de un sistema de ayuda que muestra las distintas combinaciones de teclas. quedan incorporadas a Prolog. que se puede activar con la pulsación de la tecla F3. El software lo podemos encontrar vía ftp en la siguiente dirección: ftp://swi. tecleando ^Z.2.nl/pub/SWI-Prolog © 1996-2000 Faraón Llorens Página 55 .psy.doc”. dentro del sistema Prolog-2. Para más detalles de este editor consultar el archivo “pred. Ha sido diseñado e implementado por Jan Wielemaker. Las teclas de función. simplemente debemos modificar del archivo “edit. del departamento Social Science Informatics (SWI) de la Universidad de Amsterdam. Podemos utilizar cualquier otro editor que nosotros queramos.PROLOG que dejara libres para edición 200.bat” la llamada a pred. Una vez tecleadas las cláusulas podemos volver al modo de pregunta. indicado por el prompt “?-”. También podemos añadir cláusulas mediante el predicado: [user]. De esta manera entramos en el modo de consulta. tienen el siguiente significado: Ayuda Menú Línea de comandos introducida anteriormente F4 Línea siguiente F5 Borrar F6 Información sobre las teclas de función F7 Ocultar F8 Ocultar Debugger F9 Ocultar todo F10 Mostrar Debugger F1 F2 F3 12.

También se puede conseguir una versión escrita del manual de referencia.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA La plataforma original sobre la que se desarrollo fue para Unix. aunque en la actualidad podemos encontrar versiones para Linux y para PC que se ejecutan bajo el entorno Windows (Windows 3. en la dirección: ftp://swi. Página 56 © 1996-2000 Faraón Llorens .apropos(Cadena). y tiene las ventajas sobre el anterior de que. ?. Windows 95 y Windows NT). basta con hacer doble click sobre el icono correspondiente (plwin.help.help(Termino). una vez iniciado Windows.psy. de momento.exe). Es potente y flexible (permite integración con C). ?.nl/pub/SWI-Prolog/refman Para ejecutarlo. se mantiene actualizado y se ejecuta sobre un entorno gráfico más agradable para el usuario. en formato PostScript.uva. Posee un sistema de ayuda en línea que se puede consultar mediante los predicados: ?..1.

marido(x. ∨ ¬Nm ) OBJETIVO ¬∃ ( N1 ∧ .PROLOG ANEXO: CUADRO COMPARATIVO DE LAS DIFERENTES NOTACIONES PARA PROGRAMACIÓN LÓGICA Como resumen final veamos un cuadro comparativo de las diferentes notaciones usadas para las sentencias. pasando por la notación clausal y la de la programación lógica: Fórmula ∀ ( A ∨ ¬N1 ∨ . .. ¬Nm } A ← N1 .N1 ..y) → casado(x) ) { casado(x).. ∨ ¬Nm ) REGLA ∀ ( (N1 ∧ .y). ∧ Nm ) → A ) HECHO ∀ ( A ) ∀ ( ¬N1 ∨ . . . {A} A← A.N1 .. { ¬N1 .. ∧ Nm ) Cláusulas de Horn Program. REGLA ∀x ( ∃y marido(x. Nm A :... . © 1996-2000 Faraón Llorens Página 57 .. ¬Nm } ← N1 . desde las fbf del cálculo de predicados hasta la sintaxis de Prolog.casado(x) .y) marido(jordi. . marido(jordi.. .y) } HECHO marido(jordi. Nm . ¬marido(x..ana) OBJETIVO ¬∃x casado(x) (negado) { marido(jordi. ....ana) ← Prolog casado(x) :.. Nm .. .. ¬N1 .ana)... . Lógica casado(x) ← marido(x. Ejemplo: Fórmula Cláusulas de Horn Program... Nm ?.. . .ana) } { ¬ casado(x) } ← casado(x) ?. Lógica Prolog {A.

Clause and Effect. A. S. Pasero. ISO Prolog. S. F. Kanoui. C. 1986 Página 58 © 1996-2000 Faraón Llorens . [14] Kowalski. A Summary of the Draft Proposed Standard A. Lógica. 1997 [5] Clocksin. Michael A. Addison-Wesley. 1990 [4] Clocksin. Knowledge Systems Through PROLOG Oxford University Press. F.. Frank Logic Programming. Díaz de Santos. Tony The Prolog-2 User Guide Ablex Publishing Corporation [10] Dodd.. Univ. H. Prog. W. Programación e Inteligencia Artificial Ed.. Programación y aplicaciones en Inteligencia Artificial Ed...A. Co. William F. Prolog Addison-Wesley Iberoamericana. Gustavo Gili. 1986. 1991 [13] Kowalski. Veronica y Sobrino. y van Caneghem. Ivan PROLOG Programming for Artificial Intelligence Addison-Wesley. of Georgia 1993 [7] Dahl. Tony The Prolog-2 Encyclopaedia Ablex Publishing Corporation [9] Dodd.. ANAYA Multime. Servicio de Publicacións e Intercambio Científico. 1986 [3] Bratko. R. I. Tore Logic Programming and Knowledge Engineering Ed. PROLOG. Prolog and its applications Addison-Wesley Pub. 1990 [11] Giannesini. 1989 [12] Kim. BIBLIOGRAFÍA [1] Amble. y Mellish. 1987 [2] Berk. Alejandro Estudios sobre programación lógica y sus aplicaciones Universidade de Santiago de Compostela.LÓGICA DE PRIMER ORDEN y AMPLIACIÓN DE LÓGICA 13. Bob y Kriwaczek. second ed.A. Steven H. 1987 [6] Covington..A. 1996 [8] Dodd. Programación en PROLOG Ed. S. Robert A. Prolog Programming for the Working Programmer Springer-Verlag. A Logical Approach Oxford University Press. Tony Prolog. M.

Jan SWI-Prolog 3. Springer-Verlag. 1993 [16] Maier.1. 1990 [18] Sterling. of Social Science Informatics (SWI). The craft of Prolog The MIT Press. E. vol. Foundations of Logic Programming Ed. Advanced Programming Techniques The MIT Press. second ed. The art of PROLOG. 19/20. University of Amsterdam. Logic programming with Prolog The Benjamin/Cummings. Richard A. W.PROLOG [15] Lloyd. 1998 [20] Special Issue: Ten Years of Logic Programming Journal of Logic Programming. Computing with Logic. 1994 [19] Wielemaker. may/july 1994 © 1996-2000 Faraón Llorens Página 59 . 1988 [17] O'Keefe. J.. Reference Manual Dept. Cambridge. David y Warren. David S. y Shapiro. L.

Sign up to vote on this title
UsefulNot useful