• No results found

2. MATERIALS AND METHODS

3.6 The cell death executing function of VrMC2 and VrMC5 in HR signalling

!•! tipo de semántica que estamos utilizando asigna conjuntos a las palabras y a las expresiones más complejas. Incluso es conve­ niente ver a los valores veritativos como conjuntos; en efecto, los valores veritativos pueden representarse mediante las letras *V’ y T" (para ‘verdadero’ y ‘falso’, respectivamente), pero también es costumbre representarlos mediante las cifras ‘1’ y ‘0*. A hora bien, 147

la representación del conjunto mismo a la de su función caracterís­ tica posibilita precisamente esto. L a cuestión es: ¿cuándo y cómo podemos representar esas funciones características en forma de pro­ gramas?

Si los conjuntos son finitos podemos siempre en principio tener un procedimiento «mecánico» — un algoritmo— por el cual decidir el valor de las funciones características p ara un argumento cual­ quiera; es decir, tendremos un program a, puesto que un programa de com putador no es sino un algoritmo form ulado en un lenguaje que el com putador pueda «entender». Pero si los conjuntos son infi­ nitos algunas veces esas funciones son calculables o compulablcs —mediante un algoritmo o program a— y otras no, sin que se pueda decir de un m odo totalm ente general cuándo sucede una cosa o la otra. Estos son resultados elementales de una rama de la lógica pura que recibe el nombre de teoría de la computabilidad o de las funciones recursivas.

Es claro que en el caso de que queramos hacer una semántica del lenguaje natural adecuada p ara un com putador nos debemos limitar a conjuntos cuyas funciones características son programa- bles. Pero aun esta limitación es insuficiente. N o nos basta con saber que una determ inada función es.program able, es decir, no nos basta con saber que se puede en principio hallar un programa que calcule esa función (este es precisamente el tipo de resultado que nos da la teoría de las funciones recursivas). Tenemos que saber cuál es el programa, ser capaces de construirlo, a fin de que el com putador pueda usarlo.

P or ejemplo, imaginemos que queremos que un com putador nos responda la1 sencilla pregunta: ‘¿Es 64 un núm ero par?’, formulada así, en castellano. M ás adelante veremos con un poco más de detalle cómo, para responderla, el com putador puede utilizar una teoría lingüística, y, en particular, una teoría semántica. N os interesa ahora un aspecto particular del proceso. Es obvio que, a fin de que el compu­ tador pueda responder a la pregunta, tiene que tener información sobre el conjunto que designamos con la expresión ‘número par’. Un m odo-de hacer esto, muy imperfecto en el caso presente, sería haberle dado previamente una lista de números pares. La imperfec­ ción radica en que una lista debería ser necesariamente finita, y más bien pequeña, dado que no queremos utilizar millones de cintas magnéticas u otros «almacenes»'de memoria, y tampoco queremos que nos tard e doscientos años en d a r la respuesta, pongamos por caso. Puede que el 64 estuviese en esta lista, pero no hay razón alguna para suponer que esté en ella el número 1051532 + 4i<w. De modo que lo que haremos es suministrarle información al computador, no mediante una lista de números pares (la extensión — más o me­ nos parcial— de la expresión ‘número par’), sino mediante un pro­ grama para averiguar si un número es o no par; un programa en que, 150

por ejemplo, se divida por dos al número en cuestión y se «mire» si el resto es cero, en cuyo caso la respuesta es ‘Sí’, siendo ‘N o’ la respuesta en caso contrario.

De modo que para hacer una semántica adecuada para que un com putador procese el. lenguaje natural tenemos que analizar las expresiones del lenguaje con la vista puesta en la elaboración de programas. Recordemos que la semántica conjuntista reduce todo a conjuntos (en último térm ino); ahora es necesario reducirlo todo a programas; pero los program as no son sino series de procedimien­ tos pañi efectuar ciertas manipulaciones, tareas, operaciones, etcétera. De aquí que al tipo de semántica adecuada p ara el análisis del len­ guaje natural por com putadores a la que se llama, de un modo muy general, ‘semántica com putacional’, se le llame también, de un modo más informativo, ‘semántica de procedimientos’. -

