public SingletonEmbedding(TypeEmbedder owner, Symbol symbol) { Contract.Requires(owner != null); Contract.Requires(symbol != null && symbol.IsNonVarConstant); Owner = owner; bool wasAdded; if (symbol.Kind == SymbolKind.BaseCnstSymb) { var bc = (BaseCnstSymb)symbol; if (bc.CnstKind == CnstKind.Numeric && ((Rational)bc.Raw).IsInteger) { var r = Index.MkApply(symbol, TermIndex.EmptyArgs, out wasAdded); Type = Index.MkApply(Index.RangeSymbol, new Term[] { r, r }, out wasAdded); } else { Type = Index.MkApply(symbol, TermIndex.EmptyArgs, out wasAdded); } } else { Type = Index.MkApply(symbol, TermIndex.EmptyArgs, out wasAdded); } singletonCon = Context.MkConstructor( string.Format(CreatorName, symbol.PrintableName), string.Format(TesterName, symbol.PrintableName)); Representation = Context.MkDatatypeSort(string.Format(SortName, symbol.PrintableName), new Z3Con[] { singletonCon }); CreationFun = singletonCon.ConstructorDecl; TesterFun = singletonCon.TesterDecl; DefaultMember = new Tuple <Term, Z3Expr>(Value, CreationFun.Apply()); }
public StringEmbedding(TypeEmbedder owner, uint cost) { Contract.Requires(owner != null); Owner = owner; EncodingCost = cost; bool wasAdded; Type = Index.MkApply(Index.SymbolTable.GetSortSymbol(BaseSortKind.String), TermIndex.EmptyArgs, out wasAdded); charSort = Context.MkBitVecSort(CharWidth); //// Converts bit vectors to strings. charBoxing = Context.MkConstructor( CharBoxingName, IsCharName, new string[] { CharUnboxingName }, new Z3Sort[] { charSort }); //// Append a char to a string appStr = Context.MkConstructor( AppStrName, IsMultiStrName, new string[] { AppPrefixName, AppSuffixName }, new Z3Sort[] { null, charSort }, new uint[] { 0, 0 }); neStrSort = Context.MkDatatypeSort(NeStrSortName, new Z3Con[] { charBoxing, appStr }); isChar = charBoxing.TesterDecl; charUnboxing = charBoxing.AccessorDecls[0]; isMultiStr = appStr.TesterDecl; appPrefix = appStr.AccessorDecls[0]; appSuffix = appStr.AccessorDecls[1]; //// Functions for building strings. strBoxing = Context.MkConstructor( StrBoxingName, IsNeStrName, new string[] { StrUnboxingName }, new Z3Sort[] { neStrSort }); emptyStr = Context.MkConstructor( EmptyStrName, IsEmptyStrName, null, null, null); strSort = Context.MkDatatypeSort(StrSortName, new Z3Con[] { emptyStr, strBoxing }); isNeStr = strBoxing.TesterDecl; strUnboxing = strBoxing.AccessorDecls[0]; isEmptyStr = emptyStr.TesterDecl; Representation = strSort; DefaultMember = new Tuple <Term, Z3Expr>(Index.EmptyStringValue, emptyStr.ConstructorDecl.Apply()); }
public PosIntegerEmbedding(TypeEmbedder owner, uint cost) { Contract.Requires(owner != null); Owner = owner; EncodingCost = cost; bool wasAdded; Type = Index.MkApply(Index.SymbolTable.GetSortSymbol(BaseSortKind.PosInteger), TermIndex.EmptyArgs, out wasAdded); boxingCon = Context.MkConstructor(BoxingName, TesterName, new string[] { UnboxingName }, new Z3Sort[] { Context.MkIntSort() }); Representation = Context.MkDatatypeSort(SortName, new Z3Con[] { boxingCon }); BoxingFun = boxingCon.ConstructorDecl; UnboxingFun = boxingCon.AccessorDecls[0]; TesterFun = boxingCon.TesterDecl; DefaultMember = new Tuple <Term, Z3Expr>(Index.MkCnst(Rational.One, out wasAdded), BoxingFun.Apply(Context.MkInt(1))); }
public EnumEmbedding(TypeEmbedder owner, Term type, string name) { Contract.Requires(owner != null); Contract.Requires(type != null); Owner = owner; uint id; Type = type; foreach (var t in type.Enumerate(x => x.Args)) { if (t.Symbol.Arity == 0) { Contract.Assert(t.Symbol.Kind == SymbolKind.BaseCnstSymb || t.Symbol.Kind == SymbolKind.UserCnstSymb); id = (uint)valToSymb.Count; valToSymb.Add(id, t.Symbol); symbToVal.Add(t.Symbol, id); } } var size = ((uint)valToSymb.Count).MostSignificantOne(); Contract.Assert(((uint)valToSymb.Count).PopulationCount() == 1); bvSort = Context.MkBitVecSort(size); bool wasAdded; boxingCon = Context.MkConstructor( string.Format(BoxingName, name), string.Format(TesterName, name), new string[] { string.Format(UnboxingName, name) }, new Z3Sort[] { bvSort }); Representation = Context.MkDatatypeSort(string.Format(SortName, name), new Z3Con[] { boxingCon }); BoxingFun = boxingCon.ConstructorDecl; UnboxingFun = boxingCon.AccessorDecls[0]; TesterFun = boxingCon.TesterDecl; DefaultMember = new Tuple <Term, Z3Expr>( Index.MkApply(valToSymb[0], TermIndex.EmptyArgs, out wasAdded), BoxingFun.Apply(Context.MkBV(0, size))); }
public IntRangeEmbedding(TypeEmbedder owner, BigInteger lower, BigInteger upper) { Contract.Requires(owner != null); Contract.Requires(lower <= upper); Owner = owner; Lower = lower; Upper = upper; var width = upper - lower + 1; Contract.Assert(width > 1 && width.IsPowerOfTwo); bvSort = Context.MkBitVecSort(width.MostSignificantOne()); bool wasAdded; Type = Index.MkApply(Index.RangeSymbol, new Term[] { Index.MkCnst(new Rational(lower, BigInteger.One), out wasAdded), Index.MkCnst(new Rational(upper, BigInteger.One), out wasAdded) }, out wasAdded); boxingCon = Context.MkConstructor( string.Format(BoxingName, lower, upper), string.Format(TesterName, lower, upper), new string[] { string.Format(UnboxingName, lower, upper) }, new Z3Sort[] { bvSort }); Representation = Context.MkDatatypeSort(string.Format(SortName, lower, upper), new Z3Con[] { boxingCon }); BoxingFun = boxingCon.ConstructorDecl; UnboxingFun = boxingCon.AccessorDecls[0]; TesterFun = boxingCon.TesterDecl; DefaultMember = new Tuple <Term, Z3Expr>( Index.MkCnst(new Rational(lower, BigInteger.One), out wasAdded), BoxingFun.Apply(Context.MkBV(0, bvSort.Size))); z3Lower = Context.MkInt(Lower.ToString()); }
private void MkConUnnTypes(Map <Term, Tuple <uint, UserSymbol> > sortToIndex) { if (sortToIndex.Count == 0) { return; } var idToEmbedding = new Map <uint, ITypeEmbedding>((x, y) => ((int)x) - ((int)y)); foreach (var kv in sortToIndex) { if (kv.Key.Symbol.Kind == SymbolKind.UserSortSymb) { idToEmbedding.Add( kv.Value.Item1, new ConstructorEmbedding(this, ((UserSortSymb)kv.Key.Symbol).DataSymbol, sortToIndex)); } else { idToEmbedding.Add( kv.Value.Item1, new UnionEmbedding(this, kv.Key, sortToIndex)); } } var sortNames = new string[idToEmbedding.Count]; var cons = new Z3Con[idToEmbedding.Count][]; UnionEmbedding ue; ConstructorEmbedding ce; uint id; foreach (var kv in idToEmbedding) { id = kv.Key; if (kv.Value.Kind == TypeEmbeddingKind.Constructor) { ce = (ConstructorEmbedding)kv.Value; sortNames[id] = ce.Constructor.FullName; cons[id] = new Z3Con[] { ce.Z3Constructor }; } else { ue = (UnionEmbedding)kv.Value; sortNames[id] = ue.Name; cons[id] = ue.Boxers; } } var sorts = Context.MkDatatypeSorts(sortNames, cons); foreach (var kv in idToEmbedding) { if (kv.Value.Kind == TypeEmbeddingKind.Constructor) { ce = (ConstructorEmbedding)kv.Value; ce.SetRepresentation(sorts[kv.Key]); Register(ce); } else { ue = (UnionEmbedding)kv.Value; ue.SetRepresentation(sorts[kv.Key]); Register(ue); } } }