命題邏輯是介紹邏輯基本性質的一個很好的工具。它不提供確定原子語句的有效性(真或假)的方法。相反,它允許你在給定其原子成分的有效性的情況下評估複合語句的有效性。
例如,考慮以下情況
- 我喜歡帕特或者我喜歡喬。
- 如果我喜歡帕特,那麼我喜歡喬。
- 我喜歡喬嗎?
接受前兩個陳述作為事實,注意這裡“或”的使用不是排他的,因此實際上可以認為是在說“我喜歡帕特,或者我喜歡喬,或者我兩者都喜歡”。這些陳述是否意味著“我喜歡喬”為真?試著說服自己“我喜歡喬”為真,並考慮另一條推理途徑
- 豬會飛或者魚會唱歌。
- 如果豬會飛,那麼魚會唱歌。
- 魚會唱歌嗎?
我們可以看到,在這兩種情況下答案都是是。以上兩組陳述都可以抽象如下
?
在這裡,我們關注的是邏輯推理本身,而不是陳述。因此,我們不使用豬或帕特,而是簡單地寫
s或
s。我們首先從命題邏輯的語法開始我們的研究:也就是說,我們描述邏輯語言中的元素以及它們是如何書寫的。然後我們描述這些符號的語義:即符號的含義。
命題邏輯的語法由命題符號、邏輯連線詞和括號組成。規則規定了這些元素如何組合在一起。首先,我們將命題符號僅僅視為一些符號的集合,出於我們的目的,我們將使用羅馬和希臘字母,並將所有符號的集合稱為
- 命題符號:一些符號的集合
。例如
其次,我們有邏輯連線詞
- 邏輯連線詞:

請注意,這些不是最小的必需集合;它們可以使用單個連線詞NOR(非或)或NAND(非與)等效地表示,這些連線詞在計算機硬體的最低級別使用。最後,我們使用括號來表示表示式(稍後我們將使括號可選)
- 括號:

表示式是命題符號、括號和邏輯連線詞的字串。
我們考慮的表示式稱為公式。公式集
是最小的表示式集,滿足

- 如果
,則
,
,
- 若
,並且
.
另一種定義公式的方法是將其視為由以下上下文無關文法定義的語言(起始符號為
)
,其中
代表任何命題符號

事實 1(唯一可讀性):上述上下文無關文法是無歧義的。
公式的功能是在給定原子語句的含義的情況下建立語句的含義。公式
的語義,其中命題符號為
,是一個對映,它將每個真值賦值
到
關聯到
的一個真值(0 或 1)。(真值“真”和“假”可以分別用 1 或 0 代替,以及縮寫“T”和“F”。)
由於事實 1(如上所示),語義是明確定義的。
指定邏輯連線詞語義的一種方法是透過真值表
 |
 |
(p 且 q) |
| 0 |
0 |
0
|
| 0 |
1 |
0
|
| 1 |
0 |
0
|
| 1 |
1 |
1
|
是否總能找到一個實現任何給定語義的公式?是的,任何真值表都可以由一個公式實現。該公式可以如下找到。“表示”其中
的行,使用真命題符號的合取和假命題符號的否定。最後寫出結果的析取。
例如,
 |
 |
 |
合取(僅真值) |
| 0 |
0 |
1 |
|
| 0 |
1 |
0 |
|
| 1 |
0 |
1 |
|
| 1 |
1 |
0 |
|
推論:每個公式都等價於命題符號或命題符號的否定構成的合取式的析取(析取正規化,DNF)。
DNF 的對偶是合取正規化,CNF。
要得到CNF 中的
- 描述
為假的場景。
- 注意,當
為假時,
為真。因此,使用德摩根定律對
取反。
在某些情況下,DNF(或 CNF)的大小會比原始公式指數級增長。例如,對於
,其等價的 DNF 的大小是指數級的。
每個真值表是否都存在一個多項式大小的公式來實現它?更準確地說,是否存在
使得每個具有
個命題符號的真值表都存在一個大小為
的形式
?答案:否。
證明:假設存在這樣的
。對於
個命題符號,真值表的數量是
。大小為
的公式數量是
(
個命題符號,4 個連線詞和括號)。顯然,
,對於足夠大的
。
[待補充:解釋這些定義是什麼以及提供它們的上下文]
- 滿足性:公式
被真值指派
滿足。記號:
(
對
為真)。
- 蘊涵:公式集
蘊涵
。記號:
。
蘊涵
當且僅當每個滿足
的真值指派也滿足
。
– 公式集,其總是為真(也稱為**重言式**)。例如, p ) , ( [ ( p ∨ q ) ∧ ( p → q ) ] → q ) {\displaystyle (p\lor \neg p),(p\to p),([(p\lor q)\land (p\to q)]\to q)}
是有效的公式。
– 公式集,其永遠為假(不可滿足)。
- 介於兩者之間:
- 公式集,其存在滿足賦值(不可滿足)。
注意。
。
斷言:
斷言:
是NP完全的。
證明:
: 猜測一個滿足賦值,然後驗證公式是否為真(滿足賦值是一個證書)。
- 硬度。圖3著色
(也存在一個直接證明)。我們將3著色規約到
。令
為一個圖,其中有
個節點
。我們使用命題變數
來表示節點
被染成綠色、紅色或藍色。構造
如下