Las funciones ‘Si-No’ de las cuales conocemos los procedimien­ tos para calcular sus valores, dados sus argumentos —es decir, cono­ cemos sus programas—, corresponden a ciertos conjuntos; son, des­ de luego, sus funciones características. A estos conjuntos se les llama a veces ‘conjuntos constructivos’, aunque, desgraciadamente, el tér­ mino ‘constructivo’ es iun tanto.confundenté, pues tiene al menos otros dos significádos muy distintos en teoría, de conjuntos y filoso­ fía de la matemática. M irado desde un puntó de vista abstracto, el primer paso a dar hacia una semántica com putacional o de proce­ dimientos desde una semántica conjuntista es reducir nuestro apa­ rato de entidades conjuntistas: en lugar de conjuntos en general, sólo conjuntos «constructivos».

El problema práctico concreto será «codificar» la información acerca de predicados del lenguaje natural, como ‘número p a r’, ‘m or­ tal’ o ‘rojo1 en una serie de program as o procedimientos. Es obvio que la naturaleza de estos procedimientos no es siempre la m ism a: los procedimientos por los que averiguamos que un número es par difieren marcadamente en carácter de los que nos sirven para ave­ riguar el color de un objeto. En el penúltimo apartado retomaremos este tema.

7.4. Lenguajes de listas ,

Para hacernos una idea algo más definida de cómo puede , un com putador, con un program a (o conjunto de programas) adecua­ dos, «entender» piezas de.inform ación en una lengua natural, res­ ponder a preguntas, etc., será necesario saber un poco más sobre cómo se construye un programa. Para ello es esencial la noción de lenguaje de programación, puesto que un program a no es ni más ni menos que un conjunto de instrucciones escritas en un lenguaje do programación.

Hay muchos tipos de lenguajes de programación. Un com puta­ dor puede realizar instrucciones o «manipular» información escrita en-un lenguaje de programación si tiene un «mecanismo»-¡-llamado ‘compilador’— para «traducir» ese lenguaje al lenguaje propio del com putador, es decir el lenguaje cuyos términos se refieren a las distintas partes de la máquina (por ejemplo, una «dirección» en la memoria), a «tareas» y cóm putos a efectuar (por ejemplo, «leer» un símbolo en una «dirección»), etc., y que se basa en último ter­ mino en la distinción física éntre el paso de corriente en puntos de­ term inados y en momentos de tiempos dados, y la ausencia de co­ rriente en esos puntos en otros momentos, distinción qué podemos representar simbólicamente con las cifras ‘0’ y ‘1 \ Este lenguaje-má­ quina como se le llama— , está pues construido sobre el alfabeto binario {0, 1} y es el lenguaje del com putador —de la máquina— en el sentido indicado. Es decir, en cada m omento del funcionamiento del com putador hay estados físicos que podem os representar simbó­ licamente, esto es lo que hace que podam os hablar de lenguaje tam ­ bién en este caso.'

D arle a un com putador las instrucciones en el lenguaje máquina es en principio posible, e incluso conveniente o indispensable para ciertas tareas. Pero las personas que no saben cómo está construido el com putador o que quieren utilizarlo en otro nivel disponen de toda una serie de lenguajes de más alto «nivel». Las instrucciones dadas en estos lenguajes pueden ser «entendidas» por la máquina siempre que ésta disponga de un compilador, es decir un mecanismo tal que a cada pieza de información codificada simbólicamente en un len­ guaje de más alto nivel le asocie otra pieza :de información codifi­ cada simbólicamente en un lenguaje de más bajo nivel (en último térm ino, del lenguaje-máquina). .

D e m odo que p ara nuestros propósitos —com o, de hecho, para propósitos de la inmensa mayoría de las -personas que utilizan com putadores— no es necesario ert absoluto conocer cómo funciona un com putador. Todo lo que es necesario es que conozcamos alguno de estos lenguajes de programación de más alto nivel. Y para una idea de tipo introductorio bastará una presentación parcial muy simplificada de uno de estos lenguajes.

