Está en la página 1de 43

ndice general

Teora de tipos

1.1

Sistema formal

2.1

Sistemas lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.1

Lgicas clsicas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.2

Lgicas no clsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.3

Lgicas modales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.4

Metalgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

La matemtica como sistema formal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

El sistema axiomtico de Peano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4

Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.5

Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.5.1

Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.5.2

Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Teora informal de conjuntos

3.1

Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2

Conjuntos, pertenencia e igualdad

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3

Notas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Tipado esttico

4.1

Bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2

Chequeo de tipicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2.1

Tipado esttico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2.2

Tipado dinmico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2.3

Tipado esttico y dinmico combinados . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2.4

Chequeo de tipicacin esttico y dinmico en la prctica . . . . . . . . . . . . . . . . . .

Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.3
5

Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Alonzo Church
5.1

Vase tambin

5.2

Enlaces externos

10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

ii
6

NDICE GENERAL
Clculo lambda

11

6.1

Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

6.2

Introduccin informal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

6.3

Denicin formal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

6.3.1

Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

6.3.2

Variables libres y ligadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

6.3.3

-conversin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

6.3.4

-reduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

6.3.5

-conversin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

6.4

Clculos aritmticos con lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

6.5

Lgica y predicados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

6.6

Pares

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

6.7

Recursin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

6.8

Funciones computables y el clculo lambda

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

6.9

Indecisin de equivalencia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

6.10 Clculo lambda y los lenguajes de programacin . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

6.11 Concurrencia y paralelismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

6.12 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

6.13 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

6.14 Enlaces externos

17

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Clculo de Construcciones

18

Tipo abstracto

19

8.1

Indicacin de tipos abstractos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

8.2

Uso de tipos abstractos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

8.3

Tipos de tipos abstractos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

8.4

Enlaces externos

20

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Conversin de tipos

21

9.1

Tipos de conversin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

9.1.1

21

9.2

Explcita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10 Tipado fuerte

22

10.1 Explicacin detallada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


10.1.1 Conversin de tipos (typecasting)

21

22

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

10.2 Lenguajes no tipados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

10.3 Ejemplos de lenguajes fuertemente tipados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

10.4 Ejemplos de lenguajes no tipados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

11 Tipado dinmico

24

12 Duck typing

25

NDICE GENERAL

iii

12.1 Ejemplos del concepto

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

12.2 Duck typing en lenguajes de tipicacin esttica . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

12.3 Comparacin con otros tipos de tipicacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.3.1 Sistemas de tipicacin estructural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.3.2 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.3.3 Templates o tipos genricos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.4 Crticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.5 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.6 Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.6.1 En C#

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

12.6.2 En ColdFusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

12.6.3 En Common Lisp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

12.6.4 En Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

12.6.5 En Python

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

12.7 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

12.8 Enlaces externos

28

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13 Tipado esttico

29

13.1 Bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

13.2 Chequeo de tipicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

13.2.1 Tipado esttico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

13.2.2 Tipado dinmico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

13.2.3 Tipado esttico y dinmico combinados . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

13.2.4 Chequeo de tipicacin esttico y dinmico en la prctica . . . . . . . . . . . . . . . . . .

30

13.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

14 Tipado fuerte

32

14.1 Explicacin detallada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


14.1.1 Conversin de tipos (typecasting)

32

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

14.2 Lenguajes no tipados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

14.3 Ejemplos de lenguajes fuertemente tipados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

14.4 Ejemplos de lenguajes no tipados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

15 Nuevos Fundamentos
15.1 Axiomas

34

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16 Principio de sustitucin de Liskov

34
35

16.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

16.2 Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

16.3 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

16.4 Text and image sources, contributors, and licenses . . . . . . . . . . . . . . . . . . . . . . . . . .

37

16.4.1 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

16.4.2 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

iv

NDICE GENERAL
16.4.3 Content license . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

Captulo 1

Teora de tipos
En matemticas, lgica y ciencias de la computacin, la
teora de tipos es cualquiera de varios sistemas formales
que pueden servir como alternativas a la teora informal
de conjuntos, o al estudio de tales formalismos en general. En la teora de lenguajes de programacin, una rama
de las ciencias de la computacin, la teora de tipos puede referirse al diseo, anlisis y estudio de los sistemas de
tipos, aunque algunos cientcos de la computacin limitan el signicado del trmino al estudio de formalismos
abstractos como el clculo lambda tipado.

1.1 Historia
Bertrand Russell invent la primera teora de tipos en respuesta a su descubrimiento donde la versin de Gottlob
Frege de la teora ingenua de conjuntos es afectada por
la paradoja de Russell. Este tipo de la teora de tipos
aparece primariamente en el Principia Mathematica de
Whitehead y Russell. Esta teora evita la paradoja de Russell creando una jerarqua de tipos, luego asignando cada
entidad matemtica a un tipo. Objetos de un tipo dado
son creados exclusivamente por objetos de un tipo anterior (aquellos ms abajo en la jerarqua), por lo tanto
evitando ciclos.
Alonzo Church, inventor del clculo lambda, desarroll
una lgica de orden superior comnmente llamada Teora de Tipos de Church, para evitar la paradoja de KleenRosser afectando el clculo lambda puro original. La teora de tipos de Church es una variante del clculo lambda en el cual las expresiones (tambin llamadas frmulas
o trminos lambda) son clasicadas en tipos, y los tipos
de expresiones restringen las maneras en que pueden ser
combinadas. En otras palabras, es un clculo lambda tipado. Hoy en da muchos otros clculos estn en uso, incluyendo la Intuisionistica teora de tipos de Per Martin-Lf,
el Sistema F de Jean-Yves Girard y el Clculo de Construcciones. En el clculo lambda tipado, tipos juegan un
papel similar al de los conjuntos en la teora de conjuntos.

Captulo 2

Sistema formal
Un sistema formal es un tipo de sistema lgicodeductivo constituido por un lenguaje formal, una
gramtica formal que restringe cuales son las expresiones
correctamente formadas de dicho lenguaje y las reglas
de inferencia y un conjunto de axiomas que permite encontrar las proposiciones derivables de dichos axiomas.
Los sistemas formales tambin han encontrado aplicacin
dentro de la informtica, la teora de la informacin, y la
estadstica, para proporcionar una denicin rigurosa del
concepto de demostracin. La nocin de sistema formal
corresponde a una formalizacin rigurosa y completa del
concepto de sistema axiomtico, los cuales pueden ser expresados en lenguaje formal o en lenguaje natural formalizado.

nan teoremas. Para obtener los teoremas se emplean las


reglas de produccin que convierten una cadena en otra.
Hay ciertos teoremas iniciales que no se obtienen de ninguna regla, stos son los axiomas que se suponen vlidos
por denicin y se convierten en el germen de produccin
de teoremas.

2.1 Sistemas lgicos


Un sistema lgico est compuesto por:
1. Un conjunto de smbolos primitivos (conectivas lgicas, cuanticadores, variables, el alfabeto, o vocabulario).

Llamamos formalizacin al acto de crear un sistema


formal, con la que pretendemos capturar y abstraer la
esencia de determinadas caractersticas del mundo real,
en un modelo conceptual expresado en un determinado
lenguaje formal.

2. Un conjunto de reglas de formacin (la gramtica)


que nos dice cmo construir frmulas bien formadas
a partir de los smbolos primitivos.

En la Teora de la demostracin, las demostraciones for3. Un conjunto de axiomas o esquemas de axiomas.


males pueden expresarse en el lenguaje de los sistemas
Cada axioma debe ser una frmula bien formada.
formales, consistentes en axiomas y reglas de inferencia.
Los teoremas pueden ser obtenidos por medio de demos4. Un sistema deductivo o conjunto de reglas de infetraciones formales. Este punto de vista de las matemtirencia y axiomas. Estas reglas determinan qu frcas ha sido denominado formalista; aunque en muchas
mulas pueden inferirse de qu frmulas. Por ejemocasiones este trmino conlleva una acepcin peyoratiplo, una regla de inferencia clsica es el modus pova. En ese sentido David Hilbert cre la disciplina denonens, segn el cual, dada una frmula A, y otra frminada metamatemtica dedicada al estudio de los sistemula A B, la regla nos permite armar que B.
mas formales, entendiendo que el lenguaje utilizado para
ello, denominado metalenguaje era distinto del lenguaje
Estos cuatro elementos completan la parte sintctica de
del sistema formal que se pretenda estudiar. El lenguaje
los sistemas lgicos. Sin embargo, todava no se ha dado
formal que se estudia, en este caso se llama tambin, en
ningn signicado a los smbolos discutidos, y de hecho,
ocasiones, lenguaje objeto.
un sistema lgico puede denirse sin tener que hacerlo.
Un sistema as es la reduccin de un lenguaje formaliza- Tal tarea corresponde al campo llamado semntica fordo a meros smbolos, lenguaje formalizado y simboliza- mal, que se ocupa de introducir un quinto elemento:
do sin contenido material alguno; un lenguaje reducido
a mera forma que se expresa mediante frmulas que re1. Una interpretacin formal. En los lenguajes naturaejan las relaciones sintcticas entre los smbolos y las
les, una misma palabra puede signicar diversas coreglas de formacin y transformacin que permiten conssas dependiendo de la interpretacin que se le d.
truir las frmulas del sistema y pasar de una frmula a
Por ejemplo, en el idioma espaol, la palabra banotra.[1]
co puede signicar un edicio o un asiento, mientras que en otros idiomas puede signicar algo completamente distinto o nada en absoluto. En consecuencia, dependiendo de la interpretacin, variar

El objetivo de un sistema formal es sealar como vlidas


determinadas cadenas. Estas cadenas vlidas se denomi-

2.1. SISTEMAS LGICOS


tambin el valor de verdad de la oracin el banco
est cerca. Las interpretaciones formales asignan
signicados inequvocos a los smbolos, y valores de
verdad a las frmulas.

2.1.1

Lgicas clsicas

Los sistemas lgica clsica lgicos clsicos son los ms


estudiados y utilizados de todos, y se caracterizan por incorporar ciertos principios tradicionales que otras lgicas
rechazan. Algunos de estos principios son: el principio
del tercero excluido, el principio de no contradiccin, el
principio de explosin y el principio de identidad. Entre
los sistemas lgicos clsicos se encuentran:
Lgica proposicional
Lgica de primer orden
Lgica de segundo orden

2.1.2

3
Lgica modal: Trata con las nociones de necesidad,
posibilidad, imposibilidad y contingencia.
Lgica dentica: Se ocupa de las nociones morales
de obligacin y permisibilidad.
Lgica temporal: Abarca operadores temporales como siempre, nunca, antes, despus, etc.
Lgica epistmica: Es la lgica que formaliza los razonamientos relacionados con el conocimiento.
Lgica doxstica: Es la lgica que trata con los razonamientos acerca de las creencias.

2.1.4 Metalgica
Mientras la lgica se encarga, entre otras cosas, de construir sistemas lgicos, la metalgica se ocupa de estudiar
las propiedades de dichos sistemas. Las propiedades ms
importantes que se pueden demostrar de los sistemas lgicos son:

Lgicas no clsicas

Los sistemas lgicos no clsicos son aquellos que recha- Consistencia


zan uno o varios de los principios de la lgica clsica.
Un sistema tiene la propiedad de ser consistente cuando
Algunos de estos sistemas son:
no es posible deducir una contradiccin dentro del siste Lgica difusa: Es una lgica plurivalente que recha- ma. Es decir, dado un lenguaje formal con un conjunto
za el principio del tercero excluido y propone un n- de axiomas, y un aparato deductivo (reglas de inferencia),
no es posible llegar a una contradiccin.
mero innito de valores de verdad.
Lgica relevante: Es una lgica paraconsistente que
evita el principio de explosin al exigir que para que Decidibilidad
un argumento sea vlido, las premisas y la conclusin deben compartir al menos una variable propo- Se dice de un sistema que es decidible cuando, para cualquier frmula dada en el lenguaje del sistema, existe un
sicional.
mtodo efectivo para determinar si esa frmula pertene Lgica cuntica: Desarrollada para lidiar con ra- ce o no al conjunto de las verdades del sistema. Cuando
zonamientos en el campo de la mecnica cunti- una frmula no puede ser probada verdadera ni falsa, se
ca; su caracterstica ms notable es el rechazo de la dice que la frmula es independiente, y que por lo tanto
propiedad distributiva.
el sistema es no decidible. La nica manera de incorporar
Lgica no monotnica: Una lgica no monotnica una frmula independiente a las verdades del sistema es
es una lgica donde, al agregar una frmula a una postulndola como axioma. Dos ejemplos muy importanteora cualquiera, es posible que el conjunto de con- tes de frmulas independientes son el axioma de eleccin
en la teora de conjuntos, y el quinto postulado de la geosecuencias de esa teora se reduzca.
metra euclidiana.
Lgica intuicionista: Enfatiza las pruebas, en vez de
la verdad, a lo largo de las transformaciones de las
Completitud
proposiciones.

2.1.3

Lgicas modales

Las lgicas modales estn diseadas para tratar con expresiones que calican la verdad de los juicios. As por
ejemplo, la expresin siempre calica a un juicio verdadero como verdadero en cualquier momento, es decir,
siempre. No es lo mismo decir est lloviendo que decir
siempre est lloviendo.

Se habla de completitud en varios sentidos, pero quizs


los dos ms importantes sean los de completitud semntica y completitud sintctica. Un sistema S en un lenguaje
L es semnticamente completo cuando todas las verdades
lgicas de L son teoremas de S. En cambio, un sistema
S es sintcticamente completo si, para toda frmula A del
lenguaje del sistema, A es un teorema de S o A es un teorema de S. Esto es, existe una prueba para cada frmula
o para su negacin. La lgica proposicional y la lgica de

CAPTULO 2. SISTEMA FORMAL

predicados de primer orden son ambas semnticamente


P5 Si P es una propiedad tal que (a) cero tiene la
completas, pero no sintcticamente completas. Por ejempropiedad P, y (b) siempre que un nmero n tenplo, ntese que en la lgica proposicional, la frmula p no
ga la propiedad P el sucesor de n tambin tendr la
es un teorema, y tampoco lo es su negacin, pero como
propiedad P, entonces todos los nmeros tendrn la
ninguna de las dos es una verdad lgica, no afectan a la
propiedad P.
completitud semntica del sistema. El segundo teorema
de incompletitud de Gdel demuestra que ningn siste- El ltimo postulado entraa el principio de induccin mama (denido recursivamente) con cierto poder expresivo temtica e ilustra claramente el alcance de una verdad
puede ser a la vez consistente y completo.
matemtica por convencin. Se construye la aritmtica
fundamental sobre esta base, deniendo los diversos nmeros naturales como el sucesor de cero ( 0 ), el sucesor
2.2 La matemtica como sistema del sucesor de cero( 0 ), y as hasta el innito.

