3
0
Fork 0
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:
Nikolaj Bjorner 2017-10-25 20:53:10 -07:00
parent e7aa6455bc
commit c886b6d500
3 changed files with 30 additions and 13 deletions

View file

@ -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);
} }

View file

@ -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();

View file

@ -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,