Ejemplo n.º 1
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());
        }
Ejemplo n.º 2
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)));
        }
Ejemplo n.º 3
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());
        }