formal
La matemtica fue considerada por David Hilbert un sistema formal ya que toda la matemtica puede ser interpretada a base de smbolos, axiomas y reglas de produccin. Pero en 1931 Kurt Gdel demostr que la coherencia y la completitud no podan ser ciertos a la vez en las
matemticas, o al menos en los nmeros enteros. Es lo
que se denomna el teorema de la incompletitud de Gdel. Por otra parte Alonzo Church demostr que la matemtica tampoco poda ser decidible, con lo que la idea de
las matemticas como sistema formal tal y como Hilbert
pretenda, result demolida.

Lenguaje formal
Los smbolos que designan los conceptos primitivos son
N, 0, x .
Axiomas:

A1 : N (0)
A2 : x(N (x) N (x ))
A3 : x(N (x) 0 = x )

Sin embargo, a pesar de que el llamado programa de HilA4 : xy((N (x) N (y) x = y ) x = y)
bert result inviable para los nes pretendidos, el enfoque
(
)
ha seguido siendo ampliamente usado, a pesar de sus limiA5 : (0) x ((x) (x )) x (x)
taciones, bsicamente porque no se ha encontrado ningu(
(
))
na alternativa mejor al enfoque formalista de Hilbert y la

pretensin de trabajar en el seno de teoras matemticas A5 : (0) x ((x) (x )) x (x)


explcitamente axiomatizadas, aun con sus limitaciones.
Luego, se establece la denicin de suma, que expresa
que la adicin de un nmero natural a otro dado puede
2.3 El sistema axiomtico de Peano considerrsela como la suma repetida de 1; esta ltima
operacin es fcilmente expresable por medio de la relacin de sucesor:
El sistema de Peano es un sistema axiomtico de segundo
orden a partir del cual puede deducirse toda la aritmtica (a) n + 0 = n; (b) n + k' = (n + k)'
de los nmeros naturales. Los primitivos de este sistema Pasando ahora a la multiplicacin de los nmeros natuson los trminos 0 (cero), nmero y sucesor, de los rales, se la puede denir por medio de la siguiente decuales, por ser primitivos no se da denicin alguna. Sin nicin por recurrencia, que expresa de manera rigurosa
embargo, se entiende por 0 dicho nmero, el trmino que el producto nk de dos nmeros naturales puede ser
nmero designa a los nmeros naturales 0, 1, 2, 3,... ex- considerado como la suma de k trminos cada uno de los
clusivamente, y con sucesor de un nmero natural n se cuales es igual a n, en otros trminos:
reere al nmero natural inmediato siguiente de n en el
orden natural. El Sistema de Peano contiene los 5 postu- (a) n . 0 = 0; (b) n. k' = n. k + n
lados que siguen:
Lenguaje natural

2.4 Vase tambin

P1 0 es un nmero.

Lgica matemtica

P2 El sucesor de un nmero es siempre un nmero.

Lenguaje formalizado

P3 Dos nmeros nunca tienen el mismo sucesor.

Nocin primitiva

P4 0 no es el sucesor de nmero alguno.

teora (lgica)

2.5. REFERENCIAS

2.5 Referencias
[1] Encyclopdia Britannica, Formal system denition, 2007.

2.5.1

Bibliografa

Raymond M. Smullyan, 1961. Theory of Formal


Systems: Annals of Mathematics Studies, Princeton
University Press (April 1, 1961) 156 pag. ISBN
069108047X
S. C. Kleene, 1967. Mathematical Logic Reprinted
by Dover, 2002. ISBN 0486425339
Douglas Hofstadter, 1979. Gdel, Escher, Bach:
An Eternal Golden Braid. 777 pag. ISBN 9780465026562.

2.5.2

Enlaces externos

Wikcionario tiene deniciones y otra informacin sobre formalizacin.Wikcionario

Formal system, denicin en la Enciclopedia Britnica, 2007.


