蘊含式(包含EXISTS語句的分析)

蘊含式

1、蘊含式基礎

(Ⅰ)什麼是「蘊含式」

設p、q爲兩個命題。複合命題「若是p,則q」稱爲p與q的蘊含式,記做p→q,並稱p爲蘊含式的前件,q爲後件。定義中規定p→q爲假當且僅當p爲真q爲假。html

或許有同窗會問:我發現這個「蘊含式」好像咱們高中時所學的「命題」。自信一點,把「好像」去掉,只不過「蘊含式」比高中時所學的「命題」的範圍更廣一些。sql


(Ⅱ)「蘊含式」的意義

不難發現,「蘊含式」的邏輯關係爲:q是p的必要條件,p是q的充分條件。也就是說諸如「只要p就q」、「q僅當p」、「只有p才q」...等,均可以符號化爲p→q的形式。數據庫


(Ⅲ)「蘊含式」的真值表( True Table )

img

2、理解的誤區

在咱們平時遇到的「p→q」要麼是p與q之間存在着必定的聯繫,要麼是在前件p爲真的前提下做出的判斷。就好比咱們在高中時學過的「命題」,它的形式是「若p,則q」,形式與「蘊含式」如出一轍,可是細心的同窗就會發現,咱們在研究問題的時候一般將前件p視爲真命題,而後再來研究後件q的真假性,從而判斷「命題」真假性。因此說咱們用之前高中的的思路是很難理解這個真值表(True Table)的。
  
可是要是真想理解起來倒也不是很難,舉個栗子:這裏存在着一個蘊含式「若是我當上了班長,我將提升同窗的福利」。因此不妨設,前件p爲「我當上了班長」,後件q爲「我將提升同窗的福利」,那麼這個蘊含式就能夠符號化爲p→q,記爲I。學習

因此問題就是判斷I的真假,也就是說我有沒有撒謊。spa

很顯然當p爲真,q爲假的時候,我並無履行個人諾言,故此時I爲"False"。當p爲假的時候,無論我有沒有提升同窗們的福利,你都不能說我沒有履行個人諾言,由於我就沒有當上班長,此時的I爲真。code


3、蘊含式中的等價式

【註釋】:若是不理解,能夠先康康(四),裏面有解釋爲什須要學習等價式htm

(Ⅰ)量詞轉換律

①、「存在量詞∃」轉換爲「全稱量詞∀」:¬【∀x p(x)】 ⇔ 【∃x¬p(x)】;
②、「全稱量詞∀」轉換爲「存在量詞∃」:¬【∃x q(x)】 ⇔ 【∀x¬q(x)】;blog


(Ⅱ)含量詞的合取式、析取式的等價式

①、「全稱量詞∀」只對合取式的分配:∀x(p(x) Λ q(x)) ⇔【∀x p(x)】Λ【∀x q(x)】;
②、「存在量詞∃」只對析取式的分配:∃x(p(x)∨q(x)) ⇔ 【∃x p(x)】∨【∃x q(x)】;事件


(Ⅲ)量詞轄域的擴張和收縮(八個等價式)

(1)若量詞的轄域中是合取式(Λ)或者析取式(∨),那麼對於不受約束的謂詞公式(q)能夠直接進入或者退出該轄域

①、∀x(p(x) Λ q) ⇔ 【∀x p(x)】Λ q,一樣的對於∀x(p(x)∨q) ⇔ 【∀x p(x)】∨ q也成立;
②、∃x(p(x)∨q) ⇔ 【∃x p(x)】∨ q, 一樣的對於∃x(p(x)Λq) ⇔ 【∃x p(x)】Λ q也成立;get


(2)若量詞的轄域中是「蘊含式」的前件,那麼做爲後件的不受約束的謂詞公式不能夠直接進入或者退出該轄域

①、【∀x p(x)】→ q ⇔ ¬【∀x p(x)】∨q ⇔ 【∃x¬p(x)】∨q ⇔ ∃x(¬p(x)∨q) ⇔ ∃x(p(x) → q);
②、【∃x p(x)】→ q ⇔ ¬【∃x p(x)】∨q ⇔ 【∀x¬p(x)】∨q ⇔ ∀x(¬p(x)∨q) ⇔ ∀x(p(x) → q);


(3)若量詞的轄域是「蘊含式」的後件,則做爲前件的不受約束的謂詞公式能夠直接進入或者退出該轄域

①、q → 【∀x p(x)】 ⇔ ¬q ∨【∀x p(x)】 ⇔ ∀x(¬q∨p(x)) ⇔ ∀x(q → p(x));
②、q → 【∃x p(x)】 ⇔ ¬q ∨【∃x p(x)】 ⇔ ∃x(¬q∨p(x)) ⇔ ∃x(q → p(x));


(Ⅳ)「蘊含式」 && 德摩根律

(1)普通(我願稱之爲常量)「蘊含式」 && 德摩根律 的等價式

①、「蘊含式」的等價式:p→q ⇔ ¬p∨q ;
②、德摩根律:¬(p∨q) ⇔ ¬pΛ¬q ;


(2)自由元組變量在 「蘊含式」 && 德摩根律 的等價式

①、「蘊含式」的等價式:p(x)→q(x) ⇔ ¬p(x)∨q(x);
②、德摩根律:¬(p(x)∨q(x)) ⇔ ¬p(x) Λ ¬q(x);


(3)約束元組變量在 「蘊含式」 && 德摩根律 的等價式

①、「蘊含式」的等價式:【∀x p(x)】→【∃x q(x)】 ⇔ ¬【∀x p(x)】∨【∃x q(x)】 ⇔ 【∃x¬p(x)】∨【∃x q(x)】 ⇔ ;
②、德摩根律:¬(【∀x p(x)】∨【∃x q(x)】) ⇔ ¬【∀x p(x)】Λ¬【∃x q(x)】;


(Ⅴ)在SQL中咱們重點掌握這樣幾個點:

【註釋】:在下面(四)中會解釋爲何要這樣

(1)基礎部分(主要掌握其形式):

①、蘊含式的等價式(其形式與x以及轄域無關):p→q ⇔ ¬p∨q;

②、德摩根律(長橫變短橫,開口換方向):¬(p∨q) ⇔ ¬p Λ ¬q;

③、量詞轉換律(量詞互換,命題加非),好比:¬【∀x p(x)】 ⇔ 【∃x¬p(x)】;


(2)提升部分(SQL中的條件不多有常量條件):

①、含量詞的合取式、析取式的等價式(存在析取,全稱合取);

②、量詞轄域的擴張和收縮(1);

③、量詞轄域的擴張和收縮(2)(3)—— 能夠根據前面的公式本身推;


(3)困難部分(經常使用):

①、集合X是集合Y的父級(對於任意的x屬於X,老是存在一個y屬於Y,使得「x=y」成立):
\(\forall\ x【x(X)\ \rightarrow\ \exists\ y【y(Y)\ \bigwedge\ x=y】】\)\(\forall\ x【\ ^¬x(X)\ \bigvee\ \exists\ y【y(Y)\ \bigwedge\ x=y】】\)
\(\ ^¬【\ ^¬【\forall\ x【\ ^¬x(X)\ \bigvee\ \exists\ y【y(Y)\ \bigwedge\ x=y】】】】\)\(\ ^¬【\exists\ x\ ^¬【\ ^¬x(X)\ \bigvee\ \exists\ y【y(Y)\ \bigwedge\ x=y】】】\)
\(\ ^¬【\exists\ x【x(X)\ \bigwedge\ \ ^¬【\exists\ y【y(Y)\ \bigwedge\ x=y】】】】\)
更通常的狀況,對於任意的x屬於X使得p(x)成立,老是存在一個y屬於Y,使得「q(x, y)」成立:
\(\forall\ x【p(x)\ \rightarrow\ \exists\ y\ q(x,y)】\)\(\ ^¬【\exists\ x【p(x)\ \bigwedge\ \ ^¬【\exists\ y\ q(x,y)】】】\)

