Listas en Prolog. Capítulo. Listas como sujetos

Documentos relacionados
Tema 2. Fundamentos de la Teoría de Lenguajes Formales

CONTENIDO. 1.- Introducción a la Inteligencia Artificial (IA) 2.- Lógica de predicados. 3.- Búsqueda de soluciones

Programación Funcional en LISP Lógica para Ciencias de la Computación

Temas. Objetivo. Símbolo, alfabeto. Hileras y operaciones con hileras. Operaciones con lenguajes

Máquinas de estado finito y expresiones regulares

CONJUNTOS. Por ejemplo, el E del ejemplo 2 se escribe.

Programación con Listas

CENTRO DE BACHILLERATO TECNOLOGICO INDUTRIAL Y DE SERVICIOS NO. 21. Profesor Enrique López Vásquez Algebra

Si un objeto x es elemento de un conjunto A, se escribe: x A.

Introducción a la programación. Cecilia Manzino

No todos los LRs finitos se representan mejor con ERs. Observe el siguiente ejemplo:

MÓDULO I. CONCEPTOS BÁSICOS GENERALES SUMATORIA

Números naturales y recursividad


Matemática I C.F.E. I.N.E.T. Profesorado de Informática Conjuntos

Capítulo I ELEMENTOS PREVIOS

Listas. Listas. Listas. Listas y Corte en Prolog. Temas Avanzados en Ingeniería Informática I (Lógica) David Camacho Fernández.

Programa Nacional de Formación de Informática Material Educativo Computarizado de Algorítmica y Programación

Tema 2: Lenguajes Formales. Informática Teórica I

Programación recursiva en Prolog

Lenguajes y Gramáticas

5.3 Tipos de Datos en Prolog

5.3 Tipos de Datos en Prolog

Álgebra Booleana. Suma Booleana. El término suma es 1 si al menos uno de sus literales son 1. El término suma es 0 solamente si cada literal es 0.

Estructuras Discretas. Conjuntos. Conjuntos & Funciones. Especificación de Conjuntos.

Preliminares. 1. Notación simbólica. Conjuntos. También se da en el curso de Conjuntos y Numeros.

Tema 6: Representación lógica del conocimiento

Programación MODULAR: Subalgoritmos - funciones y procedimientos

1.1 Conceptos básicos de la teoría de conjuntos

SESIÓN N 07 III UNIDAD RELACIONES Y FUNCIONES

Teoría de Conjuntos DEFINICION DE CONJUNTO

Resumen de teoría elemental de conjuntos (primera parte) Javier Castro Albano

Teoría de la Computación

Aritmetica de matriz compleja Objeto cmatrix

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Lógica - Conjuntos inductivos

PROGRAMACIÓN ESTRUCTURADA

Programa de Acceso Inclusivo, Equidad y Permanencia. PAIEP, Universidad de Santiago

Lenguaje de Diseño: Estructuración de Datos

Tema: Métodos de Ordenamiento. Parte 3.

John Venn Matemático y filósofo británico creador de los diagramas de Venn

John Venn Matemático y filósofo británico creador de los diagramas de Venn

Unidad 2. Notación matemática

Matemáticas 2º E.S.P.A. Pág.1 C.E.P.A. Plus Ultra. Logroño

Clase 8 Matrices Álgebra Lineal

CAPÍTULO 2. ÁRBOLES 2.0. CONCEPTOS GENERALES

x-z = 0 x+y+2 = [2012] [SEP-B] Halla el punto simétrico del P(2,1,-5) respecto de la recta r definida por

Resumen de teoría elemental de conjuntos (segunda parte) Javier Castro Albano

Introducción. Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas

Programación en PROLOG(1)

Relaciones. Estructuras Discretas. Relaciones. Relaciones en un Conjunto. Propiedades de Relaciones en A Reflexividad

3.3. TEORÍA BÁSICA DE CONJUNTOS Utilizar tablas de verdad para comprobar la equivalencia lógica p q p q.

CLASE 1 LENGUAJE ALGEBRAICO

LECCIÓN Nº 02 FUNCIONES DE LOGICA COMBINACIONAL (PARTE 1)

Inteligencia Artificial 2º cuatrimestre de 2009

INDUCCIÓN. Inducción - 2

INDUCCIÓN Instituto de Computación Lógica Inducción - 1

Lenguaje de Diseño: Estructuración de Datos

Programación lógica con árboles. Introducción. Contenido. Introducción. 1. Programación con árboles 2. Otras estructuras arbóreas

