Curso de Filosofía elemental (23)

XXV
 
La ley moral
 
 
 
127. LA LEY COMO EXPRESIÓN DE LA NORMA MORAL
 
   Hemos determinado ya qué son actos morales y quién es el sujeto de los mismos; hemos averiguado también cuál es el fin último objetivo y subjetivo del hombre. Debemos ahora preguntarnos cuál será el camino a través del cual ese sujeto moral (el hombre) podrá dirigirse a ese fin supremo (Dios) mediante su actuación moral. En otras palabras: ¿A qué debe conformar sus actos para alcanzar su fin? ¿Cuál ha de ser la norma de moralidad que los guíe y oriente moralmente?
   Llamamos norma de moralidad a la regla o medida mediante la cual el sujeto pueda reconocer sus actos como buenos o malos, según que se conformen o no con ella.
   La norma de moralidad es doble: objetiva y subjetiva. Es norma objetiva de moralidad la ley moral; es decir, la ordenación preceptiva que rige sobre la actuación del hombre en relación con sus distintos fines dentro del orden general de la creación. Es norma subjetiva la conciencia moral del hombre, luz del alma, donde está como impresa la ley moral, y mediante la cual se aplica ésta a los distintos casos o circunstancias de la vida moral.
 
 
128. CONCEPTO DE LA LEY EN GENERAL. LA LEY EN LA NATURALEZA, EN NOSOTROS MISMOS, EN LAS RELACIONES HUMANAS
 
   La ley es definida por SANTO TOMÁS como <<una cierta ordenación de la razón encaminada al bien común, promulgada por aquel que está al frente de la comunidad>> (<<Ordinatio rationis ad bonum commune ab eo, qui curam communitatis habet, promulgata.>>) Esta significación amplísima de la ley comprende también a los seres irracionales en cuanto sometidos al orden general del Cosmos, que es la comunidad de todos los seres bajo la ordenación de Dios. En este sentido hablamos de leyes físicas, mecánicas o químicas. Pero sólo cuando se aplica a los seres racionales la ley se llama propiamente moral, siendo su efecto propio la obligación.
   Al decir ordenación de la razón se entiende que la ley es fundamentalmente un producto de la razón. Pues ordenar los medios hacia el fin es labor racional. Distinguimos así la ley de una orden caprichosa o absurda. Al decir encaminada a bien común distinguimos la ley de la disposición arbitraria e injusta, y también del mero precepto. Mientras el mero precepto es una orden que sólo mantiene su vigor mientras vive y lo sostiene aquel que lo ha mandado en orden a un caso o circunstancias muy concretas, extinguiéndose al cesar estas condiciones (por ejemplo, la orden del señor a su criado de despertarle a las nueve de la mañana), la ley mantiene su estabilidad aunque el legislador muera, como exige la estabilidad a la cual regula.
   Al decir promulgada queremos decir manifiesta, hecha pública; ninguna ley puede cumplirse si no es de alguna manera manifestda por el que está al frente de la comunidad. Pues la ley es una regla por la cual los súbditos se mueven hacia un fin que ha de ser manifestado a éstos o promulgado. Al decir, en fin, por aquel que tiene el cuidado (o está al frente) de la comunidad, significamos que la ley ha de proceder de la autoriad legítima que rige la comunidad de seres de que se trate.
   Se divide la ley en ley eterna (de toda la naturaleza), ley natural o ley moral (en nosotros mismos) y ley positiva (en las relaciones humanas).
 
 
129. LA LEY ETERNA
 
   La ley eterna es la misma razón o entendimiento divino, en tanto que estatuye reglas universales para el gobierno del mundo. Su efecto es el orden que preside el Cosmos, al cual obedecen de forma diversa todos los seres animados e inanimados, desde los astros en su movimientos hasta el hombre. La ley eterna implica el acto de la voluntad divina por el cual se crea el mundo conforme a esta ley. Según la clásica definición de SAN AGUSTÍN, la ley eterna es: <<Ratio vel voluntas Dei ordinem naturalem conservari jubens, perturbari vetans>> (la razón o la voluntad de Dios mandando observar el orden natural y prohibiendo perturbarlo).
 
 
130. LA LEY NATURAL
 
   Llámase ley natural a la participación de la ley eterna en la criatura racional (participatio legis aeternae in rationali creatua, según Santo Tomás). Es decir, la misma ley divina que, referente al Universo en general se llama ley eterna, recibe el nombre de ley natural en la parte que regula a la criatura racional.
   La ley natural es ya propiamente moral por dirigirse a seres racionales y libres capaces físicamente de cumplirla o violarla, a diferencia de la parte de la ley eterna referente a las criaturas no humanas, que se cumple necesariamente, sea ciegamente por la naturaleza inerte, sea instintiva o determinadamente por los animales.
   La ley natural, como parte de la eterna, es también divina; es decir, procedente de Dios como legislador. Como toda ley, ha sido promulgada o dada a conocer a aquellos seres (conscientes y libres) a quienes va dirigida. La ley natural, sin embargo, no se halla escrita o transmitida verbalmente en formulaciones concretas. Su misma amplitud y generalidad haría imposible esta formulación. Se encuentra, en cambio, impresa en la conciencia de todos los hombres, por modo tal que aun el hombre más rudo o ignorante sabe espontáneamente por su conciencia de la bondad o malicia de los actos que realiza. La formulación más completa y perfecta de los conceptos básicos de la ley moral natural es el Decálogo, dado por el mismo Dios a Moisés.
   Hay escuelas filosóficas que no admiten la existencia de una ley natural o ley divina reflejada en la naturaleza humana. Entre ellas, el positivismo y, en general, las escuelas empiristas. Para ellas sólo existen en el hombre inclinaciones más o menos persistentes a obrar en un sentido, pero variables con los tiempos y los países. La única ley efetiva y real para estas escuelas es la ley positiva humana.
   Sin embargo, la existencia de la ley natural se hace patente en la constante y universal aceptación por parte de los hombres de ciertas normas y principios que, aunque desviados u oscurecidos en ocasiones, no dejan de presidir sus vidas en todo tiempo y lugar. Por otra parte, hombres que no respetan y procuran eludir la ley positiva de su país o ambiente, acatan, sin embargo, en su conducta normas de honestidad o lealtad que consideran válidas por sí mismas, inviolables.
 
   Son propiedades de la ley natural:
   a) Su universalidad: la ley tiene un ámbito universal no sólo por razón de su origen, que es Dios, y de su fundamento, que es la naturaleza racional, común a todos los hombres, sino también por razón de su promulgación: los preceptos más generales de la ley natural son patentes a todos los hombres por estar impresos en la conciencia moral humana.
   b) Su inmutabilidad: la ley moral natural es inalterable, tanto considerada intrínseca como extrínsecamente. Una ley cambia intrínsecamente cuando por sí misma viene a resultar inútil o nociva. Cambia extrínsecamente cuando llega a ser levantada, total o parcialmente, por la autoridad de quien procede. Ninguno de estos modos de cambio afectan a la ley natural.
 
 
131. LA LEY POSITIVA HUMANA
 
   La ley natural no es suficiente, muy a menudo, para regular en concreto la vida de los hombres, tanto social como individual, por consistir en principios muy generales que requieren ser adaptados a la vida concreta. La ley natural contiene muchos casos, pero de un modo indeterminado. Prescribe, por ejemplo, que los delitos deben ser penados por la autoridad, pero no determina la pena ni el procedimiento de juzgarlos.
   La ley positiva, que promulga el gobernante humano para la comunidad o el grupo de hombres que rige, viene a ser así un desarrollo o concreción de la ley natural. Es de ley natural, por ejemplo, que en una sociedad cualquiera reciban asistencia los desvalidos, ancianos, etc. Este precepto se cumple, sin embargo, de diverso modo en los distintos países y épocas: en unos, por ejemplo, mediante instituciones de beneficiencia que se sostienen de contribuciones generales; en otros, a través de seguros sociales mediante descuentos en los salarios: son dos concreciones diversas, igualmente legítimas, de una sola ley natural.
   La ley positiva puede ser eclesiástica o civil, según que rija una sociedad humana de fines sobrenaturales (como es la Iglesia) o una sociedad de fines naturales (sociedad civil).
   Para que la ley positiv obligue en conciencia debe reunir tres condiciones, faltando alguna de las cuales perde su obligatoriedad: ha de ser honesta, es decir, que no repugne a una ley más alta, natural o positiva; justa, es decir, que tienda al bien común, que es su verdadero fin, y posible, esto es, que pueda cumplirse física y moralmente.
   Estas y otras condiciones que debe reunir la ley positiva fueron ya señaladas por SAN ISIDRO DE SEVILLA en la siguiente sentencia de sus Etimologías: Erit autem lex honesta, justa, possibilis, secundum naturam, secundum consuetudinem patriae, loco temporique conveniens, necessaria, utilis, manifesta quoque, ne aliquid propter obscuritatem in captione contineat, nullo privato commodo, sed pro communi uilitate civium scripta.
 
 
 
XXVI
 
La conciencia moral
 
 
132. LA CONCIENCIA MORAL COMO NORMA SUBJETIVA DE MORALIDAD
 
   En lenguaje vulgar llamamos conciencia a la conciencia moral por la cual nos damos cuenta de la bondad o malicia de nuestros actos o intenciones. Así, cuando decimos de alguien que <<no tiene conciencia>> o que <<nos remuerde la conciencia>>. También en el lenguaje común usamos un término más amplio —consciencia— para significar el puro <<darse cuenta>> o poseer conocimiento reflexivo de uno mismo y de su actividad psíquica. Así, cuando decimos de alguien que <<está inconsciente>> o de nosotros que <<somos conscientes de lo que sucede>>. En estas expresiones nos referimos a la conciencia psicológica en general, y en la primera, a la conciencia moral, que es aquella parte de la conciencia psicológica que se refiere al obrar, y emite juicios prácticos acerca de la bondad o malicia de los actos humanos.
   Este juicio práctico sobre la honestidad o rectitud de los actos supone establecer una relación entre el objeto del acto y la norma objetiva (o ley) de su moralidad. Esta relación sólo puede establecerla el entendimiento, por lo cual es ésta la facultad que actúa en la conciencia, o, más exactamente, el entendimiento práctico o referido a la acción.
   La conciencia moral puede ser antecedente o consecuente, según que juzgue los actos futuros acticipadamente o los pasados retrospectivamente.
   Si la ley, como expresión de la voluntad divina, es la norma objetiva de moralidad, la conciencia o acto del entendimiento que nos informa interiormente de la bondad o malicia de nuestras acciones libres es la norma subjetiva que ha de regular nuestra conducta.
   Los escolásticos distinguían entre la conciencia y un hábito del entendimiento práctico para conocer los primeros y más generales principios de la vida moral al modo como el entendimiento especulativo conoce fácilmente los primeros principios del ser. A este hábito llamaron sindéresis, y reservaron el nombre de conciencia moral a la aplicación de esos principios morales a las situaciones concretas de la vida personal.
 
 
133. FUNCIONES DE LA CONCIENCIA MORAL
 
   Si la conciencia moral es un darse cuenta de los actos que realizamos en su relación con las máximas y principios morales, esta iluminación seguirá los tres momentos del desarrollo temporal en que la acción se realiza: presente, pasado y futuro.
   Con respecto a nuestro presente activo, la conciencia testifica la realidad moral del acto que realizamos y la intención buena o mala que en nosotros lo presidió. Con respecto al futuro, la acción por realizar, la conciencia nos liga u obliga, es decir, nos ata en razón de la norma o ley moral, instigándonos a su realización o retrayéndonos de ella. En relación con el pasado, en fin, la conciencia juzga el valor moral de lo hecho, excusándonos o remordiéndonos. En frase de Santo Tomás, los cometidos de la conciencia moral se resumen de este modo: Dicitur enim conscientia testificari, ligare vel instigare, vel etiam accusare, vel etiam remordere sive reprehendere.
 
 
134. SITUACIONES DE LA CONCIENCIA MORAL
 
   Los juicios de la conciencia, como actos que son de un entendimiento humano personal, no siempre expresan con pleno rigor y lucidez los dictados de la ley moral aplicados a una situación concreta. Este carácter psicológico e individual de la conciencia determina en ella una diversidad de estados o situaciones posibls en su relación con la verdad, en su claridad interior y en su habituación.
 
   1º. Por razón de la conformidad del juicio con el verdadero valor moral del acto, la conciencia se divide en recta y errónea. Esta última se divide, a su vez, en invencible y en venciblemente errónea. En la invenciblemente errónea, el sujeto deduce su juicio de principios falsos que él tiene por verdaderos, y que, por la situación intelectual o en el ambiente en que se encuentra, no puede dejar de tener por tales. En la segunda, el sujeto podría rectificar su juicio examinando con prudencia los principios de que parte a la luz de su razón o de sus conocimientos.
   2º. En razón de la firmeza o seguridad con que el sujeto asiente al dictado de su conciencia, puede ésta ser cierta o dudosa. En la primera se da en él una adhesión plena, sin temor a errar (lo que no supone que tal conciencia sea de suyo recta o verdadera). En la segunda, el sujeto carece de esa seguridad, vacila. Dentro de ella caben dos estados: la conciencia perpleja y la probable. En la primera, el sujeto no puede decidirse por ninguno de los términos de su duda, sea porque carezca de razón alguna en favor de uno sobre los otros, sea porque las razones se contrapesan. En la probable, en cambio, el sujeto, sin dedar de dudar (sin estar cierto), se inclina por uno de los términos de su disyuntiva por ver en él mayores probabilidades de acierto moral. También la conciencia dudosa puede serlo vencible o invenciblemente, según que el sujeto pueda o no salir de ella.
   3º. Por razón del hábito creado en la conciencia personal por su práctica de juzgar moralmente, cabe distinguir la conciencia laxa, la rigurosa y la escrupulosa. La primera se produce en algunos sujetos por una atrofia de su ejercicio en aplicar las normas morales a los casos prácticos de su propia conducta o de la ajena. La conciencia laxa llega a no advertir el mal en los actos morales o a advertirlo sólo cuando alcanza grados extremos de gravedad. Conciencia rigurosa es aquella que traduce con la debida exactitud y prudencia las leyes morales a la conducta personal. Conciencia escrupulosa es, en fin, la que por un hábito hipertrofiado de juzgar escudriña en el sentido de los actos y en las intenciones hasta dudar siempre de su licitud moral. Tanto la conciencia laxa como la escrupulosa se producen por una falta de prudencia, que es la virtud reguladora del entendimiento, que debe mantenerlo en un recto término medio y en una tensión interior alejada por igual del exceso y del defecto.
 
 
135. FORMACIÓN DE LA CONCIENCIA. CAUSÍSTICA MORAL*
 
   El estudio de los distintos estados y situaciones en que puede encontrarse la conciencia nos conduce a la fijación de varias normas a las quedebe atenerse ésta al emitir sus juicios prácticos sobre el obrar moral. Ellas pueden contribuir a que el sujeto forme su conciencia o, al menos, un criterio firme de valoración moral, ya que la resolución del caso concreto es siempre asunto personal, intransferible, que no puede reducirse a un sistema de fórmus de validez general. Hay personas de conciencia, de recto y claro criterio moral, a las que suele acudirse en busca de consejo, y que, a veces, no poseen grandes conocimientos éticos ni de ningún otro género; y existen también hombres cultos y versados en estas cuestiones que carecen de sensibilidad y criterio para dilucidar el caso concreto, porque no han llegado a formar su conciencia en la práctica y en la habituación.
   Entre estas reglas de enjuiciamiento moral, útiles para la formación de la conciencia, señalamos las siguientes:
 
   1ª. Es obligatorio seguir el dictamen de la conciencia cierta tanto si es recta como si es invenciblemente errónea, dado que son indiscenibles para el sujeto.
   2ª. No obra rectamente el que sigue el dictado de la conciencia venciblemente errónea, puesto que ésta nace de una negligencia del sujeto para examinar lo que debe o para asesorarse sobre ello.
   3ª. Existe disparidad entre las diversas escuelas morales sobre la regla general válida en caso de conciencia invenciblemente dudosa. En una situación en que el sujeto dude la licitud de una acción o de la opción entre varios partidos, y la urgencia del caso le impida asesorarse o, habiéndolo hecho, persista la duda, ¿puede actuar o debe inhibir la acción? En el caso de una disyunción, ¿qué partido ha de tomar? La escuela moral llamada tuciorismo (de tutus, seguro) contesta: no es lícito actuar si no se está seguro de la licitud del acto; debe inhibirse la acción siempre que exista duda. Esta escuela, la más rigurosa, carece hoy prácticamente de seguidores. Otra escuela, el probabiliorismo (de probabilior, más probable) responde que en caso de duda invencible se puede actuar en el sentido de la mayor probabilidad. Otra, en fin, el probabilismo, estima lícita la acción en cualesquiera de las direcciones probables (probables en conciencia, naturalmente), aun cuando haya alguna más probable en la opinión del sujeto Este parecer, el más tolerante de todos, niega licitud a la acción en tales condiciones cuando se trata de casos graves para la salvación del alma o para los intereses esenciales de una persona, exigiendo como moral en tales casos el partido de la mayor probabilidad.
Anuncios

Fundamentos de programación con Módula-2 (7)

 

Tema 3
Constantes y Variables
 
 
Este tema complementa el anterior con nuevos elementos que permiten construir programas algo más realistas.
 
Primeramente se indica el interés que tiene dar nombre a las constantes que se manejan en los programas. A continuación se introduce el concepto de variable. Este concepto es muy importante y una gran parte del tema está organizada en torno a él. De hecho la existencia de variables constituye el elemento diferenciador del paradigma de la programación imperativa respecto a los demás.
 
El tema se completa con la presentación de varias sentencias de lectura simple. Estas sentencias permiten programas en los que se pueden introducir valores de entrada durante su ejecución.
 
 
3.1 Identificadores
 
La manera de hacer referencia a los diferentes elementos que intervienen en un programa es darles un nombre particular a cada uno. En programación se llaman identificadores a los nombres usados para identificar cada elemento del programa.
 
En el tema anterior ya se han utilizado identificadores para dar nombre a elementos tales como los tipos de datos, las operaciones de escritura, etc., que se suministran ya con un significado determinado. Igualmente se han inventado identificadores para nombrar los primeros programas (EscribirHola, SumaNumeros, etc.).
 
En Modula-2 los identificadores son una palabra formada con caracteres alfabéticos o numéricos seguidos, sin espacios en blanco ni signos de puntuación intercalados, y que debe comenzar por una letra. Pueden usarse las 52 letras mayúsculas y minúsculas del alfabeto inglés, y los dígitos decimales de 0 al 9.
 
Ejemplos de identificadores válidos son los siguientes:
 
         Indice         DiaDelMes         NombreApellido
         j5               Eje3                IdentificadorMuyyyyyyyLargo
 
No serían válidos los siguientes identificadores:
 
        3Eje             No puede comenzar por un dígito
        #50$            No se pueden usar los caracteres: # y $
        Dia Del Mes    No se pueden intercalar blancos
        Año              No se puede utilizar la letra ñ
 
Es importante resaltar que las letras ñ o Ñ o las vocales acentuadas no están incluidas en el alfabeto e la mayoría de los lenguajes de programación, y por supuesto tampoco en Modula-2, por lo que no pueden formar parte de ningún identificador. Sin embargo, ambas letras sí pueden ser utilizadas como valores de tipo CHAR o formando parte de una ristra.
 
Modula-2 distingue las letras mayúsculas de las minúsculas. Así, son identificadores distintos los siguientes:
 
         DiaSemana           Diasemana            DIASEMANA
 
En general, se debe tener cuidado al utilizar identificadores que difieran en pocas letras y en particular en el uso de las letras mayúsculas o minúsculas para distinguir identificadores diferentes. En estos casos, es difícil distinguir entre un cambio de alguna letra por error y una utilización correcta de identificadores distintos.
 
Las reglas exactas que determinan la formación de identificadores son las siguientes:
 
Identificador ::= letra { letra | dígito }
 
letra ::= A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
 
dígito ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
 
 
3.2 El vocabulario de Modula-2
 
