知识卡片
前束范式及其"未必最自然"的提醒
内容
前束范式(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表述方式并非总是最容易理解的。