知识卡片

表达式变换法则工具箱

结构图卡

内容

本章把[[表达式变换与优化的分配律交换律结合律]]里”关系代数表达式可用等价 关系改写”这条思路推广到逻辑表达式层面,给出一套可以把精确的逻辑(关系演算) 表述系统化映射为SQL的工具箱。核心法则包括:蕴涵律(IF p THEN q≡(NOT p) OR q,第10章已给出,本章首次展开使用);双重否定律(NOT(NOT p)≡p); 德摩根律(NOT(p AND q)≡(NOT p)OR(NOT q)NOT(p OR q)≡(NOT p)AND (NOT q));分配律(AND/OR彼此之间的分配,比第6章看到的一元运算符对二元 运算符分配更通用);量词化法则(FORALL x(p(x))≡NOT EXISTS x(NOT p(x)), 本质是德摩根律在EXISTS/FORALL上的特殊应用,因为[[IS_EMPTY_COUNT等价关系 及COUNT替代EXISTS的性能陷阱]]里已知EXISTS/FORALL分别是迭代OR/AND的缩写); 逆否命题法则(IF p THEN q≡IF NOT q THEN NOT p,直觉上”p真蕴涵q真”等价于 “q假必蕴涵p假”,如”下雨蕴涵街道湿”等价于”街道不湿蕴涵没下雨”)。这些法则 之所以被称为等价关系/恒等式/重写规则三种不同名字,是因为它们可以从三个角度 理解同一件事:exp1≡exp2既说明两者语义恒等,也说明任何包含exp1子表达式 的更大表达式都可以安全地把exp1替换成exp2而不改变整体含义——这条”局部替换 不改变整体语义”的性质,正是本章后续所有”从逻辑表述系统化推导出SQL表述” 方法论的理论基础:只要每一步替换都用的是已证明成立的等价关系,最终得到的 SQL表达式即使晦涩难懂,也必然与最初的精确逻辑表述完全正确等价。

结构图

flowchart TD
    A["原始逻辑表述<br/>(含FORALL/IMPLIES等SQL不支持的结构)"] -->|蕴涵律| B["IF p THEN q → (NOT p) OR q"]
    A -->|量词化法则| C["FORALL x(p) → NOT EXISTS x(NOT p)"]
    B --> D[德摩根律展开]
    C --> D
    D -->|双重否定律化简| E["纯AND/OR/NOT/EXISTS结构"]
    E -->|系统化映射| F["SQL表达式<br/>(正确但可能晦涩)"]

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第11章"使用逻辑 表述SQL表达式"11.1节"一些变换法则"、11.8节"处理模糊性"(源文件: OEBPS/text00119.html、text00126.html) - 结论依据:原文明确"蕴涵律:IF p THEN q≡(NOT p)OR q……双重否定法则…… 德摩根律……量词化法则:FORALL x(p(x))≡NOT EXISTS x(NOT p(x)) ……IF p THEN q≡IF NOT q THEN NOT p……X1可以重写为X2"。 - 原始内容:蕴涵律:IF p THEN q≡(NOT p)OR q……量词化法则:FORALL x (p(x))≡NOT EXISTS x(NOT p(x))……IF p THEN q≡IF NOT q THEN NOT p。