Si examinamos los ejemplos de programas presentados hasta el momento veremos que en ellos aparecen bastantes palabras que cumplen con las reglas de formación de identificadores. En realidad no todas las palabras que forman parte de un programa en Modula-2 son identificadores, aunque se formen de la misma manera. Hay que distinguir ciertas palabras reservadas o palabras clave que tienen un significado invariable dentro del lenguaje y que no pueden ser utilizadas nunca como identificadores en un programa. Entre ellas se encuentran algunas que ya han sido utilizadas en los ejemplos anteriores.
 
Las palabras clave sirven para delimitar determinadas construcciones del lenguaje de programación, tales como un programa completo (MODULE, BEGIN, END) o una lista de elementos importados (FROM, IMPORT).
 
Todas las palabras clave de Modula-2 están definidas en mayúsculas. La lista completa de ellas es la siguiente:
 
       AND                    ARRAY                    BEGIN
       BY                      CASE                      CONST
       DEFINITION           DIV                        DO
       ELSE                   ELSIF                     END
       EXIT                   EXPORT                   FOR
       FROM                  IF                          IMPLEMENTATION
       IMPORT               IN                          LOOP
       MOD                   MODULE                   NOT
       OF                      OR                         POINTER
       PROCEDURE          QUALIFIED               RECORD
       REPEAT               RETURN                   SET
       THEN                  TO                         TYPE
       UNTIL                  VAR                       WHILE
       WHIT
 
En general, los identificadores utilizados en un programa han de ser declarados o definidos antes de utilizarlos. Una forma de declararlos es importarlos de algún módulo donde ya estén definidos, como se ha hecho en los primeros ejemplos.
 
Sin embargo en Modula-2 existen elementos de uso tan frecuente que se ha considerado conveniente tenerlos disponibles en cualquier programa sin necesidad de declararlos explícitamente. Para ello el compilador reconoce una serie de identificadores predefinidos para nombrar los tipos de valores básicos, algunas funciones de utilidad, etc. Algunos de estos identificadores (INTEGER, REAL, TRUNC, MAX, …) ya han sido introducidos en el tema anterior, aunque sin precisar que se trataba de identificadores predefinidos. La lista completa de identificadores predefinidos en Modula-2 es la siguiente:
 
       ABS                  BITSET                BOOLEAN
       CAP                  CARDINAL            CHAR
       CHR                  DEC                    EXCL
       FALSE               FLOAT                 HALT
       HIGH                 INC                     INCL
       INTEGER            LONGINT              LONGREAL
       MAX                  MIN                    NIL
       ODD                  ORD                    PROC
       REAL                 SIZE                   TRUE
       TRUNC               VAL
 
Esta lista contiene los identificadores que el compilador reconoce por si mismo. Obsérvese que en ella no aparecen, por ejemplo, los nombres de las operaciones de escritura, que están definidos en los correspondientes módulos estándar y que han de ser importados explícitamente si se quiere hacer uso de ellos.
 
Aunque los identificadores de esta lista estén totalmente en mayúsculas, como las palabras clave, no hay que confundirlos con ellas. Los identificadores predefinidos no son palabras reservadas, sino que el programador puede, si lo desea, definirlos por su cuenta con otro significado diferente del habitual. Al hacerlo así pierde automáticamente la posibilidad de usarlos con el significado predefinido. Además, esta redefinición causaría cierta confusión en otros programadores que lean el programa, ya que no tendrán su significado habitual. Por estas razones no es aconsejable usar esta facilidad de redefinición, a menos que resulte realmente ventajosa en determinadas aplicaciones.
 
 
3.3 Constantes
 
Primeramente se introduce el concepto de constante y a continuación se explica como se manejan las constantes en Modula-2.
 
3.3.1 Concepto de constante
Una constante es un valor fijo que se utiliza en un programa. El valor debe ser siempre el mismo para cualquier ejecución del programa, es decir, el valor no puede cambiar de una ejecución a otra. Son ejemplos de constantes el número de meses del año, el número de días de una semana, las constantes matemáticas tales como el número pi, los factores de conversión de unidades físicas de medida, etc.
 
Hasta el momento se ha visto la manera de representar valores constantes en un programa escribiéndolos explícitamente, en forma de constantes literales, como se las denomina en programación. Otra posibilidad es definir estos valores como constantes simbólicas o constantes con nombre.
 
3.3.2 Declaración de constantes con nombre
La declaración de un valor constante con nombre consiste en asociar un identificador a dicho valor constante. Si queremos declarar el valor de la constante (pi) asociada al nombre Pi escribiremos:
 
            CONST Pi = 3.14159265;
 
La declaración se inicia con la palabra clave CONST, y a continuación se escribe el nombre simbólico de la constante, seguido del signo igual y el valor asociado.
 
Una vez definida la constante se puede utilizar su nombre exactamente igual que si fuera su valor explícito. Por ejemplo, serán equivalentes las expresiones siguientes:
 
        2.0*3.14159265*R                       2.0*Pi*R
 
Las constantes simbólicas pueden declararse de una en una, en la forma anterior, o bien pueden declararse varias de ellas seguidas, tras una única palabra CONST que introduce la declaración de todas ellas. Por ejemplo:
 
            CONST
                 Largo = 34;
                 Ancho = 78;
                 Punto = ".";
                 NumeroE = 2.718281828459
                 Pregunta = ‘¿Año de nacimiento ?’;
                 MinimaTemperatura = -50;
                 Radio = 1.5;
 
Las constantes con nombre tienen asociado el tipo de dato correspondiente al valor con que se declaran. En los ejemplos anteriores los tipos de las constantes serán los siguientes:
 
                 PI                           REAL
                 Largo                      INTEGER o CARDINAL
                 Ancho                     INTEGER O CARDINAL
                 Punto                      CHAR
                 NumeroE                  REAL
                 Pregunta                  ristra
                 MinimaTemperatura    INTEGER
                 Radio                       REAL
 
Una posibilidad interesante es pode declarar el valor de una constante en forma de expresión. En Modula-2 sólo se permite hacer esto si la expresión puede ser evaluada por el compilador en el momento de traducir el programa fuente a programa objeto. Para ello es necesario que todos los operandos que intervengan en la expresión sean valores constantes, y que las operaciones entre ellos sean operadores fijos del lenguaje o funciones predefinidas (que tienen identificadores predefinidos). En este caso la expresión se denomina expresión constante. Los operandos constantes pueden ser valores explícitos o constantes con nombre declaradas en algún punto anterior del programa.
 
Por ejemplo, tras las declaraciones anteriores se podría añadir:
 
                CONST
                     Diametro = 2.0*Radio;
                     ConstanteRara = (23*5) DIV ((7-4) MOD 2 ));
                     Area = Largo * Ancho;
                     Perimetro = 2*(Largo + Ancho);
 
Estas constantes tendrán asociado el tipo de valor que se deduzca de la evaluación de la correspondiente expresión constante. En este caso será:
 
              Diametro                          REAL
              ConstanteRara                  INTEGER o CARDINAL
              Area                               INTEGER o CARDINAL
              Perimetro                         INTEGER o CARDINAL
 
Las reglas precias que han de seguir las declaraciones de constantes con nombre son las siguientes:
 
Declaración_de_constantes ::=
           CONST { Asociación_constante ;}
 
Asociación_constante ::=
           Identificador = Expresión_constante
 
Una expresión constante incluye, como caso particular, un único término que sea un valor explícito.
 
 
3.4 Variables
 
En este apartado se introduce el concepto de variable y a continuación se explica como se declaran y utilizan las variables en Modula-2.
 
3.4.1 Concepto de variable
El concepto de variable en programación imperativa es diferente del concepto de variable algebraica. Cuando escribimos expresiones algebraicas usamos variables para representa un valor indefinido, pero fijo. Por ejemplo, cuando escribimos la igualdad:
 
                 (a+b)^2 = a^2 + 2ab + b^2
 
queremos indicar que dicha igualdad se cumple asociando a y b con valores cualesquiera, pero siempre los mismos. No tiene sentido pretender que a tenga un valor en una parte de la expresión y otro diferente en otra parte.
 
Algo similar ocurre cuando escribimos fórmulas matemáticas o leyes físicas, que ligan diversas magnitudes. Por ejemplo, la fórmula del volumen (V) de un cilindro en función de su radio (R) y su altura (A) es:
 
               V = (pi)(R^2)A
 
Una vez asociadas las variables R y A con el radio y altura de un cilindro en particular, la variable V debe tomar necesariamente el valor del volumen de dicho cilindro.
 
Insistiendo en esta idea, consideremos un sistema de ecuaciones, tal como:
 
            3x + 5y = 19
            7x – 5y = 11
 
Las variables x e y, denominadas incógnitas, representan los valores, inicialmente desconocidos, que satisfacen dichas ecuaciones, y en concreto:
 
         x = 3             y = 2
 
Con todo ello insistimos en que las variables algebraicas representan valores simbólicos, bien valores cualesquiera, o bien valores desconocidos, pero de manera que una vez asociada la variable a un valor determinado dicho valor no debe cambiarse.
 
En programación el concepto de variable es diferente, y está directamente asociado a la memoria del computador. La memoria del computador permite almacenar información para ser usada posteriormente. La función de la memoria es mantener dicho valor todo el tiempo que sea necesario para usarlo tantas veces como se necesite.
 
Pero los valores almacenados en la memoria pueden ser modificados cuantas veces se desee. Al almacenar un valor en un elemento determinado de la memoria, dicho valor se mantiene de ahí en adelante, pero sólo hasta que se almacene en dicho elemento un nuevo valor diferente.
 
Las variables en los lenguajes de programación imperativa son el concepto abstracto equivalente a la memoria física de la máquina. Una variable representa un valor almacenado, y que se puede conservar indefinidamente para ser usado tantas veces como se desee. Pero el valor de una variable se puede modificar en cualquier momento, y será el nuevo valor el que estará almacenado en ella a partir de entonces.
 
Las variables de un programa se designan mediante nombres o identificadores. El identificador de una variable representa el valor almacenado en dicha variable. El programador puede elegir los nombres que considere más apropiados para las variables que utilice en su programa.
 
3.4.2 Declaración de variables
Cada variable en un programa en Modula-2 debe tener asociado un tipo de valores determinado. Esto quiere decir que si una variable tiene asociado el tipo INTEGER, por ejemplo, sólo podrá almacenar valores de este tipo pero no valores de tipo REAL u otro diferente.
 
Las variables han de ser declaradas en el programa antes de ser utilizadas. La declaración de una variable especifica su nombre y el tipo de valor asociado.
 
Por ejemplo, para usar una variable que almacene la edad de una persona como un número entero de años, podríamos declarar:
 
        VAR edad: INTEGER;
 
Podemos observar que la declaración se inicia con la palabra clave VAR, y detrás de ella se escriben el nombre de la variable y el identificador de su tipo, separados por el carácter dos puntos (:). La declaración termina con punto y coma (;).
 
Pueden ponerse varias declaraciones de variables, seguidas, después de una sola palabra VAR. Por ejemplo:
 
         VAR
             dia: INTEGER;
             mes: INTEGER;
             anno: INTEGER;
 
Si varias variables tiene el mismo tipo, se pueden declarar todas conjuntamente, escribiendo sus nombres seguidos, separados por el carácter coma (,) y luego el tipo común a todas ellas, en la forma habitual. El ejemplo anterior podría haberse escrito en forma abreviada:
 
         VAR dia, mes, anno: INTEGER;
 
La descripción BNF de la declaración de variables es la siguiente:
 
Declaración_de_variables ::= VAR { Lista_de_variables ;}
Lista_de_variables ::= Lista_de_identificadores : Tipo
Lista_de_identificadores ::= Identificador {Identificador }
Tipo ::= INTEGER | CARDINAL | REAL | CHAR
 
Por el momento las posibilidades de especificación de tipos se limita a los tipos predefinidos presentados hasta ahora; más adelante se indicará la manera de definir nuevos tipos.
 
3.4.3 Uso de variables. Inicialización
El valor almacenado en una variable puede utilizarse usando la variable como operando en una expresión aritmética. El tipo declarado para cada una de las variables determina las operaciones que posteriormente se podrán realizar con ella, de la misma forma que sucedía para los valores constantes según se explicó en el tema anterior.
 
Por ejemplo, si declaramos las variables:
 
         VAR
            Base, Altura : CARDINAL;
            Saldo, Meses, Dias : INTEGER;
            Volumen, Area, Gastos : REAL;
            Modelo, Codigo : CHAR;
 
podremos escribir expresiones tales como:
 
           Base * Altura
           Dias + ORD( Codigo )
           Volumen / Area
 
pero sería incorrecto escribir
 
           Area / Base
           CHR( DIAS )
           Base + Area
 
porque combinan operandos de tipos diferentes.
 
Si se usan correctamente los tipos de operandos para cada operación, en una misma expresión pueden intervenir operandos de diferentes clases. Por ejemplo, pueden usarse a la vez variables, constantes con nombre, y valores numéricos constantes. Con las declaraciones de constantes de la sección anterior, y las variables del último ejemplo, se podría escribir:
 
           Pi * Volumen * 5.7
           Base * Altura DIV ConstanteRara
           FLOAT( Saldo ) + NumeroE
           TRUNC( Area ) DIV Ancho MOD 5
 
Estos ejemplos de expresiones son formalmente correctos, de acuerdo con las reglas de Modula-2, pero no se pretende que tengan ningún sentido intuitivo, que se ajuste al significado de los nombres empleados.
 
Con independencia de que las operaciones con variables sean consistentes con los tipos de valores que almacenan, para que sea válido evaluar una expresión aritmética en la que intervengan variables es necesario que todas ellas tengan un valor definido. Tal como se ha dicho anteriormente, los nombres de las variables representan los valores almacenados en ellas. Si en una variable no se ha almacenado todavía ningún valor, su uso conduce a un resultado imprevisible.
 
Para usar una variable de manera correcta es necesario inicializarla antes de usar su valor en ningún cálculo. Inicializar una variable es simplemente darle un valor determinado por primera vez.
 
Algunos lenguajes de programación permiten especificar el valor inicial de una variable en la declaración de la misma. Modula-2, sin embargo, no admite esta posibilidad. Cada variable deberá ser inicializada en el momento adecuado asignándole valor de alguna manera durante la ejecución del programa.

Curso de Filosofía elemental (22)

XXIII
 
Los actos morales
 
 
 
117. ANÁLISIS DEL ACTO HUMANO. EL ACTO MORAL
 
   Sólo los actos voluntarios son objeto de valoración moral. Hemos visto cómo el ser racional es capaz de tender hacia su bien de un modo reflexivo y libre. En la Naturaleza, únicamente el hombre es racional y está dotado, por ello, de libre albedrío; sólo, pues, el ser humano es sujeto de actos morales.
   Sin embargo, no todos los actos del hombre son actos morales. El crecimiento de un niño, la digestión, una caída, un movimiento reflejo o uno instintivo, por ejemplo, son actos del hombre, pero no son actos morales, porque carecen de racionalidad y albedrío. Se llaman actos humanos (actus humani), es decir, propiamente humanos, a aquellos que proceden de la razón y del abedrío, y actos del hombre (actus hominis) a aquellos que, aun siendo realizados por el hombre, carecen de aquel origen y condiciones. Sólo los actos humanos son actos morales.
   Cab preguntarse cómo un mismo ser sustancial, el individuo humano, puede unas veces ejecutar actos que son propios de la naturaleza humana, del hombre en cuanto tal, y oras veces actos que no son del hombre como tal. Ello es debido a que en los eres reales las naturalezas más complejas y perfectas reúnen en sí como subsumidos o subordinados el modo de ser y obrar de las naturalezas más simples. Así, el hombre, además de las funciones propiamente racionales o superiores, posee las de conocimiento y apetición sensibles propias de la vida animal, y las de la vida vegetativa y, por debajo de éstas, su organismo es un conjunto de procesos bioquímicos y, en fin, un mero cuerpo o porción de materia. Suele así decirse que el hombre abarca en su ser distintos estratos ónticos (de ser) con sus correspondientes modos de padecer y de obrar. De forma tal que el hombre ha sido llamado microcosmos, mundo en pequeño, por resumir en sí cuantos modos de se existen en el Universo creado, pero siempre bajo la primacía y dirección de un solo principio vitl (el alma racional) que abarca en sí todas esas virtualidades.
   Supone esto que el hombre, como ser corpóreo, está sometido a las leyes de la gravedad y cae como cualquier cuerpo en el vacío; que en él, en su sangre, se dan fenómens de combustión normales; que se nutre, crece y reproduce como cualquier viviente; que conoce y apetece sensiblemente como animal, y que entiende y ama como racional. Sólo, sin embargo, los actos realizados o presididos por las facultades superiores de entendimiento y voluntad son propiamente humanos, y sólo ellos son objeto de calificación moral.
   Recibe el nombre de voluntario elícito el acto que brota directamente de la voluntad; se llama voluntario imperado el acto que emana de otra facultad en tanto que movida por la voluntad. Tomar una decisión, formar un propósito, son actos elícitos de la voluntad. Mirar, pensar, moverse, cuando se hace bajo el imperio de la voluntad, son actos imperados.
   No sólo los primeros, sino también los segundos, los imperados, entrar en el ámbito de la vida moral. En otras palabras, la vida moral humana (y el objeto de la ética, por lo tanto) comprende no sólo los puros actos de la vida racional o superior, sino también los de la vida sensitiva o inferior en la medida en que se hallen iluminados por la razón y bajo el dominio e imperio de la voluntad.
 
 
118. INFLUENCIAS QUE MODIFICAN LA MORALIDAD DE LOS ACTOS
 
   El acto voluntario ha de ser siempre un acto iluminado por el entendimento que presenta a la voluntad el objeto o los objetos deseables en sus razones o motivos de apetibilidad. La voluntad, entonces libre de determinación, puede dirigirse o apartarse del objeto propuesto, o elegir entre varios, sea por un acto directo de ella misma (en el voluntario elícito), sea a través de las potencias ejecutoras (en el voluntario imperado). (Recuérdese lo dicho en el núm. 78 sobre el acto voluntario.)
   Sin embargo, el acto voluntario puede recibir influencias modificativas que alteren o disminuyan su condición en cualquiera de los tres elementos aludidos: en su raíz intelectual, en su misma voluntariedad libre, en las potencias relizadoras.
 
   1º. Cuando el entendimiento no alcanza la debida claridad de juicio se da entonces la duda o la ignorancia que disminuyen la voluntariedad del acto. Si me equivoco al aplicar un medicamento cuando la urgencia del caso exige actuar, por ignorancia de todas las virtualidades del mismo, las consecuencias del acto no son plenamente voluntarias, ni por lo mismo la responsabilidad del mismo.
   Un caso especial de la ignorancia es la ignorancia voluntaria; esto es, la ignorancia mantenida por el propio sujeto con el fin de evitarse complicaciones y remordimientos mayores. Se ignora entonces porque se desea ignorar. De ese modo seguimos nuestra conciencia, pero habiéndola forjado previamente a medida de nuestro deseo. Esta clase de ignorancia no disminuye la voluntariedad del acto, ni, por tanto, la responsabilidad del mismo.
 
   2º. Puede también resultar alterada la voluntad misma por influencias que disminuyan la libertad del acto:
       a) Bien porque la voluntad sea atraída intensamente hacia un objeto sensible. En tal caso el acto es más voluntario en el sentido de ser más querido, ya que la pasión aumenta y refuerza la inclinación, pero lo es menos en el sentido de verse sustraído en parte de la luz de la razón y de las posibilidades de deliberación. Es por ello menos libre.
       b) O bien porque la voluntad resulte desviada de su objeto por la amenaza de un mal próximo (miedo). El miedo, como las demás pasiones, disminuye la racionalidad del acto y puede llegar a destruir su misma raíz voluntaria y libre.
 
   3º. Pueden, por último, resultar afectadas, no ya la voluntad, sino las potencias ejecutoras encargadas de cumplir las decisiones de aquélla (violencia). La violencia no puede ejercerse sobre los actos elícitos de la voluntad, que son ab intrinseco, sino sólo sobre los actos imperados. A un esclavo o a un prisionero, por ejemplo, se le puede obligar a hacer tal o cual cosa o a que deje de hacerla, pero no a que quiera hacer esto o a que no quiera hacer aquello. La ignorancia, la pasión, el miedo y la violencia son las cuatro formas generales de influencias modificativas de los actos voluntarios.
 
 
