Desafíos y Oportunidades de la Investigación en Métodos Formales Edgar SERNA M. Corporación Universitaria Remington. Facultad de Ciencias Básicas e Ingeniería
[email protected] Medellín, Colombia.
Alexei SERNA A. Instituto Antioqueño de Investigación. Grupo de Investigación CCIS
[email protected] Medellín, Colombia. RESUMEN La investigación teórica y tecnológica en métodos formales ha alcanzado recientemente significativos avances, lo que hace vislumbrar aplicaciones ambiciosas en las próximas décadas. En especial, será posible aplicarlos para apoyar rigurosos y coherentes planes de estudio en matemáticas, Ciencias Computacionales y algunas ingenierías, a las que se incorporarán para verificar hardware, software, algoritmos y protocolos, y para el modelado y el diseño de sistemas de software complejos. En la industria, se utilizarán para capturar requisitos y reglas de negocio, para generar casos de prueba y escenarios, para explorar diseños, para verificar protocolos y para producir casos seguros. En otras disciplinas científicas y de ingeniería se utilizarán para apoyar el modelado y el análisis a nivel de sistema. En los próximos años los métodos formales tendrán una comunidad de investigación mucho más amplia y cubrirán una mayor gama de disciplinas. En este artículo se describen los desafíos y oportunidades que debe afrontar la investigación en esta área del conocimiento para alcanzar estas metas, desde las visiones de la formación, la ciencia y la industria. Palabras clave: Métodos formales, Ciencias Computacionales, verificación formal, formación, lógica.
1. INTRODUCCIÓN Para explicar por qué funcionan o fallan las cosas se utiliza argumentos lógicos, pero para verificar la correctitud de un producto se utiliza argumentos formales, que están conformados por una estructura precisa de axiomas y reglas de inferencia. Mediante la codificación de estas reglas y utilizando un computador, se puede comprobar mecánicamente los argumentos formales de una especificación para verificar si es correcta. Las técnicas automatizadas de razonamiento formal también se utilizan para generar ejemplos de algunas limitaciones en matemáticas. El marco axiomático ha hecho parte del método científico desde Platón y el uso del razonamiento formal ha sido defendido desde las investigaciones de Raymond Lully [1] y Leibniz [2]. La investigación en métodos formales ha alcanzado significativos progresos en los últimos años, y como herramienta y teoría se utilizan cada vez más en una amplia variedad de formas en la industria. Muchos de los problemas desafiantes en la construcción de sistemas
software seguros, en la programación de procesadores multi-núcleo y en los sistemas ciber-físicos requieren el apoyo formal para su modelado y análisis. Po otro lado, existe un número creciente de aplicaciones para ellos en la investigación en Ciencias Computacionales (CC) y en otras disciplinas ingenieriles y científicas. Pero a pesar de sus logros y eficiencia demostrada, los métodos formales todavía no son una parte integral de los procesos formativos en CC, e incluso a nivel de postgrado pocos estudiantes siguen carreras de investigación en esta tecnología. En este trabajo se resume algunos de los desafíos que enfrentan los métodos formales para lograr una mayor utilización y aplicación en los procesos formativos, en la ciencia y en la industria, y se describe las oportunidades para sus aplicaciones. 2. CONTEXTO DE LOS MÉTODOS FORMALES Las Ciencias Computacionales se basan en la construcción y el estudio de la lógica y la abstracción puras. Aunque los computadores existen en la realidad física, la computación realmente se encarga de la representación y la manipulación de la información, que es algo inmaterial. Mientras las matemáticas tratan con las leyes de las entidades abstractas, como los números, los conjuntos, las superficies, los volúmenes, las relaciones, el álgebra y los homomorfismos, la computación se focaliza en la manipulación de la información representada en abstracciones, como los bits, los vectores-bit, las matrices, las tablas, las pilas, las colas, los árboles y las bases de datos. Las matemáticas se utilizan para representar y analizar la realidad física, pero la computación se puede utilizar para el modelado y la simulación. Mientras que las primeras tratan con operaciones con descripciones concisas, el hardware y el software de los sistemas computacionales son construcciones complejas. Los sistemas software son necesarios para que el hardware se desempeñe con precisión y fiabilidad, incluso al tratar con datos poco fiables, porque están propensos a fallos de sus componentes físicos. Un científico computacional debe desarrollar capacidad lógico-interpretativa y abstractiva [3] para
la
comprender los problemas y modelar las soluciones mediante abstracciones, con el fin de especificar formalmente los requisitos, construir representaciones de datos que sean eficaces y expresivas, diseñar algoritmos correctos y eficientes que funcionen con todas las entradas posibles, y moldear diseños en un código confiable. La lógica y la abstracción son importantes para formalizar el entorno en el que el software funcionará, para especificar los requisitos, para diseñar e implementar la arquitectura del sistema y los componentes, y para depurar y mantener el sistema en el tiempo. Estos científicos están constantemente solucionando problemas, generando representaciones de datos, algoritmos y protocolos, diseñando nueva programación y lenguajes descriptivos, y resolviendo conflictos de sincronización. En los últimos sesenta años las CC han logrado desarrollar un cuerpo de conocimientos lógico-abstractos para resolver esos problemas, entre los que se encuentra los métodos formales. Los sistemas computacionales tratan con la complejidad a todos los niveles, desde las plataformas hardware, los protocolos y las representaciones de datos hasta los sistemas ciber-físicos y las sofisticadas amenazas a la seguridad. Los métodos formales representan un enfoque para gestionar esta complejidad mediante el uso de representaciones simbólicas de abstracciones, extraídas como fórmulas lógicas desde las matemáticas y la computación. Estas fórmulas se pueden manipular de varias maneras para construir pruebas, a la vez que se ven como obstáculos a resolver. La computación trata con fenómenos dinámicos en autómatas y máquinas de estado, y para capturar el comportamiento y las propiedades computacionales se utilizan los formalismos expresivos de la lógica temporal. Los métodos formales se han desarrollado por más de cinco décadas, desde el trabajo pionero de McCarthy [4], y han introducido teorías como la programación funcional, la programación lógica, la semántica denotacional, la semántica operacional, la semántica axiomática, los sistemas tipos, la teoría de tipos, la invariancia, la terminación, la seguridad, la vida de conexión, la lógica modal, la lógica temporal, la lógica descriptiva, los lenguajes de especificación, el álgebra de procesos, la interpretación abstracta, la verificación en tiempo de ejecución, y otras innovaciones conceptuales influyentes. Casi una cuarta parte de los premios Turing [5] entregados entre 1966 y 2007 fueron reconocimientos a trabajos con un componente significativo de métodos formales. Actualmente, el campo de los métodos formales está en una encrucijada. En el lado positivo, la tecnología está bien desarrollada, existe un amplio número de aplicaciones interesantes y de importantes usuarios industriales. Sólo en Microsoft Research existe cerca de un centenar de investigadores trabajando en el desarrollo y uso de los métodos formales. Sin embargo, en el lado negativo, no se consideran un componente de la corriente principal de las Ciencias Computacionales. Existen pocos
profesores universitarios trabajando en el área, la oferta de cursos a nivel de pregrado o postgrado es escasa, difícilmente se desarrollan proyectos importantes, y sólo un pequeño número de graduados de doctorado los acogen como fuente de investigación y trabajo. Además, la capacidad lógico-interpretativa y abstractiva de los estudiantes a nivel de pregrado y postgrado y no se desarrolla [6], y por el contrario parece haber disminuido en los últimos años, a la vez que los planes de estudios en CC generan cada vez más fobia hacia cuestiones relacionadas con ella y las matemáticas [7]. La tecnología de los métodos formales es emocionante y cada vez más relevante. Con el incremento del poder computacional de la última década es el momento de llevar las Ciencias Computacionales a la esfera semántica de los modelos y la inferencia, lo que posibilitará una serie de nuevas aplicaciones en los procesos formativos y en la industria. Como por ejemplo en los modelos de hardware digital y analógico, las teorías matemáticas, los sistemas físicos estáticos y dinámicos, las redes biológicas, los sistemas software complejos, e incluso la psicología, la filosofía y las interacciones sociales [8]. La formación a todos los niveles se puede beneficiar del modelado y el análisis formal y del uso de metáforas computacionales. Actualmente, los procesos formativos en diversas áreas se desarrollan en términos de tareas de procesamiento de información de bajo nivel, mientras que la percepción real se obtiene mediante el uso de modelos computacionales y de CC. Por ejemplo, los autómatas finitos pueden servir como metáfora para una serie de tareas, como el funcionamiento de una máquina expendedora, los analizadores de lenguajes, o los videojuegos, y los juegos interactivos en sí constituyen otra metáfora computacional. Los sistemas dinámicos se pueden utilizar para modelar flujos continuos, como los vehículos en movimiento, los proyectiles, los niveles de fluidos, los reguladores de velocidad, los circuitos analógicos y los péndulos. Los sistemas híbridos combinan cambios de estados discretos y continuos, y se pueden utilizar para termostatos modelo, sistemas de control de navegación y sistemas biológicos y económicos. Los modelos computacionales, las metáforas y la tecnología pueden enriquecer los procesos formativos a todos los niveles en las Ciencias Computacionales, ya sea mediante el apoyo a la formación, el desarrollo de competencias, o la colaboración y la comunicación. La aceptación industrial de los métodos formales también se puede ampliar. Actualmente, algunas industrias son productoras y consumidoras de herramientas formales. Por ejemplo, Intel y AMD los utilizan para controlar la equivalencia de circuitos, generar secuencias de prueba, controlar modelos de controladores de estado finito, y para demostrar teoremas acerca de algoritmos aritméticos de punto flotante. Microsoft tiene una serie de proyectos que utilizan software de comprobación de modelos y
razonamiento automatizado para analizar el código secuencial para terminación, correctitud asercional y la ausencia de vías y callejones sin salida. Rockwell-Collins utiliza el razonamiento automatizado para la verificación de software. Empresas de diseño electrónico automatizado, como Synopsys, Cadence y Mentor Graphics, venden herramientas para el control de modelos y de equivalencias, y Matlab aplica un verificador de diseño Simulink para generar casos de prueba y verificar propiedades. Sin embargo, estos esfuerzos son relativamente modestos en comparación con el uso sistemático que se le puede dar a las herramientas formales en cualquiera tipo de proceso. Aunque la tecnología formal todavía no está lista para uso masificado, hoy se tiene un marco amplio para pensar en aplicaciones no tradicionales más ambiciosas. Se necesita innovaciones audaces que aprovechen la potencia de las herramientas y técnicas formales modernas para transformar radicalmente los procesos formativos, tanto en computación como en otras disciplinas que valoran las metáforas computacionales. También se tiene una oportunidad para aprovechar los métodos formales en el modelado asistido por computador y en el diseño de sistemas complejos. 3. COMPONENTES DE LOS MÉTODOS FORMALES La idea de colocar a las matemáticas y a la ciencia sobre una base axiomática se remonta a Pitágoras, Platón, Aristóteles y Euclides [9]. El uso de un lenguaje formal soportado en un razonamiento mecanizado fue defendido por primera vez por Raymon Lully en el siglo XIII [1] y más tarde por Gottfried Leibniz en el siglo XVII [2]. Refiriéndose al uso de la tecnología computacional para gestionar grandes volúmenes de información, Vannevar Bush [10] sugirió que la lógica puede llegar a ser muy difícil, y sin duda sería muy conveniente generar más seguridad en su uso. Es posible que algún día hagamos clic sobre las opciones operativas de una máquina con la misma seguridad que hoy registramos las ventas en una caja registradora (p. 12). Hoy, con el incremento de la potencia computacional y el desarrollo de potentes herramientas software para el razonamiento formal, la ciencia está mucho más cerca de alcanzar los objetivos que se trazaron estos pensadores visionarios. La terminación y la invariancia son dos componentes importantes de los métodos formales para verificar código secuencial. Por ejemplo, considere una bolsa con n pelotas blancas y negras y con un suministro ilimitado de pelotas por fuera de la bolsa. Partiendo de que existen por lo menos dos bolas en la bolsa, el proceso consiste en tomar, cada vez, dos bolas de la bolsa e introducir una. Si las dos bolas que se toman tienen el mismo color se inserta una bola negra, y si es diferente se inserta una bola blanca, y así sucesivamente. ¿Es posible asegurar que este procedimiento terminará en algún momento?
¿Qué se puede afirmar acerca del color de la bola que queda en la bolsa con respecto al contenido inicial? Otro ejemplo es el problema del simple recuento de votos para determinar si en una elección alguno de los candidatos obtuvo la mayoría. La solución propuesta en el algoritmo de Boyer y Moore [11] funciona mediante la eliminación de pares de votos para candidatos diferentes, hasta que los que queden sean para un sólo candidato. El otro deberá ser el ganador, si alguien tiene la mayoría. Es posible que ninguno de los candidatos obtenga más de la mitad de los votos. ¿Por qué funciona este algoritmo? La explicación radica en su prueba. En líneas generales, si un candidato V tiene mayoría, entonces no importa cómo, los votos de V, se aparean y eliminen con los de los otros candidatos, porque no habrá votos para V que se queden sin pareja. Esta intuición se formaliza tanto en el algoritmo como en la prueba, pero en ambos casos los detalles de la formalización no son triviales. Estas pruebas formalizadas son útiles para descubrir, diseñar e implementar algoritmos correctos, así como en la demostración de que son correctos. La semántica formal explica la interpretación matemática de un fragmento de texto, o una propiedad del programa, y las técnicas de sondeo propuestas para el razonamiento acerca de los programas y sus propiedades. Es un prerequisito para la aplicación exitosa de los métodos formales. La composición es un desafío clave en la semántica formal, porque es conveniente desarrollar las propiedades de los programas en términos de los subprogramas constituyentes. Los recientes avances en semántica de programas han permitido formalizar su comportamiento con almacenamiento dinámico, programas orientados a objetos y programas concurrentes. La automatización juega un rol importante en la aplicación exitosa de los métodos formales, debido a que para verificar el comportamiento del software y el hardware de estado finito se puede utilizar, con una cantidad limitada de esfuerzo, la comprobación de modelos para anotar los estados con sus propiedades de comportamiento. Por ejemplo, para una determinada propiedad esto se puede hacer en un tiempo lineal en el tamaño del espacio de estado del sistema. Por supuesto, ese espacio puede ser enorme, porque incluso un sistema con n bits de estado tiene 2n estados posibles. El problema de explosión de estados en la comprobación de modelos se ha abordado de diversas formas mediante el uso de representaciones simbólicas, abstracciones y reducciones de orden parcial. La comprobación de modelos se ha extendido a los sistemas de estado infinito, como los paramétricos, los de tiempo real y los híbridos lineales. La satisfacibilidad booleana mediante la verificación limitada de modelos también se utiliza para representar y razonar acerca de estos sistemas. En los últimos años se han hecho
importantes mejoras algorítmicas en estos procedimientos, que han sido explotadas por los solucionadores de restricciones procedentes de una mezcla de teorías, como las de la aritmética, los arreglos, los vectores de bits y los tipos de datos recursivos. Los procedimientos de satisfacción se pueden utilizar para comprobar que una fórmula extensa no se puede satisfacer, o para generar contraejemplos, casos de prueba, o calendarios, cuando la fórmula en realidad se puede satisfacer. 4. DESAFÍOS Y OPORTUNIDADES En este siglo no existe duda acerca de que los métodos formales se deben utilizar más ampliamente en la academia y la industria, y muchos de los problemas de complejidad que se presentan en la Ingeniería de Software moderna, como los relacionados con los procesadores de múltiples núcleos, las máquinas virtuales múltiples, los requisitos para mayor seguridad y los sistemas distribuidos globalmente, no se resuelven eficientemente con los métodos existentes, porque son densos en las pruebas. También se puede argumentar que la formación en Ciencias Computacionales se podría beneficiar con la introducción de herramientas y técnicas formales al currículo; sin embargo, existen algunos desafíos que se deben abordar antes que los beneficios de los métodos formales sean un caso convincente. 1. Los lenguajes de programación utilizados en el desarrollo de software a gran escala tienen una semántica formal compleja. Parte de ella es innecesaria e inútil, pero las herramientas formales tendrán que hacer frente a la complejidad de características como el flujo de información, las interrupciones, las discusiones y la concurrencia. 2. La aplicación exitosa de los métodos formales requiere habilidad e ingenio, incluso con una automatización amplia, pero los usuarios potenciales podrían no estar dispuestos a invertir tiempo y dinero en una tecnología sin tener una idea clara de los beneficios. 3. El costo de la aplicación de los métodos formales en un proyecto de desarrollo de software puede ser alto, y no se realmente hasta qué punto su aplicación puede reducir los costos de las pruebas. 4. Las herramientas formales no son lo suficientemente amigables con el usuario como para pensar en un uso más amplio. En particular, cuando falla un proceso de verificación no se obtiene una respuesta útil; además, el mantenimiento de un desarrollo formal es una tarea de grandes proporciones, comparable a las del mantenimiento de software. 5. Existen diversas herramientas formales eficientes, pero a menudo los problemas difíciles requieren una
combinación de varias de ellas. La interoperabilidad es un desafío para estas herramientas, porque presentan sutiles diferencias semánticas que se deben superar. La comunidad de investigadores de los métodos formales ya han comenzado a trabajar algunos de estos desafíos, y mucho de ese esfuerzo tecnológico está orientado para hacer que su funcionamiento sea transparente al usuario [12]. El costo de la aplicación de los métodos formales bajará a medida que las herramientas sean más potentes y más integradas. La ley de Moore proporciona una fuerte aceleración en el poder de las herramientas formales, y a medida que la tecnología se estabiliza el desarrollo de interfaces de usuario amigables se convertirá en una prioridad. Sea cual sea el futuro, la investigación en métodos formales de hoy enfrenta una serie de desafíos, los cuales de resumen a continuación. 4.1 En los procesos formativos Los métodos formales deben estar plenamente integrados en la formación de un científico computacional. La formación en temas como matemática discreta, lógica computacional, teoría de la computación, algoritmos, bases de datos, compiladores, sistemas operativos, arquitectura de computadores, lenguajes de programación, Inteligencia Artificial y análisis numérico se puede lograr con mayor eficacia si se utilizan métodos y herramientas de modelado y análisis formal. Estos cursos carecen actualmente de formalidad, y los programas en Ciencias Computacionales e Ingeniería son cada vez más alérgicos a las matemáticas. Esto significa que los egresados de estos programas no están significativamente mejor calificados, en áreas como la lógica y la abstracción, de lo que están los egresados en otras disciplinas. Existen algunos esfuerzos preliminares en esta dirección, como el uso de herramientas para la formación en Ingeniería de Software y en pruebas formales, que están dando resultado; la propuesta de Wing [13] puede servir como modelo para la incorporación en los cursos de computación e ingeniería de los métodos formales y las herramientas de verificación; el proyecto TeachScheme! [14] experimenta con el demostrador de teoremas ACL2, para formar a estudiantes de primer año en programación; además, herramientas como Alloy y Coq se aplican con buenos resultados en procesos formativos en Ingeniería de Software. Otras disciplinas también se pueden beneficiar de la utilización de los métodos formales. Debido al éxito de la verificación formal del hardware, los estudiantes de ingeniería eléctrica y electrónica están cada vez más necesitados de aplicar el razonamiento booleano y la lógica temporal. Muchos cursos de ingeniería utilizan el framework de MATLAB en el modelado y la simulación. Estos modelos son formalizables y a partir de la integración del razonamiento y la simulación se puede
lograr muchos beneficios pedagógicos. Mathematica es una herramienta popular para el álgebra computacional y un medio para desarrollar cursos [15, 16], que junto a otros sistemas de álgebra computacional se pueden mejorar para el desarrollo de pruebas, como se ha hecho con REDLOG [17]. La combinación del modelado, la construcción de pruebas y las herramientas de álgebra computacional puede sustituir a los libros de texto por livebooks, que combinen la información con el software para apoyar la experimentación, la visualización y la prueba. Las herramientas de abstracción que se aplican durante un curso determinado pueden llegar a hacer parte de las herramientas cotidianas del estudiante. 4.2 En la ciencia Los modelos formales y las técnicas de análisis se utilizan en algunas ciencias para lograr la comprensión a nivel de sistema. Por ejemplo, las redes reguladoras de genes se pueden modelar como redes booleanas, sistemas híbridos, o sistemas estocásticos, y utilizando la deducción y la verificación de modelos se puede analizar sus propiedades. La iniciativa de Systems X [18] logra una visión de diferentes procesos naturales y artificiales a nivel de sistema. Estos modelos capturan algunas abstracciones del sistema destino real utilizando máquinas de estado y limitaciones. Las técnicas formales se pueden utilizar para deducir las propiedades de estos modelos, y el análisis para las teorías de prueba, el diagnóstico de problemas y para hacer predicciones. 4.3 En la industria Microsoft cuenta con cerca de un centenar de investigadores que trabajan en métodos formales. Otras compañías tecnológicas, como Intel, AMD, Rockwell Collins y The MathWorks, desarrollan y utilizan activamente herramientas formales. Algunos proveedores de automatización de diseño electrónico, como Cadence, Mentor Graphics y Synopsys, cuentan con importantes productos de verificación formal en su suite de herramientas. Microsoft trabaja en cerca de una decena de grandes proyectos en desarrollo formal de herramientas de Ingeniería de Software, para la especificación, la notación, la generación de pruebas, la verificación de modelos y la comprobación de seguridad, y varios se centran en la construcción de un motor para deducir y explorar modelos simbólicos. Se necesitan herramientas en dominios con estrictos requisitos de seguridad, mientras que las automatizadas se pueden insertar en entornos de desarrollo integrados IDEs y en compiladores. Un desafío particular para los métodos formales es el desarrollo de sistemas ultra-grandes, los cuales integran componentes de software y de hardware desde diversas fuentes.
fiabilidad y seguridad, es posible esperar que la implementación de los métodos formales en la industria se incremente. También se espera que los laboratorios de investigación industrial logren importantes resultados de investigación, así como en prototipos. 5. CONCLUSIONES Las décadas entre 1975 y 2005 se pueden considerar como la época dorada de la investigación en métodos formales. El trabajo de estos años produjo una serie de avances significativos en lógica y semántica de programas, lenguajes de especificación y programación, metodologías de diseño, técnicas de análisis estático, razonamiento automatizado, herramientas de verificación de modelos y asistentes de prueba interactivos. Se espera que en los próximos decenios la tecnología de los métodos formales expanda su campo de aplicación y audiencia, tal como se observa la tendencia actual [8]. Pero se espera: 1) que estas técnicas sean lo suficientemente potentes para ser utilizadas sin ningún tipo de esfuerzo intelectual manifiesto y 2) que la complementariedad entre la percepción y el juicio humano, y el cálculo soportado en computador y la inferencia se puedan aprovechar como herramientas clave en la gestión de la complejidad de la información. Se puede esperar que los métodos formales enriquezcan no sólo las Ciencias Computacionales sino otras disciplinas, las cuales se beneficiarán de la formalización y de la inferencia. Uno de los desafíos más importantes para la investigación en métodos formales será lograr impactar suficientemente los programas de formación, tanto a nivel de pregrado como de postgrado. Actualmente ya no es secreto que se necesitan más profesionales en Ciencias Computacionales y en Ingeniería, con una capacidad lógico-interpretativa y abstractiva lo suficientemente desarrollada como para presentar soluciones eficientes y eficaces a los complejos problemas de este siglo. Una sólida formación en métodos formales, matemática y lógica es la clave para superar este desafío. La esperanza es que se logré pronto materializar el sueño de Leibniz: de que en lugar de recurrir a argumentos técnicos seamos capaces de sentarnos frente a un computador y decir: Vamos a calcular. 6. REFERENCIAS [1] [2]
[3] [4]
Con la creciente conciencia en las capacidades de las herramientas formales y de requisitos más estrictos en
[5]
Waite, A. E. (2010). Raymund Lully The Illuminated Doctor Of Majorca. Kessinger Publishing. Bennett, J. (2003). Learning from Six Philosophers: Descartes, Spinoza, Leibniz, Locke, Berkeley, Hume. Oxford University Press. Serna, M. E. (2012). El Desarrollo de la Capacidad Lógico-Interpretativa y Abstractiva. Reporte Técnico: USBMED-FIDI-ESM-0112. McCarthy, J. (1959). Programs with Common Sense. Online [Feb. 2012]. http://amturing.acm.org/ [Jan. 2012].
[6]
Serna, M. E. (2011). Abstraction as a critical component in Computer Science training. Avances en Sistemas e Informática, 8(3), pp. 79-83. [7] Tucker, A. B.; Kelemen, C. F. & Bruce, K. B. (2001). Our curriculum has become Math-Phobic! ACM Sigcse Bulletin, 33(1), pp. 243-247. [8] Serna M. E. Métodos Formales: Perspectiva y Aplicación Futura. En H. Pérez G. et al. (Eds.), III Jornadas de Investigación Facultad de Ingenierías JOIN 2011, pp. 6468. [9] Boyer, C. B.; Merzbach, U. C. & Asimov, I. (1991). A History of Mathematics. Wiley. [10] Bush, V. (1945). As We May Think. The Atlantic Monthly, 1(1-2), pp. 1-18. [11] Boyer, R. S. & Moore, J. S. (1981). MJRTY – a fast majority vote algorithm. Technical Report 32. Institute for Computing Science, The University of Texas. [12] Tiwari, A.; Rushby, J. & Shankar, N. 2003. Invisible formal methods for embedded control systems. Proceedings of the IEEE, 91(1), pp. 29-39.
[13] Wing, J. M. (2000). Weaving formal methods into the undergraduate computer science curriculum. Lecture Notes in Computer Science, 1816, pp. 2-9. [14] Eastlund, C.; Vaillancourt, D. & Felleisen, M. ACL2 for freshmen: First experiences. Seventh International Workshop on the ACL2 Theorem Prover and its Applications, pp. 1-9. Austin, Texas, Nov. 15-16. [15] Kaltofen, E. (1997). Teaching computational abstract algebra. Journal of Symbolic Computation, 23(5-6), pp. 503-515. [16] Scott, D. S. (1991). Exploration with Mathematica. En: Rashid, R. F. (Ed.), CMU Computer Science: A 25th Anniversary Commemorative. Assn for Computing Machinery, p. 505-519. [17] Dolzmann, A. & Sturm, T. (1997). REDLOG: Computer algebra meets computer logic. ACM SIGSAM Bulletin, 31(2), pp. 2-9. [18] http://www.systemsx.ch/ [May 2012].