1

次の制約があるとします

(declare-fun x () Bool)
(declare-fun y () Bool)
(declare-fun t1 () (_ BitVec 8))
(declare-fun t2 () (_ BitVec 8))
(assert (or x y))
(assert (=> x (bvule t1 t2)))
(assert (=> y (bvule t2 t1)))
(check-sat)

stp の c/c++ インターフェイスで対応するコードを記述する方法は? 私のアプリケーションでは、これに似た制約セットを解決する必要があります。どんな助けでも大歓迎です。

4

1 に答える 1

2

C API テストケースを参照してください。STP の C インターフェイスの使用方法については、小さくて読みやすい例がいくつかあります。これが push-pop.c です。

/* g++ -I$(HOME)/stp/c_interface push-pop.c -L$(HOME)/lib -lstp -o cc*/

#include <stdio.h>
#include "c_interface.h"

int main() {
  VC vc = vc_createValidityChecker();
  vc_setFlags('n');
  vc_setFlags('d');
  vc_setFlags('p');
  //vc_setFlags('v');
  //vc_setFlags('s');

  Type bv8 = vc_bvType(vc, 8);

  Expr a = vc_varExpr(vc, "a", bv8);
  Expr ct_0 = vc_bvConstExprFromInt(vc, 8, 0);

  Expr a_eq_0 = vc_eqExpr(vc, a, ct_0);

  int query = vc_query(vc, a_eq_0);
  printf("query = %d\n", query);

  vc_push(vc);
  query = vc_query(vc, a_eq_0);
  vc_pop(vc);

  printf("query = %d\n", query);
}

これは smt クエリに対応します。

(declare-fun a () (_ BitVec 8))
(push)
(assert (not (= a (_ bv0 8))))
(check-sat)
(pop)

これらのいくつかの機能を取得したら、さまざまな演算子を構築する方法についてc インターフェイス ヘッダーを調べることができます。

于 2014-06-04T15:04:16.220 に答える