119. IMPUTABILIDAD Y RESPONSABILIDAD
 
   Propiedades de la actuación moral –del acto mismo y del sujeto– son la imputabilidad y la responsabilidad. La priera –la imputabilidad– es la condición de los actos morales en cuya virtud pueden éstos aribuirse a un sujeto racional y libre como a su causa. Son sólo imputables las acciones debidas a sujetos racionales libres. Un terremoto, la caída natural de una peña, por ejemplo, no son acaecimientos imputables a nadie. La mordedura de un perro tampoco lo es, salvo que por vía indirecta pueda atribuirse a un sujeto humano que lo mantuvo indebidamente en libertad o que lo incitó. Un crimen o una calumnia son indirectamente imputables a sus autores. Circunstancias que modifican –atenuando o anulando– la responsabilidad de los actos son las mismas que hemos visto ejerciendo idéntica influencia en la voluntariedad de éstos.
   Responsabilidad es la propiedad recíproca en el sujeto moral por cuya virtud debe éste sentirse causa o autor del acto moral y de sus consecuencias, y responder de uno y otras ante Dios, ante su propia conciencia y ante los demás. Condiciones de la responsabilidad del sujeto son, como de la imputabilidad del acto, la racionalidad y libertad del mismo. Modifican o anulan igualmente la responsabilidad del sujeto las mismas influencias que alteran su voluntariedad.
 
 
120. MÉRITO O DEMÉRITO MORAL
 
   La conducta moral se dice que es meritoria. Por las buenas acciones, el sujeto moral merece. Llámase mérito a un acrecentamiento del valor moral que el hombre adquiere por sus actos. A la inversa, el obrar mal acarrea una disminución de valor que se llama demérito.
   Del mismo modo que en la vida concreta y psicológica del sujeto moral la repetición de actos buenos crea en él, como veremos, la virtud o hábito del bien, que es una cualidad que lo perfecciona en su capacidad de obrar rectamente, y que la repetición de actos malos engendra el vicio, así también se da con la repetición continuada y virtuosa del bien un incremento personal de valor que llamamos mérito. El sujeto merece antes sus propios ojos, ante los del prójimo y, en definitiva, ante los de Dios, único remunerador supremo y adecuadamente justo.      
 
 
 
 
XXIV
 
El bien supremo del hombre
 
 
121. EL FIN ÚLTIMO HUMANO O BIEN SUPREMO
 
   Todos los seres de la Naturaleza tienden, como hemos visto (número 78), hacia su propio bien; es decir, hacia aquello que complementa o perfecciona su naturaleza. Unos seres tienden a su bien ciegamente, sin conocerlo; otros, experimentando su atracción a través del conocimiento en el apetito sensible (los animales); sólo el hombre tiende a su bien racionalmente, esto es, conociendo los motivos por lo que apetece y la razón de bien que tiene para él la cosa conocida.
   Por virtud de esta forma superior de apetito –que es la voluntad–, el hombre se siente atraído diversamente hacia las cosas imperfectas y finitas que le rodean, y que le satisfacen quizá en unos aspectos y no en otros. Lo que es un bien deleitable no es quizá un bien útil; lo que es un bien útil no es tal vez un bien honesto, etc. Por esta misma mezcla de bien y de carencia de bien (de ser y de no ser) que tienen las cosas, el hombre suele ordenar su actividad voluntaria jerarquizando los objetos a que se dirige, que de este modo adquieren una razón de medio hacia otros que tienen para él razón de fin. La mayor parte de las cosas que deseamos y hacemos no las hacemos o deseamos por ellas mismas, sino como medio a otro bien o fin más alto. Así, cualquiera de nuestros actos voluntarios adquiere verdadero sentido dentro de una serie de bienes y fines escalonados, que sólo se justifican por el bien o fin último, del que los demás dependen. (Yo, por ejemplo, voy a clase o estudio la lección para aprender, aprendo para aprobar, apruebo para ser bachiller, seré bachiller para iniciar una carrera u obtener un empleo, obtendré un empleo para asegurarme una posición, etc., etc.). Sin un fin último, expreso o virtual, la serie de intenciones y de acciones carecería de sentido humano.
   Del mismo modo que el conjunto de los seres contingentes que forman el mundo, y la serie de causas que en él atúan, no podrían explicarse sin un primer ser y una causa primera del que dependan (número 102), así también la serie de intenciones y de fines quedaría sin explicación al faltar un fin o bien supremo, al que esencialmente se ordene el ser humano y hacia el que se oriente la rectitud profunda de sus actos. Si no hubiera un fin último, al cual todos los demás se subordinan, formando una serie única, no podríamos hablar de orientación o de desviación de los actos humanos hacia su fin; es decir, no tendría sentido la norma moral. Pero, supuesto un fin último, podemos establecer el siguiente principio: siempre que los actos humanos se ordenen a ese fin o no se salgan del orden de fines que él determina, serán morles; siempre que se desvíen con respecto a este fin, serán inmorales.
 
 
122. SU CONCEPCIÓN EN LOS DISTINTOS SISTEMAS
 
   Sin embargo, la determinación de cuál sea el fin último o bien supremo del hombre ha dividido el parcer de filósofos a lo largo de la Historia, dando lugar a escuelas morales diversas, que ven de distinto modo el destino a que debe orientarse la vida del hombre y, por lo tanto, el determinante de la moralidad o rectitud de las acciones.
   Las principales concepciones históricas del bien supremo son: el hedonismo, el humanitarismo o sociologismo, la doctrina de la autonomía moral y el eudomonismo religioso. El primero de estos sistemas coloca el bien supremo en el placer; el segundo, en el provecho del mayor número; el tercero, en la pura conformidad con un interno imperativo moral (KANT), y el cuarto, en la felicidad emanada del recto desarrollo de las potencias humanas orientadas hacia Dios, supremo fin del hombre.
 
 
123. SISTEMAS HEDONISTAS Y UTILITARIOS
 
   Un grupo de teorías morales, tanto en la Antigüedad como en la Edad Moderna, han supuesto que el fin último o bien supremo del hombre se identifica con el placer (en griego, hedoné). Según estas escuelas, cuanto el hombre hace o intenta tiene siempre valor de medio para otra cosa; sólo el placer es buscado por sí mismo, y a la obtención del placer se encaminan, en definitiva, todos los demás esfuerzos. La escuela hedonista más conocida de la antigüedad griega y romana fue el epicureísmo (doctrina moral de EPICURO y sus discípulos); y en la época moderna tuvo también carácter hedonista el utilitarismo moral, escuela inglesa del siglo XIX, entre cuyos representantes cabe citar a Jeremías BENTHAM y a STUART MILL.
   EPICURO DE SAMOS (siglo III a. de J.C.) fue una de las figuras de la decadencia del pensamiento griego, en una época en que el pensar filosófico aparece al servicio de la ética, es decir, del problema práctico sobre cuál deba ser la actitud del hombr (del sabio) ante el acontece universal en que está inserto. Según Epicuro, todo sucede en el mundo según leyes físicas fatales; y los dioses, si existen, para nada se ocupan de los hombres. Estas ideas tienden a quitar preocupaciones al hombre y facilitar su entrega al placer como fin único y verdadero de la vida.
   Pero Epicuro, acto seguido de estas afirmaciones, tiene que enfrentarse con la difícil antítesis de todo hedonismo: cualquier ética, para serlo, ha de pretender dar unas normas con carácter general e imperaitvo; pero el placer es un hecho subjetivo, que se realiza en la intimidad del sujeto sin que cada hombre pueda tener experiencia más que del propio. Imaginemos que se manda o se aconseja a un hombre que, para lograr una vida placentera, se abstenga de drogas, como el opio, por ejemplo. Pero él responde: El placer de un momento que el opio me depara es para mí superior a todos los placeres que podría ofrecerme una larga vida; por mi parte, lo cambio con gusto y nadie puede discutirme el derecho, porque el placer es mío y sólo yo puedo conocerlo y valorarlo. Esto es incontestable desde el punto de vista puramente hedonista, y, por ello, toda ética de este género ha de enfrentarse, antes de nada, con el problema de objetivar el placer, hacer de él algo objetivo que pueda erigirse en fin concreto y norma para todos los hombres.
   A este efecto divide Epicuro, en primer lugar, los placeres posibles en placeres corporales y placeres espirituales. ¿Cuáles serán los superiores y, por tanto, los deseables? En un principio se decide Epicuro por los espirituales porque se pueden traer a voluntad y, por lo mismo, no sujetan al hombre a las cosas exteriores y a la variable fortuna. Pero los placeres espirituales consisten para Epicuro en recordar, imaginar o proyectar situaciones placenteras, y no son posibles, naturalmente, si no existen previamente unas auténticas y originarias situaciones placenteras. Estas no pueden consistir sino en los placeres del cuerpo.
   Divide a continuación los placeres en lo que él llama placeres en reposo y placeres en movimiento. Son en reposo aquellos placeres que advienen al alma como algo natural a su actividad, como la satisfacción de un deseo natural, el fácil y grato ejercicio de sus operaciones. Son en movimiento aquellos otros que experimenta el alma como algo sobreañadido a su naturaleza, algo que se ha de buscar en el exterior porque no resulta de su normal actividad. El placer de reposar tras la fativa, el beber agua con sed, son típicos placeres en reposo. Las drogas, el beber bebidas alcohólicas son ejemplos de placeres en movimiento. Epicuro opta decididamente por los placeres en reposo, porque los en movimiento producen, a la larga, dolor y, convertidos en hábito, esclavizan al alma sometiéndola a las cosas exteriores.
   Y aquí sobreviene el viraje y la sorprendente conclusión del hedonismo de Epicuro: Si los placeres espirituales vienen a reducirse a los corporales, y si en éstos sólo deben admitirse por tales placeres los en reposo, resultará que el único fin de la vida es el placer derivado de satisfacer las más elementales necesidades de la naturaleza. Lo cual exige del hombre un abstencionismo ascético, una estricta austeridad. El sabio epicúreo no encuentra así un verdadero e ilusionado objetivo a esta vida de renuncia a que le ha conducido su propio sistema, y tampoco lo encuentra, por tanto, a la vida misma. Por eso pocos panegiristas han cantado a la muerte y al suicidio como Epicuro.
   Epicuro, al someter los placeres humanos a un análisis para determinar cuál es el verdadero placer al que encaminar la vida humana por encima de los placeres subjetivos y diversos, encuentra que el placer se le disuelve entre las manos, que todo placer a la larga se transforma en dolor, y llega así a un ideal ascético, según el cual no existe otro placer más que la satisfacción de las necesidades vitales (beber cuando se tiene sed, descansar tras el esfuerzo, etc.), y el secreto de la felicidad estribará para él, como para los estoicos, en no desear nada y conformarse con lo indispensable.
   Es que el placer no es más que una reacción, un tono afectivo que acompaña a los actos cuando éstos cumplen su objetivo, pero nunca una realidad en sí misma que pueda buscarse como finalidad última, ni aun próxima. El placer, como la caza, aparece muchas veces en nuestro camino cuando no la buscamos, pero rara vez si salimos en su busca.
 
 
124. SU CONCEPCIÓN EN DIOS COMO CREADOR DE LA NATURALEZA HUMANA
 
   Parece indudable que el hombre tiende por naturaleza a la felicidad, que es algo más amplio y profundo que el mero placer; pero no lo es menos que esta felicidad que ha sido muy diversamente concebida por los distintos hombres y pensadores.
   Dentro de las cosas de este mundo, dos son las clases de bienes que pueden atraer la voluntad del hombre en ese su deseo innato de felicidad. La primera está constituida por las cosas exteriores, bienes creados que rodean al hombre en su vida: riquezas, honores, poder. Parece claro y la experiencia atestigua que esta clase de bienes no pueden satisfacer al hombre de modo pleno, y que, aunque a menudo se afane en lograrlos, hay en su búsqueda el inconsciente anhelo de un bien más profundo, del que sólo débilmente participan esas cosas. Los bienes de este mundo son siempre caducos y limitados, y algunos, como el dinero o el poder, sólo valen en orden a otras cosas que mediante ellos pueden alcanzarse. Ningún hombre encuentra una felicidad plena y pernamente en tales bienes; ante bien, su adquisición suele servir sólo para ampliar su campo de deseos y ambiciones o para producir un hastío final si su facultad de desear más llega a agotarse.
   Una segunda clase de bienes radican en el hombre mismo y estriban en la perfección de las facultades físicas (salud, placer) o de las facultades espirituales (el saber, la virtud). Tampoco en esta clase de bienes, considerados en sí mismos, puede hallar el hombre la felicidad, ni pueden constituir para él el bien supremo, porque las facultades son potencias que sólo se actualizan por un ser que esté en acto. El conocimiento tiende a la verdad como la voluntad al bien, y la perfección de estas y de las demás potencias sólo podrá consistir en capacitarlas para alcanzar más eficazmente la verdad o el bien, pero nunca como fin u objetivo cumplido de ellas mismas.
   Es preciso entonces buscar el bien supremo y la felicidad del hombre fuera de las cosas de este mundo. Si las facultades superiores del hombre propiamente humanas (inteligencia y voluntad) se ordenan al ser (bajo la razón de verdad o de bien, respectivamente), sólo el ser pleno y perfecto, acto puro, sin mezcla de potencia, es decir, Dios, podrá satisfacer con plenitud el insaciable anhelo de conocimiento y de amor que el hombre lleva en su ser.
   Dios es, pues, como creador de la naturaleza humana, el bien supremo, hacia el que, consciente o inconscientemente, tiende el hombre al desear las diversas cosas que anhela en lo que de particularmente bueno poseen. E igualmente, la verdadera felicidad del hombre, como cumplimiento pleno de sus potencias, sólo podrá hallarse en la contemplación o posesión de Dios más allá de este mundo, en la bienaventuranza eterna. El hombre, por sus mismas facultades superiores o racionales, es un ser orientado y llamado hacia un mundo que habita. Para la elevación a ese mundo, en el que puede hallar la plenitud y felicidad que en esta vida no encuentra, el hombre necesita de la gracia divina, que perfecciona y da cumplimiento a la Naturaleza, de la cual puede el hombre hacerse merecedor por la rectitud de sus intenciones y de sus actos.
 
 
125. SISTEMAS SOCIOLOGISTAS Y HUMANITARIOS
 
   Otros sistemas colocan el bien supremo del hombre y el fin último moral en el progreso de la Humanidad o en el servicio a los demás hombres. Entre los filósofos mantenedores de estas teorías cabe citar al inglés Heriberto SPENCER, cuya doctrina moral se titula filantropismo, y al francés Augusto COMTE, autor del positivismo, cuya moral culmina en el culto al Gran Ser que es la Humanidad. También participa de esta teoría la llamada <<moral de la solidaridad>>, que propugnan los autores socialistas.
   Pero la felicidad de los demás o el bien de mayor número no pueden ser fin supremo para el hombre. Los otros hombres serían para cada ser humano simplemente rivales o competidores en los bienes de la Naturaleza si no hubiera un algo superior que los enlace a todos en una comunidad valiosa por sí misma, o si un bien más alto no hiciera del amor al prójimo el camino de su consecución. El bien de los demás –y más aún si se trata de la Humanidad en abstracto, con la que no nos unen los vínculos y afectos que nos ligan al prójimo (cercano, familiar)– no puede exigir los sacrificios y renunciaciones que en tantos casos supone el obrar moral.
 
 
126. CONCEPCIÓN DEL FIN SUPREMO EN EL APRIORISMO KANTIANO
 
   El filósofo Manuel KANT sostuvo una teoría moral según la cual el obrar humano no adquiere su carácter de moral por ordenarse a un fin, sino por su conformidad con una forma o estructura de la razón práctica que se encuentra en el mismo sujeto moral. De aquí el nombre de formalismo que recibe este sistema de moral.
   Del mismo modo que para Kant nuestro conocimiento se forma de la insercción de las sensaciones provenientes del exterior en unas formas (o moldes) de nuestra razón, que son el espacio y el tiempo, así también el obrar moral resulta de insertar el contenido de la acción (que para Kant es indiferente) en la forma pura de la moralidad, a la que Kant llama imperativo categórico. Quien obrar por un fin ajeno o extraño a esta forma de moral (sea el placer, o la felicidad, o la salvación) no obra moral, sino interesadamente. Sólo obra moralmente el que obra por el puro respeto a la ley (al imperativo categórico), es decir, con la recta intención de cumplir la ley por ella misma.
   El imperativo moral puede formularse con estas palabras: <<obra de modo que la norma de tu conducta pueda erigirse en norma de conducta universal>>. Es decir, si ante una acción cualquiera podemos admitirla sinceramente como norma de conducta general, esa acción es lícita moralmente; en caso contrario, no. Esta ley o imperativo es puramente formal; en sí misma no manda nada concreto, pero sirve para cualquier clase de contendos o actos. Según Kant, no debe hacerse un acto porque sea bueno, sino que es bueno porque debe hacerse. La moralidad radica sólo en una forma del hacer, de la razón práctica.
   Sin embargo, no se comprende en esta teoría de Kant cómo puede obrar la voluntad con independencia de todo objeto, girando sobre sí misma en el vacó. La ley, concebida como una mera forma, no puede explicar el obrar moral libre del hombre, que, si puede en su provecho o placer violar el orden moral, no encontrará verdadera razón para no hacerlo en la pura existencia de la ley moral subjetiva. El obrar humano es esencialmente finalista o teleológico; es decir, se mueve por un fin, y sólo en un fin puede hallar su motivación, aún más tratándose de los esfuerzos o privaciones que el cumplimiento de la ley moral requiere.

Fundamentos de programación con Módula-2 (6)

 

2.5 Expresiones aritméticas
 
Una expresión aritmética representa un cálculo a realizar con valores numéricos o de otro tipo. Una expresión aritmética es una combinación de operandos y operadores. Para indicar el orden en que se quieren realizar las operaciones parciales se pueden utilizar paréntesis.
 
Si no se utilizan paréntesis el orden de las operaciones depende de una jerarquía entre los operandos empleados, que es la siguiente:
 
        1º Operadores multiplicativos:     * / DIV MOD
        2º Operadores aditivos:              + –
 
Dentro del mismo nivel las operaciones se ejecutan en el orden en que están escritas en la expresión de izquierda a derecha.
 
Si una expresión va precedida del signo más o menos, se entiende que solamente le afecta al primer operando. Si se quiere que afecte a toda la expresión, ésta deberá incluirse entre paréntesis.
 
Ejemplos de expresiones entre datos enteros son las siguientes:
 
                  Expresión                                        Resultado
                5 * 30 + 5                                            155
                334 DIV 6 MOD 4 * 5                               15
                -5 * 10 MOD 3 DIV 2                               -1
 
Cuando la complejidad de la expresión puede dar lugar a posibles errores de interpretación, es preferible utilizar paréntesis para clarificar cuál es el cálculo exacto que se quiere realizar. Así las expresiones anteriores son equivalentes a las siguientes:
 
              (5 * 30) + 5
              ((334 DIV 6) MOD 4) * 5
              (((-5) * 10) MOD 3) DIV 2
 
Igualmente, ejemplos de expresiones entre valores reales son las siguientes:
 
               Expresión                              Resultado                      Expresión equivalente
           35.3 * 5.1 / 7.6 – 4.5                  19.18816                      ((35.3 * 5.1) / 7.6) – 4.5
           -23.1 / 6.2 * 5.4 / 2.4                 -8.38306                      (((-23.1) / 6.2) * 5.4) / 2.4
 
Modula-2 es muy estricto en cuanto a la aplicación de los operadores a los tipos de datos apropiados. Aunque se represente por los mismos símbolos, los operadores aritméticos para valores reales y enteros son en realidad diferentes. Así, por ejemplo las siguientes operaciones son incorrectas:
 
33.7 DIV 5            Error: el operador DIV sólo sirve entre enteros
33 / 5.3               Error: el operador / sólo sirve entre reales
25 * 3.5               Error: el operador * sólo sirve entre dos enteros, o bien entre dos reales
 
Para poder realizar estas operaciones combinadas es necesario que previamente se realice una conversión de la representación de los datos al tipo adecuado. La representación real de un dato entero se indica de la siguiente manera:
 
             FLOAT(45)             Representa el valor real 45.0
             FLOAT(-567)          Representa el valor real -567.0
 
De forma similar la representación entera de un dato real (correspondiente a la parte entera, truncando el valor) se consigue de la siguiente forma:
 
             TRUNC(34.7)            Representa el valor entero 34
             TRUNC(-0.5679E2)    Representa el valor entero -56
 
Por tanto, las operaciones entre enteros y reales anteriormente indicadas se tienen que realizar de la siguiente manera:
 
                  Expresión                                        Resultado
               TRUNC(33.7) DIV 5                              6
               FLOAT(33) / 5.3                                  6.22642
 
Para la tercera expresión es posible realizar dos conversiones distintas dependiendo del tipo de valor con el que deseemos realizar la operación, y que darán lugar a resultados completamente distintos:
 
                  Expresión                                        Resultado
                FLOAT(25) * 3.5                                 87.5
                25 * TRUNC(3.5)                                 75
 
En algunas versiones de Modula-2, FLOAT y TRUNC sólo realizan las conversiones entre valores de los tipos REAL y CARDINAL, en lugar de realizarlas entre valores de los tipos REAL e INTEGER.
 
 
2.6 Operaciones de escritura simples
 
El objetivo de un programa es obtener unos resultados. Estos resultados deber ser emitidos al exterior del computador a través de un periférico de salida de datos (impresora, pantalla, plotter, etc.). Las acciones que envían resultados al exterior se llaman, en general, operaciones de escritura, con independencia de que se trate o no de una impresión en papel, o la simple visualización, o la grabación de los datos en un soporte donde queden registrados.
 
Existe una gran variedad de dispositivos periféricos, que se diferencian mucho en los detalles de su manejo. Para simplificar la escritura de resultados los lenguajes de programación preveén sentencias de escritura apropiadas para ser usadas con cualquier tipo de dispositivo, facilitando la tarea de programación al especificar la escritura de resultados de una manera uniforme, con independencia de las particularidades del dispositivo físico que se utilice en cada caso.
 
Al diseñar un lenguaje de programación se puede optar por usar sentencias o instrucciones especiales para ordenar la escritura de resultados, o bien ordenar la escritura del resultado con las mismas sentencias generales que se empleen para invocar operaciones definidas por el usuario. Los primeros lenguajes de programación solían emplear la primera alternativa. Los lenguajes más modernos utilizan con preferencia la segunda, que simplifica la complejidad del lenguaje en sí, a costa de permitir a veces una cierta variación en las operaciones de escritura entre diferentes versiones del lenguaje.
 
Modula-2, como lenguaje moderno, adopta también la segunda alternativa. Las operaciones de escritura se definen como procedimientos (ver Tema 7), que se invocan escribiendo el nombre de la operación, seguido de una serie de valores o argumentos entre paréntesis. Estos procedimientos están definidos en módulos (ver Tema 14) preparados de antemano.
 
En todas las versiones de Modula-2 deben estar disponibles ciertos módulos estándar, con la definición de operaciones de escritura normalizadas. En este apartado describiremos operaciones disponibles en los módulos llamados InOut y RealInOut.
 
2.6.1 Procedimientos WriteInt y WriteCard
Estos procedimientos pertenecen al módulo InOut. Para ordenar que se ejecuten estos procedimientos se debe escribir:
 
         WriteInt( valor_entero, espacios_reservados )
         WriteCard( valor_cardinal, espacios_reservados )
 
El procedimiento WriteInt escribe un valor entero y el procedimiento WriteCard un valor cardinal ocupando el número de espacios indicado en la línea de escritura. Los valores a escribir pueden darse en forma de cualquier expresión aritmética válida del tipo correspondiente.
 
Por ejemplo, para cada una de las siguientes sentencias de escritura se obtiene el resultado que se muestra a su derecha:
 
                  Sentencia                                           Resultado
         WriteCard( 120 DIV 12, 5 )                             10
         WriteInt( 23*67, 10 )                                    ——1541
         WriteInt( -50, 5 )                                          -50
         WriteInt( 1000*34, 3 )                                  34000
 
En los resultados se ha utilizado el carácter "" para indicar un espacio en blanco. Cuando los espacios reservados son inferiores a los necesarios, como ocurre en el último ejemplo, se utilizan los espacios adicionales necesarios para que el resultado aparezca completo.
 
2.6.2 Procedimiento WriteReal
El procedimiento WriteReal se define en el módulo RealInOut. Para ordenar que se ejecute este procedimiento se debe escribir:
 
                  WriteReal( valor_real, espacios_reservados )
 
El procedimiento WriteReal escribe un valor real utilizando todos los espacios indicados en la línea de escritura. El valor real puede indicarse con cualquier expresión aritmética válida de ese tipo.
 
Por ejemplo, para cada una de las siguientes sentencias de escritura se obtiene el resultado que se muestra a su derecha:
 
                   Sentencia                                           Resultado
            WriteReal( 1.2, 10 )                                  0.1200E+01
            WriteReal( 23.1*67.4, 10 )                         0.1557E+04
            WriteReal( -50.6E-6, 15 )                           -0.50600000E-04
 
En los resultados se utilizan exactamente los espacios reservados a base de ajustar automáticamente el número adecuado de cifras decimales en la mantisa.
 
2.6.3 Procedimientos Write y WriteString
Estos procedimientos se definen en el módulo InOut. Para ordenar que se ejecuten estos procedimientos se debe escribir:
 
           Write( carácter )
           WriteString( ristra )
 
La sentencia Write escribe un carácter y la sentencia WriteString una ristra de caracteres. El espacio que se utiliza en el primer caso es de un único carácter y en el segundo el número exacto de caracteres de la ristra.
 
Por ejemplo, para cada una de las siguientes sentencias de escritura se obtiene el resultado que se muestra a su derecha:
 
                   Sentencia                                           Resultado
              Write( "*" )                                              *
              Write( ‘C’ )                                               C
              WriteString( "En un lugar de " )                    Enunlugarde
              WriteString( "¿ Año de nacimiento ?" )           ¿Añodenacimiento?
 
2.6.4 Procedimiento WriteLn
El procedimiento WriteLn pertenece al módulo InOut. Para ordenar que se ejecute este procedimiento se debe escribir:
 
              WriteLn
 
Este procedimiento permite el control sencillo de la presentación de resultados. Cada vez que se ejecuta provoca que los siguientes resultados se escriban desde el comienzo de la siguiente línea de escritura. Si no se usa este procedimiento, las sentencias de escritura presentadas anteriormente escriben su texto a continuación del último carácter escrito, sin ningún tipo de separación. Por ejemplo, si se ejecutan sucesivamente las siguientes sentencias:
 
        WriteString( "Area = " );
        WriteReal( 24.45, 10 );
        WriteString( "Mi ciudad es Avila" );
        WriteString( "Precio:" );
        WriteInt( 1250, 5 );
        Write( "$" );
 
el resultado será el siguiente:
 
  Area = 0.2445E+02Mi ciudad es AvilaPrecio: 1250$
 
que resulta difícil de leer. Este texto se puede presentar mejor separando las partes que no están relacionadas en líneas diferente. Así:
 
        WriteString( "Area = " );
        WriteReal( 24.45, 10 );
        WriteLn;
        WriteString( "Mi ciudad es Avila" );
        WriteLn;
        WriteString( "Precio:" );
        WriteInt( 1250, 5 );
        Write( "$" );
        WriteLn;
 
da como resultado:
 
      Area = 0.2445E+02
      Mi ciudad es Avila
      Precio: 1250$
 
 
2.7 Estructura de un programa completo
 
Con los elementos introducidos hasta este momento pueden formarse ya programas completos. Sólo falta indicar cuál es la estructura global del programa.
 
Un programa en Modula-2 es un módulo principal. Un ejemplo de programa muy sencillo es el siguiente:
 
MODULE EscribirHola;
(* Este programa escribe Hola *)
   FROM InOut IMPORT WriteString, WriteLn;
BEGIN
   WriteString("Hola");
   WriteLn
END EscribirHola.
 
Podemos observar que el texto del programa comienza con una cabecera, en la que, después de la palabra clave MODULE, se pone el nombre que le damos al módulo del programa.
 
A continuación se declara la lista de elementos importados de otros módulos. Esta lista de importados puede estar vacía si no se necesita ninguna colaboración de otros módulos. En la lista de importados se indican desde qué módulo se importan los elementos y la lista de elementos que se quieren importar, usando las palabras inglesas FROM (desde) e IMPORT (importar).
 
La parte final del programa contiene las sentencias ejecutables correspondientes a la acciones a realizar, escritas entre las palabras inglesas BEGIN (comienzo) y END (final).
 
Las diferentes partes del programa se separan una de otra mediante punto y coma (;). Al final del texto del programa se repite el nombre del módulo como comprobación y se acaba con un punto final (.).
 
La ejecución de este programa de ejemplo produce, como es de esperar, el siguiente resultado:
 
Hola
 
En el anterior ejemplo de programa aparece un nuevo elemento no mencionado hasta el momento, y que se explica a continuación.
 
2.7.1 Uso de comentarios
El texto de las sentencias en Modula-2 puede no ser suficiente para comprender del todo el programa, y casi siempre es conveniente alguna aclaración adicional que explique el significado exacto de los elementos usados para desarrollar el programa. Las aclaraciones facilitan la labor de una posible modificación posterior del programa por nosotros mismos u otros programadores.
 
Todos los lenguajes permiten incluir dentro del texto del programa comentarios que facilitan su compresión. Estos comentarios sirven sólo como documentación del programa fuente, y son ignorados por el compilador, en el sentido de que no pasan a formar parte del código objeto al que se traducirá el programa.
 
En Modula-2 los comentarios se incluyen dentro de los símbolos (* y *). Por ejemplo:
 
         (* ¡OJO!. Esto es un comentario *)
 
Los comentarios se pueden anidar uno dentro de otro. El texto comentado finaliza cuando el número de símbolos *) es igual a los (* previamente iniciados. Por ejemplo:
 
         (* Este comentario es (* más complejo *) *)
 
2.7.2 Descripción formal de la estructura de un programa
La descripción formal de la estructura (simplificada) de un módulo de programa es la siguiente:
 
Módulo_programa ::=
     Cabecera_programa Bloque Nombre_programa.
 
Cabecera_programa ::=
     MODULE Nombre_programa ; { Lista_importados ; }
 
Lista_importados ::=
     FROM Nombre_módulo IMPORT Lista_elementos
 
Lista_elementos ::= Nombre_elemento { , Nombre_elemento }
 
La estructura de un bloque solamente puede indicarse de momento de forma simplificada, ya que sólo se han visto los elementos mínimos necesarios para escribir un programa. En esta forma simplificada la estructura de un bloque puede definirse en la forma:
 
Bloque ::= Parte_ejecutiva END
 
Parte_ejecutiva ::= BEGIN Secuencia_de_sentencias
 
Secuencia_de_sentencias ::= Sentencia { ; Sentencia }
 
 
2.8 Ejemplos de programas
 
En este apartado se muestran programas completos que pueden ser compilados y ejecutados de manera directa e inmediata. Aunque estos ejemplos son de una gran sencillez, permiten ilustrar los conceptos introducidos en este Tema.
 
2.8.1 Escribir una fecha
En este ejemplo se escribe una fecha. El día y el año se escriben como valores numéricos, y el mes como un texto.
 
MODULE EscribirFecha;
(* Se escribe la fecha del descubrimiento de América *)
   FROM InOut IMPORT WriteInt, WriteString, WriteLn;
BEGIN
   WriteInt( 12, 2 );
   WriteString( " de Octubre de" );
   WriteInt( 1492, 5 );
   WriteLn
END EscribirFecha.
 
La ejecución del programa produce el siguiente resultado:
 
12deOctubrede1492
 
Obsérvese cómo se han incluido los espacios en blanco en las sentencias de escritura.
 
2.8.2 Suma de números
Con este programa se trata de obtener la suma de una serie de números consecutivos, desde uno inicial a otro final. Para su obtención utilizaremos la fórmula de la suma de una progresión aritmética:
 
   Sumatorio desde i igual a uno hasta n de a sub i, igual a n por (a sub 1 más a sub n dividido entre dos)
 
y para el caso de números correlativos se tiene que
 
           n = a(n) – a(1) + 1
 
El listado del programa es el siguiente:
 
MODULE SumaNumeros;
(* Este programa calcula e imprime la suma de los números correlativos desde 4 hasta 45 *)
   FROM InOut IMPORT WriteString, WriteINt, WriteLn;
BEGIN
   WriteString( "La suma de los números desde 4 hasta 45" );
   WriteLn;
   WriteString( "es igual a: ");
(* El algoritmo empleado es el utilizado para calcular la suma de una progresión aritmética:
                       Suma = (Final-Inicial+1)*(Inicial+Final)/2                              *)
   WriteInt((45-4+1)*(45+4) DIV 2, 5);
   WriteLn
END SumaNumeros.
 
La ejecución del programa produce el siguiente resultado:
 
Lasumadelosnúmerosdesde4hasta45esiguala:1029
 
Es interesante analizar la forma en que se evalúa la expresión aritmética, dado que DIV trunca el resultado. Si se hubiera escrito la expresión en la forma que sugiere la ecuación de la suma de la progresión aritmética:
 
       (45-4+1)*((45+4) DIV 2)
 
se obtiene un resultado erróneo igual a 1008, al producirse el truncamiento de la división por 2 antes de multiplicar.
 
2.8.3 Área y volumen de un cilindro
En este tercer programa sencillo se obtiene a partir del radio R y la altura A de un cilindro, su área y su volumen:
 
          área = 2(pi)R^2 + 2(pi)RA = 2(pi)R(R+A)
          volumen = (pi)R^2A
 
El listado del programa es el siguiente:
 
MODULE Cilindro;
(* Cálculo del área y el volumen de un cilindro *)
   FROM InOut IMPORT WriteString, WriteLn;
   FROM RealInOut IMPORT WriteReal;
BEGIN
   WriteString( "Dado un cilindro de dimensiones:" );
   WriteLn;
   WriteString( "radio = 1,5 y altura = 5,6" );
   WriteLn;
   WriteString( "su área es igual a: " );
   WriteReal( 2.0*3.141592*1.5*(1.5+5.6), 15 );
   WriteLn;
   WriteString( "y su Volumen es igual a: " );
   WriteReal( 3.141592*1.5*1.5*5.6, 15 );
   WriteLn;
END Cilindro.
 
La ejecución del programa produce el siguiente resultado:
 
Dado un cilindro de dimensiones:
radio = 1,5 y altura = 5,6
su área es igual a: 0.669159088E+2
y su volumen es igual a: 0.395840568E+02
 
En este ejemplo se ha renunciado ya a marcar expresamente los espacios en blanco impresos por el programa, para facilitar la lectura de los resultados.

Curso de Filosofía elemental (21)

ETICA
 
 
 
 
XXII
 
La ética
 
 
 
112. NOCIÓN ETIMOLÓGICA DE LA ÉTICA
 
  La palabra ética procede de la voz griega ethos, que significa:
 
   a) Caracter, modo de reaccionar, conjunto de sentimientos, ideas, hábitos y creencias que distinguen a un hombre; esto es, su actitud ante la vida. Así se decía de los héroes y personajes de la tragedia antigua que tenían un ethos, es decir, un principio directivo de sus actos que otorgaban a éstos un sentido profundamente personal.
 
   b) Costumbre. Esta segunda acepción puede considerarse derivada por traslaión de la anterior. En efecto: en toda sociedad de hombres domina un conjunto de creencias, de ideas y de sentimientos, un ethos o carácter general, que inspira el modo más común de obrar dentro de ella. Este modo habitual y general de obrar de los hombres de una sociedad se llama costumbre. La costumbre en la sociedad es como el hábito en el individuo, algo que se hace fácil y casi insconscientemente por la repetición de los actos.
  
   La costumbre se llama en latín mos; de aquí el nombre de moral, con que también se designa a esta ciencia filosófica. Las costumbres –las sanas y antiguas costumbres, por cuya conservación se preocupaban los antiguos– era y son consideradas como norma visible de conducta, del bueno y recto obrar.
   La ética (o moral) no es, sin embargo, un mero estudio descriptivo de las costumbres vigentes en la sociedad, sino que trata de las buenas costumbres en lo que tienen de buenas o rectas, o, más exactamente, de aquello que les hace ser buenas, que es lo mismo que hace buenas a las acciones y actitudes de los hombres individualmente considerados.
 
 
113. LA ÉTICA COMO CIENCIA DE LA MORALIDAD DE LOS ACTOS HUMANOS
 
   El hombre, como hemos dicho, no se limita a conocer por los sentidos y por la razón, sino que además reacciona sobre lo conocido, y actúa, obra sobre el mundo que le rodea. De modo parecido a cómo los pensamientos, para ser correctos, deben atenerse a unas normas que estudia la lógica, y para ser verdaderos deben reflejar la realidad conocida, así también los actos humanos, para ser rectos o morales, deben responder a una norma o ley que rige la vida del hombre, y dirigirse al bien, es decir, a lo que puede y debe ser rectamente querido por la voluntad. La ética o moral será aquella parte de la filosofía (filosofía práctica) que estudia el obrar humano en cuanto a las normas y fines que determinan su rectitud.
   El objeto de una ciencia es algo que al propio tiempo puede ser estudiado por otras ciencias. A esa realidad de que trata una ciencia se llama, como sabemos, su objeto material; pero cada ciencia estudia su objeto desde su propia perspectiva o punto de vista, en lo cual consiste su objeto formal. La ética tiene como objeto material los actos humanos (y las costumbres, que de ellos emanan), y como objeto formal, la moralidad de esos actos humanos, es decir, su adecuación o inadecuación con la norma moral.
   Sin embargo, la ética no es una ciencia puramente deductiva que, a partir de la idea de bien, pueda extraer todas las normas morales. Debe partir, ciertamente, de principios generales, pero debe también tener en cuenta la naturaleza del sujeto humano que obra, su modo de obrar y las condiciones de sus actos. De aquí sus relaciones con otras ciencias filosóficas, especialmete la metafísica y la psicología.
 
 