La familia de lenguajes de programación que se utiliza preferen­ temente para elaborar programas de com putador relacionados con el lenguaje natural se conoce por el nom bre de ‘lenguajes de listas’. El vocabulario de uno de estos lenguajes está constituido por «pala­ bras» cualesquiera construidas a partir de cualquier serie de letras mayúsculas del alfabeto latino; se permite también el uso de cifras numéricas. A estas «palabras» les llamamos átomos. Ejemplos de átom os son: C D X FR , ROJA, 4, CD R , PAR, CO N JU N CION , PELOTA 1, ATOM OSUPERLARGO, N IL. A partir de estos áto­ mos se construyen listas de átomos, las más sencillas de las cuaics 152

no son sino cadenas que se form an abriendo un paréntesis, poniendo a continuación una serie de átomos separados po r un espacio en blanco y cerrando finalmente el paréntesis. Otras listas más com­ plejas pueden tener «incrustadas» listas de éstas más sencillas, y otras aún más complejas tener «incrustadas» listas complejas o sen­

cillas, etc. --- -

Si representamos a un átom o Cualquiera mediante la palabra ‘átom o', sencillamente, a una lista mediante la letra ‘L \ y nos ayuda­ mos de otro símbolo auxiliar, ‘O’, para el «axioma» o punto de partida, podemos dar una gramática muy sencilla para especificar sintácticamente el lenguaje en cuestión (es decir, el conjunto de sus fórmulas o cadenas bien formuladas):

O -> (L) L -> LL

L-(L)

L m átomo

Según esta gramática, y teniendo en cuenta los ejemplos que liemos dado de átomos, las siguientes son listas del lenguaje:

(ROJA PELOTA 1)r

