Prolog: Listas (y II) MRC
|
|
|
- Alejandro Franco Domínguez
- hace 9 años
- Vistas:
Transcripción
1 Prolog: Listas (y II) MRC Víctor Peinado 11 de diciembre de 2014 Referencias (Blackburn, et al., 2006, chap. 6) 1 1 Blackburn, P., Bos, J., Striegnitz, K. Learn Prolog Now!. College Publications. (Clocksin & Mellish, 2003) 2 Texts in Computer Science, vol Concatenando listas Ya hemos visto cómo manejar listas y qué tipo de operaciones podemos realizar con ellas. En este tema vamos a profundizar un poco más en esta estructura de datos fundamental en Prolog. Vamos a definir un predicado llamado concatena/3 cuyos tres argumentos sean tres listas. Desde el punto de vista declarativo, una consulta como concatena(l1, L2, L3) va a tener éxito si y solo si L3 es una lista resultado de concatenar L1 y L2. Consultas como las siguientes, tienen éxito:?- concatena([1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6]). true. lpnpage.php?pageid=online 2 Clocksin, W., Mellish, C. S. Programming in Prolog. Springer Science & Business Media google.es/books?id=vjhk2cjrti8c?- concatena([a, b], [c, [5, 6]], [a, b, c, [5, 6]]). true.?- concatena([a, b], [], [a, b]). true. Por el contrario, las siguientes consultas fallan:?- concatena([1, 2, 3], [4, 5, 6], [4, 5, 6, 1, 2, 3]).?- concatena([a, b], [c, [5, 6]], [a, b, c, 5, 6]).?- concatena([a, b], [], [a, b, []]). Desde el punto de vista procedimental, la utilidad más obvia de este predicado concatena/3 es precisamente concatenar dos listas. Para ello, basta con que utilicemos una variable como tercer argumento:
2 prolog: listas (y ii) mrc 2?- concatena([a, b], [1, 2, 3], Resultado). Resultado = [a, b, 1, 2, 3].?- concatena([1, 2, 3], [1, 2, 3], Resultado). Resultado = [1, 2, 3, 1, 2, 3].?- concatena([a, b], [], Resultado). Resultado = [a, b]. Como veremos a continuación, también podemos usar concatena/3 para cortar una lista en dos. De hecho, hay muchas cosas que podemos hacer con este predicado. Definiendo el predicado concatena/3 Cómo podemos definir este predicado? Fíjate en cómo lo definimos recursivamente: % predicado concatena/3 concatena([], L, L). concatena([cabeza Cola], L2, [Cabeza L3]) :- concatena(cola, L2, L3). El caso base no debería ser ninguna sorpresa: la concatenación de la lista vacía con cualquier otra lista arbitraria da como resultado la lista en cuestión. Pero, cómo tratamos la concatenación de una lista no vacía con otra lista L2? Pues separamos Cabeza y Cola en la primera lista y terminamos con una lista cuya cabeza es la Cabeza de la primera lista y cuya cola es el resultado de concatenar la Cola de la primera lista con la lista L2. Analicemos el funcionamiento procedimental de este predicado. Fíjate en la traza de la consulta siguiente consulta: [trace]?- concatena([1, 2, 3], [4, 5, 6], L). Call: (6) concatena([1, 2, 3], [4, 5, 6], _G2774)? creep Call: (7) concatena([2, 3], [4, 5, 6], _G2859)? creep Call: (8) concatena([3], [4, 5, 6], _G2862)? creep Call: (9) concatena([], [4, 5, 6], _G2865)? creep Exit: (9) concatena([], [4, 5, 6], [4, 5, 6])? creep Exit: (8) concatena([3], [4, 5, 6], [3, 4, 5, 6])? creep Exit: (7) concatena([2, 3], [4, 5, 6], [2, 3, 4, 5, 6])? creep Exit: (6) concatena([1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6])? creep L = [1, 2, 3, 4, 5, 6]. El intérprete de Prolog recorre de manera recursiva la primera lista hasta que trata de concatenar una lista vacía y el caso base tiene
3 éxito. A partir de ahí, recorre el camino inverso instanciando las variables que ha ido dejando por el camino. Fíjate en el árbol de búsqueda de una consulta como concatena([a, b, c], [1, 2, 3], X): prolog: listas (y ii) mrc 3
4 prolog: listas (y ii) mrc 4 Otros usos de concatena/3 Tal y como tenemos definido el predicado concatena/3 podemos darle otros usos interesantes. El primero que vamos a ver es utilizarlo para romper una lista en dos. Fíjate en este ejemplo:?- concatena(l1, L2, [1, 2, 3, 4]). L1 = [], L2 = [1, 2, 3, 4] ; L1 = [1], L2 = [2, 3, 4] ; L1 = [1, 2], L2 = [3, 4] ; L1 = [1, 2, 3], L2 = [4] ; L1 = [1, 2, 3, 4], L2 = [] ; Cómo funciona esta consulta? Por un lado, especificamos la lista que queremos partir en dos como tercer argumento y, por otro, usamos dos variables como los dos pimeros argumentos. El intérprete de Prolog busca distintas posibilidades de instanciar las variables con dos listas cuya concatenación de como resultado la lista especificada como tercer argumento: en este caso, [1, 2, 3, 4]. Utilizando backtracking, Prolog es capaz de encontrar todas las posibilidades de separar una lista en dos. [trace]?- concatena(l1, L2, [a, b, c]). Call: (6) concatena(_g2763, _G2764, [a, b, c])? creep Exit: (6) concatena([], [a, b, c], [a, b, c])? creep L1 = [], L2 = [a, b, c]. [trace]?- concatena(l1, L2, [a, b, c]). Call: (6) concatena(_g2763, _G2764, [a, b, c])? creep Exit: (6) concatena([], [a, b, c], [a, b, c])? creep L1 = [], L2 = [a, b, c]. [trace]?- concatena(l1, L2, [a, b, c]). Call: (6) concatena(_g2763, _G2764, [a, b, c])? creep Exit: (6) concatena([], [a, b, c], [a, b, c])? creep L1 = [], L2 = [a, b, c] ;
5 prolog: listas (y ii) mrc 5 Redo: (6) concatena(_g2763, _G2764, [a, b, c])? creep Call: (7) concatena(_g2853, _G2764, [b, c])? creep Exit: (7) concatena([], [b, c], [b, c])? creep Exit: (6) concatena([a], [b, c], [a, b, c])? creep L1 = [a], L2 = [b, c] ; Redo: (7) concatena(_g2853, _G2764, [b, c])? creep Call: (8) concatena(_g2856, _G2764, [c])? creep Exit: (8) concatena([], [c], [c])? creep Exit: (7) concatena([b], [c], [b, c])? creep Exit: (6) concatena([a, b], [c], [a, b, c])? creep L1 = [a, b], L2 = [c] ; Redo: (8) concatena(_g2856, _G2764, [c])? creep Call: (9) concatena(_g2859, _G2764, [])? creep Exit: (9) concatena([], [], [])? creep Exit: (8) concatena([c], [], [c])? creep Exit: (7) concatena([b, c], [], [b, c])? creep Exit: (6) concatena([a, b, c], [], [a, b, c])? creep L1 = [a, b, c], L2 = [] Redo: (9) concatena(_g2859, _G2764, [])? creep Fail: (9) concatena(_g2859, _G2764, [])? creep Fail: (8) concatena(_g2856, _G2764, [c])? creep Fail: (7) concatena(_g2853, _G2764, [b, c])? creep Fail: (6) concatena(_g2763, _G2764, [a, b, c])? creep Además, podemos utilizar concatena/3 para definir otros predicados útiles. Imagina que necesitamos encontrar prefijos de listas (o sublistas que aparecen como cabeza de una lista mayor). Podemos definir un predicado prefijo/2 tal que: % encuentra prefijos prefijo(prefijo, L) :- concatena(prefijo, _, L). La lista Prefijo es un prefijo de la lista L cuando existe alguna otra lista (representada por la variable anónima) que, concatenada con Prefijo, da como resultado la lista L. Cómo funciona??- prefijo(prefijo, [z, y, x, w]). Prefijo = [] ; Prefijo = [z] ; Prefijo = [z, y] ; Prefijo = [z, y, x] ;
6 prolog: listas (y ii) mrc 6 Prefijo = [z, y, x, w] ; Encuentra posibles sufijos para una lista y, lo que es más interesante, a través del backtracking es capaz de encontrar todas las posibles soluciones. Podemos hacer algo similar y definir un predicado sufijo/2 que busque posibles sufijos de una lista. La lista Sufijo es un sufijo de la lista L cuando existe alguna otra lista (representada por la variable anónima) de manera que si la concatenamos con Sufijo, da como resultado la lista L. % encuentra sufijos sufijo(sufijo, L) :- concatena(_, Sufijo, L). Cómo funciona??- sufijo(sufijo, [z, y, x, w]). Sufijo = [z, y, x, w] ; Sufijo = [y, x, w] ; Sufijo = [x, w] ; Sufijo = [w] ; Sufijo = [] ; Por último, es sencillo definir un predicado sublista/2 que encuentre sublistas a partir de listas mayores. Imagina la lista [a, b, c, d]. Podemos segmentarla en sublistas de elementos consecutivos tales como [], [a], [b], [c], [d], [a, b], [b, c], [c, d], [a, b, c], [b,c,d] y la propia [a, b, c, d]. Podemos re-utilizar nuestro código anterior para definir una sublista como los prefijos de los sufijos de una lista. % una sublista es un prefijo de un sufijo de un lista sublista(subl, L) :- sufijo(sufijo, L), prefijo(subl, Sufijo). Y así es como funciona:?- sublista(subl, [a, b, c]). SubL = [] ; SubL = [a] ; SubL = [a, b] ; SubL = [a, b, c] ; SubL = [] ; SubL = [b] ; SubL = [b, c] ; SubL = [] ; Fíjate en que tal y como está definido, repite algunos posibles soluciones. Prueba a visualizar la traza para terminar de entender su funcionamiento.
7 prolog: listas (y ii) mrc 7 SubL = [c] ; SubL = [] ; Problemas con concatena/3 Ya hemos visto que el predicado concatena/3 tiene importantes usos y es muy práctico para algunas tareas relacionadas con dividir listas. Sin embargo, es algo ineficiente. Recuerda cómo funciona. Necesita recorrer de manera recursiva una lista completa hasta encontrar el caso base antes de realizar la concatenación de las listas propiamente dicha. No hay problema cuando estamos concatenando listas más o menos pequeñas. Pero, cuando lanzamos consultas con variables para que sea Prolog el que proporciona todas los posibles segmentos de una lista, vemos cómo se realizan demasiadas operaciones. Para ilustrar este ejemplo de eficiencia, vamos a tratar de resolver el problema de invertir el orden de los elementos de una lista: vamos a definir un predicado invierte/2 que tenga éxito cuando tome como primer argumento una lista (por ejemplo, [1, 2, 3] y como segundo la misma lista invertida [3, 2, 1]). Invirtiendo el orden de una lista Para qué querríamos invertir el orden de una lista? No es suficiente complicación con lo que llevaos visto hasta ahora? Bueno, como habrás visto, en Prolog es mucho más sencillo acceder a los primeros elementos de una lista (a tráves del operador que separa cabeza y cola) que a los del final. Si tuviéramos un predicado que nos permitiera invertir el orden de los elementos de una lista, podríamos darle la vuelta a la lista y operar sobre la nueva cabeza. Vamos a definir dos mecanismos para invertir el orden de una lista. Primero una aproximación un poco ingenua, definida a partir de concatena/3. Después vamos a definir un mecanismo más eficiente, utilizando a nuestros amigos los acumuladores. Método 1: invierte/2 La definición recursiva de una lista invertida es la siguiente: 1. Si la lista de entrada es la lista vacía, la lista invertida es la misma lista vacía. 2. Si la lista de entrada es una lista no vacía, invertimos la cola de la lista y se la concatenamos a la cabeza de la lista.
8 prolog: listas (y ii) mrc 8 % invierte/2, v.1 invierte([], []). invierte([cabeza Cola], L) :- invierte(cola, ColaInvertida), concatena(colainvertida, [Cabeza], L). Para ver cómo funciona, considérese la lista [1, 2, 3]. Si invertimos la cola de la lista obtenemos [3, 2]. Y si le concatenamos [1], obtenemos la lista invertida esperada: [3, 2, 1]. Qué tal funciona??- invierte([a, b, c], L). L = [c, b, a].?- invierte([primero, segundo, tercero], L). L = [tercero, segundo, primero]. Esta definición es perfectamente correcta, pero si revisamos una traza veremos la cantidad de operaciones de concatenación que realiza. [trace]?- invierte([1, 2, 3], L). Call: (6) invierte([1, 2, 3], _G3077)? creep Call: (7) invierte([2, 3], _G3159)? creep Call: (8) invierte([3], _G3159)? creep Call: (9) invierte([], _G3159)? creep Exit: (9) invierte([], [])? creep Call: (9) concatena([], [3], _G3163)? creep Exit: (9) concatena([], [3], [3])? creep Exit: (8) invierte([3], [3])? creep Call: (8) concatena([3], [2], _G3166)? creep Call: (9) concatena([], [2], _G3158)? creep Exit: (9) concatena([], [2], [2])? creep Exit: (8) concatena([3], [2], [3, 2])? creep Exit: (7) invierte([2, 3], [3, 2])? creep Call: (7) concatena([3, 2], [1], _G3077)? creep Call: (8) concatena([2], [1], _G3164)? creep Call: (9) concatena([], [1], _G3167)? creep Exit: (9) concatena([], [1], [1])? creep Exit: (8) concatena([2], [1], [2, 1])? creep Exit: (7) concatena([3, 2], [1], [3, 2, 1])? creep Exit: (6) invierte([1, 2, 3], [3, 2, 1])? creep L = [3, 2, 1]. Siempre hay más de una forma de hacer las cosas. Y en este caso, hay una forma mejor.
9 prolog: listas (y ii) mrc 9 Método 2: invierte2/3 usando acumuladores La segunda forma de definir invierte2/3 es utilizando acumuladores. La idea que subyace es sencilla: el acumulador es una lista que se inicializará como una lista vacía. A medida que vamos procesando las cabezas de la lista de partida, vamos añadiendo estos elementos al acumulador. El proceso termina cuando el acumulador contiene la lista inicial invertida. Veamos un ejemplo. Partimos desde la lista [a, b, c] y el acumulador es la lista vacía []. Tomamos la cabeza de la lista cuyo orden queremos invertir y se lo añadimos al acumulador. A continuación, procedemos a invertir la cola de la lista [b, c], siendo nuestro acumulador [a]. De nuevo, tomamos la cabeza, la añadimos como cabeza de nuestro acumulador, y procedemos a procesar la cola [c], con el acumulador [b, a]. Añadimos la cabeza como cabeza del acumulador y procesamos la cola [] con el acumulador [c, b, a]. En este punto, el proceso termina, ya que la lista pendiente de procesar está vacía y, en consecuencia nuestro acumulador contiene la lista con el orden de los elementos invertidos. El código necesario es el siguiente: % invierte2/2 con acumulador invierte2([cabeza Cola], Acumulador, LInv) :- invierte2(cola, [Cabeza Acumulador], LInv). invierte2([], Acumulador, Acumulador). Veamos cómo funciona la traza. Esta solución es eficiente porque simplemente recorremos la lista inicial una vez. No necesitamos perder tiempo realizando concatenaciones de segmentos de listas que resultan irrelevantes para generar el resultado final. Este es un ejemplo clásico de uso de acumuladores y es muy similar a los ejemplos que vimos en temas anteriores. La cláusula recursiva es la responsable de separar cabeza y cola de la lista de entrada y añadir la cabeza en el acumulador. El caso base detiene el proceso y copia el contenido del acumulador en la lista invertida. [trace]?- invierte2([1, 2, 3], [], L). Call: (6) invierte2([1, 2, 3], [], _G3062)? creep Call: (7) invierte2([2, 3], [1], _G3062)? creep Call: (8) invierte2([3], [2, 1], _G3062)? creep Call: (9) invierte2([], [3, 2, 1], _G3062)? creep Exit: (9) invierte2([], [3, 2, 1], [3, 2, 1])? creep Exit: (8) invierte2([3], [2, 1], [3, 2, 1])? creep Exit: (7) invierte2([2, 3], [1], [3, 2, 1])? creep Exit: (6) invierte2([1, 2, 3], [], [3, 2, 1])? creep L = [3, 2, 1]. Por comodidad, podemos crear un predicado extra que llame a invierte2/2 inicializando el acumulador. invierte2(lista, LInv):- invierte2(lista, [], LInv. Es muy instructivo ejecutar trazas de las dos variantes. Compara las consultas invierte([1, 2, 3], L) y invierte2([1, 2, 3], [], L), por ejemplo. Ejercicios 1. Otros ejercicios lpnpage.php?pagetype=html&pageid= lpn-htmlse26
10 prolog: listas (y ii) mrc La sesión práctica lpnpage.php?pagetype=html&pageid= lpn-htmlse27
Práctica II. Prolog II: Meta Intérprete Vanilla
Práctica II Prolog II: Meta Intérprete Vanilla Contenido 1. Meta intérpretes. 2. Meta intérprete vanilla para cláusulas definidas. 3. Extensión vanilla predicados predefinidos. 4. Extensión vanilla pruebas.
Fundamentos de la POO 1
Fundamentos de la POO 1 La correcta aplicación de los conocimientos de clases y objetos nos permitirán llegar a los objetivos planteados y a generar programas que puedan ser fáciles de comprender para
n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n!
Capítulo 3 Recursión La recursión es un estilo autoreferencial de definición usado tanto en matemática como en informática. Es una herramienta de programación fundamental, particularmente importante para
Tema 6: Representación lógica del conocimiento
Inteligencia Artificial Curso 999 2000 Tema 6: Representación lógica del conocimiento José A. Alonso Jiménez Miguel A. Gutiérrez Naranjo Francisco J. Martín Mateos Dpto. de Ciencias de la Computación e
Estructuras de control: Las variables: Fuertemente tipado: Tipado dinámico: Variables booleanas: Qué son las estructuras de control?
Estructuras de control: Qué son las estructuras de control? Las estructuras de control nos permiten modificar el flujo del programa. Piensa en el programa como una piedra que baja por un tubo, entra por
el proceso de backtracking.
1 El proceso de Backtracking 1.1 Backtracking En esta práctica se examina en detalle cómo Prolog busca todas las soluciones a un objetivo. Prolog responde a una pregunta hecha por el programador. Esta
Programación con Listas
Capítulo 2 Programación con Listas En Prolog la estructura de lista está predefinida como una estructura recursiva lineal cuyas componentes pueden ser heterogéneas porque en Prolog no existe una comprobación
Inteligencia Artificial II Prolog I
Inteligencia Artificial II Prolog I Dr. Alejandro Guerra-Hernández Universidad Veracruzana Centro de Investigación en Inteligencia Artificial mailto:[email protected] http://www.uv.mx/personal/aguerra Maestría
FRACCIONES. Las partes que tomamos ( 3 ó 5 ) se llaman numerador y las partes en que dividimos el queso ( 8 ) denominador.
FRACCIONES Una fracción, en general, es la expresión de una cantidad dividida por otra, y una fracción propia representa las partes que tomamos de un todo. El ejemplo clásico es el de un queso que partimos
Inteligencia Artificial: Prolog
Inteligencia Artificial: Prolog Listas Christopher Expósito-Izquierdo 1, Belén Melián-Batista 2 {cexposit 1, mbmelian 2 }@ull.es Universidad de La Laguna (España) Contenidos Qué es una lista? Operador
Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos
Algoritmos y Estructuras de Datos I 1 cuatrimestre de 009 Departamento de Computación - FCEyN - UBA Programación funcional - clase Tipos algebraicos Tipos algebraicos y abstractos ya vimos los tipos básicos
UNIDAD 6 TEMA 4: OFIMÁTICA AVANZADA. CLASE 05: Combinar correspondencia.
UNIDAD 6 TEMA 4: OFIMÁTICA AVANZADA. CLASE 05: Combinar correspondencia. Mediante la opción Combinar correspondencia Word2007 nos permite incluir en un documento, datos almacenados en otro sitio. De esta
Lección 8: Exponen tes y notación exponencial
GUÍA DE MATEMÁTICAS II Lección 8: Exponen tes y notación exponencial En matemáticas es común que se trate de simplificar la notación, al mismo tiempo que se generalizan los conceptos. Por ejemplo, hemos
Manos a la obra: Recursión, división y listas
Manos a la obra: Recursión, división y listas Taller de Álgebra I Cuatrimestre de verano de 2015 Calentando motores La clase pasada vimos ejemplos de definiciones recursivas. Hoy vamos a continuar con
Destrezas de redacción: La estructura de una frase
Destrezas de redacción: La estructura de una frase Joe Miró 18 de octubre de 2010 1. Estructura de una frase La frase es la unidad mínima de expresión de una idea. Cada frase de nuestro documento tiene
TUTORIAL PROLOG. Lenguajes de programación Universidad Nacional de Colombia Santiago Carvajal Castañeda Mario Andrés Moreno Norato
TUTORIAL PROLOG Lenguajes de programación Universidad Nacional de Colombia Santiago Carvajal Castañeda Mario Andrés Moreno Norato Prolog es un lenguaje de programación lógica de propósito general que se
Representación de enteros
Representación de enteros Organización de computadoras 2018 Universidad Nacional de Quilmes En la primera unidad vimos como utilizar binario para representar números naturales. En esta unidad veremos como
Programación de Videojuegos Tema 15 Tipos de Dato I. 15. Tipos de Dato I
15. Por ahora ya sabemos lo suficiente sobre el muestreo de textos por pantalla, aunque por supuesto a falta de practicar un poco. Vamos a cambiar un poco de temática y vamos a ver otros aspectos avanzados
Estructuras incompletas. Listas diferencia.
Estructuras incompletas. Listas diferencia. 1 / 13 Estructuras incompletas Proporcionan una técnica de implementación muy potente propia de Prolog: Incrementan radicalmente la eficiencia de muchos programas.
Unidad 15: Funciones de Texto
Unidad 15: Funciones de Texto 15.0 Introducción Las funciones de texto le ayudan a manipular los datos de texto para ponerlos en la forma que prefiera por ejemplo, para borrar los datos sin procesar que
Guía 2: Listas, recursión e inducción
Introducción a los Algoritmos - 2do cuatrimestre 2014 Guía 2: Listas, recursión e inducción Docentes: Walter Alini, Luciana Benotti En esta guía comenzaremos a trabajar con listas Para familiarizarnos
Programación Declarativa Ejercicios de programación con listas
Programación Declarativa Ejercicios de programación con listas Ejercicio 1 Define versiones recursivas de los siguientes predicados sobre listas: es lista(xs) Xs es una lista bien formada es lista nat(ss)
Secuencias en Python. Introducción a la Computación Clase 11 Patricia Borensztejn
Secuencias en Python Introducción a la Computación Clase 11 Patricia Borensztejn Una cadena es una secuencia En Python tenemos los tipos de datos Escalares: enteros, flotantes Secuencias: sucesión de elementos
Algoritmo de unificación de Robinson
Capítulo 1 Algoritmo de unificación de Robinson 1.0 Introducción Con objeto de encontrar el unificador de máxima generalidad de dos términos se han propuesto numerosos algoritmos siendo el más conocido
Algoritmos y Programación Orientada a Objetos I. Contenedoras de tamaño fijo
Algoritmos y Programación Orientada a Objetos I Contenedoras de tamaño fijo Agenda Motivación Contenedoras de tamaño fijo Instrucciones repetitivas Agenda Motivación Contenedoras de tamaño fijo Instrucciones
Cargando los tipos de datos estructurados
Cargando los tipos de datos estructurados En más de una oportunidad, necesitamos almacenar en memoria una lista de elementos que tienen el mismo tipo de información pero distintos valores guardados. Por
Programación lógica con listas
Ingeniería Informática Ingeniería Técnica en Informática de Sistemas Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga Contenido 1. Programación básica con listas 2. Generar/comprobar
Integración de funciones trigonométricas
Integración de funciones trigonométricas Ya vimos las reglas para calcular integrales de funciones trigonométricas. Ahora vamos a considerar productos de funciones trigonométricas y potencias. Para este
Tema 7: Árbol Binario
Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el???? Tema 7: Árbol Binario En el árbol binario se combina lo mejor del array (acceso rápido a elementos,
Programación recursiva en Prolog
Programación recursiva en Prolog Curso 2002/03, Fecha:14/12/2002 Enunciado 1 (naturales) El siguiente predicado define la suma de números naturales representados mediante la constante 0 y la función siguiente
Un sistema de numeración está compuesto por el conjunto de símbolos y reglas que se utilizan para representar cantidades.
Repaso Sistemas Numéricos Un sistema de numeración está compuesto por el conjunto de símbolos y reglas que se utilizan para representar cantidades. A la cantidad de símbolos, que componen dicho conjunto,
Cómo construir aplicaciones con más de una ventana (Screen)
Cómo construir aplicaciones con más de una ventana (Screen) Es muy probable que en muchas de las aplicaciones que hemos creado hasta ahora hayamos necesitado agregar más de una ventana para lograr el correcto
UNIDAD 7: NÚMEROS DECIMALES Y OPERACIONES
UNIDAD 7: NÚMEROS DECIMALES Y OPERACIONES ÍNDICE 7.1 Unidad decimal. 7.2 Escritura, lectura y descomposición de números decimales. 7.2.1 Escritura de números decimales. 7.2.2 Lectura de números decimales.
media = ( temp0 + temp1 + temp2 + temp3 + temp temp23 ) / 24; printf( "\nla temperatura media es %f\n", media );
Arrays en el lenguaje C Introducción Una posible definición de array sería: Un conjunto de datos del mismo tipo, identificados por el mismo nombre, y que se pueden distinguir mediante un número de índice.
TEST DE RAZONAMIENTO NUMÉRICO. Consejos generales
TEST DE RAZONAMIENTO NUMÉRICO Consejos generales 1 I. INTRODUCCIÓN En lo relativo a los cálculos de porcentajes, es fundamental tener en cuenta que los porcentajes, en realidad, son referencias abstractas,
004. Archivos y directorios
004. Archivos y directorios 4.1 Creando directorios 4.2 Visualizando 4.3 Diferentes nombres para un mismo archivo 4.1 Creando directorios. Para crear un directorio vamos a utilizar la orden mkdir. $ mkdir
Decimos que un objeto se mueve con un movimiento circular si su trayectoria es una circunferencia.
Movimiento circular La trayectoria de un móvil sabemos que puede tener formas muy diversas. Hasta ahora hemos estudiado el caso más simple de trayectoria, la rectilínea. Ahora vamos a dar un paso más y
Columnas calculadas (operadores aritméticos y de concatenación)
Columnas calculadas (operadores aritméticos y de concatenación) SqlServer Aprendimos que los operadores son símbolos que permiten realizar distintos tipos de operaciones. Dijimos que SQL Server tiene 4
5.3 Tipos de Datos en Prolog
5.3 Tipos de Datos en Prolog Objetos de Datos en Prolog Objetos de datos simples Objetos estructurados Calce de operaciones fundamentales sobre objetos 1 Tipos de Objetos de Datos Objetos de datos Objetos
5.3 Tipos de Datos en Prolog
5.3 Tipos de Datos en Prolog Objetos de Datos en Prolog Objetos de datos simples Objetos estructurados Calce de operaciones fundamentales sobre objetos Tipos de Objetos de Datos Objetos de datos Objetos
PRÁCTICA 3: MATLAB Y LA FORMA REDUCIDA POR FILAS
PRÁCTICA 3: MATLAB Y LA FORMA REDUCIDA POR FILAS Introducción En esta práctica aprenderemos a manejar el comando rref de MATLAB, que calcula la forma reducida por filas de una matriz; también se verán
5.3 Tipos de Datos en Prolog
5.3 Tipos de Datos en Prolog Recocimiento de Tipos Se recoce el tipo de un dato por su forma sintáctica; se requiere de declaración de tipos Ejemplo: Variables se definen comienzan con primera en mayúsculas
TEMA 2. Números racionales. Teoría. Matemáticas
1 1.- Números racionales Se llama número racional a todo número que puede representarse como el cociente de dos enteros, con denominador distinto de cero. Se representa por Las fracciones también pueden
Tiras Numéricas: el secreto de los números naturales. José Acevedo Jiménez. 01/11/2016.
Tiras Numéricas: el secreto de los números naturales. José Acevedo Jiménez. 01/11/2016. Primos Cercanos. Si de números primos se trata Quiero proponer un problema, de sencillo argumento el dilema Y, aquí
4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es
Recursividad 4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es recursivo si forma parte de sí mismo o interviene
donde <directorio> es el nombre del directorio al que queremos ingresar.
Moviéndonos por el entorno Ahora que ya podemos presentarnos como usuarios y sabemos como indicar archivos con su camino completo, cómo podemos cambiar nuestro directorio de trabajo? El comando para movernos
Capítulo 5. Integrales sobre curvas y superficies
Capítulo 5. Integrales sobre curvas y superficies 5.1. Integrales de funciones escalares sobre curvas 5.2. Integrales de campos vectoriales sobre curvas 5.3. Teorema de Green 5.4. Integrales sobre superficies
Lección 5: Porcentajes
Lección 5: Porcentajes En las lecciones anteriores estudiamos relaciones de proporcionalidad directa e inversa. En esta lección estudiaremos una relación de proporcionalidad directa especial: los porcentajes.
Teoría de los Lenguajes de Programación Práctica curso Enunciado. Fernando López Ostenero y Ana García Serrano
Teoría de los Lenguajes de Programación Práctica curso 2015-2016 Enunciado Fernando López Ostenero y Ana García Serrano Sumario 1. Introducción: Skyline de una ciudad...3 2. Enunciado de la práctica...3
Si el producto de dos números es cero
Matemáticas I, 2012-I Si el producto de dos números es cero Empezamos con un acertijo: Silvia tiene dos números. Si los multiplica sale 0 y si los suma sale 256. Cuáles son estos dos números que tiene
Multiplicación de matrices simétricas
Multiplicación de matrices simétricas La traspuesta de una matriz A n n es definida como una matriz A T n n tal que A T [i, j] =A[j, i] paracadai, j 2{1,...,n} Además, una matriz A es simétrica si A =
2. Sitúate en la celda A1 y pulsa sobre, selecciona la categoria de fecha y hora y elige la función AHORA().
FUNCIÓN CONTAR Y SUS VARIANTES Ejercicio paso a paso. 1. Si no tienes abierto Excel2010, ábrelo para realizar el ejercicio. 2. crea la siguiente tabla, Aquí se contara cuantas celdas están con datos en
Tema 6: Trigonometría.
Tema 6: Trigonometría. Comenzamos un tema, para mi parecer, muy bonito, en el que estudiaremos algunos aspectos importantes de la geometría, como son los ángulos, las principales razones e identidades
Ing. Iván Adrianzén Olano. Programación Lógica
Ing. Iván Adrianzén Olano Programación Lógica Fundamentos de Visual Prolog Visual Prolog es orientado a objeto Para el curso de Sistemas Expertos usaremos el Prolog de la forma clásica usando el PIE (Prolog
Teoria de Números. 1. Introducción. Residuos. Olimpiada de Matemáticas en Tamaulipas
Teoria de Números Residuos Olimpiada de Matemáticas en Tamaulipas 1. Introducción Hasta ahora, al trabajar con números enteros siempre nos hemos estado preguntando divide el número a al número b? Al mantenernos
Curso GeneXus - Otro ejemplo de uso de Business components
Curso GeneXus - Otro ejemplo de uso de Business components Vamos a ver a continuación un ejemplo práctico de uso de Business Components. Page1 Comencemos planteando el siguiente escenario: Todo cliente
Otro ejemplo de uso de Business Components
Otro ejemplo de uso de Business Components Vamos a ver a continuación un ejemplo práctico de uso de Business Components. Comencemos planteando el siguiente escenario: Page1 Todo cliente de la agencia de
INSTITUCIÓN EDUCATIVA COLEGIO ARTÍSTICO RAFAEL CONTRERAS NAVARRO ASIGNATURA: ÁLGEBRA GRADO: NOVENO ESP. HENRY CARRASCAL C. TIPOS DE FUNCIONES
INSTITUCIÓN EDUCATIVA COLEGIO ARTÍSTICO RAFAEL CONTRERAS NAVARRO ASIGNATURA: ÁLGEBRA GRADO: NOVENO ESP. HENRY CARRASCAL C. Recapitulemos sobre el tema Funciones: TIPOS DE FUNCIONES Intuitivamente, la palabra
1. Cadenas EJERCICIO 1
LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007 - BOLETÍN DE EJERCICIOS Víctor J. Díaz Madrigal y José Miguel Cañete Departamento de Lenguajes y Sistemas Informáticos 1. Cadenas La operación reversa aplicada
Conjuntos computables y Teorema de Rice
Lógica y Computabilidad Julián Dabbah (Robado de una clase de Franco Frizzo basada en una clase de María Emilia Descotte) 20 de septiembre de 2017 Repaso Conjuntos computables La función característica
Ejercicios Resueltos del Práctico 3 - Recursión
Ejercicio 1 Escriba el pseudocódigo de una función recursiva que verifique si 2 listas son iguales (mismos elementos en el mismo orden). Solución propuesta para el Ejercicio 1 Si ambas listas son vacías
Introducción. Curso de Middleware. Práctica 1. 1 de 14
Introducción Nuestro objetivo a la hora de crear estas prácticas es ver cómo usar los servicios y mecanismos que nos ofrece un Middleware mediante una sucesión de ejemplos, quizás algo sencillos al principio
MICROSOFT WORD INTRODUCCIÓN
MICROSOFT WORD 2010 1.- INTRODUCCIÓN El procesador de textos del paquete ofimático de Microsoft Office es una herramienta muy potente, como veremos durante las prácticas con este programa, dispone de una
23/09/2009. Introducción Hello word La familia Buendía Recursión Listas
Prolog Contenido Introducción Hello word La familia Buendía Recursión Listas Qué es Prolog? Lenguaje de programación Declarativo Programación lógica Está compuesto de: Hechos Reglas Declarativo vs Imperativo
2º Certamen ILI-253 Lenguajes de Programación Juan Pablo Menichetti Jorge Mujica 10 de Junio del 2004
º Certamen ILI-53 Lenguajes de Programación Juan Pablo Menichetti Jorge Mujica 10 de Junio del 004 ta: Tiempo: 10 Minutos. Responda con lápiz indeleble para acceder a recorrecciones. Utilice solo las hojas
Programación en PROLOG(1)
Programación en PROLOG(1) Inteligencia Artificial 2º cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Prolog Es el representante más conocido del
EXPRESIONES ALGEBRAICAS.
EXPRESIONES ALGEBRAICAS. Se dice expresión algebraica aquella que está formada por números y letras unidos mediante signos. 4x 2 + 1 2 3y Observa que existen dos variables x e y. En la siguiente expresión
Temas. Objetivo. Símbolo, alfabeto. Hileras y operaciones con hileras. Operaciones con lenguajes
0 1 Temas Símbolo, alfabeto Hileras y operaciones con hileras Operaciones con lenguajes Objetivo Que el estudiante logre conocer, comprender y manejar conceptos vinculados con la Teoría de Lenguajes Formales
GRAFICOS EN EXCEL. En muchas ocasiones resulta muy útil que la información contenida en un libro de Excel se visualice gráficamente.
GRAFICOS EN EXCEL En muchas ocasiones, necesitamos mostrar diversos datos, ya sea para convencer a alguien o simplemente para demostrar un determinado progreso o detrimento. A pesar de que existen algunas
Combinar correspondencia
ESTÁNDAR DESEMPEÑO ESTÁNDAR DESEMPEÑO BÁSICO Interpreta la tecnología y sus manifestaciones (artefactos, procesos, productos, servicios y sistemas) como elaboración cultural, que ha evolucionado a través
BOTON DE OPCION Controles de Formulario
BOTON DE OPCION Controles de Formulario * BOTON DE OPCION Controles de Formulario Botones de Opción Ya vimos uno de los controles de formularios en el tutorial de Listas desplegables. Si no lo viste, te
Estructuras Dinámicas de datos.
Estructuras Dinámicas de datos. Las estructuras dinámicas de datos son estructuras que crecen a medida que ejecuta un programa. Una estructura dinámica de datos es una colección de elementos llamadas nodos
3.2. Control con cortes Operador corte Cortes verdes Cortes rojos
3. CONTROL en la PROGRAMACIÓN LOGICA 45 Tema 3. CONTROL en la PROGRAMACION LOGICA 3.1. Control mediante el Orden en literales y sentencias 3.2. Control con cortes 3.2.1. Operador corte 3.2.2. Cortes verdes
EL JUEGO DEL SENDERO (ANEXO I) Actividades matemáticas que incitan a la modelización.
Javier Falcó Benavent. Universitat Politècnica de València [email protected] EL JUEGO DEL SENDERO (ANEXO I) Actividades matemáticas que incitan a la modelización. Javier Falcó Benavent 2012 Este documento
