4.2 Overall Picture of the SAL During SALTRACE
4.2.2 Spatiotemporal Course of Observations
4.2.2.1 Complete Vertical Information from Airborne and Ground-
En la Secci´on 5.3.2.2 se describieron las facilidades provistas por el proyecto CZT respecto a los ´
arboles de sintaxis abstracta, AST. A trav´es de ellos es posible representar las distintas construcciones del lenguaje de especificaci´on Z como estructuras de objetos Java relacionados entre s´ı. Una carac- ter´ıstica muy importante de las clases e interfaces de las que ´estos objetos son instancias es que ofrecen la posibilidad de agregar nuevas operaciones f´acilmente. Esto se logra a trav´es del patr´on de dise˜no
Visitor.
El patr´on de dise˜no Visitor [32] provee una forma de separar la estructura de un conjunto de objetos de las operaciones que se realizan sobre tales objetos. Esto permite que pueda definirse una
CAP´ITULO 5. DESCRIPCI ´ON DE FASTEST 61
nueva operaci´on sin modificar las clases AST. Para definir una nueva operaci´on, todo lo que se necesita es implementar un visitante en una nueva clase. Por ejemplo, a continuaci´on se presenta el c´odigo de un visitante que permite comprobar si el predicado sobre el que se aplica es una disyunci´on tal que el predicado que se pasa como argumento en el constructor de la clase es igual a uno de sus operandos:
package common.z.czt.visitors;
import net.sourceforge.czt.z.ast.Pred; import net.sourceforge.czt.z.ast.OrPred;
import net.sourceforge.czt.z.visitor.PredVisitor; import net.sourceforge.czt.z.visitor.OrPredVisitor; public class PredInOrVerifier
implements OrPredVisitor<Boolean>, PredVisitor<Boolean>{ private Pred myPred;
public PredInOrVerifier(Pred pred){ myPred = pred;
}
public Boolean visitOrPred(OrPred orPred){ Pred leftPred = orPred.getLeftPred(); Pred rightPred = orPred.getRightPred(); boolean leftResult = false;
boolean rightResult = false; if(leftPred instanceof OrPred)
leftResult = ((OrPred)leftPred).accept(this); else
leftResult = SpecUtils.areEqualTerms(myPred, leftPred); if(leftResult)
return new Boolean(true); if(rightPred instanceof OrPred)
rightResult = ((OrPred)rightPred).accept(this); else
rightResult = SpecUtils.areEqualTerms(myPred, rightPred); return new Boolean(rightResult);
}
public Boolean visitPred(Pred pred){ return new Boolean(false);
CAP´ITULO 5. DESCRIPCI ´ON DE FASTEST 62
} }
El patr´on de dise˜no Visitor est´andar [32] provee un mecanismo de solicitud doble. El conjunto de objetos sobre los que se definen nuevas operaciones deben proveer un m´etodo accept(Visitor v).
Visitores una interfaz que define m´etodos de visita para la clase de cada objeto que puede ser visita- do (comovisitOrPreden el ejemplo anterior). Al invocar el m´etodoacceptde un objeto, pas´andole como argumento un visitante particular, se llama al m´etodo de visita, del visitante, que corresponde a la clase de ese objeto. Esto permite que se definan diferentes implementaciones de la interfaz Visitor para realizar distintas operaciones sobre los objetos.
La desventaja de este enfoque es que es dif´ıcil agregar nuevas clases AST, porque cada nueva clase AST implica que se debe agregar un nuevo m´etodo a la interfaz Visitor, lo que a su vez requiere modificar todas las implementaciones existentes. Como en el proyecto CZT se trabaja con la idea de ir agregando extensiones al lenguaje Z, ellos consideran que es necesario que la adici´on de nuevas clases AST sea una tarea sencilla [31]. Otra desventaja es que cada clase visitante necesita implementar un conjunto fijo de m´etodos, uno para cada clase AST, y hay un n´umero grande de clases AST definidas en CZT. Para solucionar estos inconvenientes, CZT ha trabajado en el desarrollo de variantes del pa- tr´on de dise˜no Visitor est´andar. En particular, elCZT Visitor incorpora las ventajas de los patrones de dise˜no Acyclic Visitor [33] y Default Visitor [34], junto con otras peque˜nas modificaciones. Para m´as informaci´on acerca del patr´on de dise˜no CZT Visitor, referirse a [31].
A continuaci´on se listan los m´odulos que est´an basados en el patr´on de dise˜no CZT Visitor y que permiten realizar una operaci´on sobre todos o algunos de los t´erminos que pueden formar parte de un AST.
AndOrPredDistributor Permite aplicar a predicados Z la propiedad distributiva de la conjunci´on respecto a la disyunci´on. Este m´odulo puede ser utilizado para realizar uno de los pasos a trav´es de los cuales se lleva un predicado a Forma Normal Disyuntiva (ver Secci´on3.5.1.2).
AndPredClausesExtractor Permite obtener, de una conjunci´on de predicados, una colecci´on con los predicados que la conforman.
AndPredRemover Permite remover de un predicado que sea una conjunci´on, todas las clausulas iguales a cierto predicado p. p es un predicado que se toma como argumento en el constructor del m´odulo.
ContainsTermVerifier Permite verificar si un t´ermino del lenguaje Z contiene a otro.
CZTReplacer Dados dos t´erminos Z, permite reemplazar en un tercero (al que se aplica el visitante que el m´odulo implemente) todas las ocurrencias del primero por ocurrencias del segundo. El t´ermino original y el que reemplazar´a al original se deben pasar como par´ametros al constructor del m´odulo.
CAP´ITULO 5. DESCRIPCI ´ON DE FASTEST 63
ImpliesPredRemover Permite transformar todos los predicados de la formap1 ⇒p2 en predicados
de la forma¬p1 ∨p2. Este m´odulo puede ser utilizado para realizar uno de los pasos a trav´es de los
cuales se lleva un predicado a Forma Normal Disyuntiva (ver Secci´on 3.5.1.2).
NegPredDistributor Permite aplicar a predicados dados las Leyes de Morgan (¬ (p1 ∨ p2) ⇔ ¬p1∧ ¬p2 y¬(p1∧p2)⇔ ¬p1∨ ¬p2) y la eliminaci´on de la doble negaci´on (¬ ¬p ⇔p). Este m´odulo puede ser utilizado para realizar uno de los pasos a trav´es de los cuales se lleva un predicado a Forma Normal Disyuntiva (ver Secci´on3.5.1.2).
OrPredRemover Permite remover de un predicado que sea una conjunci´on, todas las clausulas que sean disyunciones tales que alguno de los operandos que las conforman sea igual a cierto predicado p que se toma como argumento en el constructor del m´odulo.
ParamExtractor Permite, dado un t´ermino del lenguaje Z, obtener una lista con sus par´ametros. Por ejemplo, al t´ermino a =b lo conforman a yb.
PredInOrVerifier Permite determinar si el predicado al que se le aplica la funcionalidad es una disyunci´on donde uno de sus operandos es el predicado que se pasa al constructor del m´odulo. PredRemover Permite remover de un predicado, que est´e en Forma Normal Disyuntiva, todos los literales que contengan la ocurrencia de alguno de los nombres de variables contenidos en la lista que el constructor del m´odulo toma como argumento.
PrimeVarsMaker Permite primar todas las variables (es decir, concatenarles el caracter 0) en la expresi´on o esquema Z visitado.
WordsFinder Permite determinar si alguna de las variables contenidas en la lista de nombres de variables dada (que se pasa como argumento al constructor de este m´odulo) ocurre en la expresi´on o esquema Z visitado.