• (CD X FR A TO M O SU PÉRLA RG O 4) ’ ■ 1 ((PAR 4) C O N JU N C IO N (ROJA PELOTA 1)) (CD X FR (C D R (4 PELOTA 1 NIL))>

De momento, claro está, estas «sopas de palabras» parecen es­ casamente iluminadoras. Algo más de' luz arroja el hecho de que, en realidad, los átom os de un lenguaje de listas se agrupan funcio­ nalmente en dos grandes grupos: átomos que son nombres de fu n ­ ciones y átom os que sirven como argumentos o valores de esas fun­

ciones. ‘ • r'-“'-... K ^ |

Concretando un poco más, escojamos un lenguaje de listas con­ creto, como por ejemplo el LISP (es indiferente aquí en cuál de sus varias versiones). Este lenguaje tiene tres átomos, a'sa b e r: CAR, CD R y CONS, que son los nombres de tres funciones primitivas, en el sentido de que a partir de ellas se pueden’ definir las demás funciones computables (esto es sólo aproximadamente cierto, pero no es el lugar para entrar en detalles). Esas tres funciones se definen así: la función CAR aplicada a una lísta nos da su primer elemento (sea éste átom o o lista); la función C D R aplicada a una lista nos da la lista con los elementos que quedan después de eliminar de la lista original el primer elemento; por ú ltim o ,'la función CONS aplicada a una lista que consta de un elem ento1 (átom o o lista) y de una segunda lista da como valor una nueva lista cuyos elementos son: el elemento mencionado de la lista-argumento y los elementos- de la segunda lista.

En los siguientes ejemplos utilizamos las letras A, B, C, etcétera, para átom os cualesquiera, y escribimos las listas-argumento de las funciones CA R , C D R y CONS entre paréntesis.

• CA R ((A B C)) = A

CA R (((A B C) D E)) = (A B C) C D R ((A B C)) = (B C) C D R (((A B C) D E)) = (D E) CONS ((A (B C))) — (A B C )

i . CONS (((A B C) (D E))) = ( ( A B C ) D E)

Nótese que las expresiones a la izquierda del signo igual en los ejemplos anteriores, así como alguna de las expresiones a la dere­ cha (la primera), no son listas, es decir, no son expresiones bien formadas de nuestra gramática. Esto tiene fácil remedio: basta es­ cribirlas entre paréntesis. P or ejemplo: (CAR ((A B C))) = (A); (CAR (((A B C) D E)) * ((A B C)); etc.

Otro punto interesante es que podemos reiterar o enlazar las funciones:'(C A R (C D R ((B D)))) = (CAR ((D))) = (D).

Tenemos ya expresiones.simbólicas —átom os y listas— c ins­ trucciones —funciones— para cambiar, «manipular» o alterar esas expresiones, transform ándolas en otras. Este es el punto importante a retener; lo de menos es que todas las instrucciones que podemos formular en LISP, y que dam os en la forma explícita de funciones p ara m anipular símbolos, sean redUcibles a unas determinadas fun­ ciones elementales, básicamente las tres mencionadas. Este hecho sería m uy interesante si estuviéramos estudiando problemas gene­ rales de computabilidad. Pero para nosotros es más valioso ahora tener una idea de cómo representamos las instrucciones —a saber, po r medio de una combinación de funciones— y los «datos» o «es­ tructuras» sobre los que esas instrucciones van a «trabajar», y tam­ bién de cóm o en LISP y en los lenguajes afines damos unas cosas y otras po r medio de un solo tipo de expresión sim bólica: la lista. Así pues, si un programa no es más que un conjunto de instrucciones p ara «manipulan) cierto tipo de «datos» y representamos tanto las unas como los otros mediante listas, se comprenderá que un pro­ gram a de LISP no es más que un conjunto de listas,, en último tér­ mino una gran lista única que contenga las demás.

U n ejemplo parcial muy simplificado es el siguiente: Suponga- I mos que queremos elaborar un program a para averiguar si un nú- I mero cualquiera X es un número par. Obviamente el procedimiento l consiste en dividir X p or 2 y m irar el resto; si éste es 0, el número X

\ en cuestión es p a r; de lo contrario no lo es.

Supongamos que tenemos las siguientes funciones ya definidas en LISP: la función DIVISION, que nos efectúa la división de un núm ero p o r otro, la función RESTO, que nos averigua el resto de 154

lina división ya efectuada, la función IG U A L , que aplicada a dos números nos da el valor V si los números son iguales y el valor F si los números son distintos, y la función RESP, tal que al argumento V le asigna el valor SI y al argum ento F le asigna el valor N O . En­ tonces la serie de pasos p ara averiguar si un núm ero es par o no que hemos mencionado anteriorm ente, se puede concretar en las siguientes instrucciones parciales:

(D IV ISIO N (X 2)) — D ividir X (el núm ero que querem os averiguar si es o no par) por 2.

(RESTO (D IV ISIO N (X 2))) — Averiguar el resto de la di­ visión de X po r 2. (IG U A L (RESTO (D IV ISIO N ((X 2))) 0))

—Averiguar si el resto de la división es o no cero. ( l ) (RESP (IG U A L (RESTO (D IV ISIO N ((X 2))) 0))) , ¿

— R esponder, de acuerdo con lo anterior, ‘Sí’ o ‘N o ’. Nótese que esta últim a instrucción engloba, p o r así decir, a las dem ásf de m odo que podem os identificar el program a p ara averiguar si un núm ero es o no p a r con esta instrucción, que, com o vemos, se da m ediante una lista..

Por supuesto, u n a vez que tenem os este program a, podem os fácilm ente form ular o tro program a que incorpore la instrucción siguiente: D efínase la función P A R com o aquella función que, apli­ cada a un argum ento, nos d a el valor SI o el valor.N O de acuerdo con que el valor del program a (1), aplicado a ese argum ento, sea SI o N O , respectivam ente. H abrem os entonces definido la función PAR a p artir de las funciones D IV IS IO N , R E S T O , IG U A L y RESP. Es decir, vem os que podem os definir to d as las instrucciones — o to ­ das las funciones— a p a rtir de instrucciones o funciones ya defini­ das (en últim o térm ino a p a rtir de las prim itivas). •