summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorClark Barrett <clarkbarrett@google.com>2015-04-23 10:45:04 -0700
committerClark Barrett <clarkbarrett@google.com>2015-04-23 10:45:04 -0700
commit9f2ff7173d434162d49814ba3f24a9f9db21d476 (patch)
treef56f01b17d1233b2820fea26d259984c0b6d1c83 /src
parentd4afd65c3dcc26bab066507356ad187cbcb23d9e (diff)
parent0daf670d46ec2e781c2060b41449f2787b6e8f66 (diff)
Merge branch 'master' into google
Diffstat (limited to 'src')
-rw-r--r--src/parser/smt2/Smt2.g190
-rw-r--r--src/parser/smt2/smt2.cpp154
-rw-r--r--src/proof/proof_manager.cpp7
-rw-r--r--src/proof/proof_manager.h1
-rw-r--r--src/smt/options4
-rw-r--r--src/smt/smt_engine.cpp126
-rw-r--r--src/smt/smt_engine.h12
-rw-r--r--src/smt/smt_engine_check_proof.cpp7
-rw-r--r--src/theory/logic_info.cpp6
-rw-r--r--src/util/unsat_core.h7
10 files changed, 248 insertions, 266 deletions
diff --git a/src/parser/smt2/Smt2.g b/src/parser/smt2/Smt2.g
index 8dac9915e..acdecf0c4 100644
--- a/src/parser/smt2/Smt2.g
+++ b/src/parser/smt2/Smt2.g
@@ -2042,109 +2042,22 @@ builtinOp[CVC4::Kind& kind]
| MINUS_TOK { $kind = CVC4::kind::MINUS; }
| STAR_TOK { $kind = CVC4::kind::MULT; }
| DIV_TOK { $kind = CVC4::kind::DIVISION; }
- | INTS_DIV_TOK { $kind = CVC4::kind::INTS_DIVISION; }
- | INTS_MOD_TOK { $kind = CVC4::kind::INTS_MODULUS; }
- | ABS_TOK { $kind = CVC4::kind::ABS; }
- | IS_INT_TOK { $kind = CVC4::kind::IS_INTEGER; }
- | TO_INT_TOK { $kind = CVC4::kind::TO_INTEGER; }
- | TO_REAL_TOK { $kind = CVC4::kind::TO_REAL; }
-
- | SELECT_TOK { $kind = CVC4::kind::SELECT; }
- | STORE_TOK { $kind = CVC4::kind::STORE; }
-
- | CONCAT_TOK { $kind = CVC4::kind::BITVECTOR_CONCAT; }
- | BVNOT_TOK { $kind = CVC4::kind::BITVECTOR_NOT; }
- | BVAND_TOK { $kind = CVC4::kind::BITVECTOR_AND; }
- | BVOR_TOK { $kind = CVC4::kind::BITVECTOR_OR; }
- | BVNEG_TOK { $kind = CVC4::kind::BITVECTOR_NEG; }
- | BVADD_TOK { $kind = CVC4::kind::BITVECTOR_PLUS; }
- | BVMUL_TOK { $kind = CVC4::kind::BITVECTOR_MULT; }
- | BVUDIV_TOK { $kind = CVC4::kind::BITVECTOR_UDIV; }
- | BVUREM_TOK { $kind = CVC4::kind::BITVECTOR_UREM; }
- | BVSHL_TOK { $kind = CVC4::kind::BITVECTOR_SHL; }
- | BVLSHR_TOK { $kind = CVC4::kind::BITVECTOR_LSHR; }
- | BVULT_TOK { $kind = CVC4::kind::BITVECTOR_ULT; }
- | BVNAND_TOK { $kind = CVC4::kind::BITVECTOR_NAND; }
- | BVNOR_TOK { $kind = CVC4::kind::BITVECTOR_NOR; }
- | BVXOR_TOK { $kind = CVC4::kind::BITVECTOR_XOR; }
- | BVXNOR_TOK { $kind = CVC4::kind::BITVECTOR_XNOR; }
- | BVCOMP_TOK { $kind = CVC4::kind::BITVECTOR_COMP; }
- | BVSUB_TOK { $kind = CVC4::kind::BITVECTOR_SUB; }
- | BVSDIV_TOK { $kind = CVC4::kind::BITVECTOR_SDIV; }
- | BVSREM_TOK { $kind = CVC4::kind::BITVECTOR_SREM; }
- | BVSMOD_TOK { $kind = CVC4::kind::BITVECTOR_SMOD; }
- | BVASHR_TOK { $kind = CVC4::kind::BITVECTOR_ASHR; }
- | BVULE_TOK { $kind = CVC4::kind::BITVECTOR_ULE; }
- | BVUGT_TOK { $kind = CVC4::kind::BITVECTOR_UGT; }
- | BVUGE_TOK { $kind = CVC4::kind::BITVECTOR_UGE; }
- | BVSLT_TOK { $kind = CVC4::kind::BITVECTOR_SLT; }
- | BVSLE_TOK { $kind = CVC4::kind::BITVECTOR_SLE; }
- | BVSGT_TOK { $kind = CVC4::kind::BITVECTOR_SGT; }
- | BVSGE_TOK { $kind = CVC4::kind::BITVECTOR_SGE; }
| BV2NAT_TOK { $kind = CVC4::kind::BITVECTOR_TO_NAT;
if(PARSER_STATE->strictModeEnabled()) {
PARSER_STATE->parseError("bv2nat and int2bv are not part of SMT-LIB, and aren't available in SMT-LIB strict compliance mode");
} }
- | STRCON_TOK { $kind = CVC4::kind::STRING_CONCAT; }
- | STRLEN_TOK { $kind = CVC4::kind::STRING_LENGTH; }
- | STRSUB_TOK { $kind = CVC4::kind::STRING_SUBSTR; }
- | STRCTN_TOK { $kind = CVC4::kind::STRING_STRCTN; }
- | STRCAT_TOK { $kind = CVC4::kind::STRING_CHARAT; }
- | STRIDOF_TOK { $kind = CVC4::kind::STRING_STRIDOF; }
- | STRREPL_TOK { $kind = CVC4::kind::STRING_STRREPL; }
- | STRPREF_TOK { $kind = CVC4::kind::STRING_PREFIX; }
- | STRSUFF_TOK { $kind = CVC4::kind::STRING_SUFFIX; }
- | STRITOS_TOK { $kind = CVC4::kind::STRING_ITOS; }
- | STRSTOI_TOK { $kind = CVC4::kind::STRING_STOI; }
- | STRU16TOS_TOK { $kind = CVC4::kind::STRING_U16TOS; }
- | STRSTOU16_TOK { $kind = CVC4::kind::STRING_STOU16; }
- | STRU32TOS_TOK { $kind = CVC4::kind::STRING_U32TOS; }
- | STRSTOU32_TOK { $kind = CVC4::kind::STRING_STOU32; }
- | STRINRE_TOK { $kind = CVC4::kind::STRING_IN_REGEXP; }
- | STRTORE_TOK { $kind = CVC4::kind::STRING_TO_REGEXP; }
- | RECON_TOK { $kind = CVC4::kind::REGEXP_CONCAT; }
- | REUNION_TOK { $kind = CVC4::kind::REGEXP_UNION; }
- | REINTER_TOK { $kind = CVC4::kind::REGEXP_INTER; }
- | RESTAR_TOK { $kind = CVC4::kind::REGEXP_STAR; }
- | REPLUS_TOK { $kind = CVC4::kind::REGEXP_PLUS; }
- | REOPT_TOK { $kind = CVC4::kind::REGEXP_OPT; }
- | RERANGE_TOK { $kind = CVC4::kind::REGEXP_RANGE; }
- | RELOOP_TOK { $kind = CVC4::kind::REGEXP_LOOP; }
-
+
| DTSIZE_TOK { $kind = CVC4::kind::DT_SIZE; }
-
| FMFCARD_TOK { $kind = CVC4::kind::CARDINALITY_CONSTRAINT; }
-
| INST_CLOSURE_TOK { $kind = CVC4::kind::INST_CLOSURE; }
- | FP_TOK { $kind = CVC4::kind::FLOATINGPOINT_FP; }
- | FP_EQ_TOK { $kind = CVC4::kind::FLOATINGPOINT_EQ; }
- | FP_ABS_TOK { $kind = CVC4::kind::FLOATINGPOINT_ABS; }
- | FP_NEG_TOK { $kind = CVC4::kind::FLOATINGPOINT_NEG; }
- | FP_PLUS_TOK { $kind = CVC4::kind::FLOATINGPOINT_PLUS; }
- | FP_SUB_TOK { $kind = CVC4::kind::FLOATINGPOINT_SUB; }
- | FP_MUL_TOK { $kind = CVC4::kind::FLOATINGPOINT_MULT; }
- | FP_DIV_TOK { $kind = CVC4::kind::FLOATINGPOINT_DIV; }
- | FP_FMA_TOK { $kind = CVC4::kind::FLOATINGPOINT_FMA; }
- | FP_SQRT_TOK { $kind = CVC4::kind::FLOATINGPOINT_SQRT; }
- | FP_REM_TOK { $kind = CVC4::kind::FLOATINGPOINT_REM; }
- | FP_RTI_TOK { $kind = CVC4::kind::FLOATINGPOINT_RTI; }
- | FP_MIN_TOK { $kind = CVC4::kind::FLOATINGPOINT_MIN; }
- | FP_MAX_TOK { $kind = CVC4::kind::FLOATINGPOINT_MAX; }
- | FP_LEQ_TOK { $kind = CVC4::kind::FLOATINGPOINT_LEQ; }
- | FP_LT_TOK { $kind = CVC4::kind::FLOATINGPOINT_LT; }
- | FP_GEQ_TOK { $kind = CVC4::kind::FLOATINGPOINT_GEQ; }
- | FP_GT_TOK { $kind = CVC4::kind::FLOATINGPOINT_GT; }
- | FP_ISN_TOK { $kind = CVC4::kind::FLOATINGPOINT_ISN; }
- | FP_ISSN_TOK { $kind = CVC4::kind::FLOATINGPOINT_ISSN; }
- | FP_ISZ_TOK { $kind = CVC4::kind::FLOATINGPOINT_ISZ; }
- | FP_ISINF_TOK { $kind = CVC4::kind::FLOATINGPOINT_ISINF; }
- | FP_ISNAN_TOK { $kind = CVC4::kind::FLOATINGPOINT_ISNAN; }
- | FP_ISNEG_TOK { $kind = CVC4::kind::FLOATINGPOINT_ISNEG; }
- | FP_ISPOS_TOK { $kind = CVC4::kind::FLOATINGPOINT_ISPOS; }
- | FP_TO_REAL_TOK {$kind = CVC4::kind::FLOATINGPOINT_TO_REAL; }
- // NOTE: Theory operators go here
+ // NOTE: Theory operators no longer go here, add to smt2.cpp. Only
+ // special cases may go here. When this comment was written (2015
+ // Apr), the special cases were: core theory operators, arith
+ // operators which start with symbols like * / + >= etc, quantifier
+ // theory operators, and operators which depended on parser's state
+ // to accept or reject.
;
quantOp[CVC4::Kind& kind]
@@ -2500,7 +2413,6 @@ FORALL_TOK : 'forall';
GREATER_THAN_TOK : '>';
GREATER_THAN_EQUAL_TOK : '>=';
IMPLIES_TOK : '=>';
-IS_INT_TOK : 'is_int';
LESS_THAN_TOK : '<';
LESS_THAN_EQUAL_TOK : '<=';
MINUS_TOK : '-';
@@ -2509,77 +2421,16 @@ OR_TOK : 'or';
// PERCENT_TOK : '%';
PLUS_TOK : '+';
//POUND_TOK : '#';
-SELECT_TOK : 'select';
STAR_TOK : '*';
-STORE_TOK : 'store';
// TILDE_TOK : '~';
-TO_INT_TOK : 'to_int';
-TO_REAL_TOK : 'to_real';
XOR_TOK : 'xor';
-INTS_DIV_TOK : 'div';
-INTS_MOD_TOK : 'mod';
-ABS_TOK : 'abs';
DIVISIBLE_TOK : 'divisible';
-CONCAT_TOK : 'concat';
-BVNOT_TOK : 'bvnot';
-BVAND_TOK : 'bvand';
-BVOR_TOK : 'bvor';
-BVNEG_TOK : 'bvneg';
-BVADD_TOK : 'bvadd';
-BVMUL_TOK : 'bvmul';
-BVUDIV_TOK : 'bvudiv';
-BVUREM_TOK : 'bvurem';
-BVSHL_TOK : 'bvshl';
-BVLSHR_TOK : 'bvlshr';
-BVULT_TOK : 'bvult';
-BVNAND_TOK : 'bvnand';
-BVNOR_TOK : 'bvnor';
-BVXOR_TOK : 'bvxor';
-BVXNOR_TOK : 'bvxnor';
-BVCOMP_TOK : 'bvcomp';
-BVSUB_TOK : 'bvsub';
-BVSDIV_TOK : 'bvsdiv';
-BVSREM_TOK : 'bvsrem';
-BVSMOD_TOK : 'bvsmod';
-BVASHR_TOK : 'bvashr';
-BVULE_TOK : 'bvule';
-BVUGT_TOK : 'bvugt';
-BVUGE_TOK : 'bvuge';
-BVSLT_TOK : 'bvslt';
-BVSLE_TOK : 'bvsle';
-BVSGT_TOK : 'bvsgt';
-BVSGE_TOK : 'bvsge';
BV2NAT_TOK : 'bv2nat';
INT2BV_TOK : 'int2bv';
-STRCON_TOK : 'str.++';
-STRLEN_TOK : 'str.len';
-STRSUB_TOK : 'str.substr' ;
-STRCTN_TOK : 'str.contains' ;
-STRCAT_TOK : 'str.at' ;
-STRIDOF_TOK : 'str.indexof' ;
-STRREPL_TOK : 'str.replace' ;
-STRPREF_TOK : 'str.prefixof' ;
-STRSUFF_TOK : 'str.suffixof' ;
-STRITOS_TOK : 'int.to.str' ;
-STRSTOI_TOK : 'str.to.int' ;
-STRU16TOS_TOK : 'u16.to.str' ;
-STRSTOU16_TOK : 'str.to.u16' ;
-STRU32TOS_TOK : 'u32.to.str' ;
-STRSTOU32_TOK : 'str.to.u32' ;
-STRINRE_TOK : 'str.in.re';
-STRTORE_TOK : 'str.to.re';
-RECON_TOK : 're.++';
-REUNION_TOK : 're.union';
-REINTER_TOK : 're.inter';
-RESTAR_TOK : 're.*';
-REPLUS_TOK : 're.+';
-REOPT_TOK : 're.opt';
-RERANGE_TOK : 're.range';
-RELOOP_TOK : 're.loop';
RENOSTR_TOK : 're.nostr';
REALLCHAR_TOK : 're.allchar';
@@ -2594,36 +2445,12 @@ EMPTYSET_TOK: { PARSER_STATE->isTheoryEnabled(Smt2::THEORY_SETS) }? 'emptyset';
// tokenized and handled directly when
// processing a term
-FP_TOK : 'fp';
FP_PINF_TOK : '+oo';
FP_NINF_TOK : '-oo';
FP_PZERO_TOK : '+zero';
FP_NZERO_TOK : '-zero';
FP_NAN_TOK : 'NaN';
-FP_EQ_TOK : 'fp.eq';
-FP_ABS_TOK : 'fp.abs';
-FP_NEG_TOK : 'fp.neg';
-FP_PLUS_TOK : 'fp.add';
-FP_SUB_TOK : 'fp.sub';
-FP_MUL_TOK : 'fp.mul';
-FP_DIV_TOK : 'fp.div';
-FP_FMA_TOK : 'fp.fma';
-FP_SQRT_TOK : 'fp.sqrt';
-FP_REM_TOK : 'fp.rem';
-FP_RTI_TOK : 'fp.roundToIntegral';
-FP_MIN_TOK : 'fp.min';
-FP_MAX_TOK : 'fp.max';
-FP_LEQ_TOK : 'fp.leq';
-FP_LT_TOK : 'fp.lt';
-FP_GEQ_TOK : 'fp.geq';
-FP_GT_TOK : 'fp.gt';
-FP_ISN_TOK : 'fp.isNormal';
-FP_ISSN_TOK : 'fp.isSubnormal';
-FP_ISZ_TOK : 'fp.isZero';
-FP_ISINF_TOK : 'fp.isInfinite';
-FP_ISNAN_TOK : 'fp.isNaN';
-FP_ISNEG_TOK : 'fp.isNegative';
-FP_ISPOS_TOK : 'fp.isPositive';
+
FP_TO_FP_TOK : 'to_fp';
FP_TO_FPBV_TOK : 'to_fp_bv';
FP_TO_FPFP_TOK : 'to_fp_fp';
@@ -2632,7 +2459,6 @@ FP_TO_FPS_TOK : 'to_fp_signed';
FP_TO_FPU_TOK : 'to_fp_unsigned';
FP_TO_UBV_TOK : 'fp.to_ubv';
FP_TO_SBV_TOK : 'fp.to_sbv';
-FP_TO_REAL_TOK : 'fp.to_real';
FP_RNE_TOK : 'RNE';
FP_RNA_TOK : 'RNA';
FP_RTP_TOK : 'RTP';
diff --git a/src/parser/smt2/smt2.cpp b/src/parser/smt2/smt2.cpp
index 0c1b36655..bf0e57eca 100644
--- a/src/parser/smt2/smt2.cpp
+++ b/src/parser/smt2/smt2.cpp
@@ -50,35 +50,36 @@ void Smt2::addArithmeticOperators() {
}
void Smt2::addBitvectorOperators() {
- Parser::addOperator(kind::BITVECTOR_CONCAT);
- Parser::addOperator(kind::BITVECTOR_AND);
- Parser::addOperator(kind::BITVECTOR_OR);
- Parser::addOperator(kind::BITVECTOR_XOR);
- Parser::addOperator(kind::BITVECTOR_NOT);
- Parser::addOperator(kind::BITVECTOR_NAND);
- Parser::addOperator(kind::BITVECTOR_NOR);
- Parser::addOperator(kind::BITVECTOR_XNOR);
- Parser::addOperator(kind::BITVECTOR_COMP);
- Parser::addOperator(kind::BITVECTOR_MULT);
- Parser::addOperator(kind::BITVECTOR_PLUS);
- Parser::addOperator(kind::BITVECTOR_SUB);
- Parser::addOperator(kind::BITVECTOR_NEG);
- Parser::addOperator(kind::BITVECTOR_UDIV);
- Parser::addOperator(kind::BITVECTOR_UREM);
- Parser::addOperator(kind::BITVECTOR_SDIV);
- Parser::addOperator(kind::BITVECTOR_SREM);
- Parser::addOperator(kind::BITVECTOR_SMOD);
- Parser::addOperator(kind::BITVECTOR_SHL);
- Parser::addOperator(kind::BITVECTOR_LSHR);
- Parser::addOperator(kind::BITVECTOR_ASHR);
- Parser::addOperator(kind::BITVECTOR_ULT);
- Parser::addOperator(kind::BITVECTOR_ULE);
- Parser::addOperator(kind::BITVECTOR_UGT);
- Parser::addOperator(kind::BITVECTOR_UGE);
- Parser::addOperator(kind::BITVECTOR_SLT);
- Parser::addOperator(kind::BITVECTOR_SLE);
- Parser::addOperator(kind::BITVECTOR_SGT);
- Parser::addOperator(kind::BITVECTOR_SGE);
+ addOperator(kind::BITVECTOR_CONCAT, "concat");
+ addOperator(kind::BITVECTOR_NOT, "bvnot");
+ addOperator(kind::BITVECTOR_AND, "bvand");
+ addOperator(kind::BITVECTOR_OR, "bvor");
+ addOperator(kind::BITVECTOR_NEG, "bvneg");
+ addOperator(kind::BITVECTOR_PLUS, "bvadd");
+ addOperator(kind::BITVECTOR_MULT, "bvmul");
+ addOperator(kind::BITVECTOR_UDIV, "bvudiv");
+ addOperator(kind::BITVECTOR_UREM, "bvurem");
+ addOperator(kind::BITVECTOR_SHL, "bvshl");
+ addOperator(kind::BITVECTOR_LSHR, "bvlshr");
+ addOperator(kind::BITVECTOR_ULT, "bvult");
+ addOperator(kind::BITVECTOR_NAND, "bvnand");
+ addOperator(kind::BITVECTOR_NOR, "bvnor");
+ addOperator(kind::BITVECTOR_XOR, "bvxor");
+ addOperator(kind::BITVECTOR_XNOR, "bvxnor");
+ addOperator(kind::BITVECTOR_COMP, "bvcomp");
+ addOperator(kind::BITVECTOR_SUB, "bvsub");
+ addOperator(kind::BITVECTOR_SDIV, "bvsdiv");
+ addOperator(kind::BITVECTOR_SREM, "bvsrem");
+ addOperator(kind::BITVECTOR_SMOD, "bvsmod");
+ addOperator(kind::BITVECTOR_ASHR, "bvashr");
+ addOperator(kind::BITVECTOR_ULE, "bvule");
+ addOperator(kind::BITVECTOR_UGT, "bvugt");
+ addOperator(kind::BITVECTOR_UGE, "bvuge");
+ addOperator(kind::BITVECTOR_SLT, "bvslt");
+ addOperator(kind::BITVECTOR_SLE, "bvsle");
+ addOperator(kind::BITVECTOR_SGT, "bvsgt");
+ addOperator(kind::BITVECTOR_SGE, "bvsge");
+
Parser::addOperator(kind::BITVECTOR_BITOF);
Parser::addOperator(kind::BITVECTOR_EXTRACT);
Parser::addOperator(kind::BITVECTOR_REPEAT);
@@ -92,34 +93,61 @@ void Smt2::addBitvectorOperators() {
}
void Smt2::addStringOperators() {
- Parser::addOperator(kind::STRING_CONCAT);
- Parser::addOperator(kind::STRING_LENGTH);
+ addOperator(kind::STRING_CONCAT, "str.++");
+ addOperator(kind::STRING_LENGTH, "str.len");
+ addOperator(kind::STRING_SUBSTR, "str.substr" );
+ addOperator(kind::STRING_STRCTN, "str.contains" );
+ addOperator(kind::STRING_CHARAT, "str.at" );
+ addOperator(kind::STRING_STRIDOF, "str.indexof" );
+ addOperator(kind::STRING_STRREPL, "str.replace" );
+ addOperator(kind::STRING_PREFIX, "str.prefixof" );
+ addOperator(kind::STRING_SUFFIX, "str.suffixof" );
+ addOperator(kind::STRING_ITOS, "int.to.str" );
+ addOperator(kind::STRING_STOI, "str.to.int" );
+ addOperator(kind::STRING_U16TOS, "u16.to.str" );
+ addOperator(kind::STRING_STOU16, "str.to.u16" );
+ addOperator(kind::STRING_U32TOS, "u32.to.str" );
+ addOperator(kind::STRING_STOU32, "str.to.u32" );
+ addOperator(kind::STRING_IN_REGEXP, "str.in.re");
+ addOperator(kind::STRING_TO_REGEXP, "str.to.re");
+ addOperator(kind::REGEXP_CONCAT, "re.++");
+ addOperator(kind::REGEXP_UNION, "re.union");
+ addOperator(kind::REGEXP_INTER, "re.inter");
+ addOperator(kind::REGEXP_STAR, "re.*");
+ addOperator(kind::REGEXP_PLUS, "re.+");
+ addOperator(kind::REGEXP_OPT, "re.opt");
+ addOperator(kind::REGEXP_RANGE, "re.range");
+ addOperator(kind::REGEXP_LOOP, "re.loop");
}
void Smt2::addFloatingPointOperators() {
- Parser::addOperator(kind::FLOATINGPOINT_FP);
- Parser::addOperator(kind::FLOATINGPOINT_EQ);
- Parser::addOperator(kind::FLOATINGPOINT_ABS);
- Parser::addOperator(kind::FLOATINGPOINT_NEG);
- Parser::addOperator(kind::FLOATINGPOINT_PLUS);
- Parser::addOperator(kind::FLOATINGPOINT_SUB);
- Parser::addOperator(kind::FLOATINGPOINT_MULT);
- Parser::addOperator(kind::FLOATINGPOINT_DIV);
- Parser::addOperator(kind::FLOATINGPOINT_FMA);
- Parser::addOperator(kind::FLOATINGPOINT_SQRT);
- Parser::addOperator(kind::FLOATINGPOINT_REM);
- Parser::addOperator(kind::FLOATINGPOINT_RTI);
- Parser::addOperator(kind::FLOATINGPOINT_MIN);
- Parser::addOperator(kind::FLOATINGPOINT_MAX);
- Parser::addOperator(kind::FLOATINGPOINT_LEQ);
- Parser::addOperator(kind::FLOATINGPOINT_LT);
- Parser::addOperator(kind::FLOATINGPOINT_GEQ);
- Parser::addOperator(kind::FLOATINGPOINT_GT);
- Parser::addOperator(kind::FLOATINGPOINT_ISN);
- Parser::addOperator(kind::FLOATINGPOINT_ISSN);
- Parser::addOperator(kind::FLOATINGPOINT_ISZ);
- Parser::addOperator(kind::FLOATINGPOINT_ISINF);
- Parser::addOperator(kind::FLOATINGPOINT_ISNAN);
+ addOperator(kind::FLOATINGPOINT_FP, "fp");
+ addOperator(kind::FLOATINGPOINT_EQ, "fp.eq");
+ addOperator(kind::FLOATINGPOINT_ABS, "fp.abs");
+ addOperator(kind::FLOATINGPOINT_NEG, "fp.neg");
+ addOperator(kind::FLOATINGPOINT_PLUS, "fp.add");
+ addOperator(kind::FLOATINGPOINT_SUB, "fp.sub");
+ addOperator(kind::FLOATINGPOINT_MULT, "fp.mul");
+ addOperator(kind::FLOATINGPOINT_DIV, "fp.div");
+ addOperator(kind::FLOATINGPOINT_FMA, "fp.fma");
+ addOperator(kind::FLOATINGPOINT_SQRT, "fp.sqrt");
+ addOperator(kind::FLOATINGPOINT_REM, "fp.rem");
+ addOperator(kind::FLOATINGPOINT_RTI, "fp.roundToIntegral");
+ addOperator(kind::FLOATINGPOINT_MIN, "fp.min");
+ addOperator(kind::FLOATINGPOINT_MAX, "fp.max");
+ addOperator(kind::FLOATINGPOINT_LEQ, "fp.leq");
+ addOperator(kind::FLOATINGPOINT_LT, "fp.lt");
+ addOperator(kind::FLOATINGPOINT_GEQ, "fp.geq");
+ addOperator(kind::FLOATINGPOINT_GT, "fp.gt");
+ addOperator(kind::FLOATINGPOINT_ISN, "fp.isNormal");
+ addOperator(kind::FLOATINGPOINT_ISSN, "fp.isSubnormal");
+ addOperator(kind::FLOATINGPOINT_ISZ, "fp.isZero");
+ addOperator(kind::FLOATINGPOINT_ISINF, "fp.isInfinite");
+ addOperator(kind::FLOATINGPOINT_ISNAN, "fp.isNaN");
+ addOperator(kind::FLOATINGPOINT_ISNEG, "fp.isNegative");
+ addOperator(kind::FLOATINGPOINT_ISPOS, "fp.isPositive");
+ addOperator(kind::FLOATINGPOINT_TO_REAL, "fp.to_real");
+
Parser::addOperator(kind::FLOATINGPOINT_TO_FP_IEEE_BITVECTOR);
Parser::addOperator(kind::FLOATINGPOINT_TO_FP_FLOATINGPOINT);
Parser::addOperator(kind::FLOATINGPOINT_TO_FP_REAL);
@@ -127,15 +155,14 @@ void Smt2::addFloatingPointOperators() {
Parser::addOperator(kind::FLOATINGPOINT_TO_FP_UNSIGNED_BITVECTOR);
Parser::addOperator(kind::FLOATINGPOINT_TO_UBV);
Parser::addOperator(kind::FLOATINGPOINT_TO_SBV);
- Parser::addOperator(kind::FLOATINGPOINT_TO_REAL);
}
void Smt2::addTheory(Theory theory) {
switch(theory) {
case THEORY_ARRAYS:
- Parser::addOperator(kind::SELECT);
- Parser::addOperator(kind::STORE);
+ addOperator(kind::SELECT, "select");
+ addOperator(kind::STORE, "store");
break;
case THEORY_BITVECTORS:
@@ -160,16 +187,16 @@ void Smt2::addTheory(Theory theory) {
case THEORY_REALS_INTS:
defineType("Real", getExprManager()->realType());
Parser::addOperator(kind::DIVISION);
- Parser::addOperator(kind::TO_INTEGER);
- Parser::addOperator(kind::IS_INTEGER);
- Parser::addOperator(kind::TO_REAL);
+ addOperator(kind::TO_INTEGER, "to_int");
+ addOperator(kind::IS_INTEGER, "is_int");
+ addOperator(kind::TO_REAL, "to_real");
// falling through on purpose, to add Ints part of Reals_Ints
case THEORY_INTS:
defineType("Int", getExprManager()->integerType());
addArithmeticOperators();
- Parser::addOperator(kind::INTS_DIVISION);
- Parser::addOperator(kind::INTS_MODULUS);
- Parser::addOperator(kind::ABS);
+ addOperator(kind::INTS_DIVISION, "div");
+ addOperator(kind::INTS_MODULUS, "mod");
+ addOperator(kind::ABS, "abs");
Parser::addOperator(kind::DIVISIBLE);
break;
@@ -201,6 +228,7 @@ void Smt2::addTheory(Theory theory) {
case THEORY_STRINGS:
defineType("String", getExprManager()->stringType());
+ defineType("Int", getExprManager()->integerType());
addStringOperators();
break;
diff --git a/src/proof/proof_manager.cpp b/src/proof/proof_manager.cpp
index 0f9cfa710..2d8c4178a 100644
--- a/src/proof/proof_manager.cpp
+++ b/src/proof/proof_manager.cpp
@@ -204,7 +204,7 @@ void ProofManager::addAssertion(Expr formula, bool inUnsatCore) {
Debug("cores") << "assert: " << formula << std::endl;
d_inputFormulas.insert(formula);
d_deps[Node::fromExpr(formula)]; // empty vector of deps
- if(inUnsatCore || options::dumpUnsatCores()) {
+ if(inUnsatCore || options::dumpUnsatCores() || options::checkUnsatCores()) {
Debug("cores") << "adding to input core forms: " << formula << std::endl;
d_inputCoreFormulas.insert(formula);
}
@@ -221,6 +221,11 @@ void ProofManager::addDependence(TNode n, TNode dep) {
}
}
+void ProofManager::addUnsatCore(Expr formula) {
+ Assert (d_inputCoreFormulas.find(formula) != d_inputCoreFormulas.end());
+ d_outputCoreFormulas.insert(formula);
+}
+
void ProofManager::setLogic(const LogicInfo& logic) {
d_logic = logic;
}
diff --git a/src/proof/proof_manager.h b/src/proof/proof_manager.h
index 43d6723fa..ee99b0159 100644
--- a/src/proof/proof_manager.h
+++ b/src/proof/proof_manager.h
@@ -171,6 +171,7 @@ public:
void addClause(ClauseId id, const prop::SatClause* clause, ClauseKind kind);
// note that n depends on dep (for cores)
void addDependence(TNode n, TNode dep);
+ void addUnsatCore(Expr formula);
assertions_iterator begin_unsat_core() const { return d_outputCoreFormulas.begin(); }
assertions_iterator end_unsat_core() const { return d_outputCoreFormulas.end(); }
diff --git a/src/smt/options b/src/smt/options
index 593fc4887..b23d73943 100644
--- a/src/smt/options
+++ b/src/smt/options
@@ -31,7 +31,7 @@ option dumpModels --dump-models bool :default false :link --produce-models
output models after every SAT/INVALID/UNKNOWN response
option proof produce-proofs --proof bool :default false :predicate CVC4::smt::proofEnabledBuild CVC4::smt::beforeSearch :predicate-include "smt/options_handlers.h"
turn on proof generation
-option checkProofs check-proofs --check-proofs bool :link --proof :link-smt produce-proofs :predicate CVC4::smt::beforeSearch :predicate-include "smt/options_handlers.h"
+option checkProofs check-proofs --check-proofs bool :link --proof :link-smt produce-proofs :predicate CVC4::smt::beforeSearch :predicate-include "smt/options_handlers.h" :read-write
after UNSAT/VALID, machine-check the generated proof
option dumpProofs --dump-proofs bool :default false :link --proof
output proofs after every UNSAT/VALID response
@@ -41,6 +41,8 @@ option dumpSynth --dump-synth bool :default false
output solution for synthesis conjectures after every UNSAT/VALID response
option unsatCores produce-unsat-cores --produce-unsat-cores bool :predicate CVC4::smt::proofEnabledBuild CVC4::smt::beforeSearch :predicate-include "smt/options_handlers.h"
turn on unsat core generation
+option checkUnsatCores check-unsat-cores --check-unsat-cores bool :link --produce-unsat-cores :link-smt produce-unsat-cores :read-write
+ after UNSAT/VALID, produce and check an unsat core (expensive)
option dumpUnsatCores --dump-unsat-cores bool :default false :link --produce-unsat-cores :link-smt produce-unsat-cores :predicate CVC4::smt::beforeSearch :predicate-include "smt/options_handlers.h"
output unsat cores after every UNSAT/VALID response
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index 04af80281..6267a645e 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -199,6 +199,8 @@ struct SmtEngineStatistics {
TimerStat d_checkModelTime;
/** time spent in checkProof() */
TimerStat d_checkProofTime;
+ /** time spent in checkUnsatCore() */
+ TimerStat d_checkUnsatCoreTime;
/** time spent in PropEngine::checkSat() */
TimerStat d_solveTime;
/** time spent in pushing/popping */
@@ -229,6 +231,7 @@ struct SmtEngineStatistics {
d_numAssertionsPost("smt::SmtEngine::numAssertionsPostITERemoval", 0),
d_checkModelTime("smt::SmtEngine::checkModelTime"),
d_checkProofTime("smt::SmtEngine::checkProofTime"),
+ d_checkUnsatCoreTime("smt::SmtEngine::checkUnsatCoreTime"),
d_solveTime("smt::SmtEngine::solveTime"),
d_pushPopTime("smt::SmtEngine::pushPopTime"),
d_processAssertionsTime("smt::SmtEngine::processAssertionsTime"),
@@ -253,6 +256,7 @@ struct SmtEngineStatistics {
StatisticsRegistry::registerStat(&d_numAssertionsPost);
StatisticsRegistry::registerStat(&d_checkModelTime);
StatisticsRegistry::registerStat(&d_checkProofTime);
+ StatisticsRegistry::registerStat(&d_checkUnsatCoreTime);
StatisticsRegistry::registerStat(&d_solveTime);
StatisticsRegistry::registerStat(&d_pushPopTime);
StatisticsRegistry::registerStat(&d_processAssertionsTime);
@@ -278,6 +282,7 @@ struct SmtEngineStatistics {
StatisticsRegistry::unregisterStat(&d_numAssertionsPost);
StatisticsRegistry::unregisterStat(&d_checkModelTime);
StatisticsRegistry::unregisterStat(&d_checkProofTime);
+ StatisticsRegistry::unregisterStat(&d_checkUnsatCoreTime);
StatisticsRegistry::unregisterStat(&d_solveTime);
StatisticsRegistry::unregisterStat(&d_pushPopTime);
StatisticsRegistry::unregisterStat(&d_processAssertionsTime);
@@ -695,6 +700,9 @@ SmtEngine::SmtEngine(ExprManager* em) throw() :
d_modelGlobalCommands(),
d_modelCommands(NULL),
d_dumpCommands(),
+#ifdef CVC4_PROOF
+ d_defineCommands(),
+#endif
d_logic(),
d_originalOptions(em->getOptions()),
d_pendingPops(0),
@@ -1029,6 +1037,14 @@ void SmtEngine::setDefaults() {
Notice() << "SmtEngine: turning off bv-introduce-pow2 to support unsat-cores" << endl;
setOption("bv-intro-pow2", false);
}
+ if(options::repeatSimp()) {
+ if(options::repeatSimp.wasSetByUser()) {
+ throw OptionException("repeat-simp not supported with unsat cores");
+ }
+ Notice() << "SmtEngine: turning off repeat-simp to support unsat-cores" << endl;
+ setOption("repeat-simp", false);
+ }
+
}
if(options::produceAssignments() && !options::produceModels()) {
@@ -1047,6 +1063,24 @@ void SmtEngine::setDefaults() {
}
}
+ // strings require LIA, UF; widen the logic
+ if(d_logic.isTheoryEnabled(THEORY_STRINGS)) {
+ LogicInfo log(d_logic.getUnlockedCopy());
+ // Strings requires arith for length constraints, and also UF
+ if(!d_logic.isTheoryEnabled(THEORY_UF)) {
+ Trace("smt") << "because strings are enabled, also enabling UF" << endl;
+ log.enableTheory(THEORY_UF);
+ }
+ if(!d_logic.isTheoryEnabled(THEORY_ARITH) || d_logic.isDifferenceLogic() || !d_logic.areIntegersUsed()) {
+ Trace("smt") << "because strings are enabled, also enabling linear integer arithmetic" << endl;
+ log.enableTheory(THEORY_ARITH);
+ log.enableIntegers();
+ log.arithOnlyLinear();
+ }
+ d_logic = log;
+ d_logic.lock();
+ }
+
// by default, symmetry breaker is on only for QF_UF
if(! options::ufSymmetryBreaker.wasSetByUser()) {
bool qf_uf = d_logic.isPure(THEORY_UF) && !d_logic.isQuantified();
@@ -1133,16 +1167,25 @@ void SmtEngine::setDefaults() {
// Turn on multiple-pass non-clausal simplification for QF_AUFBV
if(! options::repeatSimp.wasSetByUser()) {
bool repeatSimp = !d_logic.isQuantified() &&
- (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_UF) && d_logic.isTheoryEnabled(THEORY_BV));
+ (d_logic.isTheoryEnabled(THEORY_ARRAY) &&
+ d_logic.isTheoryEnabled(THEORY_UF) &&
+ d_logic.isTheoryEnabled(THEORY_BV)) &&
+ !options::unsatCores();
Trace("smt") << "setting repeat simplification to " << repeatSimp << endl;
options::repeatSimp.set(repeatSimp);
}
// Turn on unconstrained simplification for QF_AUFBV
- if(! options::unconstrainedSimp.wasSetByUser() || options::incrementalSolving()) {
+ if(!options::unconstrainedSimp.wasSetByUser() ||
+ options::incrementalSolving()) {
// bool qf_sat = d_logic.isPure(THEORY_BOOL) && !d_logic.isQuantified();
// bool uncSimp = false && !qf_sat && !options::incrementalSolving();
- bool uncSimp = !options::incrementalSolving() && !d_logic.isQuantified() && !options::produceModels() && !options::produceAssignments() && !options::checkModels() &&
- (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_BV));
+ bool uncSimp = !options::incrementalSolving() &&
+ !d_logic.isQuantified() &&
+ !options::produceModels() &&
+ !options::produceAssignments() &&
+ !options::checkModels() &&
+ !options::unsatCores() &&
+ (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_BV));
Trace("smt") << "setting unconstrained simplification to " << uncSimp << endl;
options::unconstrainedSimp.set(uncSimp);
}
@@ -1660,6 +1703,11 @@ void SmtEngine::defineFunction(Expr func,
SmtScope smts(this);
+ PROOF( if (options::checkUnsatCores()) {
+ d_defineCommands.push_back(c.clone());
+ });
+
+
// Substitute out any abstract values in formula
Expr form = d_private->substituteAbstractValues(Node::fromExpr(formula)).toExpr();
@@ -3033,7 +3081,7 @@ void SmtEnginePrivate::processAssertions() {
Trace("smt") << "SmtEnginePrivate::processAssertions()" << endl;
Debug("smt") << " d_assertions : " << d_assertions.size() << endl;
-
+
if (d_assertions.size() == 0) {
// nothing to do
return;
@@ -3331,8 +3379,7 @@ void SmtEnginePrivate::processAssertions() {
d_iteSkolemMap.erase(toErase.back());
toErase.pop_back();
}
- d_assertions[d_realAssertionsEnd - 1] =
- Rewriter::rewrite(Node(builder));
+ d_assertions[d_realAssertionsEnd - 1] = Rewriter::rewrite(Node(builder));
}
// For some reason this is needed for some benchmarks, such as
// http://cvc4.cs.nyu.edu/benchmarks/smtlib2/QF_AUFBV/dwp_formulas/try5_small_difret_functions_dwp_tac.re_node_set_remove_at.il.dwp.smt2
@@ -3442,6 +3489,12 @@ void SmtEnginePrivate::addFormula(TNode n, bool inUnsatCore, bool inInput)
// n is the result of an unknown preprocessing step, add it to dependency map to null
ProofManager::currentPM()->addDependence(n, Node::null());
}
+ // rewrite rules are by default in the unsat core because
+ // they need to be applied until saturation
+ if(options::unsatCores() &&
+ n.getKind() == kind::REWRITE_RULE ){
+ ProofManager::currentPM()->addUnsatCore(n.toExpr());
+ }
);
// Add the normalized formula to the queue
@@ -3512,7 +3565,7 @@ Result SmtEngine::checkSat(const Expr& ex, bool inUnsatCore) throw(TypeCheckingE
// Dump the query if requested
if(Dump.isOn("benchmark")) {
// the expr already got dumped out if assertion-dumping is on
- Dump("benchmark") << CheckSatCommand();
+ Dump("benchmark") << CheckSatCommand(ex);
}
// Pop the context
@@ -3539,6 +3592,13 @@ Result SmtEngine::checkSat(const Expr& ex, bool inUnsatCore) throw(TypeCheckingE
checkProof();
}
}
+ // Check that UNSAT results generate an unsat core correctly.
+ if(options::checkUnsatCores()) {
+ if(r.asSatisfiabilityResult().isSat() == Result::UNSAT) {
+ TimerStat::CodeTimer checkUnsatCoreTimer(d_stats->d_checkUnsatCoreTime);
+ checkUnsatCore();
+ }
+ }
return r;
} catch (UnsafeInterruptException& e) {
@@ -3596,7 +3656,7 @@ Result SmtEngine::query(const Expr& ex, bool inUnsatCore) throw(TypeCheckingExce
// Dump the query if requested
if(Dump.isOn("benchmark")) {
// the expr already got dumped out if assertion-dumping is on
- Dump("benchmark") << CheckSatCommand();
+ Dump("benchmark") << QueryCommand(ex);
}
// Pop the context
@@ -3623,6 +3683,13 @@ Result SmtEngine::query(const Expr& ex, bool inUnsatCore) throw(TypeCheckingExce
checkProof();
}
}
+ // Check that UNSAT results generate an unsat core correctly.
+ if(options::checkUnsatCores()) {
+ if(r.asSatisfiabilityResult().isSat() == Result::UNSAT) {
+ TimerStat::CodeTimer checkUnsatCoreTimer(d_stats->d_checkUnsatCoreTime);
+ checkUnsatCore();
+ }
+ }
return r;
} catch (UnsafeInterruptException& e) {
@@ -3943,6 +4010,47 @@ Model* SmtEngine::getModel() throw(ModalException, UnsafeInterruptException) {
return m;
}
+void SmtEngine::checkUnsatCore() {
+ Assert(options::unsatCores(), "cannot check unsat core if unsat cores are turned off");
+
+ Notice() << "SmtEngine::checkUnsatCore(): generating unsat core" << endl;
+ UnsatCore core = getUnsatCore();
+
+ SmtEngine coreChecker(d_exprManager);
+ coreChecker.setLogic(getLogicInfo());
+
+ PROOF(
+ std::vector<Command*>::const_iterator itg = d_defineCommands.begin();
+ for (; itg != d_defineCommands.end(); ++itg) {
+ (*itg)->invoke(&coreChecker);
+ }
+ );
+
+ Notice() << "SmtEngine::checkUnsatCore(): pushing core assertions (size == " << core.size() << ")" << endl;
+ for(UnsatCore::iterator i = core.begin(); i != core.end(); ++i) {
+ Notice() << "SmtEngine::checkUnsatCore(): pushing core member " << *i << endl;
+ coreChecker.assertFormula(*i);
+ }
+ const bool checkUnsatCores = options::checkUnsatCores();
+ Result r;
+ try {
+ options::checkUnsatCores.set(false);
+ options::checkProofs.set(false);
+ r = coreChecker.checkSat();
+ } catch(...) {
+ options::checkUnsatCores.set(checkUnsatCores);
+ throw;
+ }
+ Notice() << "SmtEngine::checkUnsatCore(): result is " << r << endl;
+ if(r.asSatisfiabilityResult().isUnknown()) {
+ InternalError("SmtEngine::checkUnsatCore(): could not check core result unknown.");
+ }
+
+ if(r.asSatisfiabilityResult().isSat()) {
+ InternalError("SmtEngine::checkUnsatCore(): produced core was satisfiable.");
+ }
+}
+
void SmtEngine::checkModel(bool hardFailure) {
// --check-model implies --produce-assertions, which enables the
// assertion list, so we should be ok.
diff --git a/src/smt/smt_engine.h b/src/smt/smt_engine.h
index 7c5c45e42..de9b8127d 100644
--- a/src/smt/smt_engine.h
+++ b/src/smt/smt_engine.h
@@ -186,6 +186,13 @@ class CVC4_PUBLIC SmtEngine {
std::vector<Command*> d_dumpCommands;
/**
+ *A vector of command definitions to be imported in the new
+ *SmtEngine when checking unsat-cores.
+ */
+#ifdef CVC4_PROOF
+ std::vector<Command*> d_defineCommands;
+#endif
+ /**
* The logic we're in.
*/
LogicInfo d_logic;
@@ -261,6 +268,11 @@ class CVC4_PUBLIC SmtEngine {
void checkProof();
/**
+ * Check that an unsatisfiable core is indeed unsatisfiable.
+ */
+ void checkUnsatCore();
+
+ /**
* Check that a generated Model (via getModel()) actually satisfies
* all user assertions.
*/
diff --git a/src/smt/smt_engine_check_proof.cpp b/src/smt/smt_engine_check_proof.cpp
index 2080c772a..4c35bd863 100644
--- a/src/smt/smt_engine_check_proof.cpp
+++ b/src/smt/smt_engine_check_proof.cpp
@@ -57,9 +57,10 @@ void SmtEngine::checkProof() {
Chat() << "checking proof..." << endl;
- if( ! ( d_logic.isPure(theory::THEORY_BOOL) ||
- ( d_logic.isPure(theory::THEORY_UF) &&
- ! d_logic.hasCardinalityConstraints() ) ) ) {
+ if( !(d_logic.isPure(theory::THEORY_BOOL) ||
+ (d_logic.isPure(theory::THEORY_UF) &&
+ ! d_logic.hasCardinalityConstraints())) ||
+ d_logic.isQuantified()) {
// no checking for these yet
Notice() << "Notice: no proof-checking for non-UF/Bool proofs yet" << endl;
return;
diff --git a/src/theory/logic_info.cpp b/src/theory/logic_info.cpp
index 635262a1e..1df304061 100644
--- a/src/theory/logic_info.cpp
+++ b/src/theory/logic_info.cpp
@@ -223,13 +223,7 @@ void LogicInfo::setLogicString(std::string logicString) throw(IllegalArgumentExc
p += 2;
}
if(*p == 'S') {
- // Strings requires arith for length constraints,
- // and UF for equality (?)
enableTheory(THEORY_STRINGS);
- enableTheory(THEORY_UF);
- enableTheory(THEORY_ARITH);
- enableIntegers();
- arithOnlyLinear();
++p;
}
if(!strncmp(p, "IDL", 3)) {
diff --git a/src/util/unsat_core.h b/src/util/unsat_core.h
index 27cf86488..8f497688a 100644
--- a/src/util/unsat_core.h
+++ b/src/util/unsat_core.h
@@ -23,6 +23,7 @@
#include <iostream>
#include <vector>
#include "expr/expr.h"
+#include "util/output.h"
namespace CVC4 {
@@ -43,13 +44,17 @@ public:
UnsatCore() : d_smt(NULL) {}
template <class T>
- UnsatCore(SmtEngine* smt, T begin, T end) : d_smt(smt), d_core(begin, end) {}
+ UnsatCore(SmtEngine* smt, T begin, T end) : d_smt(smt), d_core(begin, end) {
+ Debug("core") << "UnsatCore size " << d_core.size() << std::endl;
+ }
~UnsatCore() {}
/** get the smt engine that this unsat core is hooked up to */
SmtEngine* getSmtEngine() { return d_smt; }
+ size_t size() const { return d_core.size(); }
+
typedef std::vector<Expr>::const_iterator iterator;
typedef std::vector<Expr>::const_iterator const_iterator;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback