自動ソフトウェア検証の要件を調べています。つまり、コード(CやJavaなどの言語で記述された通常の手続き型コード)を取り込むプログラムは、各ループを最終的に停止する必要があり、アサーションに違反しないという一連の定理を生成します。 、nullポインターなどの逆参照は決してありません。次に、それが実際に真であることを証明するために定理証明者に渡します(または、コードのバグを示す反例を見つけます)。
問題は、どのようなロジックを使用するかです。2つの主要な位置は次のようです。
一階述語論理は問題ありません。
一階述語論理は十分に表現力がありません。高階述語論理が必要です。
問題は、両方のポジションに多くのサポートがあるようだということです。では、どちらが正しいのでしょうか。それが2番目の場合、一階述語論理に基づくベリファイアで問題が発生する、実行したいことの利用可能な例はありますか?