Probabilidad y Estadística

Soluciones a los ejercicios

5.3 Tipos de Datos en Prolog

BLOQUE V. CONTROL Y PROGRAMACIÓN DE SISTEMAS AUTOMÁTICOS

BLOQUE V. CONTROL Y PROGRAMACIÓN DE SISTEMAS AUTOMÁTICOS

Estructuras de Repetición

El lenguaje Prolog. Prolog es un lenguaje Declarativo, a diferencia de otros lenguajes que son orientados a objetos o procedurales

TUTORIAL PROLOG. Lenguajes de programación Universidad Nacional de Colombia Santiago Carvajal Castañeda Mario Andrés Moreno Norato

Introducción al Modelado de Sistemas Capítulo 4

UNIVERSIDAD LUTERANA SALVADOREÑA. Docente: ANA LISSETTE GIRÓN

Organización de computadoras y lenguaje ensamblador

TEMA 4 VECTORES VECTORES TEMA 4. 1.º BACHILLERATO - CIENCIAS VECTOR FIJO. VECTOR LIBRE. SUMA DE VECTORES LIBRES

x-z = 0 x+y+2 = [2012] [EXT-B] Halla el punto simétrico del P(2,1,-5) respecto de la recta r definida por

CONJUNTOS. Los conjuntos son conceptos primitivos que representan una totalidad, una reunión de cosas.

TEMA 1: NÚMEROS NATURALES. SISTEMA DE NUMERACIÓN

4.3. Subespacios vectoriales

La estrategia de descomposición basada en una violación de la FNBC que aplicaremos consiste en:

Centro Asociado Palma de Mallorca. Tutor: Antonio Rivero Cuesta

Tipo de Dato: Arreglos

Lógica Instituto de Computación. 27 de febrero

UNIDAD II: TEORÍA DE CONJUNTOS 2.1. INTRODUCCIÓN

Inducción Matemática Conjuntos Funciones. Matemática Discreta. Agustín G. Bonifacio UNSL. Repaso de Inducción, Conjuntos y Funciones

CAPITULO 2: LENGUAJES

NOTAS DE ESTUDIO DE ÁLGEBRA LINEAL M.C. MARCOS CAMPOS NAVA TEC DE ATITALAQUIA

Definiciones previas

Introducción a la programación

Programación Declarativa

ALGORITMOS II PSEUDOCODIGOS INTRODUCCION AL PSEINT CORPODICES VICTOR ANDRES OCHOA CORREA

NOTAS PARA LOS ALUMNOS DEL CURSO DE ANALISIS MATEMATICO III TEORÍA DE CONJUNTOS. Ing. Juan Sacerdoti

Objetivos de la práctica: - Trabajar las estructuras de control repetitivas en la realización de programas.

CONJUTOS NÚMERICOS NÚMEROS NATURALES

Métodos de Conteo y Principio del Palomar. Matemática Discreta. Agustín G. Bonifacio UNSL

Abstracción de procedimientos

Matemáticas Discretas TC1003

Lenguaje de Diseño: Estructuración de Datos

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

Conceptos Preliminares

MÉTODOS MATEMÁTICOS DE LA FÍSICA I

Transcripción:

Capítulo 5 Listas en Prolog Este capítulo introduce el concepto de lista, un tipo de dato de gran influencia dentro de la inteligencia artificial. Se comienza con una introducción a listas en Prolog y a la forma de procesamiento de las mismas. L as listas son una herramienta importante en la matemática moderna y en la computación simbólica. Quien está familiarizado con ella, sabe que las listas son una estructura esencial en el lenguaje LISP. El objetivo aquí es mostrar cómo pueden utilizarse las listas para acrecentar la potencia y el alcance de los programas Prolog Listas como sujetos Los predicados que se han definido hasta ahora se aplicaron a individuos simples, se definieron por ejemplo: hombre(juan). hombre(predro). mujer(ana). mujer(maria). donde juan, pedro, ana y maria son individuos particulares. Sin embargo, en el lenguaje corriente es muy común la referencia a conjuntos de cosas. Supongamos que se desea expresar en forma de relaciones al contenido de la frase: Los tomates, las papas, los zapallos y las coles son vegetales. De acuerdo a la forma en que se trabajó en los capítulos anteriores, se podría haber escrito el siguiente grupo de relaciones: vegetales(tomates). vegetales(papas). vegetales(zapallos). vegetales(coles). este hecho también se puede representar refiriéndose a los tomates, patatas, zapallos y coles como a una lista. En tal caso, el predicado vegetales se aplicaría a un solo sujeto, la lista completa: vegetales([tomates,papas,zapallos,coles]) 54

logrando de esta manera una representación mucho más clara y concisa de la información contenida en la frase. Una lista en Prolog se define como una colección de términos, encerrados entre corchetes y separados por comas, donde término es una de las siguientes cosas: o Una constante (símbolo) o Un número o Una variable o Una lista Obsérvese que esta definición de lista es recursiva, ya que un elemento puede ser tanto un átomo (constante, número o variable), como otra lista. Los siguientes son ejemplos de listas válidas: [tomates,papas,zapallos,coles] [juan,pedro,jose] [m,k,45,r,pi, Juan Perez ] [a,b,[c,e],[f,g]] El último caso es una lista de cuatro elementos donde los dos primeros son átomos y los dos últimos listas. Una lista puede estar formada por otras listas con cualquier nivel de anidamiento. Así por ejemplo: [[a,b],[[c],d]] es una lista de listas, cuyo primer elemento es una lista de dos elementos (los átomos a y b) y su segundo elemento también es una lista de dos elementos, donde a su vez el primero es una lista de un elemento. Una lista puede ser vacía, la lista vacía en Prolog se denota como: [ ] Volviendo al ejemplo de los vegetales, la consulta:?- vegetales(tomates). tendrá diferente respuesta según se utilice una u otra forma de representación. En el primer caso, la respuesta será positiva, mientras que en el segundo será negativa, debido a que el elemento tomates no puede aparearse con la lista completa. En este sentido la utilización de listas, aunque favorable en términos de la representación de conocimiento, no posibilita consultar directamente a la base de datos acerca de sus elementos individuales. 55

Listas de longitud fija Para obtener cada uno de los elementos de una lista se utiliza el concepto de patrón de lista. Un patrón no es más que otra lista (compuesta en su mayor parte de variables), que se intenta unificar con la primera. El intérprete con el fin de lograr dicha unificación instancia las variables del patrón con los elementos de la lista. De manera que si se unifica el patrón [X] con la lista [a], la variable X se instanciará con el elemento a. Del mismo modo, para obtener cada uno de los elementos en la lista de vegetales, se puede realizar la siguiente consulta:?- vegetales([a,b,c,d]). A = tomates B = papas C = zapallos D = coles Quedando instanciadas cada una de las variables con el vegetal correspondiente de la lista. Otros ejemplos posibles son:?- [X] = [a] X = a Yes?- [X,Y]=[a,b]. X = a Y = b Yes?- [X,Y,Z] = [a,b,c]. X = a Y = b Z = c Yes?- [X,Y,Z,W] = [a,b,c,d]. X = a Y = b Z = c W = d Yes Nótese que este ejemplo puede continuar indefinidamente, de manera que para obtener los N elementos de una lista esta debe unificarse con un patrón formado por N variables. Este método sólo puede ser utilizado en el caso que se conozca con exactitud la cantidad de elementos de una lista, pero no puede ser aplicado con listas de longitud desconocida. Listas de longitud desconocida 56

Dada una lista de N elementos: [e1,e2,e3,...,en] el primer elemento de denomina la cabeza de la lista y el resto su cola: la cola, a su vez, es una lista que puede dividirse nuevamente en cabeza y cola: y así continuando hasta llegar a la lista de un elemento cuya cola es vacía. De esta manera en los casos es que la longitud de la lista es desconocida es posible utilizar un patrón que permita separar la cabeza y la cola, este patrón se representa en Prolog de la siguiente manera: [Cabeza Cola] donde el símbolo significa seguido de. La variable Cabeza se instancia con el primer elemento y la variable Cola se instancia con una lista formada por el resto de los elementos de la lista. Para el ejemplo anterior: Cabeza = e1 Cola = [e2,e3,...,en] y en el caso de la lista de vegetales: Cabeza = tomates Cola = [papas,zapallos,coles] Es posible escribir una regla que relacione una lista con su cabeza, y otra que relacione una lista con su cola (las funciones CAR y CDR en Lisp respectivamente), de la siguiente manera: es_cabeza(cab,[cab Cola]). es_cola(cola,[cab Cola]). Cabeza [ e1, 1 e2, 44 e3,..., 243 en 4 ] Cola Cabeza [ e2, 14243 e3,..., en] Cola Obsérvese que la cabeza de una lista puede ser tanto un elemento como una lista (en caso de ser una lista de listas) pero la cola es, en sí misma, una lista. Por lo tanto, las listas constituyen lo que se denomina una estructura de datos recursiva, puesto que los objetos que la constituyen pueden contener, como subestructura recursiva, objetos del mismo tipo. Los siguientes son ejemplo de intentar unificar distintas listas con el patrón [X Y]: [a] X = a Y = [] 57

