(Dość abstrakcyjny) problem, jaki atakują zarówno typy, jak i kontrakty, brzmi „Jak zapewnić, aby programy miały określone właściwości?”. Istnieje nieodłączne napięcie między zdolnością wyrażania szerszej klasy właściwości a możliwością sprawdzania, czy program ma właściwość, czy nie. Systemy typów zazwyczaj zapewniają bardzo specyficzną właściwość (program nigdy nie ulega awarii w określony sposób) i mają algorytm sprawdzania typu. Z drugiej strony, kontrakty pozwalają na określenie bardzo szerokiego zakresu właściwości (powiedzmy, wynik tego programu jest liczbą pierwszą), ale nie zawierają algorytmu sprawdzającego.
Niemniej jednak fakt, że nie ma algorytmu sprawdzania kontraktów (który zawsze działa) nie oznacza, że nie ma algorytmów sprawdzania prawie kontraktów (które zwykle działają w praktyce). Polecam zajrzeć do Spec # i wtyczki Jessie Frama-C . Oba działają, wyrażając „ten program przestrzega tej umowy” jako oświadczenie w logice pierwszego rzędu poprzez wygenerowanie warunków weryfikacji , a następnie pytając SMTsolver, aby przejść, spróbuj znaleźć dowód. Jeśli solver nie znajdzie dowodu, to albo program jest zły, albo, cóż, solver nie znalazł dowodu, który istnieje. (Dlatego jest to algorytm „prawie” sprawdzania kontraktu.) Istnieją również narzędzia oparte na symbolicznym wykonywaniu, co oznacza z grubsza, że „ten program przestrzega tej umowy” jest wyrażony jako wiązka zdań (w pewnej logice). Zobacz na przykład jStar .
Praca Flanagana stara się czerpać to, co najlepsze z obu światów, abyś mógł szybko sprawdzić właściwości podobne do typu, a następnie zająć się resztą. Nie znam się na typach hybrydowych, ale pamiętam, jak autor powiedział, że jego motywacją było wymyślenie rozwiązania, które wymaga mniej adnotacji (niż poprzednia praca nad ESC / Java). W pewnym sensie istnieje jednak pewna luźna integracja między typami i umowami w ESC / Java (i Spec #): podczas sprawdzania umów solver otrzymuje informację, że sprawdzenie typu powiodło się, aby mógł zobaczyć te informacje.