Metodología de Programación I Tutorial Prolog 2/3

Documentos relacionados
Metodología de Programación I Tutorial de Prolog (3/3)

Programación Declarativa Ejercicios de programación con listas

Tema 6: Funciones recursivas

Guía 2: Listas, recursión e inducción

Tema III Predicados Extralógicos de PROLOG

Guía 2: Funciones, listas, recursión e inducción

ESTRUCTURAS DE DATOS

sumas = 58 = 48 = 73 = 59 =

Programación con Listas

Tema 13: Aplicaciones de programación funcional

Aritmética y operadores (2011/2012)

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Tipos de datos algebraicos

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca

Ejercicios de programación funcional con Haskell

Tema 5: Otros predicados predefinidos

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

Exámenes de Programación funcional con Haskell ( )

Tema 3. Análisis de costes

Guía 1: Funciones, precedencia y tipado

Escuela Normal Superior N 40 Mariano Moreno. Cuadernillo Propedéutico 2017 Nivel Superior

23/09/2009. Introducción Hello word La familia Buendía Recursión Listas

Lenguajes de Programación Programación funcional

Busqueda y Ordenamiento. CC1001 Computación I

Universidad Autónoma del Estado de Hidalgo Instituto de Ciencias Básicas e Ingeniería Área Académica de Computación y Electrónica

