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

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

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

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.

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.

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

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.

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] ?.

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’).

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.

[+.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” ?.

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

9.3. INTERPRETACIÓN PROCEDIMENTAL PROLOG

DE

LOS

PROGRAMAS

Página 44

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.

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

Página 46

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

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.

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.