架空の将来の言語では、実装の代わりにベリファイアを記述できるようになると思います。次に、コンパイラーはそのベリファイアを分析し、仕様に一致する実装を作成します(しようとします)。(明らかに、コンパイラーは停止ソルバーではないため、失敗するか、ブルートフォースにフォールバックする必要があります。)
本質的に、ブルートフォースの答えと比較してばかげた最適化を備えた論理言語。
検証コードは実装コードよりも長くなる可能性がありますが、はるかに優れたドキュメントとして機能し、仕様の外観に近くなります。より多くのコード入力時間を、より少ないドキュメント/仕様/コード非同期と交換します。
例えば:
int32 Remainder(int32 numerator, int32 denominator) {
requires denominator != 0
ensures Math.Abs(result) < Math.Abs(denominator)
ensures exists n suchthat n*denominator + result == numerator
}
int32 EuclideanRemainder(int32 numerator, int32 denominator) {
requires denominator != 0
ensures result >= 0
ensures result < Math.Abs(denominator)
ensures exists n suchthat n*denominator + result == numerator
}
結果:
//warning: suggested precondition: denominator != int32.MinValue due to Math.Abs
int32 Remainder(int32 numerator, int32 denominator) {
return numerator % denominator;
}
int32 EuclideanRemainder(int32 numerator, int32 denominator) {
return ((numerator % denominator) + denominator) % denominator;
}