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); } } }
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); } }
public bool IsValidSymbol(SymValue sv) { return(EqualTermsMap.ContainsKey(sv)); }