//////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////
        public override Expression visit(FAE f)
        {
            context.Push(f.ToString());
            base.visit(f);
            context.Pop();

            Expression result = f;

            bool add = true;

            if (f.arguments.count == 0)
            {
                add = false;
            }
            if (f.arguments.count == 1 && (f.arguments[0] is AtomicExpression))
            {
                add = false;
            }

//            if (BasicFunction.isBinaryLogical(f.function) /*&& (f.arguments[0] is AtomicExpression) && (f.arguments[1] is AtomicExpression)*/)
//                add = false;

//            if (BasicFunction.isUnaryLogical(f.function) /*&& (f.arguments[0] is AtomicExpression)*/)
//                add = false;

            if (add)
            {
                addSubexpression(f, context.Peek());
            }

            return(f);
        }
Exemplo n.º 2
0
        private void addFunctionInstantiation(FAE e)
        {
            if (ExpressionSymbolCounter.isInterpreted(e.function.name))
            {
                return;
            }
            var f = e.function as BasicFunctionTemplateInstance;

            if (f == null /*|| f.template.mapTypeArguments.Count()==0*/)
            {
                return;
            }
            FunctioneTemplateEntry fti;

            if (!functionTemplateInstantiations.TryGetValue(e.function.name, out fti))
            {
                functionTemplateInstantiations[e.function.name] = fti = new FunctioneTemplateEntry(f.template);
            }
            string s = argumentString(f.typeArguments);

            if (!fti.instances.ContainsKey(s))
            {
                fti.instances[s] = new Dictionary <string, FAE>();
            }
            fti.instances[s][e.ToString()] = e;
            if (f.isGroundInstance())
            {
                fti.groundInstances.Add(s);
            }
        }
Exemplo n.º 3
0
        public override Expression visit(FAE f)
        {
            Debug.Assert(procedure != null);
//            if (f.ToString().Contains(@"read($h,read($h,$o,AVLTree.root),alloc)"))
//                Debugger.Break();

            Expression result = base.visit(f);

            var rfae = result as FAE;
            FunctionTemplate template = procedure.findFunctionTemplate(rfae.function.name);

            if (rfae != null && template != null && template.body != null && template.attributes.Contains(":inline  true"))
            {
                var fti = rfae.function as BasicFunctionTemplateInstance;
                Debug.Assert(fti != null);
                Debug.Assert(fti.template == template);
                var substitution = new ExpressionSubstitution();
                for (int i = 0; i < template.typeParameters.Length; i++)
                {
                    substitution.typeSubstitution.add(template.typeParameters[i], fti.typeArguments[i]);
                }
                for (int i = 0; i < rfae.arguments.count; i++)
                {
                    substitution.add(template.body.arguments[i].name, rfae.arguments[i]);
                }

                result = template.body.expression.substitute(substitution);
//                var r1 = result;
                result = result.visit(this);
//                if (!ReferenceEquals(r1, result) && r1.ToString().Contains(@"$inv"))
//                    Debugger.Break();
            }

            return(result);
        }
        private void collectMapWrite(FAE fae)
        {
            var     mu     = fae.function as MapWrite;
            MapRead ml     = mu2ml(mu);
            var     mlArgs = fae.arguments.Take(fae.arguments.Count() - 1).ToArray();

            addInstance(ml, new ExpressionList(mlArgs));
        }
Exemplo n.º 5
0
        ////////////////////////////////////////////////////////////////////////////
        public override Expression visit(FAE e)
        {
            Expression result = e;
            string     oes    = e.ToString();

            result = base.visit(e);

            result = checkReplace(result);
            return(result);
        }
Exemplo n.º 6
0
        public override Expression visit(FAE fae)
        {
            if (!(fae.function is MapWrite))
            {
                return(base.visit(fae));
            }

            Expression um = makeMapWriteMap(fae);

            return(um);
        }
Exemplo n.º 7
0
 public Expression visit(FAE e)
 {
     if (!isInterpreted(e.function))
     {
         symbols.Add(e.function.name);
     }
     foreach (var a in e.arguments)
     {
         a.visit(this);
     }
     return(e);
 }
Exemplo n.º 8
0
        public virtual Expression visit(FAE f)
        {
            Function       newF = visitFunction(f.function);
            ExpressionList newA = f.arguments.visit(this);
            Expression     result;

            if (!ReferenceEquals(f.function, newF) || !ReferenceEquals(f.arguments, newA))
            {
                result = new BasicFAE(newF, newA);
            }
            else
            {
                result = f;
            }
            return(result);
        }
Exemplo n.º 9
0
        private Expression makeMapWriteMap(FAE fae)
        {
            Debug.Assert(fae.function is MapWrite);
            Debug.Assert(fae.arguments[0].type is MapType);
            var        mu = fae.function as MapWrite;
            Expression result;

            if (!versionMap.TryGetValue(fae.ToString(), out result))
            {
                var ot = fae.arguments[0].type as MapType;
                Debug.Assert(ot != null);
                var s = new TypeParameterInstantiation(ot.typeParameters, mu.typeArguments.Skip(1).ToArray());
//                var ots = new MapType(new TypeVariable[0], (from m in ot.domain select m.substitute(s)).ToArray(), ot.range.substitute(s));
                Expression   m = fae.arguments[0];
                Expression[] i = fae.arguments.Take(fae.arguments.count - 1).Skip(1).ToArray();

                if (fae.freeVariables.Count > 0)
                {
//m(fv)[i(fv):=x(fv)] ==> v(fv)  (assume v(fv)[i]==x, assume forall fv : forall j : j!=i(fv) ==> v(fv)[j] == m(fv)[j]
                    var    fvt = TypeTuple.make(from fv in fae.freeVariables select fv.type);
                    string fn  = getFreshMUName("mu");
                    var    ft  = new BFunctionTemplate(fn, "", new TypeVariable[0], new BasicFunctionSignature(ot, fvt),
                                                       null);
                    Function f = ft.getInstance();
                    IEnumerable <BasicBoundVariableExpression> fve = from fv in fae.freeVariables
                                                                     select new BasicBoundVariableExpression(fv);
                    result = new BasicFAE(f, new ExpressionList(fve));
                }
                else
                {
                    //m[i:=x] ==> v  (assume v[i]==x, assume forall j : j!=i ==> v[j] == m[j]
                    string nvn = getFreshMUName("mu");
                    var    nv  = new ProgramVariable(nvn, ot, false, false, false, false);
                    procedure.addVariable(nv);
                    result = new BasicProgramVariableExpression(nv);
                }
                Expression[] j =
                    (from e in i select new BasicBoundVariableExpression(makeBoundVariable(e.type))).ToArray();
                //forall j : j!=i ==> v[j]==m[j]
                addConditionalMapEqualityAxiom(i, result, m, mu.typeArguments);
                //v[i]==x;
                Expression x = fae.arguments.Last();
                addEqualityAxiom(ml(result, i, mu.typeArguments.Skip(1).ToArray(), x.type), fae.arguments.Last());
            }
            return(result);
        }
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        private Expression removeTypeQuantification(FAE e)
        {
            var  na      = new Expression[e.arguments.count];
            bool changed = false;

            for (int i = 0; i < e.arguments.count; i++)
            {
                na[i] = removeTypeQuantification(e.arguments[i]);
                if (!ReferenceEquals(na[i], e.arguments[i]))
                {
                    changed = true;
                }
            }
            if (changed)
            {
                return(new BasicFAE(e.function, new ExpressionList(na)));
            }
            return(e);
        }
 private void collect(FAE fae)
 {
     foreach (var a in fae.arguments)
     {
         collect(a);
     }
     if (fae.function is MapWrite)
     {
         collectMapWrite(fae);
     }
     else if (BFunction.isEquality(fae.function) && fae.arguments[0].type is MapType)
     {
         collectMapEquality(fae);
     }
     else
     {
         addInstance(fae.function, fae.arguments);
     }
 }
Exemplo n.º 12
0
        public Expression visit(FAE e)
        {
            addExpression(e);

            addFunctionInstantiation(e);

            if (e.type.freeTypeVariables.Count > 0)
            {
                tqStack.Peek().addExpression(e);
            }
//            else
            {
                e.type.visit(this);
                foreach (var a in e.arguments)
                {
                    a.visit(this);
                }
            }
            return(e);
        }
Exemplo n.º 13
0
        public Expression visit(FAE e)
        {
            var ml = e.function as MapRead;

            if (ml != null)
            {
                Dictionary <string, ITypeTuple> entry;
                if (!srs.mapReads.TryGetValue(ml.mapType.ToStringN(), out entry))
                {
                    srs.mapReads[ml.mapType.ToStringN()] = entry = new Dictionary <string, ITypeTuple>();
                }
                var dts = TypeTuple.make(ml.mapTypeArguments);
                entry[dts.ToString()] = dts;
            }

            foreach (var a in e.arguments)
            {
                a.visit(this);
            }
            return(e);
        }
        public FieldWriteMapIncarnation(IncarnationAndInequalityMap mapAnalyzer, Expression incarnation,
                                        FAE mapWrite)
            : base(mapAnalyzer, incarnation)
        {
            Debug.Assert(mapWrite != null);
            Debug.Assert(mapWrite.function is MapWrite);
            Debug.Assert(mapWrite.arguments.count > 2);
            Debug.Assert(mapWrite.arguments[0] is ProgramVariableExpression);
            this.mapWrite = mapWrite;
            predecessor   =
                mapAnalyzer.mapIncarnationMap[(mapWrite.arguments[0] as ProgramVariableExpression).programVariable.name
                ];
            Debug.Assert(predecessor != null);
            var ui = new List <Expression>();

            for (var i = 1; i < mapWrite.arguments.count - 1; i++)
            {
                ui.Add(mapWrite.arguments[i]);
            }
            updatedIndices = new ExpressionList(ui);
            cache          = new Dictionary <string, Expression>();
        }
 private void collectMapEquality(FAE fae)
 {
     //throw new NotImplementedException();
 }
Exemplo n.º 16
0
 public Expression visit(FAE e)
 {
     functions.Add(e.function);
     return(e);
 }