斷言:
。
也可以直接證明
。
斷言:
。
SAT在多項式時間內解決的特殊情況。示例

**霍恩子句**(Horn clause)是指最多隻有一個肯定文字(positive literal)的文字析取式(disjunction of literals)。霍恩子句主要有兩種型別。
- 子句包含1個肯定文字
,或者

- 不包含肯定文字


**斷言**:對於任意一組霍恩公式集
,檢查
是否可滿足(satisfiable)屬於**P**類問題。
證明思路:令
為
的子集,其中僅包含型別 1 的子句,而
為
的子集,其中包含型別 2 的子句。首先要注意的是,
是可滿足的。為了得到一個最小滿足賦值
,從單文字子句中的文字開始,並應用規則。現在需要檢查
與
中的子句的一致性。為此,只需檢查對於
中的每個子句
,
對於所有的
都不為真。
示例:考慮霍恩子句集 

型別 1 的子句集
由前 5 個子句組成,而
由最後一個子句組成。請注意,
也可以寫成

對於
,其最小滿足賦值如下獲得
- 從
開始
- 利用第一個蘊含式推匯出

- 利用第二個蘊含式推匯出

因此,最小滿足賦值使得
為真。這與
矛盾,後者指出
必須為假。因此,
不可滿足。
**演繹**系統是一種從給定陳述中證明新陳述的機制。
令
為一組已知的有效陳述(命題公式)。在演繹系統中,有兩個組成部分:推理規則和證明。
- 推理規則
- 推理規則表明,如果某些陳述(公式)集
為真,則給定陳述
也必須為真。推理規則
表示為
。
- 示例(肯定前件):

- 證明
從
中證明
的證明是一個公式序列
,其中
,並且對於所有
- 每個公式
,或者
- 存在公式的子集
,使得
是一個推理規則。
如果
使用推理規則
從
有一個證明,我們寫成
。
性質:
- 可靠性(Soundness):如果
,則
(即,所有可證明的句子都是真的)。此屬性對於演繹系統正確性的基礎。
- 完備性(Completeness):如果
,則
(即,所有真句子都是可證明的)。這是演繹系統中一個理想的性質。
自然演繹是一組推理規則。令
表示矛盾,假。以下是自然演繹的推理規則

}
}
}
}
}
}
}
}
}
}
}
}



規則 (13) 允許我們證明形如“如果
則
” 的有效陳述,即使我們不知道
陳述的真值(即,
不在已知有效陳述的集合
中)。實際上,對於此規則,我們首先假設
是有效的。如果我們可以在
有效的世界中得出結論
是有效的,那麼我們得出結論關係
為真,並且我們“釋放”假設
是有效的。
現在我們展示如何應用上述推理規則。
示例:否定的或表示式的德摩根定律指出

