Base de reglas con reglas para que un robot salga de un laberinto y areas que son laberintos, no pueden funcionar de manera aleatoria.
Constantes
Set LabA01Set LabA02Set LabA11Set LabOutSet LabRghSet LabOutRghSet LabLftSet LabOutLftSet LabNegSet LabNegOutRghSet LabNegOutLft//////////////////////////////////////////////////////////////////////////////
Set LabA01 =
[["+v--+---------+-+",
"|···|···|·····|·|",
"|·|·|·|·|·+-+···|",
"|·|·|·|·|·|·|·|·|",
"|·|·|·|·|·|·|·|·|",
"|·|·|···|···|·|·|",
"|·+-+·|·+--·+-+·|",
"|·····|·······|·|",
"+-----+-------+S+"]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Laberinto pequeño con un solo robot.",LabA01);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabA02 =
[["+v--+v--+-----+-+",
"|···|···|·····|·|",
"|·|·|·|·|·+-+···|",
"|·|·|·|·|·|·|·|·|",
"|·|·|·|·|·|·|·|·|",
"|·|·|···|···|·|·|",
"|·+-+·|·+--·+-+·|",
"|·····|·······|·|",
"+-----+-------+S+"]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Laberinto pequeño con un solo robot.",LabA02);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabA11 =
[["+v--+---+-----+-+---+---+-----+",
"|···|···|·····················|",
"|·|·|·|·|·+-+·+-+·|·+-+·|·+-+·|",
"|·|·|·|·|·|·|·|·|·|·|·|·|·|·|·|",
"|·|·|·|·|·|·|·|·|·|·|·|·|·|·|·|",
"|·|·|·|·|···|·|·|·|···|·|···|·|",
"|·+-+·|·+--·+-+·|·+--·|·+---+·|",
"|···········|···|·····|·······|",
"|·|·+-+-+---+-+·+-----+·|·+-+·|",
"|·|·|···|·····|·|·····|·|·|·|·|",
"|·|·|·|·|·+-+···|·|·+-+-+-+·|·|",
"|·|·|·|·|·|·|·|·|·|·|·|···|·|·|",
"|·|·|···|·|·|·|···|·|·|·|·|·|·|",
"|···|·|·|···|·|·|·|·|···|···|·|",
"+---+·|·+--·+-+·|·+-+·|·+---+·|",
"|·····|·······|·|·····|·······|",
"+S----+-------+-+-----+-------+"]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Laberinto grande con un solo robot.", LabA11);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabOut = RulGet(
"Sv :- S· ;" + // 01) Encontro la salida a la derecha
"v :- · ," + // 02) Encontro la salida al frente
"S :- S ;" +
"vS :- ·S ;" + // 03) Encontro la salida a la izquierda
"S :- S ," + // 04) Encontro la salida a su espalda
"v :- · ;" +
// ----------
"^S :- ·S ;" + // 05) Encontro la salida a la derecha
"S :- S ," + // 06) Encontro la salida al frente
"^ :- · ;" +
"S^ :- S· ;" + // 07) Encontro la salida a la izquierda
"^ :- · ," + // 08) Encontro la salida a su espalda
"S :- S ;" +
// ----------
"> :- · ," + // 09) Encontro la salida a la derecha
"S :- S ;" +
">S :- ·S ;" + // 10) Encontro la salida al frente
"S :- S ," + // 11) Encontro la salida a la izquierda
"> :- · ;" +
"S> :- S· ;" + // 12) Encontro la salida a su espalda
// ----------
"S :- S ," + // 13) Encontro la salida a su derecha
"< :- · ;" +
"S< :- S· ;" + // 14) Encontro la salida al frente
"< :- · ," + // 15) Encontro la salida a su izquierda
"S :- S ;" +
"<S :- ·S ;"); // 16) Encontro la salida a su espalda
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para encontrar la salida, son independientes del algoritmo que se
emplee, si ve la salida sale.
En el caso de la salida, los algoritmos de la mano derecha o izquierda son
un poco torpes, pues:
- El de la derecha si pasa por la salida, pero no esta a su derecha la
ignora y puede dar una larga vuelta hasta que consigue pasar por la salida
quedando esta a su derecha.
- El de la izquierda si pasa por la salida, pero no esta a su izquierda la
ignora y puede dar una larga vuelta hasta que consigue pasar por la salida
quedando esta a su izquierda.",
LabOut);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabRgh = RulGet(
"·v :- <· ;" + // 01) Encontro un paso a la derecha
"v :- · ," + // 02) Encontro un paso al frente
"· :- v ;" +
"v· :- ·> ;" + // 03) Encontro un paso a la izquierda
"· :- ^ ," + // 04) Encontro un paso a su espalda
"v :- · ;" +
// ----------
"^· :- ·> ;" + // 05) Encontro un paso a la derecha
"· :- ^ ," + // 06) Encontro un paso al frente
"^ :- · ;" +
"·^ :- <· ;" + // 07) Encontro un paso a la izquierda
"^ :- · ," + // 08) Encontro un paso a su espalda
"· :- v ;" +
// ----------
"> :- · ," + // 09) Encontro un paso a la derecha
"· :- v ;" +
">· :- ·> ;" + // 10) Encontro un paso al frente
"· :- ^ ," + // 11) Encontro un paso a su izquierda
"> :- · ;" +
"·> :- <· ;" + // 12) Encontro un paso a su espalda
// ----------
"· :- ^ ," + // 13) Encontro un paso a la derecha
"< :- · ;" +
"·< :- <· ;" + // 14) Encontro un paso al frente
"< :- · ," + // 15) Encontro un paso a su izquierda
"· :- v ;" +
"<· :- ·> ;"); // 16) Encontro un paso a su espalda
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Algoritmo de la mano de derecha, para salir de laberintos, codificado como
reglas de reescritura de areas rectangulares de caracteres.
Es como si el robot llevara su mano derecha pegada siempre a un pared y se
prohibiera a si mismo separarla de la pared.
Notese que hay casos en los que no es capaz de sacar al robot de un recinto
cerrado aun cuando el robot este fuera, pero su mano derecha
pegada al exterior del recinto.",
LabRgh);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabOutRgh = LabOut << LabRgh;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano derecha para encontrar
dicha salida salida.",
LabOutRgh);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabLft = RulGet(
"v· :- ·> ;" + // 03) Encontro un paso a la izquierda
"v :- · ," + // 02) Encontro un paso al frente
"· :- v ;" +
"·v :- <· ;" + // 01) Encontro un paso a la derecha
"· :- ^ ," + // 04) Encontro un paso a su espalda
"v :- · ;" +
// ----------
"·^ :- <· ;" + // 07) Encontro un paso a la izquierda
"· :- ^ ," + // 06) Encontro un paso al frente
"^ :- · ;" +
"^· :- ·> ;" + // 05) Encontro un paso a la derecha
"^ :- · ," + // 08) Encontro un paso a su espalda
"· :- v ;" +
// ----------
"· :- ^ ," + // 11) Encontro un paso a su izquierda
"> :- · ;" +
">· :- ·> ;" + // 10) Encontro un paso al frente
"> :- · ," + // 09) Encontro un paso a la derecha
"· :- v ;" +
"·> :- <· ;" + // 12) Encontro un paso a su espalda
// ----------
"< :- · ," + // 15) Encontro un paso a su izquierda
"· :- v ;" +
"·< :- <· ;" + // 14) Encontro un paso al frente
"· :- ^ ," + // 13) Encontro un paso a la derecha
"< :- · ;" +
"<· :- ·> ;"); // 16) Encontro un paso a su espalda
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Algoritmo de la mano de izquierda, para salir de laberintos, codificado como
reglas de reescritura de areas rectangulares de caracteres.
Es como si el robot llevara su mano izquierda pegada siempre a un pared y se
prohibiera a si mismo separarla de la pared.
Notese que hay casos en los que no es capaz de sacar al robot de un recinto
cerrado aun cuando el robot este fuera, pero su mano izquierda
pegada al exterior del recinto.
Es como el algoritmo de la mano derecha pero con las reglas impares
intercambiadas de 2 en 2, la 1 y la 3, la 5 y la 7, etc.
Las reglas estan numeradas con la misma numeracion que las de la derecha
para que se observe este efecto.",
LabLft);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabOutLft = LabOut << LabLft;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano izquierda para encontrar
dicha salida salida.",
LabOutLft);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabNeg = RulGet(">< :- <> ;" + // 01) Enfrentados -> cambio de direccion
"v :- ^ ," + // 02) Enfrentados -> cambio de direccion
"^ :- v ;");
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Ampliacion de la base de reglas para que cuando 2 robots intentan salir del
mismo laberinto y se enfrentan el uno al otro, se dejen pasar mutuamente,
negocial su solucion al conflicto.
Otra forma de verlo es que cambian de direccion, pues el cuerpo de los
robots al ser identico no permite distinguirlos, en cualquier caso,
no se quedan bloqueados.
Son solo 2 reglas a las que se añaden todas las anteriores mediante
contactenacion de conjuntos.
Estas 2 reglas solventan los 2 conflictos mas basicos, pero no todos.",
LabNeg);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabNegOutRgh = LabNeg << LabOutRgh;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano derecha para encontrar
dicha salida salida.",
LabNegOutRgh);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabNegOutLft = LabNeg << LabOutLft;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano izquierda para encontrar
dicha salida salida.",
LabNegOutLft);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FILE : lab.tol
// AUTHOR : http://www.asolver.com
// PURPOSE : Base de reglas con reglas para que un robot salga de un laberinto
// y areas que son laberintos, no pueden funcionar de manera aleatoria.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// CONSTANTS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabA01 =
[["+v--+---------+-+",
"|···|···|·····|·|",
"|·|·|·|·|·+-+···|",
"|·|·|·|·|·|·|·|·|",
"|·|·|·|·|·|·|·|·|",
"|·|·|···|···|·|·|",
"|·+-+·|·+--·+-+·|",
"|·····|·······|·|",
"+-----+-------+S+"]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Laberinto pequeño con un solo robot.",LabA01);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabA02 =
[["+v--+v--+-----+-+",
"|···|···|·····|·|",
"|·|·|·|·|·+-+···|",
"|·|·|·|·|·|·|·|·|",
"|·|·|·|·|·|·|·|·|",
"|·|·|···|···|·|·|",
"|·+-+·|·+--·+-+·|",
"|·····|·······|·|",
"+-----+-------+S+"]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Laberinto pequeño con un solo robot.",LabA02);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabA11 =
[["+v--+---+-----+-+---+---+-----+",
"|···|···|·····················|",
"|·|·|·|·|·+-+·+-+·|·+-+·|·+-+·|",
"|·|·|·|·|·|·|·|·|·|·|·|·|·|·|·|",
"|·|·|·|·|·|·|·|·|·|·|·|·|·|·|·|",
"|·|·|·|·|···|·|·|·|···|·|···|·|",
"|·+-+·|·+--·+-+·|·+--·|·+---+·|",
"|···········|···|·····|·······|",
"|·|·+-+-+---+-+·+-----+·|·+-+·|",
"|·|·|···|·····|·|·····|·|·|·|·|",
"|·|·|·|·|·+-+···|·|·+-+-+-+·|·|",
"|·|·|·|·|·|·|·|·|·|·|·|···|·|·|",
"|·|·|···|·|·|·|···|·|·|·|·|·|·|",
"|···|·|·|···|·|·|·|·|···|···|·|",
"+---+·|·+--·+-+·|·+-+·|·+---+·|",
"|·····|·······|·|·····|·······|",
"+S----+-------+-+-----+-------+"]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Laberinto grande con un solo robot.", LabA11);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabOut = RulGet(
"Sv :- S· ;" + // 01) Encontro la salida a la derecha
"v :- · ," + // 02) Encontro la salida al frente
"S :- S ;" +
"vS :- ·S ;" + // 03) Encontro la salida a la izquierda
"S :- S ," + // 04) Encontro la salida a su espalda
"v :- · ;" +
// ----------
"^S :- ·S ;" + // 05) Encontro la salida a la derecha
"S :- S ," + // 06) Encontro la salida al frente
"^ :- · ;" +
"S^ :- S· ;" + // 07) Encontro la salida a la izquierda
"^ :- · ," + // 08) Encontro la salida a su espalda
"S :- S ;" +
// ----------
"> :- · ," + // 09) Encontro la salida a la derecha
"S :- S ;" +
">S :- ·S ;" + // 10) Encontro la salida al frente
"S :- S ," + // 11) Encontro la salida a la izquierda
"> :- · ;" +
"S> :- S· ;" + // 12) Encontro la salida a su espalda
// ----------
"S :- S ," + // 13) Encontro la salida a su derecha
"< :- · ;" +
"S< :- S· ;" + // 14) Encontro la salida al frente
"< :- · ," + // 15) Encontro la salida a su izquierda
"S :- S ;" +
"<S :- ·S ;"); // 16) Encontro la salida a su espalda
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para encontrar la salida, son independientes del algoritmo que se
emplee, si ve la salida sale.
En el caso de la salida, los algoritmos de la mano derecha o izquierda son
un poco torpes, pues:
- El de la derecha si pasa por la salida, pero no esta a su derecha la
ignora y puede dar una larga vuelta hasta que consigue pasar por la salida
quedando esta a su derecha.
- El de la izquierda si pasa por la salida, pero no esta a su izquierda la
ignora y puede dar una larga vuelta hasta que consigue pasar por la salida
quedando esta a su izquierda.",
LabOut);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabRgh = RulGet(
"·v :- <· ;" + // 01) Encontro un paso a la derecha
"v :- · ," + // 02) Encontro un paso al frente
"· :- v ;" +
"v· :- ·> ;" + // 03) Encontro un paso a la izquierda
"· :- ^ ," + // 04) Encontro un paso a su espalda
"v :- · ;" +
// ----------
"^· :- ·> ;" + // 05) Encontro un paso a la derecha
"· :- ^ ," + // 06) Encontro un paso al frente
"^ :- · ;" +
"·^ :- <· ;" + // 07) Encontro un paso a la izquierda
"^ :- · ," + // 08) Encontro un paso a su espalda
"· :- v ;" +
// ----------
"> :- · ," + // 09) Encontro un paso a la derecha
"· :- v ;" +
">· :- ·> ;" + // 10) Encontro un paso al frente
"· :- ^ ," + // 11) Encontro un paso a su izquierda
"> :- · ;" +
"·> :- <· ;" + // 12) Encontro un paso a su espalda
// ----------
"· :- ^ ," + // 13) Encontro un paso a la derecha
"< :- · ;" +
"·< :- <· ;" + // 14) Encontro un paso al frente
"< :- · ," + // 15) Encontro un paso a su izquierda
"· :- v ;" +
"<· :- ·> ;"); // 16) Encontro un paso a su espalda
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Algoritmo de la mano de derecha, para salir de laberintos, codificado como
reglas de reescritura de areas rectangulares de caracteres.
Es como si el robot llevara su mano derecha pegada siempre a un pared y se
prohibiera a si mismo separarla de la pared.
Notese que hay casos en los que no es capaz de sacar al robot de un recinto
cerrado aun cuando el robot este fuera, pero su mano derecha
pegada al exterior del recinto.",
LabRgh);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabOutRgh = LabOut << LabRgh;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano derecha para encontrar
dicha salida salida.",
LabOutRgh);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabLft = RulGet(
"v· :- ·> ;" + // 03) Encontro un paso a la izquierda
"v :- · ," + // 02) Encontro un paso al frente
"· :- v ;" +
"·v :- <· ;" + // 01) Encontro un paso a la derecha
"· :- ^ ," + // 04) Encontro un paso a su espalda
"v :- · ;" +
// ----------
"·^ :- <· ;" + // 07) Encontro un paso a la izquierda
"· :- ^ ," + // 06) Encontro un paso al frente
"^ :- · ;" +
"^· :- ·> ;" + // 05) Encontro un paso a la derecha
"^ :- · ," + // 08) Encontro un paso a su espalda
"· :- v ;" +
// ----------
"· :- ^ ," + // 11) Encontro un paso a su izquierda
"> :- · ;" +
">· :- ·> ;" + // 10) Encontro un paso al frente
"> :- · ," + // 09) Encontro un paso a la derecha
"· :- v ;" +
"·> :- <· ;" + // 12) Encontro un paso a su espalda
// ----------
"< :- · ," + // 15) Encontro un paso a su izquierda
"· :- v ;" +
"·< :- <· ;" + // 14) Encontro un paso al frente
"· :- ^ ," + // 13) Encontro un paso a la derecha
"< :- · ;" +
"<· :- ·> ;"); // 16) Encontro un paso a su espalda
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Algoritmo de la mano de izquierda, para salir de laberintos, codificado como
reglas de reescritura de areas rectangulares de caracteres.
Es como si el robot llevara su mano izquierda pegada siempre a un pared y se
prohibiera a si mismo separarla de la pared.
Notese que hay casos en los que no es capaz de sacar al robot de un recinto
cerrado aun cuando el robot este fuera, pero su mano izquierda
pegada al exterior del recinto.
Es como el algoritmo de la mano derecha pero con las reglas impares
intercambiadas de 2 en 2, la 1 y la 3, la 5 y la 7, etc.
Las reglas estan numeradas con la misma numeracion que las de la derecha
para que se observe este efecto.",
LabLft);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabOutLft = LabOut << LabLft;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano izquierda para encontrar
dicha salida salida.",
LabOutLft);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabNeg = RulGet(">< :- <> ;" + // 01) Enfrentados -> cambio de direccion
"v :- ^ ," + // 02) Enfrentados -> cambio de direccion
"^ :- v ;");
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Ampliacion de la base de reglas para que cuando 2 robots intentan salir del
mismo laberinto y se enfrentan el uno al otro, se dejen pasar mutuamente,
negocial su solucion al conflicto.
Otra forma de verlo es que cambian de direccion, pues el cuerpo de los
robots al ser identico no permite distinguirlos, en cualquier caso,
no se quedan bloqueados.
Son solo 2 reglas a las que se añaden todas las anteriores mediante
contactenacion de conjuntos.
Estas 2 reglas solventan los 2 conflictos mas basicos, pero no todos.",
LabNeg);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabNegOutRgh = LabNeg << LabOutRgh;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano derecha para encontrar
dicha salida salida.",
LabNegOutRgh);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set LabNegOutLft = LabNeg << LabOutLft;
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Reglas para tomar la salida y algoritmo de la mano izquierda para encontrar
dicha salida salida.",
LabNegOutLft);
//////////////////////////////////////////////////////////////////////////////
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