JavaScriptで、ログ関数を作成します。
function log(string) {
console.log(string)
}
これは明らかに副作用を引き起こします。画面に出力します。そして、私はその実装を制御できません。基本的に、私はそれが機能すると信じています。
しかし、このようなものを正式な検証システムに組み込むにはどうしたらいいのでしょうか。多分私はそれをある種の Monad にしますが、モナドの仕組みを理解するのに苦労しています。次のように、ある状態から別の状態に移行する抽象グローバルstate
について何か言いたいようです
log(string) = state -> state'
しかし、私はそこから何ができるのか、またはこれが私に何を与えるのか本当にわかりません。この関数がどのようにverified
かについてお話ししたいと思いますが、それがある程度のテストである場合、または必要としない仕様を記述できる場合、それが何を行うかわかりません完全な実装を理解する。
この状況で何ができるか、このlog
関数をどのように取得して、純粋な検証システムに統合できるかを教えてください。
正式な検証には目標が必要です。正確に何を証明したいですか?
たとえば、console.log()
などの組み込み関数を指定されたものとして扱い、関数が終了するaxiomを宣言するよりも、プログラムが終了することを証明したいだけの場合。次に、その公理を使用して、console.log()
を呼び出すユーザー定義関数も終了するかどうかを証明できます。
複数の出力が特定のorderで記述されているなど、より複雑なプロパティを証明したい場合は、IOモナドのようなものを使用すると便利です。モナドプロパティ自体are 役に立たないここで、JavaScriptにはそのような組み込みの概念がないため、ここでは代わりに、すべての関数を「世界の状態」トークンを暗黙的なパラメータとして取るようにモデル化すると便利です。各トークンを1回だけ使用できます。I/ O関数はトークンを消費して新しいトークンを生成します。次に、データフロー分析、SSA、またはC++やRustの所有権システムなどを使用して、これらのトークンを追跡し、結果として操作の順序を追跡できます。
他の多くの種類の形式検証では、たとえば、関数returnsが正しい結果であるかどうかの質問に対処する場合、値を返さないため、単にconsole.log()
を無視できます。
したがって、最初に目的を決定し、次に適切な形式検証フレームワークを見つけ、次に(必要な場合)形式的セマンティクス内でこの関数をモデル化する方法を見つけます。