Как решать ограничения с логическими и битвектором переменными в интерфейсе C / C ++ STP
Вопрос
Предположим, у меня есть следующие ограничения
(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)
.
Как написать соответствующий код в интерфейсе C / C ++ STP? Мое приложение требует для решения набора ограничения, аналогичных этому. Любая помощь ценится.
Решение
Смотрите C API TestCases .Существует несколько небольших, легко читают примеры для использования интерфейса C STP.Вот 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 Для того, как построить разные операторы.
Не связан с StackOverflow