mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
ML/Java: Proper use of Datatype API for List/Enum/Constructor
Signed-off-by: Christoph M. Wintersteiger <cwinter@microsoft.com>
This commit is contained in:
parent
18bae81731
commit
6075ae28fc
|
@ -34,8 +34,7 @@ namespace Microsoft.Z3
|
||||||
public uint NumFields
|
public uint NumFields
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
init();
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,8 +47,11 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
init();
|
IntPtr constructor = IntPtr.Zero;
|
||||||
return m_constructorDecl;
|
IntPtr tester = IntPtr.Zero;
|
||||||
|
IntPtr[] accessors = new IntPtr[n];
|
||||||
|
Native.Z3_query_constructor(Context.nCtx, NativeObject, n, ref constructor, ref tester, accessors);
|
||||||
|
return new FuncDecl(Context, constructor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,8 +63,11 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
init();
|
IntPtr constructor = IntPtr.Zero;
|
||||||
return m_testerDecl;
|
IntPtr tester = IntPtr.Zero;
|
||||||
|
IntPtr[] accessors = new IntPtr[n];
|
||||||
|
Native.Z3_query_constructor(Context.nCtx, NativeObject, n, ref constructor, ref tester, accessors);
|
||||||
|
return new FuncDecl(Context, tester);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,8 +79,14 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl[]>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl[]>() != null);
|
||||||
init();
|
IntPtr constructor = IntPtr.Zero;
|
||||||
return m_accessorDecls;
|
IntPtr tester = IntPtr.Zero;
|
||||||
|
IntPtr[] accessors = new IntPtr[n];
|
||||||
|
Native.Z3_query_constructor(Context.nCtx, NativeObject, n, ref constructor, ref tester, accessors);
|
||||||
|
FuncDecl[] t = new FuncDecl[n];
|
||||||
|
for (uint i = 0; i < n; i++)
|
||||||
|
t[i] = new FuncDecl(Context, accessors[i]);
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,25 +96,11 @@ namespace Microsoft.Z3
|
||||||
~Constructor()
|
~Constructor()
|
||||||
{
|
{
|
||||||
Native.Z3_del_constructor(Context.nCtx, NativeObject);
|
Native.Z3_del_constructor(Context.nCtx, NativeObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Object invariant
|
|
||||||
|
|
||||||
[ContractInvariantMethod]
|
|
||||||
private void ObjectInvariant()
|
|
||||||
{
|
|
||||||
Contract.Invariant(m_testerDecl == null || m_constructorDecl != null);
|
|
||||||
Contract.Invariant(m_testerDecl == null || m_accessorDecls != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Internal
|
#region Internal
|
||||||
readonly private uint n = 0;
|
private uint n = 0;
|
||||||
private FuncDecl m_testerDecl = null;
|
|
||||||
private FuncDecl m_constructorDecl = null;
|
|
||||||
private FuncDecl[] m_accessorDecls = null;
|
|
||||||
|
|
||||||
internal Constructor(Context ctx, Symbol name, Symbol recognizer, Symbol[] fieldNames,
|
internal Constructor(Context ctx, Symbol name, Symbol recognizer, Symbol[] fieldNames,
|
||||||
Sort[] sorts, uint[] sortRefs)
|
Sort[] sorts, uint[] sortRefs)
|
||||||
: base(ctx)
|
: base(ctx)
|
||||||
|
@ -129,24 +126,6 @@ namespace Microsoft.Z3
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init()
|
|
||||||
{
|
|
||||||
Contract.Ensures(m_constructorDecl != null);
|
|
||||||
Contract.Ensures(m_testerDecl != null);
|
|
||||||
Contract.Ensures(m_accessorDecls != null);
|
|
||||||
|
|
||||||
if (m_testerDecl != null) return;
|
|
||||||
IntPtr constructor = IntPtr.Zero;
|
|
||||||
IntPtr tester = IntPtr.Zero;
|
|
||||||
IntPtr[] accessors = new IntPtr[n];
|
|
||||||
Native.Z3_query_constructor(Context.nCtx, NativeObject, n, ref constructor, ref tester, accessors);
|
|
||||||
m_constructorDecl = new FuncDecl(Context, constructor);
|
|
||||||
m_testerDecl = new FuncDecl(Context, tester);
|
|
||||||
m_accessorDecls = new FuncDecl[n];
|
|
||||||
for (uint i = 0; i < n; i++)
|
|
||||||
m_accessorDecls[i] = new FuncDecl(Context, accessors[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,8 +36,11 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl[]>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl[]>() != null);
|
||||||
|
uint n = Native.Z3_get_datatype_sort_num_constructors(Context.nCtx, NativeObject);
|
||||||
return _constdecls;
|
FuncDecl[] t = new FuncDecl[n];
|
||||||
|
for (uint i = 0; i < n; i++)
|
||||||
|
t[i] = new FuncDecl(Context, Native.Z3_get_datatype_sort_constructor(Context.nCtx, NativeObject, i));
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,8 +52,11 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<Expr[]>() != null);
|
Contract.Ensures(Contract.Result<Expr[]>() != null);
|
||||||
|
FuncDecl[] cds = ConstDecls;
|
||||||
return _consts;
|
Expr[] t = new Expr[cds.Length];
|
||||||
|
for (uint i = 0; i < t.Length; i++)
|
||||||
|
t[i] = Context.MkApp(cds[i]);
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,28 +68,15 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl[]>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl[]>() != null);
|
||||||
|
uint n = Native.Z3_get_datatype_sort_num_constructors(Context.nCtx, NativeObject);
|
||||||
return _testerdecls;
|
FuncDecl[] t = new FuncDecl[n];
|
||||||
|
for (uint i = 0; i < n; i++)
|
||||||
|
t[i] = new FuncDecl(Context, Native.Z3_get_datatype_sort_recognizer(Context.nCtx, NativeObject, i));
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Object Invariant
|
|
||||||
|
|
||||||
[ContractInvariantMethod]
|
|
||||||
private void ObjectInvariant()
|
|
||||||
{
|
|
||||||
Contract.Invariant(this._constdecls != null);
|
|
||||||
Contract.Invariant(this._testerdecls != null);
|
|
||||||
Contract.Invariant(this._consts != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Internal
|
#region Internal
|
||||||
readonly private FuncDecl[] _constdecls = null, _testerdecls = null;
|
|
||||||
readonly private Expr[] _consts = null;
|
|
||||||
|
|
||||||
internal EnumSort(Context ctx, Symbol name, Symbol[] enumNames)
|
internal EnumSort(Context ctx, Symbol name, Symbol[] enumNames)
|
||||||
: base(ctx)
|
: base(ctx)
|
||||||
{
|
{
|
||||||
|
@ -96,15 +89,6 @@ namespace Microsoft.Z3
|
||||||
IntPtr[] n_testers = new IntPtr[n];
|
IntPtr[] n_testers = new IntPtr[n];
|
||||||
NativeObject = Native.Z3_mk_enumeration_sort(ctx.nCtx, name.NativeObject, (uint)n,
|
NativeObject = Native.Z3_mk_enumeration_sort(ctx.nCtx, name.NativeObject, (uint)n,
|
||||||
Symbol.ArrayToNative(enumNames), n_constdecls, n_testers);
|
Symbol.ArrayToNative(enumNames), n_constdecls, n_testers);
|
||||||
_constdecls = new FuncDecl[n];
|
|
||||||
for (uint i = 0; i < n; i++)
|
|
||||||
_constdecls[i] = new FuncDecl(ctx, n_constdecls[i]);
|
|
||||||
_testerdecls = new FuncDecl[n];
|
|
||||||
for (uint i = 0; i < n; i++)
|
|
||||||
_testerdecls[i] = new FuncDecl(ctx, n_testers[i]);
|
|
||||||
_consts = new Expr[n];
|
|
||||||
for (uint i = 0; i < n; i++)
|
|
||||||
_consts[i] = ctx.MkApp(_constdecls[i]);
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
};
|
};
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
return nilDecl;
|
return new FuncDecl(Context, Native.Z3_get_datatype_sort_constructor(Context.nCtx, NativeObject, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<Expr>() != null);
|
Contract.Ensures(Contract.Result<Expr>() != null);
|
||||||
return nilConst;
|
return Context.MkApp(NilDecl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
return isNilDecl;
|
return new FuncDecl(Context, Native.Z3_get_datatype_sort_recognizer(Context.nCtx, NativeObject, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
return consDecl;
|
return new FuncDecl(Context, Native.Z3_get_datatype_sort_constructor(Context.nCtx, NativeObject, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
return isConsDecl;
|
return new FuncDecl(Context, Native.Z3_get_datatype_sort_recognizer(Context.nCtx, NativeObject, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
return headDecl;
|
return new FuncDecl(Context, Native.Z3_get_datatype_sort_constructor_accessor(Context.nCtx, NativeObject, 1, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,31 +109,11 @@ namespace Microsoft.Z3
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
Contract.Ensures(Contract.Result<FuncDecl>() != null);
|
||||||
return tailDecl;
|
return new FuncDecl(Context, Native.Z3_get_datatype_sort_constructor_accessor(Context.nCtx, NativeObject, 1, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Object Invariant
|
#region Internal
|
||||||
|
|
||||||
[ContractInvariantMethod]
|
|
||||||
private void ObjectInvariant()
|
|
||||||
{
|
|
||||||
Contract.Invariant(nilConst != null);
|
|
||||||
Contract.Invariant(nilDecl != null);
|
|
||||||
Contract.Invariant(isNilDecl != null);
|
|
||||||
Contract.Invariant(consDecl != null);
|
|
||||||
Contract.Invariant(isConsDecl != null);
|
|
||||||
Contract.Invariant(headDecl != null);
|
|
||||||
Contract.Invariant(tailDecl != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Internal
|
|
||||||
readonly private FuncDecl nilDecl, isNilDecl, consDecl, isConsDecl, headDecl, tailDecl;
|
|
||||||
readonly private Expr nilConst;
|
|
||||||
|
|
||||||
internal ListSort(Context ctx, Symbol name, Sort elemSort)
|
internal ListSort(Context ctx, Symbol name, Sort elemSort)
|
||||||
: base(ctx)
|
: base(ctx)
|
||||||
{
|
{
|
||||||
|
@ -141,22 +121,12 @@ namespace Microsoft.Z3
|
||||||
Contract.Requires(name != null);
|
Contract.Requires(name != null);
|
||||||
Contract.Requires(elemSort != null);
|
Contract.Requires(elemSort != null);
|
||||||
|
|
||||||
IntPtr inil = IntPtr.Zero,
|
IntPtr inil = IntPtr.Zero, iisnil = IntPtr.Zero,
|
||||||
iisnil = IntPtr.Zero,
|
icons = IntPtr.Zero, iiscons = IntPtr.Zero,
|
||||||
icons = IntPtr.Zero,
|
ihead = IntPtr.Zero, itail = IntPtr.Zero;
|
||||||
iiscons = IntPtr.Zero,
|
|
||||||
ihead = IntPtr.Zero,
|
|
||||||
itail = IntPtr.Zero;
|
|
||||||
|
|
||||||
NativeObject = Native.Z3_mk_list_sort(ctx.nCtx, name.NativeObject, elemSort.NativeObject,
|
NativeObject = Native.Z3_mk_list_sort(ctx.nCtx, name.NativeObject, elemSort.NativeObject,
|
||||||
ref inil, ref iisnil, ref icons, ref iiscons, ref ihead, ref itail);
|
ref inil, ref iisnil, ref icons, ref iiscons, ref ihead, ref itail);
|
||||||
nilDecl = new FuncDecl(ctx, inil);
|
|
||||||
isNilDecl = new FuncDecl(ctx, iisnil);
|
|
||||||
consDecl = new FuncDecl(ctx, icons);
|
|
||||||
isConsDecl = new FuncDecl(ctx, iiscons);
|
|
||||||
headDecl = new FuncDecl(ctx, ihead);
|
|
||||||
tailDecl = new FuncDecl(ctx, itail);
|
|
||||||
nilConst = ctx.MkConst(nilDecl);
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
};
|
};
|
||||||
|
|
|
@ -16,8 +16,7 @@ public class Constructor extends Z3Object
|
||||||
* @throws Z3Exception
|
* @throws Z3Exception
|
||||||
**/
|
**/
|
||||||
public int getNumFields() throws Z3Exception
|
public int getNumFields() throws Z3Exception
|
||||||
{
|
{
|
||||||
init();
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,8 +26,11 @@ public class Constructor extends Z3Object
|
||||||
**/
|
**/
|
||||||
public FuncDecl ConstructorDecl() throws Z3Exception
|
public FuncDecl ConstructorDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
init();
|
Native.LongPtr constructor = new Native.LongPtr();
|
||||||
return m_constructorDecl;
|
Native.LongPtr tester = new Native.LongPtr();
|
||||||
|
long[] accessors = new long[n];
|
||||||
|
Native.queryConstructor(getContext().nCtx(), getNativeObject(), n, constructor, tester, accessors);
|
||||||
|
return new FuncDecl(getContext(), constructor.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,8 +39,11 @@ public class Constructor extends Z3Object
|
||||||
**/
|
**/
|
||||||
public FuncDecl getTesterDecl() throws Z3Exception
|
public FuncDecl getTesterDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
init();
|
Native.LongPtr constructor = new Native.LongPtr();
|
||||||
return m_testerDecl;
|
Native.LongPtr tester = new Native.LongPtr();
|
||||||
|
long[] accessors = new long[n];
|
||||||
|
Native.queryConstructor(getContext().nCtx(), getNativeObject(), n, constructor, tester, accessors);
|
||||||
|
return new FuncDecl(getContext(), tester.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -47,8 +52,14 @@ public class Constructor extends Z3Object
|
||||||
**/
|
**/
|
||||||
public FuncDecl[] getAccessorDecls() throws Z3Exception
|
public FuncDecl[] getAccessorDecls() throws Z3Exception
|
||||||
{
|
{
|
||||||
init();
|
Native.LongPtr constructor = new Native.LongPtr();
|
||||||
return m_accessorDecls;
|
Native.LongPtr tester = new Native.LongPtr();
|
||||||
|
long[] accessors = new long[n];
|
||||||
|
Native.queryConstructor(getContext().nCtx(), getNativeObject(), n, constructor, tester, accessors);
|
||||||
|
FuncDecl[] t = new FuncDecl[n];
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
t[i] = new FuncDecl(getContext(), accessors[i]);
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,9 +71,6 @@ public class Constructor extends Z3Object
|
||||||
}
|
}
|
||||||
|
|
||||||
private int n = 0;
|
private int n = 0;
|
||||||
private FuncDecl m_testerDecl = null;
|
|
||||||
private FuncDecl m_constructorDecl = null;
|
|
||||||
private FuncDecl[] m_accessorDecls = null;
|
|
||||||
|
|
||||||
Constructor(Context ctx, Symbol name, Symbol recognizer,
|
Constructor(Context ctx, Symbol name, Symbol recognizer,
|
||||||
Symbol[] fieldNames, Sort[] sorts, int[] sortRefs)
|
Symbol[] fieldNames, Sort[] sorts, int[] sortRefs)
|
||||||
|
@ -87,21 +95,4 @@ public class Constructor extends Z3Object
|
||||||
Sort.arrayToNative(sorts), sortRefs));
|
Sort.arrayToNative(sorts), sortRefs));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init() throws Z3Exception
|
|
||||||
{
|
|
||||||
if (m_testerDecl != null)
|
|
||||||
return;
|
|
||||||
Native.LongPtr constructor = new Native.LongPtr();
|
|
||||||
Native.LongPtr tester = new Native.LongPtr();
|
|
||||||
long[] accessors = new long[n];
|
|
||||||
Native.queryConstructor(getContext().nCtx(), getNativeObject(), n,
|
|
||||||
constructor, tester, accessors);
|
|
||||||
m_constructorDecl = new FuncDecl(getContext(), constructor.value);
|
|
||||||
m_testerDecl = new FuncDecl(getContext(), tester.value);
|
|
||||||
m_accessorDecls = new FuncDecl[n];
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
m_accessorDecls[i] = new FuncDecl(getContext(), accessors[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,30 +14,39 @@ public class EnumSort extends Sort
|
||||||
/**
|
/**
|
||||||
* The function declarations of the constants in the enumeration.
|
* The function declarations of the constants in the enumeration.
|
||||||
**/
|
**/
|
||||||
public FuncDecl[] getConstDecls()
|
public FuncDecl[] getConstDecls() throws Z3Exception
|
||||||
{
|
{
|
||||||
return _constdecls;
|
int n = Native.getDatatypeSortNumConstructors(getContext().nCtx(), getNativeObject());
|
||||||
|
FuncDecl[] t = new FuncDecl[n];
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
t[i] = new FuncDecl(getContext(), Native.getDatatypeSortConstructor(getContext().nCtx(), getNativeObject(), i));
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The constants in the enumeration.
|
* The constants in the enumeration.
|
||||||
**/
|
**/
|
||||||
public Expr[] getConsts()
|
public Expr[] getConsts() throws Z3Exception
|
||||||
{
|
{
|
||||||
return _consts;
|
FuncDecl[] cds = getConstDecls();
|
||||||
|
Expr[] t = new Expr[cds.length];
|
||||||
|
for (int i = 0; i < t.length; i++)
|
||||||
|
t[i] = getContext().mkApp(cds[i]);
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The test predicates for the constants in the enumeration.
|
* The test predicates for the constants in the enumeration.
|
||||||
**/
|
**/
|
||||||
public FuncDecl[] getTesterDecls()
|
public FuncDecl[] getTesterDecls() throws Z3Exception
|
||||||
{
|
{
|
||||||
return _testerdecls;
|
int n = Native.getDatatypeSortNumConstructors(getContext().nCtx(), getNativeObject());
|
||||||
|
FuncDecl[] t = new FuncDecl[n];
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
t[i] = new FuncDecl(getContext(), Native.getDatatypeSortRecognizer(getContext().nCtx(), getNativeObject(), i));
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
private FuncDecl[] _constdecls = null, _testerdecls = null;
|
|
||||||
private Expr[] _consts = null;
|
|
||||||
|
|
||||||
EnumSort(Context ctx, Symbol name, Symbol[] enumNames) throws Z3Exception
|
EnumSort(Context ctx, Symbol name, Symbol[] enumNames) throws Z3Exception
|
||||||
{
|
{
|
||||||
super(ctx);
|
super(ctx);
|
||||||
|
@ -47,15 +56,6 @@ public class EnumSort extends Sort
|
||||||
long[] n_testers = new long[n];
|
long[] n_testers = new long[n];
|
||||||
setNativeObject(Native.mkEnumerationSort(ctx.nCtx(),
|
setNativeObject(Native.mkEnumerationSort(ctx.nCtx(),
|
||||||
name.getNativeObject(), (int) n, Symbol.arrayToNative(enumNames),
|
name.getNativeObject(), (int) n, Symbol.arrayToNative(enumNames),
|
||||||
n_constdecls, n_testers));
|
n_constdecls, n_testers));
|
||||||
_constdecls = new FuncDecl[n];
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
_constdecls[i] = new FuncDecl(ctx, n_constdecls[i]);
|
|
||||||
_testerdecls = new FuncDecl[n];
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
_testerdecls[i] = new FuncDecl(ctx, n_testers[i]);
|
|
||||||
_consts = new Expr[n];
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
_consts[i] = ctx.mkApp(_constdecls[i], (Expr[])null);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,65 +13,68 @@ public class ListSort extends Sort
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The declaration of the nil function of this list sort.
|
* The declaration of the nil function of this list sort.
|
||||||
|
* @throws Z3Exception
|
||||||
**/
|
**/
|
||||||
public FuncDecl getNilDecl()
|
public FuncDecl getNilDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
return nilDecl;
|
return new FuncDecl(getContext(), Native.getDatatypeSortConstructor(getContext().nCtx(), getNativeObject(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The empty list.
|
* The empty list.
|
||||||
|
* @throws Z3Exception
|
||||||
**/
|
**/
|
||||||
public Expr getNil()
|
public Expr getNil() throws Z3Exception
|
||||||
{
|
{
|
||||||
return nilConst;
|
return getContext().mkApp(getNilDecl());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The declaration of the isNil function of this list sort.
|
* The declaration of the isNil function of this list sort.
|
||||||
|
* @throws Z3Exception
|
||||||
**/
|
**/
|
||||||
public FuncDecl getIsNilDecl()
|
public FuncDecl getIsNilDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
return isNilDecl;
|
return new FuncDecl(getContext(), Native.getDatatypeSortRecognizer(getContext().nCtx(), getNativeObject(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The declaration of the cons function of this list sort.
|
* The declaration of the cons function of this list sort.
|
||||||
|
* @throws Z3Exception
|
||||||
**/
|
**/
|
||||||
public FuncDecl getConsDecl()
|
public FuncDecl getConsDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
return consDecl;
|
return new FuncDecl(getContext(), Native.getDatatypeSortConstructor(getContext().nCtx(), getNativeObject(), 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The declaration of the isCons function of this list sort.
|
* The declaration of the isCons function of this list sort.
|
||||||
|
* @throws Z3Exception
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
public FuncDecl getIsConsDecl()
|
public FuncDecl getIsConsDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
return isConsDecl;
|
return new FuncDecl(getContext(), Native.getDatatypeSortRecognizer(getContext().nCtx(), getNativeObject(), 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The declaration of the head function of this list sort.
|
* The declaration of the head function of this list sort.
|
||||||
|
* @throws Z3Exception
|
||||||
**/
|
**/
|
||||||
public FuncDecl getHeadDecl()
|
public FuncDecl getHeadDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
return headDecl;
|
return new FuncDecl(getContext(), Native.getDatatypeSortConstructorAccessor(getContext().nCtx(), getNativeObject(), 1, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The declaration of the tail function of this list sort.
|
* The declaration of the tail function of this list sort.
|
||||||
|
* @throws Z3Exception
|
||||||
**/
|
**/
|
||||||
public FuncDecl getTailDecl()
|
public FuncDecl getTailDecl() throws Z3Exception
|
||||||
{
|
{
|
||||||
return tailDecl;
|
return new FuncDecl(getContext(), Native.getDatatypeSortConstructorAccessor(getContext().nCtx(), getNativeObject(), 1, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private FuncDecl nilDecl, isNilDecl, consDecl, isConsDecl, headDecl,
|
|
||||||
tailDecl;
|
|
||||||
private Expr nilConst;
|
|
||||||
|
|
||||||
ListSort(Context ctx, Symbol name, Sort elemSort) throws Z3Exception
|
ListSort(Context ctx, Symbol name, Sort elemSort) throws Z3Exception
|
||||||
{
|
{
|
||||||
super(ctx);
|
super(ctx);
|
||||||
|
@ -83,12 +86,5 @@ public class ListSort extends Sort
|
||||||
setNativeObject(Native.mkListSort(ctx.nCtx(), name.getNativeObject(),
|
setNativeObject(Native.mkListSort(ctx.nCtx(), name.getNativeObject(),
|
||||||
elemSort.getNativeObject(), inil, iisnil, icons, iiscons, ihead,
|
elemSort.getNativeObject(), inil, iisnil, icons, iiscons, ihead,
|
||||||
itail));
|
itail));
|
||||||
nilDecl = new FuncDecl(ctx, inil.value);
|
|
||||||
isNilDecl = new FuncDecl(ctx, iisnil.value);
|
|
||||||
consDecl = new FuncDecl(ctx, icons.value);
|
|
||||||
isConsDecl = new FuncDecl(ctx, iiscons.value);
|
|
||||||
headDecl = new FuncDecl(ctx, ihead.value);
|
|
||||||
tailDecl = new FuncDecl(ctx, itail.value);
|
|
||||||
nilConst = ctx.mkConst(nilDecl);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue