Archive for the ‘Python’ Category

Tidal nace en Software Libre

mayo 30, 2007

El Proyecto Tidal es una propuesta del Licenciado Ernesto Freyre. Siguiendo el concepto de Larga Cola (Long Tail) instrumentará un repositorio de documentos que será beneficioso para todo proyecto de gestión. Además de lo clásico: subir documento y bajar documento, se incluirá el control de versiones del documento, las revisiones que ha tenido el documento, clasificaciones usando etiquetas, copias del documento, mezclas de documentos, nuevos documentos, etc.

Es un proyecto instrumentado en el framework Django. Se puede descargar el proyecto empleando cualquier cliente de Subversión. Pueden poner en práctica el uso del TortoiseSVN. De hecho es lo que utilizo, su manejo es muy simple.

Sin lugar a dudas se te ocurrirán miles de usos para esta herramienta. La mejor explicación sobre el proyecto la da la wiki del mismo.

Proyecto de Sistema en Software Libre

abril 23, 2007

En el Segundo Forum de Ciencia y Técnica de la Rama del Comercio Exterior presenté este trabajo que mereció una mensión. Aquí les muestro el resumen del trabajo

La actividad de nuestras empresas requiere de la automatización de la gestión de los Recursos Humanos para lograr ser eficientes y dar respuestas a las necesidades operativas en general. Actualmente se cuenta con sistemas que lo implementan de forma insuficiente. Se propone un proyecto que da respuesta a la creación de un sistema que responde a esta necesidad y que será el punto de partida para la creación de otras aplicaciones que respondan a las necesidades y requerimientos de las entidades. Se presenta un análisis de la situación actual para enfrentar este proyecto.

Autores: Lourdes Odilia Moya Campos, Ernesto Freyre González y Alexander Cordero Pérez

Proximamente el trabajo será publicado integramente junto a los demas expuestos. Les haré llegar un enlace a los mismos.

Sistema de Control de Versiones

abril 4, 2007

Sistemas de Control de Versiones

Conferencia de Software Libre
Por Alfonso Alí
27 de marzo del 2007

En esta conferencia se abordó los sistemas de control de versiones Subversión y CVS

Trabajo colaborativo de manera coordinada:
1. Subversión
2. Proyecto de aplicación
3. Aplicaciones.

Se comentó sobre la forma de controlar las versiones de una aplicación durante su gestación. Esta es una actividad fundamental durante el desarrollo de cualquier proyecto. Usualmente se hace almacenando copias del sistema junto a comentarios de los cambios hechos. Esto es ineficiente y se puede cometer errores como sobrescribir el trabajo de otros. Este método fue calificado como primitivo.

Los sistemas de control de versiones permiten el seguimiento, mantenimiento y almacenamiento de la historia de cambios en los códigos fuentes de un proyecto. Proporciona facilidades de combinar cambios de múltiples personas.

Beneficios:
• Integridad de datos
• Productividad
• Identificabilidad
• Desarrollo colateral
• Distribución del trabajo

Elementos:
• Repositorio: Contiene todo el proyecto
• Directorios de trabajo: Copia sobre la cual trabaja la persona.
• Revisiones: Cambios realizados en el proyecto en un momento determinado.
• Logs: Documentación de los cambios y detalles extras.
• Marcas (Tags): Nombre de una etapa de proyecto.
• Ramas (Branches): Vida paralela. Versiones de un proyecto que se llevan paralelos.

Ejemplos:
Centralizados: RCS, CVS
Distribuidos: SVK, Arch, Darc, Git, Monotone

Subversion:
• Similar a CVS
• Superior al CVS, mejorado.
• Commits atómicos, o sea al realizar actualizaciones en el proyecto estas se guardan completamente o no se guardan en caso de ocurrir alguna interrupción.
• Usa http como vía de acceso.
• Scripts de acciones
• API

Tareas básicas:
• Crear repositorio (svnadmin create)
• Crear proyecto (svn import)
• Obtener ficheros (svn co)
• Determinar que ha cambiado (svn status, svn diff)
• Actualizar copia de trabajo (svn update)
• Actualizar repositorio (svn commit)
• Resolver conflictos (svn resolve)
• Añadir fichero (svn add)
• Borrar fichero (svn del)

Carpetas del repositorio:
Trunk: Línea principal o tronco del proyecto
Tags: Puntos en la historia del proyecto
Branche: Rama del proyecto

Sistema de control de versiones SVK
Es más efectivo que otros sistemas si no contamos con una buena conexión permanente. Es un sistema distribuido. Hace sincronización cuando hay conexión. Este será el sistema que se empleará en el curso. La combinación entre ramas es muy fácil.

Comandos:
Como comandos básicos tiene los mismos del Subversión. Además,
Iniciar depósito: svk depotmat –init
Hacer el mirror: svk mirror http://repo//repo
Sincronizar mirror: svk sync//repo
Crear una rama local: svk cp//repo// local//repo
Incorporar cambios a la rama local: svk smerge –l //repo //local/repo
Incorporar cambios al repo: svk smerge –l //local/repo //repo
-l esta opción incorpora automáticamente los mensajes echos.

Manejo de patch
Se crean igual pero con –p
Crear un patch: svk smerge –p mipatch //local/repo //repo
Ver match creados: svk match –list
Obtener un patch determinado: svk patch –view mipatch
Actualizar patch: svk patch –update mipatch
Recrear un patch: svk –regen mipatch

Leer más sobre este tema:
Control de versiones

Introducción a los sistemas de control de versiones

Control de Versiones con Subversion

Se hizo un aparte recomendando la lectura de la “La catedral y el Bazar” de Eric S. Raymond. Un ensayo a favor del software libre. Este es un espaldarazo a la necesidad del empleo de este tipo de sistemas de control de versiones.

Y otro artículo sobre este con una crítica al ensayo. (Ver artículo)

Se introdujo el futuro proyecto que será desarrollado en el curso como ejercicio práctico. Este será argumentado más adelante.

Manual de Python

abril 2, 2007

Para los interesados en el curso se dió esta dirección de un manual de Python para ser estudiado por todos. Aquellos que se interesen en la programación y especialmente en hacerlo con Python aquí tienen una buena documentación.
Manual de Python

La wiki del curso

marzo 23, 2007

Una de las herramientas que se están empleando en el Curso de Python en el Palacio de Computación es una wiki. En ella se está volcando toda la información de las conferencias siguiendo la filosofía de trabajo de estos sitios colaborativos. Está esperando por sus aportes y las visitas de los interesados.
Para aquellos que desconocen de que se está hablando aquí les va una breve reseña.
wiki (del hawaiano wiki wiki, rápido) es un sitio web colaborativo que puede ser editado por varios usuarios. Los usuarios de una wiki pueden así crear, editar, borrar o modificar el contenido de una página web, de una forma interactiva, fácil y rápida; dichas facilidades hacen de una wiki una herramienta efectiva para la escritura colaborativa.
La tecnología wiki permite que páginas web alojadas en un servidor público (las páginas wiki) sean escritas de forma colaborativa a través de un navegador, utilizando una notación sencilla para dar formato, crear enlaces, etc, conservando un historial de cambios que permite recuperar de manera sencilla cualquier estado anterior de la página. Cuando alguien edita una página wiki, sus cambios aparecen inmediatamente en la web, sin pasar por ningún tipo de revisión previa.
En enero de 2001, los fundadores del proyecto de enciclopedia Nupedia, Jimbo Wales y Larry Sanger, decidieron utilizar un wiki como base para el proyecto de enciclopedia Wikipedia.
Alexander Cordero Pérez

Conferencia 3

febrero 19, 2007

Conferencia # 3 Software Libre
Python Básico. Medardo Rodríguez

Documentaciones:

Debian “Aptitude install pithon_doc”

http://www.python.org/doc/

Además:

• Python Books
• Guido’s essays and presentations
• Non English documents

• Trabajaremos con Python 2.4, ya existe la version 2.5

• Al hablar de estilo de programación en los lenguajes de programación tradicionales se tiene el gusto del programador como lo más importante. Esto es erróneo.
Al asumir que el único proceso que ocurre en la programación es un proceso hombre-máquina se está cometiendo un error. La programación es un proceso social.
En el Software Libre cualquiera recibe los códigos fuentes. Inclusive en el software privativo se estudian los códigos fuentes.

• Claridad: Es el proceso de percepción de un mensaje (sintaxis) Esto debe ser lo más simple posible.

• El Python no es eficiente en cuanto a velocidad pero sí respecto a la claridad.

