mirror of
https://github.com/Z3Prover/z3
synced 2025-04-13 04:28:17 +00:00
Merge branch 'bvsls' of https://git01.codeplex.com/z3 into opt
Conflicts: scripts/mk_project.py src/duality/duality.h src/duality/duality_solver.cpp src/duality/duality_wrapper.h src/interp/iz3hash.h Signed-off-by: Christoph M. Wintersteiger <cwinter@microsoft.com>
This commit is contained in:
commit
c3b7c738f8
3
.gitattributes
vendored
3
.gitattributes
vendored
|
@ -1 +1,4 @@
|
||||||
|
# Set default behaviour, in case users don't have core.autocrlf set.
|
||||||
|
* text=auto
|
||||||
|
|
||||||
src/api/dotnet/Properties/AssemblyInfo.cs text eol=crlf
|
src/api/dotnet/Properties/AssemblyInfo.cs text eol=crlf
|
||||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -56,6 +56,8 @@ src/api/api_log_macros.cpp
|
||||||
src/api/dll/api_dll.def
|
src/api/dll/api_dll.def
|
||||||
src/api/dotnet/Enumerations.cs
|
src/api/dotnet/Enumerations.cs
|
||||||
src/api/dotnet/Native.cs
|
src/api/dotnet/Native.cs
|
||||||
|
src/api/dotnet/Properties/AssemblyInfo.cs
|
||||||
|
src/api/dotnet/Microsoft.Z3.xml
|
||||||
src/api/python/z3consts.py
|
src/api/python/z3consts.py
|
||||||
src/api/python/z3core.py
|
src/api/python/z3core.py
|
||||||
src/ast/pattern/database.h
|
src/ast/pattern/database.h
|
||||||
|
|
|
@ -43,17 +43,18 @@ def init_project_def():
|
||||||
# Simplifier module will be deleted in the future.
|
# Simplifier module will be deleted in the future.
|
||||||
# It has been replaced with rewriter module.
|
# It has been replaced with rewriter module.
|
||||||
add_lib('simplifier', ['rewriter'], 'ast/simplifier')
|
add_lib('simplifier', ['rewriter'], 'ast/simplifier')
|
||||||
|
add_lib('fpa', ['ast', 'util', 'simplifier'], 'ast/fpa')
|
||||||
add_lib('macros', ['simplifier'], 'ast/macros')
|
add_lib('macros', ['simplifier'], 'ast/macros')
|
||||||
add_lib('pattern', ['normal_forms', 'smt2parser', 'simplifier'], 'ast/pattern')
|
add_lib('pattern', ['normal_forms', 'smt2parser', 'simplifier'], 'ast/pattern')
|
||||||
add_lib('bit_blaster', ['rewriter', 'simplifier'], 'ast/rewriter/bit_blaster')
|
add_lib('bit_blaster', ['rewriter', 'simplifier'], 'ast/rewriter/bit_blaster')
|
||||||
add_lib('smt_params', ['ast', 'simplifier', 'pattern', 'bit_blaster'], 'smt/params')
|
add_lib('smt_params', ['ast', 'simplifier', 'pattern', 'bit_blaster'], 'smt/params')
|
||||||
add_lib('proto_model', ['model', 'simplifier', 'smt_params'], 'smt/proto_model')
|
add_lib('proto_model', ['model', 'simplifier', 'smt_params'], 'smt/proto_model')
|
||||||
add_lib('smt', ['bit_blaster', 'macros', 'normal_forms', 'cmd_context', 'proto_model',
|
add_lib('smt', ['bit_blaster', 'macros', 'normal_forms', 'cmd_context', 'proto_model',
|
||||||
'substitution', 'grobner', 'euclid', 'simplex', 'proof_checker', 'pattern', 'parser_util'])
|
'substitution', 'grobner', 'euclid', 'simplex', 'proof_checker', 'pattern', 'parser_util', 'fpa'])
|
||||||
add_lib('user_plugin', ['smt'], 'smt/user_plugin')
|
add_lib('user_plugin', ['smt'], 'smt/user_plugin')
|
||||||
add_lib('bv_tactics', ['tactic', 'bit_blaster'], 'tactic/bv')
|
add_lib('bv_tactics', ['tactic', 'bit_blaster'], 'tactic/bv')
|
||||||
add_lib('fuzzing', ['ast'], 'test/fuzzing')
|
add_lib('fuzzing', ['ast'], 'test/fuzzing')
|
||||||
add_lib('fpa', ['core_tactics', 'bv_tactics', 'sat_tactic'], 'tactic/fpa')
|
add_lib('fpa_tactics', ['fpa', 'core_tactics', 'bv_tactics', 'sat_tactic'], 'tactic/fpa')
|
||||||
add_lib('smt_tactic', ['smt'], 'smt/tactic')
|
add_lib('smt_tactic', ['smt'], 'smt/tactic')
|
||||||
add_lib('sls_tactic', ['tactic', 'normal_forms', 'core_tactics', 'bv_tactics'], 'tactic/sls')
|
add_lib('sls_tactic', ['tactic', 'normal_forms', 'core_tactics', 'bv_tactics'], 'tactic/sls')
|
||||||
add_lib('qe', ['smt','sat'], 'qe')
|
add_lib('qe', ['smt','sat'], 'qe')
|
||||||
|
@ -69,7 +70,7 @@ def init_project_def():
|
||||||
add_lib('fp', ['muz', 'pdr', 'clp', 'tab', 'rel', 'bmc', 'duality_intf'], 'muz/fp')
|
add_lib('fp', ['muz', 'pdr', 'clp', 'tab', 'rel', 'bmc', 'duality_intf'], 'muz/fp')
|
||||||
add_lib('smtlogic_tactics', ['arith_tactics', 'bv_tactics', 'nlsat_tactic', 'smt_tactic', 'aig_tactic', 'fp', 'muz','qe'], 'tactic/smtlogics')
|
add_lib('smtlogic_tactics', ['arith_tactics', 'bv_tactics', 'nlsat_tactic', 'smt_tactic', 'aig_tactic', 'fp', 'muz','qe'], 'tactic/smtlogics')
|
||||||
add_lib('ufbv_tactic', ['normal_forms', 'core_tactics', 'macros', 'smt_tactic', 'rewriter'], 'tactic/ufbv')
|
add_lib('ufbv_tactic', ['normal_forms', 'core_tactics', 'macros', 'smt_tactic', 'rewriter'], 'tactic/ufbv')
|
||||||
add_lib('portfolio', ['smtlogic_tactics', 'ufbv_tactic', 'fpa', 'aig_tactic', 'fp', 'qe','sls_tactic', 'subpaving_tactic'], 'tactic/portfolio')
|
add_lib('portfolio', ['smtlogic_tactics', 'ufbv_tactic', 'fpa_tactics', 'aig_tactic', 'fp', 'qe','sls_tactic', 'subpaving_tactic'], 'tactic/portfolio')
|
||||||
add_lib('smtparser', ['portfolio'], 'parsers/smt')
|
add_lib('smtparser', ['portfolio'], 'parsers/smt')
|
||||||
add_lib('opt', ['smt', 'smtlogic_tactics', 'sls_tactic'], 'opt')
|
add_lib('opt', ['smt', 'smtlogic_tactics', 'sls_tactic'], 'opt')
|
||||||
API_files = ['z3_api.h', 'z3_algebraic.h', 'z3_polynomial.h', 'z3_rcf.h']
|
API_files = ['z3_api.h', 'z3_algebraic.h', 'z3_polynomial.h', 'z3_rcf.h']
|
||||||
|
|
|
@ -54,6 +54,7 @@ CPP_COMPONENT='cpp'
|
||||||
IS_WINDOWS=False
|
IS_WINDOWS=False
|
||||||
IS_LINUX=False
|
IS_LINUX=False
|
||||||
IS_OSX=False
|
IS_OSX=False
|
||||||
|
IS_FREEBSD=False
|
||||||
VERBOSE=True
|
VERBOSE=True
|
||||||
DEBUG_MODE=False
|
DEBUG_MODE=False
|
||||||
SHOW_CPPS = True
|
SHOW_CPPS = True
|
||||||
|
@ -98,6 +99,9 @@ def is_windows():
|
||||||
def is_linux():
|
def is_linux():
|
||||||
return IS_LINUX
|
return IS_LINUX
|
||||||
|
|
||||||
|
def is_freebsd():
|
||||||
|
return IS_FREEBSD
|
||||||
|
|
||||||
def is_osx():
|
def is_osx():
|
||||||
return IS_OSX
|
return IS_OSX
|
||||||
|
|
||||||
|
@ -426,6 +430,8 @@ elif os.name == 'posix':
|
||||||
IS_OSX=True
|
IS_OSX=True
|
||||||
elif os.uname()[0] == 'Linux':
|
elif os.uname()[0] == 'Linux':
|
||||||
IS_LINUX=True
|
IS_LINUX=True
|
||||||
|
elif os.uname()[0] == 'FreeBSD':
|
||||||
|
IS_FREEBSD=True
|
||||||
|
|
||||||
def display_help(exit_code):
|
def display_help(exit_code):
|
||||||
print("mk_make.py: Z3 Makefile generator\n")
|
print("mk_make.py: Z3 Makefile generator\n")
|
||||||
|
@ -1181,6 +1187,8 @@ class JavaDLLComponent(Component):
|
||||||
t = t.replace('PLATFORM', 'darwin')
|
t = t.replace('PLATFORM', 'darwin')
|
||||||
elif IS_LINUX:
|
elif IS_LINUX:
|
||||||
t = t.replace('PLATFORM', 'linux')
|
t = t.replace('PLATFORM', 'linux')
|
||||||
|
elif IS_FREEBSD:
|
||||||
|
t = t.replace('PLATFORM', 'freebsd')
|
||||||
else:
|
else:
|
||||||
t = t.replace('PLATFORM', 'win32')
|
t = t.replace('PLATFORM', 'win32')
|
||||||
out.write(t)
|
out.write(t)
|
||||||
|
|
|
@ -144,7 +144,7 @@ def mk_z3_core(x64):
|
||||||
cmds.append('call "%VCINSTALLDIR%vcvarsall.bat" amd64')
|
cmds.append('call "%VCINSTALLDIR%vcvarsall.bat" amd64')
|
||||||
cmds.append('cd %s' % BUILD_X64_DIR)
|
cmds.append('cd %s' % BUILD_X64_DIR)
|
||||||
else:
|
else:
|
||||||
cmds.append('"call %VCINSTALLDIR%vcvarsall.bat" x86')
|
cmds.append('call "%VCINSTALLDIR%vcvarsall.bat" x86')
|
||||||
cmds.append('cd %s' % BUILD_X86_DIR)
|
cmds.append('cd %s' % BUILD_X86_DIR)
|
||||||
cmds.append('nmake')
|
cmds.append('nmake')
|
||||||
if exec_cmds(cmds) != 0:
|
if exec_cmds(cmds) != 0:
|
||||||
|
|
|
@ -117,6 +117,7 @@ Z3_ast Z3_API NAME(Z3_context c, unsigned i, Z3_ast n) { \
|
||||||
Z3_sort int_s = Z3_mk_int_sort(c);
|
Z3_sort int_s = Z3_mk_int_sort(c);
|
||||||
if (is_signed) {
|
if (is_signed) {
|
||||||
Z3_ast r = Z3_mk_bv2int(c, n, false);
|
Z3_ast r = Z3_mk_bv2int(c, n, false);
|
||||||
|
Z3_inc_ref(c, r);
|
||||||
Z3_sort s = Z3_get_sort(c, n);
|
Z3_sort s = Z3_get_sort(c, n);
|
||||||
unsigned sz = Z3_get_bv_sort_size(c, s);
|
unsigned sz = Z3_get_bv_sort_size(c, s);
|
||||||
rational max_bound = power(rational(2), sz);
|
rational max_bound = power(rational(2), sz);
|
||||||
|
@ -135,6 +136,7 @@ Z3_ast Z3_API NAME(Z3_context c, unsigned i, Z3_ast n) { \
|
||||||
Z3_dec_ref(c, pred);
|
Z3_dec_ref(c, pred);
|
||||||
Z3_dec_ref(c, sub);
|
Z3_dec_ref(c, sub);
|
||||||
Z3_dec_ref(c, zero);
|
Z3_dec_ref(c, zero);
|
||||||
|
Z3_dec_ref(c, r);
|
||||||
RETURN_Z3(res);
|
RETURN_Z3(res);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -303,10 +303,10 @@ namespace Microsoft.Z3
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a new finite domain sort.
|
/// Create a new finite domain sort.
|
||||||
/// <param name="name">The name used to identify the sort</param>
|
/// <returns>The result is a sort</returns>
|
||||||
/// <param size="size">The size of the sort</param>
|
|
||||||
/// <returns>The result is a sort</returns>
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="name">The name used to identify the sort</param>
|
||||||
|
/// <param name="size">The size of the sort</param>
|
||||||
public FiniteDomainSort MkFiniteDomainSort(Symbol name, ulong size)
|
public FiniteDomainSort MkFiniteDomainSort(Symbol name, ulong size)
|
||||||
{
|
{
|
||||||
Contract.Requires(name != null);
|
Contract.Requires(name != null);
|
||||||
|
@ -318,12 +318,12 @@ namespace Microsoft.Z3
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a new finite domain sort.
|
/// Create a new finite domain sort.
|
||||||
/// <param name="name">The name used to identify the sort</param>
|
/// <returns>The result is a sort</returns>
|
||||||
/// <param size="size">The size of the sort</param>
|
/// Elements of the sort are created using <seealso cref="MkNumeral(ulong, Sort)"/>,
|
||||||
/// <returns>The result is a sort</returns>
|
/// and the elements range from 0 to <tt>size-1</tt>.
|
||||||
/// Elements of the sort are created using <seealso cref="MkNumeral"/>,
|
|
||||||
/// and the elements range from 0 to <tt>size-1</tt>.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="name">The name used to identify the sort</param>
|
||||||
|
/// <param name="size">The size of the sort</param>
|
||||||
public FiniteDomainSort MkFiniteDomainSort(string name, ulong size)
|
public FiniteDomainSort MkFiniteDomainSort(string name, ulong size)
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FiniteDomainSort>() != null);
|
Contract.Ensures(Contract.Result<FiniteDomainSort>() != null);
|
||||||
|
|
|
@ -99,7 +99,7 @@ namespace Microsoft.Z3
|
||||||
Contract.Requires(Contract.ForAll(args, a => a != null));
|
Contract.Requires(Contract.ForAll(args, a => a != null));
|
||||||
|
|
||||||
Context.CheckContextMatch(args);
|
Context.CheckContextMatch(args);
|
||||||
if (args.Length != NumArgs)
|
if (IsApp && args.Length != NumArgs)
|
||||||
throw new Z3Exception("Number of arguments does not match");
|
throw new Z3Exception("Number of arguments does not match");
|
||||||
NativeObject = Native.Z3_update_term(Context.nCtx, NativeObject, (uint)args.Length, Expr.ArrayToNative(args));
|
NativeObject = Native.Z3_update_term(Context.nCtx, NativeObject, (uint)args.Length, Expr.ArrayToNative(args));
|
||||||
}
|
}
|
||||||
|
@ -269,57 +269,57 @@ namespace Microsoft.Z3
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is the constant true.
|
/// Indicates whether the term is the constant true.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsTrue { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TRUE; } }
|
public bool IsTrue { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TRUE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is the constant false.
|
/// Indicates whether the term is the constant false.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsFalse { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_FALSE; } }
|
public bool IsFalse { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_FALSE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an equality predicate.
|
/// Indicates whether the term is an equality predicate.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsEq { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EQ; } }
|
public bool IsEq { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an n-ary distinct predicate (every argument is mutually distinct).
|
/// Indicates whether the term is an n-ary distinct predicate (every argument is mutually distinct).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsDistinct { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_DISTINCT; } }
|
public bool IsDistinct { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_DISTINCT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a ternary if-then-else term
|
/// Indicates whether the term is a ternary if-then-else term
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsITE { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ITE; } }
|
public bool IsITE { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ITE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an n-ary conjunction
|
/// Indicates whether the term is an n-ary conjunction
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsAnd { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_AND; } }
|
public bool IsAnd { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_AND; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an n-ary disjunction
|
/// Indicates whether the term is an n-ary disjunction
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsOr { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_OR; } }
|
public bool IsOr { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_OR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an if-and-only-if (Boolean equivalence, binary)
|
/// Indicates whether the term is an if-and-only-if (Boolean equivalence, binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsIff { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IFF; } }
|
public bool IsIff { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IFF; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an exclusive or
|
/// Indicates whether the term is an exclusive or
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsXor { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_XOR; } }
|
public bool IsXor { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_XOR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a negation
|
/// Indicates whether the term is a negation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsNot { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_NOT; } }
|
public bool IsNot { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_NOT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an implication
|
/// Indicates whether the term is an implication
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsImplies { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IMPLIES; } }
|
public bool IsImplies { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IMPLIES; } }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -347,82 +347,82 @@ namespace Microsoft.Z3
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an arithmetic numeral.
|
/// Indicates whether the term is an arithmetic numeral.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsArithmeticNumeral { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ANUM; } }
|
public bool IsArithmeticNumeral { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ANUM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a less-than-or-equal
|
/// Indicates whether the term is a less-than-or-equal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsLE { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LE; } }
|
public bool IsLE { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a greater-than-or-equal
|
/// Indicates whether the term is a greater-than-or-equal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsGE { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_GE; } }
|
public bool IsGE { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_GE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a less-than
|
/// Indicates whether the term is a less-than
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsLT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LT; } }
|
public bool IsLT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a greater-than
|
/// Indicates whether the term is a greater-than
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsGT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_GT; } }
|
public bool IsGT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_GT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is addition (binary)
|
/// Indicates whether the term is addition (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsAdd { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ADD; } }
|
public bool IsAdd { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ADD; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is subtraction (binary)
|
/// Indicates whether the term is subtraction (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSub { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SUB; } }
|
public bool IsSub { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SUB; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a unary minus
|
/// Indicates whether the term is a unary minus
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsUMinus { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UMINUS; } }
|
public bool IsUMinus { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UMINUS; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is multiplication (binary)
|
/// Indicates whether the term is multiplication (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsMul { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_MUL; } }
|
public bool IsMul { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_MUL; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is division (binary)
|
/// Indicates whether the term is division (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsDiv { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_DIV; } }
|
public bool IsDiv { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_DIV; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is integer division (binary)
|
/// Indicates whether the term is integer division (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsIDiv { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IDIV; } }
|
public bool IsIDiv { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IDIV; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is remainder (binary)
|
/// Indicates whether the term is remainder (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRemainder { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_REM; } }
|
public bool IsRemainder { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_REM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is modulus (binary)
|
/// Indicates whether the term is modulus (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsModulus { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_MOD; } }
|
public bool IsModulus { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_MOD; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a coercion of integer to real (unary)
|
/// Indicates whether the term is a coercion of integer to real (unary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsIntToReal { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TO_REAL; } }
|
public bool IsIntToReal { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TO_REAL; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a coercion of real to integer (unary)
|
/// Indicates whether the term is a coercion of real to integer (unary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRealToInt { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TO_INT; } }
|
public bool IsRealToInt { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TO_INT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a check that tests whether a real is integral (unary)
|
/// Indicates whether the term is a check that tests whether a real is integral (unary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRealIsInt { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IS_INT; } }
|
public bool IsRealIsInt { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IS_INT; } }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Array Terms
|
#region Array Terms
|
||||||
|
@ -444,64 +444,64 @@ namespace Microsoft.Z3
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>It satisfies select(store(a,i,v),j) = if i = j then v else select(a,j).
|
/// <remarks>It satisfies select(store(a,i,v),j) = if i = j then v else select(a,j).
|
||||||
/// Array store takes at least 3 arguments. </remarks>
|
/// Array store takes at least 3 arguments. </remarks>
|
||||||
public bool IsStore { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_STORE; } }
|
public bool IsStore { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_STORE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an array select.
|
/// Indicates whether the term is an array select.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSelect { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SELECT; } }
|
public bool IsSelect { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SELECT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a constant array.
|
/// Indicates whether the term is a constant array.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>For example, select(const(v),i) = v holds for every v and i. The function is unary.</remarks>
|
/// <remarks>For example, select(const(v),i) = v holds for every v and i. The function is unary.</remarks>
|
||||||
public bool IsConstantArray { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CONST_ARRAY; } }
|
public bool IsConstantArray { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CONST_ARRAY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a default array.
|
/// Indicates whether the term is a default array.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>For example default(const(v)) = v. The function is unary.</remarks>
|
/// <remarks>For example default(const(v)) = v. The function is unary.</remarks>
|
||||||
public bool IsDefaultArray { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ARRAY_DEFAULT; } }
|
public bool IsDefaultArray { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ARRAY_DEFAULT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an array map.
|
/// Indicates whether the term is an array map.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>It satisfies map[f](a1,..,a_n)[i] = f(a1[i],...,a_n[i]) for every i.</remarks>
|
/// <remarks>It satisfies map[f](a1,..,a_n)[i] = f(a1[i],...,a_n[i]) for every i.</remarks>
|
||||||
public bool IsArrayMap { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ARRAY_MAP; } }
|
public bool IsArrayMap { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ARRAY_MAP; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an as-array term.
|
/// Indicates whether the term is an as-array term.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>An as-array term is n array value that behaves as the function graph of the
|
/// <remarks>An as-array term is n array value that behaves as the function graph of the
|
||||||
/// function passed as parameter.</remarks>
|
/// function passed as parameter.</remarks>
|
||||||
public bool IsAsArray { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_AS_ARRAY; } }
|
public bool IsAsArray { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_AS_ARRAY; } }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Set Terms
|
#region Set Terms
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is set union
|
/// Indicates whether the term is set union
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSetUnion { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_UNION; } }
|
public bool IsSetUnion { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_UNION; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is set intersection
|
/// Indicates whether the term is set intersection
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSetIntersect { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_INTERSECT; } }
|
public bool IsSetIntersect { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_INTERSECT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is set difference
|
/// Indicates whether the term is set difference
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSetDifference { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_DIFFERENCE; } }
|
public bool IsSetDifference { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_DIFFERENCE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is set complement
|
/// Indicates whether the term is set complement
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSetComplement { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_COMPLEMENT; } }
|
public bool IsSetComplement { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_COMPLEMENT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is set subset
|
/// Indicates whether the term is set subset
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSetSubset { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_SUBSET; } }
|
public bool IsSetSubset { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_SUBSET; } }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Bit-vector terms
|
#region Bit-vector terms
|
||||||
|
@ -516,266 +516,266 @@ namespace Microsoft.Z3
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector numeral
|
/// Indicates whether the term is a bit-vector numeral
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVNumeral { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNUM; } }
|
public bool IsBVNumeral { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNUM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a one-bit bit-vector with value one
|
/// Indicates whether the term is a one-bit bit-vector with value one
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVBitOne { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BIT1; } }
|
public bool IsBVBitOne { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BIT1; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a one-bit bit-vector with value zero
|
/// Indicates whether the term is a one-bit bit-vector with value zero
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVBitZero { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BIT0; } }
|
public bool IsBVBitZero { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BIT0; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector unary minus
|
/// Indicates whether the term is a bit-vector unary minus
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVUMinus { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNEG; } }
|
public bool IsBVUMinus { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNEG; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector addition (binary)
|
/// Indicates whether the term is a bit-vector addition (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVAdd { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BADD; } }
|
public bool IsBVAdd { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BADD; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector subtraction (binary)
|
/// Indicates whether the term is a bit-vector subtraction (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSub { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSUB; } }
|
public bool IsBVSub { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSUB; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector multiplication (binary)
|
/// Indicates whether the term is a bit-vector multiplication (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVMul { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BMUL; } }
|
public bool IsBVMul { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BMUL; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector signed division (binary)
|
/// Indicates whether the term is a bit-vector signed division (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSDiv { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSDIV; } }
|
public bool IsBVSDiv { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSDIV; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector unsigned division (binary)
|
/// Indicates whether the term is a bit-vector unsigned division (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVUDiv { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUDIV; } }
|
public bool IsBVUDiv { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUDIV; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector signed remainder (binary)
|
/// Indicates whether the term is a bit-vector signed remainder (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSRem { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSREM; } }
|
public bool IsBVSRem { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSREM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector unsigned remainder (binary)
|
/// Indicates whether the term is a bit-vector unsigned remainder (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVURem { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUREM; } }
|
public bool IsBVURem { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUREM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector signed modulus
|
/// Indicates whether the term is a bit-vector signed modulus
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSMod { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSMOD; } }
|
public bool IsBVSMod { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSMOD; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector signed division by zero
|
/// Indicates whether the term is a bit-vector signed division by zero
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal bool IsBVSDiv0 { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSDIV0; } }
|
internal bool IsBVSDiv0 { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSDIV0; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector unsigned division by zero
|
/// Indicates whether the term is a bit-vector unsigned division by zero
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal bool IsBVUDiv0 { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUDIV0; } }
|
internal bool IsBVUDiv0 { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUDIV0; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector signed remainder by zero
|
/// Indicates whether the term is a bit-vector signed remainder by zero
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal bool IsBVSRem0 { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSREM0; } }
|
internal bool IsBVSRem0 { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSREM0; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector unsigned remainder by zero
|
/// Indicates whether the term is a bit-vector unsigned remainder by zero
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal bool IsBVURem0 { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUREM0; } }
|
internal bool IsBVURem0 { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUREM0; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector signed modulus by zero
|
/// Indicates whether the term is a bit-vector signed modulus by zero
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal bool IsBVSMod0 { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSMOD0; } }
|
internal bool IsBVSMod0 { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSMOD0; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an unsigned bit-vector less-than-or-equal
|
/// Indicates whether the term is an unsigned bit-vector less-than-or-equal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVULE { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ULEQ; } }
|
public bool IsBVULE { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ULEQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a signed bit-vector less-than-or-equal
|
/// Indicates whether the term is a signed bit-vector less-than-or-equal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSLE { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SLEQ; } }
|
public bool IsBVSLE { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SLEQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an unsigned bit-vector greater-than-or-equal
|
/// Indicates whether the term is an unsigned bit-vector greater-than-or-equal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVUGE { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UGEQ; } }
|
public bool IsBVUGE { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UGEQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a signed bit-vector greater-than-or-equal
|
/// Indicates whether the term is a signed bit-vector greater-than-or-equal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSGE { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SGEQ; } }
|
public bool IsBVSGE { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SGEQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an unsigned bit-vector less-than
|
/// Indicates whether the term is an unsigned bit-vector less-than
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVULT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ULT; } }
|
public bool IsBVULT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ULT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a signed bit-vector less-than
|
/// Indicates whether the term is a signed bit-vector less-than
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSLT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SLT; } }
|
public bool IsBVSLT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SLT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an unsigned bit-vector greater-than
|
/// Indicates whether the term is an unsigned bit-vector greater-than
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVUGT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UGT; } }
|
public bool IsBVUGT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UGT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a signed bit-vector greater-than
|
/// Indicates whether the term is a signed bit-vector greater-than
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSGT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SGT; } }
|
public bool IsBVSGT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SGT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-wise AND
|
/// Indicates whether the term is a bit-wise AND
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVAND { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BAND; } }
|
public bool IsBVAND { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BAND; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-wise OR
|
/// Indicates whether the term is a bit-wise OR
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVOR { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BOR; } }
|
public bool IsBVOR { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BOR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-wise NOT
|
/// Indicates whether the term is a bit-wise NOT
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVNOT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNOT; } }
|
public bool IsBVNOT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNOT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-wise XOR
|
/// Indicates whether the term is a bit-wise XOR
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVXOR { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BXOR; } }
|
public bool IsBVXOR { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BXOR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-wise NAND
|
/// Indicates whether the term is a bit-wise NAND
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVNAND { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNAND; } }
|
public bool IsBVNAND { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNAND; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-wise NOR
|
/// Indicates whether the term is a bit-wise NOR
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVNOR { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNOR; } }
|
public bool IsBVNOR { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNOR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-wise XNOR
|
/// Indicates whether the term is a bit-wise XNOR
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVXNOR { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BXNOR; } }
|
public bool IsBVXNOR { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BXNOR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector concatenation (binary)
|
/// Indicates whether the term is a bit-vector concatenation (binary)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVConcat { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CONCAT; } }
|
public bool IsBVConcat { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CONCAT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector sign extension
|
/// Indicates whether the term is a bit-vector sign extension
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVSignExtension { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SIGN_EXT; } }
|
public bool IsBVSignExtension { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SIGN_EXT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector zero extension
|
/// Indicates whether the term is a bit-vector zero extension
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVZeroExtension { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ZERO_EXT; } }
|
public bool IsBVZeroExtension { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ZERO_EXT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector extraction
|
/// Indicates whether the term is a bit-vector extraction
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVExtract { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXTRACT; } }
|
public bool IsBVExtract { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXTRACT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector repetition
|
/// Indicates whether the term is a bit-vector repetition
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVRepeat { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_REPEAT; } }
|
public bool IsBVRepeat { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_REPEAT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector reduce OR
|
/// Indicates whether the term is a bit-vector reduce OR
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVReduceOR { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BREDOR; } }
|
public bool IsBVReduceOR { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BREDOR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector reduce AND
|
/// Indicates whether the term is a bit-vector reduce AND
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVReduceAND { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BREDAND; } }
|
public bool IsBVReduceAND { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BREDAND; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector comparison
|
/// Indicates whether the term is a bit-vector comparison
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVComp { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BCOMP; } }
|
public bool IsBVComp { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BCOMP; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector shift left
|
/// Indicates whether the term is a bit-vector shift left
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVShiftLeft { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSHL; } }
|
public bool IsBVShiftLeft { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSHL; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector logical shift right
|
/// Indicates whether the term is a bit-vector logical shift right
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVShiftRightLogical { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BLSHR; } }
|
public bool IsBVShiftRightLogical { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BLSHR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector arithmetic shift left
|
/// Indicates whether the term is a bit-vector arithmetic shift left
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVShiftRightArithmetic { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BASHR; } }
|
public bool IsBVShiftRightArithmetic { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BASHR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector rotate left
|
/// Indicates whether the term is a bit-vector rotate left
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVRotateLeft { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ROTATE_LEFT; } }
|
public bool IsBVRotateLeft { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ROTATE_LEFT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector rotate right
|
/// Indicates whether the term is a bit-vector rotate right
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsBVRotateRight { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ROTATE_RIGHT; } }
|
public bool IsBVRotateRight { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ROTATE_RIGHT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector rotate left (extended)
|
/// Indicates whether the term is a bit-vector rotate left (extended)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>Similar to Z3_OP_ROTATE_LEFT, but it is a binary operator instead of a parametric one.</remarks>
|
/// <remarks>Similar to Z3_OP_ROTATE_LEFT, but it is a binary operator instead of a parametric one.</remarks>
|
||||||
public bool IsBVRotateLeftExtended { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXT_ROTATE_LEFT; } }
|
public bool IsBVRotateLeftExtended { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXT_ROTATE_LEFT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector rotate right (extended)
|
/// Indicates whether the term is a bit-vector rotate right (extended)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>Similar to Z3_OP_ROTATE_RIGHT, but it is a binary operator instead of a parametric one.</remarks>
|
/// <remarks>Similar to Z3_OP_ROTATE_RIGHT, but it is a binary operator instead of a parametric one.</remarks>
|
||||||
public bool IsBVRotateRightExtended { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXT_ROTATE_RIGHT; } }
|
public bool IsBVRotateRightExtended { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXT_ROTATE_RIGHT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a coercion from integer to bit-vector
|
/// Indicates whether the term is a coercion from integer to bit-vector
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This function is not supported by the decision procedures. Only the most
|
/// <remarks>This function is not supported by the decision procedures. Only the most
|
||||||
/// rudimentary simplification rules are applied to this function.</remarks>
|
/// rudimentary simplification rules are applied to this function.</remarks>
|
||||||
public bool IsIntToBV { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_INT2BV; } }
|
public bool IsIntToBV { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_INT2BV; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a coercion from bit-vector to integer
|
/// Indicates whether the term is a coercion from bit-vector to integer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This function is not supported by the decision procedures. Only the most
|
/// <remarks>This function is not supported by the decision procedures. Only the most
|
||||||
/// rudimentary simplification rules are applied to this function.</remarks>
|
/// rudimentary simplification rules are applied to this function.</remarks>
|
||||||
public bool IsBVToInt { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BV2INT; } }
|
public bool IsBVToInt { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BV2INT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector carry
|
/// Indicates whether the term is a bit-vector carry
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>Compute the carry bit in a full-adder. The meaning is given by the
|
/// <remarks>Compute the carry bit in a full-adder. The meaning is given by the
|
||||||
/// equivalence (carry l1 l2 l3) <=> (or (and l1 l2) (and l1 l3) (and l2 l3)))</remarks>
|
/// equivalence (carry l1 l2 l3) <=> (or (and l1 l2) (and l1 l3) (and l2 l3)))</remarks>
|
||||||
public bool IsBVCarry { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CARRY; } }
|
public bool IsBVCarry { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CARRY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a bit-vector ternary XOR
|
/// Indicates whether the term is a bit-vector ternary XOR
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>The meaning is given by the equivalence (xor3 l1 l2 l3) <=> (xor (xor l1 l2) l3)</remarks>
|
/// <remarks>The meaning is given by the equivalence (xor3 l1 l2 l3) <=> (xor (xor l1 l2) l3)</remarks>
|
||||||
public bool IsBVXOR3 { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_XOR3; } }
|
public bool IsBVXOR3 { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_XOR3; } }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -784,13 +784,13 @@ namespace Microsoft.Z3
|
||||||
/// Indicates whether the term is a label (used by the Boogie Verification condition generator).
|
/// Indicates whether the term is a label (used by the Boogie Verification condition generator).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>The label has two parameters, a string and a Boolean polarity. It takes one argument, a formula.</remarks>
|
/// <remarks>The label has two parameters, a string and a Boolean polarity. It takes one argument, a formula.</remarks>
|
||||||
public bool IsLabel { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LABEL; } }
|
public bool IsLabel { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LABEL; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a label literal (used by the Boogie Verification condition generator).
|
/// Indicates whether the term is a label literal (used by the Boogie Verification condition generator).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>A label literal has a set of string parameters. It takes no arguments.</remarks>
|
/// <remarks>A label literal has a set of string parameters. It takes no arguments.</remarks>
|
||||||
public bool IsLabelLit { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LABEL_LIT; } }
|
public bool IsLabelLit { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LABEL_LIT; } }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Proof Terms
|
#region Proof Terms
|
||||||
|
@ -799,22 +799,22 @@ namespace Microsoft.Z3
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This binary predicate is used in proof terms.
|
/// <remarks>This binary predicate is used in proof terms.
|
||||||
/// It captures equisatisfiability and equivalence modulo renamings.</remarks>
|
/// It captures equisatisfiability and equivalence modulo renamings.</remarks>
|
||||||
public bool IsOEQ { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_OEQ; } }
|
public bool IsOEQ { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_OEQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a Proof for the expression 'true'.
|
/// Indicates whether the term is a Proof for the expression 'true'.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsProofTrue { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRUE; } }
|
public bool IsProofTrue { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRUE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for a fact asserted by the user.
|
/// Indicates whether the term is a proof for a fact asserted by the user.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsProofAsserted { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_ASSERTED; } }
|
public bool IsProofAsserted { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_ASSERTED; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for a fact (tagged as goal) asserted by the user.
|
/// Indicates whether the term is a proof for a fact (tagged as goal) asserted by the user.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsProofGoal { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_GOAL; } }
|
public bool IsProofGoal { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_GOAL; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is proof via modus ponens
|
/// Indicates whether the term is proof via modus ponens
|
||||||
|
@ -825,7 +825,7 @@ namespace Microsoft.Z3
|
||||||
/// T2: (implies p q)
|
/// T2: (implies p q)
|
||||||
/// [mp T1 T2]: q
|
/// [mp T1 T2]: q
|
||||||
/// The second antecedents may also be a proof for (iff p q).</remarks>
|
/// The second antecedents may also be a proof for (iff p q).</remarks>
|
||||||
public bool IsProofModusPonens { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MODUS_PONENS; } }
|
public bool IsProofModusPonens { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MODUS_PONENS; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for (R t t), where R is a reflexive relation.
|
/// Indicates whether the term is a proof for (R t t), where R is a reflexive relation.
|
||||||
|
@ -834,7 +834,7 @@ namespace Microsoft.Z3
|
||||||
/// The only reflexive relations that are used are
|
/// The only reflexive relations that are used are
|
||||||
/// equivalence modulo namings, equality and equivalence.
|
/// equivalence modulo namings, equality and equivalence.
|
||||||
/// That is, R is either '~', '=' or 'iff'.</remarks>
|
/// That is, R is either '~', '=' or 'iff'.</remarks>
|
||||||
public bool IsProofReflexivity { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REFLEXIVITY; } }
|
public bool IsProofReflexivity { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REFLEXIVITY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is proof by symmetricity of a relation
|
/// Indicates whether the term is proof by symmetricity of a relation
|
||||||
|
@ -845,7 +845,7 @@ namespace Microsoft.Z3
|
||||||
/// [symmetry T1]: (R s t)
|
/// [symmetry T1]: (R s t)
|
||||||
/// T1 is the antecedent of this proof object.
|
/// T1 is the antecedent of this proof object.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofSymmetry { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_SYMMETRY; } }
|
public bool IsProofSymmetry { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_SYMMETRY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by transitivity of a relation
|
/// Indicates whether the term is a proof by transitivity of a relation
|
||||||
|
@ -857,7 +857,7 @@ namespace Microsoft.Z3
|
||||||
/// T2: (R s u)
|
/// T2: (R s u)
|
||||||
/// [trans T1 T2]: (R t u)
|
/// [trans T1 T2]: (R t u)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofTransitivity { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRANSITIVITY; } }
|
public bool IsProofTransitivity { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRANSITIVITY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by condensed transitivity of a relation
|
/// Indicates whether the term is a proof by condensed transitivity of a relation
|
||||||
|
@ -878,7 +878,7 @@ namespace Microsoft.Z3
|
||||||
/// if there is a path from s to t, if we view every
|
/// if there is a path from s to t, if we view every
|
||||||
/// antecedent (R a b) as an edge between a and b.
|
/// antecedent (R a b) as an edge between a and b.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofTransitivityStar { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRANSITIVITY_STAR; } }
|
public bool IsProofTransitivityStar { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRANSITIVITY_STAR; } }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -892,7 +892,7 @@ namespace Microsoft.Z3
|
||||||
/// Remark: if t_i == s_i, then the antecedent Ti is suppressed.
|
/// Remark: if t_i == s_i, then the antecedent Ti is suppressed.
|
||||||
/// That is, reflexivity proofs are supressed to save space.
|
/// That is, reflexivity proofs are supressed to save space.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofMonotonicity { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MONOTONICITY; } }
|
public bool IsProofMonotonicity { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MONOTONICITY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a quant-intro proof
|
/// Indicates whether the term is a quant-intro proof
|
||||||
|
@ -902,7 +902,7 @@ namespace Microsoft.Z3
|
||||||
/// T1: (~ p q)
|
/// T1: (~ p q)
|
||||||
/// [quant-intro T1]: (~ (forall (x) p) (forall (x) q))
|
/// [quant-intro T1]: (~ (forall (x) p) (forall (x) q))
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofQuantIntro { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_QUANT_INTRO; } }
|
public bool IsProofQuantIntro { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_QUANT_INTRO; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a distributivity proof object.
|
/// Indicates whether the term is a distributivity proof object.
|
||||||
|
@ -920,7 +920,7 @@ namespace Microsoft.Z3
|
||||||
/// Remark. This rule is used by the CNF conversion pass and
|
/// Remark. This rule is used by the CNF conversion pass and
|
||||||
/// instantiated by f = or, and g = and.
|
/// instantiated by f = or, and g = and.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofDistributivity { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DISTRIBUTIVITY; } }
|
public bool IsProofDistributivity { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DISTRIBUTIVITY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by elimination of AND
|
/// Indicates whether the term is a proof by elimination of AND
|
||||||
|
@ -930,7 +930,7 @@ namespace Microsoft.Z3
|
||||||
/// T1: (and l_1 ... l_n)
|
/// T1: (and l_1 ... l_n)
|
||||||
/// [and-elim T1]: l_i
|
/// [and-elim T1]: l_i
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofAndElimination { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_AND_ELIM; } }
|
public bool IsProofAndElimination { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_AND_ELIM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by eliminiation of not-or
|
/// Indicates whether the term is a proof by eliminiation of not-or
|
||||||
|
@ -940,7 +940,7 @@ namespace Microsoft.Z3
|
||||||
/// T1: (not (or l_1 ... l_n))
|
/// T1: (not (or l_1 ... l_n))
|
||||||
/// [not-or-elim T1]: (not l_i)
|
/// [not-or-elim T1]: (not l_i)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofOrElimination { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NOT_OR_ELIM; } }
|
public bool IsProofOrElimination { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NOT_OR_ELIM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by rewriting
|
/// Indicates whether the term is a proof by rewriting
|
||||||
|
@ -959,7 +959,7 @@ namespace Microsoft.Z3
|
||||||
/// (= (+ x 1 2) (+ 3 x))
|
/// (= (+ x 1 2) (+ 3 x))
|
||||||
/// (iff (or x false) x)
|
/// (iff (or x false) x)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofRewrite { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REWRITE; } }
|
public bool IsProofRewrite { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REWRITE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by rewriting
|
/// Indicates whether the term is a proof by rewriting
|
||||||
|
@ -975,7 +975,7 @@ namespace Microsoft.Z3
|
||||||
/// - When converting bit-vectors to Booleans (BIT2BOOL=true)
|
/// - When converting bit-vectors to Booleans (BIT2BOOL=true)
|
||||||
/// - When pulling ite expression up (PULL_CHEAP_ITE_TREES=true)
|
/// - When pulling ite expression up (PULL_CHEAP_ITE_TREES=true)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofRewriteStar { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REWRITE_STAR; } }
|
public bool IsProofRewriteStar { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REWRITE_STAR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for pulling quantifiers out.
|
/// Indicates whether the term is a proof for pulling quantifiers out.
|
||||||
|
@ -983,7 +983,7 @@ namespace Microsoft.Z3
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// A proof for (iff (f (forall (x) q(x)) r) (forall (x) (f (q x) r))). This proof object has no antecedents.
|
/// A proof for (iff (f (forall (x) q(x)) r) (forall (x) (f (q x) r))). This proof object has no antecedents.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofPullQuant { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PULL_QUANT; } }
|
public bool IsProofPullQuant { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PULL_QUANT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for pulling quantifiers out.
|
/// Indicates whether the term is a proof for pulling quantifiers out.
|
||||||
|
@ -993,7 +993,7 @@ namespace Microsoft.Z3
|
||||||
/// This proof object is only used if the parameter PROOF_MODE is 1.
|
/// This proof object is only used if the parameter PROOF_MODE is 1.
|
||||||
/// This proof object has no antecedents
|
/// This proof object has no antecedents
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofPullQuantStar { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PULL_QUANT_STAR; } }
|
public bool IsProofPullQuantStar { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PULL_QUANT_STAR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for pushing quantifiers in.
|
/// Indicates whether the term is a proof for pushing quantifiers in.
|
||||||
|
@ -1006,7 +1006,7 @@ namespace Microsoft.Z3
|
||||||
/// (forall (x_1 ... x_m) p_n[x_1 ... x_m])))
|
/// (forall (x_1 ... x_m) p_n[x_1 ... x_m])))
|
||||||
/// This proof object has no antecedents
|
/// This proof object has no antecedents
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofPushQuant { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PUSH_QUANT; } }
|
public bool IsProofPushQuant { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PUSH_QUANT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for elimination of unused variables.
|
/// Indicates whether the term is a proof for elimination of unused variables.
|
||||||
|
@ -1018,7 +1018,7 @@ namespace Microsoft.Z3
|
||||||
/// It is used to justify the elimination of unused variables.
|
/// It is used to justify the elimination of unused variables.
|
||||||
/// This proof object has no antecedents.
|
/// This proof object has no antecedents.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofElimUnusedVars { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_ELIM_UNUSED_VARS; } }
|
public bool IsProofElimUnusedVars { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_ELIM_UNUSED_VARS; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for destructive equality resolution
|
/// Indicates whether the term is a proof for destructive equality resolution
|
||||||
|
@ -1032,7 +1032,7 @@ namespace Microsoft.Z3
|
||||||
///
|
///
|
||||||
/// Several variables can be eliminated simultaneously.
|
/// Several variables can be eliminated simultaneously.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofDER { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DER; } }
|
public bool IsProofDER { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DER; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for quantifier instantiation
|
/// Indicates whether the term is a proof for quantifier instantiation
|
||||||
|
@ -1040,13 +1040,13 @@ namespace Microsoft.Z3
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// A proof of (or (not (forall (x) (P x))) (P a))
|
/// A proof of (or (not (forall (x) (P x))) (P a))
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofQuantInst { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_QUANT_INST; } }
|
public bool IsProofQuantInst { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_QUANT_INST; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a hypthesis marker.
|
/// Indicates whether the term is a hypthesis marker.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>Mark a hypothesis in a natural deduction style proof.</remarks>
|
/// <remarks>Mark a hypothesis in a natural deduction style proof.</remarks>
|
||||||
public bool IsProofHypothesis { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_HYPOTHESIS; } }
|
public bool IsProofHypothesis { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_HYPOTHESIS; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by lemma
|
/// Indicates whether the term is a proof by lemma
|
||||||
|
@ -1059,7 +1059,7 @@ namespace Microsoft.Z3
|
||||||
/// It converts the proof in a proof for (or (not l_1) ... (not l_n)),
|
/// It converts the proof in a proof for (or (not l_1) ... (not l_n)),
|
||||||
/// when T1 contains the hypotheses: l_1, ..., l_n.
|
/// when T1 contains the hypotheses: l_1, ..., l_n.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofLemma { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_LEMMA; } }
|
public bool IsProofLemma { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_LEMMA; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by unit resolution
|
/// Indicates whether the term is a proof by unit resolution
|
||||||
|
@ -1071,7 +1071,7 @@ namespace Microsoft.Z3
|
||||||
/// T(n+1): (not l_n)
|
/// T(n+1): (not l_n)
|
||||||
/// [unit-resolution T1 ... T(n+1)]: (or l_1' ... l_m')
|
/// [unit-resolution T1 ... T(n+1)]: (or l_1' ... l_m')
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofUnitResolution { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_UNIT_RESOLUTION; } }
|
public bool IsProofUnitResolution { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_UNIT_RESOLUTION; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by iff-true
|
/// Indicates whether the term is a proof by iff-true
|
||||||
|
@ -1080,7 +1080,7 @@ namespace Microsoft.Z3
|
||||||
/// T1: p
|
/// T1: p
|
||||||
/// [iff-true T1]: (iff p true)
|
/// [iff-true T1]: (iff p true)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofIFFTrue { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_TRUE; } }
|
public bool IsProofIFFTrue { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_TRUE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by iff-false
|
/// Indicates whether the term is a proof by iff-false
|
||||||
|
@ -1089,7 +1089,7 @@ namespace Microsoft.Z3
|
||||||
/// T1: (not p)
|
/// T1: (not p)
|
||||||
/// [iff-false T1]: (iff p false)
|
/// [iff-false T1]: (iff p false)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofIFFFalse { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_FALSE; } }
|
public bool IsProofIFFFalse { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_FALSE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by commutativity
|
/// Indicates whether the term is a proof by commutativity
|
||||||
|
@ -1102,7 +1102,7 @@ namespace Microsoft.Z3
|
||||||
/// This proof object has no antecedents.
|
/// This proof object has no antecedents.
|
||||||
/// Remark: if f is bool, then = is iff.
|
/// Remark: if f is bool, then = is iff.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofCommutativity { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_COMMUTATIVITY; } }
|
public bool IsProofCommutativity { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_COMMUTATIVITY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for Tseitin-like axioms
|
/// Indicates whether the term is a proof for Tseitin-like axioms
|
||||||
|
@ -1138,7 +1138,7 @@ namespace Microsoft.Z3
|
||||||
/// unfolding the Boolean connectives in the axioms a small
|
/// unfolding the Boolean connectives in the axioms a small
|
||||||
/// bounded number of steps (=3).
|
/// bounded number of steps (=3).
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofDefAxiom { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DEF_AXIOM; } }
|
public bool IsProofDefAxiom { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DEF_AXIOM; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for introduction of a name
|
/// Indicates whether the term is a proof for introduction of a name
|
||||||
|
@ -1161,7 +1161,7 @@ namespace Microsoft.Z3
|
||||||
/// Otherwise:
|
/// Otherwise:
|
||||||
/// [def-intro]: (= n e)
|
/// [def-intro]: (= n e)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofDefIntro { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DEF_INTRO; } }
|
public bool IsProofDefIntro { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DEF_INTRO; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for application of a definition
|
/// Indicates whether the term is a proof for application of a definition
|
||||||
|
@ -1171,7 +1171,7 @@ namespace Microsoft.Z3
|
||||||
/// F is 'equivalent' to n, given that T1 is a proof that
|
/// F is 'equivalent' to n, given that T1 is a proof that
|
||||||
/// n is a name for F.
|
/// n is a name for F.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofApplyDef { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_APPLY_DEF; } }
|
public bool IsProofApplyDef { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_APPLY_DEF; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof iff-oeq
|
/// Indicates whether the term is a proof iff-oeq
|
||||||
|
@ -1180,7 +1180,7 @@ namespace Microsoft.Z3
|
||||||
/// T1: (iff p q)
|
/// T1: (iff p q)
|
||||||
/// [iff~ T1]: (~ p q)
|
/// [iff~ T1]: (~ p q)
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofIFFOEQ { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_OEQ; } }
|
public bool IsProofIFFOEQ { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_OEQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for a positive NNF step
|
/// Indicates whether the term is a proof for a positive NNF step
|
||||||
|
@ -1208,7 +1208,7 @@ namespace Microsoft.Z3
|
||||||
/// NNF_NEG furthermore handles the case where negation is pushed
|
/// NNF_NEG furthermore handles the case where negation is pushed
|
||||||
/// over Boolean connectives 'and' and 'or'.
|
/// over Boolean connectives 'and' and 'or'.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofNNFPos { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_POS; } }
|
public bool IsProofNNFPos { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_POS; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for a negative NNF step
|
/// Indicates whether the term is a proof for a negative NNF step
|
||||||
|
@ -1233,7 +1233,7 @@ namespace Microsoft.Z3
|
||||||
/// [nnf-neg T1 T2 T3 T4]: (~ (not (iff s_1 s_2))
|
/// [nnf-neg T1 T2 T3 T4]: (~ (not (iff s_1 s_2))
|
||||||
/// (and (or r_1 r_2) (or r_1' r_2')))
|
/// (and (or r_1 r_2) (or r_1' r_2')))
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofNNFNeg { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_NEG; } }
|
public bool IsProofNNFNeg { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_NEG; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for (~ P Q) here Q is in negation normal form.
|
/// Indicates whether the term is a proof for (~ P Q) here Q is in negation normal form.
|
||||||
|
@ -1245,7 +1245,7 @@ namespace Microsoft.Z3
|
||||||
///
|
///
|
||||||
/// This proof object may have n antecedents. Each antecedent is a PR_DEF_INTRO.
|
/// This proof object may have n antecedents. Each antecedent is a PR_DEF_INTRO.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofNNFStar { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_STAR; } }
|
public bool IsProofNNFStar { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_STAR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for (~ P Q) where Q is in conjunctive normal form.
|
/// Indicates whether the term is a proof for (~ P Q) where Q is in conjunctive normal form.
|
||||||
|
@ -1255,7 +1255,7 @@ namespace Microsoft.Z3
|
||||||
/// This proof object is only used if the parameter PROOF_MODE is 1.
|
/// This proof object is only used if the parameter PROOF_MODE is 1.
|
||||||
/// This proof object may have n antecedents. Each antecedent is a PR_DEF_INTRO.
|
/// This proof object may have n antecedents. Each antecedent is a PR_DEF_INTRO.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofCNFStar { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_CNF_STAR; } }
|
public bool IsProofCNFStar { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_CNF_STAR; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for a Skolemization step
|
/// Indicates whether the term is a proof for a Skolemization step
|
||||||
|
@ -1268,7 +1268,7 @@ namespace Microsoft.Z3
|
||||||
///
|
///
|
||||||
/// This proof object has no antecedents.
|
/// This proof object has no antecedents.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofSkolemize { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_SKOLEMIZE; } }
|
public bool IsProofSkolemize { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_SKOLEMIZE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof by modus ponens for equi-satisfiability.
|
/// Indicates whether the term is a proof by modus ponens for equi-satisfiability.
|
||||||
|
@ -1279,7 +1279,7 @@ namespace Microsoft.Z3
|
||||||
/// T2: (~ p q)
|
/// T2: (~ p q)
|
||||||
/// [mp~ T1 T2]: q
|
/// [mp~ T1 T2]: q
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofModusPonensOEQ { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MODUS_PONENS_OEQ; } }
|
public bool IsProofModusPonensOEQ { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MODUS_PONENS_OEQ; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a proof for theory lemma
|
/// Indicates whether the term is a proof for theory lemma
|
||||||
|
@ -1298,7 +1298,7 @@ namespace Microsoft.Z3
|
||||||
/// (iff (= t1 t2) (and (<= t1 t2) (<= t2 t1)))
|
/// (iff (= t1 t2) (and (<= t1 t2) (<= t2 t1)))
|
||||||
/// - gcd-test - Indicates an integer linear arithmetic lemma that uses a gcd test.
|
/// - gcd-test - Indicates an integer linear arithmetic lemma that uses a gcd test.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsProofTheoryLemma { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TH_LEMMA; } }
|
public bool IsProofTheoryLemma { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TH_LEMMA; } }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Relational Terms
|
#region Relational Terms
|
||||||
|
@ -1323,40 +1323,40 @@ namespace Microsoft.Z3
|
||||||
/// The function takes <c>n+1</c> arguments, where the first argument is the relation and the remaining <c>n</c> elements
|
/// The function takes <c>n+1</c> arguments, where the first argument is the relation and the remaining <c>n</c> elements
|
||||||
/// correspond to the <c>n</c> columns of the relation.
|
/// correspond to the <c>n</c> columns of the relation.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsRelationStore { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_STORE; } }
|
public bool IsRelationStore { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_STORE; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an empty relation
|
/// Indicates whether the term is an empty relation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsEmptyRelation { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_EMPTY; } }
|
public bool IsEmptyRelation { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_EMPTY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a test for the emptiness of a relation
|
/// Indicates whether the term is a test for the emptiness of a relation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsIsEmptyRelation { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_IS_EMPTY; } }
|
public bool IsIsEmptyRelation { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_IS_EMPTY; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a relational join
|
/// Indicates whether the term is a relational join
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRelationalJoin { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_JOIN; } }
|
public bool IsRelationalJoin { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_JOIN; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is the union or convex hull of two relations.
|
/// Indicates whether the term is the union or convex hull of two relations.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>The function takes two arguments.</remarks>
|
/// <remarks>The function takes two arguments.</remarks>
|
||||||
public bool IsRelationUnion { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_UNION; } }
|
public bool IsRelationUnion { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_UNION; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is the widening of two relations
|
/// Indicates whether the term is the widening of two relations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>The function takes two arguments.</remarks>
|
/// <remarks>The function takes two arguments.</remarks>
|
||||||
public bool IsRelationWiden { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_WIDEN; } }
|
public bool IsRelationWiden { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_WIDEN; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a projection of columns (provided as numbers in the parameters).
|
/// Indicates whether the term is a projection of columns (provided as numbers in the parameters).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>The function takes one argument.</remarks>
|
/// <remarks>The function takes one argument.</remarks>
|
||||||
public bool IsRelationProject { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_PROJECT; } }
|
public bool IsRelationProject { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_PROJECT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a relation filter
|
/// Indicates whether the term is a relation filter
|
||||||
|
@ -1368,7 +1368,7 @@ namespace Microsoft.Z3
|
||||||
/// corresponding to the columns of the relation.
|
/// corresponding to the columns of the relation.
|
||||||
/// So the first column in the relation has index 0.
|
/// So the first column in the relation has index 0.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsRelationFilter { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_FILTER; } }
|
public bool IsRelationFilter { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_FILTER; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is an intersection of a relation with the negation of another.
|
/// Indicates whether the term is an intersection of a relation with the negation of another.
|
||||||
|
@ -1384,7 +1384,7 @@ namespace Microsoft.Z3
|
||||||
/// target are elements in x in pos, such that there is no y in neg that agrees with
|
/// target are elements in x in pos, such that there is no y in neg that agrees with
|
||||||
/// x on the columns c1, d1, .., cN, dN.
|
/// x on the columns c1, d1, .., cN, dN.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsRelationNegationFilter { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_NEGATION_FILTER; } }
|
public bool IsRelationNegationFilter { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_NEGATION_FILTER; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is the renaming of a column in a relation
|
/// Indicates whether the term is the renaming of a column in a relation
|
||||||
|
@ -1393,12 +1393,12 @@ namespace Microsoft.Z3
|
||||||
/// The function takes one argument.
|
/// The function takes one argument.
|
||||||
/// The parameters contain the renaming as a cycle.
|
/// The parameters contain the renaming as a cycle.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsRelationRename { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_RENAME; } }
|
public bool IsRelationRename { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_RENAME; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is the complement of a relation
|
/// Indicates whether the term is the complement of a relation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRelationComplement { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_COMPLEMENT; } }
|
public bool IsRelationComplement { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_COMPLEMENT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a relational select
|
/// Indicates whether the term is a relational select
|
||||||
|
@ -1408,7 +1408,7 @@ namespace Microsoft.Z3
|
||||||
/// The function takes <c>n+1</c> arguments, where the first argument is a relation,
|
/// The function takes <c>n+1</c> arguments, where the first argument is a relation,
|
||||||
/// and the remaining <c>n</c> arguments correspond to a record.
|
/// and the remaining <c>n</c> arguments correspond to a record.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsRelationSelect { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_SELECT; } }
|
public bool IsRelationSelect { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_SELECT; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a relational clone (copy)
|
/// Indicates whether the term is a relational clone (copy)
|
||||||
|
@ -1420,7 +1420,7 @@ namespace Microsoft.Z3
|
||||||
/// for terms of kind <seealso cref="IsRelationUnion"/>
|
/// for terms of kind <seealso cref="IsRelationUnion"/>
|
||||||
/// to perform destructive updates to the first argument.
|
/// to perform destructive updates to the first argument.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public bool IsRelationClone { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_CLONE; } }
|
public bool IsRelationClone { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_CLONE; } }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Finite domain terms
|
#region Finite domain terms
|
||||||
|
@ -1439,7 +1439,7 @@ namespace Microsoft.Z3
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the term is a less than predicate over a finite domain.
|
/// Indicates whether the term is a less than predicate over a finite domain.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsFiniteDomainLT { get { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_FD_LT; } }
|
public bool IsFiniteDomainLT { get { return IsApp && FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_FD_LT; } }
|
||||||
#endregion
|
#endregion
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ namespace Microsoft.Z3
|
||||||
/// The parameter names are case-insensitive. The character '-' should be viewed as an "alias" for '_'.
|
/// The parameter names are case-insensitive. The character '-' should be viewed as an "alias" for '_'.
|
||||||
/// Thus, the following parameter names are considered equivalent: "pp.decimal-precision" and "PP.DECIMAL_PRECISION".
|
/// Thus, the following parameter names are considered equivalent: "pp.decimal-precision" and "PP.DECIMAL_PRECISION".
|
||||||
/// This function can be used to set parameters for a specific Z3 module.
|
/// This function can be used to set parameters for a specific Z3 module.
|
||||||
/// This can be done by using <module-name>.<parameter-name>.
|
/// This can be done by using [module-name].[parameter-name].
|
||||||
/// For example:
|
/// For example:
|
||||||
/// Z3_global_param_set('pp.decimal', 'true')
|
/// Z3_global_param_set('pp.decimal', 'true')
|
||||||
/// will set the parameter "decimal" in the module "pp" to true.
|
/// will set the parameter "decimal" in the module "pp" to true.
|
||||||
|
|
|
@ -24,8 +24,7 @@
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DocumentationFile>
|
<DocumentationFile>..\Debug\Microsoft.Z3.XML</DocumentationFile>
|
||||||
</DocumentationFile>
|
|
||||||
<CodeContractsEnableRuntimeChecking>False</CodeContractsEnableRuntimeChecking>
|
<CodeContractsEnableRuntimeChecking>False</CodeContractsEnableRuntimeChecking>
|
||||||
<CodeContractsRuntimeOnlyPublicSurface>False</CodeContractsRuntimeOnlyPublicSurface>
|
<CodeContractsRuntimeOnlyPublicSurface>False</CodeContractsRuntimeOnlyPublicSurface>
|
||||||
<CodeContractsRuntimeThrowOnFailure>True</CodeContractsRuntimeThrowOnFailure>
|
<CodeContractsRuntimeThrowOnFailure>True</CodeContractsRuntimeThrowOnFailure>
|
||||||
|
@ -140,6 +139,7 @@
|
||||||
<CodeContractsRuntimeCheckingLevel>Full</CodeContractsRuntimeCheckingLevel>
|
<CodeContractsRuntimeCheckingLevel>Full</CodeContractsRuntimeCheckingLevel>
|
||||||
<CodeContractsReferenceAssembly>%28none%29</CodeContractsReferenceAssembly>
|
<CodeContractsReferenceAssembly>%28none%29</CodeContractsReferenceAssembly>
|
||||||
<CodeContractsAnalysisWarningLevel>0</CodeContractsAnalysisWarningLevel>
|
<CodeContractsAnalysisWarningLevel>0</CodeContractsAnalysisWarningLevel>
|
||||||
|
<DocumentationFile>..\x64\Debug\Microsoft.Z3.XML</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||||
<OutputPath>..\x64\external_64\</OutputPath>
|
<OutputPath>..\x64\external_64\</OutputPath>
|
||||||
|
@ -193,7 +193,7 @@
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'external|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'external|x64'">
|
||||||
<OutputPath>..\x64\external\</OutputPath>
|
<OutputPath>..\x64\external\</OutputPath>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DocumentationFile>..\external\Microsoft.Z3.xml</DocumentationFile>
|
<DocumentationFile>..\x64\external\Microsoft.Z3.XML</DocumentationFile>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
@ -220,7 +220,7 @@
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_delaysign|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_delaysign|AnyCPU'">
|
||||||
<OutputPath>..\Release_delaysign\</OutputPath>
|
<OutputPath>..\Release_delaysign\</OutputPath>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DocumentationFile>..\Release_delaysign\Microsoft.Z3.xml</DocumentationFile>
|
<DocumentationFile>..\Release_delaysign\Microsoft.Z3.XML</DocumentationFile>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
@ -238,7 +238,7 @@
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_delaysign|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_delaysign|x64'">
|
||||||
<OutputPath>bin\x64\Release_delaysign\</OutputPath>
|
<OutputPath>bin\x64\Release_delaysign\</OutputPath>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DocumentationFile>..\x64\external_64\Microsoft.Z3.xml</DocumentationFile>
|
<DocumentationFile>bin\x64\Release_delaysign\Microsoft.Z3.XML</DocumentationFile>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
@ -266,11 +266,12 @@
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
|
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
|
||||||
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
|
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
|
||||||
|
<DocumentationFile>bin\x86\Debug\Microsoft.Z3.XML</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||||
<OutputPath>bin\x86\Release\</OutputPath>
|
<OutputPath>bin\x86\Release\</OutputPath>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DocumentationFile>..\external\Microsoft.Z3.xml</DocumentationFile>
|
<DocumentationFile>bin\x86\Release\Microsoft.Z3.xml</DocumentationFile>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
@ -285,7 +286,7 @@
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'external|x86'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'external|x86'">
|
||||||
<OutputPath>bin\x86\external\</OutputPath>
|
<OutputPath>bin\x86\external\</OutputPath>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DocumentationFile>..\external\Microsoft.Z3.xml</DocumentationFile>
|
<DocumentationFile>bin\x86\external\Microsoft.Z3.XML</DocumentationFile>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
@ -303,7 +304,7 @@
|
||||||
<OutputPath>bin\x86\Release_delaysign\</OutputPath>
|
<OutputPath>bin\x86\Release_delaysign\</OutputPath>
|
||||||
<DefineConstants>DELAYSIGN</DefineConstants>
|
<DefineConstants>DELAYSIGN</DefineConstants>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DocumentationFile>..\Release_delaysign\Microsoft.Z3.xml</DocumentationFile>
|
<DocumentationFile>bin\x86\Release_delaysign\Microsoft.Z3.XML</DocumentationFile>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
|
|
@ -132,7 +132,8 @@ namespace Microsoft.Z3
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// This API is an alternative to <see cref="Check"/> with assumptions for extracting unsat cores.
|
/// This API is an alternative to <see cref="Check"/> with assumptions for extracting unsat cores.
|
||||||
/// Both APIs can be used in the same solver. The unsat core will contain a combination
|
/// Both APIs can be used in the same solver. The unsat core will contain a combination
|
||||||
/// of the Boolean variables provided using <see cref="AssertAndTrack"/> and the Boolean literals
|
/// of the Boolean variables provided using <see cref="AssertAndTrack(BoolExpr[],BoolExpr[])"/>
|
||||||
|
/// and the Boolean literals
|
||||||
/// provided using <see cref="Check"/> with assumptions.
|
/// provided using <see cref="Check"/> with assumptions.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public void AssertAndTrack(BoolExpr[] constraints, BoolExpr[] ps)
|
public void AssertAndTrack(BoolExpr[] constraints, BoolExpr[] ps)
|
||||||
|
@ -156,7 +157,8 @@ namespace Microsoft.Z3
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// This API is an alternative to <see cref="Check"/> with assumptions for extracting unsat cores.
|
/// This API is an alternative to <see cref="Check"/> with assumptions for extracting unsat cores.
|
||||||
/// Both APIs can be used in the same solver. The unsat core will contain a combination
|
/// Both APIs can be used in the same solver. The unsat core will contain a combination
|
||||||
/// of the Boolean variables provided using <see cref="AssertAndTrack"/> and the Boolean literals
|
/// of the Boolean variables provided using <see cref="AssertAndTrack(BoolExpr[],BoolExpr[])"/>
|
||||||
|
/// and the Boolean literals
|
||||||
/// provided using <see cref="Check"/> with assumptions.
|
/// provided using <see cref="Check"/> with assumptions.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public void AssertAndTrack(BoolExpr constraint, BoolExpr p)
|
public void AssertAndTrack(BoolExpr constraint, BoolExpr p)
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -874,6 +874,17 @@ void fpa2bv_converter::mk_div(func_decl * f, unsigned num, expr * const * args,
|
||||||
|
|
||||||
SASSERT(m_bv_util.get_bv_size(res_sig) == (sbits + 4));
|
SASSERT(m_bv_util.get_bv_size(res_sig) == (sbits + 4));
|
||||||
|
|
||||||
|
expr_ref res_sig_lz(m);
|
||||||
|
mk_leading_zeros(res_sig, sbits + 4, res_sig_lz);
|
||||||
|
dbg_decouple("fpa2bv_div_res_sig_lz", res_sig_lz);
|
||||||
|
expr_ref res_sig_shift_amount(m);
|
||||||
|
res_sig_shift_amount = m_bv_util.mk_bv_sub(res_sig_lz, m_bv_util.mk_numeral(1, sbits + 4));
|
||||||
|
dbg_decouple("fpa2bv_div_res_sig_shift_amount", res_sig_shift_amount);
|
||||||
|
expr_ref shift_cond(m);
|
||||||
|
shift_cond = m_bv_util.mk_ule(res_sig_lz, m_bv_util.mk_numeral(1, sbits + 4));
|
||||||
|
m_simp.mk_ite(shift_cond, res_sig, m_bv_util.mk_bv_shl(res_sig, res_sig_shift_amount), res_sig);
|
||||||
|
m_simp.mk_ite(shift_cond, res_exp, m_bv_util.mk_bv_sub(res_exp, m_bv_util.mk_extract(ebits+1, 0, res_sig_shift_amount)), res_exp);
|
||||||
|
|
||||||
round(f->get_range(), rm, res_sgn, res_sig, res_exp, v8);
|
round(f->get_range(), rm, res_sgn, res_sig, res_exp, v8);
|
||||||
|
|
||||||
// And finally, we tie them together.
|
// And finally, we tie them together.
|
||||||
|
@ -2743,215 +2754,3 @@ void fpa2bv_converter::round(sort * s, expr_ref & rm, expr_ref & sgn, expr_ref &
|
||||||
|
|
||||||
TRACE("fpa2bv_round", tout << "ROUND = " << mk_ismt2_pp(result, m) << std::endl; );
|
TRACE("fpa2bv_round", tout << "ROUND = " << mk_ismt2_pp(result, m) << std::endl; );
|
||||||
}
|
}
|
||||||
|
|
||||||
void fpa2bv_model_converter::display(std::ostream & out) {
|
|
||||||
out << "(fpa2bv-model-converter";
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = m_const2bv.begin();
|
|
||||||
it != m_const2bv.end();
|
|
||||||
it++) {
|
|
||||||
const symbol & n = it->m_key->get_name();
|
|
||||||
out << "\n (" << n << " ";
|
|
||||||
unsigned indent = n.size() + 4;
|
|
||||||
out << mk_ismt2_pp(it->m_value, m, indent) << ")";
|
|
||||||
}
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = m_rm_const2bv.begin();
|
|
||||||
it != m_rm_const2bv.end();
|
|
||||||
it++) {
|
|
||||||
const symbol & n = it->m_key->get_name();
|
|
||||||
out << "\n (" << n << " ";
|
|
||||||
unsigned indent = n.size() + 4;
|
|
||||||
out << mk_ismt2_pp(it->m_value, m, indent) << ")";
|
|
||||||
}
|
|
||||||
for (obj_map<func_decl, func_decl*>::iterator it = m_uf2bvuf.begin();
|
|
||||||
it != m_uf2bvuf.end();
|
|
||||||
it++) {
|
|
||||||
const symbol & n = it->m_key->get_name();
|
|
||||||
out << "\n (" << n << " ";
|
|
||||||
unsigned indent = n.size() + 4;
|
|
||||||
out << mk_ismt2_pp(it->m_value, m, indent) << ")";
|
|
||||||
}
|
|
||||||
for (obj_map<func_decl, func_decl_triple>::iterator it = m_uf23bvuf.begin();
|
|
||||||
it != m_uf23bvuf.end();
|
|
||||||
it++) {
|
|
||||||
const symbol & n = it->m_key->get_name();
|
|
||||||
out << "\n (" << n << " ";
|
|
||||||
unsigned indent = n.size() + 4;
|
|
||||||
out << mk_ismt2_pp(it->m_value.f_sgn, m, indent) << " ; " <<
|
|
||||||
mk_ismt2_pp(it->m_value.f_sig, m, indent) << " ; " <<
|
|
||||||
mk_ismt2_pp(it->m_value.f_exp, m, indent) << " ; " <<
|
|
||||||
")";
|
|
||||||
}
|
|
||||||
out << ")" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
model_converter * fpa2bv_model_converter::translate(ast_translation & translator) {
|
|
||||||
fpa2bv_model_converter * res = alloc(fpa2bv_model_converter, translator.to());
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = m_const2bv.begin();
|
|
||||||
it != m_const2bv.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
func_decl * k = translator(it->m_key);
|
|
||||||
expr * v = translator(it->m_value);
|
|
||||||
res->m_const2bv.insert(k, v);
|
|
||||||
translator.to().inc_ref(k);
|
|
||||||
translator.to().inc_ref(v);
|
|
||||||
}
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = m_rm_const2bv.begin();
|
|
||||||
it != m_rm_const2bv.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
func_decl * k = translator(it->m_key);
|
|
||||||
expr * v = translator(it->m_value);
|
|
||||||
res->m_rm_const2bv.insert(k, v);
|
|
||||||
translator.to().inc_ref(k);
|
|
||||||
translator.to().inc_ref(v);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fpa2bv_model_converter::convert(model * bv_mdl, model * float_mdl) {
|
|
||||||
float_util fu(m);
|
|
||||||
bv_util bu(m);
|
|
||||||
mpf fp_val;
|
|
||||||
unsynch_mpz_manager & mpzm = fu.fm().mpz_manager();
|
|
||||||
unsynch_mpq_manager & mpqm = fu.fm().mpq_manager();
|
|
||||||
|
|
||||||
TRACE("fpa2bv_mc", tout << "BV Model: " << std::endl;
|
|
||||||
for (unsigned i = 0 ; i < bv_mdl->get_num_constants(); i++)
|
|
||||||
tout << bv_mdl->get_constant(i)->get_name() << " --> " <<
|
|
||||||
mk_ismt2_pp(bv_mdl->get_const_interp(bv_mdl->get_constant(i)), m) << std::endl;
|
|
||||||
);
|
|
||||||
|
|
||||||
obj_hashtable<func_decl> seen;
|
|
||||||
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = m_const2bv.begin();
|
|
||||||
it != m_const2bv.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
func_decl * var = it->m_key;
|
|
||||||
app * a = to_app(it->m_value);
|
|
||||||
SASSERT(fu.is_float(var->get_range()));
|
|
||||||
SASSERT(var->get_range()->get_num_parameters() == 2);
|
|
||||||
|
|
||||||
unsigned ebits = fu.get_ebits(var->get_range());
|
|
||||||
unsigned sbits = fu.get_sbits(var->get_range());
|
|
||||||
|
|
||||||
expr_ref sgn(m), sig(m), exp(m);
|
|
||||||
sgn = bv_mdl->get_const_interp(to_app(a->get_arg(0))->get_decl());
|
|
||||||
sig = bv_mdl->get_const_interp(to_app(a->get_arg(1))->get_decl());
|
|
||||||
exp = bv_mdl->get_const_interp(to_app(a->get_arg(2))->get_decl());
|
|
||||||
|
|
||||||
seen.insert(to_app(a->get_arg(0))->get_decl());
|
|
||||||
seen.insert(to_app(a->get_arg(1))->get_decl());
|
|
||||||
seen.insert(to_app(a->get_arg(2))->get_decl());
|
|
||||||
|
|
||||||
if (!sgn && !sig && !exp)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
unsigned sgn_sz = bu.get_bv_size(m.get_sort(a->get_arg(0)));
|
|
||||||
unsigned sig_sz = bu.get_bv_size(m.get_sort(a->get_arg(1))) - 1;
|
|
||||||
unsigned exp_sz = bu.get_bv_size(m.get_sort(a->get_arg(2)));
|
|
||||||
|
|
||||||
rational sgn_q(0), sig_q(0), exp_q(0);
|
|
||||||
|
|
||||||
if (sgn) bu.is_numeral(sgn, sgn_q, sgn_sz);
|
|
||||||
if (sig) bu.is_numeral(sig, sig_q, sig_sz);
|
|
||||||
if (exp) bu.is_numeral(exp, exp_q, exp_sz);
|
|
||||||
|
|
||||||
// un-bias exponent
|
|
||||||
rational exp_unbiased_q;
|
|
||||||
exp_unbiased_q = exp_q - fu.fm().m_powers2.m1(ebits-1);
|
|
||||||
|
|
||||||
mpz sig_z; mpf_exp_t exp_z;
|
|
||||||
mpzm.set(sig_z, sig_q.to_mpq().numerator());
|
|
||||||
exp_z = mpzm.get_int64(exp_unbiased_q.to_mpq().numerator());
|
|
||||||
|
|
||||||
TRACE("fpa2bv_mc", tout << var->get_name() << " == [" << sgn_q.to_string() << " " <<
|
|
||||||
mpzm.to_string(sig_z) << " " << exp_z << "(" << exp_q.to_string() << ")]" << std::endl; );
|
|
||||||
|
|
||||||
fu.fm().set(fp_val, ebits, sbits, !mpqm.is_zero(sgn_q.to_mpq()), sig_z, exp_z);
|
|
||||||
|
|
||||||
float_mdl->register_decl(var, fu.mk_value(fp_val));
|
|
||||||
|
|
||||||
mpzm.del(sig_z);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = m_rm_const2bv.begin();
|
|
||||||
it != m_rm_const2bv.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
func_decl * var = it->m_key;
|
|
||||||
app * a = to_app(it->m_value);
|
|
||||||
SASSERT(fu.is_rm(var->get_range()));
|
|
||||||
rational val(0);
|
|
||||||
unsigned sz = 0;
|
|
||||||
if (a && bu.is_numeral(a, val, sz)) {
|
|
||||||
TRACE("fpa2bv_mc", tout << var->get_name() << " == " << val.to_string() << std::endl; );
|
|
||||||
SASSERT(val.is_uint64());
|
|
||||||
switch (val.get_uint64())
|
|
||||||
{
|
|
||||||
case BV_RM_TIES_TO_AWAY: float_mdl->register_decl(var, fu.mk_round_nearest_ties_to_away()); break;
|
|
||||||
case BV_RM_TIES_TO_EVEN: float_mdl->register_decl(var, fu.mk_round_nearest_ties_to_even()); break;
|
|
||||||
case BV_RM_TO_NEGATIVE: float_mdl->register_decl(var, fu.mk_round_toward_negative()); break;
|
|
||||||
case BV_RM_TO_POSITIVE: float_mdl->register_decl(var, fu.mk_round_toward_positive()); break;
|
|
||||||
case BV_RM_TO_ZERO:
|
|
||||||
default: float_mdl->register_decl(var, fu.mk_round_toward_zero());
|
|
||||||
}
|
|
||||||
seen.insert(var);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (obj_map<func_decl, func_decl*>::iterator it = m_uf2bvuf.begin();
|
|
||||||
it != m_uf2bvuf.end();
|
|
||||||
it++)
|
|
||||||
seen.insert(it->m_value);
|
|
||||||
|
|
||||||
for (obj_map<func_decl, func_decl_triple>::iterator it = m_uf23bvuf.begin();
|
|
||||||
it != m_uf23bvuf.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
seen.insert(it->m_value.f_sgn);
|
|
||||||
seen.insert(it->m_value.f_sig);
|
|
||||||
seen.insert(it->m_value.f_exp);
|
|
||||||
}
|
|
||||||
|
|
||||||
fu.fm().del(fp_val);
|
|
||||||
|
|
||||||
// Keep all the non-float constants.
|
|
||||||
unsigned sz = bv_mdl->get_num_constants();
|
|
||||||
for (unsigned i = 0; i < sz; i++)
|
|
||||||
{
|
|
||||||
func_decl * c = bv_mdl->get_constant(i);
|
|
||||||
if (!seen.contains(c))
|
|
||||||
float_mdl->register_decl(c, bv_mdl->get_const_interp(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
// And keep everything else
|
|
||||||
sz = bv_mdl->get_num_functions();
|
|
||||||
for (unsigned i = 0; i < sz; i++)
|
|
||||||
{
|
|
||||||
func_decl * f = bv_mdl->get_function(i);
|
|
||||||
if (!seen.contains(f))
|
|
||||||
{
|
|
||||||
TRACE("fpa2bv_mc", tout << "Keeping: " << mk_ismt2_pp(f, m) << std::endl; );
|
|
||||||
func_interp * val = bv_mdl->get_func_interp(f);
|
|
||||||
float_mdl->register_decl(f, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sz = bv_mdl->get_num_uninterpreted_sorts();
|
|
||||||
for (unsigned i = 0; i < sz; i++)
|
|
||||||
{
|
|
||||||
sort * s = bv_mdl->get_uninterpreted_sort(i);
|
|
||||||
ptr_vector<expr> u = bv_mdl->get_universe(s);
|
|
||||||
float_mdl->register_usort(s, u.size(), u.c_ptr());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
model_converter * mk_fpa2bv_model_converter(ast_manager & m,
|
|
||||||
obj_map<func_decl, expr*> const & const2bv,
|
|
||||||
obj_map<func_decl, expr*> const & rm_const2bv,
|
|
||||||
obj_map<func_decl, func_decl*> const & uf2bvuf,
|
|
||||||
obj_map<func_decl, func_decl_triple> const & uf23bvuf) {
|
|
||||||
return alloc(fpa2bv_model_converter, m, const2bv, rm_const2bv, uf2bvuf, uf23bvuf);
|
|
||||||
}
|
|
|
@ -24,13 +24,10 @@ Notes:
|
||||||
#include"ref_util.h"
|
#include"ref_util.h"
|
||||||
#include"float_decl_plugin.h"
|
#include"float_decl_plugin.h"
|
||||||
#include"bv_decl_plugin.h"
|
#include"bv_decl_plugin.h"
|
||||||
#include"model_converter.h"
|
|
||||||
#include"basic_simplifier_plugin.h"
|
#include"basic_simplifier_plugin.h"
|
||||||
|
|
||||||
typedef enum { BV_RM_TIES_TO_AWAY=0, BV_RM_TIES_TO_EVEN=1, BV_RM_TO_NEGATIVE=2, BV_RM_TO_POSITIVE=3, BV_RM_TO_ZERO=4 } BV_RM_VAL;
|
typedef enum { BV_RM_TIES_TO_AWAY=0, BV_RM_TIES_TO_EVEN=1, BV_RM_TO_NEGATIVE=2, BV_RM_TO_POSITIVE=3, BV_RM_TO_ZERO=4 } BV_RM_VAL;
|
||||||
|
|
||||||
class fpa2bv_model_converter;
|
|
||||||
|
|
||||||
struct func_decl_triple {
|
struct func_decl_triple {
|
||||||
func_decl_triple () { f_sgn = 0; f_sig = 0; f_exp = 0; }
|
func_decl_triple () { f_sgn = 0; f_sig = 0; f_exp = 0; }
|
||||||
func_decl_triple (func_decl * sgn, func_decl * sig, func_decl * exp)
|
func_decl_triple (func_decl * sgn, func_decl * sig, func_decl * exp)
|
||||||
|
@ -173,86 +170,4 @@ protected:
|
||||||
expr_ref & res_sgn, expr_ref & res_sig, expr_ref & res_exp);
|
expr_ref & res_sgn, expr_ref & res_sig, expr_ref & res_exp);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class fpa2bv_model_converter : public model_converter {
|
|
||||||
ast_manager & m;
|
|
||||||
obj_map<func_decl, expr*> m_const2bv;
|
|
||||||
obj_map<func_decl, expr*> m_rm_const2bv;
|
|
||||||
obj_map<func_decl, func_decl*> m_uf2bvuf;
|
|
||||||
obj_map<func_decl, func_decl_triple> m_uf23bvuf;
|
|
||||||
|
|
||||||
public:
|
|
||||||
fpa2bv_model_converter(ast_manager & m, obj_map<func_decl, expr*> const & const2bv,
|
|
||||||
obj_map<func_decl, expr*> const & rm_const2bv,
|
|
||||||
obj_map<func_decl, func_decl*> const & uf2bvuf,
|
|
||||||
obj_map<func_decl, func_decl_triple> const & uf23bvuf) :
|
|
||||||
m(m) {
|
|
||||||
// Just create a copy?
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = const2bv.begin();
|
|
||||||
it != const2bv.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
m_const2bv.insert(it->m_key, it->m_value);
|
|
||||||
m.inc_ref(it->m_key);
|
|
||||||
m.inc_ref(it->m_value);
|
|
||||||
}
|
|
||||||
for (obj_map<func_decl, expr*>::iterator it = rm_const2bv.begin();
|
|
||||||
it != rm_const2bv.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
m_rm_const2bv.insert(it->m_key, it->m_value);
|
|
||||||
m.inc_ref(it->m_key);
|
|
||||||
m.inc_ref(it->m_value);
|
|
||||||
}
|
|
||||||
for (obj_map<func_decl, func_decl*>::iterator it = uf2bvuf.begin();
|
|
||||||
it != uf2bvuf.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
m_uf2bvuf.insert(it->m_key, it->m_value);
|
|
||||||
m.inc_ref(it->m_key);
|
|
||||||
m.inc_ref(it->m_value);
|
|
||||||
}
|
|
||||||
for (obj_map<func_decl, func_decl_triple>::iterator it = uf23bvuf.begin();
|
|
||||||
it != uf23bvuf.end();
|
|
||||||
it++)
|
|
||||||
{
|
|
||||||
m_uf23bvuf.insert(it->m_key, it->m_value);
|
|
||||||
m.inc_ref(it->m_key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~fpa2bv_model_converter() {
|
|
||||||
dec_ref_map_key_values(m, m_const2bv);
|
|
||||||
dec_ref_map_key_values(m, m_rm_const2bv);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void operator()(model_ref & md, unsigned goal_idx) {
|
|
||||||
SASSERT(goal_idx == 0);
|
|
||||||
model * new_model = alloc(model, m);
|
|
||||||
obj_hashtable<func_decl> bits;
|
|
||||||
convert(md.get(), new_model);
|
|
||||||
md = new_model;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void operator()(model_ref & md) {
|
|
||||||
operator()(md, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void display(std::ostream & out);
|
|
||||||
|
|
||||||
virtual model_converter * translate(ast_translation & translator);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
fpa2bv_model_converter(ast_manager & m) : m(m) { }
|
|
||||||
|
|
||||||
void convert(model * bv_mdl, model * float_mdl);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
model_converter * mk_fpa2bv_model_converter(ast_manager & m,
|
|
||||||
obj_map<func_decl, expr*> const & const2bv,
|
|
||||||
obj_map<func_decl, expr*> const & rm_const2bv,
|
|
||||||
obj_map<func_decl, func_decl*> const & uf2bvuf,
|
|
||||||
obj_map<func_decl, func_decl_triple> const & uf23bvuf);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
8
src/duality/duality.h
Executable file → Normal file
8
src/duality/duality.h
Executable file → Normal file
|
@ -29,7 +29,7 @@ using namespace stl_ext;
|
||||||
|
|
||||||
namespace Duality {
|
namespace Duality {
|
||||||
|
|
||||||
struct implicant_solver;
|
class implicant_solver;
|
||||||
|
|
||||||
/* Generic operations on Z3 formulas */
|
/* Generic operations on Z3 formulas */
|
||||||
|
|
||||||
|
@ -118,7 +118,11 @@ protected:
|
||||||
expr FinishAndOr(const std::vector<expr> &args, bool is_and);
|
expr FinishAndOr(const std::vector<expr> &args, bool is_and);
|
||||||
expr PullCommonFactors(std::vector<expr> &args, bool is_and);
|
expr PullCommonFactors(std::vector<expr> &args, bool is_and);
|
||||||
Term IneqToEqRec(hash_map<ast, Term> &memo, const Term &t);
|
Term IneqToEqRec(hash_map<ast, Term> &memo, const Term &t);
|
||||||
|
Term CloneQuantAndSimp(const expr &t, const expr &body, bool is_forall);
|
||||||
|
Term PushQuantifier(const expr &t, const expr &body, bool is_forall);
|
||||||
|
void CollectJuncts(const Term &f, std::vector<Term> &lits, decl_kind op, bool negate);
|
||||||
|
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);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -548,24 +548,52 @@ namespace Duality {
|
||||||
return foo;
|
return foo;
|
||||||
}
|
}
|
||||||
|
|
||||||
Z3User::Term Z3User::CloneQuantAndSimp(const expr &t, const expr &body){
|
Z3User::Term Z3User::PushQuantifier(const expr &t, const expr &body, bool is_forall){
|
||||||
if(t.is_quantifier_forall() && body.is_app() && body.decl().get_decl_kind() == And){
|
if(t.get_quantifier_num_bound() == 1){
|
||||||
int nargs = body.num_args();
|
std::vector<expr> fmlas,free,not_free;
|
||||||
std::vector<expr> args(nargs);
|
CollectJuncts(body,fmlas, is_forall ? Or : And, false);
|
||||||
for(int i = 0; i < nargs; i++)
|
for(unsigned i = 0; i < fmlas.size(); i++){
|
||||||
args[i] = CloneQuantAndSimp(t, body.arg(i));
|
const expr &fmla = fmlas[i];
|
||||||
return ctx.make(And,args);
|
if(fmla.has_free(0))
|
||||||
|
free.push_back(fmla);
|
||||||
|
else
|
||||||
|
not_free.push_back(fmla);
|
||||||
|
}
|
||||||
|
decl_kind op = is_forall ? Or : And;
|
||||||
|
if(free.empty())
|
||||||
|
return DeleteBound(0,1,SimplifyAndOr(not_free,op == And));
|
||||||
|
expr q = clone_quantifier(is_forall ? Forall : Exists,t, SimplifyAndOr(free, op == And));
|
||||||
|
if(!not_free.empty())
|
||||||
|
q = ctx.make(op,q,DeleteBound(0,1,SimplifyAndOr(not_free, op == And)));
|
||||||
|
return q;
|
||||||
}
|
}
|
||||||
if(!t.is_quantifier_forall() && body.is_app() && body.decl().get_decl_kind() == Or){
|
return clone_quantifier(is_forall ? Forall : Exists,t,body);
|
||||||
int nargs = body.num_args();
|
|
||||||
std::vector<expr> args(nargs);
|
|
||||||
for(int i = 0; i < nargs; i++)
|
|
||||||
args[i] = CloneQuantAndSimp(t, body.arg(i));
|
|
||||||
return ctx.make(Or,args);
|
|
||||||
}
|
|
||||||
return clone_quantifier(t,body);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Z3User::Term Z3User::CloneQuantAndSimp(const expr &t, const expr &body, bool is_forall){
|
||||||
|
if(body.is_app()){
|
||||||
|
if(body.decl().get_decl_kind() == (is_forall ? And : Or)){ // quantifier distributes
|
||||||
|
int nargs = body.num_args();
|
||||||
|
std::vector<expr> args(nargs);
|
||||||
|
for(int i = 0; i < nargs; i++)
|
||||||
|
args[i] = CloneQuantAndSimp(t, body.arg(i), is_forall);
|
||||||
|
return SimplifyAndOr(args, body.decl().get_decl_kind() == And);
|
||||||
|
}
|
||||||
|
else if(body.decl().get_decl_kind() == (is_forall ? Or : And)){ // quantifier distributes
|
||||||
|
return PushQuantifier(t,body,is_forall); // may distribute partially
|
||||||
|
}
|
||||||
|
else if(body.decl().get_decl_kind() == Not){
|
||||||
|
return ctx.make(Not,CloneQuantAndSimp(t,body.arg(0),!is_forall));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(t.get_quantifier_num_bound() == 1 && !body.has_free(0))
|
||||||
|
return DeleteBound(0,1,body); // drop the quantifier
|
||||||
|
return clone_quantifier(is_forall ? Forall : Exists,t,body);
|
||||||
|
}
|
||||||
|
|
||||||
|
Z3User::Term Z3User::CloneQuantAndSimp(const expr &t, const expr &body){
|
||||||
|
return CloneQuantAndSimp(t,body,t.is_quantifier_forall());
|
||||||
|
}
|
||||||
|
|
||||||
Z3User::Term Z3User::SubstAtom(hash_map<ast, Term> &memo, const expr &t, const expr &atom, const expr &val){
|
Z3User::Term Z3User::SubstAtom(hash_map<ast, Term> &memo, const expr &t, const expr &atom, const expr &val){
|
||||||
std::pair<ast,Term> foo(t,expr(ctx));
|
std::pair<ast,Term> foo(t,expr(ctx));
|
||||||
|
@ -659,7 +687,7 @@ namespace Duality {
|
||||||
else if (t.is_quantifier())
|
else if (t.is_quantifier())
|
||||||
{
|
{
|
||||||
Term body = RemoveRedundancyRec(memo,smemo,t.body());
|
Term body = RemoveRedundancyRec(memo,smemo,t.body());
|
||||||
res = clone_quantifier(t, body);
|
res = CloneQuantAndSimp(t, body);
|
||||||
}
|
}
|
||||||
else res = t;
|
else res = t;
|
||||||
return res;
|
return res;
|
||||||
|
@ -2468,6 +2496,20 @@ namespace Duality {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Z3User::CollectJuncts(const Term &f, std::vector<Term> &lits, decl_kind op, bool negate){
|
||||||
|
if(f.is_app() && f.decl().get_decl_kind() == Not)
|
||||||
|
CollectJuncts(f.arg(0), lits, (op == And) ? Or : And, !negate);
|
||||||
|
else if(f.is_app() && f.decl().get_decl_kind() == op){
|
||||||
|
int num_args = f.num_args();
|
||||||
|
for(int i = 0; i < num_args; i++)
|
||||||
|
CollectJuncts(f.arg(i),lits,op,negate);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
expr junct = negate ? Negate(f) : f;
|
||||||
|
lits.push_back(junct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct TermLt {
|
struct TermLt {
|
||||||
bool operator()(const expr &x, const expr &y){
|
bool operator()(const expr &x, const expr &y){
|
||||||
unsigned xid = x.get_id();
|
unsigned xid = x.get_id();
|
||||||
|
@ -3418,6 +3460,46 @@ namespace Duality {
|
||||||
return SubstBoundRec(memo, subst, 0, t);
|
return SubstBoundRec(memo, subst, 0, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Eliminate the deBruijn indices from level to level+num-1
|
||||||
|
Z3User::Term Z3User::DeleteBoundRec(hash_map<int,hash_map<ast,Term> > &memo, int level, int num, const Term &t)
|
||||||
|
{
|
||||||
|
std::pair<ast,Term> foo(t,expr(ctx));
|
||||||
|
std::pair<hash_map<ast,Term>::iterator, bool> bar = memo[level].insert(foo);
|
||||||
|
Term &res = bar.first->second;
|
||||||
|
if(!bar.second) return res;
|
||||||
|
if (t.is_app())
|
||||||
|
{
|
||||||
|
func_decl f = t.decl();
|
||||||
|
std::vector<Term> args;
|
||||||
|
int nargs = t.num_args();
|
||||||
|
for(int i = 0; i < nargs; i++)
|
||||||
|
args.push_back(DeleteBoundRec(memo, level, num, t.arg(i)));
|
||||||
|
res = f(args.size(),&args[0]);
|
||||||
|
}
|
||||||
|
else if (t.is_quantifier()){
|
||||||
|
int bound = t.get_quantifier_num_bound();
|
||||||
|
std::vector<expr> pats;
|
||||||
|
t.get_patterns(pats);
|
||||||
|
for(unsigned i = 0; i < pats.size(); i++)
|
||||||
|
pats[i] = DeleteBoundRec(memo, level + bound, num, pats[i]);
|
||||||
|
res = clone_quantifier(t, DeleteBoundRec(memo, level + bound, num, t.body()), pats);
|
||||||
|
}
|
||||||
|
else if (t.is_var()) {
|
||||||
|
int idx = t.get_index_value();
|
||||||
|
if(idx >= level){
|
||||||
|
res = ctx.make_var(idx-num,t.get_sort());
|
||||||
|
}
|
||||||
|
else res = t;
|
||||||
|
}
|
||||||
|
else res = t;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Z3User::Term Z3User::DeleteBound(int level, int num, const Term &t){
|
||||||
|
hash_map<int,hash_map<ast,Term> > memo;
|
||||||
|
return DeleteBoundRec(memo, level, num, t);
|
||||||
|
}
|
||||||
|
|
||||||
int Z3User::MaxIndex(hash_map<ast,int> &memo, const Term &t)
|
int Z3User::MaxIndex(hash_map<ast,int> &memo, const Term &t)
|
||||||
{
|
{
|
||||||
std::pair<ast,int> foo(t,-1);
|
std::pair<ast,int> foo(t,-1);
|
||||||
|
|
2
src/duality/duality_solver.cpp
Executable file → Normal file
2
src/duality/duality_solver.cpp
Executable file → Normal file
|
@ -2201,7 +2201,7 @@ namespace Duality {
|
||||||
#endif
|
#endif
|
||||||
int expand_max = 1;
|
int expand_max = 1;
|
||||||
if(0&&duality->BatchExpand){
|
if(0&&duality->BatchExpand){
|
||||||
int thing = stack.size() /10;
|
int thing = stack.size() * 0.1;
|
||||||
expand_max = std::max(1,thing);
|
expand_max = std::max(1,thing);
|
||||||
if(expand_max > 1)
|
if(expand_max > 1)
|
||||||
std::cout << "foo!\n";
|
std::cout << "foo!\n";
|
||||||
|
|
|
@ -341,6 +341,12 @@ expr context::make_quant(decl_kind op, const std::vector<sort> &_sorts, const st
|
||||||
return simplify(p);
|
return simplify(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expr context::make_var(int idx, const sort &s){
|
||||||
|
::sort * a = to_sort(s.raw());
|
||||||
|
return cook(m().mk_var(idx,a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
expr expr::qe_lite() const {
|
expr expr::qe_lite() const {
|
||||||
::qe_lite qe(m());
|
::qe_lite qe(m());
|
||||||
expr_ref result(to_expr(raw()),m());
|
expr_ref result(to_expr(raw()),m());
|
||||||
|
@ -374,6 +380,12 @@ expr context::make_quant(decl_kind op, const std::vector<sort> &_sorts, const st
|
||||||
return q.ctx().cook(q.m().update_quantifier(thing, is_forall, num_patterns, &_patterns[0], to_expr(b.raw())));
|
return q.ctx().cook(q.m().update_quantifier(thing, is_forall, num_patterns, &_patterns[0], to_expr(b.raw())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expr clone_quantifier(decl_kind dk, const expr &q, const expr &b){
|
||||||
|
quantifier *thing = to_quantifier(q.raw());
|
||||||
|
bool is_forall = dk == Forall;
|
||||||
|
return q.ctx().cook(q.m().update_quantifier(thing, is_forall, to_expr(b.raw())));
|
||||||
|
}
|
||||||
|
|
||||||
void expr::get_patterns(std::vector<expr> &pats) const {
|
void expr::get_patterns(std::vector<expr> &pats) const {
|
||||||
quantifier *thing = to_quantifier(raw());
|
quantifier *thing = to_quantifier(raw());
|
||||||
unsigned num_patterns = thing->get_num_patterns();
|
unsigned num_patterns = thing->get_num_patterns();
|
||||||
|
|
17
src/duality/duality_wrapper.h
Executable file → Normal file
17
src/duality/duality_wrapper.h
Executable file → Normal file
|
@ -238,7 +238,7 @@ namespace Duality {
|
||||||
|
|
||||||
expr make_quant(decl_kind op, const std::vector<expr> &bvs, const expr &body);
|
expr make_quant(decl_kind op, const std::vector<expr> &bvs, const expr &body);
|
||||||
expr make_quant(decl_kind op, const std::vector<sort> &_sorts, const std::vector<symbol> &_names, const expr &body);
|
expr make_quant(decl_kind op, const std::vector<sort> &_sorts, const std::vector<symbol> &_names, const expr &body);
|
||||||
|
expr make_var(int idx, const sort &s);
|
||||||
|
|
||||||
decl_kind get_decl_kind(const func_decl &t);
|
decl_kind get_decl_kind(const func_decl &t);
|
||||||
|
|
||||||
|
@ -466,6 +466,16 @@ namespace Duality {
|
||||||
bool is_label (bool &pos,std::vector<symbol> &names) const ;
|
bool is_label (bool &pos,std::vector<symbol> &names) const ;
|
||||||
bool is_ground() const {return to_app(raw())->is_ground();}
|
bool is_ground() const {return to_app(raw())->is_ground();}
|
||||||
bool has_quantifiers() const {return to_app(raw())->has_quantifiers();}
|
bool has_quantifiers() const {return to_app(raw())->has_quantifiers();}
|
||||||
|
bool has_free(int idx) const {
|
||||||
|
used_vars proc;
|
||||||
|
proc.process(to_expr(raw()));
|
||||||
|
return proc.contains(idx);
|
||||||
|
}
|
||||||
|
unsigned get_max_var_idx_plus_1() const {
|
||||||
|
used_vars proc;
|
||||||
|
proc.process(to_expr(raw()));
|
||||||
|
return proc.get_max_found_var_idx_plus_1();
|
||||||
|
}
|
||||||
|
|
||||||
// operator Z3_app() const { assert(is_app()); return reinterpret_cast<Z3_app>(m_ast); }
|
// operator Z3_app() const { assert(is_app()); return reinterpret_cast<Z3_app>(m_ast); }
|
||||||
func_decl decl() const {return func_decl(ctx(),to_app(raw())->get_decl());}
|
func_decl decl() const {return func_decl(ctx(),to_app(raw())->get_decl());}
|
||||||
|
@ -573,6 +583,8 @@ namespace Duality {
|
||||||
|
|
||||||
friend expr clone_quantifier(const expr &q, const expr &b, const std::vector<expr> &patterns);
|
friend expr clone_quantifier(const expr &q, const expr &b, const std::vector<expr> &patterns);
|
||||||
|
|
||||||
|
friend expr clone_quantifier(decl_kind, const expr &, const expr &);
|
||||||
|
|
||||||
friend std::ostream & operator<<(std::ostream & out, expr const & m){
|
friend std::ostream & operator<<(std::ostream & out, expr const & m){
|
||||||
m.ctx().print_expr(out,m);
|
m.ctx().print_expr(out,m);
|
||||||
return out;
|
return out;
|
||||||
|
@ -1210,7 +1222,7 @@ namespace Duality {
|
||||||
inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
|
inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
|
||||||
|
|
||||||
inline expr func_decl::operator()(const std::vector<expr> &args) const {
|
inline expr func_decl::operator()(const std::vector<expr> &args) const {
|
||||||
return operator()(static_cast<unsigned>(args.size()),&args[0]);
|
return operator()(args.size(),&args[0]);
|
||||||
}
|
}
|
||||||
inline expr func_decl::operator()() const {
|
inline expr func_decl::operator()() const {
|
||||||
return operator()(0,0);
|
return operator()(0,0);
|
||||||
|
@ -1472,4 +1484,3 @@ namespace std {
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -464,7 +464,9 @@ namespace hash_space {
|
||||||
|
|
||||||
Value &operator[](const Key& key) {
|
Value &operator[](const Key& key) {
|
||||||
std::pair<Key,Value> kvp(key,Value());
|
std::pair<Key,Value> kvp(key,Value());
|
||||||
return this->lookup(kvp,true)->val.second;
|
return
|
||||||
|
hashtable<std::pair<Key,Value>,Key,HashFun,proj1<Key,Value>,EqFun>::
|
||||||
|
lookup(kvp,true)->val.second;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -814,6 +814,10 @@ class iz3proof_itp_impl : public iz3proof_itp {
|
||||||
ast equa = sep_cond(arg(pf,0),cond);
|
ast equa = sep_cond(arg(pf,0),cond);
|
||||||
if(is_equivrel_chain(equa)){
|
if(is_equivrel_chain(equa)){
|
||||||
ast lhs,rhs; eq_from_ineq(arg(neg_equality,0),lhs,rhs); // get inequality we need to prove
|
ast lhs,rhs; eq_from_ineq(arg(neg_equality,0),lhs,rhs); // get inequality we need to prove
|
||||||
|
if(!rewrites_from_to(equa,lhs,rhs)){
|
||||||
|
lhs = arg(arg(neg_equality,0),0); // the equality proved is ambiguous, sadly
|
||||||
|
rhs = arg(arg(neg_equality,0),1);
|
||||||
|
}
|
||||||
LitType lhst = get_term_type(lhs), rhst = get_term_type(rhs);
|
LitType lhst = get_term_type(lhs), rhst = get_term_type(rhs);
|
||||||
if(lhst != LitMixed && rhst != LitMixed)
|
if(lhst != LitMixed && rhst != LitMixed)
|
||||||
return unmixed_eq2ineq(lhs, rhs, op(arg(neg_equality,0)), equa, cond);
|
return unmixed_eq2ineq(lhs, rhs, op(arg(neg_equality,0)), equa, cond);
|
||||||
|
@ -1671,9 +1675,20 @@ class iz3proof_itp_impl : public iz3proof_itp {
|
||||||
return head;
|
return head;
|
||||||
}
|
}
|
||||||
|
|
||||||
// split a rewrite chain into head and tail at last non-mixed term
|
bool has_mixed_summands(const ast &e){
|
||||||
|
if(op(e) == Plus){
|
||||||
|
int nargs = num_args(e);
|
||||||
|
for(int i = 0; i < nargs; i++)
|
||||||
|
if(has_mixed_summands(arg(e,i)))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return get_term_type(e) == LitMixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// split a rewrite chain into head and tail at last sum with no mixed sumands
|
||||||
ast get_right_movers(const ast &chain, const ast &rhs, ast &tail, ast &mid){
|
ast get_right_movers(const ast &chain, const ast &rhs, ast &tail, ast &mid){
|
||||||
if(is_true(chain) || get_term_type(rhs) != LitMixed){
|
if(is_true(chain) || !has_mixed_summands(rhs)){
|
||||||
mid = rhs;
|
mid = rhs;
|
||||||
tail = mk_true();
|
tail = mk_true();
|
||||||
return chain;
|
return chain;
|
||||||
|
@ -1686,11 +1701,11 @@ class iz3proof_itp_impl : public iz3proof_itp {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// split a rewrite chain into head and tail at first non-mixed term
|
// split a rewrite chain into head and tail at first sum with no mixed sumands
|
||||||
ast get_left_movers(const ast &chain, const ast &lhs, ast &tail, ast &mid){
|
ast get_left_movers(const ast &chain, const ast &lhs, ast &tail, ast &mid){
|
||||||
if(is_true(chain)){
|
if(is_true(chain)){
|
||||||
mid = lhs;
|
mid = lhs;
|
||||||
if(get_term_type(lhs) != LitMixed){
|
if(!has_mixed_summands(lhs)){
|
||||||
tail = mk_true();
|
tail = mk_true();
|
||||||
return chain;
|
return chain;
|
||||||
}
|
}
|
||||||
|
@ -1790,10 +1805,21 @@ class iz3proof_itp_impl : public iz3proof_itp {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool rewrites_from_to(const ast &chain, const ast &lhs, const ast &rhs){
|
||||||
|
if(is_true(chain))
|
||||||
|
return lhs == rhs;
|
||||||
|
ast last = chain_last(chain);
|
||||||
|
ast rest = chain_rest(chain);
|
||||||
|
ast mid = subst_in_pos(rhs,rewrite_pos(last),rewrite_lhs(last));
|
||||||
|
return rewrites_from_to(rest,lhs,mid);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct bad_ineq_inference {};
|
||||||
|
|
||||||
ast chain_ineqs(opr comp_op, LitType t, const ast &chain, const ast &lhs, const ast &rhs){
|
ast chain_ineqs(opr comp_op, LitType t, const ast &chain, const ast &lhs, const ast &rhs){
|
||||||
if(is_true(chain)){
|
if(is_true(chain)){
|
||||||
if(lhs != rhs)
|
if(lhs != rhs)
|
||||||
throw "bad ineq inference";
|
throw bad_ineq_inference();
|
||||||
return make(Leq,make_int(rational(0)),make_int(rational(0)));
|
return make(Leq,make_int(rational(0)),make_int(rational(0)));
|
||||||
}
|
}
|
||||||
ast last = chain_last(chain);
|
ast last = chain_last(chain);
|
||||||
|
@ -2656,9 +2682,11 @@ class iz3proof_itp_impl : public iz3proof_itp {
|
||||||
pf = make_refl(e); // proof that e = e
|
pf = make_refl(e); // proof that e = e
|
||||||
|
|
||||||
prover::range erng = pv->ast_scope(e);
|
prover::range erng = pv->ast_scope(e);
|
||||||
|
#if 0
|
||||||
if(!(erng.lo > erng.hi) && pv->ranges_intersect(pv->ast_scope(e),rng)){
|
if(!(erng.lo > erng.hi) && pv->ranges_intersect(pv->ast_scope(e),rng)){
|
||||||
return e; // this term occurs in range, so it's O.K.
|
return e; // this term occurs in range, so it's O.K.
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
hash_map<ast,ast>::iterator it = localization_map.find(e);
|
hash_map<ast,ast>::iterator it = localization_map.find(e);
|
||||||
|
|
||||||
|
|
|
@ -530,7 +530,7 @@ bool check_hansel_lift(z_manager & upm, numeral_vector const & C,
|
||||||
upm.mul(A_lifted.size(), A_lifted.c_ptr(), B_lifted.size(), B_lifted.c_ptr(), test1);
|
upm.mul(A_lifted.size(), A_lifted.c_ptr(), B_lifted.size(), B_lifted.c_ptr(), test1);
|
||||||
upm.sub(C.size(), C.c_ptr(), test1.size(), test1.c_ptr(), test1);
|
upm.sub(C.size(), C.c_ptr(), test1.size(), test1.c_ptr(), test1);
|
||||||
to_zp_manager(br_upm, test1);
|
to_zp_manager(br_upm, test1);
|
||||||
if (!test1.size() == 0) {
|
if (test1.size() != 0) {
|
||||||
TRACE("polynomial::factorization::bughunt",
|
TRACE("polynomial::factorization::bughunt",
|
||||||
tout << "sage: R.<x> = ZZ['x']" << endl;
|
tout << "sage: R.<x> = ZZ['x']" << endl;
|
||||||
tout << "sage: A = "; upm.display(tout, A); tout << endl;
|
tout << "sage: A = "; upm.display(tout, A); tout << endl;
|
||||||
|
|
46
src/smt/theory_fpa.cpp
Normal file
46
src/smt/theory_fpa.cpp
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2014 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
theory_fpa.cpp
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Floating-Point Theory Plugin
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Christoph (cwinter) 2014-04-23
|
||||||
|
|
||||||
|
Revision History:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#include"ast_smt2_pp.h"
|
||||||
|
#include"theory_fpa.h"
|
||||||
|
|
||||||
|
namespace smt {
|
||||||
|
|
||||||
|
bool theory_fpa::internalize_atom(app * atom, bool gate_ctx) {
|
||||||
|
TRACE("bv", tout << "internalizing atom: " << mk_ismt2_pp(atom, get_manager()) << "\n";);
|
||||||
|
SASSERT(atom->get_family_id() == get_family_id());
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void theory_fpa::new_eq_eh(theory_var, theory_var) {
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
}
|
||||||
|
|
||||||
|
void theory_fpa::new_diseq_eh(theory_var, theory_var) {
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
}
|
||||||
|
|
||||||
|
void theory_fpa::push_scope_eh() {
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
}
|
||||||
|
|
||||||
|
void theory_fpa::pop_scope_eh(unsigned num_scopes) {
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
}
|
||||||
|
};
|
45
src/smt/theory_fpa.h
Normal file
45
src/smt/theory_fpa.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2014 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
theory_fpa.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Floating-Point Theory Plugin
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Christoph (cwinter) 2014-04-23
|
||||||
|
|
||||||
|
Revision History:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#ifndef _THEORY_FPA_H_
|
||||||
|
#define _THEORY_FPA_H_
|
||||||
|
|
||||||
|
#include"smt_theory.h"
|
||||||
|
#include"fpa2bv_converter.h"
|
||||||
|
|
||||||
|
namespace smt {
|
||||||
|
class theory_fpa : public theory {
|
||||||
|
fpa2bv_converter m_converter;
|
||||||
|
|
||||||
|
virtual final_check_status final_check_eh() { return FC_DONE; }
|
||||||
|
virtual bool internalize_atom(app*, bool);
|
||||||
|
virtual bool internalize_term(app*) { return internalize_atom(0, false); }
|
||||||
|
virtual void new_eq_eh(theory_var, theory_var);
|
||||||
|
virtual void new_diseq_eh(theory_var, theory_var);
|
||||||
|
virtual void push_scope_eh();
|
||||||
|
virtual void pop_scope_eh(unsigned num_scopes);
|
||||||
|
virtual theory* mk_fresh(context*) { return alloc(theory_fpa, get_manager()); }
|
||||||
|
virtual char const * get_name() const { return "fpa"; }
|
||||||
|
public:
|
||||||
|
theory_fpa(ast_manager& m) : theory(m.mk_family_id("fpa")), m_converter(m) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _THEORY_FPA_H_ */
|
||||||
|
|
232
src/tactic/fpa/fpa2bv_model_converter.cpp
Normal file
232
src/tactic/fpa/fpa2bv_model_converter.cpp
Normal file
|
@ -0,0 +1,232 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2012 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
fpa2bv_model_converter.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Model conversion for fpa2bv_converter
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Christoph (cwinter) 2012-02-09
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#include"ast_smt2_pp.h"
|
||||||
|
#include"fpa2bv_model_converter.h"
|
||||||
|
|
||||||
|
void fpa2bv_model_converter::display(std::ostream & out) {
|
||||||
|
out << "(fpa2bv-model-converter";
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = m_const2bv.begin();
|
||||||
|
it != m_const2bv.end();
|
||||||
|
it++) {
|
||||||
|
const symbol & n = it->m_key->get_name();
|
||||||
|
out << "\n (" << n << " ";
|
||||||
|
unsigned indent = n.size() + 4;
|
||||||
|
out << mk_ismt2_pp(it->m_value, m, indent) << ")";
|
||||||
|
}
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = m_rm_const2bv.begin();
|
||||||
|
it != m_rm_const2bv.end();
|
||||||
|
it++) {
|
||||||
|
const symbol & n = it->m_key->get_name();
|
||||||
|
out << "\n (" << n << " ";
|
||||||
|
unsigned indent = n.size() + 4;
|
||||||
|
out << mk_ismt2_pp(it->m_value, m, indent) << ")";
|
||||||
|
}
|
||||||
|
for (obj_map<func_decl, func_decl*>::iterator it = m_uf2bvuf.begin();
|
||||||
|
it != m_uf2bvuf.end();
|
||||||
|
it++) {
|
||||||
|
const symbol & n = it->m_key->get_name();
|
||||||
|
out << "\n (" << n << " ";
|
||||||
|
unsigned indent = n.size() + 4;
|
||||||
|
out << mk_ismt2_pp(it->m_value, m, indent) << ")";
|
||||||
|
}
|
||||||
|
for (obj_map<func_decl, func_decl_triple>::iterator it = m_uf23bvuf.begin();
|
||||||
|
it != m_uf23bvuf.end();
|
||||||
|
it++) {
|
||||||
|
const symbol & n = it->m_key->get_name();
|
||||||
|
out << "\n (" << n << " ";
|
||||||
|
unsigned indent = n.size() + 4;
|
||||||
|
out << mk_ismt2_pp(it->m_value.f_sgn, m, indent) << " ; " <<
|
||||||
|
mk_ismt2_pp(it->m_value.f_sig, m, indent) << " ; " <<
|
||||||
|
mk_ismt2_pp(it->m_value.f_exp, m, indent) << " ; " <<
|
||||||
|
")";
|
||||||
|
}
|
||||||
|
out << ")" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
model_converter * fpa2bv_model_converter::translate(ast_translation & translator) {
|
||||||
|
fpa2bv_model_converter * res = alloc(fpa2bv_model_converter, translator.to());
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = m_const2bv.begin();
|
||||||
|
it != m_const2bv.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
func_decl * k = translator(it->m_key);
|
||||||
|
expr * v = translator(it->m_value);
|
||||||
|
res->m_const2bv.insert(k, v);
|
||||||
|
translator.to().inc_ref(k);
|
||||||
|
translator.to().inc_ref(v);
|
||||||
|
}
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = m_rm_const2bv.begin();
|
||||||
|
it != m_rm_const2bv.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
func_decl * k = translator(it->m_key);
|
||||||
|
expr * v = translator(it->m_value);
|
||||||
|
res->m_rm_const2bv.insert(k, v);
|
||||||
|
translator.to().inc_ref(k);
|
||||||
|
translator.to().inc_ref(v);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fpa2bv_model_converter::convert(model * bv_mdl, model * float_mdl) {
|
||||||
|
float_util fu(m);
|
||||||
|
bv_util bu(m);
|
||||||
|
mpf fp_val;
|
||||||
|
unsynch_mpz_manager & mpzm = fu.fm().mpz_manager();
|
||||||
|
unsynch_mpq_manager & mpqm = fu.fm().mpq_manager();
|
||||||
|
|
||||||
|
TRACE("fpa2bv_mc", tout << "BV Model: " << std::endl;
|
||||||
|
for (unsigned i = 0; i < bv_mdl->get_num_constants(); i++)
|
||||||
|
tout << bv_mdl->get_constant(i)->get_name() << " --> " <<
|
||||||
|
mk_ismt2_pp(bv_mdl->get_const_interp(bv_mdl->get_constant(i)), m) << std::endl;
|
||||||
|
);
|
||||||
|
|
||||||
|
obj_hashtable<func_decl> seen;
|
||||||
|
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = m_const2bv.begin();
|
||||||
|
it != m_const2bv.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
func_decl * var = it->m_key;
|
||||||
|
app * a = to_app(it->m_value);
|
||||||
|
SASSERT(fu.is_float(var->get_range()));
|
||||||
|
SASSERT(var->get_range()->get_num_parameters() == 2);
|
||||||
|
|
||||||
|
unsigned ebits = fu.get_ebits(var->get_range());
|
||||||
|
unsigned sbits = fu.get_sbits(var->get_range());
|
||||||
|
|
||||||
|
expr_ref sgn(m), sig(m), exp(m);
|
||||||
|
sgn = bv_mdl->get_const_interp(to_app(a->get_arg(0))->get_decl());
|
||||||
|
sig = bv_mdl->get_const_interp(to_app(a->get_arg(1))->get_decl());
|
||||||
|
exp = bv_mdl->get_const_interp(to_app(a->get_arg(2))->get_decl());
|
||||||
|
|
||||||
|
seen.insert(to_app(a->get_arg(0))->get_decl());
|
||||||
|
seen.insert(to_app(a->get_arg(1))->get_decl());
|
||||||
|
seen.insert(to_app(a->get_arg(2))->get_decl());
|
||||||
|
|
||||||
|
if (!sgn && !sig && !exp)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
unsigned sgn_sz = bu.get_bv_size(m.get_sort(a->get_arg(0)));
|
||||||
|
unsigned sig_sz = bu.get_bv_size(m.get_sort(a->get_arg(1))) - 1;
|
||||||
|
unsigned exp_sz = bu.get_bv_size(m.get_sort(a->get_arg(2)));
|
||||||
|
|
||||||
|
rational sgn_q(0), sig_q(0), exp_q(0);
|
||||||
|
|
||||||
|
if (sgn) bu.is_numeral(sgn, sgn_q, sgn_sz);
|
||||||
|
if (sig) bu.is_numeral(sig, sig_q, sig_sz);
|
||||||
|
if (exp) bu.is_numeral(exp, exp_q, exp_sz);
|
||||||
|
|
||||||
|
// un-bias exponent
|
||||||
|
rational exp_unbiased_q;
|
||||||
|
exp_unbiased_q = exp_q - fu.fm().m_powers2.m1(ebits - 1);
|
||||||
|
|
||||||
|
mpz sig_z; mpf_exp_t exp_z;
|
||||||
|
mpzm.set(sig_z, sig_q.to_mpq().numerator());
|
||||||
|
exp_z = mpzm.get_int64(exp_unbiased_q.to_mpq().numerator());
|
||||||
|
|
||||||
|
TRACE("fpa2bv_mc", tout << var->get_name() << " == [" << sgn_q.to_string() << " " <<
|
||||||
|
mpzm.to_string(sig_z) << " " << exp_z << "(" << exp_q.to_string() << ")]" << std::endl;);
|
||||||
|
|
||||||
|
fu.fm().set(fp_val, ebits, sbits, !mpqm.is_zero(sgn_q.to_mpq()), sig_z, exp_z);
|
||||||
|
|
||||||
|
float_mdl->register_decl(var, fu.mk_value(fp_val));
|
||||||
|
|
||||||
|
mpzm.del(sig_z);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = m_rm_const2bv.begin();
|
||||||
|
it != m_rm_const2bv.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
func_decl * var = it->m_key;
|
||||||
|
app * a = to_app(it->m_value);
|
||||||
|
SASSERT(fu.is_rm(var->get_range()));
|
||||||
|
rational val(0);
|
||||||
|
unsigned sz = 0;
|
||||||
|
if (a && bu.is_numeral(a, val, sz)) {
|
||||||
|
TRACE("fpa2bv_mc", tout << var->get_name() << " == " << val.to_string() << std::endl;);
|
||||||
|
SASSERT(val.is_uint64());
|
||||||
|
switch (val.get_uint64())
|
||||||
|
{
|
||||||
|
case BV_RM_TIES_TO_AWAY: float_mdl->register_decl(var, fu.mk_round_nearest_ties_to_away()); break;
|
||||||
|
case BV_RM_TIES_TO_EVEN: float_mdl->register_decl(var, fu.mk_round_nearest_ties_to_even()); break;
|
||||||
|
case BV_RM_TO_NEGATIVE: float_mdl->register_decl(var, fu.mk_round_toward_negative()); break;
|
||||||
|
case BV_RM_TO_POSITIVE: float_mdl->register_decl(var, fu.mk_round_toward_positive()); break;
|
||||||
|
case BV_RM_TO_ZERO:
|
||||||
|
default: float_mdl->register_decl(var, fu.mk_round_toward_zero());
|
||||||
|
}
|
||||||
|
seen.insert(var);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (obj_map<func_decl, func_decl*>::iterator it = m_uf2bvuf.begin();
|
||||||
|
it != m_uf2bvuf.end();
|
||||||
|
it++)
|
||||||
|
seen.insert(it->m_value);
|
||||||
|
|
||||||
|
for (obj_map<func_decl, func_decl_triple>::iterator it = m_uf23bvuf.begin();
|
||||||
|
it != m_uf23bvuf.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
seen.insert(it->m_value.f_sgn);
|
||||||
|
seen.insert(it->m_value.f_sig);
|
||||||
|
seen.insert(it->m_value.f_exp);
|
||||||
|
}
|
||||||
|
|
||||||
|
fu.fm().del(fp_val);
|
||||||
|
|
||||||
|
// Keep all the non-float constants.
|
||||||
|
unsigned sz = bv_mdl->get_num_constants();
|
||||||
|
for (unsigned i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
func_decl * c = bv_mdl->get_constant(i);
|
||||||
|
if (!seen.contains(c))
|
||||||
|
float_mdl->register_decl(c, bv_mdl->get_const_interp(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
// And keep everything else
|
||||||
|
sz = bv_mdl->get_num_functions();
|
||||||
|
for (unsigned i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
func_decl * f = bv_mdl->get_function(i);
|
||||||
|
if (!seen.contains(f))
|
||||||
|
{
|
||||||
|
TRACE("fpa2bv_mc", tout << "Keeping: " << mk_ismt2_pp(f, m) << std::endl;);
|
||||||
|
func_interp * val = bv_mdl->get_func_interp(f);
|
||||||
|
float_mdl->register_decl(f, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = bv_mdl->get_num_uninterpreted_sorts();
|
||||||
|
for (unsigned i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
sort * s = bv_mdl->get_uninterpreted_sort(i);
|
||||||
|
ptr_vector<expr> u = bv_mdl->get_universe(s);
|
||||||
|
float_mdl->register_usort(s, u.size(), u.c_ptr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
model_converter * mk_fpa2bv_model_converter(ast_manager & m,
|
||||||
|
obj_map<func_decl, expr*> const & const2bv,
|
||||||
|
obj_map<func_decl, expr*> const & rm_const2bv,
|
||||||
|
obj_map<func_decl, func_decl*> const & uf2bvuf,
|
||||||
|
obj_map<func_decl, func_decl_triple> const & uf23bvuf) {
|
||||||
|
return alloc(fpa2bv_model_converter, m, const2bv, rm_const2bv, uf2bvuf, uf23bvuf);
|
||||||
|
}
|
106
src/tactic/fpa/fpa2bv_model_converter.h
Normal file
106
src/tactic/fpa/fpa2bv_model_converter.h
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2012 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
fpa2bv_model_converter.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Model conversion for fpa2bv_converter
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Christoph (cwinter) 2012-02-09
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#ifndef _FPA2BV_MODEL_CONVERTER_H_
|
||||||
|
#define _FPA2BV_MODEL_CONVERTER_H_
|
||||||
|
|
||||||
|
#include"fpa2bv_converter.h"
|
||||||
|
#include"model_converter.h"
|
||||||
|
|
||||||
|
class fpa2bv_model_converter : public model_converter {
|
||||||
|
ast_manager & m;
|
||||||
|
obj_map<func_decl, expr*> m_const2bv;
|
||||||
|
obj_map<func_decl, expr*> m_rm_const2bv;
|
||||||
|
obj_map<func_decl, func_decl*> m_uf2bvuf;
|
||||||
|
obj_map<func_decl, func_decl_triple> m_uf23bvuf;
|
||||||
|
|
||||||
|
public:
|
||||||
|
fpa2bv_model_converter(ast_manager & m, obj_map<func_decl, expr*> const & const2bv,
|
||||||
|
obj_map<func_decl, expr*> const & rm_const2bv,
|
||||||
|
obj_map<func_decl, func_decl*> const & uf2bvuf,
|
||||||
|
obj_map<func_decl, func_decl_triple> const & uf23bvuf) :
|
||||||
|
m(m) {
|
||||||
|
// Just create a copy?
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = const2bv.begin();
|
||||||
|
it != const2bv.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
m_const2bv.insert(it->m_key, it->m_value);
|
||||||
|
m.inc_ref(it->m_key);
|
||||||
|
m.inc_ref(it->m_value);
|
||||||
|
}
|
||||||
|
for (obj_map<func_decl, expr*>::iterator it = rm_const2bv.begin();
|
||||||
|
it != rm_const2bv.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
m_rm_const2bv.insert(it->m_key, it->m_value);
|
||||||
|
m.inc_ref(it->m_key);
|
||||||
|
m.inc_ref(it->m_value);
|
||||||
|
}
|
||||||
|
for (obj_map<func_decl, func_decl*>::iterator it = uf2bvuf.begin();
|
||||||
|
it != uf2bvuf.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
m_uf2bvuf.insert(it->m_key, it->m_value);
|
||||||
|
m.inc_ref(it->m_key);
|
||||||
|
m.inc_ref(it->m_value);
|
||||||
|
}
|
||||||
|
for (obj_map<func_decl, func_decl_triple>::iterator it = uf23bvuf.begin();
|
||||||
|
it != uf23bvuf.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
m_uf23bvuf.insert(it->m_key, it->m_value);
|
||||||
|
m.inc_ref(it->m_key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~fpa2bv_model_converter() {
|
||||||
|
dec_ref_map_key_values(m, m_const2bv);
|
||||||
|
dec_ref_map_key_values(m, m_rm_const2bv);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void operator()(model_ref & md, unsigned goal_idx) {
|
||||||
|
SASSERT(goal_idx == 0);
|
||||||
|
model * new_model = alloc(model, m);
|
||||||
|
obj_hashtable<func_decl> bits;
|
||||||
|
convert(md.get(), new_model);
|
||||||
|
md = new_model;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void operator()(model_ref & md) {
|
||||||
|
operator()(md, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void display(std::ostream & out);
|
||||||
|
|
||||||
|
virtual model_converter * translate(ast_translation & translator);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
fpa2bv_model_converter(ast_manager & m) : m(m) { }
|
||||||
|
|
||||||
|
void convert(model * bv_mdl, model * float_mdl);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
model_converter * mk_fpa2bv_model_converter(ast_manager & m,
|
||||||
|
obj_map<func_decl, expr*> const & const2bv,
|
||||||
|
obj_map<func_decl, expr*> const & rm_const2bv,
|
||||||
|
obj_map<func_decl, func_decl*> const & uf2bvuf,
|
||||||
|
obj_map<func_decl, func_decl_triple> const & uf23bvuf);
|
||||||
|
|
||||||
|
#endif
|
|
@ -20,6 +20,7 @@ Notes:
|
||||||
#include"fpa2bv_rewriter.h"
|
#include"fpa2bv_rewriter.h"
|
||||||
#include"simplify_tactic.h"
|
#include"simplify_tactic.h"
|
||||||
#include"fpa2bv_tactic.h"
|
#include"fpa2bv_tactic.h"
|
||||||
|
#include"fpa2bv_model_converter.h"
|
||||||
|
|
||||||
class fpa2bv_tactic : public tactic {
|
class fpa2bv_tactic : public tactic {
|
||||||
struct imp {
|
struct imp {
|
||||||
|
|
Loading…
Reference in a new issue