En esta sección se incluyen aquellos programas que contienen algoritmos, que por alguna razón de interés, complejidad, velocidad, método, etc., destacan sobre los del resto de programas de LazyTol.com. Por ejemplo, los programas que resuelven problemas, juegos, puzles, etc. que realizan búsquedas, clasificaciones, simulaciones, etc. son los típicos de esta sección.
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.
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.
Una caracteristica particular del programa ChRules.RandRecursive es que, en lenguaje Tol, para la programacion de las funciones como EvalSet(), For(), Select(), Classify(), Sort(), etc. existen 2 formas de hacerlo: a) La primera y mas habitual es declarar el codigo a evaluar dentro del propio parametro de tipo codigo. Esto es, si es por ejemplo, un EvalSet(conjunto, codigo) entonces se programa el codigo, dentro de la propia llamada, como una funcion sin nombre, por ejemplo, como EvalSet(coorRC, Set(Set rc) { ...codigo... }); b) La segunda forma, mucho menos frecuente, es declarar primero la funcion que hay que realizar y, despues, llamar a la funcion que la invoca. Esta forma tiene mucho sentido cuando a la funcion que hay que realizar se la va a invocar desde varias sentencias. De esta forma, por ejemplo, se declara primero las funciones, matchRC(...parametro....) { codigo } o matchWidth(...parametro....) { codigo } y luego se invoca directamente a esa funcion dentro del EvalSet(), por ejemplo, EvalSet(coorRC, matchRC). Esta 2ª forma es mas infrecuente en Time Oriented Programming. A diferencia de otros programas Tol, en ChRules.RandRecursive se emplean ambos estilos de programacion de forma indistinta. Las versiones iniciales de este programa permitieron evaluar las primeras versiones de Tol por lo que, todavia hoy, ChRules.RandRecursive funciona en muchas versiones de Tol como las 1.1.1, 1.1.5, 1.1.6 y 2.0.1. y conserva en su estilo de programacion caracteristicas muy primigenias.
Este programa realiza diversos experimentos sobre el cumplimiento de la Ley de Benford en direrentes areas. Benford.Test consiste en una serie de pruebas que se realizan una tras otra, dependiento de su primera funcion If() de control y contiene algoritmos recursivos para la creacion de secuencias de operaciones basicas y aleatorias. La ley de Benford, tambien conocida como ley del primer digito, enuncia que, en los numeros de la vida real, el primer digito mas frecuente es el 1, luego el 2, luego el 3, ..., luego el 8 y finalmente el menos frecuente es el 9. Esta Ley de Benford parece comprobarse tanto en hechos relacionados con el mundo natural o con el social, por ejemplo, la longitud de rios, los totales de facturas, los precios de acciones, el numero de habitantes de las poblaciones, las distancias estelares, en las cifras resultantes de la realizacion de calculos con otras cifras, etc.
Antes que Frank Benford, Simon Newcomb, astronomo y matematico, en 1881 observo que las primeras paginas de las tablas de logaritmos estaban mas usadas que las finales, de lo que dedujo que los digitos iniciales de los numeros no son equiprobables sino que el 1 era el digito inicial mas frecuente, luego 2 y asi hasta el 9 que es el menos frecuente y establecio una primera aproximacion a la funcion de distribucion de esta probabilidad. Frank Benford, fisico, en 1938 establecio esta funcion de distribucion con mas precision y la comprobo en diferentes dominios. La ley de Benford establece que la primera cifra no nula n (n = 1, 2, 3, 4, ..., 9) ocurre con una probabilidad igual a (Log10(n + 1) - Log10(n)).
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.
Dentro de este programa Constraint.Action, se declaran y manejan diferentes tipos de objetos como son: a) La restriccion, que se define como un conjunto (Set) formado por una condicion y una accion (Code condición, Code acción). Su funcionamiento es: si la condicion no se cumple entonces se aplica la accion asociada la restriccion. Por ejemplo, una restricción puede decir: comprueba que en la base de hechos el valor del hecho A es igual a la suma de los valores de los hechos B y C, si esto no es cierto entonces haz que A valga la suma de los valores de B y C. b) El hecho, que es una estructura (Text nombre, Real valor) que se representa mediante un tipo estructurado (Struct) de conjunto. En el punto anterior A, B y C eran hechos. c) La base de hechos, que es un conjunto de hechos.
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.
Solucionador del juego llamado 3D Squares Puzzle. Resuelve de forma recursiva un puzle de 9 piezas que, a pesar de su aparente sencillez, no es trivial. Encuentra 4 soluciones que, en el fondo, son la misma solucion pero con 1, 2 o 3 rotaciones de 90 grados. Las piezas de este puzle se simulan mediante tiras de 3x3 caracteres cada una y, en vez de codificar el tipo de insecto, se utilizan letras para el color fundamental del insecto, asi por ejemplo, V, verde mayuscula, para la cabeza del saltamontes verde y v, verde minuscula, para el cuerpo del saltamontes verde o A, amarillo mayuscula, para la cabeza del abejorro amarillo y a, amarillo minuscula, para el cuerpo del abejorro amarillo. Todo el codigo fuente de este solucionador esta desarrollado en un unico fichero que consta de varios grupos de funciones: a) funciones basicas, b) fuenciones de piezas, c) funciones de variaciones de piezas (giros) y d) funciones de busqueda de soluciones.
Este solucionador del 3D Squares Puzzle emplea una estrategia de busqueda que poda ramas en base a las restricciones de las piezas. Las restricciones son las siguientes: a) La primera pieza de la esquina superior izquierda no sufre restricciones. b) Para la seleccion segunda y tercera pieza de la linea superior hay que tener en cuenta la restriccion de conincidencia con la pieza mas a su izquierda. c) Para la seleccion segunda y tercera pieza de la columna izquierda hay que tener en cuenta la restriccion de conincidencia con su pieza de encima. d) Las otras 4 piezas no nombradas anteriormente sufren 2 restricciones, la de coincidencia con su pieza superior y la de coincidencia con su pieza mas a la izquierda.
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.
En las Torres de Hanoi a) el primer palo es la torre de partida, b) el último palo es la torre de destino y c) el palo de en medio puede considerarse de intercambio entre la torre de partida y la torre de destino. En el caso general el número de discos puede ser cualquiera, 1 ó 2, que son de solución trivial y 3, 4, 5, 6, 7, 8, ..., N, siendo 8 el número más clásico. Dado un algoritmo de resolución determinado, por ejemplo, el que utiliza TowerHanoi.Recursive o cualquier otro recursivo, el tiempo de resolución crece de forma exponencial con el número de discos. El número de movimientos mínimo a realizar para resolver el problema de la forma recursiva, que es en la que se ha programado TowerHanoi.Recursive, es de 2 elevado al número de discos menos 1. Esto es, para el caso de, por ejemplo, 5 discos es de, (2^5)-1, 31 pasos o 32 estados contando con el estado inicial de partida. Este programa TowerHanoi.Recursive incluye un función de medida de tiempos llamada HnoTime() que permite evaluar este comportamiento exponencial y que retorna una tabla de numero de discos, desde un valor inicial a uno final, y el tiempo en segundos que se ha sido necesario emplear en cada caso de resolución. Este cálculo de tiempos que realiza HnoTime() se hace sin visualizar por pantalla los movimientos para cronometrar, de esta forma, sólo el tiempo de proceso puro.
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.
La idea basica del funcionamiento de ChRules.Iterative 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 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.
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio