3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-20 12:53:38 +00:00

Merge branch 'unstable' of https://github.com/Z3Prover/z3 into unstable

This commit is contained in:
Christoph M. Wintersteiger 2015-04-17 16:10:13 +01:00
commit 7e6ab736c0
38 changed files with 20225 additions and 20225 deletions

View file

@ -1,20 +1,20 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
api_interp.cpp api_interp.cpp
Abstract: Abstract:
API for interpolation API for interpolation
Author: Author:
Ken McMillan Ken McMillan
Revision History: Revision History:
--*/ --*/
#include<iostream> #include<iostream>
#include<sstream> #include<sstream>
#include<vector> #include<vector>
@ -643,69 +643,69 @@ extern "C" {
#define IZ3_ROOT SHRT_MAX #define IZ3_ROOT SHRT_MAX
/** This function uses Z3 to determine satisfiability of a set of /** This function uses Z3 to determine satisfiability of a set of
constraints. If UNSAT, an interpolant is returned, based on the constraints. If UNSAT, an interpolant is returned, based on the
refutation generated by Z3. If SAT, a model is returned. refutation generated by Z3. If SAT, a model is returned.
If "parents" is non-null, computes a tree interpolant. The tree is If "parents" is non-null, computes a tree interpolant. The tree is
defined by the array "parents". This array maps each formula in defined by the array "parents". This array maps each formula in
the tree to its parent, where formulas are indicated by their the tree to its parent, where formulas are indicated by their
integer index in "cnsts". The parent of formula n must have index integer index in "cnsts". The parent of formula n must have index
greater than n. The last formula is the root of the tree. Its greater than n. The last formula is the root of the tree. Its
parent entry should be the constant IZ3_ROOT. parent entry should be the constant IZ3_ROOT.
If "parents" is null, computes a sequence interpolant. If "parents" is null, computes a sequence interpolant.
\param ctx The Z3 context. Must be generated by iz3_mk_context \param ctx The Z3 context. Must be generated by iz3_mk_context
\param num The number of constraints in the sequence \param num The number of constraints in the sequence
\param cnsts Array of constraints (AST's in context ctx) \param cnsts Array of constraints (AST's in context ctx)
\param parents The parents vector defining the tree structure \param parents The parents vector defining the tree structure
\param options Interpolation options (may be NULL) \param options Interpolation options (may be NULL)
\param interps Array to return interpolants (size at least num-1, may be NULL) \param interps Array to return interpolants (size at least num-1, may be NULL)
\param model Returns a Z3 model if constraints SAT (may be NULL) \param model Returns a Z3 model if constraints SAT (may be NULL)
\param labels Returns relevant labels if SAT (may be NULL) \param labels Returns relevant labels if SAT (may be NULL)
\param incremental \param incremental
VERY IMPORTANT: All the Z3 formulas in cnsts must be in Z3 VERY IMPORTANT: All the Z3 formulas in cnsts must be in Z3
context ctx. The model and interpolants returned are also context ctx. The model and interpolants returned are also
in this context. in this context.
The return code is as in Z3_check_assumptions, that is, The return code is as in Z3_check_assumptions, that is,
Z3_L_FALSE = constraints UNSAT (interpolants returned) Z3_L_FALSE = constraints UNSAT (interpolants returned)
Z3_L_TRUE = constraints SAT (model returned) Z3_L_TRUE = constraints SAT (model returned)
Z3_L_UNDEF = Z3 produced no result, or interpolation not possible Z3_L_UNDEF = Z3 produced no result, or interpolation not possible
Currently, this function supports integer and boolean variables, Currently, this function supports integer and boolean variables,
as well as arrays over these types, with linear arithmetic, as well as arrays over these types, with linear arithmetic,
uninterpreted functions and quantifiers over integers (that is uninterpreted functions and quantifiers over integers (that is
AUFLIA). Interpolants are produced in AULIA. However, some AUFLIA). Interpolants are produced in AULIA. However, some
uses of array operations may cause quantifiers to appear in the uses of array operations may cause quantifiers to appear in the
interpolants even when there are no quantifiers in the input formulas. interpolants even when there are no quantifiers in the input formulas.
Although quantifiers may appear in the input formulas, Z3 may give up in Although quantifiers may appear in the input formulas, Z3 may give up in
this case, returning Z3_L_UNDEF. this case, returning Z3_L_UNDEF.
If "incremental" is true, cnsts must contain exactly the set of If "incremental" is true, cnsts must contain exactly the set of
formulas that are currently asserted in the context. If false, formulas that are currently asserted in the context. If false,
there must be no formulas currently asserted in the context. there must be no formulas currently asserted in the context.
Setting "incremental" to true makes it posisble to incrementally Setting "incremental" to true makes it posisble to incrementally
add and remove constraints from the context until the context add and remove constraints from the context until the context
becomes UNSAT, at which point an interpolant is computed. Caution becomes UNSAT, at which point an interpolant is computed. Caution
must be used, however. Before popping the context, if you wish to must be used, however. Before popping the context, if you wish to
keep the interolant formulas, you *must* preserve them by using keep the interolant formulas, you *must* preserve them by using
Z3_persist_ast. Also, if you want to simplify the interpolant Z3_persist_ast. Also, if you want to simplify the interpolant
formulas using Z3_simplify, you must first pop all of the formulas using Z3_simplify, you must first pop all of the
assertions in the context (or use a different context). Otherwise, assertions in the context (or use a different context). Otherwise,
the formulas will be simplified *relative* to these constraints, the formulas will be simplified *relative* to these constraints,
which is almost certainly not what you want. which is almost certainly not what you want.
Current limitations on tree interpolants. In a tree interpolation Current limitations on tree interpolants. In a tree interpolation
problem, each constant (0-ary function symbol) must occur only problem, each constant (0-ary function symbol) must occur only
along one path from root to leaf. Function symbols (of arity > 0) along one path from root to leaf. Function symbols (of arity > 0)
are considered to have global scope (i.e., may appear in any are considered to have global scope (i.e., may appear in any
interpolant formula). interpolant formula).
def_API('Z3_interpolate', BOOL, (_in(CONTEXT), _in(UINT), _in_array(1, AST), _in_array(1, UINT), _in(PARAMS), _out_array(1, AST), _out(MODEL), _out(LITERALS), _in(UINT), _in(UINT), _in_array(9, AST))) def_API('Z3_interpolate', BOOL, (_in(CONTEXT), _in(UINT), _in_array(1, AST), _in_array(1, UINT), _in(PARAMS), _out_array(1, AST), _out(MODEL), _out(LITERALS), _in(UINT), _in(UINT), _in_array(9, AST)))
*/ */
Z3_lbool Z3_API Z3_interpolate(__in Z3_context ctx, Z3_lbool Z3_API Z3_interpolate(__in Z3_context ctx,

View file

@ -1,20 +1,20 @@
/*++ /*++
Copyright (c) 2013 Microsoft Corporation Copyright (c) 2013 Microsoft Corporation
Module Name: Module Name:
interpolant_cmds.cpp interpolant_cmds.cpp
Abstract: Abstract:
Commands for interpolation. Commands for interpolation.
Author: Author:
Leonardo (leonardo) 2011-12-23 Leonardo (leonardo) 2011-12-23
Notes: Notes:
--*/ --*/
#include<sstream> #include<sstream>
#include"cmd_context.h" #include"cmd_context.h"
#include"cmd_util.h" #include"cmd_util.h"

View file

@ -1,20 +1,20 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
interpolant_cmds.h interpolant_cmds.h
Abstract: Abstract:
Commands for interpolation. Commands for interpolation.
Author: Author:
Leonardo (leonardo) 2011-12-23 Leonardo (leonardo) 2011-12-23
Notes: Notes:
--*/ --*/
#ifndef _INTERPOLANT_CMDS_H_ #ifndef _INTERPOLANT_CMDS_H_
#define _INTERPOLANT_CMDS_H_ #define _INTERPOLANT_CMDS_H_

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2012 Microsoft Corporation Copyright (c) 2012 Microsoft Corporation
Module Name: Module Name:
duality.h duality.h
Abstract: Abstract:
main header for duality main header for duality
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#pragma once #pragma once
@ -109,7 +109,7 @@ namespace Duality {
Term ExtractStores(hash_map<ast, Term> &memo, const Term &t, std::vector<expr> &cnstrs, hash_map<ast,expr> &renaming); Term ExtractStores(hash_map<ast, Term> &memo, const Term &t, std::vector<expr> &cnstrs, hash_map<ast,expr> &renaming);
protected: protected:
void SummarizeRec(hash_set<ast> &memo, std::vector<expr> &lits, int &ops, const Term &t); void SummarizeRec(hash_set<ast> &memo, std::vector<expr> &lits, int &ops, const Term &t);
int CountOperatorsRec(hash_set<ast> &memo, const Term &t); int CountOperatorsRec(hash_set<ast> &memo, const Term &t);
@ -126,7 +126,7 @@ protected:
Term DeleteBoundRec(hash_map<int,hash_map<ast,Term> > &memo, int level, int num, const Term &t); Term DeleteBoundRec(hash_map<int,hash_map<ast,Term> > &memo, int level, int num, const Term &t);
Term DeleteBound(int level, int num, const Term &t); Term DeleteBound(int level, int num, const Term &t);
}; };
/** This class represents a relation post-fixed point (RPFP) problem as /** This class represents a relation post-fixed point (RPFP) problem as
* a "problem graph". The graph consists of Nodes and hyper-edges. * a "problem graph". The graph consists of Nodes and hyper-edges.

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
duality_profiling.cpp duality_profiling.cpp
Abstract: Abstract:
collection performance information for duality collection performance information for duality
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#include <map> #include <map>

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
duality_profiling.h duality_profiling.h
Abstract: Abstract:
collection performance information for duality collection performance information for duality
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef DUALITYPROFILING_H #ifndef DUALITYPROFILING_H
#define DUALITYPROFILING_H #define DUALITYPROFILING_H

View file

@ -1,23 +1,23 @@
/*++ /*++
Copyright (c) 2012 Microsoft Corporation Copyright (c) 2012 Microsoft Corporation
Module Name: Module Name:
duality_rpfp.h duality_rpfp.h
Abstract: Abstract:
implements relational post-fixedpoint problem implements relational post-fixedpoint problem
(RPFP) data structure. (RPFP) data structure.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
@ -40,7 +40,7 @@ Revision History:
#ifdef Z3OPS #ifdef Z3OPS
class Z3_subterm_truth { class Z3_subterm_truth {
public: public:
virtual bool eval(Z3_ast f) = 0; virtual bool eval(Z3_ast f) = 0;
~Z3_subterm_truth(){} ~Z3_subterm_truth(){}
}; };
@ -1642,7 +1642,7 @@ namespace Duality {
else else
res = 2; res = 2;
} }
done: done:
memo[f] = res; memo[f] = res;
return res; return res;
} }
@ -1729,7 +1729,7 @@ done:
else else
res = 2; res = 2;
} }
done: done:
memo[labpos][f] = res; memo[labpos][f] = res;
return res; return res;
} }
@ -1873,7 +1873,7 @@ done:
lits.push_back(bv); lits.push_back(bv);
} }
} }
done: done:
done[truth].insert(f); done[truth].insert(f);
} }
@ -1907,7 +1907,7 @@ done:
lits.push_back(bv); lits.push_back(bv);
} }
} }
done: done:
done.insert(f); done.insert(f);
} }
@ -2009,9 +2009,9 @@ done:
RPFP::Term RPFP::UnderapproxFormula(const Term &f, hash_set<ast> &dont_cares){ RPFP::Term RPFP::UnderapproxFormula(const Term &f, hash_set<ast> &dont_cares){
/* first compute truth values of subterms */ /* first compute truth values of subterms */
hash_map<ast,int> memo; hash_map<ast,int> memo;
#ifdef Z3OPS #ifdef Z3OPS
stt = Z3_mk_subterm_truth(ctx,dualModel); stt = Z3_mk_subterm_truth(ctx,dualModel);
#endif #endif
// SubtermTruth(memo,f); // SubtermTruth(memo,f);
/* now compute an implicant */ /* now compute an implicant */
std::vector<Term> lits; std::vector<Term> lits;
@ -4276,7 +4276,7 @@ done:
return false; return false;
} }
RPFP::~RPFP(){ RPFP::~RPFP(){
ClearProofCore(); ClearProofCore();
for(unsigned i = 0; i < nodes.size(); i++) for(unsigned i = 0; i < nodes.size(); i++)
delete nodes[i]; delete nodes[i];

View file

@ -1,23 +1,23 @@
/*++ /*++
Copyright (c) 2012 Microsoft Corporation Copyright (c) 2012 Microsoft Corporation
Module Name: Module Name:
duality_solver.h duality_solver.h
Abstract: Abstract:
implements relational post-fixedpoint problem implements relational post-fixedpoint problem
(RPFP) solver (RPFP) solver
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
#pragma warning(disable:4996) #pragma warning(disable:4996)

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2012 Microsoft Corporation Copyright (c) 2012 Microsoft Corporation
Module Name: Module Name:
wrapper.cpp wrapper.cpp
Abstract: Abstract:
wrap various objects in the style expected by duality wrap various objects in the style expected by duality
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
#pragma warning(disable:4996) #pragma warning(disable:4996)
@ -57,12 +57,12 @@ namespace Duality {
m_mode = m().proof_mode(); m_mode = m().proof_mode();
} }
expr context::constant(const std::string &name, const sort &ty){ expr context::constant(const std::string &name, const sort &ty){
symbol s = str_symbol(name.c_str()); symbol s = str_symbol(name.c_str());
return cook(m().mk_const(m().mk_const_decl(s, ty))); return cook(m().mk_const(m().mk_const_decl(s, ty)));
} }
expr context::make(decl_kind op, int n, ::expr **args){ expr context::make(decl_kind op, int n, ::expr **args){
switch(op) { switch(op) {
case True: return mki(m_basic_fid,OP_TRUE,n,args); case True: return mki(m_basic_fid,OP_TRUE,n,args);
case False: return mki(m_basic_fid,OP_FALSE,n,args); case False: return mki(m_basic_fid,OP_FALSE,n,args);
@ -108,46 +108,46 @@ expr context::make(decl_kind op, int n, ::expr **args){
assert(0); assert(0);
return expr(*this); return expr(*this);
} }
} }
expr context::mki(family_id fid, ::decl_kind dk, int n, ::expr **args){ expr context::mki(family_id fid, ::decl_kind dk, int n, ::expr **args){
return cook(m().mk_app(fid, dk, 0, 0, n, (::expr **)args)); return cook(m().mk_app(fid, dk, 0, 0, n, (::expr **)args));
} }
expr context::make(decl_kind op, const std::vector<expr> &args){ expr context::make(decl_kind op, const std::vector<expr> &args){
static std::vector< ::expr*> a(10); static std::vector< ::expr*> a(10);
if(a.size() < args.size()) if(a.size() < args.size())
a.resize(args.size()); a.resize(args.size());
for(unsigned i = 0; i < args.size(); i++) for(unsigned i = 0; i < args.size(); i++)
a[i] = to_expr(args[i].raw()); a[i] = to_expr(args[i].raw());
return make(op,args.size(), args.size() ? &a[0] : 0); return make(op,args.size(), args.size() ? &a[0] : 0);
} }
expr context::make(decl_kind op){ expr context::make(decl_kind op){
return make(op,0,0); return make(op,0,0);
} }
expr context::make(decl_kind op, const expr &arg0){ expr context::make(decl_kind op, const expr &arg0){
::expr *a = to_expr(arg0.raw()); ::expr *a = to_expr(arg0.raw());
return make(op,1,&a); return make(op,1,&a);
} }
expr context::make(decl_kind op, const expr &arg0, const expr &arg1){ expr context::make(decl_kind op, const expr &arg0, const expr &arg1){
::expr *args[2]; ::expr *args[2];
args[0] = to_expr(arg0.raw()); args[0] = to_expr(arg0.raw());
args[1] = to_expr(arg1.raw()); args[1] = to_expr(arg1.raw());
return make(op,2,args); return make(op,2,args);
} }
expr context::make(decl_kind op, const expr &arg0, const expr &arg1, const expr &arg2){ expr context::make(decl_kind op, const expr &arg0, const expr &arg1, const expr &arg2){
::expr *args[3]; ::expr *args[3];
args[0] = to_expr(arg0.raw()); args[0] = to_expr(arg0.raw());
args[1] = to_expr(arg1.raw()); args[1] = to_expr(arg1.raw());
args[2] = to_expr(arg2.raw()); args[2] = to_expr(arg2.raw());
return make(op,3,args); return make(op,3,args);
} }
expr context::make_quant(decl_kind op, const std::vector<expr> &bvs, const expr &body){ expr context::make_quant(decl_kind op, const std::vector<expr> &bvs, const expr &body){
if(bvs.size() == 0) return body; if(bvs.size() == 0) return body;
std::vector< ::expr *> foo(bvs.size()); std::vector< ::expr *> foo(bvs.size());
@ -177,9 +177,9 @@ expr context::make_quant(decl_kind op, const std::vector<expr> &bvs, const expr
0, 0 0, 0
); );
return cook(result.get()); return cook(result.get());
} }
expr context::make_quant(decl_kind op, const std::vector<sort> &_sorts, const std::vector<symbol> &_names, const expr &body){ expr context::make_quant(decl_kind op, const std::vector<sort> &_sorts, const std::vector<symbol> &_names, const expr &body){
if(_sorts.size() == 0) return body; if(_sorts.size() == 0) return body;
@ -203,7 +203,7 @@ expr context::make_quant(decl_kind op, const std::vector<sort> &_sorts, const st
0, 0 0, 0
); );
return cook(result.get()); return cook(result.get());
} }
decl_kind func_decl::get_decl_kind() const { decl_kind func_decl::get_decl_kind() const {

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2012 Microsoft Corporation Copyright (c) 2012 Microsoft Corporation
Module Name: Module Name:
duality_wrapper.h duality_wrapper.h
Abstract: Abstract:
wrap various Z3 classes in the style expected by duality wrap various Z3 classes in the style expected by duality
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef __DUALITY_WRAPPER_H_ #ifndef __DUALITY_WRAPPER_H_
#define __DUALITY_WRAPPER_H_ #define __DUALITY_WRAPPER_H_

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
foci2.h foci2.h
Abstract: Abstract:
An interface class for foci2. An interface class for foci2.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef FOCI2_H #ifndef FOCI2_H
#define FOCI2_H #define FOCI2_H

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3base.cpp iz3base.cpp
Abstract: Abstract:
Base class for interpolators. Includes an AST manager and a scoping Base class for interpolators. Includes an AST manager and a scoping
object as bases. object as bases.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
#pragma warning(disable:4996) #pragma warning(disable:4996)

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3base.h iz3base.h
Abstract: Abstract:
Base class for interpolators. Includes an AST manager and a scoping Base class for interpolators. Includes an AST manager and a scoping
object as bases. object as bases.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3BASE_H #ifndef IZ3BASE_H
#define IZ3BASE_H #define IZ3BASE_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3checker.cpp iz3checker.cpp
Abstract: Abstract:
check correctness of interpolant check correctness of interpolant
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
#pragma warning(disable:4996) #pragma warning(disable:4996)

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3checker.h iz3checker.h
Abstract: Abstract:
check correctness of an interpolant check correctness of an interpolant
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3_CHECKER_H #ifndef IZ3_CHECKER_H
#define IZ3_CHECKER_H #define IZ3_CHECKER_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3foci.cpp iz3foci.cpp
Abstract: Abstract:
Implements a secondary solver using foci2. Implements a secondary solver using foci2.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#include <sstream> #include <sstream>
#include <iostream> #include <iostream>

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3foci.h iz3foci.h
Abstract: Abstract:
Implements a secondary solver using foci2. Implements a secondary solver using foci2.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3FOCI_H #ifndef IZ3FOCI_H
#define IZ3FOCI_H #define IZ3FOCI_H

View file

@ -1,11 +1,11 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3hash.h iz3hash.h
Abstract: Abstract:
Simple implementation of bucket-list hash tables conforming to SGI Simple implementation of bucket-list hash tables conforming to SGI
hash_map and hash_set interfaces. Just enough members are hash_map and hash_set interfaces. Just enough members are
@ -18,13 +18,13 @@ Abstract:
This package lives in namespace hash_space. Specializations of This package lives in namespace hash_space. Specializations of
class "hash" should be made in this namespace. class "hash" should be made in this namespace.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3_HASH_H #ifndef IZ3_HASH_H
#define IZ3_HASH_H #define IZ3_HASH_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3interp.cpp iz3interp.cpp
Abstract: Abstract:
Interpolation based on proof translation. Interpolation based on proof translation.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
/* Copyright 2011 Microsoft Research. */ /* Copyright 2011 Microsoft Research. */

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3interp.h iz3interp.h
Abstract: Abstract:
Interpolation based on proof translation. Interpolation based on proof translation.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3_INTERP_H #ifndef IZ3_INTERP_H
#define IZ3_INTERP_H #define IZ3_INTERP_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3mgr.cpp iz3mgr.cpp
Abstract: Abstract:
A wrapper around an ast manager, providing convenience methods. A wrapper around an ast manager, providing convenience methods.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
@ -648,7 +648,7 @@ void iz3mgr::get_assign_bounds_rule_coeffs(const ast &proof, std::vector<rationa
extract_lcd(rats); extract_lcd(rats);
} }
/** Set P to P + cQ, where P and Q are linear inequalities. Assumes P is 0 <= y or 0 < y. */ /** Set P to P + cQ, where P and Q are linear inequalities. Assumes P is 0 <= y or 0 < y. */
void iz3mgr::linear_comb(ast &P, const ast &c, const ast &Q, bool round_off){ void iz3mgr::linear_comb(ast &P, const ast &c, const ast &Q, bool round_off){
ast Qrhs; ast Qrhs;
@ -825,7 +825,7 @@ iz3mgr::ast iz3mgr::cont_eq(stl_ext::hash_set<ast> &cont_eq_memo, bool truth, as
return ast(); return ast();
} }
// substitute a term t for unbound occurrences of variable v in e // substitute a term t for unbound occurrences of variable v in e
iz3mgr::ast iz3mgr::subst(stl_ext::hash_map<ast,ast> &subst_memo, ast var, ast t, ast e){ iz3mgr::ast iz3mgr::subst(stl_ext::hash_map<ast,ast> &subst_memo, ast var, ast t, ast e){
if(e == var) return t; if(e == var) return t;
@ -865,9 +865,9 @@ iz3mgr::ast iz3mgr::subst(stl_ext::hash_map<ast,ast> &subst_memo,ast e){
return res; return res;
} }
// apply a quantifier to a formula, with some optimizations // apply a quantifier to a formula, with some optimizations
// 1) bound variable does not occur -> no quantifier // 1) bound variable does not occur -> no quantifier
// 2) bound variable must be equal to some term -> substitute // 2) bound variable must be equal to some term -> substitute
iz3mgr::ast iz3mgr::apply_quant(opr quantifier, ast var, ast e){ iz3mgr::ast iz3mgr::apply_quant(opr quantifier, ast var, ast e){
if((quantifier == Forall && op(e) == And) if((quantifier == Forall && op(e) == And)
@ -896,5 +896,5 @@ void iz3mgr::get_bound_substitutes(stl_ext::hash_map<ast,bool> &memo, const ast
if(op(e) == if(op(e) ==
} }
} }
#endif #endif

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3mgr.h iz3mgr.h
Abstract: Abstract:
A wrapper around an ast manager, providing convenience methods. A wrapper around an ast manager, providing convenience methods.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3MGR_H #ifndef IZ3MGR_H
#define IZ3MGR_H #define IZ3MGR_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2013 Microsoft Corporation Copyright (c) 2013 Microsoft Corporation
Module Name: Module Name:
iz3pp.cpp iz3pp.cpp
Abstract: Abstract:
Pretty-print interpolation problems Pretty-print interpolation problems
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
/* Copyright 2011 Microsoft Research. */ /* Copyright 2011 Microsoft Research. */
#include <assert.h> #include <assert.h>

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2013 Microsoft Corporation Copyright (c) 2013 Microsoft Corporation
Module Name: Module Name:
iz3pp.cpp iz3pp.cpp
Abstract: Abstract:
Pretty-print interpolation problems Pretty-print interpolation problems
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3_PP_H #ifndef IZ3_PP_H
#define IZ3_PP_H #define IZ3_PP_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3profiling.h iz3profiling.h
Abstract: Abstract:
Some routines for measuring performance. Some routines for measuring performance.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
#pragma warning(disable:4996) #pragma warning(disable:4996)

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3profiling.h iz3profiling.h
Abstract: Abstract:
Some routines for measuring performance. Some routines for measuring performance.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3PROFILING_H #ifndef IZ3PROFILING_H
#define IZ3PROFILING_H #define IZ3PROFILING_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3proof.cpp iz3proof.cpp
Abstract: Abstract:
This class defines a simple interpolating proof system. This class defines a simple interpolating proof system.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
@ -436,12 +436,12 @@ void iz3proof::interpolate_lemma(node_struct &n){
pv->interpolate_clause(n.conclusion,interps[n.frame]); pv->interpolate_clause(n.conclusion,interps[n.frame]);
} }
iz3proof::ast iz3proof::interpolate(const prover::range &_rng, bool _weak iz3proof::ast iz3proof::interpolate(const prover::range &_rng, bool _weak
#ifdef CHECK_PROOFS #ifdef CHECK_PROOFS
, ast assump , ast assump
, std::vector<int> *parents , std::vector<int> *parents
#endif #endif
){ ){
// std::cout << "proof size: " << nodes.size() << "\n"; // std::cout << "proof size: " << nodes.size() << "\n";
rng = _rng; rng = _rng;
weak = _weak; weak = _weak;

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3proof.h iz3proof.h
Abstract: Abstract:
This class defines a simple interpolating proof system. This class defines a simple interpolating proof system.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3PROOF_H #ifndef IZ3PROOF_H
#define IZ3PROOF_H #define IZ3PROOF_H
@ -40,7 +40,7 @@ Revision History:
rules Resolution, Assumption, Contra and Lemma, and that all rules Resolution, Assumption, Contra and Lemma, and that all
clauses are strict (i.e., each literal in each clause is local). clauses are strict (i.e., each literal in each clause is local).
*/ */
class iz3proof { class iz3proof {
public: public:

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3proof.cpp iz3proof.cpp
Abstract: Abstract:
This class defines a simple interpolating proof system. This class defines a simple interpolating proof system.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
#pragma warning(disable:4996) #pragma warning(disable:4996)

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3proof.h iz3proof.h
Abstract: Abstract:
This class defines a simple interpolating proof system. This class defines a simple interpolating proof system.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3PROOF_ITP_H #ifndef IZ3PROOF_ITP_H
#define IZ3PROOF_ITP_H #define IZ3PROOF_ITP_H
@ -32,7 +32,7 @@ Revision History:
As opposed to iz3proof, this class directly computes interpolants, As opposed to iz3proof, this class directly computes interpolants,
so the proof representation is just the interpolant itself. so the proof representation is just the interpolant itself.
*/ */
class iz3proof_itp : public iz3mgr { class iz3proof_itp : public iz3mgr {
public: public:

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3scopes.cpp iz3scopes.cpp
Abstract: Abstract:
Calculations with scopes, for both sequence and tree interpolation. Calculations with scopes, for both sequence and tree interpolation.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#include <assert.h> #include <assert.h>
@ -85,7 +85,7 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
#else #else
namespace std { namespace std {
template <> template <>
class hash<scopes::range_lo > { class hash<scopes::range_lo > {
public: public:
@ -93,16 +93,16 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
return p.lo + (size_t)p.next; return p.lo + (size_t)p.next;
} }
}; };
} }
template <> inline template <> inline
size_t stdext::hash_value<scopes::range_lo >(const scopes::range_lo& p) size_t stdext::hash_value<scopes::range_lo >(const scopes::range_lo& p)
{ {
std::hash<scopes::range_lo> h; std::hash<scopes::range_lo> h;
return h(p); return h(p);
} }
namespace std { namespace std {
template <> template <>
class less<scopes::range_lo > { class less<scopes::range_lo > {
public: public:
@ -110,18 +110,18 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
return x.lo < y.lo || x.lo == y.lo && (size_t)x.next < (size_t)y.next; return x.lo < y.lo || x.lo == y.lo && (size_t)x.next < (size_t)y.next;
} }
}; };
} }
struct range_op { struct range_op {
scopes::range_lo *x, *y; scopes::range_lo *x, *y;
int hi; int hi;
range_op(scopes::range_lo *_x, scopes::range_lo *_y, int _hi){ range_op(scopes::range_lo *_x, scopes::range_lo *_y, int _hi){
x = _x; y = _y; hi = _hi; x = _x; y = _y; hi = _hi;
} }
}; };
namespace std { namespace std {
template <> template <>
class hash<range_op > { class hash<range_op > {
public: public:
@ -129,16 +129,16 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
return (size_t) p.x + (size_t)p.y + p.hi; return (size_t) p.x + (size_t)p.y + p.hi;
} }
}; };
} }
template <> inline template <> inline
size_t stdext::hash_value<range_op >(const range_op& p) size_t stdext::hash_value<range_op >(const range_op& p)
{ {
std::hash<range_op> h; std::hash<range_op> h;
return h(p); return h(p);
} }
namespace std { namespace std {
template <> template <>
class less<range_op > { class less<range_op > {
public: public:
@ -147,16 +147,16 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
((size_t)x.y < (size_t)y.y || x.y == y.y && x.hi < y.hi); ((size_t)x.y < (size_t)y.y || x.y == y.y && x.hi < y.hi);
} }
}; };
} }
struct range_tables { struct range_tables {
hash_map<scopes::range_lo, scopes::range_lo *> unique; hash_map<scopes::range_lo, scopes::range_lo *> unique;
hash_map<range_op,scopes::range_lo *> lub; hash_map<range_op,scopes::range_lo *> lub;
hash_map<range_op,scopes::range_lo *> glb; hash_map<range_op,scopes::range_lo *> glb;
}; };
scopes::range_lo *scopes::find_range_lo(int lo, range_lo *next){ scopes::range_lo *scopes::find_range_lo(int lo, range_lo *next){
range_lo foo(lo,next); range_lo foo(lo,next);
std::pair<range_lo,range_lo *> baz(foo,(range_lo *)0); std::pair<range_lo,range_lo *> baz(foo,(range_lo *)0);
std::pair<hash_map<range_lo,scopes::range_lo *>::iterator,bool> bar = rt->unique.insert(baz); std::pair<hash_map<range_lo,scopes::range_lo *>::iterator,bool> bar = rt->unique.insert(baz);
@ -166,9 +166,9 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
//std::pair<hash_set<scopes::range_lo>::iterator,bool> bar = rt->unique.insert(foo); //std::pair<hash_set<scopes::range_lo>::iterator,bool> bar = rt->unique.insert(foo);
// const range_lo *baz = &*(bar.first); // const range_lo *baz = &*(bar.first);
// return (range_lo *)baz; // coerce const // return (range_lo *)baz; // coerce const
} }
scopes::range_lo *scopes::range_lub_lo(range_lo *rng1, range_lo *rng2){ scopes::range_lo *scopes::range_lub_lo(range_lo *rng1, range_lo *rng2){
if(!rng1) return rng2; if(!rng1) return rng2;
if(!rng2) return rng1; if(!rng2) return rng1;
if(rng1->lo > rng2->lo) if(rng1->lo > rng2->lo)
@ -185,10 +185,10 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
range_lo *baz = range_lub_lo(rng1->next,rng2); range_lo *baz = range_lub_lo(rng1->next,rng2);
res = find_range_lo(rng1->lo,baz); res = find_range_lo(rng1->lo,baz);
return res; return res;
} }
scopes::range_lo *scopes::range_glb_lo(range_lo *rng1, range_lo *rng2, int hi){ scopes::range_lo *scopes::range_glb_lo(range_lo *rng1, range_lo *rng2, int hi){
if(!rng1) return rng1; if(!rng1) return rng1;
if(!rng2) return rng2; if(!rng2) return rng2;
if(rng1->lo > rng2->lo) if(rng1->lo > rng2->lo)
@ -216,55 +216,55 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
else foo = range_glb_lo(rng1->next,rng2,hi); else foo = range_glb_lo(rng1->next,rng2,hi);
res = foo; res = foo;
return res; return res;
} }
/** computes the lub (smallest containing subtree) of two ranges */ /** computes the lub (smallest containing subtree) of two ranges */
scopes::range scopes::range_lub(const range &rng1, const range &rng2){ scopes::range scopes::range_lub(const range &rng1, const range &rng2){
int hi = tree_lca(rng1.hi,rng2.hi); int hi = tree_lca(rng1.hi,rng2.hi);
if(hi == SHRT_MAX) return range_full(); if(hi == SHRT_MAX) return range_full();
range_lo *lo = range_lub_lo(rng1.lo,rng2.lo); range_lo *lo = range_lub_lo(rng1.lo,rng2.lo);
return range(hi,lo); return range(hi,lo);
} }
/** computes the glb (intersection) of two ranges */ /** computes the glb (intersection) of two ranges */
scopes::range scopes::range_glb(const range &rng1, const range &rng2){ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
if(rng1.hi == SHRT_MAX) return rng2; if(rng1.hi == SHRT_MAX) return rng2;
if(rng2.hi == SHRT_MAX) return rng1; if(rng2.hi == SHRT_MAX) return rng1;
int hi = tree_gcd(rng1.hi,rng2.hi); int hi = tree_gcd(rng1.hi,rng2.hi);
range_lo *lo = hi == SHRT_MIN ? 0 : range_glb_lo(rng1.lo,rng2.lo,hi); range_lo *lo = hi == SHRT_MIN ? 0 : range_glb_lo(rng1.lo,rng2.lo,hi);
if(!lo) hi = SHRT_MIN; if(!lo) hi = SHRT_MIN;
return range(hi,lo); return range(hi,lo);
} }
/** is this range empty? */ /** is this range empty? */
bool scopes::range_is_empty(const range &rng){ bool scopes::range_is_empty(const range &rng){
return rng.hi == SHRT_MIN; return rng.hi == SHRT_MIN;
} }
/** return an empty range */ /** return an empty range */
scopes::range scopes::range_empty(){ scopes::range scopes::range_empty(){
return range(SHRT_MIN,0); return range(SHRT_MIN,0);
} }
/** return a full range */ /** return a full range */
scopes::range scopes::range_full(){ scopes::range scopes::range_full(){
return range(SHRT_MAX,0); return range(SHRT_MAX,0);
} }
/** return the maximal element of a range */ /** return the maximal element of a range */
int scopes::range_max(const range &rng){ int scopes::range_max(const range &rng){
return rng.hi; return rng.hi;
} }
/** return a minimal (not necessarily unique) element of a range */ /** return a minimal (not necessarily unique) element of a range */
int scopes::range_min(const range &rng){ int scopes::range_min(const range &rng){
if(rng.hi == SHRT_MAX) return SHRT_MIN; if(rng.hi == SHRT_MAX) return SHRT_MIN;
return rng.lo ? rng.lo->lo : SHRT_MAX; return rng.lo ? rng.lo->lo : SHRT_MAX;
} }
/** return range consisting of downward closure of a point */ /** return range consisting of downward closure of a point */
scopes::range scopes::range_downward(int _hi){ scopes::range scopes::range_downward(int _hi){
std::vector<bool> descendants(parents.size()); std::vector<bool> descendants(parents.size());
for(int i = descendants.size() - 1; i >= 0 ; i--) for(int i = descendants.size() - 1; i >= 0 ; i--)
descendants[i] = i == _hi || parents[i] < parents.size() && descendants[parents[i]]; descendants[i] = i == _hi || parents[i] < parents.size() && descendants[parents[i]];
@ -275,16 +275,16 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
for(int i = descendants.size() - 1; i >= 0; --i) for(int i = descendants.size() - 1; i >= 0; --i)
if(descendants[i]) foo = find_range_lo(i,foo); if(descendants[i]) foo = find_range_lo(i,foo);
return range(_hi,foo); return range(_hi,foo);
} }
/** add an element to a range */ /** add an element to a range */
void scopes::range_add(int i, range &n){ void scopes::range_add(int i, range &n){
range foo = range(i, find_range_lo(i,0)); range foo = range(i, find_range_lo(i,0));
n = range_lub(foo,n); n = range_lub(foo,n);
} }
/** Choose an element of rng1 that is near to rng2 */ /** Choose an element of rng1 that is near to rng2 */
int scopes::range_near(const range &rng1, const range &rng2){ int scopes::range_near(const range &rng1, const range &rng2){
int frame; int frame;
int thing = tree_lca(rng1.hi,rng2.hi); int thing = tree_lca(rng1.hi,rng2.hi);
@ -292,28 +292,28 @@ scopes::range scopes::range_glb(const range &rng1, const range &rng2){
range line = range(rng1.hi,find_range_lo(rng2.hi,(range_lo *)0)); range line = range(rng1.hi,find_range_lo(rng2.hi,(range_lo *)0));
line = range_glb(line,rng1); line = range_glb(line,rng1);
return range_min(line); return range_min(line);
} }
/** test whether a tree node is contained in a range */ /** test whether a tree node is contained in a range */
bool scopes::in_range(int n, const range &rng){ bool scopes::in_range(int n, const range &rng){
range r = range_empty(); range r = range_empty();
range_add(n,r); range_add(n,r);
r = range_glb(rng,r); r = range_glb(rng,r);
return !range_is_empty(r); return !range_is_empty(r);
} }
/** test whether two ranges of tree nodes intersect */ /** test whether two ranges of tree nodes intersect */
bool scopes::ranges_intersect(const range &rng1, const range &rng2){ bool scopes::ranges_intersect(const range &rng1, const range &rng2){
range r = range_glb(rng1,rng2); range r = range_glb(rng1,rng2);
return !range_is_empty(r); return !range_is_empty(r);
} }
bool scopes::range_contained(const range &rng1, const range &rng2){ bool scopes::range_contained(const range &rng1, const range &rng2){
range r = range_glb(rng1,rng2); range r = range_glb(rng1,rng2);
return r.hi == rng1.hi && r.lo == rng1.lo; return r.hi == rng1.hi && r.lo == rng1.lo;
} }
#endif #endif

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3scopes.h iz3scopes.h
Abstract: Abstract:
Calculations with scopes, for both sequence and tree interpolation. Calculations with scopes, for both sequence and tree interpolation.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3SOPES_H #ifndef IZ3SOPES_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3secondary iz3secondary
Abstract: Abstract:
Interface for secondary provers. Interface for secondary provers.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3SECONDARY_H #ifndef IZ3SECONDARY_H

View file

@ -1,21 +1,21 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3translate.cpp iz3translate.cpp
Abstract: Abstract:
Translate a Z3 proof to in interpolated proof. Translate a Z3 proof to in interpolated proof.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
#pragma warning(disable:4996) #pragma warning(disable:4996)
@ -99,7 +99,7 @@ public:
symb commute; symb commute;
public: public:
#define from_ast(x) (x) #define from_ast(x) (x)

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3translate.h iz3translate.h
Abstract: Abstract:
Interface for proof translations from Z3 proofs to interpolatable Interface for proof translations from Z3 proofs to interpolatable
proofs. proofs.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifndef IZ3TRANSLATION_H #ifndef IZ3TRANSLATION_H
@ -29,7 +29,7 @@ Revision History:
// an interpolatable proof // an interpolatable proof
class iz3translation : public iz3base { class iz3translation : public iz3base {
public: public:
virtual iz3proof::node translate(ast, iz3proof &) = 0; virtual iz3proof::node translate(ast, iz3proof &) = 0;
virtual ast quantify(ast e, const range &rng){return e;} virtual ast quantify(ast e, const range &rng){return e;}
virtual ~iz3translation(){} virtual ~iz3translation(){}

View file

@ -1,23 +1,23 @@
/*++ /*++
Copyright (c) 2011 Microsoft Corporation Copyright (c) 2011 Microsoft Corporation
Module Name: Module Name:
iz3translate_direct.cpp iz3translate_direct.cpp
Abstract: Abstract:
Translate a Z3 proof into the interpolating proof calculus. Translate a Z3 proof into the interpolating proof calculus.
Translation is direct, without transformations on the target proof Translation is direct, without transformations on the target proof
representaiton. representaiton.
Author: Author:
Ken McMillan (kenmcmil) Ken McMillan (kenmcmil)
Revision History: Revision History:
--*/ --*/
#ifdef _WINDOWS #ifdef _WINDOWS
@ -47,7 +47,7 @@ using namespace stl_ext;
/* This can introduce an address dependency if the range type of hash_map has /* This can introduce an address dependency if the range type of hash_map has
a destructor. Since the code in this file is not used and only here for a destructor. Since the code in this file is not used and only here for
historical comparisons, we allow this non-determinism. historical comparisons, we allow this non-determinism.
*/ */
namespace stl_ext { namespace stl_ext {
template <class T> template <class T>
class hash<T *> { class hash<T *> {
@ -196,7 +196,7 @@ public:
// Translation memo for case of non-local resolutions // Translation memo for case of non-local resolutions
hash_map<non_local_lits *, AstToIpf> non_local_translation; hash_map<non_local_lits *, AstToIpf> non_local_translation;
public: public:
#define from_ast(x) (x) #define from_ast(x) (x)
@ -1639,71 +1639,71 @@ public:
++it) ++it)
delete it->second; delete it->second;
} }
}; };
#ifdef IZ3_TRANSLATE_DIRECT #ifdef IZ3_TRANSLATE_DIRECT
iz3translation *iz3translation::create(iz3mgr &mgr, iz3translation *iz3translation::create(iz3mgr &mgr,
iz3secondary *secondary, iz3secondary *secondary,
const std::vector<std::vector<ast> > &cnsts, const std::vector<std::vector<ast> > &cnsts,
const std::vector<int> &parents, const std::vector<int> &parents,
const std::vector<ast> &theory){ const std::vector<ast> &theory){
return new iz3translation_direct(mgr,secondary,cnsts,parents,theory); return new iz3translation_direct(mgr,secondary,cnsts,parents,theory);
} }
#if 1 #if 1
void iz3translation_direct_trace_lit(iz3translation_direct *p, iz3mgr::ast lit, iz3mgr::ast proof){ void iz3translation_direct_trace_lit(iz3translation_direct *p, iz3mgr::ast lit, iz3mgr::ast proof){
p->trace_lit(lit, proof); p->trace_lit(lit, proof);
} }
void iz3translation_direct_show_step(iz3translation_direct *p, iz3mgr::ast proof){ void iz3translation_direct_show_step(iz3translation_direct *p, iz3mgr::ast proof){
p->show_step(proof); p->show_step(proof);
} }
void iz3translation_direct_show_marked(iz3translation_direct *p, iz3mgr::ast proof){ void iz3translation_direct_show_marked(iz3translation_direct *p, iz3mgr::ast proof){
p->show_marked(proof); p->show_marked(proof);
} }
void iz3translation_direct_show_lit(iz3translation_direct *p, iz3mgr::ast lit){ void iz3translation_direct_show_lit(iz3translation_direct *p, iz3mgr::ast lit){
p->show_lit(lit); p->show_lit(lit);
} }
void iz3translation_direct_show_z3_lit(iz3translation_direct *p, iz3mgr::ast a){ void iz3translation_direct_show_z3_lit(iz3translation_direct *p, iz3mgr::ast a){
p->show_z3_lit(a); p->show_z3_lit(a);
} }
void iz3translation_direct_pfgoto(iz3translation_direct *p, iz3mgr::ast proof){ void iz3translation_direct_pfgoto(iz3translation_direct *p, iz3mgr::ast proof){
p->pfgoto(proof); p->pfgoto(proof);
} }
void iz3translation_direct_show_nll(iz3translation_direct *p, non_local_lits *nll){ void iz3translation_direct_show_nll(iz3translation_direct *p, non_local_lits *nll){
p->show_nll(nll); p->show_nll(nll);
} }
void iz3translation_direct_pfback(iz3translation_direct *p ){ void iz3translation_direct_pfback(iz3translation_direct *p ){
p->pfback(); p->pfback();
} }
void iz3translation_direct_pffwd(iz3translation_direct *p ){ void iz3translation_direct_pffwd(iz3translation_direct *p ){
p->pffwd(); p->pffwd();
} }
void iz3translation_direct_pfprem(iz3translation_direct *p, int i){ void iz3translation_direct_pfprem(iz3translation_direct *p, int i){
p->pfprem(i); p->pfprem(i);
} }
struct stdio_fixer { struct stdio_fixer {
stdio_fixer(){ stdio_fixer(){
std::cout.rdbuf()->pubsetbuf(0,0); std::cout.rdbuf()->pubsetbuf(0,0);
} }
} my_stdio_fixer; } my_stdio_fixer;
#endif #endif

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2013 Microsoft Corporation Copyright (c) 2013 Microsoft Corporation
Module Name: Module Name:
duality_dl_interface.cpp duality_dl_interface.cpp
Abstract: Abstract:
SMT2 interface for Duality SMT2 interface for Duality
Author: Author:
Krystof Hoder (t-khoder) 2011-9-22. Krystof Hoder (t-khoder) 2011-9-22.
Modified by Ken McMIllan (kenmcmil) 2013-4-18. Modified by Ken McMIllan (kenmcmil) 2013-4-18.
Revision History: Revision History:
--*/ --*/
#include "dl_context.h" #include "dl_context.h"
#include "dl_mk_coi_filter.h" #include "dl_mk_coi_filter.h"
@ -87,28 +87,28 @@ namespace Duality {
}; };
dl_interface::dl_interface(datalog::context& dl_ctx) : dl_interface::dl_interface(datalog::context& dl_ctx) :
engine_base(dl_ctx.get_manager(), "duality"), engine_base(dl_ctx.get_manager(), "duality"),
m_ctx(dl_ctx) m_ctx(dl_ctx)
{ {
_d = 0; _d = 0;
// dl_ctx.get_manager().toggle_proof_mode(PGM_FINE); // dl_ctx.get_manager().toggle_proof_mode(PGM_FINE);
} }
dl_interface::~dl_interface() { dl_interface::~dl_interface() {
if(_d) if(_d)
dealloc(_d); dealloc(_d);
} }
// //
// Check if the new rules are weaker so that we can // Check if the new rules are weaker so that we can
// re-use existing context. // re-use existing context.
// //
#if 0 #if 0
void dl_interface::check_reset() { void dl_interface::check_reset() {
// TODO // TODO
datalog::rule_ref_vector const& new_rules = m_ctx.get_rules().get_rules(); datalog::rule_ref_vector const& new_rules = m_ctx.get_rules().get_rules();
datalog::rule_ref_vector const& old_rules = m_old_rules.get_rules(); datalog::rule_ref_vector const& old_rules = m_old_rules.get_rules();
@ -127,11 +127,11 @@ void dl_interface::check_reset() {
} }
m_old_rules.reset(); m_old_rules.reset();
m_old_rules.add_rules(new_rules.size(), new_rules.c_ptr()); m_old_rules.add_rules(new_rules.size(), new_rules.c_ptr());
} }
#endif #endif
lbool dl_interface::query(::expr * query) { lbool dl_interface::query(::expr * query) {
// we restore the initial state in the datalog context // we restore the initial state in the datalog context
m_ctx.ensure_opened(); m_ctx.ensure_opened();
@ -364,29 +364,29 @@ lbool dl_interface::query(::expr * query) {
return l_false; return l_false;
} }
return l_true; return l_true;
} }
expr_ref dl_interface::get_cover_delta(int level, ::func_decl* pred_orig) { expr_ref dl_interface::get_cover_delta(int level, ::func_decl* pred_orig) {
SASSERT(false); SASSERT(false);
return expr_ref(m_ctx.get_manager()); return expr_ref(m_ctx.get_manager());
} }
void dl_interface::add_cover(int level, ::func_decl* pred, ::expr* property) { void dl_interface::add_cover(int level, ::func_decl* pred, ::expr* property) {
SASSERT(false); SASSERT(false);
} }
unsigned dl_interface::get_num_levels(::func_decl* pred) { unsigned dl_interface::get_num_levels(::func_decl* pred) {
SASSERT(false); SASSERT(false);
return 0; return 0;
} }
void dl_interface::collect_statistics(::statistics& st) const { void dl_interface::collect_statistics(::statistics& st) const {
} }
void dl_interface::reset_statistics() { void dl_interface::reset_statistics() {
} }
static hash_set<func_decl> *local_func_decls; static hash_set<func_decl> *local_func_decls;
static void print_proof(dl_interface *d, std::ostream& out, RPFP *tree, RPFP::Node *root) { static void print_proof(dl_interface *d, std::ostream& out, RPFP *tree, RPFP::Node *root) {
context &ctx = d->dd()->ctx; context &ctx = d->dd()->ctx;
@ -456,14 +456,14 @@ static hash_set<func_decl> *local_func_decls;
} }
out << " )"; out << " )";
out << ")\n"; out << ")\n";
} }
void dl_interface::display_certificate(std::ostream& out) const { void dl_interface::display_certificate(std::ostream& out) const {
((dl_interface *)this)->display_certificate_non_const(out); ((dl_interface *)this)->display_certificate_non_const(out);
} }
void dl_interface::display_certificate_non_const(std::ostream& out) { void dl_interface::display_certificate_non_const(std::ostream& out) {
if(_d->status == StatusModel){ if(_d->status == StatusModel){
ast_manager &m = m_ctx.get_manager(); ast_manager &m = m_ctx.get_manager();
model_ref md = get_model(); model_ref md = get_model();
@ -499,14 +499,14 @@ void dl_interface::display_certificate_non_const(std::ostream& out) {
model_v2_pp(out,mod); model_v2_pp(out,mod);
out << "\")\n"; out << "\")\n";
} }
} }
expr_ref dl_interface::get_answer() { expr_ref dl_interface::get_answer() {
SASSERT(false); SASSERT(false);
return expr_ref(m_ctx.get_manager()); return expr_ref(m_ctx.get_manager());
} }
void dl_interface::cancel() { void dl_interface::cancel() {
#if 0 #if 0
if(_d && _d->ls) if(_d && _d->ls)
_d->ls->cancel(); _d->ls->cancel();
@ -515,15 +515,15 @@ void dl_interface::cancel() {
std::cout << "(error \"duality canceled\")\nunknown\n"; std::cout << "(error \"duality canceled\")\nunknown\n";
abort(); abort();
#endif #endif
} }
void dl_interface::cleanup() { void dl_interface::cleanup() {
} }
void dl_interface::updt_params() { void dl_interface::updt_params() {
} }
model_ref dl_interface::get_model() { model_ref dl_interface::get_model() {
ast_manager &m = m_ctx.get_manager(); ast_manager &m = m_ctx.get_manager();
model_ref md(alloc(::model, m)); model_ref md(alloc(::model, m));
std::vector<RPFP::Node *> &nodes = _d->rpfp->nodes; std::vector<RPFP::Node *> &nodes = _d->rpfp->nodes;
@ -549,7 +549,7 @@ model_ref dl_interface::get_model() {
} }
} }
return md; return md;
} }
static proof_ref extract_proof(dl_interface *d, RPFP *tree, RPFP::Node *root) { static proof_ref extract_proof(dl_interface *d, RPFP *tree, RPFP::Node *root) {
context &ctx = d->dd()->ctx; context &ctx = d->dd()->ctx;
@ -608,9 +608,9 @@ model_ref dl_interface::get_model() {
proof_ref res(mgr.mk_hyper_resolve(pprems.size(),&pprems[0], ctx.uncook(conc), pos, substs),mgr); proof_ref res(mgr.mk_hyper_resolve(pprems.size(),&pprems[0], ctx.uncook(conc), pos, substs),mgr);
return res; return res;
} }
proof_ref dl_interface::get_proof() { proof_ref dl_interface::get_proof() {
if(_d->status == StatusRefutation){ if(_d->status == StatusRefutation){
hash_set<func_decl> locals; hash_set<func_decl> locals;
local_func_decls = &locals; local_func_decls = &locals;
@ -618,5 +618,5 @@ proof_ref dl_interface::get_proof() {
} }
else else
return proof_ref(m_ctx.get_manager()); return proof_ref(m_ctx.get_manager());
} }
} }

View file

@ -1,22 +1,22 @@
/*++ /*++
Copyright (c) 2013 Microsoft Corporation Copyright (c) 2013 Microsoft Corporation
Module Name: Module Name:
duality_dl_interface.h duality_dl_interface.h
Abstract: Abstract:
SMT2 interface for Duality SMT2 interface for Duality
Author: Author:
Krystof Hoder (t-khoder) 2011-9-22. Krystof Hoder (t-khoder) 2011-9-22.
Modified by Ken McMIllan (kenmcmil) 2013-4-18. Modified by Ken McMIllan (kenmcmil) 2013-4-18.
Revision History: Revision History:
--*/ --*/
#ifndef _DUALITY_DL_INTERFACE_H_ #ifndef _DUALITY_DL_INTERFACE_H_
#define _DUALITY_DL_INTERFACE_H_ #define _DUALITY_DL_INTERFACE_H_