/// <summary> /// Create mutually recursive datatypes. /// </summary> /// <param name="names">names of datatype sorts</param> /// <param name="c">list of constructors, one list per sort.</param> public DatatypeSort[] MkDatatypeSorts(Symbol[] names, Constructor[][] c) { Contract.Requires(names != null); Contract.Requires(c != null); Contract.Requires(names.Length == c.Length); Contract.Requires(Contract.ForAll(0, c.Length, j => c[j] != null)); Contract.Requires(Contract.ForAll(names, name => name != null)); Contract.Ensures(Contract.Result<DatatypeSort[]>() != null); CheckContextMatch(names); uint n = (uint)names.Length; ConstructorList[] cla = new ConstructorList[n]; IntPtr[] n_constr = new IntPtr[n]; for (uint i = 0; i < n; i++) { Constructor[] constructor = c[i]; Contract.Assume(Contract.ForAll(constructor, arr => arr != null), "Clousot does not support yet quantified formula on multidimensional arrays"); CheckContextMatch(constructor); cla[i] = new ConstructorList(this, constructor); n_constr[i] = cla[i].NativeObject; } IntPtr[] n_res = new IntPtr[n]; Native.Z3_mk_datatypes(nCtx, n, Symbol.ArrayToNative(names), n_res, n_constr); DatatypeSort[] res = new DatatypeSort[n]; for (uint i = 0; i < n; i++) res[i] = new DatatypeSort(this, n_res[i]); return res; }