Beispiel #1
0
        public void Dump(TextWriter tw)
        {
            var set      = new HashSet <SymValue> ();
            var workList = new WorkList <SymValue> ();
            IImmutableMap <SymValue, int> triggers = ImmutableIntKeyMap <SymValue, int> .Empty(SymValue.GetUniqueKey);

            tw.WriteLine("EGraphId: {0}", this.egraph_id);
            tw.WriteLine("LastSymbolId: {0}", LastSymbolId);

            foreach (TFunc function in TermMap.Keys2(this.const_root))
            {
                SymValue sv = this [this.const_root, function];
                tw.WriteLine("{0} = {1}", function, sv);
                workList.Add(sv);
            }

            while (!workList.IsEmpty())
            {
                SymValue sv = workList.Pull();
                if (!set.Add(sv))
                {
                    continue;
                }

                foreach (TFunc function in TermMap.Keys2(sv))
                {
                    SymValue target = this [sv, function];

                    tw.WriteLine("{0}({2}) = {1})", function, target, sv);
                    workList.Add(target);
                }
                foreach (var edge in MultiEdgeMap.Keys2(sv))
                {
                    foreach (SymValue target in MultiEdgeMap[sv, edge].AsEnumerable())
                    {
                        if (!UpdateTrigger(target, edge, ref triggers))
                        {
                            continue;
                        }
                        SymGraphTerm <TFunc> term = EqualMultiTermsMap [target];
                        if (term.Args != null)
                        {
                            tw.WriteLine("{0}({1}) = {2}",
                                         term.Function,
                                         term.Args.ToString(", "), target);
                            workList.Add(target);
                        }
                    }
                }
            }

            tw.WriteLine("**Abstract value map");
            foreach (SymValue sv in set)
            {
                TADomain abstractValue = this [sv];
                if (!abstractValue.IsTop)
                {
                    tw.WriteLine("{0} -> {1}", sv, abstractValue);
                }
            }
        }
Beispiel #2
0
 private IEnumerable <MultiEdge <TFunc, TADomain> > MultiEdges(SymValue sv)
 {
     return(MultiEdgeMap.Keys2(Find(sv)));
 }
Beispiel #3
0
        public SymValue this [SymValue[] args, TFunc function]
        {
            get
            {
                int len = args.Length;
                for (int i = 0; i < len; i++)
                {
                    args [i] = Find(args [i]);
                }

                SymValue candidate = FindCandidate(args, function);
                if (candidate != null)
                {
                    return(candidate);
                }
                candidate = FreshSymbol();
                for (int i = 0; i < len; i++)
                {
                    var edge = new MultiEdge <TFunc, TADomain> (function, i, len);
                    MultiEdgeMap = MultiEdgeMap.Add(args [i], edge, MultiEdgeMap [args [i], edge].Cons(candidate));
                }
                EqualMultiTermsMap = EqualMultiTermsMap.Add(candidate, new SymGraphTerm <TFunc> (function, args));
                AddMultiEdgeUpdate(args, function);
                return(candidate);
            }
            set
            {
                int len = args.Length;
                for (int i = 0; i < len; i++)
                {
                    args [i] = Find(args [i]);
                }

                bool isTermEqual          = true;
                SymGraphTerm <TFunc> term = EqualMultiTermsMap [value];
                if (term.Args != null)
                {
                    for (int i = 0; i < len; i++)
                    {
                        if (term.Args [i] != args [i])
                        {
                            isTermEqual = false;
                            break;
                        }
                    }
                }

                for (int i = 0; i < len; i++)
                {
                    var edge = new MultiEdge <TFunc, TADomain> (function, i, len);
                    Sequence <SymValue> list = MultiEdgeMap [args [i], edge];
                    if (isTermEqual && !Sequence <SymValue> .Contains(list, value))
                    {
                        isTermEqual = false;
                    }
                    if (!isTermEqual)
                    {
                        MultiEdgeMap = MultiEdgeMap.Add(args [i], edge, list.Cons(value));
                    }
                }
                if (isTermEqual)
                {
                    return;
                }
                EqualMultiTermsMap = EqualMultiTermsMap.Add(value, new SymGraphTerm <TFunc> (function, args));
                AddMultiEdgeUpdate(args, function);
            }
        }