<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>0012-7353</journal-id>
<journal-title><![CDATA[DYNA]]></journal-title>
<abbrev-journal-title><![CDATA[Dyna rev.fac.nac.minas]]></abbrev-journal-title>
<issn>0012-7353</issn>
<publisher>
<publisher-name><![CDATA[Universidad Nacional de Colombia]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S0012-73532008000100016</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[LA ABSTRACCIÓN DE DATOS Y SU PROCESO GRADUAL DE CONSTRUCCIÓN]]></article-title>
<article-title xml:lang="en"><![CDATA[THE GRADUAL PROCESS OF DATA ABSTRACTION]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[MORENO]]></surname>
<given-names><![CDATA[FRANCISCO]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[ECHEVERRI]]></surname>
<given-names><![CDATA[JAIME]]></given-names>
</name>
<xref ref-type="aff" rid="A02"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[FLÓREZ]]></surname>
<given-names><![CDATA[ROBERTO]]></given-names>
</name>
<xref ref-type="aff" rid="A03"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Universidad Nacional Sede Medellín Departamento de Ingeniería de Sistemas e Informática ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<aff id="A02">
<institution><![CDATA[,Universidad de Medellín Departamento de Ingeniería de Sistemas ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<aff id="A03">
<institution><![CDATA[,Universidad de Antioquia Departamento de Ingeniería de Sistemas ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>03</month>
<year>2008</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>03</month>
<year>2008</year>
</pub-date>
<volume>75</volume>
<numero>154</numero>
<fpage>167</fpage>
<lpage>177</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_arttext&amp;pid=S0012-73532008000100016&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_abstract&amp;pid=S0012-73532008000100016&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_pdf&amp;pid=S0012-73532008000100016&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[En este artículo se presenta el proceso gradual de construcción de tipos abstractos de datos (TADs), como los Fraccionarios y los Polinomios, a partir de TADs esenciales, como los Lógicos y los Enteros. Se propone un conjunto de categorías funcionales para clasificar las funciones de un TAD. Las funciones se especifican mediante programación funcional, es decir, no se utilizan construcciones estructuradas como la asignación, la secuencia y los ciclos. Hasta ahora no se encuentra reportada la especificación de funciones con programación funcional para la simplificación en el TAD de los Enteros ni para la suma ordenada en el TAD de los polinomios. Además se muestra la relación inherente entre las funciones de un TAD y la sobrecarga de operadores.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[In this paper we present the gradual process of building abstract data types (ADTs), such as Fractions and Polynomials. They are built from basic ADTs, such as Booleans and Integers. We propose a set of functional categories in order to classify ADT functions. These functions are stated in functional programming, that is without using variable assignment, sequence, or loops. Functions stated in this way to accomplish the simplification task of an Integer and to get an ordered sum for a Polynomial are not reported in literature so far. We also point to the inherent relation between ADT functions and operator overloading.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[Tipos abstractos de datos]]></kwd>
<kwd lng="es"><![CDATA[programación orientada a objetos]]></kwd>
<kwd lng="es"><![CDATA[programación funcional]]></kwd>
<kwd lng="es"><![CDATA[encapsulamiento]]></kwd>
<kwd lng="es"><![CDATA[sobrecarga de operadores]]></kwd>
<kwd lng="en"><![CDATA[Abstract data types]]></kwd>
<kwd lng="en"><![CDATA[object oriented programing]]></kwd>
<kwd lng="en"><![CDATA[functional programming]]></kwd>
<kwd lng="en"><![CDATA[encapsulation]]></kwd>
<kwd lng="en"><![CDATA[operator overloading]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <P align="center"><font size="4" face="Verdana, Arial, Helvetica, sans-serif"><b>LA ABSTRACCIÓN DE DATOS Y SU PROCESO GRADUAL DE CONSTRUCCIÓN </b></font></P>     <p align="center"><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b><i>THE GRADUAL PROCESS OF DATA ABSTRACTION</i></b></font></p>     <p align="center">&nbsp;</p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>FRANCISCO MORENO </b>    <br>   <i>Profesor Departamento de Ingeniería de Sistemas e Informática,   Universidad Nacional Sede Medellín</i></font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>JAIME ECHEVERRI</b>    <br>   <i>Profesor Departamento de Ingeniería de Sistemas, Universidad   de Medellín, <a href="mailto:jaecheverri@udem.edu.co">jaecheverri@udem.edu.co</a></i></font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>ROBERTO       FLÓREZ</b>    <br>     <i>Profesor Departamento de Ingeniería de Sistemas, Universidad   de Antioquia, <a href="mailto:rflorez@udea.edu.co">rflorez@udea.edu.co</a> </i></font></p>     <p align="center">&nbsp;</p>     ]]></body>
<body><![CDATA[<p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Recibido       para revisar Junio 21 de 2007, aceptado Agosto 31 de 2007, versión final  Septiembre 11 de 2007</b></font></p>     <p>&nbsp;</p> <hr>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>RESUMEN: </b>En     este artículo se presenta el  proceso gradual de construcción de tipos abstractos de datos (TADs), como los  Fraccionarios y los Polinomios, a partir de TADs esenciales, como los Lógicos  y los Enteros. Se propone un conjunto de categorías funcionales para clasificar  las funciones de un TAD. Las funciones se especifican mediante programación  funcional, es decir, no se utilizan construcciones estructuradas como la asignación,  la secuencia y los ciclos. Hasta ahora no se encuentra reportada la especificación  de funciones con programación funcional para la simplificación en el TAD de  los Enteros ni para la suma ordenada en el TAD de los polinomios. Además se  muestra la relación inherente entre las funciones de un TAD y la sobrecarga  de operadores.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>PALABRAS CLAVE:</b> Tipos     abstractos de datos, programación orientada a  objetos, programación funcional, encapsulamiento, sobrecarga de operadores.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>ABSTRACT</b>:     In this paper we present the gradual process of building abstract data types     (ADTs), such as Fractions and Polynomials. They are built from basic ADTs,     such as Booleans and Integers. We propose a set of functional categories     in order to classify ADT functions. These functions are stated in functional     programming, that is without using variable assignment, sequence, or loops.     Functions stated in this way to accomplish the simplification task of an     Integer and to get an ordered sum for a Polynomial are not reported in literature     so far. We also point to the inherent relation between ADT functions and  operator overloading.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>KEYWORDS</b>: Abstract data types, object oriented programing,  functional programming, encapsulation, operator overloading.</font></p> <hr>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>1. INTRODUCCIÓN </b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Uno de los temas     de mayor importancia en el desarrollo de software es la definición de tipos abstractos de datos (TADs). Un tipo de datos  es abstracto si está definido por su conjunto de funciones, sin importar la  implementación [1] [2]. Por el contrario,  una implementación selecciona una estructura de datos para representar el TAD  [3].</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Tal definición establece una conexión con la programación  orientada a objetos (POO) con una de sus principales características: el encapsulamiento.  Aunque existe una fuerte analogía entre  los TADs y la POO, ésta añade mecanismos como la herencia, el paso de mensajes  y el polimorfismo [4].</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Una función (o método)     [5] “<i>es un proceso caracterizado  por la acción que se realiza y por una serie de argumentos a través de los  cuales toma información y devuelve resultados</i>”. Un TAD [5] “<i>es el  conjunto de valores que pueden tomar los datos de ese tipo y las funciones  que los manipulan</i>”, es decir, un TAD está constituido por un conjunto  de valores y por un conjunto de métodos. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La especificación formal de un TAD requiere: </font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">un conjunto       de funciones primarias (generadoras o de creación)     que generan todos los posibles valores del TAD. Un TAD es compuesto si sus     valores están constituidos por otros TADs los cuales se llaman TADs componentes     (véase por ejemplo el TAD Fraccionario en la Sección 4). </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">un conjunto       de funciones secundarias que actúan sobre     un conjunto de valores (instancias en POO) de TADs y producen un TAD resultado.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las funciones     secundarias pueden agruparse en categorías  funcionales, de acuerdo al tipo de acción que realizan así: </font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Básicas</b>:       realizan operaciones inherentes al TAD, por ejemplo en el TAD de los Enteros     (véase Sección 3) las funciones aritméticas. </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Simplificación o reducción</b>:       simplifican la representación     de un valor dado de un TAD en otro valor equivalente del TAD. Por ejemplo,     el Fraccionario 9/6 se simplifica a 3/2. Cada TAD posee características que     establecen que reglas de simplificación son válidas.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Selectoras u observadoras</b> [6]:       son aquéllas que     extraen los TADs componentes de un valor de un TAD compuesto, por ejemplo     extraer el numerador (Entero) de un Fraccionario.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparación</b>:       establecen el resultado de comparaciones entre valores de TADs, por ejemplo,     la función de igualdad entre dos Enteros.</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Auxiliares o privadas</b>:       son usadas por otras funciones del TAD y no están orientadas al usuario final. Equivalen a los métodos privados     de la POO. Véase por ejemplo la función Es_Positivo2 de los Enteros en la     Sección 3.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Otras</b>:       son aquéllas que no clasifican en ninguna     de las categorías funcionales anteriores. </font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para cada una     de las funciones secundarias se debe especificar el resultado que se obtiene     de acuerdo a los valores de sus TADs argumentos (parámetros). Estas especificaciones se denominan axiomas. Para su definición  se puede emplear programación estructurada, programación funcional, modelos  abstractos, como el cálculo de predicados, entre otros paradigmas. Incluso  se puede utilizar lenguaje natural [7]. Las funciones primarias no requieren  especificación.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En el desarrollo     de este trabajo se utilizará programación  funcional, la cual carece de asignación y de construcciones estructuradas como  la secuencia y los ciclos. Por lo tanto sólo se puede acudir a la recursión  y a la decisión (construcción <b>If</b> – <b>Else</b>) [8]. Este tipo de programación,  a diferencia de la programación estructurada (imperativa) ofrece estas ventajas:</font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">expresa de       una manera más compacta determinadas funciones,     como las que se tratan acá. </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">es más <i>pura</i> [9]       ya que al no usar asignación (variables)     se libera al programador de los aspectos referentes al manejo de la memoria.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Además las construcciones     estructuradas como la secuencia y los ciclos mientras (While) y para (For)     son <i>azúcar sintáctico</i> ya  que pueden expresarse mediante programación funcional [2]. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A las funciones     se les puede asociar un símbolo para facilitar  y hacer más natural su uso. Por ejemplo, a la función Suma de los Enteros es  natural asociarle el símbolo <b>‘+</b>’. Por lo tanto, en vez de escribir <b>Suma  (Entero1, Entero2)</b>, se escribe <b>Entero1 + Entero2</b>. Se establece entonces  la conexión con la sobrecarga de operadores de la POO. La sobrecarga de operadores  permite asociar a un símbolo diferentes funciones. Tal y como se expresa en  [10] “<i>el punto de la sobrecarga de operadores es proporcionar las mismas  expresiones concisas para TADs</i>”. Por ejemplo, el mismo símbolo <b>‘+</b>’ se  puede asociar a la Suma de Fraccionarios: <b>Fraccionario1 + Fraccionario2</b>.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El artículo se estructura así: en las secciones 2, 3, 4  y 5 se presentan los TADs Lógico, de los Enteros, de los Fraccionarios y de  los Polinomios respectivamente. En la Sección 6 se presentan conclusiones y  trabajos futuros.</font></p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>2. TAD LOGICO: <i>L</i> </b></font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>2.1 Definición    <br> </b>El TAD Lógico o Booleano está constituido por dos valores mutuamente excluyentes: Verdadero y Falso. </font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se   han definido varias operaciones entre valores lógicos, para un listado   amplio véase [11]. Se consideran como operaciones básicas Negación (<b>Not</b>),  Conjunción (<b>And</b>), Disyunción (<b>Or</b>), Implicación y Equivalencia.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>2.2 Funciones</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> /* Función generadora     */    <br>   <b>Crear</b> () ® Lógico    <br>   // Genera un valor Lógico, Verdadero o Falso    <br>   /* Funciones lógicas básicas */    <br>   <b>Negación</b> (Lógico) ® Lógico    ]]></body>
<body><![CDATA[<br>   // Operación Not    <br>   <b>Conjunción</b> (Lógico, Lógico) ® Lógico    <br>   // Operación And     <br>   <b>Disyunción</b> (Lógico, Lógico) ® Lógico    <br>   // Operación Or    <br>   <b>Implicación</b> (Lógico, Lógico) ®   Lógico    <br>   <b>Equivalencia</b> (Lógico, Lógico) ® Lógico <b>2.3 Axiomas</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&quot; <b>x,y</b> Î <b><i>L</i></b>:</font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>• Negacion</b>(x) ::= If x Then Falso     Else Verdadero </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>• Conjuncion</b>(x,y) ::= If x Then y Else Falso</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>• Disyuncion</b>(x,y) ::= If x Then Verdadero Else y</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>• Implicacion</b>(x,y) ::= If x Then     y Else Verdadero</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>• Equivalencia</b>(x,y) ::= If x Then     y Else Negacion(y)</font></li>     </ul> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>2.4 Sobrecarga de operadores    <br> </b>Sean <b>l1, l2 </b>Î<b> <i>L</i></b>. La <a href="#tab01">Tabla 1</a> muestra la sobrecarga de operadores del TAD Lógico. </font>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="tab01"></a>Tabla 1.</b> Sobrecarga   de operadores para el TAD Lógico    <br>   <b>Table 1. </b>Operator overloading of Boolean ADT</font>    <br>   <img src="/img/revistas/dyna/v75n154/a16tab01.gif"></p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>3. TAD DE LOS ENTEROS: <i>E</i></b></font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>3.1 Definición    <br> </b>Los números Enteros son aquéllos cuya parte decimal es  nula. Pueden ser positivos, negativos o el cero. </font><font face="Verdana, Arial, Helvetica, sans-serif">      ]]></body>
<body><![CDATA[<p><font size="2"><b>3.2 Funciones</b></font></p>      <p><font size="2"> /* Funciones generadoras */    <br>      <b>Cero</b>() ®   Entero    <br>   // Genera el Entero 0 (cero)    <br>   <b>Sucesor</b>(Entero) ® Entero    <br>   // Genera el Entero sucesor de un Entero    <br>   <b>Antecesor</b>(Entero)   ® Entero    <br>   // Genera el Entero anterior de un Entero    <br>   /* Funciones aritméticas básicas    */    <br>   <b>Suma</b>(Entero, Entero) ®   Entero    ]]></body>
<body><![CDATA[<br>   <b>Resta</b>(Entero, Entero) ®   Entero    <br>   <b>Multiplicacion</b>(Entero, Entero) ®   Entero    <br>   <b>Division_Entera</b>(Entero, Entero) ®   Entero    <br>   /* Función de simplificación */    <br>   <b>Simplificacion</b>(Entero) ® Entero    <br>   //Véase Sección 3.3    <br>   /* Funciones de comparación */    <br>   <b>Es_Positivo</b>(Entero)   ®   Lógico    <br>   //Dice si un Entero es mayor que cero    <br>   <b>Es_Negativo</b>(Entero)   ®   Lógico    ]]></body>
<body><![CDATA[<br>   //Dice si un Entero es menor que cero    <br>   <b>Es_Cero</b>(Entero) ®   Lógico    <br>   //Dice si un Entero es el cero    <br>   <b>Comparar</b>(Entero, Entero) ®   Entero    <br>   //Véase Sección 3.3    <br>   <b>Igual</b>(Entero, Entero) ®   Lógico    <br>   <b>Mayor</b>(Entero, Entero) ®   Lógico    <br>   <b>Menor</b>(Entero, Entero) ®   Lógico    <br>   <b>Mayor_igual</b>(Entero, Entero) ®   Lógico    <br>   <b>Menor_igual</b>(Entero, Entero) ®   Lógico    ]]></body>
<body><![CDATA[<br>   <b>Diferente</b>(Entero, Entero) ®   Lógico    <br>   <b>Signo</b>(Entero) ®   Entero    <br>   //Véase Sección 3.3    <br>   /* Otras funciones */    <br>   <b>Valor_Absoluto</b>(Entero) ® Entero     <br>   <b>Modulo</b>(Entero, Entero) ®   Entero    <br>   //Retorna el residuo de la división entera    <br>   <b>MCD</b>(Entero, Entero) ®   Entero    <br>   //Máximo común divisor    <br>   <b>MCM</b>(Entero, Entero) ® Entero    ]]></body>
<body><![CDATA[<br>   //Mínimo común múltiplo    <br>   <b>Factorial</b>(Entero)   ®   Entero    <br>   //Factorial de un Entero Positivo    <br>   /* Funciones auxiliares */    <br>   <b>Es_Positivo_Aux</b>(Entero) ® Lógico    <br>   //Auxiliar de la función Es_Positivo    <br>   <b>MCD_Aux</b>(Entero, Entero) ® Entero    <br>   //Auxiliar de la función MCD    <br>   <b>MCM_Aux</b>(Entero, Entero) ®   Entero    <br>   //Auxiliar de la función MCM    ]]></body>
<body><![CDATA[<br>   <b>Existe_Pareja</b>(Entero)   ®Lógico    <br>   //Auxiliar de la función Simplificación    <br>   <b>Eliminar_Pareja</b>(Entero)   ®   Entero    <br>   //Auxiliar de la función simplificación<b>3.3 Observaciones    <br> </b>Sean <b>x</b>, <b>y</b> Î <b><i>E</i></b>. </font></p>      <p><font size="2">1. La función Simplificación reduce un Entero a su mínima expresión (EME). Un   EME está conformado sólo de funciones sucesoras o antecesoras o es el cero. </font></p>      <p><font size="2">Ejemplo: con las funciones generadoras es posible obtener el Entero:</font></p>      <p><font size="2"><b>Sucesor</b>(<b>Antecesor</b>(<b>Sucesor</b>(<b>Sucesor</b>(<b>Antecesor</b>( <b>Cero</b>())))))</font></p>      <p><font size="2">Este Entero es el 1, por lo tanto su EME es: <b>Sucesor</b>(<b>Cero</b>()). </font></p>      <p><font size="2">2. La función <b>Comparar</b>(x, y) se define así: </font></p>      ]]></body>
<body><![CDATA[<p><font size="2"><img src="/img/revistas/dyna/v75n154/a16eq01.gif"></font></p>      <p><font size="2">3. La función <b>Signo</b>(x) se define así:</font></p>      <p><font size="2"><img src="/img/revistas/dyna/v75n154/a16eq02.gif"></font></p>  <font size="2"><b>3.4 Axiomas</b>      <p>&quot; <b>x</b>, <b>y</b> Î <b><i>E</i></b>; <b>x</b> e <b>y</b> no necesariamente   EMEs.</p>  </font></font> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> Suma</b>(x, <b>Sucesor</b>(y)) ::= <b>Sucesor</b>(<b>Suma</b>(x, y))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> Suma</b>(x, <b>Antecesor</b>(y)) ::=<b>Antecesor</b>(<b>Suma</b>(x,     y))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> Suma</b>(x, <b>Cero</b>()) ::= x</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> Resta</b>(x, <b>Sucesor</b>(y)) ::= <b>Antecesor</b>(<b>Resta</b>(x,     y))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> Resta</b> (x, <b>Antecesor</b>(y))     ::= <b>Sucesor</b>(<b>Resta</b>(x, y))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> Resta</b> (x, <b>Cero</b>()) ::= x</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplicacion</b>(x, <b>Sucesor</b>(y)) ::=    <br>     <b>Suma</b>(<b>Multiplicacion</b>(x, y), x)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplicacion</b>(x, <b>Antecesor</b>(y))     ::= <b>Resta</b>(<b>Multiplicacion</b>(x, y), x)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplicacion</b> (x, <b>Cero</b>()) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division_Entera</b>(<b>Cero</b>(), <b>Antecesor</b>(y))     ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division_Entera</b> (<b>Cero</b>(), <b>Sucesor</b>(y))     ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division_Entera</b>(x, <b>Cero</b>()) ::= Error</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division_Entera</b>(<b>Sucesor</b>(x), <b>Sucesor</b>(y)) ::=    <br>     If <b>Mayor_Igual</b>(<b>Sucesor</b>(x), <b>Sucesor</b>(y)) Then    <br>     <b>Sucesor</b>(<b>Division_Entera</b>(<b>Resta</b>(<b>Sucesor</b>(x), <b>Sucesor</b>(y)), <b>Sucesor</b>(y)))    ]]></body>
<body><![CDATA[<br>     Else <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division_Entera</b>(<b>Antecesor</b>(x), <b>Antecesor</b>(y))    <br>     ::= <b>Division_Entera</b>(<b>Valor_Absoluto</b>(    <br>     <b>Antecesor</b>(x)), <b>Valor_Absoluto</b>(<b>Antecesor</b>(y))) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division_Entera</b>(<b>Sucesor</b>(x), <b>Antecesor</b>(y))     ::=    <br>     If <b>Mayor_Igual</b>(<b>Sucesor</b>(x),     V<b>alor_Absoluto</b>(<b>Antecesor</b>(y))) Then    <br>     <b>Antecesor</b>(<b>Division_Entera</b>(<b>Resta</b>(<b>Sucesor</b>(x), <b>Valor_Absoluto</b>(<b>Antecesor</b>(y))), <b>Antecesor</b>(y)))    <br>     Else<b> Cero</b>()    <br>     <b>Division_Entera</b>(<b>Antecesor</b>(x), <b>Sucesor</b>(y))     ::=    <br>     <b>Division_Entera</b>(<b>Valor_Absoluto</b>(<b>Antecesor</b>(x)), <b>Resta</b>(<b>Cero</b>(), <b>Sucesor</b>(y)))</font></li>     ]]></body>
<body><![CDATA[</ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La     función de Simplificación utiliza dos funciones auxiliares:</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">-<b>Existe_Pareja(x):</b> detecta     si en la conformación de un Entero existe  al menos una función Sucesor y al menos una función Antecesor.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">-<b>Eliminar_Pareja(x): </b>elimina     de la conformación de un Entero una función  Sucesor y una función Antecesor.</font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Simplificacion</b>(x) ::= If <b>Existe_Pareja</b>(x)  Then<b> Simplificacion</b>(<b>Eliminar_Pareja</b>(x))    <br>  Else x</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Existe_Pareja</b>(<b>Sucesor</b>(<b>Antecesor</b>(x)))     ::= Verdadero</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Existe_Pareja</b>(<b>Antecesor</b>(<b>Sucesor</b>(x)))     ::= Verdadero</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Existe_Pareja</b>(<b>Antecesor</b>(<b>Antecesor</b>(x)))     ::= <b>Existe_Pareja</b>(<b>Antecesor</b>(x)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Existe_Pareja</b>(<b>Sucesor</b>(<b>Sucesor</b>(x)))     ::= <b>Existe_Pareja</b>(<b>Sucesor</b>(x))</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Existe_Pareja</b>(<b>Sucesor</b>(<b>Cero</b>())) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Existe_Pareja</b>(<b>Antecesor</b>(<b>Cero</b>())) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Existe_Pareja</b>(<b>Cero</b>()) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Eliminar_Pareja</b>(<b>Sucesor</b>(<b>Antecesor</b>(x)) ::= x</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Eliminar_Pareja</b>(<b>Antecesor</b>(<b>Sucesor</b>(x))) ::= x</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Eliminar_Pareja</b>(<b>Antecesor</b>(<b>Antecesor</b>(x)))     ::= <b>Antecesor</b>(<b>Eliminar_Pareja</b>(<b>Antecesor</b>(x))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Eliminar_Pareja</b>(<b>Sucesor</b>(<b>Sucesor</b>(x)))     ::= <b>Sucesor</b>(<b>Eliminar_Pareja</b>(<b>Sucesor</b>(x))</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En [5] no se logra     la simplificación     de un Entero por medio de un axioma, en lugar de ello se establece que <i>implícitamente</i> se deben realizar las  siguientes equivalencias para obtener un EME:</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Sucesor </b>(<b>Antecesor </b>(x)) = x    ]]></body>
<body><![CDATA[<br> <b>Antecesor </b>(<b>Sucesor </b>(x)) = x</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Por ejemplo, si se tiene el Entero: z = <b>Sucesor</b>(<b>Sucesor</b>(<b>Antecesor</b>(<b>Antecesor</b>(<b>Cero</b>()))))</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> La función <b>Simplificacion</b>(z) devuelve <b>Cero</b>()</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El axioma aquí planteado     a diferencia de las equivalencias planteadas en [5] realiza <i>explícitamente</i> la  simplificación de un Entero. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si una función no recibe EMEs, ésta     invoca a otra auxiliar que recibe el Entero simplificado, por ejemplo sea <b>z</b> Î <b><i>E</i></b> no  necesariamente un EME, entonces:</font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Positivo</b>(z) ::= <b>Es_Positivo_Aux</b>( <b>Simplificacion</b>(z))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Positivo_Aux</b>(<b>Cero</b>()) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Positivo_Aux</b>(<b>Sucesor</b>(w))     ::= Verdadero</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Positivo_Aux</b>(<b>Antecesor</b>(w)) ::= Falso </font></li>     </ul>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Donde w es un EME. Por lo tanto para el resto de las funciones se supone que <b>x</b> e <b>y</b> son  EMEs, es decir antes se les aplicó  la función de Simplificación.</font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Negativo</b>(<b>Cero</b>()) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Negativo</b>(<b>Sucesor</b>(x)) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Negativo</b>(<b>Antecesor</b>(x)) ::= Verdadero </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Cero</b>(<b>Cero</b>()) ::= Verdadero</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Cero</b>(<b>Sucesor</b>(x)) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Cero</b>(<b>Antecesor</b>(x)) ::= Falso</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Sucesor</b>(x), <b>Sucesor</b>(y))     ::=    <br>   <b>Comparar</b>(x, y)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Antecesor</b>(x), <b>Antecesor</b>(y))    ]]></body>
<body><![CDATA[<br>     ::= <b>Comparar</b>(x, y)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Sucesor</b>(x), <b>Antecesor</b>(y)) ::=    <br>   <b>Sucesor</b>(<b>Cero</b>()) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Antecesor</b>(x), <b>Sucesor</b>(y)) ::=    <br>   <b>Antecesor</b>(<b>Cero</b>()) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Sucesor</b>(x), <b>Cero</b>()) ::=    <br>   <b>Sucesor</b>(<b>Cero</b>())</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Antecesor</b>(x), <b>Cero</b>())     ::= <b>Antecesor</b>(<b>Cero</b>())</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Cero</b>(), <b>Sucesor</b>(x))     ::= <b>Antecesor</b>(<b>Cero</b>())</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Cero</b>(), <b>Antecesor</b>(x))     ::= <b>Sucesor</b>(<b>Cero</b>())</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(<b>Cero</b>(), <b>Cero</b>())     ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Igual</b>(x, y) ::= <b>Es_Cero</b>(<b>Comparar</b>(x, y)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Mayor</b>(x, y) ::= <b>Es</b>_<b>Positivo</b>(<b>Comparar</b>(x, y)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Menor</b>(x, y) ::= <b>Es</b>_<b>Negativo</b>(<b>Comparar</b>(x, y)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Mayor_Igual</b>(x,   y) ::= ¬ <b>Menor</b>(x, y) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Menor</b>_<b>Igual</b>(x,   y) ::= ¬ <b>Mayor</b>(x, y)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Diferente</b>(x,   y) ::= ¬ <b>Igual</b>(x, y)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Signo</b>(x) ::= <b>Comparar</b>(x, <b>Cero</b>())</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Valor_Absoluto</b>(<b>Cero</b>()) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Valor_Absoluto</b>(<b>Sucesor</b>(x)) ::= <b>Sucesor</b>(x)</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Valor_Absoluto</b>(<b>Antecesor</b>(x))     ::= <b>Sucesor</b>(<b>Valor</b>_<b>Absoluto</b>(x))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Modulo</b>(x, <b>Cero</b>()) ::= Error</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Modulo</b>(<b>Cero</b>(), y) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Modulo</b>(x, y) ::= If <b>Menor</b>(<b>Valor_Absoluto</b>(x), <b>Valor_Absoluto</b>(y))     Then x    <br>     Else <b>Modulo</b>(<b>Resta</b>(<b>Valor_Absoluto</b>(x),    <br>     <b>Valor_Absoluto</b>(y)), y)</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para el MCD de     los Enteros se adopta la siguiente definición [12]: “<i>el  MCD de los enteros </i>b<i> y </i>c<i> es el mayor valor positivo entre sus  divisores comunes</i>”; además: “<i>el MCD está definido para todo par de  enteros </i>b<i>, </i>c<i> excepto si uno de los dos es cero</i>”.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">De acuerdo con lo anterior se define el axioma correspondiente al MCD:</font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>MCD</b>(x, <b>Cero</b>()) ::= Error</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>MCD</b>(<b>Cero</b>(), y) ::= Error</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>MCD</b>(x, y) ::= If <b>Igual</b>(<b>Modulo</b>(x, y), <b>Cero</b>())     Then y Else <b>MCD</b>(y, <b>Modulo</b>(x, y))</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">De manera similar     para obtener el MCM [12] “<i>El menor de los múltiplos comunes  positivos de los enteros b y c recibe el nombre de </i>MCM”. Para calcular  el MCM de dos números naturales a y b se aplica la fórmula <b>MCM</b>(a,  b) = a * b/<b>MCD</b>(a, b) </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Por lo tanto: </font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>MCM</b>(x, y) ::= <b>MCM_Aux</b>(<b>Valor_Absoluto</b>(x), <b>Valor_Absoluto</b>(y))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>MCM_Aux</b>(x, y) ::= <b>Division_Entera</b>(<b>Multiplicacion</b>(x,     y), <b>MCD</b>(x, y))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Factorial</b>(<b>Cero</b>()) ::= <b>Sucesor</b>(<b>Cero</b>())</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Factorial</b>(<b>Sucesor</b>(x)) ::= <b>Multiplicación</b>(<b>Sucesor</b>(x), <b>Factorial</b>(x))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Factorial</b>(<b>Antecesor</b>(x)) ::= Error</font></li>     ]]></body>
<body><![CDATA[</ul> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>3.5 Sobrecarga de operadores    <br> </b>La <a href="#tab02">Tabla 2</a> muestra la sobrecarga del TAD de los Enteros.</font>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="tab02" id="tab02"></a>Tabla 2. </b>Sobrecarga de operadores para el TAD de los Enteros    <br> <b>Table 2.</b> Operator overloading of Integer ADT</font>    <br> <img src="/img/revistas/dyna/v75n154/a16tab02.gif"></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>4. TAD DE LOS FRACCIONARIOS: <i>F</i></b></font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.1 Definición </b></font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Sean <b>n</b>, <b>d</b> Î <b><i>E</i></b>. Un Fraccionario es una pareja <b>(n,   d)</b> donde <b>n</b> es el numerador y <b>d</b> es el denominador. Esta   pareja representa la división (que produce un número real) <b>n/d</b> la  cual se deja indicada.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> Ejemplo: (3, 2) representa 3/2, es decir el real 1,5.</font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.2 Funciones</b></font><font face="Verdana, Arial, Helvetica, sans-serif">     <p><font size="2">/* Función generadora */    ]]></body>
<body><![CDATA[<br>     <b>Crear</b>(Entero, Entero) ® Fraccionario    <br>   // Genera un Fraccionario    <br>   /* Funciones selectoras */    <br>   <b>Num</b>(Fraccionario)   ®   Entero    <br>   // Devuelve el numerador de un Fraccionario    <br>   <b>Den</b>(Fraccionario)   ®   Entero    <br>   // Devuelve el denominador de un Fraccionario    <br>   /* Función de simplificación   */    <br>   <b>Reduccion</b>(Fraccionario)   ®   Fraccionario    <br>   /* Funciones aritméticas básicas */    ]]></body>
<body><![CDATA[<br>   <b>Suma</b>(Fraccionario, Fraccionario) ®   Fraccionario    <br>   <b>Resta</b>(Fraccionario, Fraccionario) ®    <br>   Fraccionario    <br>   <b>Multiplicacion</b>(Fraccionario, Fraccionario) ® Fraccionario    <br>   <b>Division</b>(Fraccionario,   Fraccionario) ® Fraccionario    <br>   /* Funciones de   comparación */    <br>   <b>Comparar</b>(Fraccionario, Fraccionario) ®   Entero    <br>   // Ver observación en la Sección 4.3    <br>   <b>Igual</b>(Fraccionario, Fraccionario) ®   Lógico    <br>   <b>Mayor</b>(Fraccionario, Fraccionario) ®   Lógico    ]]></body>
<body><![CDATA[<br>   <b>Menor</b>(Fraccionario, Fraccionario) ®   Lógico    <br>   <b>Mayor_Igual</b>(Fraccionario, Fraccionario) ®    <br>   Lógico    <br>   <b>Menor_Igual</b>(Fraccionario, Fraccionario) ® Lógico    <br>   <b>Diferente</b>(Fraccionario,   Fraccionario) ®   Lógico    <br>   /* Función auxiliar */    <br>   <b>Comparar_Aux</b>(Fraccionario, Fraccionario) ® Entero    <br>   //Auxiliar para la función Comparar</font></p> <font size="2"><b>4.3 Observaciones </b></font></font> <ol>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La reducción de un Fraccionario consiste en simplificarlo dividiendo (división      entera) tanto el numerador como el denominador entre el <b>MCD</b> de ellos      dos, por ejemplo (9, 6) se convierte en (3, 2) ya que <b>MCD</b>(9, 6) = 3.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La comparación entre dos Fraccionarios es análoga a la comparación de Enteros     (véase la observación 2 de la Sección 3.3).</font></li>      ]]></body>
<body><![CDATA[</ol> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.4 Axiomas    <br> &quot;</b> <b>x, y</b> Î <b><i>F</i></b></font> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Reduccion</b>(p) ::= <b>Crear</b>(<b>Num</b>(p)/<b>MCD</b>(<b>Num</b>(p),    <br>     <b>Den</b>(p)), <b>Den</b>(p)/<b>MCD</b>(<b>Num</b>(p), <b>Den</b>(p)))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Suma</b>(p, q) ::= <b>Reduccion</b>(<b>Crear</b>(<b>Num</b>(p)     * <b>Den</b>(q) + <b>Num</b>(q) * <b>Den</b>(p)), <b>Den</b>(p) * <b>Den</b>(q)))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Resta</b>(p, q) ::= <b>Reduccion</b>(<b>Crear</b>(<b>Num</b>(p)     * <b>Den</b>(q) - <b>Num</b>(q) * <b>Den</b>(p)), <b>Den</b>(p) * <b>Den</b>(q)))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplicacion</b>(p, q) ::= <b>Reduccion</b>(<b>Crear</b>(<b>Num</b>(p)     * <b>Num</b>(q),    <br>   <b>Den</b>(p) * <b>Den</b>(q)))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division</b>(p, q) ::= <b>Reduccion</b>(<b>Crear</b>(<b>Num</b>(p)     *    <br>   <b>Den</b>(q), <b>Den</b>(p) * <b>Num</b>(q)))</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>(p, q) ::= <b>Comparar</b>_<b>Aux</b>(<b>Reduccion</b>(p), <b>Reduccion</b>(q))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Comparar</b>_<b>Aux </b>(p, q) ::= <b>Num</b>(p)     * (<b>MCM</b>(    <br>     <b>Den</b>(p), <b>Den</b>(q))/<b>Den</b>(p))     ~ <b>Num</b>(q) * (<b>MCM</b>(    <br>   <b>Den</b>(p), <b>Den</b>(q))/<b>Den</b>(q))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Igual</b>(p, q) ::= <b>?<sub>0</sub></b>(<b>Comparar</b>(p, q)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Mayor</b>(p, q) ::= <b>?<sub>+</sub></b>(<b>Comparar</b>(p, q)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Menor</b>(p, q) ::= <b>?<sub>-</sub></b>(<b>Comparar</b>(p, q)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Mayor_Igual</b>(p, q) ::= <b>¬</b> <b>Menor</b>(p, q) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Menor_Igual</b>(p, q) ::= <b>¬</b> <b>Mayor</b>(p, q)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Diferente</b>(p, q) ::= <b>¬ Igual</b>(p, q)</font></li>     ]]></body>
<body><![CDATA[</ul> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nótese el uso de la sobrecarga de operadores de los Enteros expuestos en la <a href="#tab02">Tabla 2</a> y el uso del operador ~ (Comparar) de los Enteros. 4.5 Sobrecarga de operadores </font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La <a href="#tab03">Tabla 3</a> muestra la sobrecarga de operadores del TAD de los Fraccionarios.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="tab03" id="tab03"></a>Tabla 3.</b> Sobrecarga de operadores para el TAD de los Fraccionarios    <br> <b>Table 3.</b> Operator overloading of Fraction ADT</font>    <br> <img src="/img/revistas/dyna/v75n154/a16tab03.gif"></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>5. TAD DE LOS POLINOMIOS: <i>P</i></b></font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>5.1 Definición</b>    <br> Un Polinomio es una secuencia de términos de la forma <b>cx<sup>e</sup></b>,  en la cual <b>c</b> es un coeficiente y <b>e</b> es un exponente. Sean <b>c,  e, x </b>Î<b> <i>F</i>,</b> donde x es la variable independiente.</font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se propone que <b>c, e </b>y<b> x </b>Î<b> <i>F</i></b> pero   podrían restringirse  a <b><i>E</i></b>.</font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>5.2 Observaciones    <br> </b>Se presenta un TAD para Polinomios teniendo en cuenta dos alternativas:</font> <ol><li type="a"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">sin       restricciones: los términos pueden estar en cualquier orden y puede     existir más de un término con el mismo exponente,</font></li>   <li type="a"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">con       restricciones (PCR): sólo puede existir un término por exponente y     los términos deben estar ordenados descendentemente por exponente. </font></li>     ]]></body>
<body><![CDATA[</ol>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se comienza con el TAD Polinomio sin restricciones.</font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>5.3 Funciones    <br> </b>/* Funciones generadoras */    <br> <b>Cero</b>() ® <b>Polinomio    <br> </b>// Genera un Polinomio sin términos    <br> <b>Adicionar_Termino</b>(Polinomio, Fraccionario,  Fraccionario) ® Polinomio    <br> // Incluye un término en el Polinomio.    <br> /* Función de simplificación */    <br>  <b>ATS</b>(Polinomio) ® Polinomio    <br> //Agrupa los términos semejantes de un Polinomio, dejando sólo un término  por exponente.    ]]></body>
<body><![CDATA[<br> /* Funiones de comparación */    <br>  <b>Es_Anulable</b>(Polinomio) ® Polinomio    <br> //Dice si un Polinomio se anula o no, véase Sección 5.4    <br> <b>Ordenamiento</b>(Polinomio) ® Polinomio    <br> //Ordena los términos de un Polinomio en forma descendente por exponente    <br> /*  Funciones básicas */    <br>  <b>Suma</b>(Polinomio, Polinomio) ® Polinomio    <br> <b>Resta</b>(Polinomio, Polinomio) ® Polinomio    <br> <b>Multiplica</b>_<b>Ter</b>(Polinomio,  Fraccionario, Fraccionario) ® Polinomio    <br> // Multiplica un Polinomio por un término    ]]></body>
<body><![CDATA[<br>  <b>Multiplicacion</b>(Polinomio,   Polinomio) ® Polinomio    <br>   <b>Division</b>(Polinomio,   Polinomio) ® Polinomio <b>Residuo</b>(Polinomio,  Polinomio) ® Polinomio    <br> //Retorna el Polinomio residuo de la división    <br>  <b>Grado</b>(Polinomio) ® Fraccionario    <br> // Máximo exponente de un Polinomio    <br>  <b>Derivada</b>(Polinomio) ® Polinomio <b> Integral</b>(Polinomio) ® Polinomio     <br> /* Otras Funciones */    <br> <b>Remover</b>(Polinomio, Fraccionario) ® Polinomio //  Elimina de un Polinomio los términos que tengan un exponente dado    <br>  <b>Coeficiente</b>(Polinomio,  Fraccionario) ® Fraccionario    <br> // Retorna la suma de los coeficientes de los términos que tengan un exponente dado<b>5.4 Observaciones    ]]></body>
<body><![CDATA[<br> </b>Un Polinomio es anulable si la suma de todos sus términos es cero, por ejemplo, 3x<sup>2</sup> + 8x<sup>-9 </sup>– 3x<sup>2</sup> – 8x<sup>-9</sup>.<b>5.5 Axiomas</b></font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> p, q</b> Î <b><i>P</i></b>; <b>&quot;   c, d, e, f</b> Î <b><i>F</i></b>. <b>c, d</b> son coeficientes; <b>e, f</b> son  exponentes. </font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>ATS</b>(<b>Cero</b>()) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>ATS</b>(<b>Adicionar</b>_<b>Termino</b>(p, c, e)) ::=    <br>     If <b>?<sub>0</sub></b>(<b>Coeficiente</b>(p,     e) + c) Then <b>ATS</b>(<b>Remover</b>(p, e))    <br>     Else <b>Adicionar</b>_<b>Termino</b>(<b>ATS</b>(<b>Remover</b>(p, e)), c     + <b>Coeficiente</b>(p,     e), e)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Anulable</b> (<b>Cero</b>()) ::= Verdadero</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Es_Anulable</b> (<b>Adicionar_Termino</b>(p, c, e)) ::=    <br>     If <b>?<sub>0</sub></b>(<b>Coeficiente</b>(p,     e)–c) Then <b>Es_Anulable</b>(<b>Remover</b>(p, e))    <br>     Else Falso</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Ordenamiento</b>(Cero()) ::= Cero()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Ordenamiento</b>(<b>Adicionar</b>_<b>Termino</b>(<b>Cero</b>(),     c, e) ::= <b>Adicionar</b>_<b>Termino</b>(<b>Cero</b>(), c, e)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Ordenamiento</b>(p) ::= <b>Adicionar</b>_<b>Termino</b>(<b>Ordenamiento</b>(<b>Remover</b>(p, <b>Grado</b>(p)), <b>Coeficiente</b>(p, <b>Grado</b>(p)), <b>Grado</b>(p))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Suma</b>(<b>Cero</b>(), q) ::= q</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Suma</b>(<b>Adicionar</b>_<b>Termino</b>(p, c, e), q) ::=    <br>   <b>Adicionar</b>_<b>Termino</b>(<b>Suma</b>(p, q), c, e)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Resta</b>(<b>Cero</b>(), q) ::= <b>Multiplica</b>_<b>Ter</b>(q,    <br>   <b>Antecesor</b>(<b>Cero</b>()), <b>Cero</b>())</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Resta</b>(p, <b>Cero</b>()) ::= p</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Resta</b>(p, q) ::= <b>Suma</b>(p, <b>Resta</b>(<b>Cero</b>(), q))</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplica_Ter</b>(<b>Cero</b>(), d, f) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplica_Ter</b>(<b>Adicionar_Termino</b>(p,     c, e), d, f) ::= <b>Adicionar_Termino</b>(<b>Multiplica_Ter</b>(p, d, f),     c * d, e + f)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplicacion</b>(<b>Cero</b>(), q) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Multiplicacion</b>(<b>Adicionar_Termino</b>(p,     c, e), q) ::= <b>Suma</b>(<b>Multiplicacion</b>(p, q),    <br>   <b>Multiplica_Ter</b>(q, c, e)) </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division</b>(p, <b>Cero</b>()) ::= Error</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division</b>(<b>Cero</b>(), q) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Division</b>(p, q) ::= If <b>Grado</b>(p) &gt;= <b>Grado</b>(q) Then    <br>     <b>Adicionar</b>_<b>Termino</b>(<b>Division</b>(<b>Remover</b>(p, <b>Grado</b>(p)),q),<b>División</b>(<b>Coeficiente</b>(p,<b>Grado</b>(p)),    <br>     <b>Coeficiente</b>(q, <b>Grado</b>(q))), <b>Resta</b>(<b>Grado</b>(p),    ]]></body>
<body><![CDATA[<br>   <b>Grado</b>(q))) Else <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Residuo</b>(<b>Cero</b>(), q) ::= q</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Residuo</b>(p, <b>Cero</b>()) ::= Error</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Residuo</b>(p, q) ::= If <b>Grado</b>(p) &gt;= <b>Grado</b>(q) Then    <br>     <b>Residuo</b>(<b>Division</b>(<b>Remover</b>(p, <b>Grado</b>(p)), q),    <br>     <b>División</b>(<b>Coeficiente</b>(p, <b>Grado</b>(p)), <b>Coeficiente</b>(q, <b>Grado</b>(q))),    <br>   <b>Resta</b>(<b>Grado</b>(p), <b>Grado</b>(q))) Else p</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Grado</b>(<b>Cero</b>()) ::= Error</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Grado</b>(<b>Adicionar</b>_<b>Termino</b>(<b>Cero</b>(), c, e)) ::=     e</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Grado</b>(<b>Adicionar</b>_<b>Termino</b>(<b>Adicionar</b>_<b>Termino</b>(p,     c, e), d, f)) ::= If e &gt; f Then    ]]></body>
<body><![CDATA[<br>     <b>Grado</b>(<b>Adicionar</b>_<b>Termino</b>(p, c, e))    <br>     Else <b>Grado</b>(<b>Adicionar</b>_<b>Termino</b>(p, d, f))</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Derivada</b>(<b>Cero</b>()) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Derivada</b>(<b>Adicionar</b>_<b>Termino</b>(p, c, e)) ::= If <b>?<sub>0</sub></b>(e)     Then <b>Derivada</b>(p)    <br>     Else <b>Adicionar</b>_<b>Termino</b>(<b>Derivada</b>(p), c * e, e - 1)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Integral</b>(<b>Cero</b>()) ::= <b>Adicionar</b>_<b>Termino</b>(<b>Cero</b>(),     c, <b>0</b>)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Integral</b>(<b>Adicionar</b>_<b>Termino</b>(p,     c, e)) ::= <b>Adicionar</b>_<b>Termino</b>(<b>Integral</b>(p), c/(e + 1)),     e + 1)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Remover</b>(<b>Cero</b>(), f) ::= <b>Cero</b>()</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Remover</b>(<b>Adicionar</b>_<b>Termino</b>(p, c, e), f) ::=    <br>     If e = f     Then <b>Remover</b>(p, f)    ]]></body>
<body><![CDATA[<br>     Else <b>Adicionar</b>_<b>Termino</b>(<b>Remover</b>(p, f), c, e)</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Coeficiente</b>(<b>Cero</b>(), f) ::= <b>0</b></font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Coeficiente</b>(<b>Adicionar</b>_<b>Termino</b>(p, c, e), f) ::=    <br>     If e     = f Then c + <b>Coeficiente</b>(p,     f)    <br>     Else <b>Coeficiente</b>(p, f)</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las funciones presentadas para polinomios que no son necesariamente PCRs trabajan  igualmente para PCRs, sin embargo algunas pueden ser redefinidas. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Un PCR se puede obtener al aplicar las funciones ATS y Ordenamiento, es decir,  sea <b>p</b> un Polinomio sin restricciones entonces <b>Ordenamiento</b>(<b>ATS</b>(p))  produce un PCR. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Sea <b>r’</b> un PCR representado por <b>Adicionar_Termino</b>(p’,     c, e) donde <b>p’</b> se  refiere al resto del Polinomio de <b>r’</b>, por lo tanto el término de mayor  exponente es el de coeficiente <b>c</b> y exponente <b>e</b>.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los axiomas para las funciones Grado y Suma se redefinen así:</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Sean <b>p’</b>,<b> q’ </b>PCRs.</font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Grado</b>(<b>Cero</b>()) ::= Error</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Grado</b>(<b>Adicionar</b>_<b>Termino</b>(p’,   c, e)) ::= e</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Suma</b>(<b>Cero</b>(),   p’) ::= p’</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Suma</b>(q’, <b>Cero</b>())   ::= q’ </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Suma</b>(<b>Adicionar</b>_<b>Termino</b>(p’,     c, e), <b>Adicionar</b>_<b>Termino</b>(q’, d, f)) ::=</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">If e  &gt; f Then <b>Adicionar</b>_<b>Termino</b>(<b>Suma</b>(p’, <b>Adicionar</b>_<b>Termino</b>(q’,  d, f), c, e))    <br>  Else    <br>  If e &lt; f Then <b>Adicionar</b>_<b>Termino</b>(<b>Suma</b>( <b>Adicionar</b>_<b>Termino</b>(p’,  c, e), q’), d, f)    ]]></body>
<body><![CDATA[<br>  Else    <br>   If <b>?<sub>0</sub></b> (c + d) Then <b>Suma</b>(p, q)Else <b>Adicionar</b>_<b>Termino</b>(<b>Suma</b>(p’, q’), c + d, e)</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El axioma de Suma     produce a su vez un PCR. Este axioma es una solución puramente  funcional a diferencia del propuesto en [13], el cual usa iteración y la estructura  secuencia, como se presenta a continuación. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Sean <b>a, b, c</b> PCRs.     El símbolo <b>:=</b> es el operador de asignación  en este caso.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Begin    <br> c := <b>Cero</b>()    <br> While ¬ <b>Es</b>_<b>Anulable</b>(a) &#1640; ¬ <b>Es_Anulable</b>(b)    <br> Case    <br> <b>Grado</b>(a) &lt; <b>Grado</b>(b):    <br> c := <b>Adicionar_Termino</b>(c, <b>Coeficiente</b>(b, <b>Grado</b>(b), <b>Grado</b>(b))    ]]></body>
<body><![CDATA[<br> b := <b>Remover</b>(b, <b>Grado</b>(b))    <br> <b>Grado</b>(a) = <b>Grado</b>(b):    <br> c := <b>Adicionar</b>_<b>Termino</b>(c, <b>Coeficiente</b>(a, Grado(a))    <br> <b>Coeficiente</b>(b, <b>Grado</b>(b)), <b>Grado</b>(a))    <br> a := <b>Remover</b>(a, <b>Grado</b>(a))    <br> b := <b>Remover</b>(b, <b>Grado</b>(b))    <br> <b>Grado</b>(a) &gt; <b>Grado</b>(b):    <br> a := <b>Adicionar</b>_<b>Termino</b>(c, <b>Coeficiente</b>(a, <b>Grado</b>(a)),    <br> <b>Grado</b>(a))    <br> b := <b>Remover</b>(a, <b>Grado</b>(a))    ]]></body>
<body><![CDATA[<br> End Case    <br> End While    <br> While ¬ <b>Es</b>_<b>Anulable</b>(a)    <br> c := <b>Adicionar</b>_<b>Termino</b>(c, <b>Coeficiente</b>(a, <b>Grado</b>(a)),    <br> <b>Grado</b>(a))    <br> a := <b>Remover</b>(a, <b>Grado</b>(a))    <br> End While    <br> While ¬ <b>Es_Anulable</b>(b)    <br> c := <b>Adicionar</b>_<b>Termino</b>(c, <b>Coeficiente</b>(b, <b>Grado</b>(b)),<b>Grado</b>(b))    <br> b := <b>Remover</b>(b, <b>Grado</b>(b))    ]]></body>
<body><![CDATA[<br> End While    <br> End</font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>5.6 Sobrecarga de Operadores    <br> </b>La <a href="#tab04">Tabla 4</a> muestra la sobrecarga de operadores del TAD de los polinomios.</font>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="tab04"></a>Tabla 4.</b> Sobrecarga de operadores para el TAD de los Polinomios    <br>   <b>Table     4. </b>Operator overloading of Polynomial TAD</font>    <br>     <img src="/img/revistas/dyna/v75n154/a16tab04.gif"></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>6. CONCLUSIONES Y TRABAJOS FUTUROS</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se han especificado     cuatro TADs, cada uno con sus funciones y axiomas correspondientes. Se ha     mostrado como la especificación de un nuevo TAD utiliza otros TADs, lográndose  así un proceso de construcción gradual. Este proceso se ejemplifica en la <a href="#fig01">Figura  1</a>.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig01"></a><img src="/img/revistas/dyna/v75n154/a16fig01.gif">    ]]></body>
<body><![CDATA[<br>   Figura 1.</b> Relación     entre TADs    <br>   <b>Figure 1. </b>Relationship among  ADTs </font></p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">En un trabajo futuro se presentarán otros tads, como los vectores, matrices y los números complejos. También se pretende implementar los tads expuestos en el lenguaje funcional <i>scheme</i>, en el cual a partir de sus funciones primitivas lógicas (and, or, not), add1 y sub1 (las cuales equivalen a las funciones antecesor y sucesor respectivamente) se pueden construir los demás tads para observar su comportamiento. igualmente se podría trabajar con lenguajes como <i>maude</i> [14] y <i>haskell</i> [15] y establecer comparaciones entre las diferentes implementaciones. en [16] se hace una presentación de otros lenguajes similares que se podrían utilizarreferencias </font>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>REFERENCIAS</b></font></p>     <!-- ref --><p>   <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> [1]</b> VAN ROY P., HARDINI S.; Concepts, Techniques, and Models of Computer Programming, The MIT Press, 2004.       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000457&pid=S0012-7353200800010001600001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[2]</b> ABELSON H., SUSSMAN G. J., SUSSMAN J.; Structure and Interpretation of Computer Programs, MIT Press y McGraw-Hill, 1996.       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000458&pid=S0012-7353200800010001600002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[3]</b> AHO A. V., HOPCROFT J. E., ULLMAN J. D.; Data Structures and Algorithms, Addison-Wesley Series in Computer Science and Information Processing, 1983.        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000459&pid=S0012-7353200800010001600003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[4]</b> LOUDENK. C.; Programming Languages: Principles and Practice, PWS-Kent, Boston, Mass., USA , 1993.        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000460&pid=S0012-7353200800010001600004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[5]</b> JOYANES L., ZAHONERO I., FERNÁNDEZ M., SÁNCHEZ L.; Estructura de   Datos: Libro de Problemas, McGraw-Hill, 1999.     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000461&pid=S0012-7353200800010001600005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[6]</b> GULUTZAN P, PELZER T.; SQL-99 Complete Really, R & B Books, 1999.     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000462&pid=S0012-7353200800010001600006&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[7]</b> STUBBS D. F.; Data Structures With Abstract Data Types and Pascal, Brooks/Cole, 1985.       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000463&pid=S0012-7353200800010001600007&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[8]</b> HUDAK P.; Conception, Evolution, and Application of Functional Programming Languages, ACM Computing Surveys 21 (3): 359-411, Septiembre 1989.        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000464&pid=S0012-7353200800010001600008&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[9]</b> SEBESTA R. W.; Concepts of Programming Languages, Addison Wesley, 2005.       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000465&pid=S0012-7353200800010001600009&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[10]</b> DEITEL H, DEITEL P.; Como Programar en C/C++, Prentice Hall, 1994.       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000466&pid=S0012-7353200800010001600010&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[11]</b> KOLMAN B., BUSBY R. C., ROSS S.; Discrete Mathematical Structures, Prentice Hall, 2003.       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000467&pid=S0012-7353200800010001600011&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[12]</b> ZUCKERMAN H, NIVEN I.; Introducción a la Teoría de los Números,   Limusa, 1976.     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000468&pid=S0012-7353200800010001600012&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[13]</b> HOROWITZ E, SAHNI S.; Fundamentals of Data Structures, Computer Science, 1976.       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000469&pid=S0012-7353200800010001600013&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[14]</b> The Maude System. Disponible en: <a href="http://maude.cs.uiuc.edu" target="ventana">http://maude.cs.uiuc.edu</a> [citado 14 de Mayo de 2007]       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000470&pid=S0012-7353200800010001600014&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[15]</b> Haskell. Disponible en: <a href="http://www.haskell.org" target="ventana">http://www.haskell.org</a> [citado 14 de Mayo de 2007]       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000471&pid=S0012-7353200800010001600015&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>   <b>[16]</b> GALÁN F, CAÑETE J.; Métodos Formales Orientados a Objetos, Informe Técnico ETSI, 2000. </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000472&pid=S0012-7353200800010001600016&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> ]]></body><back>
<ref-list>
<ref id="B1">
<label>1</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[VAN ROY]]></surname>
<given-names><![CDATA[P.]]></given-names>
</name>
<name>
<surname><![CDATA[HARDINI]]></surname>
<given-names><![CDATA[S.]]></given-names>
</name>
</person-group>
<source><![CDATA[Concepts, Techniques, and Models of Computer Programming]]></source>
<year>2004</year>
<publisher-name><![CDATA[The MIT Press]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<label>2</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[ABELSON]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
<name>
<surname><![CDATA[SUSSMAN]]></surname>
<given-names><![CDATA[G. J.]]></given-names>
</name>
<name>
<surname><![CDATA[SUSSMAN]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<source><![CDATA[Structure and Interpretation of Computer Programs]]></source>
<year>1996</year>
<publisher-name><![CDATA[MIT Press y McGraw-Hill]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<label>3</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[AHO]]></surname>
<given-names><![CDATA[A. V.]]></given-names>
</name>
<name>
<surname><![CDATA[HOPCROFT]]></surname>
<given-names><![CDATA[J. E.]]></given-names>
</name>
<name>
<surname><![CDATA[ULLMAN]]></surname>
<given-names><![CDATA[J. D.]]></given-names>
</name>
</person-group>
<source><![CDATA[Data Structures and Algorithms, Addison-Wesley Series in Computer Science and Information Processing]]></source>
<year>1983</year>
</nlm-citation>
</ref>
<ref id="B4">
<label>4</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LOUDENK]]></surname>
<given-names><![CDATA[C.]]></given-names>
</name>
</person-group>
<source><![CDATA[Programming Languages: Principles and Practice]]></source>
<year>1993</year>
<publisher-loc><![CDATA[Boston^eMass Mass]]></publisher-loc>
<publisher-name><![CDATA[PWS-Kent]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B5">
<label>5</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[JOYANES]]></surname>
<given-names><![CDATA[L.]]></given-names>
</name>
<name>
<surname><![CDATA[ZAHONERO]]></surname>
<given-names><![CDATA[I.]]></given-names>
</name>
<name>
<surname><![CDATA[FERNÁNDEZ]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
<name>
<surname><![CDATA[SÁNCHEZ]]></surname>
<given-names><![CDATA[L.]]></given-names>
</name>
</person-group>
<source><![CDATA[Estructura de Datos: Libro de Problemas]]></source>
<year>1999</year>
<publisher-name><![CDATA[McGraw-Hill]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B6">
<label>6</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[GULUTZAN]]></surname>
<given-names><![CDATA[P]]></given-names>
</name>
<name>
<surname><![CDATA[PELZER]]></surname>
<given-names><![CDATA[T.]]></given-names>
</name>
</person-group>
<source><![CDATA[SQL-99 Complete Really]]></source>
<year>1999</year>
<publisher-name><![CDATA[R & B Books]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B7">
<label>7</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[STUBBS]]></surname>
<given-names><![CDATA[D. F.]]></given-names>
</name>
</person-group>
<source><![CDATA[Data Structures With Abstract Data Types and Pascal]]></source>
<year>1985</year>
<publisher-name><![CDATA[Brooks/Cole]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B8">
<label>8</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[HUDAK]]></surname>
<given-names><![CDATA[P.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Conception, Evolution, and Application of Functional Programming Languages]]></article-title>
<source><![CDATA[ACM Computing Surveys]]></source>
<year>Sept</year>
<month>ie</month>
<day>mb</day>
<volume>21</volume>
<numero>3</numero>
<issue>3</issue>
<page-range>359-411</page-range></nlm-citation>
</ref>
<ref id="B9">
<label>9</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[SEBESTA]]></surname>
<given-names><![CDATA[R. W.]]></given-names>
</name>
</person-group>
<source><![CDATA[Concepts of Programming Languages]]></source>
<year>2005</year>
<publisher-name><![CDATA[Addison Wesley]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B10">
<label>10</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[DEITEL]]></surname>
<given-names><![CDATA[H]]></given-names>
</name>
<name>
<surname><![CDATA[DEITEL]]></surname>
<given-names><![CDATA[P.]]></given-names>
</name>
</person-group>
<source><![CDATA[Como Programar en C/C++]]></source>
<year>1994</year>
<publisher-name><![CDATA[Prentice Hall]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B11">
<label>11</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[KOLMAN]]></surname>
<given-names><![CDATA[B.]]></given-names>
</name>
<name>
<surname><![CDATA[BUSBY]]></surname>
<given-names><![CDATA[R. C.]]></given-names>
</name>
<name>
<surname><![CDATA[ROSS]]></surname>
<given-names><![CDATA[S.]]></given-names>
</name>
</person-group>
<source><![CDATA[Discrete Mathematical Structures]]></source>
<year>2003</year>
<publisher-name><![CDATA[Prentice Hall]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B12">
<label>12</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[ZUCKERMAN]]></surname>
<given-names><![CDATA[H]]></given-names>
</name>
<name>
<surname><![CDATA[NIVEN]]></surname>
<given-names><![CDATA[I.]]></given-names>
</name>
</person-group>
<source><![CDATA[Introducción a la Teoría de los Números]]></source>
<year>1976</year>
<publisher-name><![CDATA[Limusa]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B13">
<label>13</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[HOROWITZ]]></surname>
<given-names><![CDATA[E]]></given-names>
</name>
<name>
<surname><![CDATA[SAHNI]]></surname>
<given-names><![CDATA[S.]]></given-names>
</name>
</person-group>
<source><![CDATA[Fundamentals of Data Structures]]></source>
<year>1976</year>
<publisher-name><![CDATA[Computer Science]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B14">
<label>14</label><nlm-citation citation-type="">
<source><![CDATA[The Maude System]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B15">
<label>15</label><nlm-citation citation-type="">
<source><![CDATA[Haskell]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B16">
<label>16</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[GALÁN]]></surname>
<given-names><![CDATA[F]]></given-names>
</name>
<name>
<surname><![CDATA[CAÑETE]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<source><![CDATA[Métodos Formales Orientados a Objetos: Informe Técnico ETSI]]></source>
<year>2000</year>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
