many chore
This commit is contained in:
FallenYing
2023-07-28 23:20:46 +08:00
parent 50c8ebb126
commit 38a91c62e7
13 changed files with 365 additions and 361 deletions

View File

@@ -1,4 +1,5 @@
# 程序示例——命题逻辑与模型检测
::: warning 😋
阅读程序中涉及命题逻辑的部分,然后“玩一玩”程序!
@@ -8,7 +9,8 @@
::: tip 📥
本节附件下载 <Download url="https://cdn.xyxsw.site/code/2-Lecture.zip"/>
:::
# Sentence——父类
## Sentence——父类
```python
class Sentence(): # 父类
@@ -21,12 +23,12 @@ class Sentence(): # 父类
def symbols(self):
"""返回逻辑表达式中所有命题符号的集合。"""
return set()
@classmethod # @classmethod装饰器 使得类方法可以在类上被调用 Sentence.validate(...)
@classmethod # @classmethod 装饰器 使得类方法可以在类上被调用 Sentence.validate(...)
def validate(cls, sentence):
"""验证操作数是否是Sentence或其子类"""
"""验证操作数是否是 Sentence 或其子类"""
if not isinstance(sentence, Sentence):
raise TypeError("must be a logical sentence")
@classmethod # @classmethod装饰器 使得类方法可以在类上被调用 Sentence.parenthesize(...)
@classmethod # @classmethod 装饰器 使得类方法可以在类上被调用 Sentence.parenthesize(...)
def parenthesize(cls, s):
"""如果表达式尚未加圆括号,则加圆括号。"""
def balanced(s):
@@ -46,7 +48,7 @@ class Sentence(): # 父类
return f"({s})"
```
# Symbol——命题符号类
## Symbol——命题符号类
```python
class Symbol(Sentence):
@@ -71,12 +73,12 @@ class Symbol(Sentence):
return {self.name}
```
# Not——逻辑非类
## Not——逻辑非类
```python
class Not(Sentence):
def __init__(self, operand):
"""验证操作数是否是Sentence或其子类"""
"""验证操作数是否是 Sentence 或其子类"""
Sentence.validate(operand)
self.operand = operand
def __eq__(self, other):
@@ -94,13 +96,13 @@ class Not(Sentence):
return self.operand.symbols()
```
# And——逻辑乘类
## And——逻辑乘类
```python
class And(Sentence):
def __init__(self, *conjuncts):
for conjunct in conjuncts:
"""验证操作数是否是Sentence或其子类"""
"""验证操作数是否是 Sentence 或其子类"""
Sentence.validate(conjunct)
self.conjuncts = list(conjuncts)
def __eq__(self, other):
@@ -124,13 +126,13 @@ class And(Sentence):
return set.union(*[conjunct.symbols() for conjunct in self.conjuncts])
```
# Or——逻辑和类
## Or——逻辑和类
```python
class Or(Sentence):
def __init__(self, *disjuncts):
for disjunct in disjuncts:
"""验证操作数是否是Sentence或其子类"""
"""验证操作数是否是 Sentence 或其子类"""
Sentence.validate(disjunct)
self.disjuncts = list(disjuncts)
def __eq__(self, other):
@@ -151,12 +153,12 @@ class Or(Sentence):
return set.union(*[disjunct.symbols() for disjunct in self.disjuncts])
```
# Implication——逻辑蕴含类
## Implication——逻辑蕴含类
```python
class Implication(Sentence):
def __init__(self, antecedent, consequent):
"""验证操作数是否是Sentence或其子类"""
"""验证操作数是否是 Sentence 或其子类"""
Sentence.validate(antecedent)
Sentence.validate(consequent)
"""前件"""
@@ -183,12 +185,12 @@ class Implication(Sentence):
return set.union(self.antecedent.symbols(), self.consequent.symbols())
```
# Biconditional——逻辑等值类
## Biconditional——逻辑等值类
```python
class Biconditional(Sentence):
def __init__(self, left, right):
"""验证操作数是否是Sentence或其子类"""
"""验证操作数是否是 Sentence 或其子类"""
Sentence.validate(left)
Sentence.validate(right)
self.left = left
@@ -215,7 +217,7 @@ class Biconditional(Sentence):
return set.union(self.left.symbols(), self.right.symbols())
```
# Model_check()——模型检测算法
## Model_check()——模型检测算法
```python
def model_check(knowledge, query):
@@ -234,7 +236,7 @@ def model_check(knowledge, query):
def check_all(knowledge, query, symbols, model):
"""检查给定特定模型的知识库是否推理蕴含查询结论。"""
# 如果模型已经为所有的命题符号赋值
if not symbols: # symbols为空即所有 symbols都在模型中被赋值
if not symbols: # symbols 为空即所有 symbols 都在模型中被赋值
# 若模型中的知识库为真,则查询结论也必须为真
if knowledge.evaluate(model):
return query.evaluate(model)
@@ -244,10 +246,10 @@ def model_check(knowledge, query):
# 选择其余未使用的命题符号之一
remaining = symbols.copy()
p = remaining.pop()
# 创建一个命题符号为true的模型
# 创建一个命题符号为 true 的模型
model_true = model.copy()
model_true[p] = True
# 创建一个命题符号为false的模型
# 创建一个命题符号为 false 的模型
model_false = model.copy()
model_false[p] = False
# 确保在两种模型中都进行蕴含推理
@@ -259,7 +261,7 @@ def model_check(knowledge, query):
return check_all(knowledge, query, symbols, dict())
```
# 线索游戏
## 线索游戏
在游戏中,一个人在某个地点使用工具实施了谋杀。人、工具和地点用卡片表示。每个类别的一张卡片被随机挑选出来,放在一个信封里,由参与者来揭开真相。参与者通过揭开卡片并从这些线索中推断出信封里必须有什么来做到这一点。我们将使用之前的模型检查算法来揭开这个谜团。在我们的模型中,我们将已知与谋杀有关的项目标记为 True否则标记为 False。
@@ -287,7 +289,7 @@ def check_knowledge(knowledge):
if model_check(knowledge, symbol):
termcolor.cprint(f"{symbol}: YES", "green")
elif not model_check(knowledge, Not(symbol)):
# 模型检测无法确定知识库可以得出 Not(symbol) 即 symbol是可能的
# 模型检测无法确定知识库可以得出 Not(symbol) 即 symbol 是可能的
print(f"{symbol}: MAYBE")
else:
termcolor.cprint(f"{symbol}: No", "red")
@@ -311,7 +313,7 @@ knowledge.add(Not(ballroom))
check_knowledge(knowledge)
```
# Mastermind 游戏
## Mastermind 游戏
在这个游戏中,玩家一按照一定的顺序排列颜色,然后玩家二必须猜测这个顺序。每一轮,玩家二进行猜测,玩家一返回一个数字,指示玩家二正确选择了多少颜色。让我们用四种颜色模拟一个游戏。假设玩家二猜测以下顺序:
@@ -325,7 +327,7 @@ check_knowledge(knowledge)
![](https://cdn.xyxsw.site/EuXObldHcoaO74xIzZocQQKTn4k.png)
在命题逻辑中表示这一点需要我们有(颜色的数量)$^2$个原子命题。所以,在四种颜色的情况下,我们会有命题 red0red1red2red3blue0…代表颜色和位置。下一步是用命题逻辑表示游戏规则每个位置只有一种颜色没有颜色重复并将它们添加到知识库中。最后一步是将我们所拥有的所有线索添加到知识库中。在我们的案例中我们会补充说在第一次猜测中两个位置是错误的两个是正确的而在第二次猜测中没有一个是对的。利用这些知识模型检查算法可以为我们提供难题的解决方案。
在命题逻辑中表示这一点需要我们有 (颜色的数量)$^2$个原子命题。所以,在四种颜色的情况下,我们会有命题 red0red1red2red3blue0…代表颜色和位置。下一步是用命题逻辑表示游戏规则每个位置只有一种颜色没有颜色重复并将它们添加到知识库中。最后一步是将我们所拥有的所有线索添加到知识库中。在我们的案例中我们会补充说在第一次猜测中两个位置是错误的两个是正确的而在第二次猜测中没有一个是对的。利用这些知识模型检查算法可以为我们提供难题的解决方案。
```python
from logic import *
@@ -379,9 +381,9 @@ for symbol in symbols:
print(symbol)
```
# Quiz
## Quiz
1. 下面的问题将问你关于以下逻辑句子的问题。 1.如果 Hermione 在图书馆,那么 Harry 在图书馆。 2.Hermione 在图书馆里。 3.Ron 在图书馆Ron 不在图书馆。 4.Harry 在图书馆。 5.Harry 不在图书馆,或者 Hermione 在图书馆。 6.Rom 在图书馆,或者 Hermione 在图书馆。
1. 下面的问题将问你关于以下逻辑句子的问题。1.如果 Hermione 在图书馆,那么 Harry 在图书馆。2.Hermione 在图书馆里。3.Ron 在图书馆Ron 不在图书馆。4.Harry 在图书馆。5.Harry 不在图书馆,或者 Hermione 在图书馆。6.Rom 在图书馆,或者 Hermione 在图书馆。
以下哪一个逻辑蕴含推理是正确的?
@@ -395,21 +397,21 @@ for symbol in symbols:
2. 除了讲义上讨论的连接词之外,还有其他的逻辑连接词。其中最常见的是“异或”(用符号$\oplus$表示)。表达式$A\oplus B$表示句子“A 或 B但不是两者都有。”以下哪一个在逻辑上等同于$A\oplus B$
1. $(A B) ∧ ¬ (A B)$
2. $(A B) ∧ (A ∧ B)$
3. $(A B) ∧ ¬ (A ∧ B)$
4. $(A ∧ B) ¬ (A B)$
3. $(A B) ∧ ¬ (A ∧ B)$
4. $(A ∧ B) ¬ (A B)$
3. 设命题变量$R$为“今天下雨”,变量$C$为“今天多云”,变量$S$ 为“今天晴”。下面哪一个是“如果今天下雨,那么今天多云但不是晴天”这句话的命题逻辑表示?
3. 设命题变量$R$为“今天下雨”,变量$C$为“今天多云”,变量$S$ 为“今天晴”。下面哪一个是“如果今天下雨,那么今天多云但不是晴天”这句话的命题逻辑表示?
1. $(R → C) ∧ ¬S$
2. $R → C → ¬S$
3. $R ∧ C ∧ ¬S$
4. $R → (C ∧ ¬S)$
5. $(C ¬S) → R$
1. $(R → C) ∧ ¬S$
2. $R → C → ¬S$
3. $R ∧ C ∧ ¬S$
4. $R → (C ∧ ¬S)$
5. $(C ¬S) → R$
4. 在一阶逻辑中,考虑以下谓词符号。$Student(x)$表示“x 是学生”的谓词。$Course(x)$代表“x 是课程”的谓词,$Enrolled(x,y)$表示“x 注册了 y”的谓词以下哪一项是“有一门课程是 Harry 和 Hermione 都注册的”这句话的一阶逻辑翻译?
1. $∀x(Course(x)∧Enrolled(Harry, x) ∧ Enrolled(Hermione, x))$
2. $∀x(Enrolled(Harry, x) Enrolled(Hermione, x))$
3. $∀x(Enrolled(Harry, x) ∧ ∀y Enrolled(Hermione, y))$
4. $∃xEnrolled(Harry, x) ∧ ∃y Enrolled(Hermione, y)$
5. $∃x(Course(x) ∧ Enrolled(Harry, x) ∧ Enrolled(Hermione, x))$
6. $∃x(Enrolled(Harry, x) Enrolled(Hermione, x))$
4. 在一阶逻辑中,考虑以下谓词符号。$Student(x)$表示“x 是学生”的谓词。$Course(x)$代表“x 是课程”的谓词,$Enrolled(x,y)$表示“x 注册了 y”的谓词以下哪一项是“有一门课程是 Harry 和 Hermione 都注册的”这句话的一阶逻辑翻译?
1. $∀x(Course(x)∧Enrolled(Harry, x) ∧ Enrolled(Hermione, x))$
2. $∀x(Enrolled(Harry, x) Enrolled(Hermione, x))$
3. $∀x(Enrolled(Harry, x) ∧ ∀y Enrolled(Hermione, y))$
4. $∃xEnrolled(Harry, x) ∧ ∃y Enrolled(Hermione, y)$
5. $∃x(Course(x) ∧ Enrolled(Harry, x) ∧ Enrolled(Hermione, x))$
6. $∃x(Enrolled(Harry, x) Enrolled(Hermione, x))$