Computación y normatividad: ¿qué tipo de máquina son las computadoras? Javier Blanco y Pío García Resumen En el presente trabajo cuestionamos algunos de los supuestos de la oposición dicotómica entre normatividad y mecanicismo. Dicha dicotomía ha funcionado como justificación de posiciones que han negado la posibilidad de un pensamiento mecánico. Sin embargo, se puede argumentar que a partir del surgimiento de la computación hay una redefinición de los límites de lo mecánico. Esta redefinición permite cuestionar la exclusión de cualquier versión de normatividad en el ámbito de lo mecánico. Palabras clave: computación, normatividad, mecanicismo Abstract In this article we challenge some assumptions concerning the dichotomy between normativity and mechanicism. This dichotomy has worked as a justification for perspectives denying the possibility of a mechanical thinking. However, it may be argued that since the emergence of computation the boundaries of what can be considered mechanical have been redefined. This change enables a challenge to the exclusion of any version of normativity from the mechanical realm. Keywords: computation, normativity, mechanicism Introducción Martin Davis, en un libro dedicado a la concepción y construcción de máquinas universales, a propósito del diseño de la EDVAC, la computadora sucesora de la ENIAC, presenta una controversia entre los «ingenieros» y los «lógicos» (Davis 2000, xi). Dicha controversia estaba vinculada, entre otras cosas, a lo que la máquina podía hacer (1) y la «lógica» de las computadoras. Así, la pregunta por lo que son las computadoras ha sido respondida desde posiciones, en algún sentido, antagónicas. Para algunos, lo que hoy llamamos computadoras es el resultado del trabajo de diseño de máquinas de cálculo cuyo origen se puede rastrear, al menos, desde el siglo XVII. Para otros, la computadora nació a partir del trabajo de Alan Turing, a principios del siglo XX y se configuró como respuesta a preguntas tales como qué es un procedimiento efectivo o cuáles son los límites de un procedimiento mecánico. Estas dos tradiciones –la ingenieril y la vinculada a los fundamentos de las matemáticas- conllevan visiones muy diferentes de las computadoras. Sin embargo, en ambas tradiciones se supone que la computación es un nuevo nombre para los procedimientos mecánicos. En otras palabras, para lo que una máquina– sea física o abstracta- puede hacer. Y, en este sentido, suele haber un reconocimiento de los límites de lo mecánico a partir de algún procedimiento o propiedad que no puede ser generado por una máquina (2). Por ejemplo, cuando Menabrea comienza su comentario acerca del motor analítico de Babbage, divide la tarea matemática en la que puede ser mecanizada y aquella que «requiere la intervención del intelecto» y que «pertenece más específicamente al dominio de la comprensión» (Morrison, Morrison 1961 p. 225). Lo que parece funcionar habitualmente como un supuesto, al menos desde la tradición ingenieril, es la Autores: Javier Blanco es Doctor en Ciencias de la Computación por la Universidad de Eindhoven, Holanda, y profesor asociado de la Facultad de Matemática, Astronomía y Física de la Universidad Nacional de Córdoba. Pío García es doctor en Filosofía por la Universidad Nacional de Córdoba, profesor adjunto de la Facultad de Filosofía y del Centro de Estudios Avanzados de la Universidad Nacional de Córdoba Dirección de contacto: javier.o.blanco@gmail.com Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 7 Filosofía de la Tecnología continuidad entre las máquinas de calcular del siglo XVII y las computadoras del siglo XX. Habría una diferencia sustantiva en velocidad y capacidad de cómputo y cualitativa en otros sentidos. Uno de los sentidos en los cuales habría una diferencia cualitativa es el que marca la distinción entre propiedades descriptivas y normativas. Las computadoras, herederas de las máquinas de calcular, no podrían traspasar el límite que marca la distancia entre un contexto fáctico y causal y un contexto evaluativo. A pesar de las transformaciones que involucran el surgimiento de la computación, ésta sigue perteneciendo al ámbito de lo mecánico y por ende está circunscrita a la región de lo fáctico, de los hechos del mundo contingente. Y, no obstante las diferencias en otros supuestos, aquellos filósofos que han tomado como problema la tradición matemática aceptan la distinción descriptivo–normativo como coextensiva con mecánico-no mecánico. Este segundo espacio -el de lo no mecánico- se suele completar de diferentes maneras: estados mentales, comprensión o evaluación son términos que expresan, al menos, una distinción dicotómica con lo mecánico. En el presente trabajo vamos a retomar sólo una faceta de esta caracterización dicotómica: aquella que está vinculada con la normatividad en el ámbito de la computación. Sugeriremos que la oposición descriptivo/normativo no da cuenta de las diferencias entre mecánico y no mecánico, si consideramos a la computación como un ejemplo de lo primero. Esta es otra forma de argumentar que a partir del surgimiento de la computación, al menos desde la propuesta de Turing, habría una redefinición de los límites de lo mecánico. El hecho de que una distinción dicotómica entre normativo y descriptivo no dé cuenta de la computación no significa que dicha distinción ya no tenga relevancia. Sólo que ahora esta distinción ya no tendría una estructura que estableciera una diferenciación cualitativa entre dos contextos excluyentes. En este sentido sugeriremos que hay diferentes niveles de lo normativo, algunos de los cuales claramente aparecen en el contexto de la computación. Aunque también presentaremos algunos sentidos de normativo que son parte de la práctica de los informáticos pero que difícilmente puedan ser vistos como computacionales -en tanto no parece sencillo argumentar en favor de su mecanización. Siendo el contexto de análisis que proponemos tan amplio y complejo, acotaremos nuestro trabajo de varias formas. En primer lugar, consideraremos la discusión del artículo clásico de Shanker acerca de la relevancia de la normatividad a partir de la comparación entre las posiciones de Wittgenstein y Turing. En segundo lugar, retomaremos la perspectiva de Kripke acerca de la relación entre computadoras y normatividad, tal como aparece en su libro acerca de seguir una regla (Kripke 1982) (3). Máquinas de calcular y computadoras: ¿mera distinción de grado? Una forma de aproximarse a los límites de lo mecánico es 8 preguntarse por lo que está implicado en la evolución de las máquinas que calcular. Con el auge de los sistemas mecánicos en el siglo XVII se construyeron máquinas que permitieron realizar cálculos matemáticos elementales. Uno de los primeros ejemplos es la máquina de calcular de Pascal del siglo XVII. La máquina diseñada y construida por Pascal tenía como objetivo realizar operaciones aritméticas simples -sumas y restas- (Bowden 1953,p.6). El sistema de la pascalina –como luego se llamó la máquina diseñada por Pascalestaba constituido por un ensamble de engranajes. Pascal adaptó algunos de los mecanismos utilizados por los constructores de relojes de la época para generar un diseño confiable. La operación de la suma estaba completamente automatizada, mientras que la resta podía ser inferida a partir de los resultados obtenidos. Un diseño aparentemente más completo para automatizar operaciones aritméticas básicas fue la de Wilhelm Schickhard. En 1624, este matemático y astrónomo le envió a Kepler una carta con una descripción de su máquina de calcular. Sin embargo, dicho diseño no tuvo una gran repercusión en la historia de las computadoras hasta bien entrado el siglo XX cuando se descubrió entre los papeles de Kepler la carta que le había enviado Schickhard. En los años sesenta del siglo pasado se construyeron algunas réplicas funcionales de esta máquina (Cfr. Goldstine 1980) (4). Unos años después, Leibniz perfecciona el funcionamiento de la pascalina construyendo una máquina que podía multiplicar y dividir (Goldstine, 1980 p. 7ss). Dicho perfeccionamiento estuvo vinculado con un tipo de engranaje que diseñó Leibniz y que luego iba a ser muy utilizado por las máquinas de calcular del siglo XIX y principios del XX (Bowden, 1953). Pero, sin lugar a dudas, el antecedente más importante de las máquinas de computar modernas fue el de Charles Babbage. Este matemático del siglo XIX tenía como intención generar tablas confiables para facilitar tareas tan importantes para Inglaterra como la navegación (Cfr. Bowden 1953). Para esto diseñó una máquina que pudiera realizar las tareas que hasta ese entonces llevaban adelante las computadoras humanas. El problema de los errores en las tablas era tan relevante que la Royal Society decidió financiar la idea de Babbage de mecanizar y automatizar el proceso de cálculo. Si bien Babbage construyó algunos prototipos de su máquina –una máquina diferencial (5)luego se concentró de manera exclusiva en el diseño de lo que llamó la máquina analítica. Por esta razón, incluso en una época tan tardía como mediados de los 50 del siglo pasado, en una de las historias de la computación más reconocidas, la de Bertrand Bowden (6), se dice que fue Babbage quien enunció «los principios en los cuales todas las modernas máquinas de computar se basan» (Bowden, 1953, ix). Esta afirmación es todavía más significativa si se toma en cuenta que en la introducción de la obra de Bowden, en la cual se hace una síntesis breve de la historia de la computación, no hay mención alguna a la obra de Alan Turing (7). Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 Filosofía de la Tecnología Regresando a los aportes de Babbage, si bien él fue capaz de construir un prototipo de su máquina diferencial, se requería un mecanismo más complejo (8) para que pudiese construir tablas «útiles», y Babbage nunca pudo completarlo ya que en 1842 el gobierno le había retirado el apoyo económico (9). De cualquier manera, en 1833 se le había ocurrido a Babbage la idea de construir una máquina aun más compleja pero más versátil: su máquina analítica. Esta máquina incorporó una modificación sustancial. A partir de las innovaciones de Joseph Marie Jacquard con telares, se le ocurrió a Babbage incorporar las tarjetas perforadas como un medio para, en principio, controlar a la máquina. Además, Babbage tenía la intención de que su máquina perforase tarjetas –con una especie de impresora- para que luego pudieran ser utilizadas nuevamente como datos de entrada. De esta manera, las tarjetas perforadas funcionaban como un medio para el ingreso de datos y el control de la máquina en un sentido semejante al de un programa en una computadora contemporánea. Además, el diseño de la máquina incluía una unidad para guardar información y una unidad aritmética (10). En cuanto a lo que la máquina analítica podía hacer, una de las primeras y mejores descripciones se encuentra en resumen publicado en francés por el matemático italiano Luigi Menabrea en 1842. Un año después, este texto es traducido al inglés por Ada Lovelace (11). Lovelace no sólo traduce el texto de Menabrea sino que le agrega algunos comentarios y apreciaciones acerca de lo que se podía hacer con la máquina de Babbage (12). En particular, Lovelace destaca que la máquina analítica no es meramente una complejización de la máquina analítica. La máquina diferencial estaba construida para «la computación de las tablas náuticas y astronómicas», mientras que la máquina analítica podía ser vista como «la expresión material de cualquier función indefinida de cualquier grado de generalidad o complejidad» (13) (Morrison y Morrison 1961 p. 245). Para Bowden, la velocidad de cómputo y el aumento de la capacidad de almacenamiento son dos de las propiedades que distinguen a las primeras máquinas de cálculo de las computadoras del siglo XX. En este contexto se puede entender el comentario de Menabrea que citamos en la introducción. Lo mecánico encuentra su límite en la comprensión y el razonamiento. Una manera complementaria de desarrollar y, eventualmente, fundamentar esta concepción de las computadoras es apelando a la dicotomía entre normatividad y descripción. Shanker y en algún sentido Kripke han identificado la diferencia entre Wittgenstein y Turing a propósito de las computadoras en esta dicotomía. Normatividad y descripción como límites de lo mecánico: Shanker, Kripke y Turing Tal lo decíamos más arriba, la dicotomía entre normativo y descriptivo se ha entendido a veces como dando cuenta de la diferencia entre lo no mecánico y lo computacional. Una de las fuentes que se suele citar para justificar esta dicotomía es la falacia naturalista de Moore (Moore 1903). Esta falacia suele remitir al comentario de Hume en el Tratado acerca de la eventual confusión entre el vocabulario de lo que es con el del deber ser (Hume 1739/2005 p. 634). Esta distinción eventualmente se convirtió en una dicotomía que ha sido utilizada como crítica a los intentos de naturalización de lo normativo (Ridge 2014). En el contexto que nos interesa para este trabajo, lo mecánico se suele identificar con lo fáctico, causal (14) o descriptivo. Y esta parece ser la forma en la cual retoma Shanker esta discusión cuando presenta su contraposición entre Wittgenstein y Turing (Shanker 1987). De acuerdo con Shanker, Wittgenstein entiende que la posibilidad de hacer matemática requiere de una reconstrucción en términos normativos, esto es que admita corrección o que sea algo más que un proceso causal de naturaleza descriptiva. A su vez, Shanker sugiere que en Turing habría en realidad dos tesis: una de carácter matemático -la que se refiere a lo que es un procedimiento efectivo- y una tesis epistemológica -la que se refiere a si es posible afirmar que la extensión de lo computable es tal que las máquinas puedan pensar. A esta segunda propuesta la denomina Shanker «tesis mecanicista». Shanker establece un vínculo entre el Turing de 1936 y el de 1950. Si bien el objetivo del artículo de Shanker es contraponer las posiciones de Wittgenstein con las de Turing, en varios párrafos se muestra que Shanker pretende utilizar los supuestos wittgensteinianos para argumentar en contra de algunas interpretaciones del pensamiento mecánico. Shanker argumenta de la siguiente manera: la única referencia explícita de Wittgenstein a las máquinas de Turing parece ser la de los Remarks on the Philosophy of Psychology. Aquí se habla de las máquinas de Turing como «humanos que calculan». Si bien el sentido de la referencia, más bien irónico, no es del todo claro, en otros pasajes citados por Shanker de la obra wittgensteniana se quiere diferenciar entre un proceso meramente empírico de «contar» y un proceso como el de calcular. En este último caso habría un aspecto normativo que no estaría presente en el primero (Shanker 1987, 619-620). La mencionada cita wittgensteniana sobre Turing haría referencia entonces a esta confusión entre aspectos meramente mecánicos y descriptivos computación- y aspectos normativos, típicamente humanos. Lo mecánico que es criticado como meramente una descripción o un procesamiento simbólico no hace referencia solamente a las máquinas en general sino a las computadoras en particular. Esta perspectiva ha sido retomada en los años 80 del siglo pasado por Saúl Kripke en un libro dedicado al problema de seguir una regla (Kripke, 1982). En este trabajo, Kripke defiende que hay una paradoja cuyo origen es el parágrafo §201 de las Investigaciones: «ningún curso de acción puede ser determinado por una regla, porque cualquier curso de acción puede ser ajustado a la regla». Recordemos brevemente la forma en la cual Kripke desarrolla esta propuesta wittgensteniana: supongamos que debo hacer una suma 68 más 57 igual a 125 (15). Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 9 Filosofía de la Tecnología Nunca antes he hecho esta suma. Como la cantidad de sumas que he hecho en mi vida son finitas, puedo encontrar un caso que se ajuste a mi historia personal, de no haber hecho antes dicha suma. Al hacer la suma estoy utilizando una palabra «suma» y un signo «+» para denotar una función matemática sobre cualquier par de enteros positivos. Por medio de una representación simbólica externa y mi representación interna (mental) puedo entender, comprender (grasp) la regla de la suma. La regla determina mi respuesta a indefinidamente muchas nuevas sumas, aunque yo haya computado sólo un número de sumas finitas en el pasado. Y este parece ser el contenido de la noción de aprender o de entender (grasp) la regla de suma: «mis intenciones pasadas sobre la suma determinan una única respuesta para indefinidamente muchos casos nuevos en el futuro» (Kripke, 1982, p. 8). Continuando con nuestro ejemplo, realizo la suma anterior y obtengo 125. La respuesta, dice Kripke, es correcta en un «sentido aritmético» y en un «sentido metalingüístico». El primer sentido se refiere a que efectivamente la función suma aplicada a los dos enteros da como resultado 125. El sentido metalingüístico involucra que el uso de la palabra «suma», tal como yo la he intentado utilizar en el pasado, denota una función tal que aplicada a 68 y a 57 da como resultado 125. Un «escéptico bizarro» podría cuestionar el uso de la palabra «suma», tal que si tomo en cuenta mis intenciones en el pasado, podría denotar otra función, digamos «cuma». Esta función «cuma» tiene un resultado que se ajusta con lo que he obtenido en el pasado –en el ejemplo de Kripke, todas aquellas sumas que involucran números menores a 57-. Pero esta función «cuma» es tal que si tengo un número mayor a 57 entonces el resultado es 5. En el pasado, en lugar de «suma» lo que puedo haber querido significar –mis intenciones- era «cuma». Como es evidente, los resultados de sumas anteriores no discriminan entre las dos funciones. Y este detalle es importante porque si esta hipótesis -«bizarra», «loca»- es falsa debería poder citar un hecho acerca de mi uso en el pasado que permitiera refutarlo. Porque por más bizarra que sea esta hipótesis no es a priori imposible. Además, por hipótesis, «nunca me he dicho a mí mismo explícitamente que debo decir 125 en esta instancia particular» (Kripke 1982, p.10). Esta hipótesis particular no permite utilizar a «suma» como la función que discrimina entre 5 y 125. Pero supongo que cuando digo 125 no he realizado un salto al vacío, sino que tengo alguna justificación para esa respuesta. «Sigo instrucciones que me he dado a mí mismo previamente y que determinan de manera única que la respuesta debe ser 125 en esta circunstancia» (p. 10). Seguir haciendo lo que siempre hice tampoco ayuda a solucionar esta situación, porque los resultados pasados no discriminan. Podría haber estado utilizando la regla cuma en el pasado. Cuma podría ser lo que yo quise decir (what i meant) en el pasado. Lo que puede verse es que la estrategia de Kripke parece descansar en la división entre regla y comportamiento, por un lado, y entre la función misma y 10 la forma en la cual puedo comprenderla/aprenderla (grasp) y usarla. El desafío escéptico, nos dice Kripke, tomaría entonces dos formas. Por un lado está la cuestión de encontrar un hecho que permita discriminar entre «suma» y «cuma». Por otro lado está la cuestión de las razones que puedo tener para sostener mi confianza de que ahora debería haber contestado 125 en lugar de 5. Por supuesto que ambas formas están íntimamente relacionadas: «debo contestar 125 porque yo tengo confianza que esta respuesta está de acuerdo con lo que yo quise decir» (Kripke, 1982, p. 11, cursivas en el original). No hay un cuestionamiento ni a nuestra capacidad de cómputo ni a nuestra memoria. El problema, continúa Kripke es que la respuesta que debo dar es claramente 125 si supongo que «suma» es la función que yo quise usar. Y lo que busca insistentemente Kripke es algún hecho o razón que permita justificar esta suposición. La condición de lo que se busca es fuerte en tanto que lo que se supone es que 125 debe ser la respuesta correcta (p. 11). De lo contrario mi respuesta, según el escéptico, sería arbitraria. Cualquier respuesta debe satisfacer dos requerimientos. Se debe especificar qué hecho constituye mi significado de «suma», como diferente de cuma. Y además se debe mostrar cómo yo estoy justificado en decir 125 en este caso. Kripke supone que el hecho en cuestión debe ser acerca de mis estados mentales (p. 11). Además, «las instrucciones» mencionadas antes, que determinan lo que debo hacer en cada instancia, deben de alguna manera estar «contenidas» en cualquier candidato para el hecho de lo que quise decir (what i meant). En este sentido, parece que estoy en problemas si busco algún hecho que permita justificar un deber ser. Sería, de alguna forma, una instanciación de la falacia naturalista o de la definición. Si esta interpretación es correcta, entonces el problema vuelve a ser, como en las secciones anteriores, el abismo que habría entre un contexto descriptivo –las condiciones empíricas de seguir una regla– y lo que se supone que funciona como justificación –los aspectos normativos. En las páginas siguientes, Kripke lleva la discusión a un terreno muy similar al de la disputa acerca de la justificación de la causalidad en Hume. Para hacer más plausible la posición del escéptico Kripke supone dos escenarios. El primero es el del presente. En este escenario, el escéptico acuerda con nosotros que 125 es la respuesta correcta. Pero el escéptico pone en cuestión la vinculación entre este escenario, el presente, con un segundo escenario en el pasado. ¿Cómo podemos estar seguros de que «suma» y no «cuma» es lo que yo quise decir en el pasado? El problema no es entonces ¿cómo sé yo que 125 es el resultado de 57 más 68?, puesto que puedo responder a esta pregunta realizando una computación aritmética2. Sin embargo, esta concesión del escéptico a mi uso del término «suma» en el presente tiene como objetivo hacer plausible su propuesta. Finalmente, cuando, como dice Kripke, se retire la alfombra del piso, se podrá ver que lo que se cuestiona es también el uso presente. Porque si no puedo citar ningún hecho o razón Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 Filosofía de la Tecnología –conductista o en términos de estados mentales- que me permita justificar si en el pasado he usado «cuma» en lugar de «suma», entonces tampoco estoy justificado para mi uso presente (p. 13). La mera seguridad psicológica, como es evidente, no es suficiente. Kripke explora la alternativa disposicionalista para evitar las paradojas finitistas clásicas de la inducción. Pero, como señala Kripke, si sumo dos números arbitrarios, puedo no tener la disposición a dar el resultado, en tanto dichos números pueden ser demasiado grandes para que pueda procesarlos o aún retenerlos en mi memoria (p. 26). Hay una variante del argumento disposicionalista que es especialmente apropiado para nuestro trabajo. Citando un artículo de Dummett, Kripke se pregunta qué ocurriría si una máquina se encargase de llevar adelante -seguir- la regla (p. 32). Se podría interpretar esta propuesta como significando que la regla queda embebida o corporizada en un mecanismo (p. 33). Suponiendo que soy capaz de construir dicha máquina, lo primero que tengo que especificar es a qué me refiero con dicho término. Puedo querer referirme al «programa» o a la máquina «física» constituida por transistores y cables (p. 34). Si me refiero al primer sentido de máquina -programa- aparecen las mismas dificultades que en el caso de referirme al signo «+». Si me refiero a máquina en el segundo sentido -los transistores y cables- también aparecen los mismos problemas en tanto debo especificar explícitamente las reglas que dicha máquina debe seguir. Es más, en tanto la respuesta de la máquina es finita, el escéptico puede interpretar el resultado como una instancia en favor de la función «cuma». Decir que la máquina es abstracta tampoco soluciona el problema porque en algún momento se debe especificar -implementar- dicha máquina abstracta. Entre la contraposición que supone Shanker entre Wittgenstein y Turing y la propuesta de Kripke hay una continuidad evidente. La discusión discurre en el contexto de la dicotomía entre descriptivo y normativo. Sin embargo, también es evidente que Kripke tiene otro problema en mente. Kripke no parece estar directamente preocupado por los errores categoriales de la falacia naturalista (16) sino más bien por las consecuencias escépticas y contraintuitivas de suponer un abismo entre los hechos y los enunciados normativos. Tal como interpretamos la posición de Kripke, el problema consiste en encontrar algún hecho que sirva de justificación de la relación entre un enunciado normativo y el comportamiento resultante. Y parece que no hay ningún hecho que pueda servir para justificar dicho paso. El comportamiento generado tampoco sirve como justificación en tanto pertenece, en general, al ámbito de los hechos. Hay dos observaciones que queremos plantear en este artículo. La primera es que si bien parece que la distinción entre lo normativo y lo descriptivo es adecuada y útil, no necesariamente habría que reconstruirla en términos dicotómicos. Esto es, en términos de distinciones cualitativas que no admitan ninguna gradación. La segunda observación consiste en cuestionar que se deba entender a la computación como una instancia más de lo fáctico, causal y descriptivo. Esta parece una concepción que no le hace justicia a la forma en la cual se configuró la misma noción de computación. Veamos de qué forma se le puede dar cuerpo a esta segunda observación. Dejaremos la primera observación para la sección final del artículo. Las máquinas según Turing: máquinas universales Shanker se centra en la discusión acerca de si las máquinas pueden pensar. Y desde este punto de vista se deberían entender sus intentos de mostrar los límites de las computadoras. Una manera de remarcar estos límites es presentar a las computadoras como mecanismos fácticos y causales. Si bien este es un aspecto ineludible de las computadoras actuales, estas propiedades no dan cuenta de la riqueza conceptual de estos mecanismos. En el artículo de Turing de 1936 se presenta una caracterización de las máquinas automáticas y de una máquina especial denominada universal. Ambas propuestas le dan cuerpo a la noción de computación. El objetivo en dicho trabajo era explicitar qué significaba que hubiese un procedimiento efectivo para tratar con sistemas formales. El significado de lo que implica calcular de manera efectiva se entendería a partir de entonces como la ejecución pas o a pas o del funcionamiento de máquinas abstractas. Este acuerdo parece ir más allá de encontrar un formalismo para caracterizar una noción. Así parece entenderlo Gödel cuando dice que con Turing encontramos por primera vez una noción «absoluta» de computación. Habitualmente se aborda el problema del alcance de la noción de «máquina» -y de «máquina de Turing»- para entender la de «computación». Menos explorado es el eventual aporte de la idea de máquina universal que Turing presenta en el mismo artículo de 1936. Por supuesto que ha sido ampliamente reconocida la importancia de las máquinas universales como una nota distintiva de la propuesta de Turing (Davis 2000), lo cual no significa que se hayan explicitado las consecuencias de este aporte conceptual. Este aporte parece ir más allá de una mera sofisticación de las máquinas de Turing o de una extensión de su campo de aplicación. Así, a partir de esta noción se puede cuestionar el supuesto de continuidad gradual (17) defendido por algunos historiadores de la computación y que consignábamos en la segunda sección. Las máquinas universales muestran algunos aspectos interesantes de lo que las máquinas de Turing pueden hacer. Una máquina de Turing está definida a partir de un conjunto finito de estados, un alfabeto finito de símbolos de entrada (se suele usar un alfabeto binario) y una función de transición, la cual suele ser presentada como una tabla de transición. Los datos de entrada vienen en una cinta infinita (pero con una cantidad finita de símbolos no nulos), sobre la cual habrá una posición diferenciada que indicará el símbolo corriente. Cada una de las filas de la tabla indica para cada estado y símbolo de entrada dados Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 11 Filosofía de la Tecnología cómo se cambia el símbolo corriente de la cinta, si se mueve para la izquierda o la derecha la posición corriente, y cuál será el nuevo estado. El «computador» presentado por Turing para realizar las computaciones prescriptas por sus máquinas abstractas es una persona equipada con lápiz y papel que toma una tabla de transición como codificación de un comportamiento cuyos datos de entrada están en la cinta, y va aplicando mecánicamente los pasos prescriptos en esa tabla. Como decíamos, cada paso indica posibles modificaciones a una posición de la cinta, un posible cambio de posición y cuál es el siguiente estado. Si se llega a un estado y un símbolo de entrada para el cual no hay ninguna regla en la tabla, el programa termina. Como hemos caracterizado en otros trabajos (Blanco et al 2011) una noción originada en la misma ciencia computacional que nos permite caracterizar de manera general a los sistemas computacionales es la de intérprete. Entenderemos por intérprete a un programa o mecanismo capaz de tomar como entrada a un programa y sus datos y realizar el proceso que ese programa prescribe para esos datos de entrada. Una máquina de Turing cualquiera puede ser vista como un intérprete, si consideramos a la tabla de transición como un programa y a la cinta como los datos. El «computador», una persona actuando mecánicamente, será quien a partir de seguir las reglas prescriptas en la tabla llevará adelante el proceso de modificación de la cinta hasta un posible estado en el cual no haya ninguna regla que se aplique. Esta idea de efectividad en el cálculo realizado por un humano puede extenderse a muchas otras realizaciones posibles. Lo que es indispensable es que se tenga un sistema donde a partir de ciertas codificaciones se puedan producir comportamientos específicos. Una de las novedades importantes que se producen con las máquinas de Turing es la enorme versatilidad que proveen, es decir, la extensión de los comportamientos codificables en sus tablas de transición, que llevan a la llamada tesis de Church-Turing, de que cualquier comportamiento mecanizable puede ser simulado por una máquina de Turing. La máquina universal es una máquina particular (dada por su propia tabla de transición) cuyo comportamiento consiste en recorrer la cinta leyendo el código de una máquina dada, y luego comportarse como dicha máquina tomando como entrada el resto de la cinta. En este sentido, la máquina universal puede imitar el comportamiento de cualquier otra máquina, al menos en lo que respecta al comportamiento de entrada/salida. Esta posibilidad depende de que se pueda codificar una máquina de Turing y que luego esta codificación sea parte de los «datos» de entrada de otra máquina de Turing particular que ahora funciona como una máquina universal. Una propiedad es que no podemos predecir el comportamiento de cualquier máquina de Turing (aunque podamos predecir el comportamiento de algunas). Esto se sigue de la solución negativa- al problema de la detención. Esto es poder predecir si una máquina de Turing cualquiera dará un 12 resultado -positivo o negativo- o no se detendrá nunca. Esta es una manera muy fuerte de establecer que no podemos saber a priori lo que hará una máquina (en este caso una computadora). Dado que la máquina universal puede imitar a cualquier máquina y que no puede predecirse el comportamiento de algunas de dichas máquinas (es decir, no hay manera mecánica de determinar conociendo la máquina y los datos para esa máquina, si va a producir un resultado o no), no puede predecirse en particular el resultado de evaluar una máquina universal para un conjunto de datos iniciales (los cuales en particular pueden estar codificando alguna otra máquina). Es de algún modo curiosa la situación: disponemos de una máquina particular, la máquina universal, para la cual podemos demostrar que es impredecible, que no hay ningún método para determinar a priori su comportamiento. Por supuesto que una manera de saber cómo se va a comportar es llevar adelante el proceso mecánico que ella prescribe, pero no hay ninguna garantía de que ese proceso arroje algún resultado observable. A la luz de la discusión previa sobre intérpretes, puede decirse que la máquina universal internaliza su propio intérprete, en el sentido en que a partir de su propio funcionamiento considerado como un intérprete particular implementa un intérprete mediado por una codificación explícita particular. La noción de intérprete, como clave de análisis para la computación, nos permite poner en primer plano varios conceptos. Uno central es el de programabilidad. Otro concepto, pertinente para lo que venimos discutiendo, es el de prescripción. Un programa prescribe un comportamiento observable. Como vemos, una de las ideas centrales detrás de la noción de computación está relacionada con la vinculación entre un comportamiento observable y un programa. Dicho vínculo es normativo. Esta idea de normatividad asociada con la computación se puede explicitar en diversos contextos. Una condición de posibilidad para indagar en estas formas de normatividad es considerarla una noción que admita diferentes instanciaciones o grados. Aspectos normativos de la computación Un sentido de normatividad que destaca Wittgenstein –y gran parte de la tradición posterior- es que dicha noción involucra la posibilidad de un comportamiento correcto o incorrecto. El mero comportamiento mecánico, en tanto pertenece al contexto de lo descriptivo o de lo causal no califica como normativo en este sentido. Sin embargo, ¿hay aspectos normativos involucrados en la computación? Es importante señalar que no queremos defender aquí que todo comportamiento mecánico sea normativo. La computación constituye un mecanicismo particular y, como vimos en la sección sobre máquina universal, en un sentido no trivial, se puede decir que vuelve a fundarlo. Retomemos el problema de la normatividad en este contexto nuevo. Supongamos que uno de los sentidos más Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 Filosofía de la Tecnología interesantes de normatividad está capturado por la posibilidad de un comportamiento correcto e incorrecto. En otras palabras, que se pueda hablar de errores en relación con alguna norma que me diga qué es lo correcto. En el caso de la computación podrían distinguirse diversos niveles discriminables por el tipo de error involucrado. En primer lugar, se podría hablar de corrección en el nivel de la implementación computacional física. Aquí aparece un sentido de mal funcionamiento, poco interesante, por fallas físicas. Este sentido es poco atractivo para nosotros porque no todo error o falla está asociado con la violación de una norma, al menos en el nivel de análisis que estamos planteando: el de la computación (18). Habría un segundo sentido de corrección vinculado con la implementación y que depende de la arquitectura. Los conocidos errores de redondeo estarían en este nivel. Las especificaciones acerca del tipo de arquitectura que puede soportar un programa funcionarían como los estándares a partir de los cuales el comportamiento resultante es el esperado. Un tercer sentido estaría representado al nivel del programa y su relación con el comportamiento. Este nivel está, a su vez, relacionado con la noción de corrección estipulada por un intérprete. El intérprete dice cómo debería vincularse el programa con su comportamiento. Se podría decir que esta especificación es concreta y que tiene un sentido normativo más fuerte en el nivel siguiente: el de la especificación. Este es un sentido de corrección fuerte y por tanto constituye un sentido de normatividad importante. Pero no es el sentido de normatividad más importante en computación. Evidentemente un programa puede generar de modo mecánico un comportamiento. Dicha generación es posible por el intérprete que vincula la entrada –programa y datos- con la salida –el comportamiento resultante. Pero este programa puede no corresponderse con lo estipulado por las especificaciones. Si no he realizado la prueba lógica correspondiente no sé si efectivamente el programa hace lo que se supone- por las especificaciones- que debería hacer. Las especificaciones de los programas pueden estar escritas en diversos lenguajes formales que modelen aspectos de los comportamientos de los programas. Un caso particularmente importante, tanto desde un punto de vista conceptual como histórico, es la ya descripta máquina universal. La noción misma de máquina universal da una especificación precisa del comportamiento de entrada/salida que debe tener, a saber, que para una entrada de la codificación de una máquina M y de un dato D, la salida debe ser la misma que si se ejecuta el proceso de la máquina M misma con los datos D como entrada. Es decir, que la especificación de la máquina universal estará dada por una particular lectura del mismo lenguaje formal de las máquinas de Turing (mediada por una codificación particular explícita de las tablas de transición de las máquinas). A partir de esta caracterización de la máquina universal como codificando explícitamente especificaciones que pueden ser vistas como prescripciones -normas-, se puede establecer un contraste con otras máquinas de Turing cualesquiera. En la sección anterior señalábamos que el análisis original de Turing presentaba a un sujeto «computador»- realizando una tarea simple que podía descomponerse en pasos mecanizables. Este análisis permitió el diseño -en papel y lápiz- de las máquinas de Turing. Tanto el análisis presentado como las máquinas resultantes pueden ser vistos como meros mecanismos que sólo presuponen aspectos descriptivos. Cuando una máquina de Turing particular toma como dato de entrada la codificación de otra máquina, el comportamiento resultante deberá ser como el de la segunda máquina. Es en este sentido que decíamos que las especificaciones están codificadas de manera explícita en la máquina universal. Como indicamos más arriba, esto plantea un sentido más fuerte de normatividad, sin dejar por ello de ser un mecanismo particular. Esta manera de comprender máquinas particulares a partir de prescripciones normativas establecidas al interior de su marco de existencia no es privativo de las máquinas de Turing, sino que puede reconstruirse en cualquier sistema formal o tecnológico que dé cuenta de nociones de cómputo. Las nociones de intérprete, compilador, evaluador parcial o en general cualquier programa que toman otros programas como datos estructuran los conceptos y las prácticas de la ciencia de la computación y sus propias definiciones se establecen en términos normativos, como propiedades que determinados programas deben cumplir. Esta propuesta no responde necesariamente al problema de normatividad asociado con un comportamiento inteligente o con el pensamiento humano. Pero muestra, en el contexto de la computación, que la idea de normatividad puede plantearse en diferentes niveles. Y que probablemente uno de los sentidos más robustos de normatividad sea el caso de las especificaciones. Este rótulo de robusto está vinculado con la posibilidad de corregir un programa para que se ajuste a lo que debería ser –las especificaciones-. Una tarea a desarrollar es mostrar, en términos filosóficos, cuáles serían las relaciones entre las especificaciones, el comportamiento, el programa y las pruebas lógicas que pueden vincularlos. Consideraciones finales En el presente trabajo hemos intentado defender que la oposición entre descriptivo y normativo no es coextensiva con la oposición entre computacional y no computacional. Esta asociación entre estas dicotomías parece apoyarse en la identificación indebida entre lo computacional y lo factual, causal y descriptivo. Para cuestionar esta identificación hemos argumentado en favor de los aspectos normativos en computación. Sin embargo, se podría argumentar que aspectos como el de la especificación de los programas pertenecen a la actividad de la ciencia computacional pero no a la implementación de sistemas computacionales. De acuerdo con esta objeción, cuando se toman en cuenta Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 13 Filosofía de la Tecnología contextos como el de la especificación o el de la construcción de programas se estaría ampliando indebidamente- lo que tradicionalmente se ha entendido por computación. Lo que Wittgenstein o Kripke tenían en mente eran los sistemas de computación mecánicos, en el sentido de dispositivos implementados. Habría al menos dos formas de contestar a esta objeción. La primera es general y está vinculada con lo que ya hemos dicho acerca de la importancia conceptual de la noción de máquina universal. La segunda es una respuesta más específica y se podría plantear en dos partes. La primera es rescatar el contexto de construcción de programas como un ámbito genuino para comprender lo que es la computación. Aquí podríamos recordar la posición de Canguilhem: cuando queremos comprender las máquinas es ineludible apelar al contexto de construcción de las mismas; o la de Dijkstra, para quien la ciencia de la computación reside y siempre residirá en el interjuego entre la manipulación humana de símbolos, llamada programación, y la manipulación mecánica de símbolos, llamada computación. La segunda parte de nuestra respuesta depende de lo que se debería considerar para comprender las prácticas de los informáticos. La especificación de los programas no es sólo parte de las buenas prácticas en programación -permitiendo, por ejemplo, generar heurísticas para la corrección de erroressino que también permite comprender en un sentido sustantivo a los programas. Pensar a la máquina universal como un caso paradigmático de normatividad al interior del formalismo mismo tiene la relevancia histórica de haber sido la piedra basal sobre la que se desarrolló la idea de computadora. En este sentido, puede verse cómo una forma de normatividad intrínseca articula desde el inicio las ciencias de la computación. Sin embargo, habría una objeción de mayor peso aun: incluir a la especificación de programas como parte de una concepción mecánica de la computación significaría poder mecanizar todo el proceso de especificación. Y, tal como lo reconocen los informáticos, este proceso de especificación conlleva un tipo de actividad creativa. De acuerdo con esta objeción se estaría confundiendo computación con la actividad de los informáticos, que puede que no sea mecánica. En este punto adquiere mayor importancia nuestra propuesta original: disolver la dicotomía entre normativo y descriptivo sustituyéndola por una concepción gradual. No estamos suponiendo que toda la actividad que realizan los informáticos haya sido efectivamente mecanizada. Pero, tal como lo explicitamos en la sección anterior, hay actividades de la informática que suponen un valor de corrección -y en este sentido de normatividad- que va más allá de algunos de los sentidos de normatividad que hemos identificado en el proceso más abstracto de especificación. Si abordamos la tarea de la informática en toda su complejidad y utilizamos herramientas conceptuales que permitan dar cuenta de todos sus matices, entonces se pueden cuestionar algunos supuestos que estaban apoyados en una perspectiva dicotómica. Notas (1) Davis cita un comentario de uno de los padres de la construcción de computadoras: Howard Aiken. Para este ingeniero, sería una coincidencia “asombrosa” que la lógica detrás de las máquinas que resuelven ecuaciones diferenciales y de las máquinas utilizadas para la contabilidad fuese la misma. (2)También se podría discutir si habría comportamientos que las máquinas físicas son capaces de generar que excedieran los límites de lo que puede hacer un mecanismo en el sentido de procedimiento efectivo. En lo que sigue no exploraremos esta posibilidad. (3) Este último texto ha generado una abundante literatura filosófica. En tanto nuestro objetivo está restringido al ámbito de la computación, sólo consideramos algunos comentarios a la obra de Kripke. (4) Según relata Goldstine, al parecer un prototipo de la máquina de Schickhard quedó deteriorado por un incendio y su diseñador nunca retomó la construcción de la misma. El prof. Bruno y Edwin Epple construyeron algunos prototipos en los sesenta (Cfr. Kisterman 2001). (5) En realidad, Babbage construyó partes de la misma. Recién luego de su muerte, su hijo Henry Babbage completó la construcción de algunas de sus máquinas. Sin embargo, ya en 1822 Babbage tenía un prototipo funcional de su máquina diferencial (Bowden, 1953 p. 9). (6) Bowden participó activamente en la construcción de las primeras computadoras en la Inglaterra de la posguerra. Trabajando para la empresa Ferranti, se convirtió en el primer vendedor de computadoras. Su libro de 1953 inicialmente tenía como objetivo ser una carta de presentación de estas nuevas máquinas, pero el proyecto creció hasta convertirse en una síntesis de “quién es quién” en el naciente mundo de las computadoras (Tweedale 1990) (Cfr. Lee; Lee 1995). (7) Curiosamente, en uno de los capítulos de dicha obra sí se destaca el papel precursor de Turing. Sin embargo, hay otro indicio del lugar periférico de Turing en este libro y es que sólo aparece como colaborador de un capítulo secundario acerca de las computadoras y los juegos. (8) Más abajo veremos que, de acuerdo con Ada Lovelace, se podría relativizar esta afirmación. (9) A pesar de estas dificultades, una máquina diferencial de Babbage fue utilizada para calcular las “tablas de vida” usadas en computar costos de los seguros por parte del gobierno inglés (Bowden 1953 p. 10). Esas tablas sirvieron para sustituir las que eran utilizadas hasta ese entonces en Inglaterra y Alemania, a partir de una publicación de Babbage de 1824. (10) Para una descripción más extensa se puede consultar el artículo de Aldana D'Andrea sobre este tema (D'Andrea 2015). (11) La traducción y comentarios de Ada Lovelace se puede encontrar en Morrison y Morrison 1961. (12) Uno de sus comentarios se convierte en una de las objeciones más citadas del texto de Turing de 1950 que discute la posibilidad de que las máquinas puedan pensar (Turing 1950). (13) Estas son partes de la nota A que, de acuerdo con Lovelace, es una respuesta –negativa- al supuesto de Menabrea de que la máquina analítica es una continuación directa de la máquina diferencial. (14) Esta referencia habitual a lo causal es, al menos, curiosa cuando se señala a Hume como fuente. Sólo en un sentido muy restringido lo causal se identifica con lo fáctico en Hume. (15) En Blanco y García 2014 hemos discutido la propuesta de Kripke. Aquí retomaremos la primera parte de lo que proponíamos en dicho trabajo y agregaremos las apreciaciones de Kripke acerca de la computación. (16) Aunque la forma en la cual Kripke argumenta supone una solución a la falacia naturalista: no hay posibilidad de confundir el lenguaje de los hechos con el lenguaje de lo que debe ser. (17) El supuesto de la continuidad gradual estaba vinculado con la historia de las máquinas físicas. La discontinuidad cualitativa es diferente y está relacionada con la distinción entre normativo y descriptivo. (18) Es importante remarcar en este caso que en algunos contextos este tipo de falla sí puede tener un carácter normativo. Si hay algún recurso teórico a partir del cual plantear lo que debería ser un comportamiento, entonces está la posibilidad de definir lo correcto e incorrecto. 14 Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 Filosofía de la Tecnología Bibliografía BOWDEN, B. V. (1953). Faster than thought: a symposium on digital computing machines. London: Pitman. BLANCO, J.; CHERINI, R.; DILLER, M.; GARCÍA, P. (2011) A Behavioral Characterization of Computational Systems, Proceedings of European Conference on Computer Science. Munich: Verlag Dr. Hut. BLANCO, J.; GARCÍA, P. (2014). Eran tres, dos austríacos y un inglés. Wittgenstein, Gödel, Turing. Actas del V Coloquio Internacional de Filosofía de la Técnica. Buenos Aires: Universidad Abierta Interamericana. D'ANDREA, A. ¿Impotencias de las máquinas? el motor analítico de Babbage y los límites de lo mecanizable. Revista Argentina de Enseñanza de la Ingeniería, Año 4 Nº 10. DAVIS, M. (2000) The universal computer. The road from Leibniz to Turing, W. W. Norton and Company. DESCARTES, R.: (2003) Discurso del método; estudio preliminar, traducción y notas de Bello Reguera, E. Madrid: Ed. Tecnos. GOLDSTINE, H. H. (1980). The computer from Pascal to von Neumann. Princeton University Press. KRIPKE, S. (1982) Wittgenstein on Rules and Private Language. Harvard University Press. LEE, J. A., & Lee, J. A. (1995). International biographical dictionary of computer pioneers. Taylor & Francis. MORRISON, P. (Ed.). (1961). Charles Babbage and his calculating engines: Selected writings by Charles Babbage and others (p. xxiii). Dover. MOORE, G.E., (1903). Principia Ethica, New York: Cambridge University Press. RIDGE, M. "Moral Non-Naturalism", The Stanford Encyclopedia of Philosophy (Fall 2014 Edition), Edward N. Zalta (ed.), URL http://plato.stanford.edu/archives/fall2014/entries/moral-non-naturalism/SHANKER, (1987) Wittgenstein versus Turing on the Nature of Church's Thesis, Notre Dame Journal of Formal Logic, vol. 28, no. 4. TURING, A. M. (1936). "On Computable Numbers, with an Application to the Entscheidungs problem". Proceedings of the London Mathematical Society. 2 (1937) 42: 230–265. TURING, A. M. (1950). Computing machinery and intelligence. Mind, 59, 433-460. TWEEDALE, G. Bertram Vivian Bowden, Ann. Hist. Comp., Vol. 12, No. 2, 1990, pp. 138-140. WEBB, J (1980). Mechanism, Mentalism and Metamathematics. Dordrech, Holland: D. Reidel Publishing Company. Revista Argentina de Enseñanza de la Ingeniería / Año 5 / Nº 10 / Febrero 2016 15