En un nivel práctico, los contratos son afirmaciones. Le permiten verificar las propiedades (sin cuantificador) de las ejecuciones individuales de un programa. La idea clave en el corazón de la verificación de contratos es la idea de la culpa, básicamente, usted quiere saber quién tiene la culpa de una violación del contrato. Esto puede ser una implementación (que no calcula el valor prometido) o la persona que llama (que pasó una función del tipo de valor incorrecto).
La idea clave es que puede rastrear la culpa utilizando la misma maquinaria que los pares de incrustación-proyección en la construcción del límite inverso de la teoría de dominios. Básicamente, cambia de trabajar con aserciones a trabajar con pares de aserciones, una de las cuales culpa al contexto del programa y la otra culpa al programa. Luego, esto le permite ajustar funciones de orden superior con contratos, porque puede modelar la contravarianza del espacio de funciones intercambiando el par de aserciones. (Ver el artículo de Nick Benton "Deshacer escritura dinámica" , por ejemplo).
Los tipos dependientes son tipos. Los tipos especifican reglas para afirmar si ciertos programas son aceptables o no. Como resultado, no incluyen cosas como la noción de culpa, ya que su función es evitar que existan programas de mal comportamiento en primer lugar. No hay nada que culpar ya que solo los programas bien formados son incluso expresiones gramaticales. Pragmáticamente, esto significa que es muy fácil usar tipos dependientes para hablar de propiedades de términos con cuantificadores (por ejemplo, que una función funciona para todas las entradas).
Estas dos vistas no son lo mismo, pero están relacionadas. Básicamente, el punto es que con los contratos, comenzamos con un dominio universal de valores y usamos contratos para reducir las cosas. Pero cuando usamos tipos, intentamos especificar dominios de valores más pequeños (con una propiedad deseada) por adelantado. Entonces podemos conectar los dos a través de familias de relaciones dirigidas por tipo (es decir, relaciones lógicas). Por ejemplo, vea "La culpa de todos" de Ahmed, Findler, Siek y Wadler , o "El significado de los tipos de Reynolds : de la semántica intrínseca a la semántica extrínseca" .