三值逻辑的一种实现

原创 2004年10月17日 04:50:00

        以前的文章中,我们讨论了三值逻辑可能的运算体系和可能的代码实现。这里,我们给出一种完全的实现方式。以下代码利用枚举,在每一个三值逻辑对象中标识出其认可的算法,如果两个对象认可的与/或算法不一致,则抛出异常。出于程序结构上的完整性限制,逻辑对象具有默认算法——Arithmetics.Mathemetic。但是,我们可以在运行期修改它这个标识,也可以通过工厂方法方便的得到指定算法的对象。
        以下为算法标识枚举Arithmetics的定义:
 public enum Arithmetics {Mathematic, Database, Verify};
        以下为三值逻辑结构的代码,从不同的与/或运算静态方法的名字上,我们可以看出它们支持的算法。当然,如您所见,这种设计结构是封闭的,我们不能为它添加新的算法——从实用角度上看,这三种算法已经可以应付几乎所有场合了。
  public struct VarBool
 {
  // The three possible Boolw3 values.
  public static readonly VarBool Null = new VarBool(0);
  public static readonly VarBool False = new VarBool(-1);
  public static readonly VarBool True = new VarBool(1);
  // private field that stores –1, 0, 1 for False, Null, True.
  private sbyte value;
  private Arithmetics _Arithmetic;
  public Arithmetics Arithmetic
  {
   get
   {
    return _Arithmetic;
   }
   set
   {
    _Arithmetic = value;
   }
  }

  // private instance constructor. The value parameter must be –1, 0, or 1.
  private VarBool(int value)
  {
   this.value = (sbyte)value;
   this._Arithmetic = Arithmetics.Mathematic;
  }

  /// <summary>
  /// 从数据库组件的逻辑字段值中构造实例
  /// </summary>
  /// <param name="value">只能为System.Boolean或DBNull类型。</param>
  public static VarBool Read(object value)
  {
   if(null == value)
    throw new ArgumentException("The value is null!");
   if(value is bool || value is DBNull)
    return (VarBool)value;
   else
    throw new ArgumentException("The value must in true, false or DBNull!");
  }

  /// <summary>
  /// 从字符串解析值。
  /// </summary>
  /// <param name="value">可选值为"True"、"False"、"Null"</param>
  public static VarBool Parse(string value)
  {
   switch(value)
   {
    case "True" :
    {
     return True;
    }
    case "False":
    {
     return False;
    }
    case "Null":
    {
     return Null;
    }
    default:
     throw new ArgumentException("The value must in /"True/", /"False/" or /"Null/"!");
   }
  }

  // Properties to examine the value of a Boolw3. Return true if this
  // Boolw3 has the given value, false otherwise.
  public bool IsNull { get { return value == 0; } }
  public bool IsFalse { get { return value < 0; } }
  public bool IsTrue { get { return value > 0; } }
  // Implicit conversion from bool to Boolw3. Maps true to Boolw3.True and
  // false to Boolw3.False.
  public static implicit operator VarBool(bool x)
  {
   return x? True: False;
  }

  public static implicit operator VarBool(DBNull x)
  {
   return Null;
  }

  // Explicit conversion from Boolw3 to bool.Throws an exception if the
  // given Boolw3 is Null, otherwise returns true or false.
  public static explicit operator bool(VarBool x)
  {
   if (x.value == 0) throw new InvalidOperationException();
   return x.value > 0;
  }

  public static explicit operator DBNull(VarBool x)
  {
   if (x.value != 0) throw new InvalidOperationException();
   return DBNull.Value;
  }

  // Equality operator. Returns Null if either operand is Null, otherwise
  // returns True or False.
  public static VarBool operator ==(VarBool x, VarBool y)
  {
   if (x.value == 0 || y.value == 0) return Null;
   return x.value == y.value? True: False;
  }
  // Inequality operator. Returns Null if either operand is Null, otherwise
  // returns True or False.
  public static VarBool operator !=(VarBool x, VarBool y)
  {
   if (x.value == 0 || y.value == 0) return Null;
   return x.value != y.value? True: False;
  }
  // Logical negation operator. Returns True if the operand is False, Null
  // if the operand is Null, or False if the operand is True.
  public static VarBool operator !(VarBool x)
  {
   return new VarBool(-x.value);
  }

  public override bool Equals(object obj)
  {
   return base.Equals (obj);
  }
  
  public override int GetHashCode()
  {
   return this.value;
  }
  
  public override string ToString()
  {
   if (value > 0) return "True";
   if (value < 0) return "False";
   return "Null";
  }

  public static VarBool MathAnd(VarBool x, VarBool y)
  {
   return new VarBool(x.value < y.value? x.value: y.value);
  }

  public static VarBool MathOr(VarBool x, VarBool y)
  {
   return new VarBool(x.value > y.value? x.value: y.value);
  }

  public static VarBool DBAnd(VarBool x, VarBool y)
  {
   if (x.value == 0 || y.value ==0) return Null;
   return new VarBool(x.value < y.value ? x.value : y.value);
  }
  
  public static VarBool DBOr(VarBool x, VarBool y)
  {
   if (x.value == 0 || y.value ==0) return Null;
   return new VarBool(x.value > y.value ? x.value : y.value);
  }

  public static VarBool VerifyAnd(VarBool x, VarBool y)
  {
   if (x.value == -1 || y.value == -1) return False;
   if (x.value == 1 || y.value == 1) return True;
   return Null;
  }
  
  public static VarBool VerifyOr(VarBool x, VarBool y)
  {
   if (x.value == 1 || y.value == 1) return True;
   if (x.value == -1 & y.value == -1) return False;
   return True;
  }

  public static VarBool operator &(VarBool x, VarBool y)
  {
   if(x.Arithmetic != y.Arithmetic)
    throw new ArgumentException(string.Format("左参数选择了{0}算法,而右参数选择了{1}算法。", x.Arithmetic, y.Arithmetic));
   switch(x.Arithmetic)
   {
    case Arithmetics.Database:
     return DBAnd(x, y);
    case Arithmetics.Mathematic:
     return MathAnd(x, y);
    case Arithmetics.Verify:
     return VerifyAnd(x, y);
    default:
     return Null;
   }
  }

  public static VarBool operator |(VarBool x, VarBool y)
  {
   if(x.Arithmetic != y.Arithmetic)
    throw new ArgumentException(string.Format("左参数选择了{0:D}算法,而右参数选择了{1:D}算法。", x.Arithmetic, y.Arithmetic));
   switch(x.Arithmetic)
   {
    case Arithmetics.Database:
     return DBOr(x, y);
    case Arithmetics.Mathematic:
     return MathOr(x, y);
    case Arithmetics.Verify:
     return VerifyOr(x, y);
    default:
     return Null;
   }
  }

 }

        以下为三值逻辑类的工厂方法类。通过工厂类的构造函数参数,我们可以指定即将生成的三值逻辑对象支持何种算法,这使得我们可以通过更简单和直观的方式生成对象。
 /// <summary>
 /// VarBool 的工厂方法集合,封装算法选择。
 /// 如果不通过该工厂生成VarBool,其默认算
 /// 法为Mathematic,也可以在运行期修改
 /// Arithmetic属性来指定算法。
 /// </summary>
 public class VarBoolBuilder
 {
  private Arithmetics _Arithmetic;
  public VarBoolBuilder(Arithmetics Arithmetic)
  {
   _Arithmetic = Arithmetic;
  }
  public VarBool Null
  {
   get
   {
    VarBool re = VarBool.Null;
    re.Arithmetic = _Arithmetic;
    return re;
   }
  }
  public VarBool True
  {
   get
   {
    VarBool re = VarBool.True;
    re.Arithmetic = _Arithmetic;
    return re;
   }
  }
  public VarBool False
  {
   get
   {
    VarBool re = VarBool.False;
    re.Arithmetic = _Arithmetic;
    return re;
   }
  }
  public VarBool Read(object value)
  {
   VarBool re = VarBool.Read(value);
   re.Arithmetic =  _Arithmetic;
   return re;
  }
  public VarBool Parse(string value)
  {
   VarBool re = VarBool.Parse(value);
   re.Arithmetic =  _Arithmetic;
   return re;
  }
 }

 