• C++ y Pascal están hechos para permitir ciertas libertades a la hora de escribir el código.

• Delimitadores en Python.

   o Espacios y sangrías (4 espacios)
   o Permiten definir los bloques de programación
o En C sería usando llaves.
o En Pascal sería usando begin…end;
o Todas las variantes a la hora de emplear delimitadores son correctas para el compilador de C y Pascal.
• Debe haber un acuerdo para que el estilo de programación sea único.

• Editor emacs creado por Stallman.

   • Es preferible usar solamente espacios y cuatro espacios para el tab.
   • No usar más de 80 caracteres en una línea.
   • Las opciones –t dan warnings si hay mezcla y    –tt errores.
   • Usar líneas en blancos para separar bloques
   • Las clases con dos líneas.
   • Las funciones con una línea.
   • Usar espacios en las expresiones para delimitar niveles de precedencia.
   • No usar comentarios que sean obvios.
   • Sensible a la mayúscula.
   • Convenciones por nombre.

• Una buena selección de nombres aporta claridad y elegancia a la estructura del código.

• Prioriza la buena comunicación entre los programadores.

• Libros para comenzar con Python.

o http://swaroopch.info/text/byte_of_python:main_page
o Dive into Python.
Debian
• Python es un lenguaje script o interpretado (sus programas se ejecutan en un interprete en vez de compilarse)

• Lenguaje de código intermedio

• Ventajas del shell ipython

• ¿Cómo se programa en Python?

Las instrucciones se pueden probar una a una en el shell
En Python todo es objeto.

Vamos a emplear una definición de objeto abreviada, en otras conferencias lo iremos ampliando.

Objeto: Es un valor con estado y comportamiento.

El estado está dado por un conjunto de atributos y sus valores en un instante de tiempo dado.

El comportamiento está definido por las operaciones (digamos métodos para los entendidos en la Programación Orientada a Objetos)

• Ejemplo de instrucciones
Complex=3+5j
Complex.__doc__
Import sys
Sys.__doc__ (__doc__ ofrece la documentación de soporte)

• Modulos en Python

Son objetos que se definen a través de un archivo de código fuente.
Para usar otros modulos se usa la instrucción import
Import sys, os
From getopt import getopt, getoptError

Más adelante veremos paquetes y formas de distribuir softwares.

• print imprime varias cadenas separadas por comas. Todos los objetos de Python deben tener una representación como cadena.

• Los módulos tienen un atributo de nombre “__name__”. Si es el modulo principal este atributo recibe el nombre de “__main__”

• Para probar modulos se puede usar:
If __name__=”__name__”:
Pass

# indica comentarios

#! Indica con que programa se ejecuta el script. Esto se conoce como pragma

“””, comentario con más de una línea

• Traduciendo nuestro código fuente a lenguaje natural nos da la medida de la claridad (eficacia) con que estamos programando.

• La codificación es distinta al razonamiento.

Tipos de datos:

   o Lógicos o boléanos.
o Enteros.
o Punto flotante.
o Complejos.
o Cadenas de caracteres.
o Diccionarios.
o Tuplas.
o Listas.

Booleano

   o 0 es false y todo lo demás es true.
o Cadena vacía "es false.
o Una lista vacía [] es false.
o Una tupla vacía () es false.
o Un diccionario vacío {} es false.
o print bool(0)
o print bool(5)
o print bool({})

Diccionarios

o D={“Server”:”data.sld.cu”, “database”:”master”}
print d[`server`]
d[`database`]=`main`
del d[`server`]
len(d)

• Algo bien encapsulado se puede utilizar fácilmente y queda claro lo que es. Esto tiene implicaciones en teoría de tipos.
El encapsulamiento implica que existe una relación biunívoca entre cada elemento.
Python tiene muy bien implementado el encapsulamiento.

• Los diccionarios también se pueden considerar como listas.

Listas

Li=[“a”,”b”,”mpilgrim”,”z”,”example”]
El tratamiento para las listas es muy peculiar, lo que se hace es enumerar las fronteras.
/a/b/c/d/e/f/g/h/i/j/ Las barras indican las fronteras de los elementos de las listas
Las fronteras se enumeran desde 0 hasta 10 (en este caso)
Luego L[1] es “a”
L[1:3] es b, c