證明:根據規則
,如果我們能證明
和
,我們就可以推匯出期望的結果。
為了證明第一個方向,我們使用規則 13 並假設前提
。然後
(假設)
(假設)
(根據規則11)
(根據規則5)
(根據規則14)
(假設)
(根據規則11)
(根據規則5)
(根據規則14)
(根據規則1)
(根據規則13)
我們現在證明第二個方向。
(假設)
(根據規則2)
(根據規則3)
(假設)
(假設)
(根據規則5)
(根據規則16)
(根據規則14)
(根據規則13)
皮爾斯定律的證明
![{\displaystyle [(A\to B)\to A]\to A}](https://wikimedia.org/api/rest_v1/media/math/render/svg/718320acf94fcfebb44971dc780fb2e24009a5c5)
(假設)(1*)
(假設)
(假設)
(根據規則5)
(根據規則7)
(根據規則13)
(根據假設(1*)和規則4)
(根據規則5)
(根據規則14)
(根據規則13)
事實2:自然演繹是可靠的。
為了證明自然演繹也是完備的,我們需要引入命題歸結。
歸結是另一種用於檢查語句有效性的過程。它涉及子句、公式和單個歸結規則。
一些術語
- 子句
- 子句是由文字析取組成的命題公式。例如
。它通常表示為文字的集合,例如
。
- 空子句,表示為一個空框“
”,是沒有文字的析取。它總是假的。
- 公式
- 一組子句,每個子句都是可滿足的。例如,
表示CNF公式
。
- 空公式,表示為
,是不包含任何子句的集合。它總是真的。
- 歸結規則
- 規則規定,給定兩個子句
(包含某個文字
)和
(包含某個文字
),可以推匯出一個新的子句,稱為
和
的結果子句(相對於
)。
歸結證明系統包含單個歸結規則,其中結果子句定義如下。假設
和
是子句,使得
且
,則

包含
且在歸結下封閉的最小子句集記為
。
示例:如果
且
,則
。
可以證明,如定義的那樣,歸結規則計算出的子句可以透過自然演繹推匯出來。
斷言:設
和
是任意兩個子句,使得
且
。則
。
為了證明一個陳述
的有效性,我們將證明其否定陳述
是不可滿足的。為了證明公式
的不可滿足性,我們需要定義公式
的歸結反駁。
公式
的歸結反駁樹是一棵根節點為空子句的樹,其中每個葉子節點都是
中的一個子句,每個內部節點都計算為其兩個對應子節點的歸結式。
注意,
的子句可以重複作為葉子節點出現。根據上述斷言,我們可以得出結論:
斷言:如果存在公式
的歸結反駁樹,則
,也就是說,
是不可滿足的。
示例:公式

具有以下歸結反駁樹
在計算歸結反駁樹時,選擇子句計算歸結式的順序很重要,如下例所示:考慮公式

即使對於
可能存在歸結反駁樹,但在嘗試構建樹時,順序也很重要。下面是兩個不同的歸結反駁樹,但只有一個是成功的。
對
進行歸結反駁樹的不成功嘗試
對
進行歸結反駁樹的成功嘗試
可靠性:命題歸結是可靠的,也就是說,如果對於給定的公式
存在歸結反駁樹,則
必須是不可滿足的。
定理:對於任何公式
,如果
,則
。
完備性:命題歸結是完備的,也就是說,如果給定的公式
是不可滿足的,則
具有歸結反駁樹。
定理:對於任何公式
,如果
,則
。
證明:透過對
中變數個數進行歸納。
基礎情況:我們有一個變數,比如
。
的所有可能的子句是
和
。如果
是不可滿足的,則這兩個子句都會出現,因此
。
歸納步驟:假設對於少於
個變數的公式,該假設成立。令
為一個具有
個變數的公式。假設
;我們將證明
是可滿足的。令
為
的一個變數。那麼要麼
,要麼
(如果兩者都成立,則
立即成立)。
假設
。我們定義公式
,它包含所有不包含
的子句,並且其中文字
已從每個子句中刪除(換句話說,
等價於將
設定為真的結果得到的公式)。
形式上,
.
首先,注意

因此,
.
此外,由於
,我們有
。根據歸納假設,
是可滿足的。然後
透過
的滿足賦值的擴充套件來滿足,其中
等於真。情況
類似。
定理:令
為自然演繹的推理規則集。如果
,則
。
自然演繹完備性證明的思想如下。假設
是有效的(那麼
是不可滿足的)。然後我們證明存在一個針對
的歸結反駁,然後透過應用矛盾規則(規則 15)

我們得出結論
可以被推斷出來。
證明:(草圖)給定一個在
下有效的公式
,我們執行以下步驟
- 證明
等價於某個
,其中
為合取正規化。
- 證明對於所有
,都有
成立。
- 根據歸結原理的完備性,如果
是不可滿足的,則
。因此,對於某個文字
,有
和
。這意味著
。
- 得出結論
,因此
是有效的。
步驟 (1) 可以透過重複應用德摩根定律輕鬆完成。步驟 (2) 可以使用自然演繹法證明。最後,步驟 (3) 可以透過對獲得
的步驟數進行歸納證明。顯然,每個步驟都可以使用自然演繹法模擬。
任何命題歸結演算法在最壞情況下都可能需要很長時間(回想一下,檢查公式
的有效性是 co-NP 完全的)。
線性歸結是一種特殊的歸結策略,它總是將最新的歸結式與一個子句進行歸結。因此,由此獲得的歸結反駁樹是線性的。可以證明,如果子句集是 Horn 子句,則對於任何公式都存在一種線性歸結策略。也就是說,線性歸結對於 Horn 子句集是完備的。
PROLOG 語言使用霍恩子句集上的歸結原理。每個子句稱為程式子句。此外,由單個文字組成的子句稱為事實。只有一個否定文字的子句稱為查詢。下表顯示了不同表示法的比較。在 PROLOG 中,要查詢語句
,其思路是將語句取反(
),並使用已知真語句集執行歸結。如果找到一個歸結反駁樹,則語句
由程式蘊含。
示例:線性歸結用於公式的示例

如下所示
