私は自分のプロジェクトの実験を行っています。基本的には、コードにいくつかの s 式を埋め込んで実行する必要があります。次のように、
(define (test lst)
(define num 1)
(define l (list))
`@lst) ; oh, this is not the right way to go.
(define lst
`( (define num2 (add1 num))
(displayln num2)))
関数をラケットコードのtest
ようにしたい:test(lst)
(define (test lst)
(define num 1)
(define l (list))
(define num2 (add1 num)
(displayln num2))
ラケットでこれを行うにはどうすればよいですか?
更新または前の質問
を使用したい理由eval
は、Z3 ラケット バインディングを使用しているためです。(ラケット バインディング API を使用する) 数式を生成する必要があり、その後、ある時点でクエリを起動します。それらのコードを評価します。私の場合、他の方法を考え出していません...非常に単純な例の1つは、想像してみてください
(let ([arr (array-alloc 10)])
(array-set! arr 3 4))
コンストラクトを分析するためのモデルがいくつかあります (そのため、racketZ3 を直接使用していません)。各分析ポイントで、プログラム内のデータ型を Z3 型にマップし、いくつかのアサーションを作成します。
次のようなものを生成します。
割り当てサイトでは、次の式を作成する必要があります。
(smt:declare-fun arr_z3 () IntList)
(define len (make-length 10))
次に、配列セットのサイトで、次のアサーションを行い、3 が長さよりも小さいかどうかを確認します
(smt:assert (</s 3 (len arr_z3)))
(smt:check-sat)
最後に、上記のように生成された式を収集し、Z3 バインディングを起動して次の収集された情報をコードとして実行できる形式でそれらをラップします。
(smt:with-context
(smt:new-context)
(define len (make-length 10))
(smt:assert (</s 3 (len arr_z3))) (smt:check-sat))
これは私が考えることができる非常に単純な例です...理にかなっていますか?
サイドノート。バージョン 5.3.1 で Z3 Racket バインディングが何らかの理由でクラッシュしますが、バージョン 5.2.1 ではほとんど動作します。