②、集合X和集合Y有交集,嚴格來講就一種狀況,可是爲了研究「至少這個關鍵字」,咱們 將此處分爲兩種狀況:

(ⅰ)集合X和集合Y至少有一個公共元素(某個x屬於X,老是存在一個y屬於Y,使得「x=y」成立):
\(\exists\ x【x(X)\ \bigwedge\ \exists\ y【y(Y)\ \bigwedge\ x=y】】\)
更通常的狀況,對於某個x屬於X知足p(x),老是存在一個y屬於Y知足q(x,y):
\(\exists\ x【p(x)\ \bigwedge\ \exists\ y\ q(x,y)】\)

(ⅱ)集合X和集合Y不徹底相同(存在某個x屬於X,對於任意的y只要屬於Y就必然有「x≠y」):
首先將命題更改一下,也就是將「≠」改爲「不=」,故而有:
\(\exists\ x【x(X)\ \bigwedge\ \forall\ y【y(Y)\ \rightarrow\ \ ^¬(x=y)】】\)\(\exists\ x【x(X)\ \bigwedge\ \ ^¬【\exists\ \ y【y(Y)\ \bigwedge\ (x=y)】】】\)
更通常的狀況,存在一個x屬於X知足p(x),對於任意的y只要屬於Y就必然有¬q(x,y):\(\exists\ x【x(X)\ \bigwedge\ \forall\ y【y(Y)\ \rightarrow\ \ ^¬q(x,y)】】\)\(\exists\ x【p(x)\ \bigwedge\ \ ^¬【\exists\ \ y\ q(x,y)】】\)

③、集合X和集合Y莫得交集(對於任意的x只要屬於X,必然有對於任意的y只要屬於Y,必定知足條件「x≠y」):
\(\forall\ x【x(X)\ \rightarrow\ \forall\ y【y(Y) \rightarrow\ \ ^¬(x=y)】】\)\(\forall\ x【x(X)\ \rightarrow\ \ ^¬【\exists\ y【y(Y) \bigwedge\ x=y】】】\)
\(\ ^¬【\exists\ x【x(X)\ \bigwedge\ \exists\ y【y(Y) \bigwedge\ x=y】】】\)
更通常的狀況,對於任意的x只要屬於X知足p(x),必然有對於任意的y只要屬於Y必定知足條件¬q(x,y),換一種說法就是,「對於任意的x只要屬於X知足p(x),必然不存在y知足條件q(x,y)」:
\(\forall\ x【p(x)\ \rightarrow\ \ ^¬【\exists\ y\ q(x,y)】】\)\(\ ^¬【\exists\ x【p(x)\ \bigwedge\ \exists\ y\ q(x,y)】】\)


(4)須要注意的地方:

①、必須保證「屬於」關係,好比\(x(X)\)必須知足(緣由在於最後的SQL語句……);

②、通常狀況下「\(\forall\)」後面都會加上「蘊含式\(\rightarrow\)」,「\(\exists\)」後面則不多會有蘊含式。

其實經過解讀蘊含式的含義:「只要p就有q」,不難發如今運用全稱量詞的時候,咱們會運用句式「對於任意的x知足p(x)都有q(x)成立」,這句話有一種「天然而然就綁定了」的意思:「只要x知足p(x)那麼就會有q(x)」。
反觀存在量詞,咱們用的最多的就是「老是存在一個x知足p(x),使得q(x)成立」,這個「使得」二字就沒有了「天然而然」的韻味了,就是一種特殊的狀況,不能說x知足p(x)後就必定有q(x),只能是某一個x知足p(x)後剛好也能知足q(x)。
不過也有一種狀況時存在量詞後面加上蘊含式,好比範數的某個定理(《數值分析》\(P_{163}\ 定理15\))「若是在一種範數意義下向量序列收斂時,則在任何一種範數意義下該向量序列均收斂」,即「存在一個x知足p(x),必然有對於任意的x都有q(x)」,這裏的q(x)和p(x)是等價的—屬於X而且向量序列收斂:
\(\exists\ x【p(x)\ \rightarrow\ \forall\ x\ q(x)】\)。固然這個式子不能表達出推論「存在一個x不知足p(x),必然有對於任意的x都不知足q(x)」,由於咱們沒有辦法控制命題變換爲「\(x(X)\ \bigwedge\ \ ^¬m(x)\)」,其中\(m(x)\)就是向量序列收斂。

③、在(3).②中,求相交的時候並非嚴格意義上的相交,由於在(ⅰ)中包含了(3).①的狀況,在(ⅱ)中包含了(3).③的狀況。可是這並無影響到咱們使用,由於咱們通常遇到的相交的問題都是「至少」問題,不會說讓咱們求「集合X和Y有共同的非空元素,而且兩集合不互相包含」,這樣很噁心,而解決「至少」的問題通常會用其否命題「所有」問題求非來解決,因此咱們就不用考慮嚴格意義上的相交了。
可是話又說回來,若是真的趕上了就在(3).②.(ⅰ)和(3).②.(ⅱ)之間加上合取式:
\(\exists\ x【p(x)\ \bigwedge\ \exists\ y\ q(x,y)】\quad\bigwedge\quad\exists\ x【p(x)\ \bigwedge\ \ ^¬【\exists\ \ y\ q(x,y)】】\)。可是千萬注意存在量詞只能對析取式進行分配。

④、【注意:】

(ⅰ)「全稱量詞∀」能夠對合取式進行分配,可是不能對析取式進行分配。
這句話從另外一角度上來講:\(【\forall\ x\ p(x)】\)\(p(a_1)\bigwedge…\bigwedge p(a_n)\)

(ⅱ)「存在量詞∃」能夠對析取式進行分配,可是不能對合取式進行分配。
這句話從另外一角度上來講:\(【\exists\ x\ p(x)】\)\(p(a_1)\bigvee…\bigvee p(a_n)\)


4、因此說……我到底想要表達什麼?

​ 當某一個命題爲條件命題(也就是「蘊含式」)的時候,記爲p→q。這所表達的意思就是:當p爲真而且p→q也爲真的狀況下(這一前提經常被人們忽略,認爲這是理所固然的),發生了p事件就必定能發生q事件。咱們將p和q視爲兩個集合,不難理解,這時就能獲得p⊆q。

​ 因此表示兩個集合是父子集合的時候,能夠這樣來表述:\(\forall\ x【p(x)\in P \rightarrow \exists\ y【q(y)\in Q\ \bigwedge\ p(x)=q(y)】】\)
咱們能夠這樣來分析一下:

①、\(\forall\ x【Condition】\) —— 對於任意的x都要知足某個條件,這個條件用Condition來代指;
②、\(Condition\)\(p(x)\in P \rightarrow \exists\ y【q(y)\in Q\ \bigwedge\ p(x)=q(y)】\) —— 這個條件是:只要p(x)屬於P集合中,那麼總能找到某一個y,使得q(y)屬於Q集合,而且有p(x)=q(y)成立;

​ 很好理解吧,可是這裏我並不僅是bb離散數學,而是要將這玩意兒和SQL的實際狀況相結合。在SQL中有一個很巧妙可是讓人們感到十分蛋疼的一個機制:沒有「全稱量詞∀」。這時咱們就須要運用上面所學到的相關知識,將這些「全稱量詞∀」轉換爲「存在量詞∃」。怎樣表述命題之間的關係、怎樣轉換爲不含「全稱量詞∀」的命題,這些在(三)中已經有所瞭解了,那咱們來看下面一個實例。

訴求:查詢選修了所有課程的學生的姓名和學號。

