函数依赖推理资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.2.3 函数依赖公理系统
1974年W.W.Armstrong首先提出了函数依赖的公理系统,称为Armstrong公理。对于一组已知的函数依赖,利用该公理可导出所蕴函的函数依赖。对于关系模式R(U,F),为了确定一个关系模式的码,为了从一组函数依赖求得蕴含的函数依赖,我们需要从现有的函数依赖集合F下推导或者至少需要判断函数依赖X→Y是否为F所蕴含。为此,我们需要一套推理规则。这样的推理规则,在1974年由Armstrong首先提出来,称为Armstrong公理(Armstrong's axioms) 系统。
在介绍Armstrong公理系统之前,我们先给出逻辑蕴含和F的闭包的概念。
1. 逻辑蕴含
给定一个关系模式,只考虑给定的函数依赖是不够的,必须找出在该关系模式上成立的其他函数依赖。
逻辑蕴含:设F是关系模式R(U)的函数依赖集合,由F出发,可以证明其他某些函数依赖也成立,我们称这些函数依赖被F逻辑蕴含。
例如,设F={ A→B,B→C },则函数依赖A→C被F逻辑蕴含,记作:F |= A→C。即函数依赖集F 逻辑蕴含函数依赖A→C。
2. F的闭包F+
对于一个关系模式,如何由已知的函数依赖集合F,找出F逻辑蕴涵的所有函数依赖集合呢?这就是我们下面要讨论的问题。
F的闭包F+:设F为一个函数依赖集,F的闭包是指F逻辑蕴涵的所有函数依赖集合。F的闭包记作F+。
例如,给定关系模式R(A,B,C,G,H,I),函数依赖集合F={A→B,A→C,CG→H,CG→I,B→H}。可以证明函数依赖A→H被F逻辑蕴涵。
设有元组s和t,满足s[A]=t[A],根据函数依赖的定义,由已知的A→B,可以推出s[B]=t[B]。又根据函数依赖B→H,可以有s[H]=t[H]。因此,已经证明对任意的两个元组s和t,只要有s[A]=t[A],就有s[H]=t[H]。所以,函数依赖A→H 被F逻辑蕴涵。
计算F的闭包F+,可以由函数依赖的定义直接计算,如上面的示例。但是,当F很大时,计算的过程会很长。为了从已知的函数依赖推导出其它函数依赖,Armstrong 提出了一套推理规则,称为Armstrong 公理,通过反复使用这些规则,可以找出给定F的闭包F+。其推理规则可归结为如下3条:自反律(reflexivity)、增广律(augmentation)和传递律(transitivity)。
3.Armstrong 公理
设U为属性总体集合,F为U上的一组函数依赖,对于关系模式R(U,F),X、Y、Z为属性U的子集,有下列推理规则:
A1:自反律(reflexivity)
若Y X U,则X→Y为F所蕴函。
A2:增广律(augmentation)
若X→Y为F所蕴函,且Z是U的子集,则XZ→YZ为F所蕴函。式中XZ 和YZ是X∪Z 和Y∪Z的简写。
A3:传递律(transitivity)
若X→Y、Y→Z为F所蕴函,则X→Z为F所蕴函。
由自反律所得到的函数依赖都是平凡的函数依赖,自反律的使用并不依赖于F,而只依赖于属性集U。
Armstrong公理是有效的和完备的。可以利用该公理系统推导F的闭包F+。
由于利用Armstrong公理直接计算F+很麻烦。根据A1, A2, A3这三条推理规则还可以得到其他规则,用于简化计算F+的工作。如下面扩展的三条推理规则: *合并规则: 由X→Y, X→Z, 有X→YZ
*伪传递规则: 由X→Y, WY→Z, 有XW→Z
*分解规则: 由X→YZ, 则有X→Z,X→Y
Armstrong公理可以有多种表示形式,例如,增广律A2可以用合并规则代替。例如,用自反律A1,传递律A3和合并规则可推导出增广律A2。
证明:XZ →X (A1:自反律)
X →Y (给定条件)
XZ →Y (A3:传递律)
XZ →Z (A1:自反律)
XZ →YZ (合并规则)
4.属性集的闭包
原则上讲,对于一个关系模式R(U,F),根据已知的函数依赖F,反复使用前面的规则,可以计算函数依赖集合F的闭包F+。但是,利用推理规则求出其全部的函数依赖F+是非常困难的,而且也没有必要。因此,可以计算闭包的子集,即选择一个属性子集,判断该属性子集能函数决定哪些属性,这就是利用属性集闭包的概念。
(1)属性集闭包的定义
设F为属性集U上的函数依赖集,X U,即X为U的一个子集。在函数依赖集F下被X函数决定的所有属性为F+下属性集X的闭包,记作X+。即X+={ A| X→A } 。
(2)计算属性集闭包X+的算法如下:
输入:X,F
输出:X+
迭代算法的步骤:
①选取X+的初始值为X ,即X+={X};
②计算X+,X+={X Z} ,其中Z要满足如下条件:
Y X+,且F中存在一函数依赖Y→Z。实际上就是以X+中的属性子集作为函数依赖的决定因素,在F中搜索函数依赖集,找到函数依赖的被决定属性Z放到X+中。
③判断:如果X+没有变化?或X+等于U?则X+就是所求的结果,算法终止。否则转②。
因为U是有穷的,所以上述迭代过程经过有限步骤之后就会终止。
例如,已知关系模式R(U,F),U={A,B,C,D,E,G},F={AB→C,D→EG,C→A,BE→C,BC→D,AC→B,CE→AG},求(BD)+
解:
① (BD)+ = {BD};
②计算(BD)+,在F中扫描函数依赖,其左边为B,D或BD的函数依赖,得到一个D→EG。所以,(BD)+= {BDEG}。
③计算(BD)+,在F中查找左部为BDEG的所有函数依赖,有两个:D→EG 和BE→C。所以(BD)+={(BD)EGC}={BCDEG}。
④计算(BD)+,在F中查找左部为BCDEG子集的函数依赖,除去已经找