Introducción Supongamos un subconjunto de n elementos X = {e 1,,e n de un conjunto referencial Y, X Y. Dentro de Y se define una relación de orden tot

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Bloque 1. Conceptos y técnicas básicas en programación

Inteligencia Artificial 2º cuatrimestre de 2009

Tema: Métodos de Ordenamiento. Parte 1.

Metodologías de Programación II Introducción

Prolog. Sintaxis Informal. Sintaxis Informal. Hechos: ejemplos. Inteligencia Artificial 2º cuatrimestre de Hechos. Hechos. Reglas.

Programación Funcional en Haskell

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Programmacion Declarativa - Prolog:

GUÍA BÁSICA DE SCHEME v.4

Algoritmos de Ordenamiento

Inteligencia Artificial: Prolog

Tema IV Programación lógica con estructuras

Introducción a la programación. Oscar Alejandro González Bustamante. José Víctor Martínez Ramos.

Orden en la sala! Herman Schinca. Clase de Mayo de 2011

Programación Funcional Lisp-Scheme

PROgramación LOGica PROLOG

Guía 2: Funciones, listas, recursión e inducción

data Tree a = Tip Node a (Tree a) (Tree a) deriving Show

Bloque 1. Conceptos y técnicas básicas en programación

Programación Exploratoria - Predicados Predefinidos en Prolog -

Operador de corte (cut): Motivaciones. Cut (!): Definición formal. Cut (!): Implicancias de la Definición. Aplicaciones. Cut (!): Ejemplo. b,!

/*1-Determina si lo que recibe es una lista*/ lista([]):-!. lista([x Y]):-lista(Y).

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Guía 2: Funciones, listas, recursión e inducción

Fundamentos de JAVA. Angel Kuri Enero, /2/2006

1. Sintaxis de Prolog

Pontificia Universidad Católica del Perú ICA624: Control Robusto. 11. Factorización Prima Sobre RH. Parametrización de Controles Estabilizantes

INDICACIONES PARA LA SOLUCIÓN A ALGUNOS PROBLEMAS DE LA RELACION 6. Se usarán los siguiente predicados genéricos en todos los ejemplos

Área: INFORMÁTICA. Saber- Saber: Identificar DFD como herramienta para escribir los algoritmos de forma lógica.

Tipos De Datos. Numéricos. Alfanuméricos (string) Arreglos (Vectores, Matrices) Estructurados Registros (Def. Por el Archivos Usuario) Apuntadores

Árboles generales. Un árbol es una estructura no lineal acíclica utilizada para organizar información de forma eficiente. La definición es recursiva:

PHP: Lenguaje de programación

Capítulo V: Programación Lógica. 5.1 Breve Introducción al Cálculo de Predicados

Introducción a Big Data con Python. Programación en Python. Tipos básicos y colecciones

Programación I! Clase de Teoría: Corte de Control. Prof. Mgter. Oscar Adolfo Vallejos

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

Operadores. Javier Fernández Rivera -

Tema 4: Definición de funciones

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

PROGRAMACIÓN ESTRUCTURADA

Tema 5: Definiciones de listas por comprensión

GUÍA DE TRABAJO N 1 C# Ing. Néstor Raúl Suarez Perpiñan Página 1 de 13

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

El lenguaje C. 1. Identificadores, constantes y variables

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Programación con C Intermedio


Práctica 2. TIPOS DE DATOS SIMPLES

Algoritmos de Ordenación

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

Introducción al Cálculo Lambda

Inteligencia Artificial

GLOSARIO 1. Qué es bit y byte? Bit: Es la unidad mínima de información. Puede ser 0 o 1. Byte: Es el conjunto de 8 bits. Ejemplo:

Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota:

Pseudocódigo y Diagramas de Flujo Pseudocódigo

1 INTRODUCCIÓN 2 SWI PROLOG 29/08/2014 PROLOG IMPLEMENTACIONES DE PROLOG

Programación MATLAB: Programas y Funciones.

Análisis asintótico: algoritmos recursivos e iterativos

Planificaciones Algoritmos y Programación I. Docente responsable: AZCURRA DIEGO ANDRES. 1 de 5

UNIDAD IV Programación Funcional. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

Las operaciones aritméticas son: suma, resta, multiplicación, división, potenciación, división entera.

INDICE 1.1. Información y Significado 1.2. Arreglos en C 1.3. Estructura en C 1.4. Clases en C++ 2. La Pila 2.1. Definición y Ejemplos

7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico.

JavaScript: Lenguaje de programación

UNIVERSIDAD MAYOR DE SAN ANDRES FACULTAD DE CIENCIAS PURAS Y NATURALES CURSO PREUNIVERSITARIO PRUEBA DE SUFICIENCIA ACADEMICA GESTION II/2017

Esquema. Condicionales. Ejemplo de condicional. Demostración. P { if (B) uno else dos } Q. P { while (B) cuerpo } Q

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Inteligencia en Redes de Comunicaciones. Prolog. Julio Villena Román.

Semántica Denotacional

Introducción rápida a la programación (estructurada ) con C++

CONTENIDO 1 Diagrama de flujo 2 Pseudocodigo 3 Diagrama estructurado (nassi-schneiderman)

Introducción a la Computación

Transcripción:

Metodología de Programación I Tutorial Prolog 2/3 Dr. Alejandro Guerra-Hernández Departamento de Inteligencia Artificial Facultad de Física e Inteligencia Artificial aguerra@uv.mx http://www.uv.mx/aguerra Maestría en Inteligencia Artificial 2011

Consultas La evaluación de 3 + 5 se realiza internamente por una instrucción de procesador. No confundir el operador is con la asignación convencional. X is X + 1 no tiene sentido en Prolog. El operador = unifica sus argumentos pero no los evalúa.?- X is 3+5. x= 8?- 4 is 3+5. false.? x=3, Y is X +2. X=3 Y=5

Is en las reglas Observen que se pierde generalidad. La siguiente meta causa error: suma(4,y,7). 1 par (X) :- 0 is X mod 2. 2 impar (X) :- 1 is X mod 2. 3 suma (X,Y, Z) :- Z is X+Y.?- par (3). false.?- par (4). true.?- suma (3,4,R). R=7?- suma (3,Y,7). ERROR : is /2: Arguments are not sufficiently instantiated

Predicados de comparación En las comparaciones se utiliza =< (<=, siendo semejante a una flecha, se utiliza con otros propósitos).?- 3+5 > 2+6. false.?- 3+5 >= 2+6. true.?- 3+5 =\= 2+6. false.?- 3 =:= 1 + 2. true. Aplican entre términos aritméticos.

Valores a partir de listas Estas funciones no utilizan la recursión a la cola, no pueden ser optimizadas. 1 sum ([],0). 2 sum ([X Xs],S) :- sum (Xs,Sc), 3 S is Sc + X. 4 5 long ([],0). 6 long ([X Xs],L):- long (Xs,Lc), 7 L is Lc + 1.

Valores a partir de listas (tail rec) Esta versión llama a una función auxiliar con acumulador. El uso de recursión a la cola permite la optimización. 1 sumopt (Xs,S) :- sumaux (Xs,0,S). 2 3 sumaux ([],S,S). 4 sumaux ([X Xs],Sa,S) :- Sn is X + Sa, 5 sumaux (Xs,Sn,S).

Listas a partir de valores Genera una lista creciente cuyo primer valor es X y el último valor es Y. 1 intervalo (X,X,[X]). 2 intervalo (X,Y,[X Xs ]) :- 3 X < Y, Z is X + 1, 4 intervalo (Z,Y, Xs).?- intervalo (1,5,R). R= [1, 2, 3, 4, 5] Yes

Listas por filtrado pares/2 filtra los elementos pares en su primer argumento. 1 pares ([],[]). 2 pares ([X Xs ],[X Ys ]) :- 3 par (X), pares (Xs,Ys). 4 pares ([X Xs],Ys) :- 5 impar (X), pares (Xs,Ys). Aquí se combina con intervalo/3 en una meta compuesta.?- intevalo (1,5, Aux ), pares (Aux, Resp ). Aux = [1, 2, 3, 4, 5] Resp = [2, 4]

Lista ordenada? El predicado ordenada/1 es veradero si su argumento es una lista ordenada: 1 ordenada ([]). 2 ordenada ([_]). 3 ordenada ([X,Y Ys ]) :- X<Y, ordenada ([Y Ys ]).?- ordenada ([1,2,3]). true?- ordenada ([1,3,2]). false.

Inserción en una lista ordenada inserta/3 pone el primer elemento en la lista ordenada segundo argumento, en el lugar correspondiente. 1 inserta (X,[],[ X]). 2 inserta (X,[Y Ys ],[X,Y Ys ]) :- 3 X < Y. 4 inserta (X,[Y Ys ],[Y Zs ]) :- 5 X >= Y, inserta (X,Ys,Zs).?- inserta (4,[1,2,3,5], R). R = [1, 2, 3, 4, 5]

Ordenando listas (por inserción) Ahora podemos ordenar una lista por inserción: 1 ordenains ([],[]). 2 ordenains ([X Xs],Ys) :- 3 ordenains (Xs, Xs0 ), 4 inserta (X,Xs0,Ys).?- ordenains ([1,5,3,2,4], R). R = [1, 2, 3, 4, 5]

O por burbuja 1 bubblesort (L,S):- swap (L,L1),!, 2 write (L1),nl, 3 bubblesort (L1,S). 4 bubblesort (S, S). 5 6 swap ([X,Y Ys ],[Y,X Ys ]):- X>Y. 7 swap ([Z Zs ],[Z Zs1 ]):- swap (Zs, Zs1 ).?- bubblesort ([1,5,3,2,4], R). [1, 3, 5, 2, 4] [1, 3, 2, 5, 4] [1, 2, 3, 5, 4] [1, 2, 3, 4, 5] R = [1, 2, 3, 4, 5].

O por una variante de inserción: 1 insertsort ([],[]). 2 insertsort ([X Xs],S):- 3 insertsort (Xs,S1), 4 inserta (X,S1,S).?- insertsort ([1,5,3,2,4], R). R = [1, 2, 3, 4, 5]

O por QuickSort 1 quicksort ([],[]). 2 3 quicksort ([X Xs], Res ) :- 4 split (X,Xs, MasPeques, MasGrandes ), 5 quicksort ( MasPeques, PequesOrd ), 6 quicksort ( MasGrandes, GrandesOrd ), 7 append ( PequesOrd,[X GrandesOrd ], Res ). 8 9 split (_,[],[],[]). 10 split (X,[Y Ys ],[Y Peques ], Grandes ) :- 11 X > Y,!, 12 split (X,Ys, Peques, Grandes ). 13 split (X,[Y Ys], Peques,[Y Grandes ]) :- 14 split (X,Ys, Peques, Grandes ).?- quicksort ([1,5,3,2,4], R). R = [1, 2, 3, 4, 5]

Y podemos compararlos: Tiempo en segundos Algoritmo 100 200 500 Bubble 0.28 2.05 32.33 Insert 0.01 0.04 00.27 QuickSort 0.00 0.00 00.01 msort 0.00 0.00 00.00 Que algoritmo usan sort/2 y msort/2 en SWI-Prolog?

Codificador Supongan que queremos una función para compactar una lista de caracteres: 1 comprime ([],[]). 2 comprime ([X Xs],Ys) :- comp (Xs,X,1, Ys). 3 4 comp ([],C,N,[ cod (C,N)]). 5 comp ([X Xs],X,N,Ys) :- N1 is N+1, 6 comp (Xs,X,N1,Ys). 7 comp ([X Xs],Y,N,[ cod (Y,N) Ys ]):- N\=Y, 8 comp (Xs,X,1, Ys). Su uso es:?- comprime ([1,1,1,1,0,0,0,1,1], Res ). Res = [ cod (1, 4), cod (0, 3), cod (1, 2)]

Sub-término Se puede verificar si un término e sub-término de otro: 1 subtermino (T, T). 2 subtermino (S, T) :- 3 compound (T), 4 functor (T,F, N), 5 subtermino (N,S, T). 6 7 subtermino (N,S, T) :- 8 N >1, N1 is N -1, subtermino (N1,S,T). 9 subtermino (N,S, T) :- 10 arg (N,T, Args ), subtermino (S, Args ).

Corrida subtérmino Ejemplos de consultas:?- subtermino (f(a),g(f(a),b)). true?- subtermino (x,g(f(a),b)). false.?- subtermino (X,g(f(a),b)). X = g(f(a), b) ; X = f(a) ; X = a ; X = b ; false.