Funciones para reglas de caracteres, rules.
Funciones
Set RulGet(Text rulTxt)Set RulRnd(Set rulSet, Real rndRat)//////////////////////////////////////////////////////////////////////////////
Set RulGet(Text rulTxt) // Regla en texto
//////////////////////////////////////////////////////////////////////////////
{
// Tokenizer() separa por un solo caracter, getTok() lo hace por varios pero
// asume que el caracter de control Char(1) no aparece en el texto.
Set getTok(Text t, Text s) { Tokenizer(Replace(t, s, Char(1)), Char(1)) };
Set tok001 = getTok(rulTxt," ;"); // Separar las reglas
// Quedarse con las reglas no vacias
Set tok002 = Select(tok001, Real(Text rul) { Compact(rul)!="" });
// Generar el conjunto de reglas
Set EvalSet(tok002, Set(Text rul)
{
Set linSet = getTok(rul," ,"); // Separar cada linea
// Separara la parte de la accion de la de la condicion
Set parSet = EvalSet(linSet, Set(Text lin) { getTok(lin," :- ") });
// La primera columna son condiciones, la segunda columna acciones, se
// traspone para facilitar el acceso por filas
Set traSet = Traspose(parSet);
Set conSet = traSet[1]; // Los primeros son condiciones
Set accSet = traSet[2]; // Los segundos son condiciones
[[ conSet, accSet ]]
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un cojunto de pares (oldSet, newSet) a partir de un texto que
describe reglas de la forma:
xxx :- yyy , primera linea de la primera regla terminada en ,
xxx :- yyy , segunda linea de la primera regla terminada en ,
xxx :- yyy ; ultima linea de la primera regla terminada en ;
...
zzz :- yyy ,
zzz :- yyy ,
zzz :- yyy ;
El simbolo < :- > de separacion de condicion accion, el < ,> de terminacion
de linea y el simbolo < ;> de terminacion de regla son simbolos reservados
y no pueden aparecer en el interior de los textos.",
RulGet);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set RulRnd(Set rulSet, // Conjunto de reglas
Real rndRat) // Desorden total, parcial u orden de las reglas
//////////////////////////////////////////////////////////////////////////////
{
Case(
rndRat <= 0, rulSet, // Se conserva el orden
rndRat >= 1, SetShuffle(rulSet), // Se desordenar siempre
TRUE, If(Rand(0,1) <= rndRat, SetShuffle(rulSet), rulSet))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dependiendo de rndRat:
- Si 0 las reglas en el mismo orden que recibe.
- Si 1 las reglas siempre desordenadas.
- Si p entre 0 y 1 entonces p veces desordenadas y 1-p veces ordenadas,
esto es,
- cuanto mayor es p mas al azar se comporta,
- cuanto menor es p mas cercano al determinismo se comporta.
Esto permite al motor de reglas funcionar:
a) de forma totalmente derterminista,
b) de forma totalmente aleatoria o
c) de forma parcialmente aleatoria.
Notese que algunos problemas no pueden resolverse si se barajan las reglas
mientras que otros si.
Aunque solo con la 3 parte del Case() se puede programar se ha preferido
dejar claros los 2 casos extremos de 0 y de 1.",
RulRnd);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FILE : rul.tol
// AUTHOR : http://www.asolver.com
// PURPOSE : Funciones para reglas de caracteres, rules.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set RulGet(Text rulTxt) // Regla en texto
//////////////////////////////////////////////////////////////////////////////
{
// Tokenizer() separa por un solo caracter, getTok() lo hace por varios pero
// asume que el caracter de control Char(1) no aparece en el texto.
Set getTok(Text t, Text s) { Tokenizer(Replace(t, s, Char(1)), Char(1)) };
Set tok001 = getTok(rulTxt," ;"); // Separar las reglas
// Quedarse con las reglas no vacias
Set tok002 = Select(tok001, Real(Text rul) { Compact(rul)!="" });
// Generar el conjunto de reglas
Set EvalSet(tok002, Set(Text rul)
{
Set linSet = getTok(rul," ,"); // Separar cada linea
// Separara la parte de la accion de la de la condicion
Set parSet = EvalSet(linSet, Set(Text lin) { getTok(lin," :- ") });
// La primera columna son condiciones, la segunda columna acciones, se
// traspone para facilitar el acceso por filas
Set traSet = Traspose(parSet);
Set conSet = traSet[1]; // Los primeros son condiciones
Set accSet = traSet[2]; // Los segundos son condiciones
[[ conSet, accSet ]]
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un cojunto de pares (oldSet, newSet) a partir de un texto que
describe reglas de la forma:
xxx :- yyy , primera linea de la primera regla terminada en ,
xxx :- yyy , segunda linea de la primera regla terminada en ,
xxx :- yyy ; ultima linea de la primera regla terminada en ;
...
zzz :- yyy ,
zzz :- yyy ,
zzz :- yyy ;
El simbolo < :- > de separacion de condicion accion, el < ,> de terminacion
de linea y el simbolo < ;> de terminacion de regla son simbolos reservados
y no pueden aparecer en el interior de los textos.",
RulGet);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set RulRnd(Set rulSet, // Conjunto de reglas
Real rndRat) // Desorden total, parcial u orden de las reglas
//////////////////////////////////////////////////////////////////////////////
{
Case(
rndRat <= 0, rulSet, // Se conserva el orden
rndRat >= 1, SetShuffle(rulSet), // Se desordenar siempre
TRUE, If(Rand(0,1) <= rndRat, SetShuffle(rulSet), rulSet))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dependiendo de rndRat:
- Si 0 las reglas en el mismo orden que recibe.
- Si 1 las reglas siempre desordenadas.
- Si p entre 0 y 1 entonces p veces desordenadas y 1-p veces ordenadas,
esto es,
- cuanto mayor es p mas al azar se comporta,
- cuanto menor es p mas cercano al determinismo se comporta.
Esto permite al motor de reglas funcionar:
a) de forma totalmente derterminista,
b) de forma totalmente aleatoria o
c) de forma parcialmente aleatoria.
Notese que algunos problemas no pueden resolverse si se barajan las reglas
mientras que otros si.
Aunque solo con la 3 parte del Case() se puede programar se ha preferido
dejar claros los 2 casos extremos de 0 y de 1.",
RulRnd);
//////////////////////////////////////////////////////////////////////////////
ChRules.Iterative programa de aplicacion iterativa de reglas de areas de caracteres
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio