Solver Profiles
A solver profile is a JSON file profile.json
located in the solver
directory
(e.g., src/solver/cvc5/profile.json)
and allows to arbitrarily configure how and what should be tested.
The profile file defines what is supported by the solver and therefore each
solver must provide a profile.
Murxla recognizes a set of predefined JSON keys as described below, which will affect how Murxla generates API calls. The solver profile JSON file can be arbitrarily extended with solver-specific keys.
The predefined keys allow to define which theories to include, and optionally restrict sort and operator kinds. They further allow defining restrictions for unsupported features (or to configure a specific test environment, e.g., for fragments of a theory), skipping issues based on output patterns (useful for false positives that require an unreasonable amount of implementation effort to be avoided), and explicitly filtering for specific issues.
- Predefined keys used by Murxla:
theories
(theory restrictions)sorts
(sort restrictions)operators
(operator restrictions)errors
(filtering errors)
In the following, <THEORY>
refers to theories defined in
murxla::Theory
,
<SORT>
refers to any sort kind murxla::SortKind
,
and <OP>
refers to any operator murxla::Op::Kind
.
Theory Restrictions
The theories
key restricts how Murxla enables/disables theories.
- Available keys:
include
: List of supported theories. (seemurxla::Theory
)exclude-combinations
: Dictionary of unsupported theory combinations.
Supported Theories (required)
A profile is required to define the list of theories supported by a solver. This will configure Murxla to use all sorts and operators associated with a theory in this list. The use of sorts and operators can be further restricted as described below (sorts, operators).
{
"theories": {
"include": [
"<THEORY>", "..."
]
}
}
Note
The include attribute is a required attribute for theories.
Any theory from
murxla::Theory
can be included except THEORY_ALL.THEORY_BOOL is always implicitly included.
Excluding Theory Combinations
If a solver does not support certain combinations of theories they can be excluded as follow.
{
"theories": {
"exclude-combinations": {
"<THEORY>": [
"<THEORY>", "..."
]
}
}
}
For example, to configure Murxla to not use quantifiers in combination with arrays or uninterpreted functions use:
{
"theories": {
"exclude-combinations": {
"THEORY_QUANT": [
"THEORY_ARRAY",
"THEORY_UF"
]
}
}
}
Sort Restrictions
- Available keys:
exclude
: List of sort kinds to exclude.array-index
: Array index sort restrictions.array-element
: Array element sort restrictions.bag-element
: Bag element sort restrictions.datatype-match
: Datatype match construct sort restrictions.datatype-selector-codomain
: Datatype selector codomain sort restrictions.fun-domain
: Domain sort restrictions when creating functions (define-fun
in SMT-LIBv2,murxla::ActionMkFun
).fun-codomain
: Codomain sort restrictions when creating functions (define-fun
in SMT-LIBv2,murxla::ActionMkFun
).fun-sort-domain
: Domain sort restrictions when creating function sorts.fun-sort-codomain
: Codomain sort restrictions when creating function sorts.get-value
: Sort restrictions on terms for querying model values (get-value
in SMT-LIBv2,murxla::ActionGetValue
).seq-element
: Sequence element sort restrictions.set-element
: Set element sort restrictions.sort-param
: Sort restrictions on parameters of parametric sorts.var
: Variable sort restrictions.
The list of available sort kinds can be found here:
murxla::SortKind
.
Excluding Sort Kinds
In special cases a solver may not support not all sort kinds associated to a theory. For example, a solver may support THEORY_UF, but does not supported uninterpreted sorts. For these cases Murxla can be instructed to not create uninterpreted sorts as follows.
{
"sorts": {
"exclude": [
"<SORT>", "..."
]
}
}
Note
Disabling a sort kind will also disable all operators that require terms of that sort kind.
For all other keys <KEY>
listed above sort restrictions can be defined as
follows.
{
"sorts": {
"<KEY>": {
"exclude": [
"<SORT>", "..."
]
}
}
}
Operator Restrictions
- Available keys:
exclude
: List of operators. (seemurxla::Op::Kind
)sort-restrictions
: Dictionary of operators to sort kinds (only useful for restricting sorts for operators with sort kindSORT_ANY
).
Certain operators can be disabled as follows.
{
"operators": {
"exclude": [
"<OP>", "..."
]
}
}
Some operators in Murxla have arguments of sort kind SORT_ANY
(e.g., Op::EQUAL
, Op::DISTINCT
).
Further restricting the sorts of the operator’s arguments can be done as
follows.
{
"operators": {
"sort-restrictions": {
"<OP>": [
"<SORT>", "..."
]
}
}
}
Filtering Errors
Error messages can be filtered out as follows.
{
"errors": {
"exclude": [
"foo",
"bar"
]
}
}
This will ignore all triggered error messages containing foo
or bar
.
Customizing Solver Profiles
Murxla provides option -p <JSON>
(--profile <JSON>
) to customize
the default solver profile.
If this options is used the specified profile will be merged with the default
solver profile, i.e., it takes the union of all exclude
keys and the
intersection of all include
keys.
Default Profiles of Supported Solvers
src/solver/bitwuzla/profile.json
{
"theories": {
"include": [
"THEORY_ARRAY",
"THEORY_BOOL",
"THEORY_BV",
"THEORY_FP",
"THEORY_UF",
"THEORY_QUANT"
]
},
"operators": {
"exclude": [
"OP_FP_TO_REAL"
]
},
"sorts": {
"exclude": [
"SORT_UNINTERPRETED"
],
"array-index": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"array-element": {
"exclude": [
"SORT_FUN"
]
},
"fun-sort-domain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-sort-codomain": {
"exclude": [
"SORT_FUN"
]
},
"fun-domain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-codomain": {
"exclude": [
"SORT_FUN"
]
},
"var": {
"exclude": [
"SORT_FUN"
]
}
},
"errors": {
"exclude": [
"\\[bitwuzla\\] bitwuzla_.*: .* is currently not supported with quantifiers"
]
}
}
{
"theories": {
"include": [
"THEORY_ARRAY",
"THEORY_BV",
"THEORY_BOOL",
"THEORY_QUANT",
"THEORY_UF"
],
"exclude-combinations": {
"THEORY_QUANT": [
"THEORY_ARRAY",
"THEORY_UF"
]
}
},
"sorts": {
"exclude": [
"SORT_UNINTERPRETED"
],
"array-index": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"array-element": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-sort-domain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-sort-codomain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-domain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-codomain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"var": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
}
},
"errors": {
"exclude": [
"[boolector] boolector_ne: parameterized function equalities not supported",
"[boolector] boolector_eq: parameterized function equalities not supported"
]
}
}
{
"theories": {
"include": [
"THEORY_ARRAY",
"THEORY_BAG",
"THEORY_BOOL",
"THEORY_BV",
"THEORY_DT",
"THEORY_FF",
"THEORY_FP",
"THEORY_INT",
"THEORY_QUANT",
"THEORY_REAL",
"THEORY_SEQ",
"THEORY_SET",
"THEORY_STRING",
"THEORY_TRANSCENDENTAL",
"THEORY_UF"
]
},
"operators": {
"exclude": [
"OP_BAG_CHOOSE",
"OP_BAG_FROM_SET",
"OP_BAG_MAP",
"OP_BAG_TO_SET",
"OP_BAG_IS_SINGLETON",
"OP_IFF"
],
"sort-restrictions": {
"OP_DISTINCT": [
"SORT_FUN",
"SORT_REGLAN"
],
"OP_EQUAL": [
"SORT_FUN",
"SORT_REGLAN"
],
"OP_ITE": [
"SORT_FUN",
"SORT_REGLAN"
]
}
},
"sorts": {
"array-index": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN",
"SORT_REGLAN"
]
},
"array-element": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"bag-element": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"datatype-match": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"datatype-selector-codomain": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"fun-domain": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"fun-codomain": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"fun-sort-domain": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"fun-sort-codomain": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"get-value": {
"exclude": [
"SORT_REGLAN"
]
},
"seq-element": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"set-element": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"sort-param": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
},
"var": {
"exclude": [
"SORT_FUN",
"SORT_REGLAN"
]
}
},
"errors": {
"exclude": [
"cvc5::CVC5ApiException'\\n.*The exponent of the POW\\(\\^\\) operator can only be a positive integral",
"cvc5::CVC5ApiException'\\n.*We only allow sets up to cardinality",
"cvc5::CVC5ApiException'\\n.*Cannot handle non-well-founded datatype"
],
"filter": [
"Fatal failure within [\\S\\s]+",
"terminate called after throwing an instance of [\\S\\s]+what\\(\\):.*"
]
}
}
{
"theories": {
"include": [
"THEORY_ARRAY",
"THEORY_BOOL",
"THEORY_BV",
"THEORY_INT",
"THEORY_QUANT",
"THEORY_REAL",
"THEORY_UF"
]
},
"sorts": {
"array-index": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"array-element": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-sort-domain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"fun-sort-codomain": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"get-value": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
}
}
}
{
"theories": {
"include": [
"THEORY_ARRAY",
"THEORY_BAG",
"THEORY_BOOL",
"THEORY_BV",
"THEORY_DT",
"THEORY_FF",
"THEORY_FP",
"THEORY_INT",
"THEORY_QUANT",
"THEORY_REAL",
"THEORY_SEQ",
"THEORY_SET",
"THEORY_STRING",
"THEORY_TRANSCENDENTAL",
"THEORY_UF"
]
},
"operators": {
"sort-restrictions": {
"OP_DISTINCT": [
"SORT_FUN"
],
"OP_EQUAL": [
"SORT_FUN"
],
"OP_ITE": [
"SORT_FUN"
]
}
},
"sorts": {
"array-index": {
"exclude": [
"SORT_ARRAY",
"SORT_FUN"
]
},
"bag-element": {
"exclude": [
"SORT_FUN"
]
},
"datatype-match": {
"exclude": [
"SORT_FUN"
]
},
"datatype-selector-codomain": {
"exclude": [
"SORT_FUN"
]
},
"fun-domain": {
"exclude": [
"SORT_FUN"
]
},
"fun-codomain": {
"exclude": [
"SORT_FUN"
]
},
"fun-sort-domain": {
"exclude": [
"SORT_FUN"
]
},
"fun-sort-codomain": {
"exclude": [
"SORT_FUN"
]
},
"set-element": {
"exclude": [
"SORT_FUN"
]
},
"sort-param": {
"exclude": [
"SORT_FUN"
]
},
"var": {
"exclude": [
"SORT_FUN"
]
}
}
}