元組關係運算的表達式:
\(\{new\_s^{(2)}\) |
  \(\exists\ s\)【 # 老是存在一個s知足條件:
    \(s(S)\ \bigwedge\) # s∈S
    \(\forall\ c【c(C) \rightarrow\) # 對於任意的c知足條件:只要c∈C,那麼必定有存在某個sc知足條件:
      \(\exists\ sc【sc(SC)\ \bigwedge\ sc.sno = s.sno\ \bigwedge\ sc.cno = c.cno】\) # sc∈SC,而且使得sc.sno = s.sno和sc.cno = c.cno同時成立 —— 意思就是C.CNo集合是SC.CNo集合的子集,而且將這個集合鏈接起來;
    】
  】 Λ
  \(new\_s[1] = s[1]\ \bigwedge\)
  \(new\_s[2] = s[2]\)
\(\}\)

​ 可是終究不能用元組關係演算來進行篩選,還得轉換爲SQL標準語言。用到(三)中的公式:

(1)首先將元組關係演算分解、簡化:∃s, s(S) Λ p,即爲存在s知足條件:s∈S,而且p;
【註釋】:其中的p爲「\(\forall\ c【c(C)\ \rightarrow\ \exists\ sc【sc(SC)\ \bigwedge\ sc.sno = s.sno\ \bigwedge\ sc.cno = c.cno】】\)」。

(2)其次將歸屬關係p(P)儘可能去掉,進一步簡化,由於歸屬關係在SQL統一用「SELECT 字段名 FROM 表」來表述;
【註釋】:其中p爲「\(\forall\ c【c(C)\ \rightarrow\ \exists\ sc【sc.sno = s.sno\ \bigwedge\ sc.cno = c.cno】】\)」。

(3)靈活運用「蘊含式」公式,將能合併的合併,使得最後的形式爲:
\(\exists\ p_1【Conditions\ \bigwedge\ \exists\ p_2【Conditions\ \bigwedge\ 【...\exists\ p_n【Conditions】】】】\)。那麼根據這一點將p化簡就有:

\[\begin{aligned} p &= \forall\ c【\ ^¬c(C)\ \or\ \exist\ sc【sc.sno = s.sno\ \and\ sc.cno = c.cno】】\\ &= \forall\ c【\exist\ sc【sc.sno = s.sno\ \and\ sc.cno = c.cno】】\\ &= \ ^¬【\exist\ c\ \ ^¬【∃sc【sc.sno = s.sno\ \and\ sc.cno = c.cno】】】\\ \end{aligned} \]

(4)因此最後的形式爲:\(\exists\ s\ \ ^¬【\exists\ c\ \ ^¬【∃sc【sc.sno = s.sno\ \bigwedge\ sc.cno = c.cno】】】\)

​ 轉換爲SQL語句:

SELECT SNo, SN
FROM S
WHERE
	NOT EXISTS (
		SELECT *
		FROM C
		WHERE  
			NOT EXISTS (
				SELECT *
				FROM SC
				WHERE CNo = C.CNo AND SNo = S.SNo
			)
    )

​ 這裏其實有一個很容易弄錯的地方:誤覺得鏈接SC表和S表的元組變量要單獨寫一個「\(\exists\ sc【sc(SC)\ \bigwedge\ sc.sno = s.sno】\)」,也就是說將兩個表間的鏈接獨立開,各連各的。這個想法很是的幼稚,爲何這樣說呢,打一個形象的比方:S表至關於左邊的一個岸,C表至關於右邊的一個岸,SC表顯然就是鏈接兩岸的橋,若是說想要用SC表將C表和S表連起來,那麼確定就須要找到同一個SC表中的元組sc,讓它左手牽S表的元組s,同時右手牽着C表的元組c;若是這不是同時牽的話,就極可能致使橋不是同一個橋,即不是同一個sc元組。下面咱們是能夠經過簡單的邏輯證實來表述的。若是咱們將這兩個鏈接獨立,則會獲得:

①、\(p = \exists\ sc【sc.sno = s.sno】\)

②、按照上述4個步驟簡化q表達式

\[\begin{aligned} q =\qquad &\forall\ c【\ ^¬c(C)\ \or\ \exist\ sc【sc.cno = c.cno】】\\ \overset{去歸屬關係}{\Longrightarrow} &\forall\ c【\exist\ sc【sc.cno = c.cno】】\\ \overset{轉變全稱量詞}{\Longrightarrow} &\ ^¬【\exist\ c \ ^¬【\exist\ sc【sc.cno = c.cno】】】 \end{aligned} \]