[a,b] X = a Y = [b] [a,b,c,d] X = a Y = [b,c,d] [[a,b],c] X = [a,b] Y = [c] [[a,b]] X = [a,b] Y = [] [[a,b],[c,d]] X = [a,b] Y = [[c,d]] El patrón [X Y] está asegurando que la lista va ha tener al menos un elemento ya que este no puede unificarse con la lista vacía. Del mismo modo se puede se utiliza un patrón [X,Y Z] para separar los dos primeros elementos y la cola de una lista de al menos dos elementos. Ejemplos con este patrón son: [a] [a,b] [a,b,c,d] [[a,b],c] Falla X = a Y = b Z = [] X = a Y = b Z = [c,d] X = [a,b] Y = c Z = [] Y en general puede usarse patrones para obtener los primeros N elementos de una lista de al menos N elementos, anteponiendo N variables al símbolo. Por otro lado, para el caso de listas de listas, es posible diseñar patrones para obtener elementos de las sublistas, por ejemplo: [[X] Y] [[X Y] Z] [[X,Y Z]] una lista de al menos un elemento, cuya cabeza es una lista de exactamente un elemento una lista de al menos un elemento cuya cabeza sea también una lista de al menos un elemento una lista cuyo único elemento es una lista de al menos dos elementos En este punto ya es posible dar una definición más precisa de lista, se puede decir que L es una lista si: o es la lista vacía o existe otra lista L1 tal que [H L1] es una lista. esto puede ser directamente traducido a Prolog, en la construcción de un predicado es_lista que sea verdadero cuando su único sujeto sea efectivamente una lista: es_lista([]). es_lista([cab Cola]) :- es_lista(cola). De esta manera probar que [a,b] es una lista se reduce a probar: 58

es_lista([b]) y esto a su vez en: es_lista([]) lo cual se conoce que es verdadero. Problema Resuelto N 1 Construir un predicado que relacione una lista con su cantidad de elementos. Por ejemplo:?- longitud_de([a,b,c,d,e],x). X = 5 Respuesta Se puede decir que la longitud de una lista es: o cero si es la lista vacía o uno más la longitud de la cola en cualquier otro caso Lo primero puede representarse en Prolog mediante el hecho: longitud_de([],0). Mientras que la segunda afirmación daría lugar a la regla: longitud_de([x Y],L) :- longitud_de(y,lc), L is Lc + 1. Es decir, la longitud de una lista es la longitud de la cola más uno (la cabeza). Listas como conjuntos Una lista puede utilizarse para representar conjuntos en Prolog, siempre que cumpla con las propiedades de los conjuntos de no tener elementos repetidos. De manera que: Atomo Elemento Lista Conjunto En Prolog es posible definir conjuntos por comprensión o por extensión. Por ejemplo el conjunto H que se define por extensión de la siguiente manera: H = {juan,luis,pedro} puede definirse en Prolog mediante la lista: 59

[juan,luis,pedro] la cual debe ser sujeto de algún predicado, por ejemplo: padre(jose, [juan,luis,pedro]) El mismo conjunto puede definirse por comprensión de la siguiente manera: H = {X X es hijo de jose} en el mismo sentido existe en Prolog el predicado findall: findall(variable,predicado,lista) donde Lista se unifica con la lista de las instancias de V para las cuales Predicado es verdadero. Por ejemplo, si se encuentran los siguientes hechos almacenados en la base de datos: padre(jose, juan) padre(jose, luis) padre(jose, pedro) la siguiente consulta permitirá obtener la definición por comprensión del mismo conjunto mencionado anteriormente:?- findall(x,padre(jose,x),l). L = [juan,luis,pedro]) Problema Resuelto N 2 Definir el predicado pertenece que será verdadero cuando un elemento pertenezca a un conjunto dado. Por ejemplo:?- pertenece(f,[a,b,d,f,e]). Yes?- pertenece(u,[a,b,d,f,e]). No Respuesta Un elemento pertenece a un conjunto C, representado mediante una lista si: o es la cabeza de la lista (es un elemento del conjunto C) o pertenece a la cola de la lista (pertenece a algún subconjunto de C) La primera opción se representa en Prolog mediante el siguiente hecho: pertenece(x,[x _]). mientras que la segunda situación se puede expresar mediante la regla: 60