114. RELACIONES CON LA METAFISICA
 
   La ética, por cuanto estudia la educación o inadecuación de los actos humanos a su norma de licitud, esto es, su moralidad, no puede dejar de fundamentarse en los principios de la metafísica, que es la ciencia del ser y de sus relaciones generales. Si la conducta que se ajusta a la ley moral es aquella que conduce al hombre hacia su fin o hacia su bien, su conocimiento exigirá poseer previamente una doctrina acerca del fin o del bien del hombre y de su conexión dentro del mundo, doctrina que nos es suministrada precisamente por la metafísica.
   En rigor, la ética es una parte o aplicación de la metafísica, por cuanto ésta estudia el ser, las distintas clases de seres y las relaciones entre los mismos. La noción de bien que maneja la ética se apoya en el concepto de ser, que es objeto de la metafísica. El bien es el mismo ser, en cuanto que puede perfeccionar a otro ser y resultar apetecible o deseable para él. De los seres, sólo Dios, que es plenitud y acto puro, carece de tendencia y de movimiento: nada puede perfeccionarlo, puesto que El es la perfección absoluta. Pero los demás seres, que contienen en sí mezcla de acto y potencia –de ser y de no ser–, tienden naturalmente hacia su propia plenitud a través de los seres que los perfeccionan, que son su bien. Los seres, dentro del orden del Universo, están relacionados unos con otros de forma tal que se perfeccionan o complementan mutuamente. En rigor, todas las cosas, en cuanto al ser que tienen, pueden perfeccionar a algún otro ser y resultar para él deseables. De aquí que la noción del bien sea tan extensa y universal como la de ser (todo ser es bueno, es decir, deseable). Bien es así el mismo ser con relación a algo o alguien que lo apetezca y al que perfeccione.
   Pero los seres de la Naturaleza tienden hacia su propio bien o perfección de muy distinta manera. Los seres de la Naturaleza no viviente tienden de un modo ciego, inconsciente, en virtud de tendencias naturales impresas en su ser (así la caída de los graves o las afinidaes químicas de los cuerpos, etc.). Los seres vivientes dotados de conocimiento (los animales) tienden hacia lo que les perfecciona o conviene de un modo consciente, pero no reflexivo; es decir, conocen lo que les perfecciona y se sienten atraídos por ello, pero desconocen las razones de apetibilidad, es decir, el por qué aquello les conviene. El ser racional (el hombre), en fin, tiende de un modo no sólo consciente, sino reflexivo o racional; conoce no sólo la cosa apetecida, sino las razones por las que la cosa es deseable. En esta forma de tender racional o reflexivo radica, como vimos (núm. 82), la libertad o libre albedrío del hombre: dado que las cosas que rodean al hombre son, como toda criatura, una mezcla de ser y de no ser (son imperfectas), la razón humana capta los motivos y los contramotivos de deseabilidad, y así la voluntad no se halla determinada o impulsada necesariamente hacia un objeto determinado.
   La ética estudiará de este modo la cuestión de cómo la criatura racional y libre puede y debe utilizar el movimiento que hacia su plenitud o perfección tiene impreso en su ser, y que realizará libremente. De lo cual se deduce que la ética o moral no sólo no puede separarse de la metafísica, sino que viene a ser como su culminación, ya que trata del modo de tender rectamente o de perfeccionarse la criatura más consciente y perfecta de este mundo, que es la criatura racional.
   Según Santo Tomás, la Sagrada Teología trata de Dios, del movimiento en las criaturas hacia El, que es su bien último, y de Cristo, que es mediador en esta ascensión o camino de perfecció.
   Algunos moralistas pretenden que la ética pueda desarrollarse sin necesidad de la metafísica. La ética sería, según esta opinión, independiente de la metafísica, e incluso previa a ésta. Así: a) El positivismo moral, para el que la ética sería una simple descripción de las costumbres morales de los distintos pueblos. Sin embargo, esto no constituye una moral, sino sólo un capítulo de la etnografía. b) El intuicionismo ético, según el cual el conocimiento moral es independiente del previo saber racional sobre el ser, y se adquiere a través de un acceso propio y directo (no racional) –una intuición moral— que no precisa, por ello mismo, cimentarse en la metafísica ni relacionarse con ella. Característica de esta corriente en la escuela axiológica o teoría de los valores (Max SCHELER), para la que el valor moral se adquiere por una intuición o estimación emocional, ajena al conocimiento racional del ser.
 
 
115. RELACIONES CON LA PSICOLOGÍA
 
   La ética y la psicología tienen parcialmente un mismo objeto material; es decir, tratan de una misma realidad, que es la de los actos humanos. Decimos, sin embargo, que su objeto material coincide sólo parcialmente porque la psicología trata también de actos del hombre (y del animal) que no pueden ser objeto de consideración moral por no ser actos realizados racional ni libremente.
   Pero si ética y psicología coinciden en un mismo objeto material (los actos racionales y libres), se diferencian, en cambio, por su objeto formal o punto de vista desde el que cada una los considera. La psicología estudia esos actos como tales hechos psíquicos en su realidad natural (es decir, en su génesis, desarrollo y conexiones), al paso que la ética los considera en su relación con su bien o norma de su rectitud.
   La bondad o malicia de un acto –su moralidad– no es algo independiente o separable de su realidad psicológica, sino una cualidad del mismo acto. Pero cabe una consideración psicológica que prescinda del aspecto moral u ordenación del acto a su verdadero fin, como cabe también una consideración moral que prescinda de su aspecto psicológico natural.
   En todo caso, y dada esta coincidencia de objeto material, ha de comprenderse la importancia que para el estudio de la moralidad ha de poseer el previo conocimiento de la realidad psicológica de los actos. No puede valorarse moralmente un acto sin conocer su naturaleza psicológica, su génesis y el grado de racionalidad y albedrío que concurren en el mismo.
 
 
116. DIVISIÓN DE LA ÉTICA
 
   Suele dividirse a la ética en dos partes:
 
   a) Ética general, que tiene por objeto la esencia y fundamento del orden moral. En ella se estudia: el acto moral, el bien o fin último del hombre, la ley moral (o norma objetiva de moralidad), la conciencia moral (o norma subjetiva de moralidad) y los hábitos morales (virtudes y vicios).
 
   b) Ética especial. En ella se trata de la moralidad en las diversas direcciones en que se especifica la vida humana según los objetos de la misma. Se llama también doctrina de los deberes o deontología (deberes para con Dios, para con el prójimo y para con uno mismo).

Fundamentos de programación con Módula-2 (5)

 

Tema 2
Elementos Básicos de la
Programación Imperativa
 
 
 
En este tema se presenta un conjunto mínimo de elementos de un lenguaje de programación imperativo. Este conjunto se particulariza para el lenguaje Modula-2. Con los elementos presentados se podrán construir programas completos aunque con una estructura muy simple, ya que sólo pueden estar formados por una secuencia de sentencias. Para que estos primeros programas produzcan resultados, se introducen ya varios procedimientos de escritura simple.
 
El objetivo que trata de alcanzar este tema es permitir el desarrollo de programas completos desde el principio del curso. Estos programas se podrán realizar como prácticas con el computador de manera inmediata y directa.
 
 
2.1 Notación BNF
 
Un lenguaje de programación sigue unas reglas gramaticales similares a las de cualquier idioma humano, aunque más estrictas. Para la definición formal de dichas reglas sintácticas utilizaremos la notación BNF (Backus-Naur Form) basada en la descripción de cada elemento gramatical en función de otros más sencillos, según determinados esquemas o construcciones. Cada uno de estos esquemas se define mediante una regla de producción.
 
Estas reglas sobre cómo han de escribirse los elementos del lenguaje en forma de símbolos, que se denominan metasímbolos. Son los siguientes:
 
     ::=   Metasímbolo de definición. Indica que el elemento a su izquierda puede desarrollarse según el esquema de la derecha.
 
     |   Metasímbolo de alternativa. Indica que puede elegirse uno y sólo uno de los elementos separados por este metasímbolo.
 
     {}   Metasímbolos de repetición. Indican que los elementos incluidos dentro de ellos se pueden repetir cero o más veces.
 
     []   Metasímbolos de opción. Indican que los elementos incluidos dentro de ellos pueden ser utilizados o no.
 
     ()   Metasímbolos de agrupación. Agrupan los elementos incluidos en su interior.
 
Estos metasímbolos se escriben en el tipo de letra especial indiciado para distinguirlos de los paréntesis, corchetes, etc. que forman parte del lenguaje Modula-2. También se emplearán distintos estilos de letra para distinguir los elementos simbólicos siguientes:
 
     Elemento_no_terminal   Este estilo se emplea para escribir el nombre de un elemento gramatical que habrá de ser definido por alguna regla. Cualquier elemento a la izquierda del metasímbolo ::= será no terminal y aparecerá con este estilo.
 
     Elemento_terminal   Este estilo se emplea para representar los elementos que forman parte del lenguaje Modula-2, es decir, que constituyen el texto de un programa. Si aparecen en una regla deberán escribirse exactamente como se indica.
 
 
2.2 Valores y tipos
 
El computador, como máquina de tratamiento de información, manipula diferentes datos. Un dato es un elemento de información que puede tomar un valor entre varios posibles. Si un dato tiene siempre necesariamente un valor fijo, diremos que es una constante.
 
Los valores de los datos pueden ser de diferentes clases. En general un dato sólo puede tomar valores de una clase. Por ejemplo, la estatura de una persona no puede tomar el valor "Felipe", ni el nombre de una persona puede ser "175".
 
En programación a las distintas clases de valores se les denomina tipos. Un dato tiene asociado un tipo, que representa la clase de valores que puede tomar. Por ejemplo, son tipos diferentes:
 
  • Los números enteros
  • Los días de la semana
  • Los meses del año
  • Los títulos de libros
   …etc. …
 
Es importante destacar que el concepto de tipo es algo abstracto, e independiente de los símbolos concretos que se empleen para representar los valores. Por ejemplo, aunque podemos representar los meses del año mediante números enteros de 1 a 12, los meses no son números enteros, pues no tiene sentido, por ejemplo, sumar Enero (1) y Marzo (3) para obtener Abril (4).
 
Con más precisión se habla de tipos abstractos de datos, que identifican tanto el conjunto de valores que pueden tomar los datos de ese tipo como las operaciones significativas que pueden hacerse con dicho valores.
 
En la comunicación humana usamos habitualmente dos grandes clases de valores: los números y los textos. Los lenguajes de programación llevan incluidas formas de representación concretas de estas clases de valores, que se traducen en la existencia de tipos de datos predefinidos, ya incorporados al lenguaje, y que pueden usarse, en su caso, para representar también valores de otros nuevos tipos de datos definidos por el programador. Aunque en la práctica los números han de escribirse externamente en forma de texto para poder ser leídos por las personas, desde el punto de vista abstracto son valores de tipos diferentes a los de los caracteres que los representan.
 
 
2.3 Representación de valores constantes
 
Uno de los objetivos de los lenguajes de programación es evitar las ambigüedades o imprecisiones que existen en los lenguajes humanos. Por ejemplo, la representación de valores numéricos en los países anglosajones se realiza separando por comas (,) los millares. Así, trescientos cuarenta y ocho mil quinientos treinta y seis se representa de la siguiente manera:
 
                             348,536
 
Sin embargo, nosotros utilizamos la coma para separar la parte entera de la parte decimal de un número no entero. Por lo tanto, la interpretación con esta regla del número anterior sería: trescientos cuarenta y ocho con quinientas treinta y seis milésimas.
 
A continuación se indican las reglas particulares de Modula-2 para la representación de valores básicos, tanto numéricos como de texto.
 
 
2.3.1 Valores numéricos enteros
Los valores entero representan un número exacto de unidades, y no pueden tener parte fraccionaria. Un valor entero se escribe mediante una secuencia de uno o más dígitos del 0 al  9 sin separadores de ninguna clase entre ellos y precedidos opcionalmente de los símbolos más (+) o menos (-). Son enteros válidos los siguientes:
                       2
                       +56
                       0
                       -234567745
                       1000000000
 
Sin embargo, no son valores enteros válidos los siguientes:
               123,234    No se pueden insertar comas
               22.56       No se pueden insertar puntos
               13E5        No se pueden usar letras
 
Usando la notación BNF podemos representar de manera precisa las reglas para escribir estos valores:
 
              valor_entero ::= [ + | ] secuencia_dígitos
              secuencia_dígitos ::= dígito { dígito }
              dígito ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
 
 
2.3.2 Valores Numéricos Reales
Los valores numéricos reales permiten expresar cualquier cantidad, incluyendo fracciones de unidad. Se pueden representar de dos maneras distintas: en la notación decimal habitual, o en la notación científica. En la notación decimal habitual un valor real se escribe con una parte entera terminada siempre por un punto (.), y seguida opcionalmente por una secuencia de dígitos que constituyen la parte fraccionaria decimal. De acuerdo con ello son valores reales válidos los siguientes:
 
                  5.
                  -0.78
                  +234.53
                  0.0000000034
                  1234.000
 
En la notación científica un número real se escribe como una mantisa, que es un número real en la notación decimal habitual, seguida de un factor de escala que se escribe como la letra E seguida del exponente entero de una potencia de 10 por la que se multiplica la mantisa. Son valores reales válidos en notación científica:
 
                -23.2E+12           equivalente a -23,2 por 10 elevado a 12(10^12)
                14567.823E4        equivalente a 14567,823 x 10^4         
                126.E-34             equivalente a 126×10^-34(diez elevado a menos treinta y cuatro)
 
Sin embargo, no son valores reales válidos los siguientes:
 
                  .234        Se necesita al menos un dígito en la parte entera
                  4,78        No se pueden insertar comas
                  56.7F-56  No se puede usar la letra F
 
A diferencia de los valores enteros, un mismo valor real puede tener muy diversas representaciones válidas. Por ejemplo:
 
     45.6      456.E-1        4.56E+1       45.60E+0         456000.00E-4
 
representan todos el mismo valor.
 
Las reglas anteriores, expresadas en notación BFN son:
 
         valor_real ::= valor_entero . [ secuencia_dígitos ] [ escala ]
         escala ::= E valor_entero
 
 
2.3..3 Caracteres
Además de los valores numéricos enteros o reales, empleados para la realización de cálculos numéricos, los lenguajes de programación nos deben permitir representar valores correspondientes a los caracteres de un texto, y que están disponibles en cualquier teclado, pantalla o impresora.
 
