Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        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)));
        }
Esempio n. 4
0
        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)));
        }
Esempio n. 5
0
        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());
        }
Esempio n. 6
0
        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);
                }
            }
        }