1 #include "smtinterpreter.h"
3 #include "signatureenc.h"
11 #include "inc_solver.h"
13 #include "cppvector.h"
18 SMTInterpreter::SMTInterpreter(CSolver *_solver) :
21 output.open(SMTFILENAME);
22 if (!output.is_open()) {
23 model_print("AlloyEnc:Error in opening the dump file satune.smt\n");
28 SMTInterpreter::~SMTInterpreter() {
29 if (output.is_open()) {
35 ValuedSignature *SMTInterpreter::getBooleanSignature(uint id) {
36 return new SMTBoolSig(id);
39 ValuedSignature *SMTInterpreter::getElementSignature(uint id, Signature *ssig) {
40 return new SMTElementSig(id, (SMTSetSig *)ssig);
43 Signature *SMTInterpreter::getSetSignature(uint id, Set *set) {
44 return new SMTSetSig(id, set);
47 void SMTInterpreter::dumpAllConstraints(Vector<char *> &facts) {
48 for (uint i = 0; i < facts.getSize(); i++) {
49 char *cstr = facts.get(i);
50 writeToFile("(assert " + string(cstr) + ")");
54 void SMTInterpreter::extractValue(char *idline, char *valueline) {
56 if (1 == sscanf(idline,"%*[^0123456789]%u", &id)) {
58 ASSERT(1 == sscanf(valueline,"%s)", valuestr));
60 if (strcmp (valuestr, "true)") == 0 ) {
62 } else if (strcmp(valuestr, "false)") == 0) {
65 ASSERT(1 == sscanf(valueline, "%*[^0123456789]%u", &value));
68 model_print("Signature%u = %u\n", id, value);
69 sigEnc.setValue(id, value);
75 int SMTInterpreter::getResult() {
76 ifstream input(SMTSOLUTIONFILE, ios::in);
78 while (getline(input, line)) {
79 if (line.find("unsat") != line.npos) {
82 if (line.find("(define-fun") != line.npos || line.find("( (") != line.npos) {
84 ASSERT(getline(input, valueline));
85 char cline [line.size() + 1];
86 strcpy ( cline, line.c_str() );
87 char vline [valueline.size() + 1];
88 strcpy ( vline, valueline.c_str() );
89 extractValue(cline, vline);
95 void SMTInterpreter::dumpFooter() {
96 output << "(check-sat)" << endl;
97 output << "(get-model)" << endl;
100 void SMTInterpreter::dumpHeader() {
103 void SMTInterpreter::compileRunCommand(char *command, size_t size) {
104 model_print("Calling Z3...\n");
105 snprintf(command, size, "./run.sh z3 -T:%u -in < %s > %s", getTimeout(), SMTFILENAME, SMTSOLUTIONFILE);
108 string SMTInterpreter::negateConstraint(string constr) {
109 return "( not " + constr + " )";
112 string SMTInterpreter::encodeBooleanLogic( BooleanLogic *bl) {
113 uint size = bl->inputs.getSize();
115 for (uint i = 0; i < size; i++)
116 array[i] = encodeConstraint(bl->inputs.get(i));
140 string res = array[0];
141 for ( uint i = 1; i < size; i++) {
142 res = "( " + op + " " + res + " " + array[i] + " )";
147 return "( not " + array[0] + " )";
150 return "( " + op + " " + array[0] + " " + array[1] + " )";
158 string SMTInterpreter::encodeBooleanVar( BooleanVar *bv) {
159 ValuedSignature *boolSig = sigEnc.getBooleanSignature(bv);
160 return *boolSig + "";
163 string SMTInterpreter::processElementFunction(ElementFunction *elemFunc, ValuedSignature *signature) {
164 FunctionOperator *function = (FunctionOperator *) elemFunc->getFunction();
165 uint numDomains = elemFunc->inputs.getSize();
166 ASSERT(numDomains > 1);
167 ValuedSignature *inputs[numDomains];
169 for (uint i = 0; i < numDomains; i++) {
170 Element *elem = elemFunc->inputs.get(i);
171 inputs[i] = sigEnc.getElementSignature(elem);
172 if (elem->type == ELEMFUNCRETURN) {
173 result += processElementFunction((ElementFunction *) elem, inputs[i]);
177 switch (function->op) {
187 result += "( = " + *signature;
188 string tmp = "" + *inputs[0];
189 for (uint i = 1; i < numDomains; i++) {
190 tmp = "( " + op + " " + tmp + " " + *inputs[i] + " )";
192 result += tmp + " )";
196 string SMTInterpreter::operatorPredicateConstraint(CompOp op, ValuedSignature *elemSig1, ValuedSignature *elemSig2) {
199 return "( = " + *elemSig1 + " " + *elemSig2 + " )";
201 return "( < " + *elemSig1 + " " + *elemSig2 + " )";
203 return "(> " + *elemSig1 + " " + *elemSig2 + " )";