/// <summary> /// Encoding the term t using the embedding. /// </summary> public Z3Expr MkGround(Term t, ITypeEmbedding embedding) { Contract.Requires(t != null && t.Groundness == Groundness.Ground); Contract.Requires(embedding != null); Contract.Requires(Index.IsGroundMember(embedding.Type, t)); ITypeEmbedding te; var embStack = new Stack <ITypeEmbedding>(); embStack.Push(embedding); return(t.Compute <Z3Expr>( (x, s) => { return EnumerateChildren(x, embStack); }, (x, ch, s) => { te = embStack.Pop(); if (te.Kind == TypeEmbeddingKind.Union) { return te.MkGround(null, ch.ToArray(1)); } else { return te.MkGround(x.Symbol, ch.ToArray(x.Symbol.Arity)); } })); }
private Z3Expr MkCoercion(Z3Expr t, AppFreeCanUnn unn, ITypeEmbedding te) { var coercions = DefaultMember.Item2; bool wasAdded; ITypeEmbedding boxedTE; foreach (var s in unn.NonRangeMembers) { var boxer = GetBoxer(s); Contract.Assert(s != null); boxedTE = Owner.GetEmbedding(boxer.AccessorDecls[0].Range); coercions = te.MkTest(t, Index.MkApply(s, TermIndex.EmptyArgs, out wasAdded)).Ite( Context, boxer.ConstructorDecl.Apply(boxedTE.MkCoercion(t)), coercions); } Term rngType; foreach (var kv in unn.RangeMembers) { foreach (var boxer in GetBoxers(kv.Key, kv.Value)) { boxedTE = Owner.GetEmbedding(boxer.AccessorDecls[0].Range); rngType = Index.MkApply( Index.RangeSymbol, new Term[] { Index.MkCnst(new Rational(kv.Key, BigInteger.One), out wasAdded), Index.MkCnst(new Rational(kv.Value, BigInteger.One), out wasAdded) }, out wasAdded); coercions = te.MkTest(t, rngType).Ite( Context, boxer.ConstructorDecl.Apply(boxedTE.MkCoercion(t)), coercions); } } Contract.Assert(coercions != null); return(coercions); }
private void UpdateMinEmb(Term wtype, Map <int, LinkedList <ITypeEmbedding> > sizeMap, ref int minSize, ref ITypeEmbedding minEmb) { if (sizeMap == null) { return; } else if (minEmb == null) { foreach (var kv in sizeMap) { foreach (var e in kv.Value) { if (Index.IsSubtypeWidened(wtype, e.Type)) { minSize = kv.Key; minEmb = e; return; } } } } else { foreach (var kv in sizeMap) { if (kv.Key >= minSize) { return; } foreach (var e in kv.Value) { if (Index.IsSubtypeWidened(wtype, e.Type)) { minSize = kv.Key; minEmb = e; return; } } } } }
private ITypeEmbedding Register(ITypeEmbedding embedding) { sortToEmbedding.Add(embedding.Representation, embedding); typeToEmbedding.Add(embedding.Type, embedding); return(embedding); }