Dentro del texto de un programa en Modula-2 el valor de un carácter concreto se escribe poniendo dicho carácter entre apóstrofos (‘) o comillas ("). Ejemplos de valores de caracteres son los siguientes:
 
            ‘a’   ‘Ñ’   ‘7’   ‘?’   ‘.’   ‘ ‘   ‘"’  ‘}’
 
            "A"  "ñ"   "5"   "!"  ";"  " "  "’"  "{"
 
Es interesante hacer las siguientes observaciones:
 
  • el espacio en blanco (‘ ‘) es un carácter válido como los demás
  • hay que distinguir entre un valor entero de un dígito (p.ej. 7) y el carácter correspondiente a dicho dígito (p.ej. ‘7’)
  • el carácter apóstrofo sólo se puede representar entre comillas, y viceversa
La colección o juego de caracteres que pueden manipularse en un programa depende de la máquina que se esté usando. Sólo se pueden representar en la forma indicada aquellos caracteres que tengan asociado un símbolo gráfico (letra, dígito, signo de puntuación, etc.) que pueda introducirse en el texto del programa. Otros caracteres definidos, tales como los caracteres de control, que no tienen símbolo gráfico se representan mediante la notación CHR (código), tal como se indica en la sección 2.4.4.
 
 
2.3.4 Ristras de caracteres (Strings)
Es frecuente que los caracteres no se utilicen de forma aislada, sino formando palabras o frases. Una ristra o cadena de caracteres (en inglés string) se escribe como una secuencia de caracteres incluidos entres apóstrofos (‘) o comillas ("). Por ejemplo:
 
                ‘Palabra’
                "Este texto es una ristra de caracteres"
                "&"
                ‘El resultado de A+B es: ‘
                "Incluir entre ‘apóstrofos’ el texto"
                ‘Conteste "Si" o "No"’
                "¿ Año de fabricación ?"
                ""
 
Conviene observa que:
  • si una ristra incluye apóstrofos en su interior sólo se podrá escribir entre comillas, y viceversa
  • un valor de tipo carácter se representa igual que una ristra de un único carácter, aunque en realidad son valores de tipos diferentes (el compilador decide cómo interpretarlo)
  • es posible definir una ristra vacía que no contenga ningún carácter, como en el último ejemplo
Una ristra puede contener cualquier número de caracteres y puede incluir cualquier carácter alfabético o de puntuación que sea representable dentro del texto del programa. Aquí se aplican las mismas observaciones que se han hecho antes respecto al juego de caracteres particular de cada máquina.
 
 
2.4 Tipos predefinidos
 
Las diferentes formas de representación de valores constantes presentadas en los apartados anteriores distinguen ya varias clases de datos, pero que no llegan a ser tipos en sí mismos. En efecto, tal como vamos a ver a continuación, dentro de una misma clase de valores pueden distinguirse varios tipos diferentes, tanto a nivel de tipos predefinidos en el lenguaje, como en forma de tipos definidos por el programador.
 
Recordaremos que un tipo de datos define:
  1. una colección de valores posibles
  2. las operaciones significativas sobre ellos
En Modula-2 hay cinco tipos de datos predefinidos, que se designan con los nombres INTEGER, CARDINAL, REAL, BOOLEAN Y CHAR, así como mecanismos para definir nuevos tipos a partir de ellos. En diferentes versiones del lenguaje puede haber tipos predefinidos adicionales. En las secciones siguientes se describen los tipos predefinidos fundamentales, excepto el tipo BOOLEAN, que se describe más adelante.
 
 
2.4.1 El tipo INTEGER
Los valores de este tipo son los valores numéricos enteros positivos y negativos. Como tipo abstracto su definición coincide con el concepto matemático de los números enteros. Sin embargo en cada versión concreta del lenguaje los valores de este tipo se limitan a un cierto rango de valores que pueden manipularse con instrucciones básicas del lenguaje de máquina. El rango depende del computador concreto utilizado, pero siempre es simétrico en torno al valor cero. Dentro de dicho rango la representación de cualquier valor es exacta. Los rangos más comúnmente usados son los siguientes:
 
                               -32.768 … 0 … 32.768
                     -2.147.483.648 … 0 … 2.147.483.648
 
Estos rango obedecen a que los computadores suelen emplear 16 o 32 bits para la codificación en base 2 de los valores enteros. Para el signo del número se utiliza un bit, quedando, por tanto, 15 o31 para el valor absoluto:
 
                              2^15 = 32.768
                              2^31 = 2.147.483.648
 
Para facilitar la escritura de programas que tengan en cuenta la limitación particular de rango existe en cada máquina, Modula-2 permite hacer referencia al valor mínimo mediante la expresión MIN(INTEGER), y al valor máximo mediante MAX(INTEGER). El rango admisible sera, por tanto:
 
                 MIN(INTEGER) … 0 … MAX(INTEGER)
 
Asociadas al tipo INTEGER están las operaciones que se pueden realizar con los valores de este tipo. Las operaciones predefinidas entre valores enteros son las operaciones aritméticas básicas, que se realizan entre enteros y devuelven como resultado valores enteros. Para invocar estas operaciones se dispone de los siguientes símbolos de operación u operadores:
 
                 +         Suma de enteros:                  a+b
                 –         Resta de enteros:                  a-b
                 *         Multiplicación de enteros:        a*b
                 DIV      División de enteros:                a DIV b
                 MOD     Resto de la división:               a MOD b
 
                  +        Identidad de un Entero:                +a
                  –        Cambio de signo de un Entero:        -a
 
Siguiendo la representación aritmética habitual, los símbolos + y – tienen un doble significado, según se usen como operadores infijos entre 2 operandos o como operadores prefijos con un único operando.
 
El operador DIV realiza la división entre dos números enteros y obtiene como resultado el cociente entero truncado al valor más próximo a cero. Cuando el divisor es cero se obtiene como resultado un error. Por ejemplo:
 
              Operación                      Resultado
              10 DIV 3                        3
              (-20) DIV (-7)                2
              (-15) DIV 4                    -3
              17 DIV (-3)                    -5
              34 DIV 0                        Error
 
El operador MOD puede estar sólo definido para divisores positivos. El resultado es el resto de la división de enteros realizada con DIV. Por ejemplo:
 

              Operación                      Resultado
              10 MOD 3                        1
              (-20) MOD (-7)                -6 (o bien Error)
              (-15) MOD 4                    -3
              17 MOD (-3)                    2 (o bien Error)
              34 DIV 0                        Error
 
Entre los operadores DIV y MOD (cuando está definido) existe la regla aritmética habitual:
 
            Dividendo = Divisor x Cociente + Resto
 
que en Modula-2 se expresaría así:
 
            a = (a DIV b) * b + (a MOD b)
 
Cuando se realiza una operación con enteros se debe tener en cuenta el rango disponible en el computador que se esta utilizando. Si se produce un resultado fuera del rango del computador se producirá un error. En algunos computadores este tipo de errores no se indican y puede ser difícil su detección. Por ejemplo, para un rango entre -32.768 y 32.767, se obtienen los siguientes resultados:
 
              Operación                      Resultado
             234 + 89                        323
             345 * 97                        Error
             214 * (-203)                   Error
             15456 + 18678                Error
             (-20) – 32750                  Error
 
 
2.4.2 El tipo CARDINAL
Este tipo representa los valores numéricos enteros no negativos. La definición del tipo CARDINAL no es muy utilizada en la mayoría de los lenguajes. La razón de su incorporación en Modula-2 fue permitir la ampliación del rango de valores positivos en los computadores de 16 bits desde 32.767 has el doble, aprovechando el bit de signo (2^16). Sin embargo, actualmente con los computadores de 32 bits dicho artificio no está ya justificado. Por tanto, cuando el rango de enteros disponible sea amplio es aconsejable no utilizar datos de tipo CARDINAL sino emplear de forma exclusiva datos enteros.
 
En cualquier caso el rango depende del computador concreto que se utilice. La representación de los valores dentro de dicho rango es exacta como en el caso de los valores enteros. Los rangos habituales para los distintos computadores son los siguientes:
 
           0 … 65.535               (16 bits)
           0 … 4.294.967.295     (32 bits)
 
y en forma general el rango será:
 
           0 … MAX(CARDINAL)
 
donde MAX(CARDINAL) representa el valor máximo de los cardinales en el computador concreto utilizado.
 
Con la excepción de la operación de cambio de signo, que no tiene ningún sentido para los cardinales, el resto de las operaciones entre cardinales emplea los mismos operadores que para los números enteros. Esto es debido a que corresponden a las mismas operaciones aritméticas, aunque sobre diferente rango de valores.
 
Aunque los operadores son los mismos, las operaciones entre cardinales sólo pueden realizarse entre cardinales. Por tanto, se produce un error si se trata de ejecutar directamente una operación entre un dato de tipo INTEGER y otro de tipo CARDINAL.
 
 
2.4.3 El tipo REAL
Con este tipo se trata de representar en el computador los valores numéricos reales positivos y negativos. Sin embargo, al contrario que en el caso de los tipos INTEGER y CARDINAL, esta representación puede no ser exacta. Además, dado que la capacidad de los computadores es limitada, la representación sólo se puede considerar válida dentro de un rango.
 
Tanto el rango como la precisión dependen del computador concreto utilizado. Dentro de dicho rango para algunos valores concretos es posible una representación exacta. Sin embargo, dado el carácter discreto de los datos que siempre se manejan en un computador, nunca será posible una representación exacta de valores tales como los valores irracionales (pi) o e o, en general, de valores cuya precisión sea superior a la disponible en el computador que estemos utilizando. En estos casos se manejan valores aproximados.
 
Los valores reales suelen representar internamente en forma equivalente a la notación científica, con una mantisa y un factor de escala. El rango de valores representables está limitado tanto para os valores grandes como pequeños. Los valores más pequeños que un límite dado se confunden con el cero. Algunos de los rangos habitualmente empleados en los distintos computadores son los siguientes:
 
         -3.4E+38 … -1.2E-38   0   -1.2E-38 … +3.4E+38
                            (32 bits, precisión: 6 cifras decimales)
        -1.7E+308 … -2.3E-308   0   +2.3E-308 … +1.7E+308
                            (64 bits, precisión: 15 cifras decimales)
 
Estos rangos dependen del número concreto de bits y de la codificación que se emplean para la mantisa y el exponente del número REAL. En el primer caso no existe ningún valor intermedio entre -1.2×10^-38 y el valor 0, ni tampoco entre 0 y 1.2×10^-38 (análogamente en el segundo).
 
Asociadas al tipo REAL están las operaciones que se pueden realizar con él. Las operaciones entre valores reales son las operaciones aritméticas básicas, que se realizan entre reales y devuelven como resultado valores reales. Los correspondientes operadores son os siguientes:
 
    +          Suma de reales:                        a+b
    –          Resta de reales:                        a-b
    *          Multiplicación de reales:              a*b
    /           División de reales:                     a/b
   
     +          Identidad de un real:                  +a
     –          Cambio de signo de un real:          -a
 
Los símbolos empleados para estos operadores son los mismos que para los operadores enteros, salvo para la división. Sin embargo, en todos los casos son operadores distintos de los operadores enteros. Las operaciones entre reales dan como resultado un real con la precisión del computador. Así, para valores reales no se cumple siempre exactamente la relación básica:
                            (a/b)*b = a
 
y es importante tener en cuenta imprecisiones como ésta cuando los cálculos sean más complejos y se puedan acumular errores. Ejemplos de operaciones entre valores reales son las siguientes:
 
               Operación                                  Resultado
              10.5 / 0.2                                   52.5
              -20.6 * 2.4                                 -49.44
              -15.4E2 + 450.0                           -1090.0
              23.4 – 2E-1                                  23.2
 
La representación sólo aproximada de los valores reales se pone de manifiesto si tratamos de expresar con más precisión de la realmente existente el resultado de una operación. Por ejemplo:
 
              Operación                                  Resultado
              10.0 / 3.0                            3.33333332538604736E+0
 
En este caso concreto el valor es inexacto a partir de la 7ª cifra decimal. En cada máquina se podrá obtener un resultado ligeramente diferente.
 
 
2.4.4 El tipo CHAR
Este tipo incluye como valores todos los caracteres disponibles en un computador. La tabla de caracteres que habitualmente se adopta en la mayoría de los computadores se conoce como tabla ASCII. Esta tabla es fruto de un trabajo de normalización. Sin embargo, hay algunos computadores que no emplean esta tabla y siempre deben tener en cuenta las particularidades del computador en el que se esté trabajando.
 
En cualquier caso la tabla de caracteres, además de los caracteres alfabéticos, incluye caracteres numéricos, de puntuación, y puede incluir caracteres de control. Los caracteres de control, tales como el utilizado para provocar un salto de línea, no se pueden escribir. Para representar estos caracteres se utilizan la notación CHR(x) siendo x el código el carácter (equivalente a su posición dentro de la tabla de todos los caracteres). Por ejemplo, en ASCII:
 
CHR(10)    Representa el salto de línea. Posición 10ª de la tabla
CHR(13)    Representa el retorno de carro. Posición 13ª de la tabla
 
En sentido inverso, la posición que ocupa un determinado carácter c dentro de la tabla se expresa como ORD("c"). Por ejemplo:
 
ORD("A")    Vale 65 (65ª posición de la tabla ASCII)
ORD("Z")    Vale 90 (90ª     "          "          "       )
 
De forma inmediata se puede decir que, para cualquier carácter c, cuya posición sea x, se cumplirá que:
 
CHR(ORD("c")) = "c"
ORD(CHR(x)) = x
 
La mayoría de las tablas de códigos de caracteres poseen las siguientes características:
 
  • Los caracteres correspondientes a las letras mayúsculas de la "A" a la "Z" están ordenados en posiciones consecutivas y crecientes según el orden alfabético.
  • Los caracteres correspondientes a las letras minúsculas de la "a" a la "z" están ordenados en posiciones consecutivas y crecientes según el orden alfabético.
  • Los caracteres correspondientes a los dígitos del "0" al "9" están ordenados en posiciones consecutivas y crecientes.

Esto facilita el obtener por cálculo el valor numérico equivalente al carácter de un dígito decimal, o la letra mayúscula correspondiente a una minúscula o viceversa.

Curso de Filosofía elemental (20)

XX
 
Naturaleza y atributos de Dios
 
 
 
104. CONOCIMIENTO ANALÓGICO DE DIOS
 
   A través de las <<cinco vías>> tomistas o demostración a posteriori hemos llegado a la existencia de un Ser origen de cuanto existe –Dios– al que las mismas vías han caracterizado como Primer Motor, Causa Primera, Ser Necesario, Ser perfectísimo y Fin Último. Dado que por esas características se nos muestran tan sólo aspectos de su relación con el mundo creado, procede que ahora nos preguntemos: ¿Cómo será Dios en sí mismo, cuál su naturaleza?
   Ha habido autores, como sabemos (núm.99), que han negado la posibilidad de todo conocimiento sobre Dios, incluso sobre su existencia: éstos eran los agnósticos. Otros afirman que de Dios sólo podemos saber que es, que existe, pero nada sobre su esencia o naturaleza porque ésta se encuentra por encima de todos nuestros conceptos y ninguna noción puede alcanzar nuestro entendimiento sobre el ser de Dios. Tal fue la opinión PLOTINO (siglo II), que veía en Dios la suprema e incognoscible Unidad. Para otros, en fin, el saber sobre Dios es posible por la fe (fideistas) o por el sentimiento (modernismo), pero no por la razón.
   Sin embargo, en la medida en que nuestros conceptos sobre ser son analógicos (núm. 19), podemos establecer propiedades que, encontradas en los seres finitos con carácter de perfección positiva, han de hallarse también en la Causa de ellos, aunque de un modo especial. A partir del conocmiento de los seres finitos podmeos así elevarnos al conocimiento de los atributos de Dios por tres métodos distintos:
 
   A) El método de negación (vía negativa): Po él negamos de Dios todo lo que signifique imperfección en los seres de este mundo. Por ejemplo, la materialidad, o la memoria, que implica un ser sucesivo.
 
   B) El método de atribución (vía positiva): Por él aplicamos a Dios las perfecciones reales que encontramos en los seres creados (la vida, la bondad, el poder…).
 
   C) El método de sublimación (vía de eminencia): Por él elevamos a grado infinito esas mismas perfecciones que a El atribuimos.
 
   Sin embargo, la noción de Dios que obtenemos por estos métodos será siempre meramente analógica e impropia. A nuestra razón le parece, por ejemplo, que la misericordia infinita y la infinita jse excluyen mutuamente; es decir, que no pueden darse en un mismo sujeto. Sin embargo, en Dios no sólo han de ser compatibles, sino que deben coincidir hasta fundirse en una y sola realidad, ya que Dios es simple y no admite composición en su ser.
   Cabe entonces tratar de encontrar un fundamento a esas diversas perfecciones por las que nuestra mente se acerca al ser de Dios, esto es, alguna que sea como el origen y causa de las demás, lo que se llama en filosofía el constitutivo formal o esencia metafísica.
   Existen distintas teorías entre los teólogos sobre este problema del constitutivo formal de Dios. Según una, este constitutivo radica en la infinitud; para otra estriba en la aseidad, y para una tercera consiste en el entender subsistente.
   La primera teoría ha sido defendida principalmente por DUNS ESCOTO (1270-1308), figura cumbre de la escuela franciscana. Según él, la infinitud radical es la condición previa a cualquier otro atributo que pueda convenir a Dios, pues solamente en grado infinito puede serle atribuido a Dios cualquier perfección. Dios posee todos los atributos en grado infinito, precisamente porque es radicalmente infinito.  
   Puede objetarse, sin embargo, a Escoto que la infinitud no es un concepto radical ni algo sustantivo, sino que afecta a un sujeto previo. Primero concebimos a un ser; después de determinamos como finito o infinito. El motivo de que un ser sea finito (o infinito) no reside en la finitud o infinitud misma sino en alguna razón metafísica que lo afecte.
   La segunda teoría sostiene que la esencia de Dios reside en su aseidad; es decir, en que es un ser por sí mismo (a-se), a diferencia del ser de las demás cosas, que es ab alio (por tro); es decir, debido precisamente a que Dios les ha otorgado el ser y les mantiene en él. Mientras que la existencia de los seres creados se debe a que una causa distinta de ellos mismos les otorga el ser determinadamente a una esencia concreta (de forma tal que los seres finitos no tienen el ser por sí, sino por participación), la existencia de Dios se debe a sí misma, no depende de otro ser. Por ello, la mejor definición de Dios es, como dijimos, la que consta en el Génesis: Yo soy el que soy (el que es por sí mismo, no por otro). Esta doctrina de la  aseidad como constitutivo formal de Dios se encuentra en Santo Tomás de Aquino.
   La tercera teoría sostiene que la esencia de Dios reside en el entender subsistente. El entender es una actividad que resulta de la plenitud del ser en acto: a medida que un ser posee mayor perfección se aproxima más al entendimiento. Por ello la materia no puede entender, pues la materia es pura potencialidad, menor plenitud de ser. Ahora bien, en la medida en que todos los seres finitos tienen en su ser una mezcla de potencialidad, su entender es imperfecto y supone siempre una distinción entre el sujeto, que entiende, y la operación de enteder, así como entre ésta y el objeto etendido. Pero en Dios, que es acto puro, sin mezcla de potencia, el entender será también absoluto y pleno, sin estas distinciones. Por ello se dice que Dios es el entender subsistente (noesis noeseos, en la opinión de Aristóteles); es decir, un entender que no se apoya en un sujeto distinto ni se refiere tampoco a un distinto objeto, sino que subsiste en sí mismo, en una realidad pura y perfecta.
 
 
105. LOS ATRIBUTOS DIVINOS
 
   Las perfecciones o atributos divinos suelen dividirse en dos grupos:
 
   a) Atributos entitativos, que son aquellos que se refieren a Dios en tanto se le considera como esencia o ser en sí mismo.
 
   b) Atributos operativos, aquellos que se refieren a Dios en tanto se le considera como principio de actividad; esto es, como naturaleza.
 
   En realidad, la distinción entre la esencia y la naturaleza divina es sólo una distinción de razón, pues en Dios no cabe introducir una distinción semejante. Dada su simplicidad, la esencia y naturaleza, el ser y la actividad de Dios son exactamente la misma realidad. Pero en los seres finitos que nosotros conocemos hay una cierta distinción, y sobre ella nos apoyamos para organizar y clasificar nuestro conocimiento de los atributos divinos.
   Entre los atributos entitativos tenemos: la simplicidad, la infinitud, la unicidad y la eternidad.
   Los atributos operativos se dividen en dos grupos, según las operaciones sean inmanentes a Dios mismo (operaciones ad intra), o afecten a un término exterior (operaciones ad extra). Entre los primeros, la ciencia y la voluntad divinas. Entre los segundos, la creación, la conservación y la providencia del mundo, manifestaciones de la potencia o poder divino.
 
 
106. SIMPLICIDAD, INFINITUD, UNICIDAD, INMUTABILIDAD Y ETERNIDAD DE DIOS
 
   1.º La simplicidad: Dios es simple porque carece de composición no sólo de partes extensas que son propias del ser material, sino de dualidad de esencia y existencia (ya que su ser –o esencia– es precisamente existir); de composición de potencia y acto (ya que Dios es acto puro, sin mezcla de potencia o capacidad de ser); de composición de sustancia y accidente (ya que Dios es plenitud de ser a la que no puede añadirse o advenir –accidente– nada distinto de su mismo ser).
 
   2º. La infinitud: Dios no puede tener límites o fines (finitud); esto es, ha de ser infinito. La limitación procede en los seres creados de su esencia, que les constituye como un tipo determinado de ser y es raíz de sus posibilidades y tendencias, propias siempre de ese tipo de ser. Una segunda limitación procede –en los seres materiales– de la materia en que se realiza, que lo concreta o individúa. En Dios no existe ninguna de estas limitaciones, ya que no posee materia, y su esencia es el mismo existir, pleno, no condicionado o circunscrito a unas determinaciones esenciales. La infinitud de Dios no se ve contrariada por la existencia de un mundo de seres distintos de El (las criaturas), ya que éstas, creadas por Dios como veremos (producidas de la nada), de pende en todo su ser y actuar de El mismo.
 
   3º. La unicidad: Dios por ser simple ha de ser uno. Si hubiese varios dioses tendrían que distinguirse de algún modo; luego alguno de ellos debería tener algo de lo cual carecería el otro, lo que es incompatible con la infinitud divina.
 
   4º. La inmutabilidad: Por ser simple, Dios ha de ser inmóvil e inmutable. Al carecer Dios de potencia no puede moverse, ya que el movimiento es el tránsito de la potencia al acto. Moverse implica imperfección, caracer de algo.
 
   5º. La eternidad: Dios es eterno. La eternidad no es sólo una duración sin principio ni fin, sino también una duración en la cual no existen momentos que se suceden y pasan, sino que, en una pura compenetración, todo el ser es dado y vivido a la vez. BOECIO (480-524) definió la eternidad como <<interminabilis vitae tota simul et perfecta possesio>>
 
 
 
XXI
 
Dios y el mundo
 
 
 
107. DIOS Y EL MUNDO
 
   Concebimos a Dios como supremamente activo, pues por el método de atribución y de eminencia hemos de considrar la actividad vital como una perfección positiva de los seres que la poseen sobre los que carcen de ella. La vida de Dios no es, sin embargo, el tránsito de la potencia al acto (movimiento) de las criaturas vivas, sino una actividad espontánea e inmanente que se confunde con la esencia divina. Las operaciones vitales de Dios son las de los seres espirituales: entendimiento (ciencia) y voluntad.
   Cuando consideramos a Dios como actividad pura, potencia activa, Dios no se muestra como omnipotente, pues todo lo que no es contradictorio está sujeto al poder de Dios.
   La potencia divina respecto al undo se nos presenta según tres aspectos principales:
 
   a) Como creadora, en tanto que es la causa total del mundo, que ha producido de la nada.
  
   b) Como conservadora, en tanto que mantiene en la existencia al mundo que ha creado.
 
   c) Como providencial, en tanto que Dios no sólo presta a las causas del mundo la energía necesaria para que actúen, sin que también ordena a todos los seres y especialmente la vida del hombre dentro de un plan o fin general.
 
 
108. NOCIÓN DE CREACIÓN
 
   Las pruebas a posteriori de la existencia divina nos mostraron a Dios como Causa Primera, Primer Moto, etc., de los seres de nuestra experiencia. El mundo, pues, no existe por sí (es contingente), y tampoco puede haber brotado de la sustancia divina (panteísmo emanatista), porque tal hipótesis contradice la simplicidad del ser de Dios, y en su caso las cosas de este mundo tendrían los atributos de la divinidad. El mundo, en consecuencia, ha tenido que ser creado por Dios, esto es, producido por El de la nada (ex nihilo), sin materia alguna preexistente.
   La creación es un modo de causalidad, pero un modo de causar radical y absoluto, propio sólo de Dios.
   Mientras que las causas eficientes ordinarias ponen en la existencia a un ser que preexistía en potencia en un sujeto anterior –por lo cual la función de la causa eficiente consiste en hacer que lo que estaba en potencia pase al acto–, la causa eficiente creadora confiere la existencia a un ser que no preexistía potencialmente en ningún sujeto previo.
 
 
109. CONSERVACIÓN DEL MUNDO
 
   Entendemos por conservación el influjo constante de Dios sobre las cosas creadas por cuya virtud se mantienen éstas en la existencia. Podría pensarse que la permanencia de los seres depende del acto inicial de su creación por el cual Dios les confirió la existencia. Pero para ello sería necesario que los seres creados hubieran asumido la existencia com osu propia esencia (por sí), lo que los igualaría a Dios. Si los seres creados son radicalmente contingentes, esto es, s su existir es siempre exterior a su esencia (a aquello que son) y recibido de Otro, ha de resultarles necesaria una constante comunicación del ser que poseen por parte de Aquel que se lo ha conferido. La falta de acción conservadora por parte de Dios entrañaría la anquilación de la criatura; es decir, su retorno a la nada, de donde la acción creadora la sacó. Por esto se dice que la conservación es <<una creación continuada>>.
 
 
110. LA PROVIDENCIA DIVINA
 
   La providencia es la acción divina en cuya virtud Dios dispone que los seres de este mundo actúen dentro de la ley general que preside el mundo o Cosmos (Universo ordenado). No es lo mismo la providecia que la Ley divina. La Ley expresa la ordenación general del Cosmos; la providencia es el acto que impera o manda el cumplimiento de esa Ley.
   La providencia, como acto de la voluntad y del amor divinos, es eterna como Dios mismo, pero su realización se acomoda a la temporalidad o ser sucesivo de las criaturas. La providencia explica la posibilidad del milagro, que es una suspensión de las leyes naturales que rigen el Universo, excepción asequible al poder divino (no contradictoria) y ordenada al gobierno del mundo.
   De esta providencia, mediante la cual Dios gobierna al mundo, se destaca la providencia especial con que Dios ordena la vida de los hombres. Mediante ella, sin forzar su libertad o albedrío, dispone las circunstancias del modo más favorable para el cumplimiento de su destino y pra su salvación. SÉNECA, en la antigüedad romana, aun sin ser cristiano, admitió ya esta especie de tutela personal de Dios sobre la vida de cada hombre.
 
 