③、如今的形式爲:∃s【p Λ q】,可是並非「存在量詞∃」的迭代形式,還須要進一步合併;

④、由德摩根律得:p Λ q = ¬(¬p ∨ ¬q) = ¬(p → ¬q);

⑤、將p、q代入得:\(\ ^¬【\exists\ sc\ sc.sno = s.sno\ \rightarrow\ \exists\ c\ \ ^¬【\exists\ sc\ sc.cno = c.cno】】\)

⑥、由「量詞轄域的擴張和收縮」的第三點,前件不受∃c的轄域,因此能夠等價爲:
\(\ ^¬【\exists\ c\ 【【\exists\ sc\ sc.sno = s.sno】\ \rightarrow\ \ ^¬【\exists\ sc\ sc.cno = c.cno】】】\)
\(\ ^¬【\exists\ c\ 【\ ^¬【∃sc\ sc.sno = s.sno】\ \bigvee\ \ ^¬【∃sc\ sc.cno = c.cno】】】\)) ⇔
\(\ ^¬【\exists\ c\ \ ^¬【【∃sc\ sc.sno = s.sno】\ \bigwedge\ 【∃sc\ sc.cno = c.cno】】】\)

⑦、不少同窗就會將這個等價與「\(\ ^¬【\exists\ c\ \ ^¬【∃sc【sc.sno = s.sno\ \bigwedge\ sc.cno = c.cno】】】\)」結果好像是如出一轍,可是這裏實際上是有一個很大的邏輯錯誤:由「含量詞的合取式、析取式的等價式」的注意事項,咱們知道「存在量詞∃」只能對析取式進行分配、不能對合取式進行分配。這是由於
\(【\exists\ x\ p(x)】\ \bigwedge\ 【\exists\ x\ q(x)】\)」和「\(\exists\ x【p(x)\ \bigwedge\ q(x)】\)」之間的關係是「蘊含式」。
咱們能夠簡單的來證實一下:

(1)從左到右:假設前件「\(\exists\ x【p(x)\ \bigwedge\ q(x)】\)」爲真,那麼存在一個x=c,使得p(c)Λq(c)爲真,即存在一個x=c使得p(c)爲真,存在一個x=c使得q(c)也爲真;故然後件「\(【\exists\ x\ p(x)】\ \bigwedge\ 【\exists\ x\ q(x)】\)」爲真;

(2)從右到左:假設後件「\(【\exists\ x\ p(x)】\ \bigwedge\ 【\exists\ x\ q(x)】\)」爲真,那麼咱們只能獲得,存在一個x=c使得p(c)爲真,存在一個x=b使得q(b)爲真,並不能保證b=c,因此由後件得不到前件;


5、總結

(Ⅰ)掌握「蘊含式」,以及何時運用;
提示:等價式、德摩根律、收縮與擴張,當表示一個集合是另外一個集合的子集時運用「蘊含式」。

(Ⅱ)充分理解「含量詞的合取式、析取式的等價式」,從而得出結論:不能將鏈接操做分開寫,必須寫在一塊兒,這裏的一塊兒是指:保證鏈接時的元組是同一個。具體表現爲:寫在靠後的\(WHERE\)語句中,由於要包含較多的\(SELECT\)語句(本質上是表),使得選擇元組是同一個;
提示:「全稱量詞∀」只能夠對合取式進行分配;「存在量詞∃」只能夠對析取式進行分配。


6、實例

(1)案例_01_以所有課程爲準,學生的4種選課狀況

(2)案例_02_以'李力'老師教授的課程爲準,學生的5種選課狀況

(3)案例_03_以'數據庫'和'JAVA'_教師姓名、編號爲準,老師授課的4種選課狀況

(4)案例_04_以所有學生爲準,課程被選的4種選課狀況(只列舉出2種)

(5)案例_05_關於:至少、至多、剛好

相關文章
相關標籤/搜索