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(); } }
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)); }
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); }
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(); } }
static DiscreteDomain() { Bottom = new DiscreteDomain <T>(DiscreteEnum.None, default(T)); Top = new DiscreteDomain <T>(DiscreteEnum.Any, default(T)); }