예제 #1
0
        public DiscreteDomain <T> Lub(DiscreteDomain <T> other)
        {
            switch (Flag)
            {
            case DiscreteEnum.None:
                return(other.Flag == DiscreteEnum.None ? this : other);

            case DiscreteEnum.Specific:
                if (other.Flag == DiscreteEnum.None)
                {
                    return(this);
                }
                else if (other.Flag == DiscreteEnum.Specific)
                {
                    return(Value.Equals(other.Value) ? this : null);
                }
                else
                {
                    return(other);
                }

            case DiscreteEnum.Any:
                return(this);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #2
0
 public bool CommutableWith(DiscreteDomain <T> other)
 {
     if (Flag == DiscreteEnum.None || other.Flag == DiscreteEnum.None)
     {
         return(true);
     }
     if (Flag == DiscreteEnum.Any || other.Flag == DiscreteEnum.Any)
     {
         return(false);
     }
     return(Value.Equals(other.Value));
 }
예제 #3
0
 public bool Lte(DiscreteDomain <T> other)
 {
     if (Flag == DiscreteEnum.None)
     {
         return(true);
     }
     if (Flag == DiscreteEnum.Specific)
     {
         if (other.Flag == DiscreteEnum.Specific)
         {
             return(Value.Equals(other.Value));
         }
         return(other.Flag == DiscreteEnum.Any);
     }
     return(other.Flag == DiscreteEnum.Any);
 }
예제 #4
0
        public DiscreteDomain <T> Lub(DiscreteDomain <T> other, BoolRef changed)
        {
            switch (Flag)
            {
            case DiscreteEnum.None:
                if (other.Flag == DiscreteEnum.None)
                {
                    return(this);
                }
                else
                {
                    changed.Set();
                    return(other);
                }

            case DiscreteEnum.Specific:
                if (other.Flag == DiscreteEnum.None)
                {
                    return(this);
                }
                else if (other.Flag == DiscreteEnum.Specific)
                {
                    if (Value.Equals(other.Value))
                    {
                        return(this);
                    }
                    else
                    {
                        return(null);
                    }
                }
                else
                {
                    changed.Set();
                    return(other);
                }

            case DiscreteEnum.Any:
                return(this);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #5
0
 static DiscreteDomain()
 {
     Bottom = new DiscreteDomain <T>(DiscreteEnum.None, default(T));
     Top    = new DiscreteDomain <T>(DiscreteEnum.Any, default(T));
 }