[SMT-LIB] [SMT-COMP] Draft of SMT-LIB 2.5: request for feedback

Delcypher delcypher at gmail.com
Thu Jan 15 07:40:35 EST 2015


Sorry forwarding to smt-lib and smt-comp using the right e-mail
address this time...

Hi All,

I thought I'd mention a few issues I've had in the past with SMT-LIBv2
and I was wondering if they were resolved in the draft 2.5 spec.

* Sometimes I've found it necessary to use a mixture of logics. For example I
wanted to use Ints and arrays of bitvectors. (I might do conversions
using the int2bv
and bv2int functions although I think these might be Z3 extensions). There is
no logic I can specific in this case. For Z3 I just don't specify the
logic and for CVC4 I just use

(set-logic: ALL_SUPPORTED)

Is there any plan to add something like "ALL_SUPPORTED" to the
standard? I couldn't see anything obvious about it in the draft.

* Non standard (get-model) output. I seem to remember that the output
of (get-model) was not standardised so different solvers can give
completely different outputs making it difficult to parse.
Glancing at the spec I see for (get-model) to draft says (declare-fun)
or (declare-fun-rec) is now emitted so I take it this is the
standardisation of the model syntax?

* Calling get-value on arrays. I remember a few years ago using
(get-value) to retrieve the values of arrays of bitvectors. I remember
running into a few issues. Let's say I declare the following

```
(declare-fun unnamed_1 () (Array (_ BitVec 32) (_ BitVec 8) ) )
```

If I later did

```
(get-value unnamed_1)
```

the response I got was not consistent between solvers. IIRC correctly
SONOLAR gave a list of relevant assignments

```
(select  unnamed #b00000000000000000000000000000000) #b00011011)
(select  unnamed #b00000000000000000000000000000001) #b00011011)
...
```

where as other solvers outputted things relating to their model. For
example Z3 would output something like

```
((unnamed_1 (_ as-array k!0)))
```

which isn't very useful. Is there any intent to standardise what
calling (get-value) on an array type should do?

* Representation of bitvector constants in models.
There are three different ways to represent bitvector constants in
SMTLIBv2. I recall trying to write code to parse the response from
calling something like...

```
(get-value ( (select unnamed_1 (_ bv0 32) ) ) )
```

being complicated by the fact that different solvers use different
representations for constant bitvectors. In fact in some cases the
representation is mixed (e.g. this output from Z3)

```
(((select unnamed_1 (_ bv0 32) ) #x20))
```

Is there any interest in standardising the representation of bitvector
constants used in outputted models?


Thanks,
Dan.


More information about the SMT-LIB mailing list