知识卡片
自然语言查询的固有模糊性及逆否命题法则
内容
“获得所供应零件都在同一城市的供应商”这句看起来清晰的自然语言查询,实际上
天然模糊:一种解释是”对于任意两种它供应的零件PX、PY,如果都是这个供应商
供应的,那么PX和PY必须同城”(这种解释下,只供应一种零件、甚至完全没有
供应任何零件的供应商都满足条件);另一种解释要求”该供应商至少供应两种不同
零件,且这些零件两两同城”(此时只供应一种或不供应任何零件的供应商就不再
满足)。这个例子印证了[[为什么需要逻辑]](第10章开篇公园遛狗告示的例子)
提出的核心论点:自然语言的模糊性在复杂查询和复杂业务规则里非常普遍,把
查询翻译成精确的逻辑表述这个过程本身,恰恰能强迫开发者提前发现并显式解决
这类隐藏的歧义,而不是把歧义悄悄带进代码、留到生产环境才暴露。本节还补充
了[[表达式变换法则工具箱]]里逆否命题法则的推导:从蕴涵律出发,
IF NOT q THEN NOT p按定义等价于NOT(NOT q)OR NOT p,化简为
q OR NOT p,再等价于NOT p OR q,也就是IF p THEN q——因此
IF p THEN q≡IF NOT q THEN NOT p总是成立,直觉解释是”如果p为真必然
导致q为真,那么q为假就必然导致p为假”(下雨蕴涵街道湿,等价于街道不湿
蕴涵没下雨)。这条法则给出了同一个约束/查询的另一种同样正确、但字面表述
完全不同的写法(比如把”如果两个供应商各自的零件不同城,则不能是同一供应
商供应”这种反向表述代入原查询),提醒读者:即便找到了一个正确的逻辑
表述,也未必是唯一的表述方式,不同表述会导向不同(但同样正确)的SQL
写法。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第11章"使用逻辑
表述SQL表达式"11.8节"例7:处理模糊性"(源文件:OEBPS/text00126.html)
- 结论依据:原文明确"这个自然语言表述方式实际上是模糊的!……此类模糊性
对于复杂查询和复杂的业务规则十分常见。在这种情况下,逻辑的另一个优势
就是能够指出并帮助解决此种模糊性……IF p THEN q≡IF NOT q THEN NOT p
……此法则的含义很直观:如果p的真蕴涵q的真,那么q的假必须蕴涵p的假"。
- 原始内容:这个自然语言表述方式实际上是模糊的!……此类模糊性对于复杂
查询和复杂的业务规则十分常见……IF p THEN q≡IF NOT q THEN NOT p……
如果p的真蕴涵q的真,那么q的假必须蕴涵p的假。