Programas con algoritmos recursivos o iterativos, o de ambos tipos o de uno de ellos existiendo, además, su versión del otro tipo.
A continuación se expone un breve resumen de cada uno de los progamas y, en cada programa, pulsando sobre el botón azul con flecha, a la derecha del título, se accede a su código completo.
Programa de ejemplo de solucion de sistemas de restricciones del tipo (restriccion, accion correctora) programados de 3 formas diferentes a) por evaluacion iterativa, b) por recursion pura y c) por 2 funciones recursivas donde la primera se apoya en la segunda. De los 3 metodos es el iterativo el que puede resolver problemas con un mayor numero de pasos, el segundo con mas capacidad es el de 2 funciones recursivas (birecursivo) y el recursivo puro puede producir un desbordamiento de la pila cuando el numero de pasos (acciones y pruebas de restricciones) aumenta. Es un programa desarrollado en un solo fichero Tol en el que se declaran todas las funciones para hechos, restricciones, base de hechos y sus 3 formas de resolucion. En el metodo iterativo, la memoria entre las iteraciones, se implementa con un fichero interno de datos en formato Bst. Es una version basica de programacion con restricciones para uso formativo formativo donde: a) cada restriccion indica su solucion correctora, b) los hechos tienen como valor un solo numero y c) no existe un dominio para los valores de los hechos. Por ello puede resolver algunos problemas basicos de restricciones, en principio, sin circularidad en las restricciones, pero tiene problemas al resolver sistemas de restricciones mas complejos, si bien puede ser generalizable.
Con el metodo iterativo de Constraint.Action, el paso básico de comprobacion de la condicion asociada a una restriccion y aplicacion, en su caso, de la accion es el siguiente: a) Sea count el contador de restricciones que indica la restriccion que hay que comprobar. b) Sea initBase el estado actual de la base de hechos (memoria de trabajo) leida del fichero en formato Bst. c) Si la restriccion que indica count no se cumple, entonces hay que aplicar la accion de transformacion asociada a dicha restricción y volver a comprobar el conjunto de restricciones desde el principio (esto se hace volviendo a inicializar a 1 la variable de control del numero de restricciones, esto es, count:=1). Notese que el lenguaje Tol es un lenguaje de tipo declarativo donde la declaración de variables se realiza mediante el operador =, esto es que actuan como constantes, solo en algunos casos se utiliza el operador de resaignacion del valor :=, por ejemplo, esto suele suceder en las variables que controlan ciclos de iteracion While(), pero no suele ser necesario en los ciclos For() y EvalSet(). d) Si la restricción que indica la variable count se cumple, entonces no hay que cambiar la base de hechos y se debera proceder a comprobar la siguiente restriccion (esto se hace incrementando la variable de control de las restricciones comprobadas hasta ese momento, count:=count+1). e) Cuando hay algun cambio en la base de hechos se guarda en el fichero Bst el contenido de la base de hechos para que el cambio quede reflejado en la siguiente iteracion.
ChRules.RandRecursive es un programa de aplicacion de reglas de reescritura que: a) aplica a un area rectangular de caracteres, b) reglas de transformacion de areas rectangulares de caracteres y c) que juntas forman una base de reglas de transformacion del contenido de ese area con un cierto objetivo. Las reglas de ChRules.RandRecursive son del tipo [condicion, accion], esto es: a) si se cumple la condicion b) entonces se aplica la accion de transformacion. Tanto la parte de la condicion como la de la accion son 2 rectangulos de caracteres, en principio de identicas dimensiones, por ejemplo de 2x3 caracteres, de 1x2 caracteres, 3x5 caracteres, etc. La parte inicial del nombre del programa, ChRules, proviene de estas caracteristicas, Ch de Ch(aracters) y Rules de reglas, esto es, que se podrian llamar reglas de caracteres. La idea basica del funcionamiento es la siguiente: a) si en el estado actual del area de caracteres existe algun subarea rectangular con el mismo contenido que la parte de condicion de una regla, b) entonces dicha regla es aplicable y de aplicarse el subarea rectangular del area de caracteres que coincide con la condicion es sobreescrita, conservando la forma, con el area rectangular de caracteres de la accion de la regla. Por tanto, estas reglas de rectangulos de caracteres que utiliza el programa ChRules.RandRecursive pueden considerarse como reglas de reescritura, pero, a diferencia de otras reglas de reescritura, en vez de trabajar con secuencias de caracteres trabajan con areas rectangulares de caracteres.
El programa ChRules.RandRecursive tiene 2 particularidades que le definen y que forman parte de su nombre, RandRecursive, que son: a) El ciclo del motor de comprobacion y aplicacion de reglas es recursivo. b) Tanto la aplicacion de reglas como la seleccion de subareas donde aplicar la regla son escogidas al azar. La aplicacion al azar de las reglas significa que: a) Si en un determinado ciclo de evaluacion y con un determinado estado del area rectangular de caracteres son aplicables varias de las reglas de la base de reglas por conincidir su parte de condicion, al menos, con un subarea del area, se elige y se aplica al azar una de esas reglas. b) A su vez, al aplicar una regla, si su parte de condicion realiza match con mas de un subarea rectangular del area de caracteres, entonces se elige un subarea al azar y es sobre ese subarea sobre la que se aplica la transformacion. Esto implica una doble aleatoriedad en reglas y subareas de aplicacion lo que hace que cada uno de los casos de ejemplo que se incluyen en este programa y a los que se aplica el motor de reglas de ChRules.RandRecursive puede evolucionar, en cada ejecucion, de una manera muy diferente.
Solucionador del juego de las 8 reinas en un tablero de ajedrez como un sistema de restricciones con 3 componentes: a) restriccion que hay que cumplir, que es condicion logica, b) accion, que es una funcion correctora, c) reaccion, que es una funcion de backtrack frente a ciclos. Es un solucionador, programado de forma iterativa, desarrollado en un solo fichero Tol en el que se declaran: a) todas las funciones para las reinas, b) para sus restricciones de no estar ni en la misma fila ni en diagonal y c) que asume como punto de partida que cada reina esta en una columna diferente a las otras. Este metodo iterativo que: a) para guardar memoria del estado en curso utiliza la reasignacion := de Tol y b) ademas tiene una variable de memoria de texto, ver seccion blackboard, que conserva todos los estados del proceso de solucion. La memoria (QueMemory) permite detectar ciclos y ademas generar una traza para que un simulador Javascript reproduzca visualmente el proceso de resolucion en Tol. El contenido de la memoria a partir de un estado inicial INI podria ser el siguiente 11111111INIT| 12111111A2:2| 13111111A2:3| 13211111A3:2|... 13524111R6:1|... como resultado de aplicar acciones (A) y reacciones (R) que mueven una reina a una fila, por ejemplo, A2:3, es la accion de mover la reina 2 a la fila 3. Esta comprobado el funcionamiento de Constraint.Queen para las versiones de Tol 1.1.5, 1.1.6 y 2.0.1, pero funciona con la version 1.1.1. Una posible razon son los 5 usos de la reasignacion := que se realizadan en este programa Tol cuando lo usual, y recomendable, es ninguno.
Constraint.Queen es una version basica de programacion con restricciones, casi para uso formativo formativo, donde: a) Cada restriccion logica tiene una funcion correctora, que es siempre del mismo estilo, que consiste en que la reina que no cumple la restriccion avance un paso, esto es que suba a su fila superior. b) Los hechos son para cada reina son su posicion de fila y columna, si bien la columna no cambia en todo el proceso de resolucion. c) El dominio de los valores, de las posiciones 1 a 8, esta subsumido en la funcion que avanza a las reinas de fila 1 :- 2, 2 :- 3,..., 7 :- 8 y 8 :- 1. d) La restriccion, ademas de su accion correctora, incluye una funcion llamada de reaccion, que se ejecuta solo cuando se detecta que de aplicar la accion se entraria en un ciclo que se detecta porque se guarda memoria de todos los pasos dados en el proceso de resolucion. Notese que no es habitual encontrar este tipo de restricciones que incluyan una funcion correctora (accion) y una funcion equiparable a un backtrack (reaccion) como las que implementa el programa Constraint.Queen. Dentro de esta programacion se denomina reina esclava, slave queen, a la reina restringida por la condicion logica y reinas maestras, masters queen, a las que restringen. Para facilitar la declaracion de las restricciones cada reinas esclava es restringida por todas las que están a su izquierda, esto es, por sus reinas maestras.
TowerHanoi.Recursive es un programa que resuelve de forma recursiva el problema conocido como de las Torres de Hanoi. Este problema se utiliza a menudo en programación para poner en práctica la programación recursiva como sucede en el presente caso. Este programa se estructura en base a un fichero principal make.tol que contiene tanto la definicion de las variables como las funciones de resolución y funciones auxiliares, siendo la función principal de resolución HnoSolve(). El funcionamiento de este programa se ha probado para las versiones de Tol 1.1.1, 1.1.5, 1.1.6 y 2.0.1.
Las Torres de Hanoi, en su forma más clásica, es un juego de se basa en 8 discos, todos de diferente radio, que se pueden apilar insertándose en 1 de los 3 palos verticales que están clavados en una tabla horizontal. Estos 3 palos con sus discos insertados, forman 3 torres de discos que son las que dan nombre al juego. Partiendo de una posición inicial, con los 8 discos insertados en el primer palo y ordenados por tamaños, de abajo hacia arriba de mayor a menor radio, esto es, con el disco más grande en la base y el más pequeño en la cima, el objetivo de juego es pasar todos los discos al tercer palo de forma que queden en el mismo orden que estaban en el primero, ordenados de abajo hacia arriba de mayor a menor radio, pero para hacerlo hay que seguir las 3 siguientes reglas: a) En cada acción sólo se puede mover un solo disco. b) Cada disco sólo puede ponerse sobre otro de mayor radio, esto es, sobre otro disco más grande, de esta manera las torres siempre tienen forma piramidal. c) Sólo pueden moverse los discos que estén en la cima del palo en el que estén insertados.
ChRules.Iterative es un programa iterativo de aplicacion de reglas de reescritura que: a) aplica a un area rectangular de caracteres, b) reglas de transformacion de areas rectangulares de caracteres y c) que juntas forman una base de reglas de transformacion del contenido de ese area para alcanzar un cierto objetivo, como por ejemplo, solucionar un problema Las reglas de ChRules.Iterative son del tipo [condicion, accion], esto es: a) si se cumple la condicion, el rectangulo condicion de la regla equipara con alguna subarea del area de trabajo b) entonces se aplica la accion de transformacion cambiando el contenido de la antigua subarea del area de trabajo por el nuevo rectangulo que proporciona la parte de la accion de la regla.
Esta version del programa ChRules.Iterative tiene 3 particularidades que la definen: a) El ciclo del motor de comprobacion y aplicacion de reglas es iterativo. b) La seleccion de la subarea donde aplicar la regla es determinista. c) Pero en la seleccion de las reglas que hay aplicar se pueden programar 3 metodos distintos. Estos 3 metodos de seleccion de reglas son: c1) Seleccion completamente al azar. c2) Seleccion determinista siguiendo el mismo orden en el que se han definido las reglas de reescritura (cada regla prevalece sobre sus reglas sucesoras). c3) Seleccion segun un parametro rndCtr entre 0 y 1 segun el cual en rndCtr casos la seleccion es al azar y en el otro 1-rndCtr de los casos la seleccion es determinista, segun el orden de declaracion de las reglas.
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio