Пример #1
0
        public SetDomain <T> Join(SetDomain <T> newState, out bool weaker, bool widen)
        {
            if (set == newState.set)
            {
                weaker = false; return(this);
            }
            if (this.IsBottom)
            {
                weaker = !newState.IsBottom; return(newState);
            }
            if (newState.IsBottom || this.IsTop)
            {
                weaker = false; return(this);
            }
            if (newState.IsTop)
            {
                weaker = !this.IsTop; return(newState);
            }

            Contract.Assert(set != null);

            IFunctionalSet <T> result = set.Intersect(newState.set);

            weaker = result.Count < set.Count;
            return(new SetDomain <T>(result));
        }
Пример #2
0
            public Domain Join(Domain newState, out bool weaker)
            {
                IFunctionalSet <SymbolicValue> result = this.NonNullValues.Intersect(newState.NonNullValues);

                weaker = result.Count < this.NonNullValues.Count;
                return(new Domain(result));
            }
Пример #3
0
 public Domain ConstrainEqual(SymbolicValue target, SymbolicValue source)
 {
     if (NonNullValues.Contains(source))
     {
         NonNullValues = NonNullValues.Add(target);
     }
     return(this);
 }
Пример #4
0
 public Domain Rename(IFunctionalMap <SymbolicValue, SymbolicValue> substitution)
 {
     foreach (SymbolicValue v in NonNullValues.Elements)
     {
         if (substitution.Contains(v))
         {
             NonNullValues = NonNullValues.Remove(v).Add(substitution[v]);
         }
     }
     return(this);
 }
Пример #5
0
        public SetDomain <T> Meet(SetDomain <T> that)
        {
            if (set == that.set)
            {
                return(this);
            }
            if (this.IsBottom || that.IsTop)
            {
                return(this);
            }
            if (that.IsBottom || this.IsTop)
            {
                return(that);
            }

            Contract.Assert(set != null);

            IFunctionalSet <T> result = set.Union(that.set);

            return(new SetDomain <T>(result));
        }
Пример #6
0
 public SetDomain(Converter <T, int> keyNumber)
 {
     set = FunctionalSet <T> .Empty(keyNumber);
 }
Пример #7
0
 public SetDomain(IFunctionalSet <T> /*?*/ value)
 {
     set = value;
 }
Пример #8
0
 /// <summary>
 /// Returns a set of definitely null variables and a set of definitely non-null variables
 /// </summary>
 public IFunctionalSet NullVariableSet(out IFunctionalSet nonNullResult) {
   ISymValue nullSym = this.Null;
   IFunctionalSet nullSet = FunctionalSet.Empty;
   IFunctionalSet nonNullSet = FunctionalSet.Empty;
   foreach (IUniqueKey key in this.egraph.Constants) {
     Variable v = key as Variable;
     if (v == null) continue;
     if (v is StackVariable) continue;
     ISymValue varSym = Value(v);
     if (varSym == nullSym) {
       nullSet = nullSet.Add(v);
       continue;
     }
     if (IsNonNull(varSym)) { nonNullSet = nonNullSet.Add(v); }
   }
   nonNullResult = nonNullSet;
   return nullSet;
 }
Пример #9
0
 private Domain(IFunctionalSet <SymbolicValue> underlying)
 {
     this.NonNullValues = underlying;
 }