実用レベルでは、契約はアサーションです。これらを使用すると、プログラムの個々の実行の(数量詞なしの)プロパティを確認できます。契約チェックの中心にある重要なアイデアは、非難のアイデアです。基本的に、契約違反の責任者を知りたいと思います。これは、実装(約束した値を計算しない)または呼び出し元(関数に誤った種類の値を渡した)のいずれかです。
重要な洞察は、領域理論の逆極限構築における埋め込みと投影のペアと同じ機構を使用して、責任を追跡できることです。基本的に、アサーションの操作からアサーションのペアの操作に切り替えます。アサーションの1つはプログラムコンテキストを非難し、もう1つはプログラムを非難します。次に、アサーションのペアを交換することにより、関数空間の反分散をモデル化できるため、これによりコントラクトで高次関数をラップできます。(たとえば、ニックベントンの論文「Undoing Dynamic Typing」を参照してください。)
依存型は型です。タイプは、特定のプログラムが受け入れられるかどうかをアサートするためのルールを指定します。その結果、それらの機能は不正なプログラムがそもそも存在するのを防ぐことであるため、非難の概念のようなものは含まれません。整形式のプログラムだけが文法的な発話でもあるため、非難することはありません。実用的には、これは、依存型を使用して、量指定子を使用して用語のプロパティを話すことが非常に簡単であることを意味します(たとえば、関数はすべての入力に対して機能します)。
これら2つのビューは同じではありませんが、関連しています。基本的に、ポイントは、契約では、普遍的な価値の領域から始め、契約を使用して物事を削減することです。ただし、型を使用する場合は、(必要なプロパティを持つ)値の小さなドメインを前もって指定しようとします。したがって、タイプ指向の関係ファミリ(つまり論理関係)を介して2つを接続できます。たとえば、Ahmed、Findler、Siek、Wadlerの最近の「Blame for All」、またはReynoldsの「The Meaning of Types:Intrinsic to Extrinsic Semantics」を参照してください。