Programas que emplean reglas o restricciones de diferentes tipos, e incluso estructuras que pueden considerarse una mezcla de restricciones y reglas. Usualmente estas reglas y resgtricciones las gestionan como conjuntos, esto es, bases de reglas o sistema de restricciones.
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.
El programa Sfk.Diary es un conversor de textos en Word, que corresponden a anotaciones de actividades para partes de trabajo, con una anotacion por linea, a un formato que se puede pegar en Excel, de forma que cada concepto (empresa, proyecto, dedicacion, fechas, observaciones, etc.) se encaje en su celda correspondiente. El texto se copia de Word al clipboard, a este texto que esta escrito en un lenguaje natural, aunque con ciertas reglas de escritura, este conversor, le da un formato Ascii separador mediantes tabuladores y le añade fórmulas y ambas cosas permite pegarlo en una plantilla Excel de control de trabajos.
El comportamiento de transformacion de este conversor se realiza mediante un conjunto de reglas de reescritura, unas reglas generales y otras reglas son especificas para los diferentes conceptos de las anotaciones. En el fichero Tol cwx.tol pueden consultarse 2 ejemplos de reglas de reescritura de tipo general. Para que el uso de este conversor sea muy rapido la informacion se lee y escribe en el clipboard de forma que se obtiene copiando de Word, se ejecuta este conversor que lee el clipboard y escribe el resultado en el clipboard y se pega dicho resultado en Excel. Si bien ha de hacerse notar que internamente la informacion pasa a traves de ficheros temporales que el usuario no observa.
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.
El metodo recursivo directo de Constraint.Action se basa en un contador de la restriccion actual y los 3 siguientes casos: a) Si no hay mas restricciones que comprobar esta resuelto. b) Si la restriccion actual no se cumple, entonces aplicar la accion y entrar en recursion desde la primera restriccion, el contador a 1. c) Si la restriccion actual se cumple, entonces entrar en recursion con la siguiente restriccion, el contador incrementado en 1, por lo que la combinacion de (b) y (c) producen una recursion muy profunda.
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.
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.
El programa Constraint.Queen realiza 3 funciones principales: a) Resuelve el problema clasico con las 8 reinas en la primera fila como posicion de partida. b) Tambien se autoplantea problemas, generando distribuciones al azar de las 8 reinas en diferentes filas, aunque cada una en su columna, y busca una solucion a partir de esa distribucion al azar de las 8 reinas sobre el tablero de ajedrez. Con ello es capaz de encontrar las 92 posibles soluciones al problema, si bien en la literatura se consideran que son 12 las unicas, pues las 92 se pueden generar mediante rotaciones y simetrias de las 12 unicas. Ha de hacerse notar que desde posiciones al azar no todas las 92 soluciones parecen ocurrir de forma equiprobable, si bien, esto es solo una intuicion producto de la ejecucion reiterada de este solucionador. c) Finalmente, Constraint.Queen, es capaz de generar una traza en lenguaje Javascript, en base a un array de pasos para cada caso resuelto y un array con todos los casos (hasta 92), para que un simulador programado en Javascript pueda reproducir el proceso de resolucion de cada caso desde una posicion al azar. Por lo que el numero de pasos de cada caso depende de la distancia de la posicion inicial al azar a la solucion alcanzable.
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.
Los casos de estudio que incluye ChRules.Iterative son, por ejemplo: a) Automatas celulares con sus reglas de la vida, que pueden funcionar tanto de forma determinista como aletatoria. Este caso incluye un area y 2 bases de reglas. b) Robots en laberintos que encuentran la salida con el algoritmo de la mano derecha o el de la izquierda y que solo se pueden resolver aplicando las reglas de forma determinista, ya que al azar los robots suelen perderse y dar vueltas, aunque tarde o temprano terminarian por encontrar la salida, por casualidad. En este caso se incluyen varios laberintos y varias bases de reglas que se pueden combinar para crear otras. c) Relleno de figuras, que se resuelven bien de forma aleatoria y que tambien funcionan de manera determinista, se incluyen 2 areas y una base de reglas sencilla. d) Partidas de pong, el pingpong electronico, en las que de forma completamente al azar es dificil que los jugadores den mas de 2 toques seguidos sin perder, de forma completamente determinista lo habitual es que los jugadores no fallen nunca si las reglas estan bien definidas (pues las reglas del jugador se definen antes que las reglas del movimiento de la pelota), entrando facilmente en una partida que es un ciclo eterno y con una cierta proporcion de azar, por ejemplo, 0.15 o 0.20, en los que las partidas simulan ser mas reales con varios toques consecutivos pero sin hacerse eternas. e) Una simulacion de un sistema de sedimentacion, orden parcial, mediante un metodo similar al metodo de ordenacion llamado de la burbuja.
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio