Tema IV Programación lógica con estructuras Programación Lógica - E.T.S.I. Informática - Málaga 1
Términos La estructura de datos básica en PROLOG es el término. Los términos se clasifican en : variables no variables -> compuestos atómicos -> átomos números Las variables se denotan mediante palabras que comienzan por una letra mayúscula o por un guión de subrayado. los átomos se denotan mediante palabras que comienzan por una letra minúscula. Los números tienen la notación decimal habitual. Los términos compuestos tiene la forma general: <funtor>(<argumentos>), donde los argumentos también son términos separados por, y el funtor es un átomo. Programación Lógica - E.T.S.I. Informática - Málaga 2
Predicados para la comprobación de tipos Predicados predefinidos: var(t) - Tiene éxito cuando T es una variable sin instanciar. nonvar(t) Tiene éxito cuando T no es una variable sin instanciar. compound(t) Tiene éxito cuando T es un término compuesto. atomic(t) Tiene éxito cuando T es un término atómico. atom(t) Tiene éxito cuando T es un átomo. number(t) - Tiene éxito cuando T es un número. integer(t) Tiene éxito cuando T es un número entero. float(t) - Tiene éxito cuando T es un número decimal. Programación Lógica - E.T.S.I. Informática - Málaga 3
Términos compuestos Los términos compuestos se pueden ver como árboles generales: f f(x,h(a,b,3)) -> X h a b 3 Los términos compuestos pueden ser recursivos: cuando algún argumento es un término del mismo tipo. Los téminos compuestos más simple son los registros, cuyos argumentos no son del mismo tipo. Programación Lógica - E.T.S.I. Informática - Málaga 4
Comparación de términos PROLOG dispone de una relación de orden total @=< para la comparación de términos, consistente con el orden numérico y con el orden alfabético para los nombres de átomos (permite la aparición de variables libres) Xs == Ys éxito cuando Xs e Ys representan el mismo término Xs \== Ys Xs @< Ys Xs @> Ys Xs @=< Ys Xs @>= Ys éxito cuando Xs e Ys representan términos distintos éxito cuando Xs representa un término menor que Ys éxito cuando Xs representa un término mayor que Ys éxito cuando Xs representa un término menor o ig. que Ys éxito cuando Xs representa un término mayor o ig. que Ys (Tienen sentido para términos de la misma categoría) (No confundir con las relaciones numéricas) Programación Lógica - E.T.S.I. Informática - Málaga 5
Registros: fecha(dia,mes,año) % constructor cons_fecha(d,m,a,fecha(d,m,a)). % predicados de consulta dia(fecha(d,_,_),d).... % predicados para la modificación %completar poner_dia(d,fecha(_,m,a),fecha(d,m,a)).... %completar Ejercicios: 1. Predicado para comprobar el dominio fecha: es_fecha(fecha(d,m,a)) 2. Predicado para calcular la fecha siguiente a una dada: dia_sig(fecha(d,m,a),f) Programación Lógica - E.T.S.I. Informática - Málaga 6
Las listas en PROLOG Programación Lógica - E.T.S.I. Informática - Málaga 7
Listas:. (Cabeza, Cola) Las listas son términos compuestos recursivos que están predefinidos en PROLOG en la forma:. (Cabeza, Cola), donde Cabeza es un término y Cola otra lista. Hay una lista especial que no es un término compuesto: la lista vacía []. PROLOG incorpora notaciones más simples para listas: [Cabeza Cola] [] [T1,T2,...,Tn] [] Mixtas: [T1,T2,...,Tp Cola] Programación Lógica - E.T.S.I. Informática - Málaga 8
Ejercicios de comprobación de listas Comprobar cuales de las siguientes expresiones son listas y determinar el número de elementos en cada caso: [oros,copas,espadas,bastos] [oros copas,espadas,bastos] [oros [copas,espadas,bastos]] [oros,copas espadas,bastos] [oros,copas [espadas bastos]] [oros,copas,espadas [bastos]] [oros,copas,[espadas,bastos]] [oros,copas,espadas,bastos []] [oros [copas [espadas [bastos []]]]] Programación Lógica - E.T.S.I. Informática - Málaga 9
Ejercicios de unificación de listas [X Y] [a,[b,c]] [[a,b],c] [a X] [a X] [a X] [a,b,y] [a,b,y] [a,b Y] [a,b [Y]] [a,b [Y]] [a,b Y] [a,b,c] [X Y] [X Y] [Y a] [Y [c]] [Y] [X,T] [X T] [X,T] [a,b,c] [a,b,c,d] [a,b,c,d] Programación Lógica - E.T.S.I. Informática - Málaga 10
Árboles de búsqueda con listas Desarrollar el árbol de búsqueda correspondiente al programa siguiente: p([],[]). p([x Xs],[Y Ys]):-q(X,Y),p(Xs,Ys). q(a,b). q(a,y):-s(x),s(y). q(a,c). q(b,b). s(a). s(b). :-p([a,x],[x,b]). Programación Lógica - E.T.S.I. Informática - Málaga 11
Predicados sobre listas (I) Definir y estudiar los posibles usos de los siguientes predicados: % dominio de listas: es_lista/1 es_lista([]). es_lista([_ _]). % prefijo(prefijo,lista) % sufijo(sufijo,lista) % sublista(sublista,lista) % miembro(termino,lista) % seleccion(termino,lista,listaresto) Programación Lógica - E.T.S.I. Informática - Málaga 12
Prefijo % La lista vacía es prefijo de cualquier lista: prefijo([],l):- es_lista(l). % Una lista no vacía es prefijo de otra lista: prefijo([x Xs], [ X Ls ] ):- prefijo(xs,ls). no vacía con el mismo primer elemento si su cola es prefijo de la cola de la otra lista Programación Lógica - E.T.S.I. Informática - Málaga 13
Predicados sobre listas (II) Predicado para encadenar dos listas: encadena(as,bs,asbs) Definición atendiendo a la estructura del primer argumento: % La lista vacía encadenada con otra lista produce la otra: encadena([],bs,bs). % Una lista no vacía encadenada con otra lista produce una lista: encadena([a As],Bs, [ A AsBs ]) :- encadena(as,bs,asbs). no vacía con el mismo primer elemento cuya cola es la concatenación de su cola con la otra lista Programación Lógica - E.T.S.I. Informática - Málaga 14
Tabla de comportamiento de encadena/3 encadena(as,bs,asbs) (+,+,+) (+,+,-) (-,+,+) (+,-,+) (-,-,+) (-,-,-) test Generador único Generador único Generador único Generador acotado Generador infinito (anómalo) Comprueba si AsBs es la concatenación de As y Bs Genera AsBs a partir de As y de Bs Genera el prefijo As que encadenado con Bs da AsBs Genera el sufijo Bs que encadenado tras As da AsBs Genera todas las posibles particiones de AsBs en As y Bs Genera listas de variables libres para As, Bs queda libre y para AsBs la concatenación de ambas. Programación Lógica - E.T.S.I. Informática - Málaga 15
Predicados sobre listas (III) Redefinir los predicados siguientes utilizando encadena/3 y construir sus tablas de comportamiento teniendo en cuenta el comportamiento de encadena: % prefijo(as,asbs) % sufijo(bs,asbs) % sublista(bs,asbscs) % miembro(x,asxbs) % seleccion(x,asxbs,asbs) Definir: % ultimo(x,asx) % adyacentes(x,y,asxybs) % inversa(l,linvertida) % permutacion(l,lpermutada) % aplanada(l,lplana) Programación Lógica - E.T.S.I. Informática - Málaga 16
Predicados aritméticos sobre listas Definir predicados para calcular: La longitud de una lista. La suma de todos los elementos de una lista de números. El máximo elemento de una lista de números. La lista con todos los elementos del intervalo definido por dos números dados. Dar definiciones iterativas para cada uno de los predicados anteriores Programación Lógica - E.T.S.I. Informática - Málaga 17
Comparación de términos PROLOG dispone de una relación de orden total @=< para la comparación de términos, consistente con el orden numérico y con el orden alfabético para los nombres de átomos (permite la aparición de variables libres) Xs == Ys éxito cuando Xs e Ys representan el mismo término Xs \== Ys Xs @< Ys Xs @> Ys Xs @=< Ys Xs @>= Ys éxito cuando Xs e Ys representan términos distintos éxito cuando Xs representa un término menor que Ys éxito cuando Xs representa un término mayor que Ys éxito cuando Xs representa un término menor o ig. que Ys éxito cuando Xs representa un término mayor o ig. que Ys (Tienen sentido para términos de la misma categoría) (No confundir con las relaciones numéricas) Programación Lógica - E.T.S.I. Informática - Málaga 18
Comparación de términos sobre listas Definir predicados para 1) Determinar si un elemento, posiblemente una variable libre, pertenece a una lista. 2) Borrar un elemento de una lista. 3) Calcular el mínimo de una lista (de números o de nombres de átomos). 4) Comprobar si todos los elementos de una lista son iguales. 5) Sustituir todas las apariciones de un elemento, por otro, en una lista dada. Programación Lógica - E.T.S.I. Informática - Málaga 19
Listas ordenadas ordenada([]). ordenada([_]). ordenada([x,y Ls]):- X @=< Y, ordenada([y Ls]). ordenacion(l,lord):- permutacion(l,lord), ordenada(lord). Definir predicados para: 1) Insertar un elemento en una lista ordenada. 2) Ordenar los elementos de una lista por inserciones. 3) Separar los elementos de una lista con ayuda de un pivote. 4) Ordenar una lista por el procedimiento del pivote. Programación Lógica - E.T.S.I. Informática - Málaga 20
Cadenas de caracteres Las cadenas de caracteres son listas de caracteres. Prolog permite la representación habitual de cadenas entre comillas dobles, dentro de un programa o en una entrada, p.e. Hola!. Prolog almacena las cadenas como listas de códigos ASCII correspondientes a los caracteres Hola! [161, 72, 111, 108, 97, 33] Para mantener la representación textual puede ser conveniente utilizar átomos o texto entre comillas simples que no se puede descomponer en caracteres. :-write( Hola! ). :-write( Hola! ). produce la salida: [161,72,111,108,97,33] produce la salida: Hola! Programación Lógica - E.T.S.I. Informática - Málaga 21
Conjuntos representados con listas Los conjuntos se pueden representar en PROLOG mediante listas ordenadas y definir las distintas operaciones en función de dicha representación: % pertenece(elemento,conjunto) pertenece(x,[x _]). pertenece(x,[y Cs]):- X @> Y, pertenece(x,cs). % subconjunto(subcj,conjunto) % union(c1,c2,c1oc2) % interseccion(c1,c2,c1yc2) % diferencia(c1,c2,c1\c2) Programación Lógica - E.T.S.I. Informática - Málaga 22
Árboles en PROLOG Programación Lógica - E.T.S.I. Informática - Málaga 23
Árboles binarios En PROLOG pueden representarse los distintos tipos de árboles binarios mediante estructuras recursivas: ArbolB = vacio arbol(arbolb, Termino, ArbolB) ArbolH = hoja(termino) arbol(arbolh, ArbolH) Definir predicados para: 1) Reconocer estos dominios. 2) Determinar si dos árboles son simétricos y si son isomorfos. 3) Producir los distintos recorridos en profundidad de un ArbolB. 4) Producir el listado de hojas de un ArbolH. 5) Sustituir un elemento en un árbol. Programación Lógica - E.T.S.I. Informática - Málaga 24
Árboles binarios de búsqueda (I) Los árboles binarios de búsqueda se corresponden con los árboles del tipo ArbolB, cuyo listado en inorden está ordenado: ordenado(a):- inorden(a,lin), ordenada(lin). Predicado para buscar un elemento (no genera): esta(x,arbolb(_,y,_)):- X==Y. esta(x,arbolb(i,r,_)):- X @< R,esta(X,I). esta(x,arbolb(_,r,d)):- X @> R,esta(X,D). Definir un predicado para insertar un elemento. Programación Lógica - E.T.S.I. Informática - Málaga 25
Árboles binarios de búsqueda (II) Elemento máximo de un árbol ordenado: maxarb(arbolb(_,r,vacio),r). maxarb(arbolb(_,r,d),m):- maxarb(d,m). Predicado para borrar un elemento: borra(x,vacio,vacio). borra(x,arbolb(vacio,r,d),d):- X == R. borra(x,arbolb(i,r,d),arbolb(i,m,d)):- X == R, maxarb(i,m),borra(m,i,i ). borra(x,arbolb(i,r,d),arbolb(i,r,d)):- X @< R, borra(x,i,i ). borra(x,arbolb(i,r,d),arbolb(i,r,d )):- X @> R, borra(x,d,d ). Programación Lógica - E.T.S.I. Informática - Málaga 26
Árboles de expresiones booleanas Booleano = cierto falso and(booleano,booleano) or(booleano,booleano) not(booleano) 1) Definir un predicado que reconozca este dominio. 2) Definir predicados que reconozcan las expresiones satisfactibles y las no satisfactibles. Programación Lógica - E.T.S.I. Informática - Málaga 27
Árboles de expresiones aritméticas Predicado para reconocer expresiones aritméticas simples: expa(n):- number(n). expa(x):- var(x). expa(e1 + E2):- expa(e1), expa(e2). expa(e1 - E2):- expa(e1), expa(e2). expa(e1 * E2):- expa(e1), expa(e2). expa(e1 / E2):- expa(e1), expa(e2). Definir un predicado para evaluar expresiones aritméticas con parámetros, dada una lista de valores para los parámetros. Programación Lógica - E.T.S.I. Informática - Málaga 28
Árboles generales (I) Los árboles generales se pueden representar en PROLOG mediante la siguiente estructura recursiva: ArbolG = vacio arbol(termino, [ArbolG]) Predicado para reconocer el dominio de los árboles generales arbolg(vacio). arbolg(arbol(_,[])). arbolg(arbol(r,[a As])):- arbolg(a), arbolg(arbol(r,as)). Programación Lógica - E.T.S.I. Informática - Málaga 29
Árboles generales (II) Definir predicados sobre árboles generales para: 1. Calcular el recorrido en preorden. 2. Determinar si un elemento es miembro de un árbol. 3. Determinar si dos árboles son isomorfos. 4. Sustituir las apariciones de un elemento por otro. Programación Lógica - E.T.S.I. Informática - Málaga 30