diff options
author | Andres Noetzli <andres.noetzli@gmail.com> | 2020-09-08 10:33:59 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-08 10:33:59 -0700 |
commit | 7b36dc4ee0f4fa5c1d73b0f648c74b9736a5f626 (patch) | |
tree | e8b7631755e92c80536e9a146bbd6c5e53a99787 /src | |
parent | be3543ef7e01eb32aab3161fa2778953fabc988d (diff) |
Make CVC/API BV div/mod semantics match SMT-LIB (#4997)
This commit changes the semantics of the CVC language and with the
default semantics of the API for `BVUDIV`, `BVUREM`, `BVSDIV`, `BVSREM`,
and `BVSMOD` to match the semantics of SMT-LIB >=2.6. Relatedly, the
commit also adds comments to our API documentation for the different
semantics enabled by the `bv-div-zero-const` option.
Diffstat (limited to 'src')
-rw-r--r-- | src/api/cvc4cppkind.h | 31 | ||||
-rw-r--r-- | src/options/bv_options.toml | 2 | ||||
-rw-r--r-- | src/smt/set_defaults.cpp | 3 |
3 files changed, 33 insertions, 3 deletions
diff --git a/src/api/cvc4cppkind.h b/src/api/cvc4cppkind.h index f56e48cad..48addc67a 100644 --- a/src/api/cvc4cppkind.h +++ b/src/api/cvc4cppkind.h @@ -761,6 +761,12 @@ enum CVC4_PUBLIC Kind : int32_t BITVECTOR_NEG, /** * Unsigned division of two bit-vectors, truncating towards 0. + * + * Note: The semantics of this operator depends on `bv-div-zero-const` + * (default is true). Depending on the setting, a division by zero is + * treated as all ones (default, corresponds to SMT-LIB >=2.6) or an + * uninterpreted value (corresponds to SMT-LIB <2.6). + * * Parameters: 2 * -[1]..[2]: Terms of bit-vector sort (sorts must match) * Create with: @@ -770,6 +776,12 @@ enum CVC4_PUBLIC Kind : int32_t BITVECTOR_UDIV, /** * Unsigned remainder from truncating division of two bit-vectors. + * + * Note: The semantics of this operator depends on `bv-div-zero-const` + * (default is true). Depending on the setting, if the modulus is zero, the + * result is either the dividend (default, corresponds to SMT-LIB >=2.6) or + * an uninterpreted value (corresponds to SMT-LIB <2.6). + * * Parameters: 2 * -[1]..[2]: Terms of bit-vector sort (sorts must match) * Create with: @@ -779,6 +791,13 @@ enum CVC4_PUBLIC Kind : int32_t BITVECTOR_UREM, /** * Two's complement signed division of two bit-vectors. + * + * Note: The semantics of this operator depends on `bv-div-zero-const` + * (default is true). By default, the function returns all ones if the + * dividend is positive and one if the dividend is negative (corresponds to + * SMT-LIB >=2.6). If the option is disabled, a division by zero is treated + * as an uninterpreted value (corresponds to SMT-LIB <2.6). + * * Parameters: 2 * -[1]..[2]: Terms of bit-vector sort (sorts must match) * Create with: @@ -789,6 +808,12 @@ enum CVC4_PUBLIC Kind : int32_t /** * Two's complement signed remainder of two bit-vectors * (sign follows dividend). + * + * Note: The semantics of this operator depends on `bv-div-zero-const` + * (default is true, corresponds to SMT-LIB >=2.6). Depending on the setting, + * if the modulus is zero, the result is either the dividend (default) or an + * uninterpreted value (corresponds to SMT-LIB <2.6). + * * Parameters: 2 * -[1]..[2]: Terms of bit-vector sort (sorts must match) * Create with: @@ -799,6 +824,12 @@ enum CVC4_PUBLIC Kind : int32_t /** * Two's complement signed remainder * (sign follows divisor). + * + * Note: The semantics of this operator depends on `bv-div-zero-const` + * (default is on). Depending on the setting, if the modulus is zero, the + * result is either the dividend (default, corresponds to SMT-LIB >=2.6) or + * an uninterpreted value (corresponds to SMT-LIB <2.6). + * * Parameters: 2 * -[1]..[2]: Terms of bit-vector sort (sorts must match) * Create with: diff --git a/src/options/bv_options.toml b/src/options/bv_options.toml index e00db9393..d91c8bf9f 100644 --- a/src/options/bv_options.toml +++ b/src/options/bv_options.toml @@ -134,7 +134,7 @@ header = "options/bv_options.h" category = "regular" long = "bv-div-zero-const" type = "bool" - default = "false" + default = "true" help = "always return -1 on division by zero" [[option]] diff --git a/src/smt/set_defaults.cpp b/src/smt/set_defaults.cpp index 236137bb2..aa0e976f2 100644 --- a/src/smt/set_defaults.cpp +++ b/src/smt/set_defaults.cpp @@ -89,8 +89,7 @@ void setDefaults(LogicInfo& logic, bool isInternalSubsolver) // set this option if the input format is SMT LIB 2.6. We also set this // option if we are sygus, since we assume SMT LIB 2.6 semantics for sygus. options::bitvectorDivByZeroConst.set( - language::isInputLang_smt2_6(options::inputLanguage()) - || language::isInputLangSygus(options::inputLanguage())); + !language::isInputLang_smt2_5(options::inputLanguage(), true)); } bool is_sygus = language::isInputLangSygus(options::inputLanguage()); |