Exemplo n.º 1
0
        private void DrainEqualityWorkList(WorkList <EqualityPair <TFunc, TADomain> > workList)
        {
            while (!workList.IsEmpty())
            {
                EqualityPair <TFunc, TADomain> equalityPair = workList.Pull();
                SymValue sv1 = Find(equalityPair.Sv1);
                SymValue sv2 = Find(equalityPair.Sv2);
                if (sv1 != sv2)
                {
                    if (sv1.UniqueId < sv2.UniqueId)
                    {
                        SymValue tmp = sv1;
                        sv1 = sv2;
                        sv2 = tmp;
                    }

                    foreach (TFunc function in Functions(sv1))
                    {
                        SymValue v2 = LookupWithoutManifesting(sv2, function);
                        if (v2 == null)
                        {
                            this [sv2, function] = this [sv1, function];
                        }
                        else
                        {
                            TryPushEquality(workList, this [sv1, function], v2);
                        }
                    }
                    TADomain thisValue = this [sv1];
                    TADomain thatValue = this [sv2];
                    foreach (var elem in EqualTermsMap[sv1].AsEnumerable())
                    {
                        EqualTermsMap = EqualTermsMap.Add(sv2, EqualTermsMap [sv2].Cons(elem));
                    }

                    this.forw_map = this.forw_map.Add(sv1, sv2);
                    this [sv2]    = thisValue.Meet(thatValue);
                }
            }
        }
Exemplo n.º 2
0
        private SymValue this [SymValue source, TFunc function]
        {
            get
            {
                source = Find(source);
                SymValue sv = TermMap [source, function];
                SymValue key;
                if (sv == null)
                {
                    key           = FreshSymbol();
                    TermMap       = TermMap.Add(source, function, key);
                    EqualTermsMap = EqualTermsMap.Add(key, Sequence <SymGraphTerm <TFunc> > .Cons(new SymGraphTerm <TFunc> (function, source), null));
                    AddEdgeUpdate(source, function);
                }
                else
                {
                    key = Find(sv);
                }

                return(key);
            }
            set
            {
                source = Find(source);
                value  = Find(value);

                TermMap = TermMap.Add(source, function, value);
                Sequence <SymGraphTerm <TFunc> > rest = EqualTermsMap [value];
                if (rest.IsEmpty() || (!rest.Head.Function.Equals(function) || rest.Head.Args [0] != source))
                {
                    EqualTermsMap = EqualTermsMap.Add(value, rest.Cons(new SymGraphTerm <TFunc> (function, source)));
                }

                AddEdgeUpdate(source, function);
            }
        }
Exemplo n.º 3
0
 public bool IsValidSymbol(SymValue sv)
 {
     return(EqualTermsMap.ContainsKey(sv));
 }