知识卡片

前束范式及其"未必最自然"的提醒

普通读书笔记卡

内容

前束范式(prenex normal form,PNF)是关系演算谓词的一种规范化写法:谓词是 前束范式的,当且仅当它要么完全不含量词,要么形如Q1 x1(Q2 x2(...(Qn xn(q))...)) ——每个Qi都是EXISTS或FORALL之一,所有量词集中出现在表达式最前面,内层的q (有时称为矩阵,matrix)本身不再含任何量词。前束范式在正确性上和其他写法 完全等价,只是在很多情况下书写更自然、结构更规整(把所有”存在/所有”的量化 条件先声明清楚,再给出无量词的核心判断)。但书中特意用一个反例提醒:前束 范式并不总是最好理解的形式——查询”获得未供应P2零件的供应商姓名”,非PNF 写法{SX.SNAME}WHERE NOT(EXISTS SPX(SPX.SNO=SX.SNO AND SPX.PNO='P2')) 直观、易懂;改写成等价的前束范式{SX.SNAME}WHERE FORALL SPX(SPX.SNO≠ SX.SNO OR SPX.PNO≠'P2')虽然形式上更规范,但反而比原来的”否定EXISTS”写法 更难一眼看懂——这提醒读者,规范化形式(PNF)是一种有用的分析工具,但不应 被当成”更正确”或”应该优先采用”的写法,选择哪种表达形式最终还是要服务于 可读性这个更现实的目标。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第10章"SQL与逻辑" 10.5节"关系演算"(源文件:OEBPS/text00113.html) - 结论依据:原文明确"谓词是前束范式的,当且仅当:(a)它是量词无关的…… (b)它采用的形式是EXISTS x(p)或FORALL x(p)……从正确性上说,前束 范式和其他形式一样,只不过它在很多情况下是更加自然的表述方式""不过我 觉得这种替换表述方式不如非PNF版本的表述方式更'自然';也就是说,我觉得 本例说明了PNF表述方式并非总是最容易理解的"。 - 原始内容:谓词是前束范式的,当且仅当……从正确性上说,前束范式和其他 形式一样……我觉得这种替换表述方式不如非PNF版本的表述方式更"自然"…… PNF表述方式并非总是最容易理解的。