smtio: Emit `mode: start` options before `set-logic` command and any other options...
authorAlberto Gonzalez <boqwxp@airmail.cc>
Mon, 20 Jul 2020 22:09:44 +0000 (22:09 +0000)
committerAlberto Gonzalez <boqwxp@airmail.cc>
Mon, 20 Jul 2020 22:09:44 +0000 (22:09 +0000)
Refer to the SMT-LIB specification, section 4.1.7.  According to the spec, some options can only be specified in `start` mode.  Once the solver sees `set-logic`, it moves to `assert` mode.

backends/smt2/smtio.py

index 6191eabf6b8f73852677f018d7de7daf34184ce0..516091011d7948541e5643b0224e13a3e48c8576 100644 (file)
@@ -262,13 +262,20 @@ class SmtIo:
         if self.produce_models:
             self.write("(set-option :produce-models true)")
 
+        #See the SMT-LIB Standard, Section 4.1.7
+        modestart_options = [":global-declarations", ":interactive-mode", ":produce-assertions", ":produce-assignments", ":produce-models", ":produce-proofs", ":produce-unsat-assumptions", ":produce-unsat-cores", ":random-seed"]
+        for key, val in self.smt2_options.items():
+            if key in modestart_options:
+                self.write("(set-option {} {})".format(key, val))
+
         self.write("(set-logic %s)" % self.logic)
 
         if self.forall and self.solver == "yices":
             self.write("(set-option :yices-ef-max-iters 1000000000)")
 
         for key, val in self.smt2_options.items():
-            self.write("(set-option {} {})".format(key, val))
+            if key not in modestart_options:
+                self.write("(set-option {} {})".format(key, val))
 
     def timestamp(self):
         secs = int(time() - self.start_time)