Programas Generate & Test


Save this PDF as:
 WORD  PNG  TXT  JPG

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Programas Generate & Test"

Transcripción

1 Programas Generate & Test Son básicamente programas que generan soluciones candidatas que se evalúan para comprobar si son o no correctas En algunas ocasiones es más sencillo comprobar si algo es una solución a un problema que crear la solución a dicho problema Consisten en dividir la resolución de problemas en dos partes: Generar soluciones candidatas Testear que las soluciones sean correctas Son programas con la siguiente estructura: Una serie de objetivos generan posibles soluciones vía backtracking Otros objetivos comprueban si dichas soluciones son las apropiadas

2 Programas Generate & Test: : Ejemplo 1 Ordenación de listas ordenacion(x,y) Y es la lista resultante de ordenar la lista X de forma ascendente La lista Y contiene, en orden ascendente, los mismos elementos que la lista X La lista Y es una permutación de la lista X con los elementos en orden ascendente? ordenacion([2,1,2,3], L). L = [1,2,2,3] ordenacion(x,y) : permutacion(x,y), (1) Generador: se obtiene una permutación de X en Y que pasa al objetivo (2) para comprobar si Y está ordenada ordenada_ascendente(y). (2) Prueba: comprueba si la lista está ordenada. Si no lo está, el backtracking se encarga de re-satisfacer el objetivo (1 ) buscando una nueva permutación

3 Programas Generate & Test: : Ejemplo 2 El problema de las N reinas: colocar N reinas en un tablero de ajedrez de manera que las reinas no se ataquen unas a otras No puede haber dos reinas en la misma línea (horizontal, vertical o diagonal) reinas(n,tablero) reinas(n,tablero) es cierto si Tablero es una solución al problema de las N reinas. Las soluciones se representan como una permutación de la lista de números entre 1 y N: el primer elemento es la fila en la que se sitúa la reina de la primera columna, el segundo la fila de la reina de la segunda columna, y así sucesivamente. [2,4,1,3]

4 Programas Generate & Test: : Ejemplo 2 reinas(n,tablero) : range(1,n,l), permutation(l,tablero), safe(tablero). Crea la lista de números entre 1 y N Crea una permutación de la lista Comprueba si la permutación es solución al problema safe([]). safe([q Qs]) : safe(qs), not (attack(q,qs)). attack(x,xs) : attack(x,1,xs). attack(x,n,[y Ys]) : X is Y+N; X is Y N. attack(x,n,[y Ys]) : N1 is N+1, attack(x,n1,ys). Esta solución es ineficiente: se generan muchas permutaciones que no pueden ser solución Una solución más eficiente consiste en aplicar la técnica de los acumuladores

5 Técnica de los Acumuladores (I) Ejemplo: Inversa de una lista reverse(xs,ys): Ys es la lista que se obtiene al invertir los elementos de la lista Xs reverse([],[]). reverse([x Xs],Ys) : reverse(xs,zs), append(zs,[x],ys). reverse/2 es ineficiente reverse(xs,ys) : reverse(xs,[],ys). reverse([],ys,ys). reverse([x Xs],Acc,Ys) : reverse(xs,[x Acc],Ys). Otra opción (reverse/2) usando acumuladores

6 Técnica de los Acumuladores (II) Acumuladores: son argumentos adicionales usados en los predicados para almacenar resultados intermedios se usan para simular algoritmos iterativos son variables lógicas y su valor se pasa entre iteraciones Ejemplo 1: Factorial factorial(n,f) : factorial(0,n,1,f). factorial(n,n,f,f). factorial(i,n,t,f) : I < N, I1 is I+1, T1 is T*I1, factorial(i1,n,t1,f). Este programa lógico simula el comportamiento de un programa iterativo con bucle while (de 0 a N) El primer argumento en factorial/4 es el contador del bucle El tercer argumento en factorial/4 es el acumulador de los productos calculados

7 Técnica de los Acumuladores (III) Ejemplo 2: Otra versión de Factorial factorial(n,f) : factorial(n,1,f). factorial(0,f,f). factorial(n,t,f) : N > 0, T1 is T*N, N1 is N 1, factorial(n1,t1,f). Versión iterativa de factorial desde N hasta 0 (bucle while) El segundo argumento en factorial/3 actúa como acumulador de los productos calculados La versión 2 es más eficiente que la versión 1 Normalmente, cuantos menos argumentos tiene un predicado, más rápido y más entendible es

8 Ejercicio: Generate & Test Definir el predicado numeroparmenor/2 que es verdadero cuando X es un numero par menor que N? numeroparmenor(x,5). X=0; X=2; X=4? numeroparmenor(2,4). Yes? numeroparmenor(3,5). No? numeroparmenor(10,7). No

9 Ejercicio: Generate & Test Estrategia: generar todos los números entre 0 y N y comprobar si son pares numparmenor(x,n) : entre(0,n,x), par(x). par(x) : 0 is X mod 2. entre es el encargado de generar todos los números menores que N par actúa como filtro