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)); }
/// <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); } })); }