Li[0]
Li[-3] De atrás hacia delante, el elemento que se encuentra en la frontera 3
Li[1:3] Los elementos entre esas fronteras
Li[2:] Los elementos desde la segunda frontera hasta la ultima
Li[:3] Los elemento desde el inicio hasta la frontera 3

Li[:] En clon de la lista (copia)
d=Li[:]

Li.append(“new”)
Li.insert(2,`second`)
Li.extend([`one`,`two`])
Li.index(`one`)
in devuelve true o false si el elemento se encuentra
Li.remove(`new`)
Li.pop()
Li.pop(2)
Li+=[`o`,2]
Li=3*[1,2] esto da como resultado {[1,2],[1,2],[1,2]}

Tuplas

Son de solo lectura
T=(1,2)
L=(5)
Type(L)
Las tuplas son más eficientes que las listas

Formatear cadena

X=5
print ´%s=%d´ %(`X`,x)
uid=”sa”
pwd=”secret”

Mapeando Listas y Tuplas

Para las cadenas existen los métodos joint y split

Funciones

   o Type
o Str
o Dir
o Import__builtin__

Control de Flujo

   o Il: elif: else:
   o While : else:
   o For i in range
   o Break
   o Continue

• Operadores

Conferencia 2. Programación

febrero 19, 2007

Curso de Software Libre
Conferencia #2 Programación Medardo Rodríguez

Nota: Para editar documentos se usa openoffice.org

Programación:

  • Ingeniería
  • Ciencia Conceptos
  • Arte
  • ?

Podemos decir que la programación es ingeniería, ciencia, arte y algo más. De eso se tratará nuestra conferencia de hoy.

Lo más intuitivo: Programación es ingeniería.

Ingeniería: Proceso de creación, construcción
de cosas.

La programación como ingeniería es saber definir qué estamos programando. Es producir programas de computación

Programa: Modelo funcional que la computadora es capaz de interpretar y ejecutar de forma que simule o represente un modelo original.

La programación es el objeto de estudio de la carrera de informática.

¿Qué es programar bien?
¿Cuándo estamos programando bien?

Pudiéramos decir que cuando obtenemos los modelos teóricamente
o científicamente correctos. Pero esto no es un objeto de la programación sino un principio.

No podemos asumir que programar rápido y con códigos pequeños es programar bien. Sino cuando el proceso se haga en el menor tiempo posible y el resultado cumpla con las expectativas trazadas. Es decir que se cumpla con los objetivos que me tracé al decidir hacer el programa.

La tendencia hoy en día es utilizar lenguajes scripts en lugar de lenguajes compilados.

La disponibilidad de memoria y su uso no es un problema actualmente dadas las capacidades de los equipos actualmente. La eficiencia en el uso de la memoria pasa a ser un problema secundario.

Al comenzar a programar se debe partir de objetivos bien definidos.

¿Qué es hacer ciencia?

¿Cuántos científicos de la programación conocemos?

o Donald Knuth es uno de los más reconocidos expertos en ciencias de la computación. Se le conoce principalmente como el autor de la obra El arte de programar, una de las más respetadas referencias en el campo de las ciencias de la computación. Prácticamente creó el campo del análisis de algoritmos e hizo muchos aportes seminales en varias ramas teóricas de la ciencias de la computación. Autor de TeX, LateX y True Type Fonts

o Alan Mathison Turing Fue matemático, científico de la informática, criptógrafo y filósofo. Se le considera uno de los padres de la Ingeniería informática siendo el precursor de la informática moderna. Proporcionó una influyente formalización de los conceptos de algoritmo y computación: la máquina de Turing.

o Edsger Dijkstra. Entre sus contribuciones a la informática está el algoritmo de caminos mínimos; también conocido como Algoritmo de Dijkstra. Recibió el Premio Turing en 1972.

o El creador de Lotus, Mitch Kapor, fue el que contribuyó a que las PC se hicieran tan populares. El empleo de esta hoja de calculo fue lo que lanzó las PCs a ser conocidas en todas partes. Director de la Fundación Mozilla

¿Qué es una ciencia?
Es un instrumento para estudiar “cosas”

Todo fenómeno es representado en la conciencia desde puntos de vistas diferentes. En nuestra conciencia formamos distintas representaciones.

Forma de representación en la conciencia de un objeto de estudio.

La ciencia implica metodología de representación, gestión del conocimiento.

