示例#1
0
        public Term MkGround(Z3Expr t, Term[] args)
        {
            Contract.Assert(t != null && (t.FuncDecl.Equals(emptyStr.ConstructorDecl) || t.FuncDecl.Equals(strBoxing.ConstructorDecl)));
            Contract.Assert(args == null || args.Length == 0);
            if (t.FuncDecl.Equals(emptyStr))
            {
                return(Index.EmptyStringValue);
            }

            var strBldr = new StringBuilder();

            t.Compute <Unit>(
                (x, s) => x.Args,
                (x, c, s) =>
            {
                if (x.ASTKind == Z3.Z3_ast_kind.Z3_NUMERAL_AST)
                {
                    strBldr.Append((char)((Z3BVNum)x).UInt);
                }

                return(default(Unit));
            });

            bool wasAdded;

            return(Index.MkCnst(strBldr.ToString(), out wasAdded));
        }
示例#2
0
        /// <summary>
        /// Decode the ground z3expr t.
        /// </summary>
        public Term MkGround(Z3Expr t)
        {
            Contract.Requires(t != null);
            ITypeEmbedding te;
            var            embedding = GetEmbedding(t.Sort);
            var            embStack  = new Stack <ITypeEmbedding>();

            embStack.Push(embedding);
            return(t.Compute <Term>(
                       (x, s) =>
            {
                embedding = embStack.Peek();
                if (embedding.Kind == TypeEmbeddingKind.Constructor ||
                    embedding.Kind == TypeEmbeddingKind.Union)
                {
                    return EnumerateChildren(x, embStack);
                }
                else
                {
                    return null;
                }
            },
                       (x, ch, s) =>
            {
                te = embStack.Pop();
                if (te.Kind == TypeEmbeddingKind.Union || te.Kind == TypeEmbeddingKind.Constructor)
                {
                    return te.MkGround(x, ch.ToArray(x.Args.Length));
                }
                else
                {
                    return te.MkGround(x, null);
                }
            }));
        }