This program has been tested on Windows 8/10, Ubuntu 20.04, and Debian 11.6. It compiles at least with GCC 11.1.0 (Ubuntu) and 13.1 (Debian), and VC++ 14.20 (Windows 8) and 14.30 (Windows 10). The build-files can be generated by CMake 3.18.4 or higher.
The program depends on the Z3 SMT-solver which can be downloaded from https://github.com/Z3Prover/z3. As there is a bug in Z3 that may cause Z3 to give wrong results, you have to build it from source. Otw. the bug will be fixed in the version > 4.12.1
You need to put the libz3-library to a path where the program can find it. There are no additional libraries required.
The Z3 library has to be found by CMake. This can be done by passing -DZ3_INCLUDE_DIR=[path-to-Z3-headers] -DZ3_LIBRARIES=[path-to-Z3-static-lib]
to CMake.
The program can be started from CL. The relevant arguments are
- -t=ms ... timeout in milliseconds
- -r ... run the program on all *.smt2 files in the given directory recursively
After these arguments you can give the path to an SMT-LIB file containing the problem or a directory where the program will look for all *.smt2 files
The *.smt2 files have to be valid SMT-LIB files.
However, the program will automatically add (check-sat)
so the input file should only contain the constant/function declarations and assertions. (See examples
folder for examples)
In addition to the ordinary SMT sorts there is a World
and a Relation
sort predefined. (You can just use them as if they are defined in the SMT-LIB standard.)
Furthermore, there are the following additional functions
box : Relation Bool -> Bool (box operator)
dia : Relation Bool -> Bool (diamond operator)
global : Bool -> Bool (global/TBox assertion)
reachable : Relation World World -> Bool (ABox relations)
trans : Relation -> Bool (RBox transitivity)
world : () -> World (current world)
We have the additional constraints: reachable
may not occur nested in either box
/dia
/global
.
global
and trans
may only occur as "top-level" assertions.
We may decare as many Relation
constants as we want and constants/functions that have World
-sorted paramter at the first position. This makes the respective symbol depending on the world.
e.g.,
(declare-fun p (World) Bool)
(declare-const w1 World)
(declare-const r Relation)
(assert (and (p w1) (dia r (p world))))
This can be read as "p
is true in world w1
and there is a r-reachable world from my initial world (implicitly w0
) in which p
is true". For more examples see the examples
folder.
In our implementation we can express all problems of the S-description logic and additionally connectives over ABoxes (e.g., (or (p w1) (p w2))
).
For translating some formula given in the S-description logic use the following translation
DL-Element | SMT-LIB |
---|---|
TBox -- F1 |
(assert (global (=> F1 F2))) |
ABox -- w : F | (assert (global (=> (= world w) F)) |
ABox -- w : F [alternative] | (assert F) [with replacing "world" by "w" in F if possible] |
ABox -- r : (w1, w2) | (assert (reachable w1 w2)) |
RBox -- trans(r) | (assert (trans r)) |