Christer Blomqvist, an introduction to formal systems, pgina web 1997.
What is a Formal System?: Algunas citas de `Articial Intelligence: The Very Idea' (1985) de John
Haugeland, pp. 4864.
Heinrich Herre Formal Language and systems,
1997.
Peter Suber, Formal Systems and Machines: An Isomorphism, 1997.

Captulo 3

Teora informal de conjuntos


La Teora Informal de Conjuntos es una de las diversas conjunto de todos los nmeros enteros. Obviamente, el
teoras que se han sido desarrolladas en torno al debate de conjunto de todos los nmeros es innitamente grande;
los fundamentos de matemticas.
sin embargo, no es necesario que un conjunto sea preciLos conjuntos tienen una importancia fundamental en samente nito para que pueda ser denido con precisin.
matemticas; de hecho, de manera formal, la mecnica interna de las matemticas (nmeros, relaciones,
funciones, etc.) puede denirse en trminos de conjuntos.

Si x es elemento de A, entonces se dice que x pertenece


a A, o que x est en A. En este caso, esta proposicin se
escribe o representa formalmente as: x A.[1] Mientras
que usar el smbolo de esta manera: x A, quiere decir
que x no pertenece a A.
Dos conjuntos A y B son iguales cuando tienen exactamente los mismos elementos o, en otras palabras, lo son
solo si cada uno de los elementos de A es a la vez elemento de B y si cada elemento de B tambin pertenece
o est incluido en A.[2] Por ejemplo, el conjunto cuyos
elementos son 2, 3 y 5 es igual al conjunto de todos los
nmeros primos menores de 6. Y si los conjuntos A y B
son iguales, esto se representa comnmente como A = B.

3.1 Requisitos
La teora informal de conjuntos es una teora no formalizada, es decir que emplea el lenguaje cotidiano para
hablar de conjuntos. Por lo que, los conectores y ;
o ; no ; si..., entonces ; si y slo si , no estn
sujetos a rigurosas deniciones.

Los elementos de un conjunto determinan a ste en su totalidad y esto tambin es vlido para un conjunto vaco,
que es aquel que no tiene ningn elemento, el cual se representa a menudo as "" y otras veces as "{ }". Por lo
que partiendo del hecho de que incluso un conjunto vaco est completamente determinado por sus elementos,
Sin embargo, esta primigenia teora permita denir un se concluye que slo puede haber un conjunto vaco.[3][4]
conjunto a partir de cualquier propiedad sin ninguna restriccin, lo que llev a antinomias, o paradojas lgicas, como la paradoja de Russell, o semnticas, como la
3.3 Notas
paradoja de Berry. Como solucin a este conicto se elabor la teora axiomtica de conjuntos, cuyo propsito
era determinar con precisin qu deniciones de conjun- [1] El smbolo de pertenencia "" fue introducido en 1888 por
Peano, inspirado en la grafa de la letra griega psilon, "".
tos podan ser empleadas. Actualmente, se conoce a la
teora axiomtica de conjuntos simplemente como teora [2] Vase axioma de la extensionalidad
de conjuntos.
En sus primeros tiempos, la teora de conjuntos era informal y fue desarrollada a nes del siglo XIX, principalmente por Georg Cantor y Gottlob Frege, con el n de
permitir a los matemticos trabajar con conjuntos innitos coherentes.

[3] Vase axioma del conjunto vaco.


[4] Recuerde que: {0} {}.

3.2 Conjuntos, pertenencia e igualdad


En la teora informal de conjuntos, un conjunto es descrito como una coleccin de objetos bien denida. Dichos
objetos son llamados elementos o miembros del conjunto
y pueden ser de cualquier naturaleza: nmeros, personas,
otros conjuntos, etc. Por ejemplo, el 4 es un elemento del
6

Captulo 4

Tipado esttico
En ciencias de la computacin, un sistema de tipos dene cmo un lenguaje de programacin clasica los valores
y las expresiones en tipos, cmo se pueden manipular estos tipos y cmo interactan. Un tipo indica un conjunto
de valores que tienen el mismo signicado genrico o propsito (aunque algunos tipos, como los tipos de datos abstractos y tipos de datos funcin, tal vez no representen valores en el programa que se est ejecutando). Los sistemas
de tipicacin varan signicativamente entre lenguajes,
siendo quizs las ms importantes variaciones las que estn en sus implementaciones de la sintctica en tiempo de
compilacin y la operativa en tiempo de ejecucin.

gramas y programadores cmo deben ser tratados esos


bits.
Las principales funciones que los sistemas de tipicacin
ofrecen son:
Seguridad - El uso de tipos de datos puede permitir
a un compilador detectar incoherencias en el signicado o cdigo probablemente invlido. Por ejemplo, podemos identicar una expresin 3 / Hello,
World como invlida porque no se puede dividir
(de forma normal) un entero por una cadena de caracteres. Un sistema de tipado fuerte ofrece ms seguridad, pero no garantiza, necesariamente una seguridad completa (ver seguridad de la tipicacin
para ms informacin).

Un compilador puede usar el tipo esttico de un valor para optimizar el almacenamiento que necesita y la eleccin
de los algoritmos para las operaciones sobre ese valor.
Por ejemplo, en muchos compiladores de C el tipo de dato otante se representa en 32 bits, de acuerdo con la
especicacin IEEE para los nmeros de coma otante
de simple precisin. Entonces, C usa operaciones especcas de coma otante sobre estos valores (suma de coma
otante, multiplicacin, etc.).

Optimizacin - Un sistema de tipado esttico puede


dar informacin muy til al compilador. Por ejemplo, si un tipo de dato dice que un valor debe alinearse en mltiplos de 4, el compilador puede usar
de forma ms eciente las instrucciones mquina.

El rango del tipo de dato limita y la forma de su evaluacin afecta en el tipado del lenguaje. Adems, un
lenguaje de programacin puede asociar una operacin
concreta con diferentes algoritmos para cada tipo de dato
en el caso del polimorsmo. La teora de tipos de datos
es el estudio de los sistemas de tipicacin, aunque los
sistemas de tipos de datos concretos de los lenguajes de
programacin se originaron a partir de los problemas tcnicos de las arquitecturas del ordenador, implementacin
del compilador y diseo del lenguaje.

Documentacin - En sistemas de tipicacin ms


expresivos, los tipos de datos pueden servir como
una forma de documentacin, porque pueden ilustrar la intencin del programador. Por ejemplo, los
tem de tiempos pueden ser un subtipo de un entero,
pero si un programador declara una funcin como
que devuelve tems de tiempo en lugar de un simple entero, esto documenta parte del signicado de
la funcin.
Abstraccin (o modularidad) - Los tipos de datos
permiten a los programadores pensar en los programas a un alto nivel, sin tener que preocuparse con
el bajo nivel de la implementacin. Por ejemplo, los
programadores pueden pensar en una cadena de caracteres como un valor en lugar de un simple array
de bytes. O los tipos de datos pueden permitir a los
programadores expresar la Interfaz entre dos subsistemas. Esto localiza las deniciones requeridas para
la interoperabilidad de los subsistemas y previene
de inconsistencias cuando estos subsistemas se comuniquen.

4.1 Bsicos
Asignar tipos de datos (tipicar) da signicado a colecciones de bits. Los tipos de datos normalmente tienen asociaciones tanto con valores en la memoria o con objetos
como con variables. Como cualquier valor simplemente consiste en un conjunto de bits de un ordenador, el
hardware no hace distincin entre direccin de memoria, cdigo de instruccin, caracteres, enteros y nmeros
en coma otante. Los tipos de datos informan a los pro7

CAPTULO 4. TIPADO ESTTICO

Un programa normalmente asocia cada valor con un tipo


de dato determinado (aunque un tipo de dato puede tener ms de un subtipo). Otras entidades, como los objetos, bibliotecas, canales de comunicacin, dependencias
o, incluso, los propios tipos de datos, pueden ser asociados con un tipo de dato. Por ejemplo:
Tipo de dato - un tipo de dato de un valor
clase - un tipo de dato de un objeto
Un sistema de tipado, especicado en cada lenguaje de
programacin, estipula las formas en que los programas
pueden ser escritos y hace ilegal cualquier comportamiento fuera de estas reglas.

4.2 Chequeo de tipicacin


El proceso de vericar e imponer los lmites impuestos
por los tipos de datos comprobacin (chequeo) de tipicacin puede ocurrir tanto en lacompilacin (una comprobacin esttica) o en laejecucin (una comprobacin
dinmica). Si un lenguaje impone fuertemente las reglas
de tipicacin (es decir, generalmente permitiendo solo
las conversiones de tipo de dato automticas que no hagan perder informacin), uno se puede referir al proceso
como fuertemente tipado; si no, dbilmente tipado.

4.2.1

Tipado esttico

Se dice de un lenguaje de programacin que usa un tipado esttico cuando la comprobacin de tipicacin se
realiza durante la compilacin, y no durante la ejecucin.
Ejemplos de lenguajes que usan tipado esttico son C,
C++, Java y Haskell. Comparado con el tipado dinmico,
el esttico permite que los errores de programacin sean
detectados antes, y que la ejecucin del programa sea ms
eciente.

4.2.2

Tipado dinmico

Se dice de un lenguaje de programacin que usa un tipado dinmico cuando la comprobacin de tipicacin se
realiza durante su ejecucin en vez de durante la compilacin. Ejemplos de lenguajes que usan tipado dinmico
son Perl, Python y Lisp. Comparado con el tipado esttico, o sistema de enlazado temprano, el tipado dinmico
es ms exible (debido a las limitaciones tericas de la
decidibilidad de ciertos problemas de anlisis de programas estticos, que impiden el mismo nivel de exibilidad
que se consigue con el tipado esttico), a pesar de ejecutarse ms lentamente y ser ms propensos a contener
errores de programacin.

4.2.3 Tipado esttico y dinmico combinados


Algunos lenguajes estticamente tipados tienen una
puerta trasera en el lenguaje que permite a los programadores escribir cdigo que no es comprobado estticamente. Por ejemplo, los lenguajes como Java y los parecidos al C tienen una "conversin de tipos de datos forzada
(cast)"; estas operaciones pueden ser inseguras durante la
ejecucin, porque pueden causar comportamientos indeseados cuando el programa se ejecuta.
La presencia de un tipado esttico en un lenguaje de programacin no implica necesariamente la ausencia de mecanismos de tipado dinmico. Por ejemplo, Java usa tipado esttico, pero ciertas operaciones requieren el soporte
de test de tipos de datos durante la ejecucin, que es una
forma de tipado dinmico. Ver lenguaje de programacin
para una discusin ms amplia de la interaccin entre tipado esttico y dinmico.

4.2.4 Chequeo de tipicacin esttico y dinmico en la prctica


La eleccin entre sistemas de tipicacin dinmico y esttico requiere algunas contraprestaciones.
El tipado esttico busca errores en los tipos de datos durante la compilacin. Esto debera incrementar la abilidad de los programas procesados. Sin embargo, los programadores, normalmente, estn en desacuerdo en cmo
los errores de tipos de datos ms comunes ocurren, y en
qu proporcin de estos errores que se han escrito podran
haberse cazado con un tipado esttico. El tipado esttico
aboga por la creencia de que los programas son ms ables cuando son chequeados sus tipos de datos, mientras
que el tipado dinmico apunta al cdigo distribuido que
se ha probado que es able y un conjunto pequeo de
errores. El valor del tipado esttico, entonces, se incrementa a la par que se endurece el sistema de tipicacin.
Los defensores de los lenguajes fuertemente tipados como ML y Haskell han sugerido que casi todos los errores
pueden ser considerados errores de los tipos de datos, si
los tipos de datos usados en un programa estn sucientemente bien declarados por el programador o inferidos
por el compilador.[1]
El tipado esttico resulta, normalmente, en un cdigo
compilado que se ejecuta ms rpidamente. Cuando el
compilador conoce los tipos de datos exactos que estn
en uso, puede producir cdigo mquina optimizado. Adems, los compiladores en los lenguajes de tipado esttico
pueden encontrar atajos ms fcilmente. Algunos lenguajes de tipicacin dinmica como el lisp permiten declaraciones de tipos de datos opcionales para la optimizacin
por esta misma razn. El tipado esttico generaliza este
uso. Ver optimizacin de software
En contraste, el tipado dinmico permite a los compila-

4.3. REFERENCIAS
dores e intrpretes ejecutarse ms rpidamente, debido
a que los cambios en el cdigo fuente en los lenguajes
dinmicamente tipados puede resultar en menores comprobaciones y menos cdigo que revisar. Esto tambin
reduce el ciclo editar-compilar-comprobar-depurar.
Lenguajes estticamente tipados que no dispongan de inferencia (como Java), requieren que el programador declare los tipos de datos que un mtodo o funcin puede
procesar. Esto puede hacer la veces de documentacin
adicional del programa, que el compilador no permitir
que el programador ignore o drift out of synchronization.
Sin embargo, un lenguaje puede ser de tipicacin esttica sin requerir la declaracin del tipo de dato (ejemplos
incluyen Scala y C#3.0), as que esto no es una consecuencia de tipicacin esttica.
El tipado dinmico permite construcciones que algunos
sistemas de tipado estatico rechazaran al considerarlas
ilegales. Por ejemplo, la funcin eval de Python, la cual
ejecuta datos arbitrarios como si fueran cdigo. Adems,
el tipado dinmico es ms adecuado para cdigo de transicin o para el prototipado. Desarrollos recientes en lenguajes como Haskell (por ejemplo, los tipos algebraicos
generalizados), permiten a lenguajes de tipado estatico,
ejecutar cdigo a partir de estructuras de datos de una
forma segura.
El tipado dinmico tpicamente hace que la
metaprogramacin sea ms poderosa y fcil de usar.
Por ejemplo, C++ templates son tpicamente ms
engorrosas de escribir que su equivalente en Ruby o
Python.[cita requerida] Caractersticas de tiempo de ejecucin tales como metaclases e introspeccin de tipos con
frecuencia son ms difciles de usar en lenguajes de
tipado esttico.

4.3 Referencias
[1] Dependent Types in Practical Programming - Xi, Pfenning (ResearchIndex)

Captulo 5

Alonzo Church
Alonzo Church (14 de junio de 1903 - 11 de agosto de
1995), matemtico y lgico norteamericano responsable
por crear la base de la computacin terica. Nacido en la
ciudad de Washington, se diplom en 1924 y obtuvo su
doctorado en 1927 en la Universidad de Princeton, donde
ejerci como profesor entre 1929 y 1967.
Su obra ms conocida es el desarrollo del clculo lambda, y su trabajo de 1936 que muestra la existencia de
problemas indecidibles. Este trabajo precedi el famoso
trabajo de su alumno Alan Turing sobre el problema de
parada que tambin demostr la existencia de problemas
irresolubles por dispositivos mecnicos. Luego de revisar la tesis doctoral de Turing, demostraron que el clculo
lambda y la mquina de Turing utilizada para expresar el
problema de parada tenan igual poder de expresin; posteriormente demostraron que una variedad de procesos
mecnicos alternos para realizar clculos tenan poder de
cmputo equivalente. Como resultado se postul la Tesis
de Church-Turing.
Entre los ms conocidos estudiantes de doctorado de
Church estn Stephen Kleene, J. Barkley Rosser, Leon
Henkin, John George Kemeny, Michael O. Rabin, Dana
Scott, Simon Kochen, Raymond Smullyan y otros.
El clculo lambda inuenci el diseo del lenguaje Lisp
as como los lenguajes de programacin funcional.

5.1 Vase tambin


Principio de Church-Turing-Deutsch
Lgica combinatoria

5.2 Enlaces externos


Biografa de Church, en ingls
H B Enderton, In memoriam: Alonzo Church

10

Captulo 6

Clculo lambda
El clculo lambda es un sistema formal diseado para investigar la denicin de funcin, la nocin de aplicacin de funciones y la recursin. Fue introducido por
Alonzo Church y Stephen Kleene en la dcada de 1930;
Church us el clculo lambda en 1936 para resolver el
Entscheidungsproblem. Puede ser usado para denir de
manera limpia y precisa qu es una "funcin computable". El interrogante de si dos expresiones del clculo lambda son equivalentes no puede ser resuelto por
un algoritmo general. Esta fue la primera pregunta, incluso antes que el problema de la parada, para el cual
la indecidibilidad fue probada. El clculo lambda tiene
una gran inuencia sobre los lenguajes funcionales, como
Lisp, ML y Haskell.

6.2 Introduccin informal


Considrese las siguientes dos funciones. Por un lado, la
funcin identidad I(x) = x, que toma un nico argumento,
x, e inmediatamente devuelve x. Por otro lado, la funcin
suma S(x,y) = x + y, que toma dos argumentos, x e y,
y devuelve la suma de ambos: x + y. Usando estas dos
funciones como ejemplo, es posible hacer algunas observaciones tiles acerca de varias ideas fundamentales del
clculo lambda.

La primera observacin es que las funciones no necesitan


ser explcitamente nombradas. Esto es, la funcin S(x,y)
= x + y puede ser reescrita como una funcin annima:
x,y x + y (que se lee: el par de x e y se mapea a x
Se puede considerar al clculo lambda como el ms + y). Del mismo modo, I(x) = x puede ser reescrita de
pequeo lenguaje universal de programacin. Consiste forma annima como x x, que se lee: el argumento x
en una regla de transformacin simple (sustitucin de se mapea a s mismo.
variables) y un esquema simple para denir funciones.
La segunda observacin es que el nombre que se asigne a
El clculo lambda es universal porque cualquier funcin los argumentos de la funcin es generalmente irrelevante.
computable puede ser expresada y evaluada a travs de Esto es, x x e y y expresan la misma funcin: la
l. Por lo tanto, es equivalente a las mquinas de Turing. funcin identidad. Del mismo modo, x,y x + y y u,v
Sin embargo, el clculo lambda no hace nfasis en el uso u + v expresan la misma funcin: la funcin suma.
de reglas de transformacin y no considera las mquinas
reales que pueden implementarlo. Se trata de una pro- Una tercera observacin es que toda funcin que requiere dos argumentos, como por ejemplo la funcin suma,
puesta ms cercana al software que al hardware.
puede ser reescrita como una funcin que acepta un niEste artculo se enfocar sobre el clculo lambda sin ti- co argumento, pero que devuelve otra funcin, la cual a
pos, como fue diseado originalmente por Church. Desde su vez acepta un nico argumento. Por ejemplo, x,y x
entonces, algunos clculo lambda tipados fueron creados. + y puede ser reescrita como x (y x + y). Esta transformacin se conoce como curricacin, y puede generalizarse para funciones que aceptan cualquier nmero de
argumentos. Esta puede parecer difcil de entender, pero
se entiende mejor mediante un ejemplo. Considrese la
funcin suma no curricada:
x,y x + y

6.1 Historia

Al tomar a los nmeros 2 y 3 como argumentos, se obtiene:

Originalmente, Church haba tratado de construir un sistema formal completo para modelizar la matemtica; pe2+3
ro cuando este se volvi susceptible a la paradoja de Russell, separ del sistema al clculo lambda y lo us para
estudiar la computabilidad, culminando en la respuesta Lo cual es igual a 5. Considrese ahora la versin currinegativa al problema de la parada.
cada de la funcin:
11

12

CAPTULO 6. CLCULO LAMBDA


x (y x + y)

6.3 Denicin formal

Si se toma al nmero 2 como argumento, se obtiene la 6.3.1 Sintaxis


funcin:
En el clculo lambda, una expresin o trmino se dene
recursivamente a travs de las siguientes reglas de formay2+y
cin:
Y tomando luego al nmero 3 como argumento, se obtiene:
2+3
Lo cual es igual a 5. De modo que la versin curricada
devuelve el mismo resultado que la versin no curricada.
En el clculo lambda, todas las expresiones representan
funciones annimas de un slo argumento.

1. Toda variable es un trmino: x, y, z, u, v, w, x1 , x2 ,


y9 ,...
2. Si t es un trmino y x es una variable, entonces (x.t)
es un trmino (llamado una abstraccin lambda).
3. Si t y s son trminos, entonces (ts) es un trmino
(llamado una aplicacin lambda).

4. Nada ms es un trmino.
Una cuarta observacin es que una funcin puede aceptar como argumento a otra funcin, siempre y cuando esta otra funcin tenga ella misma un slo argumento. Por Segn estas reglas de formacin, las siguientes cadenas de
ejemplo, la funcin identidad puede aceptar como argu- caracteres son trminos:
mento a la funcin suma (curricada). Es decir, se toma a
la funcin x (y x + y) y se la pone como argumento
x
en z z. El resultado ser obviamente x (z x + z),
(xy)
(igual a la x (y x + y)) pues la funcin identidad
siempre devuelve lo mismo que se le da.
(((xz)y)x)
En el clculo lambda, las funciones estn denidas por
(x.x)
expresiones lambda, que dicen qu se hace con su argu((x.x)y)
mento. Por ejemplo, la funcin sumar 2, f(x) = x + 2 se
expresa en clculo lambda as: x. x + 2 (o, equivalente(z.(x.y))
mente, y. y + 2 ya que el nombre de su argumento no es
((x(z.z))z)
importante). Y el nmero f(3) sera escrito como ( x. x +
2) 3. La aplicacin de funciones es asociativa a izquierda:
f x y = (f x) y. Considerando la funcin que aplica una Por convencin se suelen omitir los parntesis externos,
funcin al nmero 3: f. f 3. , podemos pasarle sumar ya que no cumplen ninguna funcin de desambiguacin.
2, quedando as: ( f. f 3) ( x. x + 2).
Por ejemplo se escribe (z.z)z en vez de ((z.z)z), y se
escribe x(y(zx)) en vez de (x(y(zx))). Adems se suele
Las tres expresiones:
adoptar la convencin de que la aplicacin de funciones
es asociativa hacia la izquierda. Esto quiere decir, por
( f. f 3)( x. x + 2) , ( x. x + 2) 3 y 3 + 2
ejemplo, que xyzz debe entenderse como (((xy)z)z), y que
(z.z)yzx debe entenderse como ((((z.z)y)z)x).
son equivalentes.
Las primeras dos reglas generan funciones, mientras que
No todas las expresiones lambda pueden ser reducidas a la ltima describe la aplicacin de una funcin a un argumento. Una abstraccin lambda x.t representa una funun valor denido. Considrese la siguiente:
cin annima que toma un nico argumento, y se dice
que el signo liga la variable x en el trmino t. En cam( x. x x) ( x. x x)
bio, una aplicacin lambda ts representa la aplicacin de
un argumento s a una funcin t. Por ejemplo, x.x repre
senta la funcin identidad x x, y (x.x)y representa la
funcin identidad aplicada a y. Luego, x.y representa la
funcin constante x y, que develve y sin importar qu
( x. x x x) ( x. x x x)
argumento se le d.
tratar de reducir estas expresiones slo lleva a encontrarse
con la misma expresin o algo ms complejo. ( x. x x)
es conocido como combinador; (( x. x x) ( x. x x)) se
conoce como , (( x. x x x) ( x. x x x)) como 2 , etc.

Las expresiones lambda no son muy interesantes por s


mismas. Lo que las hace interesantes son las muchas nociones de equivalencia y reduccin que pueden ser denidas sobre ellas.

6.3. DEFINICIN FORMAL

6.3.2

Variables libres y ligadas

13
V. E == W. E[V := W]

Las apariciones (ocurrencias) de variables en una expresi W no est libre en E y W no est ligada a un donde se
sin son de tres tipos:
haya reemplazado a V. Esta regla nos dice, por ejemplo,
que x. ( x. x) x es equivalente a y. ( x. x) y.
1. Ocurrencias de ligadura (binders)
En un ejemplo de otro tipo, se ve que
2. Ocurrencias ligadas (bound occurrences)
for (int i = 0; i < max; i++) { proc (i); }
3. Ocurrencias libres (free occurrences)
es equivalente a
Las variables de ligadura son aquellas que estn entre el
y el punto. Por ejemplo, siendo E una expresin lambda:
( x y z. E) Las ligaduras son x,y y z.

for (int j = 0; j < max; j++) { proc (j); }

6.3.4 -reduccin

La ligadura de ocurrencias de una variable est denido recursivamente sobre la estructura de las expresiones La regla de beta reduccin expresa la idea de la aplicacin
funcional. Enuncia que
lambda, de esta manera:
1. En expresiones de la forma V, donde V es una variable, V es una ocurrencia libre.

(( V. E) E ) == E[V := E ]

2. En expresiones de la forma V. E, las ocurrencias si todas las ocurrencias de E estn libres en E[V := E ].
son libres en E salvo aquellas de V. En este caso las Una expresin de la forma (( V. E) E ) es llamada un beV en E se dicen ligadas por el antes V.
ta redex. Una lambda expresin que no admite ninguna
3. En expresiones de la forma (E E ), las ocurrencias beta reduccin se dice que est en su forma normal. No
toda expresin lambda tiene forma normal, pero si exislibres son aquellas ocurrencias de E y E.
te, es nica. Ms an, existe un algoritmo para computar la forma normal: la reduccin de orden normal. La
Expresiones lambda tales como x. (x y) no denen funejecucin de este algoritmo termina si y slo si la expreciones porque las ocurrencias de y estn libres. Si la exsin lambda tiene forma normal. El teorema de Churchpresin no tiene variables libres, se dice que es cerrada.
Rosser nos dice que dos expresiones reducen a una misma
Como se permite la repeticin del identicador de va- si y slo si son equivalentes (salvo por el nombre de sus
riables, cada binding tiene una zona de alcance asocia- variables ligadas)
da (scope de ahora en adelante) Un ejemplo tpico es:
(x.x(x.x))x, donde el scope del binding ms a la derecha afecta slo a la x que tiene ah, la situacin del otro 6.3.5 -conversin
binding es anloga, pero no incluye el scope de la primera. Por ltimo la x ms a la derecha est libre. Por lo tanto, Es la tercer regla, esta conversin, que podra ser aaesa expresin puede reexpresarse as (y.y(z.z))x
dida a las dos anteriores para formar una nueva relacin de equivalencia. La eta conversin expresa la idea
de extensionalidad, que en este contexto implica que dos
6.3.3 -conversin
funciones son la misma si y solo si dan el mismo resultado para cualquier argumento. La eta conversin convierte
La regla de alfa-conversin fue pensada para expresar la entre x. f x y f siempre que x no aparezca sola en f. Esto
idea siguiente: los nombres de las variables ligadas no son
puede ser entendido como equivalente a la extensionaliimportantes. Por ejemplo x.x y y.y son la misma fun- dad as:
cin. Sin embargo, esta regla no es tan simple como parece a primera vista. Hay algunas restricciones que hay que Si f y g son extensionalmente equivalentes, es decir, si f
cumplir antes de cambiar el nombre de una variable por a== g a para cualquier expresin lambda a entonces, en
otra. Por ejemplo, si reemplazamos x por y en x.y.x, ob- particular tomando a como una variable x que no aparece
tenemos y.y.y, que claramente, no es la misma funcin. sola en f ni en g, tenemos que f x == g x y por tanto x.
f x == x. g x, y as por eta conversin f == g. Entonces,
Este fenmeno se conoce como captura de variables.
si aceptamos la eta conversin como vlida, resulta que la
La regla de alfa-conversin establece que si V y W son extensionalidad es vlida.
variables, E es una expresin lambda, y
Inversamente, si aceptamos la extensionalidad como vE[V := W]
lida entonces, dado que por beta reduccin de todo y terepresenta la expresin E con todas las ocurrencias libres nemos que ( x. f x) y == f y, resulta que x. f x == f;
de V en E reemplazadas con W, entonces
es decir, descubrimos que la eta conversin es vlida.

14

CAPTULO 6. CLCULO LAMBDA

6.4 Clculos aritmticos con lambda

PRED := n. n ( g k. (g 1) ( u. PLUS (g k)
1) k) ( v. 0) 0

Vase que el truco consiste en que (g 1) ( u. PLUS (g k)


Hay varias formas posibles de denir los nmeros natu- 1) k que devuelve k si el valor de g(1) es cero o g(k) + 1
rales en el clculo lambda, pero el ms comn son los en cualquier otro caso.
nmeros de Church, que pueden denirse como sigue:
0 := f x. x

6.5 Lgica y predicados

1 := f x. f x
2 := f x. f (f x)
3 := f x. f (f (f x))
y as sucesivamente. Instintivamente el nmero n en el
clculo lambda es una funcin que toma a otra funcin
f como argumento y devuelve la n-ava composicin de
f. As que, un nmero de Church es una funcin de alto
nivel -- toma una nica funcin f como parmetro y otra
funcin de parmetro nico.
(Vase que en el clculo original lambda de Church era
obligatorio que el parmetro formal de la expresin lambda apareciera al menos una vez en el cuerpo de la funcin,
lo que hace imposible denir el 0.) Dada esta denicin
de los nmeros de Church, se puede establecer una funcin de sucesin que dado un nmero n devuelve n + 1:
SUCC := n f x. f ((n f) x)
La suma se dene as:
PLUS := m n f x. n f (m f x)

Para poder llegar a una denicin de booleanos en clculo lambda, se comienza con su especicacin: TRUE,
FALSE y ifthenelse deben ser -expresiones en forma
normal, tal que para todo par de -expresiones P y Q
(ifthenelse FALSE P Q) Q
(ifthenelse TRUE P Q) P
Cualquier par de expresiones que cumplan esto sirve.
La solucin ms simple resulta de jar ifthenelse como
b.x.y. b x y, dejando que todo el trabajo de aplicar los
booleanos recaiga sobre TRUE y FALSE, entonces:
(ifthenelse TRUE) (x.y.x)
(ifthenelse FALSE) (x.y.y)
Quedando:
TRUE := x y. x

FALSE := x y. y
PLUS puede entenderse como una funcin que toma dos
nmeros naturales como parmetros devolviendo otro; Los booleanos (como era de esperarse) tambin son funpuede vericarse que
ciones. Es fcil ver que es posible cambiar la -expresin
ifthenelse para que aplique los parmetros en orden inverso, cambiando la forma de TRUE y FALSE. Por eso, se
PLUS 2 3 and 5
adapta, por convencin, de esta manera. (conocida como
son expresiones lambda equivalentes. La Multiplicacin booleanos de Church) Ntese que FALSE es equivalente
al nmero de Church cero.
se expresa como
MULT := m n. m (PLUS n) 0,
la idea es que multiplicar m y n es lo mismo que sumar m
veces a n. De otra manera:
MULT := m n f. m (n f)
La funcin Predecesor PRED n = n - 1 de un entero positivo n es ms compleja:
PRED := n f x. n ( g h. h (g f)) ( u. x) (
u. u)
o alternativamente

Luego, con estas dos deniciones podemos denir algunos operadores lgicos:
AND := p q. p q FALSE
OR := p q. p TRUE q
NOT := p. p FALSE TRUE
Ahora podemos reducir, por ejemplo:
AND TRUE FALSE
( p q. p q FALSE) TRUE FALSE TRUE FALSE FALSE
( x y. x) FALSE FALSE
FALSE

6.8. FUNCIONES COMPUTABLES Y EL CLCULO LAMBDA

15

y vemos que AND TRUE FALSE es equivalente a FAL- Sin embargo, g todava no es recursiva en si misma; para
SE.
usar g para crear la funcin factorial recursiva, la funcin
Un predicado es una funcin que devuelve un valor boo- pasada a g como f debe tener unas propiedades especleano. El predicado ms simple es ISZERO el cual nos cas. A saber, la funcin pasada como f debe expandirse
devuelve TRUE si el nmero de Church argumento es 0 a la funcing llamada con un argumento -- y que el argumento debe ser la funcin que ha sido pasado como f de
o FALSE en otro caso.
nuevo.
En otras palabras, f debe expandir a g(f). Esta llamada
a g expandir a la siguiente a la funcin factorial y calcular otro nivel de recursin. En la expansin la funcin
Por supuesto, esta denicin nos sirve slo para los n- f aparecer nuevamente, y nuevamente expandir a g(f)
meros naturales denidos previamente.
y continuara la recursin. Este tipo de funcin, donde f
= g(f), es llamada un xed-point de g, y resulta que puede ser implementado en el clculo lambda usando lo que
6.6 Pares
es conocido como el paradoxical operator or xed-point
operator y es representado como Y -- el Y combinator:
Un par (2-tupla) puede ser denido en trminos de TRUE
Y = g. ( x. g (x x)) ( x. g (x x))
y FALSE.
ISZERO := n. n ( x. FALSE) TRUE

CONS := f.s. b. b f s
CAR := p. p TRUE
CDR := p. p FALSE
NIL := x.TRUE
NULL := p. p (x y.FALSE)
Una estructura de datos del tipo lista enlazada puede ser
denida, tanto como NIL para la lista vaca, o como el
CONS de un elemento y de la lista ms pequea en tal
caso sea requerido.

En el clculo lambda, Y g es un punto jo de g, debido


a que expande a g (Y g). Ahora, para completar nuestra
llamada recursiva a la funcin factorial, simplemente llamara g (Y g) n, donde n es el nmero del cual queremos
calcular el factorial.
Dado, por ejemplo n = 5, esta se expandir como:
( n.(1, si n = 0; y n((Y g)(n1)), si n>0)) 5
1, si 5 = 0; y 5(g(Y g)(5-1)), si 5>0
5(g(Y g) 4)
5( n. (1, si n = 0; y n((Y g)(n1)), si n>0) 4)
5(1, si 4 = 0; y 4(g(Y g)(4-1)), si 4>0)

6.7 Recursin
Recursin es la denicin de una funcin usando la funcin que se est deniendo. El clculo lambda no permite
esto. Sin embargo, esta nocin es un poco confusa. Considere por ejemplo la denicin de la funcin factorial f(n)
denida recursivamente por:
f(n) = 1, if n = 0; and nf(n1), if n>0.
En el clculo lambda, no es posible denir funciones que
se incluyan a si mismas. Para sortear esta dicultad, se
comienza por denir una funcin, denominada aqu como
g, que toma a una funcin f como argumento y devuelve
otra funcin que toma n como argumento:
g := f n. (1, if n = 0; and nf(n1), if n>0).

5(4(g(Y g) 3))
5(4( n. (1, si n = 0; y n((Y g)(n1)), si n>0)
3))
5(4(1, if 3 = 0; y 3(g(Y g)(3-1)), si 3>0))
5(4(3(g(Y g) 2)))
...
Y as, se va evaluando la estructura del algoritmo de forma recursiva. Cada funcin recursiva denida puede ser
vista como un punto jo de otra funcin adecuada, y
por lo tanto, utilizando Y, cada funcin recursiva denida puede expresarse como una expresin lambda. En
particular, ahora podemos denir limpiamente la resta,
la multiplicacin y la comparacin de predicado de los
nmeros naturales de forma recursiva.

6.8 Funciones computables y el


clculo lambda

La funcin que devuelve g es o bien la constante 1, o n veces la aplicacin de la funcin f a n1. Usando el predicado ISZERO, y las deniciones booleanas y algebraicas Una funcin F: N N de nmeros naturales es una
anteriores, la funcin g puede ser denida en el clculo funcin computable si y slo si existe una expresin lambda f tal que para todo par de x, y in N, F(x) = y si y slo
lambda.

16
si f x == y, donde x e y son numerales de Church correspondientes a x e y, respectivamente. Esta slo es una de
tantas maneras de denir computabilidad; vase tesis de
Church-Turing para una discusin, otras aproximaciones
y sus equivalencias.

6.9 Indecisin de equivalencia


No hay un algoritmo que tome dos expresiones lambda y
produzca TRUE o FALSE dependiendo de si las dos expresiones son o no equivalentes. Este fue histricamente
el primer problema para el cual la irresolubilidad pudo ser
probada. Por supuesto, de manera previa para hacer esto,
la nocin de algoritmo tuvo que ser denida de forma clara; Church la deni usando funciones recursivas, la cual
se sabe que es equivalente a todas las otras deniciones
razonables de esta nocin.

CAPTULO 6. CLCULO LAMBDA


resultado equivalente se obtiene pasando punteros al cdigo de las funciones (subprogramas). Estos mecanismos
estn limitados a subprogramas escritos explcitamente
en el cdigo, y no soportan directamente funciones de alto nivel. Algunos lenguajes imperativos orientados a objetos, tiene notaciones que representan funciones de cualquier orden; tales mecanismos estn disponibles en C++,
Smalltalk y ms recientemente en (agentes de ) Eiel
y (delegados de) C#. Como ejemplo, la expresin de
agente en lnea de Eiel
agent (x: REAL): REAL do Result := x * x end

denota un objeto correspondiente a la expresin lambda


x. x*x (con llamada por valor). Puede ser tratada como cualquier otra expresin, por ejemplo, asignarla a una
variable o pasada a una rutina. Si el valor de square es el
de la expresin de agente anterior, entonces el resultado
de aplicar square a un valor (una reduccin ) es expresada como square.item ([a]), donde el argumento es pasado
La primera prueba de Church reduce el problema de de- como una tupla.
terminar si una expresin lambda dada tiene una forma Un ejemplo en Python usa la forma lambda de funciones:
normal. Una forma normal es una expresin equivalenfunc = lambda x: x * x
te irreductible. Entonces se asume que este predicado es
computable y que puede ser expresado de aqu en adelante en notacin de clculo lambda. Basndose en un traba- Lo anterior crea una funcin annima llamada func que
jo previo de Kleene y construyendo una numeracin de puede ser pasada como parmetros a otras funciones, ser
Gdel para expresiones lambda, Church construy una almacenada en variables, etc. Python tambin puede traexpresin lambda e que segua la prueba del teorema de tar cualquier otra funcin creada con la sentencia estndar
incompletitud de Gdel. Si e se aplica a su propio nmero def como un rst-class object.
Gdel, se produce una contradiccin.
Lo mismo se aplica a la siguiente expresin en Smalltalk:
[ :x | x * x ]

6.10 Clculo lambda y los lenguajes de programacin


Como lo menciona Peter Landin en su libro clsico
Correspondencia entre ALGOL 60 y el clculo lambda
de Church, la mayora de los lenguajes de programacin
tienen sus races en el clculo lambda, lo que provee los
mecanismos bsicos para las abstracciones de procedimiento y abstracciones de aplicaciones (subprogramas).

Este es un objeto de primera clase (clausura de bloque),


que puede ser guardado en variables, pasado como argumento, etc.
Un ejemplo similar en C++ (usando la biblioteca
Boost.Lambda):
for_each(v.begin(), v.end(), cout << _1 * _1 << endl;);
Aqu, la funcin de librera estndar for_each itera sobre todos los miembros del vector (o lista) v, e imprime
el cuadrado de cada elemento. La notacin _1 es la convencin Boost de Lambda para representar el elemento
contenedor, representado como x en cualquier otro lado.

La implementacin del clculo lambda en una computadora involucra tratar a las funciones como objetos de
primera clase, lo que aumenta la complejidad de su implementacin. Un problema particularmente difcil es la
implementacin de funciones de orden superior, conoci- Un delegado simple de c# que toma una variable y retordo como el problema de Funarg.
na el cuadrado. Esta variable funcin puede ser pasada a
Las contrapartes ms prominentes del clculo lambda en otros mtodos (o delegados de funciones)
programacin son los lenguajes de programacin funcio- // Declare a delegate signature delegate double Mathnal, que esencialmente implementa el clculo aumentado Delegate (double i); // Create an delegate instance
con algunas constantes y tipos de dato.
MathDelegate f = delegate (double i) { return Math.Pow
Los lenguajes funcionales no son los nicos que soportan las funciones como objetos de primera clase. Muchos
lenguajes de programacin imperativa, como Pascal, hace tiempo que permiten pasar subprogramas como argumentos a otros subprogramas. En C y su derivado C++ el

(i, 2); }; // Passing 'f' function variable to another


method, executing, // and returning the result of the
function double Execute (MathDelegate func) { return
func(100); }

6.14. ENLACES EXTERNOS

17

6.11 Concurrencia y paralelismo

Henz, Martin, The Lambda Calculus. Formally correct development of the Lambda calculus.

La propiedad Church-Rosser del clculo lambda signica que la evaluacin (reduccin-) puede ser llevada a
cabo en cualquier orden, incluso al mismo tiempo (de
hecho, el clculo lambda es de transparencia referencial).
Aunque esto signica que el clculo lambda puede crear
un modelo de diversas estrategias de evaluacin no deterministas, no ofrece ninguna nocin acerca de la computacin paralela, ni expresa ningn lenguaje de programacin simultneo (o concurrente). Procesadores de clculo
tales como el CSP, CSS, el Clculo- y el Clculo ambiente han sido diseados para tales propsitos.

Hewitt, Carl, What is Commitment? Physical, Organizational, and Social COIN@AAMAS. April 27,
2006.

A pesar de que el clculo lambda no determinista es capaz de expresar cualquier funcin parcial recursiva, no
es capaz de expresar cualquier computacin. Por ejemplo, no es capaz de expresar no-determinismos innitos
(como cualquier expresin lamba no determinista que termine; terminar en un nmero nito de expresiones). Sin
embargo, hay programas concurrentes que garantizan la
interrupcin de ese trmino en un nmero innito de estados [Clinger 1981, Hewitt 2006].

6.12 Vase tambin


Unlambda

6.13 Referencias
Abelson, Harold & Gerald Jay Sussman. Structure
and Interpretation of Computer Programs. The MIT
Press. ISBN 0-262-51087-1.
Barendregt, Henk, The lambda calculus, its syntax
and semantics, North-Holland (1984), is the comprehensive reference on the (untyped) lambda calculus; see also the paper Introduction to Lambda Calculus.
Barendregt, Henk, The Type Free Lambda Calculus
pp1091-1132 of Handbook of Mathematical Logic,
North-Holland (1977) ISBN 0-7204-2285-X
Church, Alonzo, An unsolvable problem of elementary number theory, American Journal of Mathematics, 58 (1936), pp. 345363. This paper contains
the proof that the equivalence of lambda expressions
is in general not decidable.
Clinger, William, Foundations of Actor Semantics.
MIT Mathematics Doctoral Dissertation, June 1981.
Punit, Gupta, Amit & Ashutosh Agte, Untyped
lambda-calculus, alpha-, beta- and eta- reductions
and recursion

Kleene, Stephen, A theory of positive integers in formal logic, American Journal of Mathematics, 57
(1935), pp. 153173 and 219244. Contains the
lambda calculus denitions of several familiar functions.
Landin, Peter, A Correspondence Between
ALGOL 60 and Churchs Lambda-Notation,
Communications of the ACM, vol. 8, no. 2
(1965), pages 89-101. Available from the ACM
site. A classic paper highlighting the importance
of lambda-calculus as a basis for programming
languages.
Larson, Jim, An Introduction to Lambda Calculus
and Scheme. A gentle introduction for programmers.
Some parts of this article are based on material from
FOLDOC, used with permission.
Miguel Angel Jimenez Santana, Lambda Calculus
Graphical Interpreter

6.14 Enlaces externos


L. Allison, Algunos ejemplos ejecutables de clculo-
(en ingls)
Chris Barker, Lambda tutorial Some executable (Javascript) Ejemplos simples, con anotaciones. (en ingls)
Georg P. Loczewski, The Lambda Calculus and
A++
Ral Rojas, A Tutorial Introduction to the Lambda
Calculus -(PDF)
David C. Keenan, To Dissect a Mockingbird: A Graphical Notation for the Lambda Calculus with Animated Reduction
Bret Victor, Alligator Eggs: A Puzzle Game Based on
Lambda Calculus
Miguel Angel Jimenez Santana, Lambda Calculus
Graphical Interpreter

Captulo 7

Clculo de Construcciones
El Clculo de Construcciones (CoC) es un lambdaclculo tipicado de alto nivel que contiene un lgebra
de tipos. CoC permite denir funciones por ejemplo, de
enteros en tipos, de tipos en tipos al igual que las funciones de enteros en enteros. El clculo de construcciones
tiene la propiedad de normalizacin fuerte. El desarrollador inicial de CoC fue Thierry Coquand en el INRIA,
Francia.
El clculo de construcciones sirvi de base a las primeras
versiones del demostrador de teoremas Coq; las versiones posteriores se construyeron sobre el clculo de Construcciones Inductivas que es una extensin de CoC con
soporte para tipos de datos inductivos. En el CoC original, los tipos inductivos deban ser emulados con otras
construcciones del clculo.

18

Captulo 8

Tipo abstracto
Este artculo trata sobre tipos sin miembros directos; ver tambin Tipo de dato abstracto.

No se dan en lenguajes sin subtipos. Muchos lenguajes


tipados dinmicamente no tienen caractersticas equivalentes, aunque el uso de duck typing hace los tipos absEn ingeniera de software, un tipo abstracto es un tipo tractos innecesarios; sin embargo, algunos lenguajes moen un sistema de tipo nominativo que es declarado por dernos tipados dinmicamente tienen traits.
el programador, y que tiene la propiedad de no contener
Muchos autores argumentan que las clases deberan ser
miembros que no sean miembros de algn subtipo declaclases hoja (sin subtipos), o si no, deberan ser abstractas.
rado. Segn el paradigma de programacin orientado a
objetos, los tipos abstractos se implementan bajo nom- Los tipos abstractos son tiles en que pueden ser utilibres como clases base abstractas, interfaces, rasgos zados para denir y establecer un protocolo; un conjunto
(en ingls, traits), mixins, sabores (en ingls, avors) o de operaciones que todos los objetos que implementen el
protocolo deben soportar. El hecho de que muchos lenroles.
guajes no permitan la instanciacin de tipos abstractos (y
fuercen a los subtipos a implementar todas las funciona8.1 Indicacin de tipos abstractos lidades necesarias) asegura todava ms la correccin del
programa.
Las clases abstractas pueden ser creadas, indicadas o simuladas de diversas formas:

8.3 Tipos de tipos abstractos

Usando la palabra clave abstract en la denicin de


la clase, como en Java.
Hay varios mecanismos para crear tipos abstractos, que
varan segn sus capacidades.
Incluyendo, en la denicin de la clase, uno o ms
mtodos abstractos (llamados funciones virtuales
Clases base abstractas completas. Son las clases
puras en C++; mtodos que la clase est declarada
tanto explcitamente declaradas como abstractas copara aceptar como parte de su protocolo, pero para
mo las que contienen mtodos abstractos (no implelos que no se proporciona implementacin.
mentados). Excepto la capacidad de instanciacin,
tienen las mismas capacidades que una clase o ti Por herencia de un tipo abstracto, y no sobrescripo concreto. Los tipos abstractos completos estabiendo todas las caractersticas necesarias para comban presentes en las primeras versiones de C++, y la
pletar la denicin de la clase que falten.
clase base abstracta permanece como la nica cons En muchos lenguajes tipados dinmicamente como
truccin del lenguaje para generar tipos abstractos
Smalltalk, cualquier clase que enve un mtodo paren C++.
ticular a this, pero no implemente ese mtodo, pue Nota: Debido a problemas tcnicos con la
de ser considerada abstracta. Sin embargo, en muherencia mltiple en C++ y otros lenguajes;
chos lenguajes de este tipo, los posibles errores no
muchos lenguajes orientados a objetos intenson detectados hasta que se usa la clase, y el mentaron restringir la herencia a una sola clase basaje enva resultados en un error como doesNotUnse directa. Para soportar mltiple subtipado,
derstand. ms o menos
varios lenguajes aadieron otras caractersticas que podan ser usadas para crear tipos abstractos, pero con menos potencia que clases
8.2 Uso de tipos abstractos
desarrolladas del todo.
Los tipos abstractos son una caracterstica importante
en lenguajes orientados a objetos tipados estticamente.
19

Common Lisp Object System (CLOS) incluye


mixins, basados en el sistema Flavors desarrollado

20

CAPTULO 8. TIPO ABSTRACTO


por David Moon para Lisp Machine Lisp. CLOS
utiliza funciones genricas, denidas aparte de las
clases, en lugar de funciones miembro denidas en
la clase.

Java incluye interfaces, un tipo abstracto que puede


contener cabeceras de mtodos y constantes (variables nales), pero no implementacin de mtodos
o miembros de datos no-nales. Las clases de Java pueden implementar mltiples interfaces. Una
clase abstracta en Java puede implementar interfaces y denir algunas cabeceras de mtodo al tiempo
que mantiene otros mtodos abstractos con la palabra clave abstract. Este tipo de plantilla abstracta
puede heredar de una clase concreta.
Traits son un enfoque ms reciente al problema, que
se puede encontrar en Scala y Perl 6 (llamados roles), y propuesto como extensin a Smalltalk (donde fue desarrollada la implementacin original). Los
traits no estn restringidos en lo que incluyen en su
denicin, y mltiples traits pueden ser pueden componer la denicin de una clase. Sin embargo, las
reglas de composicin para traits son diferentes de
las de la herencia estndar, para evitar las dicultades semnticas a menudo asociadas con la herencia
mltiple.

8.4 Enlaces externos


Types and Programming Languages by Benjamin
Pierce (MIT Press 2002) (en ingls)
More Eective C++: 35 New Ways to Improve Your
Programs and Designs by Scott Meyers (1995) ISBN
0-201-63371-X (en ingls)
Traits: Composable Units of Behavior by Nathanael Schrli, Stphane Ducasse, Oscar Nierstrasz
and Andrew Black (en ingls)

Captulo 9

Conversin de tipos
En ciencias de la computacin la conversin de tipos (type casting en ingls) se reere a la transformacin de un
tipo de dato en otro. Esto se hace para tomar las ventajas que pueda ofrecer el tipo a que se va a convertir. Por
ejemplo, los valores de un conjunto ms limitado, como
nmeros enteros, se pueden almacenar en un formato ms
compacto y ms tarde convertidos a un formato diferente
que permita las operaciones que anteriormente no eran
posibles, tales como la divisin con decimales.

Patrn de bits: La representacin de bits en bruto


de la fuente es una copia literal, y se reinterpreta de
acuerdo con el tipo de destino. Esto tambin puede
lograrse a travs de aliasing.

9.2 Enlaces externos

9.1 Tipos de conversin


Hay dos tipos de conversin:
1. La implcita.
2. La explcita.
En la implcita se convierte un tipo de dato de menor rango a un supertipo (tipo de dato de mayor rango); este tipo
de conversin lo realiza el compilador, ya que no hay prdida de datos si, por ejemplo, se pasa un int (tipo entero)
a long.
En la conversin explcita, el compilador no es capaz de
realizarla por s solo y por ello debe denirse explcitamente en el programa.

9.1.1

Explcita

Existen varios tipos de conversin explcita:


Controlada: antes de realizar la conversin se controla en tiempo de ejecucin si el tipo de destino
puede tener el valor de origen, y si no se produce
un error.
No controlada: no se realiza ningn control, si el
tipo de dato destino no puede contener al de origen
el resultado es indenido (generalmente se produce
un desbordamiento de bfer y en algunos casos como en java el cambio se produce sin mayores consecuencias).
21

Conversin de tipos Microsoft.

Captulo 10

Tipado fuerte
Un lenguaje de programacin es fuertemente tipado si
no se permiten violaciones de los tipos de datos, es decir,
dado el valor de una variable de un tipo concreto, no se
puede usar como si fuera de otro tipo distinto a menos que
se haga una conversin. No hay una nica denicin de
este trmino. Un lenguaje que se dice que no est tipado
se reere a que no est fuertemente tipado.

pos (typecasting) y tambin debe estar soportado por el


compilador. Por ejemplo:
subrutina((oat)X)
Indica al compilador que no estamos cometiendo un error
y realmente deseamos convertir la variable X (entera)
en una variable de coma otante para invocar a subrutina.

Cada lenguaje de programacin puede ser ms o menos


tipado segn en que casos exige el typecasting. Por ejem10.1 Explicacin detallada
plo, la conversin automtica entre entero y coma otante
podra ser admitida, pero no al contrario. Si no es factible
Los lenguajes de programacin suelen contar con un sula conversin entre un tipo u otro, el compilador tambin
blenguaje de tipos para declarar variables. Este sublenemitir un error de compilacin.
guaje instruye al compilador respecto al tipo de valores
que puede adoptar cada variable. Por ejemplo:
int X;

10.2 Lenguajes no tipados

en el Lenguaje de programacin C signica la variable


X adopta valores numricos enteros.
Los lenguajes de programacin no tipados o dbilmente
tipados
no controlan los tipos de las variables que declaEstos tipos tambin se declaran para todos los argumentos
ran, de este modo, es posible usar variables de cualquier
de procedimientos o subrutinas. Por ejemplo:
tipo en un mismo escenario. Por ejemplo, una funcin
oat subrutina(oat Parametro) { return Parametro + 1.5;
puede recibir como parmetro un valor entero, cadena
}
de caracteres, otante...
Este procedimiento acepta un nmero en coma otante
No hay que confundir el trmino con los lenguajes de ti(nmero real) y le suma 1,5.
pos dinmicos, en los que los tipos de las variables se deEn los lenguajes fuertemente tipados, el compilador no ciden en tiempo de ejecucin, si bien es cierto que mupermite que se use una variable como parmetro de un chos lenguajes de programacin de tipos dinmicos (en
procedimiento si sus tipos no coinciden exactamente. los que no se declaran los tipos de datos) son tambin no
En el ejemplo anterior, no sera posible invocar la subru- tipados.
tina con la variable X si esta fuese de un tipo incomNo son necesarias las conversiones de tipos, por lo tanto
patible con oat. Es decir, si X fuese de tipo entero, el
el siguiente ejemplo es correcto
compilador produce una conversin de int a oat, y permite la llamada typecasting. En cambio si fuese de otro a = 2 //a es un entero cad = prueba de texto //cad es
tipo, como puntero a char(char *), para el que no existe una cadena de caracteres resultado = cad + a //resultado
una conversin implcita a oat, el compilador detectar es una cadena de caracteres (las conversiones dependen
del lenguaje)
el conicto y producir un error.

10.1.1

Conversin de tipos (typecasting)

Cuando un lenguaje es fuertemente tipado, el programador debe explcitamente convertir un tipo de datos en
otro. Esto se conoce como conversin o moldeado de ti-

10.3 Ejemplos de lenguajes fuertemente tipados

22

Haskell

10.4. EJEMPLOS DE LENGUAJES NO TIPADOS


ML
Ada
Modula-2
Pascal
Java
Objective-C
Go

10.4 Ejemplos de lenguajes no tipados


Smalltalk
Lisp
Perl
PHP
Prolog
Basic
Python

23

Captulo 11

Tipado dinmico
Un lenguaje de programacin es dinmicamente tipado
si una misma variable puede tomar valores de distinto tipo en distintos momentos. La mayora de lenguajes de tipado dinmico son lenguajes interpretados, como Python
o Ruby. Un lenguaje que no es dinmicamente tipado se
dice que es de tipado esttico, o estticamente tipado. Esta separacin se suele confundir con la diferencia entre
lenguajes fuertemente tipados y lenguajes dbilmente o
no tipados. Esta caracterstica estuvo en el lenguaje de
programacin SmallTalk

24

Captulo 12

Duck typing
En los lenguajes de programacin orientados a objetos, se
conoce como duck typing el estilo de tipicacin dinmica de datos en que el conjunto actual de mtodos y propiedades determina la validez semntica, en vez de que
lo hagan la herencia de una clase en particular o la implementacin de una interfaz especca. El nombre del
concepto se reere a la prueba del pato, una humorada
de razonamiento inductivo atribuida a James Whitcomb
Riley (ver Historia ms abajo), que pudo ser como sigue:
Cuando veo un ave que camina como un pato,
nada como un pato y suena como un pato, a esa
ave yo la llamo un pato.[1][2]

funcin calcular(a, b, c) => devuelve (a+b)*c ejemplo1


= calcular (1, 2, 3) ejemplo2 = calcular ([1, 2, 3], [4, 5,
6], 2) ejemplo3 = calcular ('manzanas ', 'y naranjas, ', 3)
mostrar a_cadena ejemplo1 mostrar a_cadena ejemplo2 mostrar a_cadena ejemplo3
En el ejemplo, cada vez que se llama la funcin calcular
se pueden emplear objetos sin relacin de herencia (nmeros, listas y cadenas). En tanto y en cuanto los objetos
soporten los mtodos "+" y "*" la operacin tendr xito.
Si se traduce este algoritmo a Ruby o Python por ejemplo,
el resultado de la ejecucin ser:
9 [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6] manzanas y naranjas,
manzanas y naranjas, manzanas y naranjas,

En duck typing, el programador solo se ocupa de los aspectos del objeto que van a usarse, y no del tipo de objeto que se trata. Por ejemplo en un lenguaje sin ducktyping uno puede crear una funcin que toma un objeto
de tipo Pato y llama los mtodos caminar y "parpar" de
ese objeto. En un lenguaje con duck-typing, la funcin
equivalente tomara un objeto de cualquier tipo e invocara los mtodos caminar y parpar. Si el objeto tratado
no tiene los mtodos pedidos, la funcin enviar una seal de error en tiempo de ejecucin. Este hecho de que la
funcin acepte cualquier tipo de objeto que implemente
correctamente los mtodos solicitados es lo que evoca la
cita precedente y da nombre a la forma de tipicacin.

As, el duck typing permite polimorsmo sin herencia. El


nico requerimiento de la funcin calcular para las variables es que soporten los mtodos "+" y "*".
La prueba del pato puede verse en el siguiente ejemplo
(en Python). Hasta donde a la funcin en_el_bosque le
importa, el objeto es un pato:

class Pato: def parpar(self): print Cuac!" def plumas(self): print El pato tiene plumas blancas y
grises. class Persona: def parpar(self): print La persona imita el sonido de un pato. def plumas(self):
print La persona toma una pluma del suelo y la
muestra. def en_el_bosque(pato): pato.parpar() pato.plumas() def juego(): donald = Pato() juan = Persona()
El Duck typing usualmente es acompaado por el hbito en_el_bosque(donald) en_el_bosque(juan) juego()
de no probar el tipo de los argumentos en los mtodos y
funciones, y en vez de eso conar en la buena documentacin, el cdigo claro y la prueba para asegurar el uso
correcto. Los usuarios de lenguajes con tipicado estti- 12.2 Duck typing en lenguajes de
co al iniciarse con lenguajes de tipicado dinmico a metipicacin esttica
nudo se ven tentados a agregar chequeos de tipo estticos
(previos a ejecucin), desaprovechando la exibilidad y
benecios del duck typing y restringiendo el dinamismo Ciertos lenguajes que usualmente son de tipicacin esttica como Boo y la versin 4 de C# tienen anotaciones
del lenguaje.
extra de tipos[3][4] que instruyen al compilador para que
disponga el chequeo de tipo de las clases en tiempo de
ejecucin y no en tiempo de compilacin, y que incluya
12.1 Ejemplos del concepto
cdigo de chequeo de tipos en tiempo de ejecucin en la
salida compilada. Estos agregados permiten al lenguaje
Considera el siguiente pseudocdigo para un lenguaje con gozar de la mayor parte de los benecios del duck-typing
duck-typing:
con la nica desventaja de tener que identicar y especi25

26

CAPTULO 12. DUCK TYPING

car qu clases sern dinmicas en tiempo de compilacin.

12.3 Comparacin con otros tipos


de tipicacin
12.3.1

Sistemas de tipicacin estructural

El duck typing es similar pero diferente a la tipicacin


estructural. La tipicacin estructural es un sistema de
tipicacin esttica que determina la compatibilidad y la
equivalencia de tipos segn su estructura, mientras que el
duck typing es dinmico y determina dicha compatibilidad basndose en la parte de la estructura que se accede
en tiempo de ejecucin.
El lenguaje de programacin Objective Caml usa un sistema de tipicacin estructural.

12.3.2

Interfaces

una clase. Por ejemplo en Python podras fcilmente crear una clase llamada Vino, que espera
una clase que implemente el atributo prensa
como un ingrediente. Sin embargo una clase
llamada Imprenta podra tambin implementar
un mtodo llamado prensa(). Con duck typing,
para poder prevenir errores extraos y difciles
de detectar el desarrollador debe ser consciente de cada uso potencial del mtodo prensa,
aunque est conceptualmente desvinculado del
tema con que est trabajando.
Esencialmente, el problema es que si camina
como pato y se oye como pato, podra ser un
dragn haciendo el pato. No siempre querrs
dejar los dragones en el estanque, aunque sepan
hacerse pasar por patos.
Los defensores del duck typing como Guido van Rossum
argumentan que el asunto se maneja con pruebas, y con el
conocimiento del cdigo necesario para mantenerlo.[5][6]

Las crticas acerca del duck typing tienden a ser casos


Las interfaces pueden proveer algunos de los benecios
especiales de aspectos ms amplios relacionados con la
del duck typing pero este es diferente en cuanto no se
disputa entre la tipicacin esttica y la dinmica.
dene explcitamente una interfaz. Por ejemplo, si una librera Java de terceros implementa una clase que no es
posible modicar, no se podr usar una instancia de esa
clase en lugar de una interfaz denida por uno mismo, 12.5 Historia
mientras que el duck typing s permite hacerlo.
Alex Martelli hizo uso precoz (2000) del trmino en un
mensaje del grupo de noticias comp.lang.python. Tam12.3.3 Templates o tipos genricos
bin resalt la malinterpretacin de la prueba literal del
pato, lo que podra indicar que el trmino ya era usado.
Los Template, funciones o mtodos genricos aplican la
prueba del pato en un contexto de tipicacin esttica;
En otras palabras, no chequeen si ES un pato,
esto rene todas las ventajas y desventajas de la tipicachequeen si PARPA como pato, CAMINA como
cin esttica contra la tipicacin dinmica en general.
pato, etc, etc, dependiendo de exactamente qu
El duck typing puede tambin ser ms exible en que soparte de la conducta de un pato necesitan para
lo los mtodos llamados en tiempo de ejecucin necesitan
jugar su juego de lenguaje..
ser implementados, mientras que los templates requieren
que se implemente todos los mtodos que no deban resultar inaccesibles en tiempo de compilacin.
Puede mencionarse como ejemplos los lenguajes C++ y
D con templates, que derivaron de los genricos de Ada.

12.4 Crticas
Una crtica citada a menudo dice:
Un problema con el duck typing es que fuerza
al programador a tener un entendimiento mucho ms amplio del cdigo con que est trabajando en todo momento. En un lenguaje con tipicacin esttica y fuerte que use controles de
tipo en jerarquas y parmetros, es mucho ms
difcil pasarle un tipo inesperado de objeto a

12.6 Implementaciones
12.6.1 En C#

En C# 4.0 el compilador y la ejecucin colaboran para


implementar dynamic member lookup.
namespace DuckTyping { using System; public class Pato { public void Parpar() { Console.WriteLine(Quaaaaaack!"); } public void Plumas()
{ Console.WriteLine(El pato tiene plumas blancas y
grises.); } } public class Persona { public void Parpar()
{ Console.WriteLine(La persona imita a un pato.); }
public void Plumas() { Console.WriteLine(La persona
toma una pluma del piso y la muestra.); } } internal
class Program { private static void EnElBosque(dynamic
pato) { pato.Parpar(); pato.Plumas(); } private static void

12.6. IMPLEMENTACIONES

27

Juego() { dynamic donald = new Pato(); dynamic juan = #x300041C2371F> > when called with arguments:
new Persona(); EnElBosque(donald); EnElBosque(juan); > (#<CAT #x300041C7EEFD>) > If continued: Try
} private static void Main() { Juego(); } } }
calling it again 1 > (defmethod quack ((a-cat cat)) (print
The cat imitates a duck.)) #<STANDARD-METHOD
QUACK (CAT)> 1 > (continue) The cat imitates a
duck.

12.6.2

En ColdFusion

El lenguaje de scripting para desarrollo de aplicaciones


web ColdFusion permite que los argumentos de las funciones sean de tipo any (cualquiera). Para este tipo de
argumento, puede pasarse un tipo arbitrario de objeto
y las llamadas a mtodos son entabladas en tiempo de
ejecucin. Si un objeto no implementa un mtodo solicitado, se arroja una excepcin en tiempo de ejecucin
que puede ser capturada y manejada adecuadamente. En
ColdFusion 8, esta circunstancia se puede capturar con el
evento onMissingMethod() en vez de con un manejador
de excepciones. Un tipo alternativo de argumento WEBINF.cftags.component restringe el tipo de objeto solo a
componentes ColdFusion (CFC) lo cual permite un mejor manejo de mensajes de error cuando se pasan elementos que no sean objetos.

De este modo se puede desarrollar el software extendiendo cdigo duck-typed que funciona parcialmente.

12.6.4 En Objective-C
Objective-C, un hbrido entre C y Smalltalk, permite declarar objetos de tipo 'id' y enviarles cualquier mensaje,
como en SmallTalk. Quien enva puede probar un objeto para ver si ha respondido al mensaje, el objeto puede
decidir al recibir el mensaje si responder al mensaje o
no, y si el remitente enva un mensaje al que el receptor
no puede responder, se arroja una excepcin. As, duck
typing es completamente soportado en Objective-C.

12.6.5 En Python
12.6.3

En Common Lisp

Common Lisp provee una extensin orientada a objetos (Common Lisp Object System, abreviado CLOS). La
combinacin de CLOS y la tipicacin dinmica de Lisp
hacen del duck typing un estilo de programacin habitual
en Common Lisp.
Con Common Lisp uno tampoco necesita averiguar los tipos, porque en la ejecucin se obtendr una seal de error
en caso de que una funcin no sea aplicable. El error puede manejarse con el Sistema de Condiciones de Common
Lisp. Los mtodos se denen fuera de las clases y tambin
pueden denirse para objetos especcos.
(defclass duck () ()) (defmethod quack ((a-duck duck))
(print Quaaaaaack!")) (defmethod feathers ((a-duck
duck)) (print The duck has white and gray feathers.))
(defclass person () ()) (defmethod quack ((a-person person)) (print The person imitates a duck.)) (defmethod
feathers ((a-person person)) (print The person takes
a feather from the ground and shows it.)) (defmethod
in-the-forest (duck) (quack duck) (feathers duck))
(defmethod game () (let ((donald (make-instance 'duck))
(john (make-instance 'person))) (in-the-forest donald)
(in-the-forest john))) (game)

El duck typing se usa intensivamente en Python. El


Glosario de Python dene el duck typing como sigue:
Estilo de programacin Python que determina el tipo de un objeto a travs de la inspeccin de sus mtodos o su conjunto de atributos
en lugar de emplear la relacin con algn tipo
de objeto (Si luce como un pato y suena como un pato, debe ser un pato) Enfatizando las
interfaces sobre los tipos especcos, el cdigo
bien diseado mejora su exibilidad al permitir sustitucin polimrca. El duck typing evita
las pruebas con type() o isinstance(). En lugar
de eso, preere el estilo de programacin Es
mas facil pedir perdn que pedir permiso.

El ejemplo estndar de duck typing en Python son las clases que se asimilan a archivos. Estas clases pueden implementar algunos o todos los mtodos de archivo y pueden
usarse donde normalmente se usara archivo. Por ejemplo, GzipFile implementa un objeto similar a un archivo para acceder a datos comprimidos con el algoritmo
gzip. cStringIO permite tratar una cadena como un archivo. Los sockets y los archivos tambin comparten muchos atributos. Sin embargo, los sockets no disponen del
mtodo tell() y no pueden usarse dondequiera que puede
El estilo usual de desarrollo en Common Lisp (usando un usarse GzipFile. Esto demuestra la exibilidad del duck
Lisp REPL como SLIME) permite tambin la reparacin typing: un objeto que se asemeja a un archivo implemeninteractiva:
ta solo los mtodos que puede, y consecuentemente solo
? (defclass cat () ()) #<STANDARD-CLASS CAT> puede usarse donde tiene sentido hacerlo.
? (quack (make-instance 'cat)) > Error: There is El principio de es ms fcil pedir perdn que pedir perno applicable method for the generic function: > miso describe el uso del manejo de excepciones. Por
#<STANDARD-GENERIC-FUNCTION
QUACK ejemplo en vez de ver si un objeto que supuestamente se

28
asemeja al objeto Pato usado en el ejemplo precedente
tiene o no el mtodo parpar() (usando if hasattr(azulon,
parpar): ... es preferible rodear el intento de parpar con
un manejo de excepciones:
try: azulon.parpar() except (AttributeError, TypeError):
print el azuln no puede parpar()"
Las ventajas de esta forma de trabajo son que favorece el
manejo estructurado de otras clases de errores (as, por
ejemplo, una subclase de Pato mudo podra arrojar una
excepcin de tipo CuacException que podra agregarse
al manejador sin ahondar mucho en la lgica del cdigo,
y manejar situaciones en que diferentes clases de objetos
pudieran tener colisiones de nombres por miembros incompatibles (si tuvisemos una persona de apellido Azulon con un atributo lgico parpa=True"; un intento de
ejecutar Azulon.parpar() arrojara un TypeError)).
Volviendo al campo de los ejemplos mas prcticos que
implementan conductas similares a las de un archivo, es
preferible generalmente emplear las herramientas de tratamiento de excepciones de Python para manejar la amplia variedad de errores de E/S que pueden ocurrir debido a numerosos problemas ambientales y de sistema
operativo que escapan al control del programador. Aqu
nuevamente las excepciones de duck typing pueden ser
atrapadas junto a las de SO, E/S u otros posibles errores
sin complicados chequeos ni lgicas de comprobacin de
errores.

12.7 Referencias
[1] Davis, Robin S. Whos Sitting on Your Nest Egg?. p. 7.
[2] Heim, Michael. Exploring Indiana Highways. p. 68.
[3] Boo: Duck Typing
[4] Anders Hejlsberg Introduces C# 4.0 at PDC 2008
[5] Bruce Eckel. Strong Typing vs. Strong Testing. mindview.
[6] Bill Venners. Contracts in Python. A Conversation with
Guido van Rossum, Part IV. Artima.

12.8 Enlaces externos


Duck Typing: Ruby
How to duck type? - the psychology of static typing
in Ruby
Python documentation glossary entry on ducktyping
Dr. Dobbs June 01 2005: Templates and Duck Typing

CAPTULO 12. DUCK TYPING


Javascript 'typeof' limitations and duck typing
Python from a Java perspective - Part 2 - How duck
typing inuences class design and design principles

Captulo 13

Tipado esttico
En ciencias de la computacin, un sistema de tipos dene cmo un lenguaje de programacin clasica los valores
y las expresiones en tipos, cmo se pueden manipular estos tipos y cmo interactan. Un tipo indica un conjunto
de valores que tienen el mismo signicado genrico o propsito (aunque algunos tipos, como los tipos de datos abstractos y tipos de datos funcin, tal vez no representen valores en el programa que se est ejecutando). Los sistemas
de tipicacin varan signicativamente entre lenguajes,
siendo quizs las ms importantes variaciones las que estn en sus implementaciones de la sintctica en tiempo de
compilacin y la operativa en tiempo de ejecucin.

gramas y programadores cmo deben ser tratados esos


bits.
Las principales funciones que los sistemas de tipicacin
ofrecen son:

Un compilador puede usar el tipo esttico de un valor para optimizar el almacenamiento que necesita y la eleccin
de los algoritmos para las operaciones sobre ese valor.
Por ejemplo, en muchos compiladores de C el tipo de dato otante se representa en 32 bits, de acuerdo con la
especicacin IEEE para los nmeros de coma otante
de simple precisin. Entonces, C usa operaciones especcas de coma otante sobre estos valores (suma de coma
otante, multiplicacin, etc.).
El rango del tipo de dato limita y la forma de su evaluacin afecta en el tipado del lenguaje. Adems, un
lenguaje de programacin puede asociar una operacin
concreta con diferentes algoritmos para cada tipo de dato
en el caso del polimorsmo. La teora de tipos de datos
es el estudio de los sistemas de tipicacin, aunque los
sistemas de tipos de datos concretos de los lenguajes de
programacin se originaron a partir de los problemas tcnicos de las arquitecturas del ordenador, implementacin
del compilador y diseo del lenguaje.

13.1 Bsicos
Asignar tipos de datos (tipicar) da signicado a colecciones de bits. Los tipos de datos normalmente tienen asociaciones tanto con valores en la memoria o con objetos
como con variables. Como cualquier valor simplemente consiste en un conjunto de bits de un ordenador, el
hardware no hace distincin entre direccin de memoria, cdigo de instruccin, caracteres, enteros y nmeros
en coma otante. Los tipos de datos informan a los pro29

Seguridad - El uso de tipos de datos puede permitir


a un compilador detectar incoherencias en el signicado o cdigo probablemente invlido. Por ejemplo, podemos identicar una expresin 3 / Hello,
World como invlida porque no se puede dividir
(de forma normal) un entero por una cadena de caracteres. Un sistema de tipado fuerte ofrece ms seguridad, pero no garantiza, necesariamente una seguridad completa (ver seguridad de la tipicacin
para ms informacin).
Optimizacin - Un sistema de tipado esttico puede
dar informacin muy til al compilador. Por ejemplo, si un tipo de dato dice que un valor debe alinearse en mltiplos de 4, el compilador puede usar
de forma ms eciente las instrucciones mquina.
Documentacin - En sistemas de tipicacin ms
expresivos, los tipos de datos pueden servir como
una forma de documentacin, porque pueden ilustrar la intencin del programador. Por ejemplo, los
tem de tiempos pueden ser un subtipo de un entero,
pero si un programador declara una funcin como
que devuelve tems de tiempo en lugar de un simple entero, esto documenta parte del signicado de
la funcin.
Abstraccin (o modularidad) - Los tipos de datos
permiten a los programadores pensar en los programas a un alto nivel, sin tener que preocuparse con
el bajo nivel de la implementacin. Por ejemplo, los
programadores pueden pensar en una cadena de caracteres como un valor en lugar de un simple array
de bytes. O los tipos de datos pueden permitir a los
programadores expresar la Interfaz entre dos subsistemas. Esto localiza las deniciones requeridas para
la interoperabilidad de los subsistemas y previene
de inconsistencias cuando estos subsistemas se comuniquen.

30

CAPTULO 13. TIPADO ESTTICO

Un programa normalmente asocia cada valor con un tipo


de dato determinado (aunque un tipo de dato puede tener ms de un subtipo). Otras entidades, como los objetos, bibliotecas, canales de comunicacin, dependencias
o, incluso, los propios tipos de datos, pueden ser asociados con un tipo de dato. Por ejemplo:
Tipo de dato - un tipo de dato de un valor
clase - un tipo de dato de un objeto
Un sistema de tipado, especicado en cada lenguaje de
programacin, estipula las formas en que los programas
pueden ser escritos y hace ilegal cualquier comportamiento fuera de estas reglas.

13.2 Chequeo de tipicacin


El proceso de vericar e imponer los lmites impuestos
por los tipos de datos comprobacin (chequeo) de tipicacin puede ocurrir tanto en lacompilacin (una comprobacin esttica) o en laejecucin (una comprobacin
dinmica). Si un lenguaje impone fuertemente las reglas
de tipicacin (es decir, generalmente permitiendo solo
las conversiones de tipo de dato automticas que no hagan perder informacin), uno se puede referir al proceso
como fuertemente tipado; si no, dbilmente tipado.

13.2.1

Tipado esttico

Se dice de un lenguaje de programacin que usa un tipado esttico cuando la comprobacin de tipicacin se
realiza durante la compilacin, y no durante la ejecucin.
Ejemplos de lenguajes que usan tipado esttico son C,
C++, Java y Haskell. Comparado con el tipado dinmico,
el esttico permite que los errores de programacin sean
detectados antes, y que la ejecucin del programa sea ms
eciente.

13.2.2

Tipado dinmico

Se dice de un lenguaje de programacin que usa un tipado dinmico cuando la comprobacin de tipicacin se
realiza durante su ejecucin en vez de durante la compilacin. Ejemplos de lenguajes que usan tipado dinmico
son Perl, Python y Lisp. Comparado con el tipado esttico, o sistema de enlazado temprano, el tipado dinmico
es ms exible (debido a las limitaciones tericas de la
decidibilidad de ciertos problemas de anlisis de programas estticos, que impiden el mismo nivel de exibilidad
que se consigue con el tipado esttico), a pesar de ejecutarse ms lentamente y ser ms propensos a contener
errores de programacin.

13.2.3 Tipado esttico y dinmico combinados


Algunos lenguajes estticamente tipados tienen una
puerta trasera en el lenguaje que permite a los programadores escribir cdigo que no es comprobado estticamente. Por ejemplo, los lenguajes como Java y los parecidos al C tienen una "conversin de tipos de datos forzada
(cast)"; estas operaciones pueden ser inseguras durante la
ejecucin, porque pueden causar comportamientos indeseados cuando el programa se ejecuta.
La presencia de un tipado esttico en un lenguaje de programacin no implica necesariamente la ausencia de mecanismos de tipado dinmico. Por ejemplo, Java usa tipado esttico, pero ciertas operaciones requieren el soporte
de test de tipos de datos durante la ejecucin, que es una
forma de tipado dinmico. Ver lenguaje de programacin
para una discusin ms amplia de la interaccin entre tipado esttico y dinmico.

13.2.4 Chequeo de tipicacin esttico y


dinmico en la prctica
La eleccin entre sistemas de tipicacin dinmico y esttico requiere algunas contraprestaciones.
El tipado esttico busca errores en los tipos de datos durante la compilacin. Esto debera incrementar la abilidad de los programas procesados. Sin embargo, los programadores, normalmente, estn en desacuerdo en cmo
los errores de tipos de datos ms comunes ocurren, y en
qu proporcin de estos errores que se han escrito podran
haberse cazado con un tipado esttico. El tipado esttico
aboga por la creencia de que los programas son ms ables cuando son chequeados sus tipos de datos, mientras
que el tipado dinmico apunta al cdigo distribuido que
se ha probado que es able y un conjunto pequeo de
errores. El valor del tipado esttico, entonces, se incrementa a la par que se endurece el sistema de tipicacin.
Los defensores de los lenguajes fuertemente tipados como ML y Haskell han sugerido que casi todos los errores
pueden ser considerados errores de los tipos de datos, si
los tipos de datos usados en un programa estn sucientemente bien declarados por el programador o inferidos
por el compilador.[1]
El tipado esttico resulta, normalmente, en un cdigo
compilado que se ejecuta ms rpidamente. Cuando el
compilador conoce los tipos de datos exactos que estn
en uso, puede producir cdigo mquina optimizado. Adems, los compiladores en los lenguajes de tipado esttico
pueden encontrar atajos ms fcilmente. Algunos lenguajes de tipicacin dinmica como el lisp permiten declaraciones de tipos de datos opcionales para la optimizacin
por esta misma razn. El tipado esttico generaliza este
uso. Ver optimizacin de software
En contraste, el tipado dinmico permite a los compila-

13.3. REFERENCIAS
dores e intrpretes ejecutarse ms rpidamente, debido
a que los cambios en el cdigo fuente en los lenguajes
dinmicamente tipados puede resultar en menores comprobaciones y menos cdigo que revisar. Esto tambin
reduce el ciclo editar-compilar-comprobar-depurar.
Lenguajes estticamente tipados que no dispongan de inferencia (como Java), requieren que el programador declare los tipos de datos que un mtodo o funcin puede
procesar. Esto puede hacer la veces de documentacin
adicional del programa, que el compilador no permitir
que el programador ignore o drift out of synchronization.
Sin embargo, un lenguaje puede ser de tipicacin esttica sin requerir la declaracin del tipo de dato (ejemplos
incluyen Scala y C#3.0), as que esto no es una consecuencia de tipicacin esttica.
El tipado dinmico permite construcciones que algunos
sistemas de tipado estatico rechazaran al considerarlas
ilegales. Por ejemplo, la funcin eval de Python, la cual
ejecuta datos arbitrarios como si fueran cdigo. Adems,
el tipado dinmico es ms adecuado para cdigo de transicin o para el prototipado. Desarrollos recientes en lenguajes como Haskell (por ejemplo, los tipos algebraicos
generalizados), permiten a lenguajes de tipado estatico,
ejecutar cdigo a partir de estructuras de datos de una
forma segura.
El tipado dinmico tpicamente hace que la
metaprogramacin sea ms poderosa y fcil de usar.
Por ejemplo, C++ templates son tpicamente ms
engorrosas de escribir que su equivalente en Ruby o
Python.[cita requerida] Caractersticas de tiempo de ejecucin tales como metaclases e introspeccin de tipos con
frecuencia son ms difciles de usar en lenguajes de
tipado esttico.

13.3 Referencias
[1] Dependent Types in Practical Programming - Xi, Pfenning (ResearchIndex)

31

Captulo 14

Tipado fuerte
Un lenguaje de programacin es fuertemente tipado si
no se permiten violaciones de los tipos de datos, es decir,
dado el valor de una variable de un tipo concreto, no se
puede usar como si fuera de otro tipo distinto a menos que
se haga una conversin. No hay una nica denicin de
este trmino. Un lenguaje que se dice que no est tipado
se reere a que no est fuertemente tipado.

pos (typecasting) y tambin debe estar soportado por el


compilador. Por ejemplo:
subrutina((oat)X)
Indica al compilador que no estamos cometiendo un error
y realmente deseamos convertir la variable X (entera)
en una variable de coma otante para invocar a subrutina.

Cada lenguaje de programacin puede ser ms o menos


tipado segn en que casos exige el typecasting. Por ejem14.1 Explicacin detallada
plo, la conversin automtica entre entero y coma otante
podra ser admitida, pero no al contrario. Si no es factible
Los lenguajes de programacin suelen contar con un sula conversin entre un tipo u otro, el compilador tambin
blenguaje de tipos para declarar variables. Este sublenemitir un error de compilacin.
guaje instruye al compilador respecto al tipo de valores
que puede adoptar cada variable. Por ejemplo:
int X;

14.2 Lenguajes no tipados

en el Lenguaje de programacin C signica la variable


X adopta valores numricos enteros.
Los lenguajes de programacin no tipados o dbilmente
tipados
no controlan los tipos de las variables que declaEstos tipos tambin se declaran para todos los argumentos
ran, de este modo, es posible usar variables de cualquier
de procedimientos o subrutinas. Por ejemplo:
tipo en un mismo escenario. Por ejemplo, una funcin
oat subrutina(oat Parametro) { return Parametro + 1.5;
puede recibir como parmetro un valor entero, cadena
}
de caracteres, otante...
Este procedimiento acepta un nmero en coma otante
No hay que confundir el trmino con los lenguajes de ti(nmero real) y le suma 1,5.
pos dinmicos, en los que los tipos de las variables se deEn los lenguajes fuertemente tipados, el compilador no ciden en tiempo de ejecucin, si bien es cierto que mupermite que se use una variable como parmetro de un chos lenguajes de programacin de tipos dinmicos (en
procedimiento si sus tipos no coinciden exactamente. los que no se declaran los tipos de datos) son tambin no
En el ejemplo anterior, no sera posible invocar la subru- tipados.
tina con la variable X si esta fuese de un tipo incomNo son necesarias las conversiones de tipos, por lo tanto
patible con oat. Es decir, si X fuese de tipo entero, el
el siguiente ejemplo es correcto
compilador produce una conversin de int a oat, y permite la llamada typecasting. En cambio si fuese de otro a = 2 //a es un entero cad = prueba de texto //cad es
tipo, como puntero a char(char *), para el que no existe una cadena de caracteres resultado = cad + a //resultado
una conversin implcita a oat, el compilador detectar es una cadena de caracteres (las conversiones dependen
del lenguaje)
el conicto y producir un error.

14.1.1

Conversin de tipos (typecasting)

Cuando un lenguaje es fuertemente tipado, el programador debe explcitamente convertir un tipo de datos en
otro. Esto se conoce como conversin o moldeado de ti-

14.3 Ejemplos de lenguajes fuertemente tipados

32

Haskell

14.4. EJEMPLOS DE LENGUAJES NO TIPADOS


ML
Ada
Modula-2
Pascal
Java
Objective-C
Go

14.4 Ejemplos de lenguajes no tipados


Smalltalk
Lisp
Perl
PHP
Prolog
Basic
Python

33

Captulo 15

Nuevos Fundamentos
Nuevos Fundamentos, mejor conocida como NF, es una
teora de conjuntos formal propuesta por primera vez por
Willard Van Orman Quine como un intento de simplicar la teora de tipos desarrollada por Bertrand Russell y
Whitehead en los Principia Mathematica. Se caracteriza
por ser incompatible con el axioma de eleccin, por la elegancia de su formulacin y por la existencia del conjunto
universal. El problema de la consistencia relativa de NF
es an abierto.

15.1 Axiomas
1. Axioma de comprehsin estraticada: Sea una frmula estraticada, entonces el conjunto {x: } existe.
2. Axioma de extensionalidad: Sean A y B dos conjuntos
cualesquiera, si A B y B A, entonces, A = B.

34

Captulo 16

Principio de sustitucin de Liskov


Principio de sustitucin de Liskov es un principio de la
programacin orientada a objetos. y puede denirse como: Cada clase que hereda de otra puede usarse como
su padre sin necesidad de conocer las diferencias entre
ellas. En lenguaje mas formal: si S es un subtipo de T,
entonces los objetos de tipo T en un programa de computadora pueden ser sustituidos por objetos de tipo S (es
decir, los objetos de tipo S pueden sustituir objetos de
tipo T), sin alterar ninguna de las propiedades deseables
de ese programa (la correccin, la tarea que realiza, etc.)
Ms formalmente, El Principio de Sustitucin de Liskov (LSP) es una denicin particular de una relacin de
subtipicacin, llamada tipicacin (fuerte) del comportamiento, que fue introducido inicialmente por Barbara
Liskov en una conferencia magistral en 1987 titulada La
Abstraccin de Datos y Jerarqua.[1] Se reere ms a una
relacin semntica que a una relacin sintctica, ya que
slo tiene la intencin de garantizar la interoperabilidad
semntica de tipos en una jerarqua, los tipos de objeto en
particular. Liskov y Jeannette Wing formularon el principio de manera conjunta en un artculo en el ao 1994
de la siguiente manera:

16.2 Bibliografa

Sea q (x) una propiedad comprobable acerca de los objetos


x de tipo T. Entonces q (y) debe ser verdad para los objetos
y del tipo S donde S, es un subtipo de T.
En el mismo artculo, Liskov y Wing detallan que su concepto de comportamiento de subtipos es una extensin de
la lgica de Hoare, que tiene una cierta semejanza con el
diseo por contrato de Bertrand Meyer, ya que considera
la interaccin de subtipos con pre y postcondiciones.

Gary T. Leavens and Krishna K. Dhara, Concepts of Behavioral Subtyping and a Sketch of
Their Extension to Component-Bases Systems in Gary
T. Leavens, Murali Sitaraman, (ed.) Foundations
of component-based systems, Cambridge University
Press, 2000 ISBN 0-521-77164-1. This paper surveys various notions of behavioral subtyping, including Liskov and Wings.
Barbara Liskov, Jeannette Wing, A behavioral notion of subtyping, ACM Transactions on Programming Languages and Systems (TOPLAS), Volume
16, Issue 6 (November 1994), pp. 1811 1841.
An updated version appeared as CMU technical report: Liskov, Barbara; Wing, Jeannette (July 1999).
Behavioral Subtyping Using Invariants and Constraints (PS). Consultado el 05-10-2006. The formalization of the principle by its authors.
Reinhold Plsch, Contracts, scenarios and prototypes: an integrated approach to high quality software, Springer, 2004, ISBN 3-540-43486-0. Contains
a gentler introduction to behavioral subtyping in its
various forms in chapter 2.
Robert C. Martin, The Liskov Substitution Principle, C++ Report, March 1996. An article popular
in the object-oriented programming community that
gives several examples of LSP violations.
Kazimir Majorinc, Ellipse-Circle Dilemma and Inverse Inheritance, ITI 98, Proceedings of the 20th
International Conference of Information Technology Interfaces, Pula, 1998, ISSN 1330-1012. This
paper discusses LSP in the mentioned context.

16.1 Referencias
[1] 'A behavioral notion of subtyping, ACM Transactions on
Programming Languages and Systems (TOPLAS), Volume
16, Issue 6 (November 1994), pp. 1811 - 1841. An updated version appeared as CMU technical report: Liskov,
Barbara; Wing, Jeannette (July 1999). Behavioral Subtyping Using Invariants and Constraints (PS). Consultado el
05-10-2006. The formalization of the principle by its authors.

35

Ashley McNeile, A framework for the semantics


of behavioral contracts. Proceedings of the Second
International Workshop on Behaviour Modelling:
Foundation and Applications (BM-FA '10). ACM,
New York, NY, USA, 2010. This paper discusses
generalized notions of Contract and Substitutability.

36

CAPTULO 16. PRINCIPIO DE SUSTITUCIN DE LISKOV

16.3 Enlaces externos


Liskov Substitution Principle (Design by Contract)
in OO Primer, Arnon Rotem-Gal-Oz, August 24,
2006
The Liskov Substitution Principle, T. S. Norvell,
2003

16.4. TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES

37

16.4 Text and image sources, contributors, and licenses


16.4.1

Text

Teora de tipos Fuente: http://es.wikipedia.org/wiki/Teor%C3%ADa%20de%20tipos?oldid=72533531 Colaboradores: BOTSuperzerocool, Davius, Technopat, Juan Mayordomo, Raulshc, Andreasmperu, Luckas-bot, Jorge c2010, Mrich, ZroBot, Grillitus,
KLBot2, Helmy oved y Annimos: 5
Sistema formal Fuente: http://es.wikipedia.org/wiki/Sistema%20formal?oldid=76667067 Colaboradores: Pilaf, Sanbec, Comae, Melocoton, Troodon, Taichi, Rembiapo pohyiete (bot), Maltusnet, Dibujon, Yrbot, YurikBot, MONIMINO 1, J.R.Menzinger, Fer31416, Aljullu,
CEM-bot, JMCC1, Dumydam, Davius, JulianMendez, P.o.l.o., Isha, Szvest, Judas Ali-Qu, Lnegro, Raystorm, Kikobot, Atila rey, AVBOT, Diegusjaimes, Arjuno3, Saloca, Vic Fede, Luis Felipe Schenone, Jkbw, Dreitmen, Jerowiki, KamikazeBot, Waeswaes, EmausBot,
ChuispastonBot, MerlIwBot, Acratta, Justincheng12345-bot, Legobot, Addbot y Annimos: 29
Teora informal de conjuntos Fuente: http://es.wikipedia.org/wiki/Teor%C3%ADa%20informal%20de%20conjuntos?oldid=71041423
Colaboradores: Andrs Cortina, Muro Bot, SieBot, Bigsus-bot, Alexbot, AVBOT, FariBOT, Barnacaga, Jkbw, EmausBot, ZroBot, Dagudoj, KLBot2, AvicBot, Acratta, RosenJax, YFdyh-bot, Ari1314 y Annimos: 4
Sistema de tipos Fuente: http://es.wikipedia.org/wiki/Sistema%20de%20tipos?oldid=76854583 Colaboradores: Larocka, Elwikipedista, BOTijo, GermanX, CEM-bot, Roberto Fiadone, JoaquinFerrero, JAnDbot, Muro Bot, Fbarg, Bigsus-bot, Juan Mayordomo, AVBOT,
DumZiBoT, Boto a Boto, Yeeliberto, Jorge c2010, HRoestBot, MerlIwBot, Addbot y Annimos: 14
Alonzo Church Fuente: http://es.wikipedia.org/wiki/Alonzo%20Church?oldid=73837848 Colaboradores: Zwobot, Comae, Ascnder,
Sms, Elwikipedista, RGLago, Emijrp, Rembiapo pohyiete (bot), Orgullobot, RobotQuistnix, Francosrodriguez, Elferdo, FlaBot, Gpvos,
YurikBot, KnightRider, FedericoMP, Juana de Arco, 333, Thijs!bot, JAnDbot, Estoymuybueno, TXiKiBoT, VolkovBot, Synthebot, Muro
Bot, SieBot, PipepBot, Farisori, VanBot, SilvonenBot, UA31, LucienBOT, Luckas-bot, Nallimbot, Jotterbot, WikitanvirBot, Pegaso2005,
KLBot2 y Annimos: 7
Clculo lambda Fuente: http://es.wikipedia.org/wiki/C%C3%A1lculo%20lambda?oldid=72813034 Colaboradores: PACO, Pilaf, Ascnder, Sms, Elwikipedista, LeonardoRob0t, Rembiapo pohyiete (bot), Marco Regueira, Orgullobot, RobotQuistnix, Yrbot, BOTijo, YurikBot, GermanX, KnightRider, Eskimbot, Morza, Rdaneel, CEM-bot, Alexav8, Mister, Lauranrg, Jileon, JAnDbot, Geburah, TXiKiBoT,
Jorgenumata, Edorka, Dusan, Navazuelo, Matdrodes, AlleborgoBot, Muro Bot, J.M.Domingo, Numbo3, Gerakibot, SieBot, Armando
ronquillo, PaintBot, Chamullo, Bigsus-bot, Gurgut, Tirithel, MetsBot, Botito777, Jmchuma, Jperelli, Alexbot, JetDriver, Raulshc, AipniLovrij, Intimalai, AVBOT, Diegusjaimes, DumZiBoT, MelancholieBot, Luckas-bot, Woden, Luis Felipe Schenone, Diogeneselcinico42,
Xqbot, WLoku, RedBot, Fbrusatti, Waeswaes, ZroBot, Mjbmrbot, Xerox 5B, Rezabot, Cayetanoguerra, Bibliolotranstornado, Acratta,
Harpagornis, Elvisor, Addbot y Annimos: 47
Clculo de Construcciones Fuente: http://es.wikipedia.org/wiki/C%C3%A1lculo%20de%20Construcciones?oldid=64548064 Colaboradores: Ascnder, Tano4595, Digigalos, Boticario, Francosrodriguez, LuchoX, Yrbot, Mpagano, GermanX, CEM-bot, Botones, Muro Bot,
PaintBot, Arapajoe, HUB, Addbot y Annimos: 2
Tipo abstracto Fuente: http://es.wikipedia.org/wiki/Tipo%20abstracto?oldid=77242509 Colaboradores: CEM-bot, Locovich, VolkovBot,
Igneus, BOTarate, Ermey, Mafores, PipepBot, PixelBot, Botelln, Alexbot, Juan Mayordomo, Prision3ro, SpBot, Jkbw, Rubinbot, PatruBOT, MerlIwBot, Rebelplankton, Addbot y Annimos: 6
Conversin de tipos Fuente: http://es.wikipedia.org/wiki/Conversi%C3%B3n%20de%20tipos?oldid=65065796 Colaboradores: Chobot,
BOT-Superzerocool, Bernard, Biasoli, Poco a poco, Juan Mayordomo, Waeswaes, KLBot2, ChristianCisneros y Annimos: 2
Tipado dbil Fuente: http://es.wikipedia.org/wiki/Tipado_fuerte?oldid=74589246 Colaboradores: ManuelGR, Riviera, Suruena, Emijrp,
Rembiapo pohyiete (bot), Dem, RobotQuistnix, Afpineda, Yrbot, BOT-Superzerocool, Eskimbot, BOTpolicia, CEM-bot, Mahadeva, JoaquinFerrero, Rei-bot, Dusan, SieBot, PipepBot, Juan Mayordomo, MastiBot, HerculeBot, Dangelin5, Xqbot, Abece, EmausBot, Adadon,
KLBot2, Francarry y Annimos: 28
Tipado dinmico Fuente: http://es.wikipedia.org/wiki/Tipado%20din%C3%A1mico?oldid=72987626 Colaboradores: Riviera, Dem,
Elatomo, Juan Mayordomo, DiegoFb, Hprmedina, MerlIwBot y Annimos: 2
Duck typing Fuente: http://es.wikipedia.org/wiki/Duck%20typing?oldid=75663912 Colaboradores: Larocka, GermanX, CEM-bot,
Bryant1410, Muro Bot, Juan Mayordomo, LucienBOT, Ortisa, AstaBOTh15, RedBot, EmausBot, MerlIwBot, Pablombg, Invadibot, GiovanniES, Addbot, AVIADOR-bot y Annimos: 7
Tipado esttico Fuente: http://es.wikipedia.org/wiki/Sistema_de_tipos?oldid=76854583 Colaboradores: Larocka, Elwikipedista, BOTijo,
GermanX, CEM-bot, Roberto Fiadone, JoaquinFerrero, JAnDbot, Muro Bot, Fbarg, Bigsus-bot, Juan Mayordomo, AVBOT, DumZiBoT,
Boto a Boto, Yeeliberto, Jorge c2010, HRoestBot, MerlIwBot, Addbot y Annimos: 14
Tipado fuerte Fuente: http://es.wikipedia.org/wiki/Tipado%20fuerte?oldid=74589246 Colaboradores: ManuelGR, Riviera, Suruena,
Emijrp, Rembiapo pohyiete (bot), Dem, RobotQuistnix, Afpineda, Yrbot, BOT-Superzerocool, Eskimbot, BOTpolicia, CEM-bot, Mahadeva, JoaquinFerrero, Rei-bot, Dusan, SieBot, PipepBot, Juan Mayordomo, MastiBot, HerculeBot, Dangelin5, Xqbot, Abece, EmausBot,
Adadon, KLBot2, Francarry y Annimos: 28
Nuevos Fundamentos Fuente: http://es.wikipedia.org/wiki/Nuevos%20Fundamentos?oldid=65243057 Colaboradores: FAR, Augustofretes, EmausBot, MerlIwBot y KLBot2
Principio de sustitucin de Liskov Fuente: http://es.wikipedia.org/wiki/Principio%20de%20sustituci%C3%B3n%20de%20Liskov?
oldid=74484145 Colaboradores: Sabbut, Vanbasten 23, Elwikipedista, LucienBOT, AstaBOTh15, TiriBOT, Joaquin medina, Ripchip Bot,
Waeswaes, EmausBot, Penavarro09, KLBot2, Invadibot y Annimos: 4

16.4.2

Images

Archivo:Commons-emblem-merge.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/8/8b/Commons-emblem-merge.svg


Licencia: CC-BY-SA-3.0 Colaboradores:
File:Gnome-emblem-important.svg Artista original: GNOME icon artists, Fitoschido

38

CAPTULO 16. PRINCIPIO DE SUSTITUCIN DE LISKOV

Archivo:Commons-emblem-question_book_orange.svg
Fuente:
http://upload.wikimedia.org/wikipedia/commons/1/1f/
Commons-emblem-question_book_orange.svg Licencia: CC-BY-SA-3.0 Colaboradores: <a href='//commons.wikimedia.org/
wiki/File:Commons-emblem-issue.svg'
class='image'><img
alt='Commons-emblem-issue.svg'
src='//upload.wikimedia.org/
wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/25px-Commons-emblem-issue.svg.png'
width='25'
height='25'
srcset='//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/38px-Commons-emblem-issue.svg.png
1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/50px-Commons-emblem-issue.svg.png 2x'
data-le-width='48' data-le-height='48' /></a> + <a href='//commons.wikimedia.org/wiki/File:Question_book.svg' class='image'><img
alt='Question book.svg' src='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/25px-Question_book.svg.png'
width='25' height='20' srcset='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/38px-Question_book.svg.
png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/50px-Question_book.svg.png 2x' data-lewidth='252' data-le-height='199' /></a> Artista original: GNOME icon artists, Jorge 2701
Archivo:Translation_arrow.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/2/2a/Translation_arrow.svg Licencia: CCBY-SA-3.0 Colaboradores: Este imagen vectorial fue creado con Inkscape. Artista original: Jesse Burgheimer
Archivo:Wiktionary-logo-es.png Fuente: http://upload.wikimedia.org/wikipedia/commons/0/06/Wiktionary-logo-es.png Licencia: CCBY-SA-3.0 Colaboradores: originally uploaded there by author, self-made by author Artista original: es:Usuario:Pybalo

16.4.3

Content license

Creative Commons Attribution-Share Alike 3.0