Asumimos patrones que tomamos como ciertos sin cuestionarnos si son ciertos o no.

¿Es fuertemente tipeado Python?

Definición de Tipo de una variable.
Indica:
o Características de esa variable
o Operaciones sobre esa variable.
o Clasificación (Taxonomías)

¿Qué es una variable?

¿Qué es un puntero?
Señalar algo
Señalar direcciones de memoria.
Referenciar una zona de memoria.

Surge el paradigma de la Programación Orientada a Objetos (POO).

Ada Byron Planteó como se debía programar un artefacto, la maquina analítica. En honor a ella se nombró un lenguaje de programación. Planteó la necesidad de lenguajes superiores de programación y no directamente en lenguaje de máquina. A ella se debe además el termino Debug

Barbara Liskov nee Huberman, introdujo el concepto de subtipo, comúnmente conocido como Principio de Sustitución de Liskov. Trabajó junto a Jeannette Wing. Autora del primer lenguaje que hizo abstracción de datos, autora del primer lenguaje distribuido.

“Que un objeto x de tipo X es verificable Q(x), entonces para un objeto y de tipo Y es verdadero Q(y) si Y es un subtipo de X”

Esto no es más que una proposición de la lógica formal. Esto es hacer ciencia de la computación.

Los modelos que están bien hechos deberían ser auto documentados. No sería necesaria la existencia de las ayudas. Este fue un planteamiento de Donald Knuth.

Las ciencias tienen axiomas o asumen otros de otras ciencias.

¿Qué es un axioma?
En epistemología, ciencia del estudio de la producción y validación del conocimiento científico. Un axioma es una "verdad evidente" sobre la cual descansa el resto del conocimiento o sobre la cual se construyen otros conocimientos. No todos los epistemólogos están de acuerdo que los axiomas existan de esa manera. En matemáticas un axioma no es necesariamente una verdad evidente, sino una expresión lógica utilizada en una deducción para llegar a una conclusión. En matemáticas se distinguen dos tipos de axiomas: axiomas lógicos y axiomas no-lógicos.

Es una verdad asumida como base para construir una metodología

La programación se basa en las matemáticas, pero debe mucho más
a:
1. Teoría del Conocimiento (epistemología)
2. Semiótica (La semiótica se define como la ciencia general de los signos. Un signo (del griego semeîon) es todo lo que se refiere a otra cosa (referente) es la materia prima del pensamiento y por lo tanto de la comunicación.)
3. Lingüística (Noam Chomsky, También se le considera creador de la jerarquía de Chomsky, una clasificación de lenguajes formales de gran importancia en teoría de la computación.)

¿Qué es un error sintáctico?

Surge el paradigma de la Programación Manipulada por Datos. Es el paso intermedio a la Programación Orientada a Objetos.

Retomando el tema de Tipos
Veamos la siguiente declaración:
Int age
¿Para qué nos sirve?
¿En qué nos ayuda?
Evita asignaciones de valores de tipos incorrectos, age=’a’ no
se puede hacer. Tampoco age=3.24

Estamos creando un formalismo que nos ayuda a crear restrcciones en nuestro modelo

Eiffel es un lenguaje de programación que permite definir restricciones.

Age=2043 no es un error para el compilador pero es incorrecto para la edad de una persona

Nota: ¿Cuantos lenguajes de programación orientados a objetos existen?
Más de 188

En Pascal se puede definir:
Tage=0..120;
Age:Tag;

La selección de un lenguaje de programación no puede estar restringida a que sea fuertemente tipado. Existen restricciones que no se expresan con intervalos. Son más ricas que las anteriores

C++ es muy bueno para encapsular restricciones pero nadie lo utiliza, prefieren chequear las restricciones en el algoritmo.

Nota: Ser programadores eficientes es el objetivo del curso

La Teoría del Conocimiento es la ciencia fundamental para la programación.

Desarrollar productos para computadoras se hace con computadoras.

La programación es una metodología que se basa en la teoría del conocimiento.

El proceso de programación es un proceso de aprendizaje.

Los procesos del conocimiento son procesos de comunicación. Movemos información que contiene conocimiento.

En el caso de la programación los destinatarios del conocimiento no son seres humanos sino computadoras

Semiótica.
Los símbolos son las unidades básicas que conforman un lenguaje.