pertenece(x,[y Z]) :- pertenece(x,z). Vectores En Prolog, puede considerarse a los vectores como conjuntos ordenados representados en forma de listas. Se presenta a continuación una serie de ejemplos en los que se demuestra el tratamiento de arreglos, en forma de listas. Problema Resuelto N 3 Construir un conjunto de reglas para calcular la suma de dos vectores representados mediante listas. Respuesta El primer ejemplo considerado, es la suma de vectores, y el algoritmo procedural para su resolución es el siguiente: Para i =1 hasta n S(i) = A(i) + B(i) fin para donde A y B son los vectores a sumar, y S el vector resultado. Para su definición en Prolog, puede considerarse un predicado ternario es_suma_de_vectores, cuyos sujetos sean el vector suma S y los vectores sumandos A y B. Utilizando la técnica recursiva, puede pensarse que un vector S es la suma de otros dos vectores A y B, si la cabeza de S es la suma de las cabezas de A y B, y además el vector cola de S es la suma de los vectores cola de A y B; y la suma es un vector vacío, si los vectores a sumar son vacíos (caso embrionario). El conjunto de reglas lógicas necesarias para definir la suma de vectores en Prolog se definen entonces de la siguiente manera (los prefijos Ca y Co son utilizados para referirse a la cabeza y cola de una lista, respectivamente): es_suma_de_vectores ([ ], [ ], [ ]). es_suma_de_vectores ([CaS CoS], [CaA CoA], [CaB CoB]) :- CaS is CaA + CaB, es_suma_de_vectores (CoS, CoA, CoB). Problema Resuelto N 4 Construir un juego de reglas que relacione un vector con el mismo vector ordenado mediante el método de selección. Respuesta Una de las numerosas formas de ordenamiento de vectores, es el método de selección. El algoritmo de ordenamiento por selección de un vector de n elementos queda definido a través de los siguientes pasos: o Encontrar el mayor elemento del vector. o Intercambiar el elemento mayor con el elemento de subíndice n. 61

o A continuación se busca el elemento mayor en el vector hasta el subíndice n-1, y se intercambia con el elemento de esa posición, por consiguiente, se sitúa el segundo elemento mayor en la posición n- 1. o A continuación se busca el elemento mayor en el vector hasta n-2, y así sucesivamente. Enfoque Procedural: Para j=n hasta 2 decrementando 1 Mayor = V(j) Posicion = j Para i = j-1 hasta 1 decrementando 1 Si V(i) > Mayor Mayor <- V(i) Posicion <- j fin si fin para intercambiar (V(j), V(Posicion)) fin para Enfoque Lógico: Debido a que con listas es mas natural la referencia al primero (la cabeza) que al último, en el juego de reglas que se propone a continuación se trabaja con el análogo lógico de la búsqueda del menor y el intercambio con la cabeza. En lenguaje natural: "Un vector VO representado en forma de lista es_ordenado_de otro vector V, si la cabeza de VO es el elemento menor de V y la cola de VO es_ordenado_de el vector formado por los elementos de V menos el menor". es_ordenado_de ([ ], [ ]). es_ordenado_de ([Menor Ordenado], V) :- es_el_menor_de (Menor, V), es_v_sin_el_menor (V1, V, Menor), es_ordenado_de (Ordenado, V1). El predicado es_el_menor_de relaciona el átomo menor con la lista a la que pertenece. Una posibilidad es que el menor sea la cabeza, es decir: "la cabeza de una lista es el menor de sus elementos, si es menor que el menor de la cola", en código: es_el_menor_de (CaV, [CaV CoV]) :- es_el_menor_de (X, CoV), CaV < X. La otra posibilidad es que el menor sea un elemento de la cola, es decir: "un elemento es el menor de una lista si es el menor de la cola y además es menor que la cabeza", en código: es_el_menor_de (X, [CaV CoV]) :- es_el_menor_de (X, CoV), X < CaV. Para la definición del caso embrionario, se parte del hecho que el elemento de una lista de un solo elemento es el menor de la lista: es_el_menor_de (CaV, [CaV]). 62

Finalmente, el vector V1 es el formado por todos los elementos del vector V menos el elemento X. es_v_sin_el_menor (CoV, [X CoV], X). es_v_sin_el_menor ([CaV VA], [CaV CoV], X) :- CaV <> X, es_v_sin_el_menor (VA, CoV, X). 63