三值逻辑讨论

习惯上我们在应用系统中一直使用两值逻辑:非True即False。两值逻辑的运算体系已经相当成熟,与、或、非以及衍生的异或、与非等等。但是在实际应用中,我们会有机会遇到三值逻辑。三值逻辑通常包含可选的T...
  • ccat
  • ccat
  • 2004年09月15日 02:06
  • 2941

发现原来使用BOOL类型返回值的函数都是三值逻辑

BOOL是微软定义的typedef int BOOL。与bool不同,它是一个三值逻辑,TRUE/FALSE/ERROR,返回值为>0的整数为TRUE,0为FALSE,-1为ERROR。Win32 A...
  • Sco_field
  • Sco_field
  • 2008年08月22日 10:12
  • 2243

【其他】【RQNOJ】三值排序

题目描述排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的...
  • liveas
  • liveas
  • 2010年07月14日 20:55
  • 2093

【计蒜客系列】挑战难题27:三值排序

题目来源:计蒜客 排序是一种很频繁的计算任务。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出...
  • z9550695
  • z9550695
  • 2015年08月06日 16:43
  • 686

USACO2.1.3 三值排序

【问题描述】   排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法...
  • qq_35546274
  • qq_35546274
  • 2016年07月20日 14:33
  • 1315

逻辑思维三大定律

逻辑思维三大定律: 同一律,矛盾律, 排中律 同一律: A 是 A。 前后思维中,概念要同一。 白马非马论违反同一律。 商家的买一赠一,前后两个一不是同一个概念。违反同一律。 矛盾律:...
  • hejinjing_tom_com
  • hejinjing_tom_com
  • 2014年10月17日 15:59
  • 2277

问题:线索二叉树是一种_____结构。 A. 逻辑 B. 逻辑和存储 C. 物理 D. 线性

个人推崇答案:   物理结构 逻辑结构:集合、线性、树和图 物理结构:线性存储和非线性存储                   线性存储结构有顺序(sequential)、链接(lin...
  • zanzan410998153
  • zanzan410998153
  • 2015年03月31日 16:33
  • 1431

三值逻辑的C#实现

  C#中的三值逻辑类三值逻辑的实际应用价值并未被忽视,在绝大多数介绍关系型数据库知识的书籍中,都涉及了NULL值的讨论,也少不了三值逻辑。而MSDN中,则给出了一个用C#实现的三值逻辑结构(stru...
  • ccat
  • ccat
  • 2004年09月19日 05:18
  • 2557

SQL三值逻辑

  • chaoowang
  • chaoowang
  • 2012年10月20日 11:11
  • 468

SQLSERVER 三值逻辑

三值逻辑 (3VL, Three-valued Logic)  在SQL中逻辑表达式的可能值包括TRUE、FALSE、UNKNOWN。他们被称为三值逻辑。三值逻辑是SQL所特有的。大多数语言的逻辑表达...
  • hennessy_han
  • hennessy_han
  • 2015年03月12日 23:02
  • 204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三值逻辑的一种实现
举报原因:
原因补充:

(最多只允许输入30个字)