Closed lisandrasilva closed 6 months ago
kore/rpc.py
has SMTSolverError
as a return type: https://github.com/runtimeverification/pyk/blob/6fbcf413a8c9058241e8d7aa26dc5a4020c010ff/src/pyk/kore/rpc.py#L424. This error is carrying a Pattern
, which is a Kore term.raise
ing a KoreClientError
(which can be an SMTSolverError
): https://github.com/runtimeverification/pyk/blob/6fbcf413a8c9058241e8d7aa26dc5a4020c010ff/src/pyk/kore/rpc.py#L906.CTermSymbolic
(in cterm/symbolic.py
) https://github.com/runtimeverification/pyk/blob/6fbcf413a8c9058241e8d7aa26dc5a4020c010ff/src/pyk/cterm/symbolic.py#L68, we have a call to the execute
endpoint of the RPC server. But where the call to the RPC server is made, we are not handling any exceptions that the server can throw.Instead, we can put the call to the RPC server in a try ... except ...:
block, so that we can catch the raised error and pretty print the kore term. Something like this:
try:
response = self._kore_client.execute(...)
except SMTSolverError as err:
pretty_print(err.pattern)
The file symbolic.py
can't do pretty-printing right now, because it doesn't have a pretty printer. Options are:
PrettyPrinter
class from kast.pretty
, then do something like:kast = self.kore_to_kast(err.pattern)
pretty_pattern = PrettyPrinter(self._definition).print(kast)
sys.stderr.write(f'{pretty_pattern}')
CTermExecute
return type to allow returning also an error result. For example, subclass CTermExecute
into CTermExecuteSuccess
aond CTermExecuteFailure
, and pass the SMTSolverError
up in the CTermExecuteFailure
.cterm_symbolic.execute
is used (one example: https://github.com/runtimeverification/pyk/blob/6fbcf413a8c9058241e8d7aa26dc5a4020c010ff/src/pyk/kcfg/explore.py#L161), and modify those locations to handle the failure information.To force the smt solver to timeout, make sure to pass --smt-timeout 10
or something very small.
Related: https://github.com/runtimeverification/kontrol/issues/21
When the proof crashes due to an SMT error, the term causing it is printed out. However, in most cases, the term is hard to read. It would be helpful to pretty-print the term so users can more easily reason about it and perhaps write lemmas that can simplify it and solve the error.
Example of an SMT error:
Steps to reproduce it:
cd src/tests/smt-error
kontrol build
kontrol prove --match-test factor