示例#1
0
        /// <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));
                }
            }));
        }
示例#2
0
        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);
        }
示例#3
0
        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;
                        }
                    }
                }
            }
        }
示例#4
0
 private ITypeEmbedding Register(ITypeEmbedding embedding)
 {
     sortToEmbedding.Add(embedding.Representation, embedding);
     typeToEmbedding.Add(embedding.Type, embedding);
     return(embedding);
 }