111. EL PROBLEMA DEL MAL EN EL MUNDO
 
   La providencia o gobierno de Dios sobre el mundo y sus criaturas plantea el problema teológico de la existencia del mal en el mundo. Si Dios ha querido desde la eternidad un orden del universo, ¿cómo será compatible el mal existente con su sabiduría y bondad infinitas? ¿Cómo permite Dios el mal siendo providente?
   A este problema, difícil para la mente humana, han dado los teólogos y filósofos diversas soluciones:
   La primera es suponer que el mal existe sólo en la mínima proporción indispensable para que resalte la máxima cantidad de bien posible. El mal sería para esta teoría como el fondo oscuro de un cuadro, necesario para que se aprecien en él la luz y los colores. Propuso esta teoría LEIBNIZ, bajo el nombre de <<optimismo universal>>. Según ella, este mundo será <<el mejor de los mundos posibles>>, y por eso ha sido elegido por Dios en su previsión. El mal, como condición del bien, sólo en apariencia podrá considerarse verdadero mal.
   Una segunda solución consiste en admitir la existencia del mal como realidad positiva, pero referir su origen, no a Dios, sino a un principio maligno en lucha con Dios. Es doctrina de ciertas religiones orientales (Zoroastro) y del maniqueísmo. Esta posición es absurda, porque atenta contra la omnipotencia divina y no se concilia con la infinitud y unicidad de Dios.
   Una tercera solución, en fin, admitirá la realidad del mal, pero no como entidad positiva, sino como una entidad privativa. Según esta solución, el mal existe; no es un mero elemento del bien conjunto. Pero no existe de un modo positivo, sino de un modo privativo: como privación de la perfección debida a un ser. Por consiguiente, Dios no es la causa del mal, pues Dios es sólo causa de lo que es, no de lo que no es. Pero el mal es eficaz, no por sí mismo, sino por el ser del que es como parásito. Por consiguiente, en la medida que el ser afectado de privaciones sea más poderoso, el mal será también más temible. De aquí que el mal moral sea una mutilación de consecuencias mucho más temibles que el mal físico. Si la providencia, con todo, permite estas privaciones es para ordenarlas a un bien superior; por ejemplo, el pecado es permitido en gracia a la libertad del hombre y a sus posibilidades libres de salvación.

Fundamentos de programación con Módula-2 (4)

 

1.6 Elementos de la programación imperativa
 
La mayoría de los lenguajes de programación actualmente en uso siguen el modelo de programación imperativa. Por esta razón se ha optado en este primer nivel de enseñanza de programación por seguir dicho modelo. El lenguaje de programación Modula-2 se utilizará en este libro (entradas de blog) como herramienta para desarrollar las ideas generales en ejemplos prácticos realizables en máquina. Modula-2 no se utiliza mucho, por el momento, en desarrollos reales, quizá por no ser un lenguaje definido como "estándar" por los organismos internacionales de normalización, pero presenta importantes ventajas para la enseñanza, por ser un lenguaje bien estructurado, permitir el uso real de programación modular de manera segura, permitir la implementación de tipos abstractos de datos, y ser un buen paso hacia el uso de lenguajes más evolucionados (y más complicados) como ocurre con el lenguaje Ada.
 
En el resto de este texto se irán desarrollando las ideas abstractas o generales de programación, junto con su realización en lenguaje Modula-2. Todo ello en el marco de la programación imperativa, cuyos elementos abstractos se describen a continuación.
 
1.6.1 Procesador, entorno, acciones
Al introducir el modelo de programación imperativa se ha definido un programa, de manera intuitiva, como una lista de órdenes o instrucciones que han de ir siendo ejecutadas por la máquina en el orden preciso que se indique.
 
La idea abstracta correspondiente al concepto físico de máquina es el procesador. Definiremos como procesador a todo agente capaz de entender las órdenes del programa y ejecutarlas.
 
El procesador es esencialmente un elemento de control. Para ejecutar las instrucciones empleará los recursos necesarios, que formarán parte del sistema en el cual se ejecute el programa. Por ejemplo, se necesitarán dispositivos de almacenamiento para guardar datos que habrán de ser utilizados posteriormente, o dispositivos de entrada-salida que permitirán tomar datos de partida del exterior y presentar los resultados del programa. Todos estos elementos disponibles para ser utilizados por el procesador constituyen su entorno.
 
Las órdenes o instrucciones del programa definen determinadas acciones que deben ser realizadas por el procesador. Un programa imperativo aparece así como la descripción de una serie de acciones a realizar en un orden preciso. Las acciones son la idea abstracta equivalente a las instrucciones de un programa real.
 
1.6.2 Acciones primitivas. Acciones compuestas
Las acciones que son directamente realizables por el procesador se denominan acciones primitivas. Estas acciones suelen ser bastante sencillas, incluso en el caso de programas descritos en lenguajes de programación simbólicos. Entender un programa descrito enteramente a base de acciones primitivas suele ser muy difícil, por el nivel de detalle con el que hay que analizar cada una de sus partes, y todas ellas en conjunto.
 
El planteamiento razonable de un programa complejo debe pasar por usar la idea de abstracción para limitar la complejidad de detalles al estudiar el programa en su conjunto. Es muy útil usar la idea de acción compuesta como abstracción equivalente a un fragmento de programa más o menos largo que realiza una operación bien definida.
 
La descripción de un programa en términos de acciones compuestas puede facilitar su compresión. Por supuesto, al desarrollar el programa habrá sido preciso describir o descomponer las acciones compuestas en otras más sencillas, hasta llegar finalmente a acciones primitivas, que son las que realmente podrá ejecutar el procesador. Las acciones compuestas son un elemento de descripción que facilita la comprensión del programa en su conjunto, o de partes importantes de él, pero no reduce el tamaño total del programa, que necesariamente deberá ser largo si se han de realizar operaciones complicadas.
 
1.6.3 Esquemas de acciones
Una acción compuesta consistirá, tal como se ha indicado, en la ejecución combinada de otras acciones más sencillas. La manera en que varias acciones sencillas se combinan para realizar una acción complicada se denomina esquema de la acción compuesta.
 
Una buena metodología de programación exige usar esquemas sencillos y fáciles de entender a la hora de desarrollar acciones compuestas. A lo largo de este libro (entradas de blog) se irán introduciendo los principales esquemas de programación imperativa, junto con recomendaciones para su aplicación en el desarrollo de programas.
 
En particular, la llamada programación estructurada sugiere el uso de tres esquemas generales denominados secuencia, selección e iteración, con los cuales (junto con la definición de operaciones abstractas) se puede llegar a desarrollar de forma comprensible un programa tan complicado como sea necesario.
 
 
1.7 Evolución de la programación
 
Las ideas sobre cuál es la manera apropiada de desarrollar programas han ido evolucionando con el tiempo. Ha habido diversos motivos para ello, que pasaremos a analizar brevemente.
 
1.7.1 Evolución comparativa Hardware/Software
Los primeros computadores eran máquinas extraordinariamente costosas, y con una capacidad que hoy día consideraríamos ridículamente limitada. Sin embargo en su momento representaban el límite en la capacidad de tratamiento de información, y hacían posible determinados trabajos de cálculo inabordables hasta entonces.
 
Como consecuencia de ello la finalidad principal de la programación era obtener el máximo rendimiento de los computadores. Los programas se escribían directamente en el lenguaje de la máquina, o a lo sumo en un lenguaje "ensamblador" en que cada instrucción de máquina se representaba simbólicamente mediante un código nemotécnico para facilitar la lectura del programa.
 
No existían ideas abstractas sobre el significado u objetivo preciso de un programa. Simplemente se consideraba que el mejor programa era el que realizaba el trabajo en menos tiempo y usando el mínimo de recursos de la máquina. La programación era, por tanto, una labor artesana, basada en la habilidad personal del programador para conseguir que el programa cumpliera con esos objetivos de eficiencia, para lo cual era imprescindible conocer en detalle el funcionamiento interno del computador, y poder así emplear ciertos "trucos" de codificación que permitían ahorrar algunas instrucciones o usar menos elementos de memoria para almacenar datos intermedios.
 
El costo de desarrollo del software resultaba, en todo caso, muy inferior al costo del equipo material (hardware), por lo que pocas personas se paraban a considerar las posibilidades de reducir los costos de desarrollo de programas.
 
Por otra parte, y dada la limitación de capacidad de las máquinas, los programas eran necesariamente sencillos, en términos relativos, y se consideraba que podían llegar a depurarse de errores mediante ensayos o pruebas en número suficiente.
 
Los avances en la tecnología electrónica han ido suministrando computadores cada vez más capaces y baratos, en términos relativos. La necesidad de preparar sistemáticamente programas muy eficientes ha ido disminuyendo, y poco a poco se ha ido haciendo rentable utilizar programas no tan eficientes.
 
La mayor capacidad de los computadores ha permitido abordar aplicaciones cada vez más complejas. En los primeros computadores el software de una aplicación podía contener algunos cientos o quizá miles de instrucciones. En la actualidad las aplicaciones consideradas sencillas tienen decenas de miles de instrucciones, y en aplicaciones de gran envergadura, tal como los grandes proyectos aeroespaciales, el volumen del software desarrollado se cuenta por millones de instrucciones.
 
Con estos volúmenes de programa el costo del desarrollo del software supera ampliamente al costo de los equipos hardware utilizados. Ya no tiene sentido dedicar un gran esfuerzo a conseguir programas eficientes. Es más barato desarrollar programas relativamente más simples, aunque no aprovechen muy bien los recursos de la máquina, y comprar un computador de mayor potencia de proceso que compense esa posible falta de eficiencia. Los lenguajes de programación simbólicos han facilitado extraordinariamente las tareas de programación, al poder invocar en un programa operaciones cada vez más complejas como acciones primitivas. De esta manera se reduce el volumen total del programa medido en número de instrucciones, que ahora pasan a ser sentencias del lenguaje simbólico.
 
1.7.2 Necesidad de una buena metodología
Los programas actuales son tan complicados que ya no es posible desarrollarlos de una manera artesanal. Es necesario aplicar técnicas de desarrollo muy precisas para controlar el producto obtenido. Ya se ha indicado que estas técnicas aplicables a proyectos desarrollados en equipo constituyen la ingeniería de software.
 
A nivel individual hay que promover el empleo de una metodología de programación apropiada, que satisfaga los objetivos de corrección y claridad mencionados anteriormente. Para aplicaciones grandes la claridad se convierte en un objetivo prioritario, ya que resulta imposible analizar y modificar un programa si no se comprende suficientemente su funcionamiento.
 
Para facilitar la obtención de programas correctos, sin fallos, se recomienda el empleo de técnicas formales, que permitan en lo posible garantizar la corrección del programa mediante demostraciones lógico-matemáticas, y no mediante ensayos en busca de posibles errores. La técnica de ensayos solo resulta útil si consigue descubrir fallos, pues así demuestra que el programa contiene errores que hay que corregir, pero es más bien inútil si no se descubre ningún fallo, porque eso no garantiza que el programa no contenga errores, los cuales pueden manifestarse (y lamentablemente se manifiestan con harta frecuencia) cuando el programa ya está en explotación, y los usuarios lo emplean en multitud de situaciones nuevas que no habían sido ensayadas nunca.

Curso de Filosofía elemental (19)

XIX
 
La causa primera
 
 
 
98. DEMOSTRABILIDAD DE LA EXISTENCIA DE DIOS
 
   Las causas eficientes que obran en la naturaleza, si bien actúan o causan de una manera real o efectiva, dependen, sin embargo, de otra causa para ser y para obrar. Así, por ejemplo, el crecimiento de las cosechas depende (en parte) de las lluvias caídas sobre los campos; éstas, de la formación de las nubes; éstas, de la consensación del vapor, el cual procede de la evaporación de los mares, etc. Esto nos revela que todas las causas que actúan en el mundo tienen el carácter de causas segundas, es decir, de causas causadas, y que todas las cosas que obran son contingentes (o no tienen en sí mismas la causa de su ser).
   Es preciso entonces buscar una Causa Primera, causa de sí misma, que explique el ser de cuanto es y la actuación de todas las causas segundas que en sucesión o en simultaneidad obran en el mundo.
   Si lo que conocemos es, ante todo, las cosas finitas, y si éstas no tienen en sí mismas su causa o razón de ser, será necesario que exista una causa o razón suprema. Si esta causa fuera incognoscible o si no existiera, habría que declarar fracasada la empresa humana de saber y la Filosofía como ciencia de las causas últimas.
 
 
99. AGNOSTICISMO. ONTOLOGISMO. FIDEÍSMO
 
   La búsqueda de una Causa Primera que explique el ser y el obrar contingentes de todas las cosas de este mundo es precisamente la búsqueda de Dios, puesto que por Dios entendemos el ser que es causa de sí mismo y origen primero de cuanto existe.
   Sobre el problema de la existencia de Dios ha habido distintas posiciones entre los filósofos a lo largo de los tiempos.
 
   a) Algunos –muy escasos en la historia del pensamiento– niegan la posibilidad de su existencia. Son los llamados ateos. Quizá los más característicos de la historia san los modernos marxistas. Una forma especial de ateísmo es el panteísmo, que identifica a Dios con el conjunto del Universo y le niega un carácter personal y distinto del mundo. Tal es el caso de ESPINOSA (siglo XVII), que ya conocemos, y de los antiguos estoicos.
 
   b) Otros autores declaran que Dios es incognoscible, es decir, que nada podemos saber de su existencia. Son éstos los agnósticos, que no niegan que Dios exista, sino sólo el que podamos llegar a su conocimiento. Cabe citar entre ellos a KANT y a los antiguos epicúreos.
 
   c) Un tercer grupo de pensadores –el más extenso– afirma que Dios existe, y que de algún modo podemos conocerle. Pero entre ellos hay también distintas posiciones:
 
   1ª. Algunos sostienen que a Dios se le conoce de un modo directo, inmediato: que Dios se hace patente a nuestra experiencia. Son éstos los ontologistas (MALEBRANCHE, GIOBERTI, ROSMINI, entre otros). Para ellos no es precisa una demostración racional de la existencia de Dios, puesto que basta una mostración de lo que es por sí mismo evidente.
 
   2ª. Otros, los fideístas, creen que a Dios se puede llegar con fe, pero no por la razón. La fe es para ellos un modo de saber, pero no racional ni basado en la razón, sino completamente ajeno a ella. Cabe citar entre éstos a DANIEL HUET (siglo XVII) y a las corrientes que dan a la fe una fundamentación afectia o sentimental (siglo XIX).
 
   3ª. Otros, en fin, afirman que Dios no es evidente (en esta vida), pero tampoco es inasequible para la razón. Según ellos, la existencia que Dios es demostrable racionalmente. Tal es la posición ortodoxa católica. Si Dios fuera evidente (como para los ontologistas), la fe carecería de todo mérito moral; si fuera inasequible a la razón (como para agnósticos y fideístas), la teología no podría ayudarse de la razón ni ésta nos conduciría a la verdadera causa de las cosas.
 
 
100. DEMOSTRACIÓN DE LA EXISTENCIA DE DIOS
 
   Dos tipos de argumentos o demostraciones se han propuesto para demostrar la existencia de Dios: el llamado argumento a priori u ontológico, y las pruebas a posteriori. (A priori y a posteriori quiere decir antes o después de la experiencia real de las cosas.) El primero, como veremos, pretende demostrar la existencia de Dios sin más que analizar la idea de Dios, antes o aparte de toda experiencia, lo mismo que puedo demostrar que los ángulos de un triángulo vales dos rectos sin más que analizar la noción de triángulo. Los segundos llegan a Dios a partir de la experiencia de las cosas reales, que exigen la existencia de una Causa.
 
 
101. CRÍTICA DEL ARGUMENTO ONTOLÓGICO
 
   El argumento más audaz y de mayores pretensiones demostrativas que se ha concebido fue el llamado ontológico, que propuso en el siglo XI SAN ANSELMO DE CANTERBURY. Pretende demostrar la existencia de Dios basándose en el mero análisis de la idea de Dios.
   El argumento, en resumen, es como sigue:
   Poseemos la idea de un ser que reúne en sí todas las perfecciones, un ser mayor que el cual no puede pensarse otro. Esta idea la posee todo hombre; no es contradictoria (como sería <<círculo cuadrado>>, por ejemplo), porque incluso el <<insensato>> que dice <<Dios no es>>, entiende lo que quiero decir cuando digo Dios; él lo niega, <<no en su mente, sino en su corazón>>. Una cosa es existir en la mente y otra existir en la realidad; pero aquel ser que exista en la mente y en la realidad será mayor, más perfecto, mayor que el cual no puede haber otro, ese ser tiene que existir, so pena de ser un concepto contradictorio; si ese ser más perfecto no existiese, sería y no sería a la vez el más perfecto, lo que encierra contradicción.
   Este argumento impresiona por el rigor cuasi matemático con que pretende demostrar la existencia de Dios deduciéndola de su esencia. Sin embargo, no le faltaron contradictores en su misma época, y posteriormente otros filósofos (entre ellos SANTO TOMÁS) lo rechazaron como no concluyente. Su defecto estriba en considerar a la existencia como una perfección más de la esencia, cuando en realidad es algo radicalmente distinto, que no puede deducirse de ella. La esencia de un ser es la misma si existe que si es meramente posible o imaginario. El fondo metafísicoque lleva a San Anselmo a admitir este argumento es su creencia en las ideas como anteriores y superiores a las cosas mismas; esto es, en que la realidad se rige por la idea, y no la idea por la realidad.
   El monje GAUNILÓN, contemporáneo de San Anselmo, objetó ya el argumento ontológico; según él, sólo demuestra la idea de Dios, pero no a Dios mismo. SANTO TOMÁS, por su parte, señaló en tal argumento una trasposición ilícitade la suposición ideal a la suposición real del término Dios. En la Modernidad la existencia de Dios es muy semejante al de San Anselmo. KANT, más tarde, lo criticó haciendo ver cómo <<diez táleros (el taler es una moneda) reales no son más que diez tálero imaginarios>>. Esto es: no tienen más ni menos perfecciones, más ni menos céntimos. Simplemente, los táleros reales están puestos en la experiencia, y los imaginarios, no. La existencia no es una perfección más de la esencia, sino algo distinto.
   En resumen, el argumento ontológico es rechado por casi todos los filósofos en razón de que nosotros no adquirimos las ideas por contemplación o iluminación directa, sino a través de la experiencia y mediante un proceso de abstracción. No podemos, por tanto, deducir la existencia de la esencia, puesto que es la esencia la que obtenemos de la existencia.
 
 
102. LAS "CINCO VÍAS" TOMISTAS
 
   Si el argumento a priori para demostrar la existencia de Dios no resulta concluyente, dado que nuestro conocimiento arranca siempre de las cosas sensibles existentes, habremos de atenernos a las pruebas llamadas a posteriori que parten de lo que existe (de la experiencia) y a través de su análisis concluyen la necesidad de que Dios exista.
   SANTO TOMÁS DE AQUINO redujo a cinco los argumentos a posteriori para probar la existencia de Dios. Desde entonces estos argumentos se conocen por las cinco vías.
   Cada uno de los argumentos o vías consta de tres premisas distintas y una conclusión.
   Todas ellas parten de la consideración de las cosas creadas y existentes (por ello son vías a posteriori). Pero en las cosas creadas –o sea, en el mundo– se pueden considerar aspectos distintos, cada uno de los cuales sirve de base para una diferente vía:
 
