mirror of
https://github.com/Z3Prover/z3
synced 2025-07-20 11:22:04 +00:00
fix #1330. Interpolation transformation needs to handle TRANSITIVITY_STAR
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
e7aa6455bc
commit
c886b6d500
3 changed files with 30 additions and 13 deletions
|
@ -57,9 +57,9 @@ typedef ast raw_ast;
|
||||||
|
|
||||||
/** Wrapper around an ast pointer */
|
/** Wrapper around an ast pointer */
|
||||||
class ast_i {
|
class ast_i {
|
||||||
protected:
|
protected:
|
||||||
raw_ast *_ast;
|
raw_ast *_ast;
|
||||||
public:
|
public:
|
||||||
raw_ast * const &raw() const {return _ast;}
|
raw_ast * const &raw() const {return _ast;}
|
||||||
ast_i(raw_ast *a){_ast = a;}
|
ast_i(raw_ast *a){_ast = a;}
|
||||||
|
|
||||||
|
@ -86,15 +86,15 @@ class ast_i {
|
||||||
/** Reference counting verison of above */
|
/** Reference counting verison of above */
|
||||||
class ast_r : public ast_i {
|
class ast_r : public ast_i {
|
||||||
ast_manager *_m;
|
ast_manager *_m;
|
||||||
public:
|
public:
|
||||||
ast_r(ast_manager *m, raw_ast *a) : ast_i(a) {
|
ast_r(ast_manager *m, raw_ast *a) : ast_i(a) {
|
||||||
_m = m;
|
_m = m;
|
||||||
m->inc_ref(a);
|
m->inc_ref(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_r() {_m = 0;}
|
ast_r() {_m = 0;}
|
||||||
|
|
||||||
ast_r(const ast_r &other) : ast_i(other) {
|
ast_r(const ast_r &other) : ast_i(other) {
|
||||||
_m = other._m;
|
_m = other._m;
|
||||||
if (_m) _m->inc_ref(_ast);
|
if (_m) _m->inc_ref(_ast);
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ class ast_r : public ast_i {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
~ast_r(){
|
~ast_r() {
|
||||||
if(_ast)
|
if(_ast)
|
||||||
_m->dec_ref(_ast);
|
_m->dec_ref(_ast);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "interp/iz3profiling.h"
|
#include "interp/iz3profiling.h"
|
||||||
#include "interp/iz3interp.h"
|
#include "interp/iz3interp.h"
|
||||||
#include "interp/iz3proof_itp.h"
|
#include "interp/iz3proof_itp.h"
|
||||||
|
#include "ast/ast_pp.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -1851,6 +1852,21 @@ public:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PR_TRANSITIVITY_STAR: {
|
||||||
|
// assume the premises are x = y, y = z, z = u, u = v, ..
|
||||||
|
|
||||||
|
ast x = arg(conc(prem(proof,0)),0);
|
||||||
|
ast y = arg(conc(prem(proof,0)),1);
|
||||||
|
ast z = arg(conc(prem(proof,1)),1);
|
||||||
|
res = iproof->make_transitivity(x,y,z,args[0],args[1]);
|
||||||
|
|
||||||
|
for (unsigned i = 2; i < nprems; ++i) {
|
||||||
|
y = z;
|
||||||
|
z = arg(conc(prem(proof,i)),1);
|
||||||
|
res = iproof->make_transitivity(x,y,z,res,args[i]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PR_QUANT_INTRO:
|
case PR_QUANT_INTRO:
|
||||||
case PR_MONOTONICITY:
|
case PR_MONOTONICITY:
|
||||||
{
|
{
|
||||||
|
@ -2029,6 +2045,7 @@ public:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
IF_VERBOSE(0, verbose_stream() << "Unsupported proof rule: " << expr_ref((expr*)proof.raw(), *proof.mgr()) << "\n";);
|
||||||
// pfgoto(proof);
|
// pfgoto(proof);
|
||||||
// SASSERT(0 && "translate_main: unsupported proof rule");
|
// SASSERT(0 && "translate_main: unsupported proof rule");
|
||||||
throw unsupported();
|
throw unsupported();
|
||||||
|
|
|
@ -36,7 +36,7 @@ class iz3translation : public iz3base {
|
||||||
|
|
||||||
/** This is thrown when the proof cannot be translated. */
|
/** This is thrown when the proof cannot be translated. */
|
||||||
struct unsupported: public iz3_exception {
|
struct unsupported: public iz3_exception {
|
||||||
unsupported(): iz3_exception("unsupported") {}
|
unsupported(): iz3_exception("unsupported") { }
|
||||||
};
|
};
|
||||||
|
|
||||||
static iz3translation *create(iz3mgr &mgr,
|
static iz3translation *create(iz3mgr &mgr,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue