三值逻辑
在逻辑学中的三值逻辑(three-valued,也称为三元(ternary),或三价(trivalent)逻辑,有时缩写为3VL)是几个多值逻辑系统中的其中之一。有三种状态来表示真、假和一个表示不确定的第三值;这相对于基础的二元逻辑(比如布尔逻辑,它只提供真假两种状态)。概念形式和基本思想最初由 JanŁukasiewicz和 C. I. Lewis创建。 然后这些由 Grigore Moisil以公理代数形式重新制定,并在 1945年扩展到 值逻辑。
值的表示符号
[编辑]同二值逻辑一样,在三值逻辑中的真值可以使用各种三进制系统表示来数值表示。一些常见的例子有:
- 1用于真,2用于假,0用于“未知”、“无关”或“二者”。[1]
- 0用于假,1用于真,第三值使用非整数符号比如# 或½。[2]
- 平衡三进制:= -1用于假,1用于真,0用于第三值;这些值还可以分别简化为 -、+和0。[3]
本文主要阐述了一个基于 {false,unknown,true} 状态的克莱尼三值命题逻辑系统,并将一般的布尔连接词扩展到三值上下文语境中。三值逻辑也有谓词;这些可能具有与经典(二元)谓词逻辑不同的量词读数,也可能包含替代量词。
真值表
[编辑]如果布尔逻辑具有 22 = 4 个单元运算符,则在三值逻辑中添加第三个状态值,则导致在单个输入值上共有 33 = 27 个不同的运算符。类似地,在布尔逻辑具有 222 = 16个不同的二元运算符(具有2个输入的运算符)的情况下,三值逻辑具有 332 = 19,683 个这样的运算符。当布尔运算符已有很多固有的名称(例如否定、并且、或者,排除,等价、蕴含)的情况下,对三值逻辑中的运算符尝试给予名称,是不甚合理的。
下面是给有true(T)/false(F)/unknown(?)状态的系统的一些逻辑运算的真值表。
A | B | A ∨ B | A ∧ B | ¬ A |
---|---|---|---|---|
T | T | T | T | F |
T | ? | T | ? | F |
T | F | T | F | F |
? | T | T | ? | ? |
? | ? | ? | ? | ? |
? | F | ? | F | ? |
F | T | T | F | T |
F | ? | ? | F | T |
F | F | F | F | T |
在这个真值表中,UNKNOWN状态可以被比拟认为是一个密封的盒子,其中包含要么一个明确的TRUE值要么一个明确的FALSE值。不能随时及时获得任何特定UNKNOWN状态秘密的表示TRUE还是FALSE的知识。但是,特定逻辑运算可以生成一个明确的结果,即使它们涉及到了至少一个UNKNOWN操作数(参看捷径求值)。例如,因为TRUE ∨ TRUE等于TRUE,而TRUE ∨ FALSE等于TRUE,你同样可以推出TRUE ∨ UNKNOWN等于TRUE。在这个例子中,因为两个二价状态都可以被UNKNOWN状态暗含,但两个状态都生成相同的结果,在所有这三种情况下都是一个明确的TRUE结果。
在数据库应用中的三值逻辑
[编辑]数据查询语言 SQL 实用了三值逻辑,作为处理字段内容值为 NULL的一种方式。最初使用 NULL值的意图来表示在数据库中缺失数据,即假设现实中有值存在,但该值当前并未记录在数据库中;注意缺失的值不同于数值零,或长度为零的空字串值,这两者都表示已知的值。SQL 使用 Kleene K3 逻辑的通用片段,仅限于 AND,OR 和 NOT表。在 SQL中 NULL 值应被解释为未知(UNKNOWN)。若以 NULL 与栏位值做关系比较,包括和另一个 NULL的比较,结果都是状态为未知的。然而,这种语义选择在某些集合操作中被放弃了,例如,UNION 或 INTERSECT,其中 NULL 被视为彼此相等。批评者断言,这种不一致的性质剥夺了 SQL在处理 NULL 时直观的语义。例如,考虑下列 SQL表达式:
City = 'Paris'
SQL 中在 City 字段中的 NULL 值表示理论中导致这个表达式,被确认为要么 TRUE(比如 City 包含 'Paris'),要么FALSE(比如 City 包含 'Philadelphia')的一缺失值。样例 SQL 表达式依据如下规则确认:
- 对于在 City 字段中有字串 'Paris'的任何记录,结果为 TRUE
- 对于在 City 字段中有 NULL的任何记录,结果为 UNKNOWN
- 在所有其他情况,结果为 FALSE
在SQL 数据操纵语言中,表达式(比如在WHERE
子句中)的TRUE真值状态发起在这个行上一个动作(比如返回这一行),而UNKNOWN或FALSE的真值状态不做事情。[4]三值逻辑以这种方式来实现在SQL中,而对于SQL用户表现得如同二值逻辑。
但是,SQL的检查约束有不同的表现。只有FALSE真值状态导致违反检查约束。TRUE或UNKNOWN真值状态指示一行已经成功的通过检查约束验证。[5]
在文章 Null中深入讨论了三值逻辑的 SQL实现。
参见
[编辑]引用
[编辑]- ^ Hayes, Brian. Third Base (PDF). American Scientist (Sigma Xi, the Scientific Research Society). November–December 2001, 89 (6): 490–494 [2006-12-25]. (原始内容存档 (PDF)于2005-12-31).
- ^ The Penguin Dictionary of Mathematics. 2nd Edition. London, England: Penguin Books. 1998: 417.
- ^ Knuth, Donald E. The Art of Computer Programming Vol. 2. Reading, Mass.: Addison-Wesley Publishing Company. 1981: 190.
- ^ Lex de Haan and Gennick, Jonathan. Nulls: Nothing to Worry About. Oracle Magazine (Oracle). July–August 2005 [2007-04-30]. (原始内容存档于2006-11-02).
- ^ Coles, Michael. Null Versus Null?. SQL Server Central (Red Gate Software). February 26, 2007 [2007-04-30]. (原始内容存档于2007-04-25).
外部链接
[编辑]- Trinary Computer Systems(页面存档备份,存于互联网档案馆)
- TriINTERCAL - the intentionally-obfuscated INTERCAL programming language supports an implementation of ternary logic
- Boost.Tribool(页面存档备份,存于互联网档案馆) – an implementation of ternary logic in C++
- Team-R2D2 - a French institute that fabricated the first full-ternary logic chip (a 64-tert SRAM and 4-tert adder) in 2004