Primer argumento o prueba de movimiento:
 
   a) Es patente (patet, dice SANTO TOMÁS) que las cosas que nos rodean se mueven, cambian. Al hablar de movimiento en filosofía no se trata sólo del movimiento local o cambio de lugar en el espacio, sino también del cambio cuantitativo (aumento o disminución), del cambio cualitativo (variación en los otros accidentes de un ser cuya sustancia permanece), o del cambio sustancial (en el que brota una nueva sustancia de una materia preexistente).
 
   b) Pero todo lo que se mueve es movido por otro; es decir, nada se comunica el movimiento a sí mismo, al menos de un modo radical o absoluto. Si hemos dicho (núm. 56) que moverse o cambiar es pasar de la potencia al acto, esto es, adquirir un modo de ser que no se tenía todavía, resultará evidente que nada puede otorgárselo a sí mismo, puesto que nada da lo que no tiene. Pensar cosa distinta negaría el principio de razón suficiente y aun el de identidad (núm. 40).
 
   c) No cabe, por otra parte, suponer una serie o cadena infinita de motores sucesivos. Ello supondría la no existencia de un primer motor; pero, por lo mismo, también la de un segundo motor, y la de un tercero…, y la de éste que estamos viendo aquí moverse. Una serie infinita de móviles que se muevan por otro igualmente movido es tan inexplicable como un móvil solo.
 
   d) Luego ha de llegar a un Primer Motor Inmóvil, origen último de todo movimiento, acto puro, que es a lo que llamamos Dios.
 
Segundo argumento o prueba de la causalidad:
 
   a) Es patente en la experiencia que nos rodea un orden de causas eficientes, del que resulta que unos seres son causas (es decir, influyen con su acción en la producción) de otros.
 
   b) Pero toda causa es, a su vez, causada, puesto que no es causa de sí y depende en su ser y existir de otra causa superior.
 
   c) Y no cabe tampoco remontarse a una cadena infine de causas, porque, no habiendo una causa primera, no habrá tampoco una causa segunda…, ni ésta que vemos aquí ejerciendo su influjo causal.
 
   d) Luego es preciso admitir una Causa Primera, causa de sí o causa incausada, a la cual llamamos Dios.
 
Tercer argumento, o prueba de la contingencia:
 
   a) Cuantos seres nos rodean se nos presentan como contingentes; es decir, con una esencia a la que no repugna el no existir, puesto que vemos cómo se producen y se corrompen, nacen y mueren. Contingente es lo que existe, pero podría no existir; que no se explica por sí. El ser contingente existe, tiene existencia; tiene también esencia, pues se diferencia de los demás seres. Pero no existe por virtud de su esencia; ésta es indiferente para existir o no, exige la existencia.
 
   b) Pero los seres contingentes, que no encuentran en sí la razón de su existir, deben encontrarla en otro ser distinto de ellos mismos.
 
   c) Y no cabe suponer una serie infinita de seres contingentes, razón de ser unos de otros. Pues tal serie resultaría tan contingente como un ser sólo y tan necesitada de razón de ser.
 
   d) Luego es preciso admitir un Ser Necesario, que exista por sí, para explicar la existencia de cada ser contingente y de la suma de ellos.
 
Cuarto argumento, o prueba de los grados distintos de perfección:
 
   a) Es manifiesto que los seres que nos rodean ofrecen perfecciones concretas en mayor o menor grado. Unos posee mayor bondad, belleza, inteligencia, etc., que otros.
 
   b) Pero los grados de perfección no se conciben ni explican sino por referencia a una perfección absoluta en su género, esto es, la Bondad, la Belleza o la Inteligencia absolutas, de las que aquellas perfecciones parciales y relativas participan.
 
   c) Pero tales perfecciones en su grado infinito se incluyen e identifican en un Ser Supremo infinitamente perfecto.
 
   d) Luego ha de existir ese ser Perfercción suma e infinita, al cual llamamos Dios.
 
Quinto argumento, o prueba de las causas finales:
 
   a) Otro aspecto, en fin, que nos ofrece la realidad de las cosas naturales es el de un conjunto ordenador de seres que tienden unos a otros según un principio de finalidady armonía.
 
   b) Pero toda tendencia ordenada requiere un fin o causa final, al cual se ordena y dirige.
 
   c) Y no cabe tampoco proceder al infinito en la cadena de los fines, puesto que, si no hubiera un fin supremo, no existirían fines medios ni éste que vemos ejercer aquí su atractivo finalista.
 
   d) Luego ha de existir un Fin Supremo, razón y origen de todo orden y tendencia, al cual llamamos Dios.
 
   La cuarta vía, referente a los grados de perfección, responde a una inspiración agustiniana y platónica que no está nunca ausente del pensamento tomista, aunque predomine en él la concepción aristotélica. Aparecen en ella las perfecciones del mundo como lejana participación o rastro de la Perfección divina, con rasgos o huellas que nos elevan, por vestigio y por imagen, a la contemplación de Dios.
   La quinta vía, aunque no conlleva una certeza absoluta o metafísica en su premisa mayor, es quizá la que más inmediatamente convence al sentido común humano. No puede negarse –es cierto– que el mundo en que vivimos, la disposición de sus elementos y de sus fuerzas, es una de las innumerables combinaciones posibles dentro de un puro azar combinatorio. Pero si rechazaríamos como irreal la hipótesis de que cualquiera de los objetos manufacturados que nos rodean se hubiera formado por modo fortuito, nos resultaría infinitamente más inconcebible la génesis no teleológica (o finalista) de un universo como el nuestro, cuya armonía y flexible ordenación aparece desde el más pequeño al más amplio de sus elementos.
 
 
103. PRUEBA DE LA CONTINGENCIA. SU VALOR ESPECIAL
 
   De las cinco vías o pruebas tomistas, la tercera tiene un valor especial, porque parte de reconocer a las cosas de este mundo –y a nosotros con ellas– como contingentes, es decir, como indiferentes para existir o no existir, y necesitados, por lo tanto, de una causa necesaria. Y nos eleva a la noción de Dios como distinto del mundo y Ser por sí mismo (a se), lo que coincide con la definición que Dios dio de sí mismo a Moisés: <<Yo soy el que soy>> (el que es por si mismo, a diferencia de los demás seres, que son por otro).

Fundamentos de programación con Módula-2 (3)

 

1.5 Modelos abstractos de cómputo
 
Los lenguajes de programación permiten describir programas o cómputos de manera formal, y por tanto simbólica y rigurosa. La descripción se hace, naturalmente, basándose en determinados elementos básicos y formas de combinación de estos elementos simples para construir programas tan complicados como sea necesario.
 
Existen muchísimos lenguajes de programación distintos, unas veces difieren en aspectos generales, y otras simplemente en detalles. Si analizamos estos lenguajes podremos observar que muchos de ellos utilizan elementos básicos y formas de combinación similares, aunque representándolos con símbolos diferentes.
 
Si de un conjunto de lenguajes de programación basados en elementos computacionales similares extraemos los conceptos comunes, obtendremos un modelo abstracto de cómputo. Este modelo abstracto recoge los elementos básicos y formas de combinación en forma abstracta, prescindiendo de la notación concreta usada en cada lenguaje de programación para representarlos.
 
Existen diversos modelos abstractos de cómputo, o modelos de programación, que subyacen en los lenguajes de programación actuales. Entre ellos están la programación funcional, programación lógica, programación imperativa, modelo de flujo de datos, programación orientada a objetos, etc. Todos estos modelos son modelos universales, en el sentido de que pueden utilizarse para describir cualquier cómputo intuitivamente posible.
 
Quizá el aspecto más interesante a destacar en este análisis de modelos abstractos de cómputo es que un programa que permita resolver un determinado problema puede adoptar formas muy diferentes, dependiendo del modelo de cómputo que se utilice para desarrollarlo. El modelo de programación imperativa es el más extendido, y eso induce a quienes empiezan a estudiar informática a identificar el concepto de programa con el de secuencia o lista de órdenes. Sin embargo, como veremos a continuación, existen otras formas igualmente válidas de representar un programa.
 
1.5.1 Modelo funcional
El modelo de programación funcional se basa casi exclusivamente en el empleo de funciones. El concepto de función se corresponde aquí de manera bastante precisa con el concepto de función en matemáticas. Una función es una aplicación, que hace corresponder un elemento de un conjunto destino (resultado) a cada elemento de un conjunto de partida (argumento) para el que la función esté definida.
 
Por ejemplo, la operación de suma de números enteros es una función en que el conjunto de partida es el de las parejas de números enteros y el de destino es el conjunto de números enteros. A cada pareja de enteros se le hace corresponder un entero, que es su suma.
 
En forma convencional, representaremos como f(x) al resultado que se obtendrá al aplicar la función f al argumento x. Por ejemplo, podemos suponer definidas las funciones de suma, resta y producto en la forma:
 
     Función                                     Resultado
  Suma( a, b )                                 a + b
  Diferencia( a, b )                           a – b
  Producto( a, b )                            a * b
 
Para describir cómputos complejos, las funciones pueden combinarse unas con otras, de manera que el resultado obtenido en una función se use como argumento para otra. De esta manera un cómputo tal como
                  34 x 5 + 8 x 7
puede representarse de manera funcional en la forma
                  Suma( Producto( 34, 5), Producto( 8, 7) )
 
Este es el aspecto que tiene un programa funcional, que será siempre en último extremo una aplicación de una función de unos argumentos, para obtener un resultado. El proceso de cómputo, llamado reducción, se basa en reemplazar progresivamente cada función por el resultado de la misma. Este sistema de evaluación por sustitución es la base del llamado cálculo-landa. Aplicado al ejemplo se tendría:
 
                 Cómputo parcial                                Expresión / Resultado
                                                                    Suma( Producto( 34, 5), Producto( 8, 7) )
                      34 x 5                                      Suma( 170, Producto( 8, 7) )
                       8 x 7                                      Suma( 170, 56 )
                      170 + 56                                    226
 
Las explicaciones anteriores se refieren a cómputos en los que sólo intervienen funciones primitivas, que son las que el computador o máquina abstracta que ejecuta el programa puede evaluar en forma directa. La programación funcional permite la definición por parte del programador de nuevas funciones a partir de las ya existentes. Utilizando de manera convencional el símbolo ::= para indicar definición, podremos crear una nueva función, Cuadrado para obtener el cuadrado de un número basándose en el uso del producto de dos números.
 
                                         Cuadrado( x ) ::= Producto( x, x )
 
Cuando en un cómputo intervienen funciones definidas, la evaluación se sigue haciendo por sustitución. El proceso, llamado reescritura, consiste en reemplazar una función por su definición, sustituyendo los argumentos simbólicos en la definición por los argumentos reales en el cómputo. Por ejemplo, para evaluar (5 + 3)^2 tendremos:
 
              Computo parcial                                   Expresión / Resultado
                                                                    Cuadrado( Suma( 5, 3 ) )
           reducir Suma                                        Cuadrado( 8 )
           reescribir Cuadrado                                Producto( 8, 8 )
           reducir Producto                                         64
 
1.5.2 Modelo de flujo de datos
En este modelo de cómputo, un programa corresponde a una red de operadores interconectados entre sí. Cada operador lo representaremos gráficamente mediante un cuadrado con entradas y salidas, y dentro de él el símbolo de la operación que realiza. Un operador espera hasta tener los valores presentes en sus entradas, y entonces se activa él solo, consume los valores en las entradas, calcula el resultado, y lo envía a la salida. Después de esto vuelve a esperar que le lleguen nuevos valores por las entradas.
 
           34 –>
                         x ——
            5 –>                 |
                                    |
                                    |—–>  + –>
            8 –>                 |
                         x    —-|     
            7 –>
 
   Figura 1.11 Red de flujo de datos.
 
Por ejemplo, la expresión 34 x 5 + 8 x 7 puede ser calculada por la red de la Figura 1.11
 
 
                        —->
                                    x  —-  170
                        —->              |
                                             |—->
                                                          +  —>
                                              —->  

                        —->              |
                                    x —-| 56
                        —->

 
 

                        —->
                                    x  —- 
                        —->              |
                                             |—->
                                                          +  —> 226
                                              —->  

                        —->              |
                                    x —-|
                        —->
 
   Figura 1.12 Evolución de la red de flujo de datos

                       

 
El cómputo se realiza durante la evolución de la red, tal como se indica en la Figura 1.12. Cuando la evolución termina, el resultado está presente en la salida de la derecha.
 
Una red de flujo de datos puede organizarse de manera que opere en forma iterativa, obteniendo no ya un resultado sino una serie de ellos. Por ejemplo, la red de la Figura 1.13 produce la serie de números naturales, a base de reciclar sobre sí mismo un operador incremento. Las pequeñas líneas verticales representan operadores de duplicación o mezcla de valores.
 
                              _________________________
                              |                                      |
                              |                                      |
                              |–>                             <–|
                                    | –>     +1    –>  |
                           0 —>                              —-> 1, 2, 3, 4, …
 
   Figura 1.13 Generación de una serie de números.
 
Esta red no termina nunca de evolucionar. Añadiendo operadores especiales de bifurcación se puede conseguir que se detenga al llegar un resultado adecuado.
 
1.5.3 Modelo de programación lógica
Este modelo abstracto de cómputo corresponde plenamente a lo que se denomina programación declarativa. Un programa consiste en plantear de manera formal un problema a base de declarar una serie de elementos conocidos, y luego preguntar por un resultado, dejando que sea la propia máquina la que decida cómo obtenerlo.
 
En programación lógica los elementos conocidos que pueden declararse son hechos y reglas. Un hecho es una relación entre objetos concretos. Una regla es una relación general entre objetos que cumplen ciertas propiedades. Una relación general entre objetos la escribiremos poniendo el nombre de dicha relación y luego los objetos relacionados entre paréntesis. Por ejemplo:
 
                   Hijo( Juan, Luis )
 
significaría que Juan es hijo de Luis. Si tenemos el árbol genealógico:
 
                     Luis               Ana
                       |                  |
                       |___________|
                                 |
                    ________|________
                    |            |            |
                 Felipe       Juan        Sonia
 
podremos declarar (prescindiendo del sexo) los hechos siguientes:
  
                                 Hechos
                          Hijo( Felipe, Luis )
                          Hijo( Juan, Luis )
                          Hijo( Sonia, Luis )
                          Hijo( Felipe, Ana )
                          Hijo( Juan, Ana )
                          Hijo( Sonia, Ana )
                         
Para realizar una consulta escribiremos el esquema de un hecho en que alguno de los elementos sea desconocido. Esto lo indicaremos usando nombres incógnitas en minúscula, para distinguirlos de los nombres de elementos conocidos, que en este caso se habían escrito en mayúsculas (en lenguaje Prolog se usa el convenio contrario). La consulta será respondida indicando todos los valores posibles que puedan tomar las incógnitas.  Por ejemplo:
 
                        Consulta                          Respuesta
                    Hijo ( x, Ana )                     x = Felipe
                                                           x = Juan
                                                           x = Sonia
 
La verdadera potencia de la programación lógica aparece cuando declaramos reglas. Al realizar consultas basadas en reglas la máquina realiza automáticamente las inferencias (deducciones) necesarias para responderla. Por ejemplo, usando el símbolo ":-" para definir una regla, escribiremos:
 
                               Reglas
                      Padre( x, y ) :- Hijo( y, x )
                      Hermano( x, y ) :- Hijo( x, z ), Hijo( y, z )
 
La primera regla se limita a nombrar la relación inversa de "hijo". La segunda expresa que dos personas son hermanas si son hijas de un mismo padre o madre. Ahora pueden realizarse consultas como las siguientes:
 
                    Consulta                       Respuesta
                 Padre( x, Sonia )              x = Luis
                                                     x = Ana
 
                 Hermano( x, Felipe )         x = Felipe
                                                     x = Juan
                                                     x = Sonia
 
La segunda consulta tiene una respuesta aparentemente errónea. Un análisis detallado nos permite comprobar que el error está en la formulación de la regla, ya que no se le ha informado a la máquina de que una persona no se considera hermana de sí misma. Modificando la regla se obtendrá la respuesta adecuada.
 
                                Reglas
                 Hermano( x, y ) :- Hijo( x, z ), Hijo( y, z ), distinto( x, y )
 
                 Consulta                                 Respuesta
            Hermano( x, Felipe )                    x = Juan
                                                           x = Sonia
 
1.5.4 Modelo imperativo
El modelo de programación imperativa responde a la estructura interna habitual de un computador, que se denomina arquitectura de Von Neumann. Un programa en lenguaje de máquina que aparece como una lista de instrucciones u órdenes elementales que han de ejecutarse una tras otra, en el orden en que aparecen en el programa. El nombre de programación imperativa deriva del hecho de que un programa aparece como una lista de órdenes a cumplir.
 
El orden de ejecución puede alterarse en caso necesario mediante el uso de instrucciones de control. Con ello se consigue ejecutar o no, o repetir, determinadas partes del programa dependiendo de ciertas condiciones en los datos.
 
Las instrucciones de un programa imperativo utilizan datos almacenados en la memoria del computador. Esta capacidad de almacenamiento de valores se representa en los programas imperativos mediante el uso de variables. Una variable no tiene aquí el mismo significado que en matemáticas, sino que representa un dato almacenado bajo un nombre dado. Una variable contiene un valor que puede ser usado o modificado tantas veces como se desee.
 
Un programa imperativo se plantea como el cálculo o modificación de sucesivos valores intermedios hasta obtener el resultado final. Las instrucciones típicas de un programa imperativo son las de asignación, que consisten en obtener un resultado parcial mediante un cálculo elemental que puede ser realizado por la máquina, y que se almacena en una variable para ser utilizado posteriormente.    
 
En los lenguajes de programación simbólicos las instrucciones u órdenes se denominan sentencias. En Modula-2 y otros lenguajes similares la sentencia de asignación se representa en la forma
 
                       variable := expresión
 
La parte derecha de esta sentencia es una expresión aritmética que puede usar variables o valores constantes, así como operadores que estén definidos en el lenguaje, tales como los correspondientes a las operaciones aritméticas habituales: suma, resta, etc. Una sentencia de asignación representa una orden de calcular el resultado de la expresión y luego almacenar dicho resultado como nuevo valor de la variable.
 
Usando sólo expresiones simples y variables auxiliares, podremos expresar el cálculo de
 
                        34 x 5 + 8 x 7
 
mediante las sentencias siguientes
 
         1) a := 34 x 5
         2) b := 8 x 7
         3) c := a + b
 
que obtendrán el resultado final en la variable c.
 
En realidad los lenguajes de programación permiten escribir directamente expresiones complejas. El cálculo anterior podría haberse hecho con una sola sentencia
 
               c := 34 x 5 + 8 x 7
 
Para mostrar cómo las variables en programación imperativa pueden ir modificando su valor paso a paso hasta obtener el resultado deseado, analizaremos el siguiente fragmento de programa, que calcula el valor de 5! = 1x2x3x4x5. En este programa se ha supuesto que existen instrucciones REPETIR y HASTA que permiten programar la repetición controlada de una parte del programa.
 
           1) f := 1
           2) k := 1
           3) REPETIR
           4) k := k+1
           5) f := f x k
           6) HASTA k = 5
 
Este programa obtiene el resultado final en la variable f. La variable k se utiliza para ir disponiendo de los sucesivos valores 2, 3, 4, etc. Las instrucciones 3) y 6) controlan la repetición de 4) y 5). La instrucción
 
            4) k := k + 1
 
tiene el significado siguiente: Se calcula el resultado de la expresión K + 1, usando el valor de k al iniciarse la ejecución de esa instrucción, y el valor obtenido se almacena de nuevo en k reemplazando el valor anterior. La primera vez que se ejecuta esa instrucción k tiene el valor 1, asignado inicialmente por la instrucción 2). Al sumarle 1 se obtiene el valor 2, y la variable k pasa a tener ahora este nuevo valor. Cada vez que se vuelva a ejecutar la instrucción 4) la variable k incrementará su valor en 1 unidad.
 
El análisis detallado del funcionamiento de un programa imperativo puede hacerse mediante una traza en la que se van anotando las sentencias o instrucciones de asignación que se van ejecutando sucesivamente, y los valores que toman las variables inicialmente y tras cada instrucción. En este ejemplo se tendrá:
 
                           Instrucción                     k       f
                                                               ?       ?
                                1)                            ?       1
                                2)                            1       1
                                4)                            2       1
                                5)                            2       2
                                4)                            3       2
                                5)                            3       6
                                4)                            4       6
                                5)                            4      24
                                4)                            5      24
                                5)                            5     120
 
El programa comienza con valores no definidos (?) para las variables. Termina cuando k ha tomado el valor 5, en cuyo caso finalizan las repeticiones y f tiene el valor 120 = 5!.