Existen tres planos:
1. Sintáctico ¿Qué son los símbolos?
2. Semántico ¿Qué significado tiene el símbolo?
3. Pragmático Plano superior de la semiótica.

Al asumir el mensaje semánticamente recibimos con rechazo los detalles sintácticos. Esto es un proceso en Teoría del Conocimiento.

¿Por qué se desarrolló la lógica formal?
Porque es la rama matemática que apoya la teoría del conocimiento.

Arte

Humberto Eco, entre otras cosas es un teórico de la semiótica. Según él un mensaje tiene tantas lecturas como receptores. O sea que un mensaje es muchos mensajes al mismo tiempo.

La teoría de la comunicación no es artística esencialmente

¿Qué es arte? ¿Estética?
El término arte procede del término latino ars. En la Antigüedad se consideró el arte como la pericia y habilidad en la producción de algo. Es solo a partir de finales del siglo XV, durante el renacimiento Italiano, cuando, por primera vez se hace la distinción entre el artesano y el artista (artesanía y bellas artes) y equivalentemente entre artesano, productor de obras múltiples y artista, productor de obras únicas.

(ver…)

Según Humberto Eco, es toda obra que sobrepasa al código que lo porta. Cuando se recibe con una calidad superior a lo que se puede sacar del código de ese mensaje.

Todo mensaje lleva un componente denotativo y otro componente connotativo.

Por ejemplo la frase “Te amo”, tiene diferentes
connotaciones para cada quien la lee o escucha.

Catarsis es el proceso de sensaciones placenteras al recibir un mensaje.

El arte es un proceso de comunicación.

No todos somos científicos de la programación. El que resuelve
ecuaciones diferenciales en matemáticas es programador en informática.

Los lenguajes de programación tiene diversos errores según la
teoría de la comunicación.

¿Es la POO todo lo bueno que se cree?
¿Qué significa que una operación es virtual?
¿Qué significa que un método sea virtual?

A pesar de lenguajes tan malos al menos usarlos lo mejor posible.

Las personas inconscientemente le ponemos a nuestros mensajes una intencionalidad artística. Y en este punto es dónde se une arte y programación. Esto tiene que ver con el Software Libre.

Todo el que produce Software Libre tiene la intencionalidad del que lo vea (un algoritmo o un modelo) se maraville. No estamos hablando del diseño de las ventanas. A nivel social se incrementa exponencialmente. Todos tratan de mejorarlo. Coger esa joya de programación y superarlo.

Si todo el arte funcionara como el Software Libre esa connotación será superior. El paradigma del Software Libre sería superior.

El software Libre es muy joven. La esencia que lo hace mejor es su libertad.
Su influencia positiva está dada por su rapidez y eficiencia.

La programación comprende cuatro fases:
1. Percepción.
2. Razonamiento.
3. Diseño
4. Implementación.

Usualmente transformamos el problema original en otro. Basta con analizar el ejemplo de hacer la búsqueda de una tarjeta en un tarjetero. Frecuentemente todos lo que programan se plantean el algoritmo como: “Tomo la primera tarjeta, comparo, sino es la buscada, paso a la tarjeta siguiente, así sucesivamente hasta encontrar la tarjeta deseada”. Pero realmente al programar no empleamos ni:
Repeat
Until
(de Pascal)

ni,
do
while (de C)

generalmente lo que hacemos es:

for (int i=0; i<=count; i++)
{
if(tarjeta[i]==actual)
break;
}

transformamos el problema original en otro.

Hoare y Dijkstra establecieron las bases axiomáticas de la programación. La programación tiene axiomas pero hay que encontrárselos.

Sir Charles Antony Richard Hoare (Tony Hoare) es un científico Británico en computación, conocido sobre todo por la invención, en 1960 de Quicksort, que es el algoritmo de ordenamiento más ampliamente utilizado en el mundo, y probablemente el algoritmo de cualquier tipo más utilizado.
Estas fueron sus palabras al recibir en 1980 recibió el Premio Turing de la ACM(Association for Computing Machinery):
"Concluyo que hay dos formas de realizar el diseño de una aplicación: La primera es el hacerla tan sencilla que sea obvio para todos que no tenga deficiencias y la segunda es el hacerla tan complicada que no queden deficiencias obvias."

Un programa es una forma de representación del conocimiento. Este sería el primer axioma de la computación.