谓词
了解谓词及其与命题的区别。
在英语中,一个陈述句的谓词是指除了主语以外的所有部分。例如,考虑句子:
史密斯身高超过六英尺。
“身高超过六英尺”就是一个谓词。它只有在指定了主语之后才成为一个完整的句子。一旦我们确定了主语,这个陈述句可能为真,也可能为假。因此,谓词描述的是主语可能具有也可能不具有的某种属性。
幸运的是,在数学中,我们可以使用变量来表示未指定的主语。使用变量是一种精确表达许多思想的强大方式:这正是一阶逻辑的基础。正如我们将看到的,这种逻辑非常强大,甚至可以用它来表述数学(以及其他领域)中的若干未解难题。
什么是谓词?
在数学逻辑中,谓词是包含一个或多个变量的语句。我们可以将这些变量看作占位符。这些变量可以取自一个称为其定义域的集合中的任意值。谓词断言的是定义域中的元素可能具有也可能不具有的某种性质。要成为一个真正的谓词,每当我们将定义域中的任意值代入变量时,该谓词都必须变成一个命题。
为了更具体地理解,考虑三位学生:简、吉姆和扎因,他们参加了一门离散数学课程。假设我们想知道哪些学生在这门课中获得了A。我们可以构造如下带有变量 的句子:
- : 在离散数学课程中获得了A。
“在离散数学课程中获得了A”是一个谓词。变量 使我们能够将这个谓词用于完整句子中。 不是一个命题,因为它含有变量。但当我们用某个具体值(即班级中某位学生的姓名)替换 时,它就变成了一个命题,并具有明确的真值。在这种情况下,我们称对谓词进行了实例化。重要的是,从定义域中对变量进行的每一次实例化都应产生一个命题。
定义域必须始终清晰明确。如果存在任何歧义,我们必须明确指出定义域。对于 , 的定义域是注册了离散数学课程的学生。为了具体说明,我们设定义域为 吉姆, 简, 扎因 。
我们可以对 从 中任取一个值来实例化这个谓词。实例化 会使其变为一个具有明确真值的命题。例如,当用吉姆替换 时,我们得到命题:
- 吉姆:吉姆在离散数学课程中获得了A。
我们也可以将谓词可视化为一组真值。列标题是定义域中的各个值。例如,如果只有吉姆没有获得A,那么 简 = 真,吉姆 = 假,扎因 = 真,我们可以将 视为如下表格:
| 简 | 吉姆 | 扎因 |
|---|---|---|
| 真 | 假 | 真 |
表中“真”表示该命题为真,“假”表示该命题为假。
我们再定义另一个与上述相同定义域 的谓词。设:
- : 在期末考试中得分至少达到90%。
对于 ,我们注意到:
- 是一个变量。
- 的定义域仍然是 。
- 谓词描述的是定义域中元素所具备的某种属性。
如果只有扎因在期末考试中得分达到90%以上,那么 扎因 = 真,而 简 = 吉姆 = 假。同样,我们可以用以下表格来可视化该谓词的真值:
| 简 | 吉姆 | 扎因 |
|---|---|---|
| 假 | 假 | 真 |
设:
- :,其中 是整数。
求 的真值。
计算结果如下表所示:
| 命题 | 真值 | 理由 |
|---|---|---|
| 假 | ||
| 假 | ||
| 假 | ||
| 假 | ||
| 真 | ||
| 真 |
在此例中,上述表格并不完整。我们仅确定了定义域中一部分值的真值。完整的真值表将包含无穷多个条目,每个整数对应一条。
下面我们来看一个涉及多个变量的例子。
考虑以下谓词:
- :,其中 为整数。
我们考察一些变量取值的可能性:
| 属性判断 | 真值 | 理由 | |
|---|---|---|---|
| 假 | |||
| 真 | |||
| 真 | |||
| 真 | |||
| 真 | |||
| 假 |
谓词代码示例
在计算机程序中,我们常在条件语句中使用谓词。以下是一个 Python 示例代码。运行此代码可查看不同 x 值下谓词 的真值。
注意: 我们可以更改
domain中的值,以尝试不同的x取值。
1domain = {14, 3, 12, -1, 0, 7} 2for x in domain: 3 if x < 7: 4 print("P(" + str(x) + ") is true.") 5 else: 6 print("P(" + str(x) + ") is false.")
说明
- 第1行: 指定变量
x的定义域。 - 第2行: 遍历
x的每个取值,检查谓词。 - 第3行:
if语句中的谓词为 。 - 第4行: 当谓词为真时执行此行。
- 第6行: 当谓词为假时执行此行。
闰年代码示例
在以下程序中,对不同 y 值计算谓词 的真值。谓词 定义如下:
若某年能被4整除但不能被100整除,或者能被400整除,则该年为闰年。
注意: 我们可以更改
domain中的值,以尝试不同的y值,判断某年是否为闰年。
1domain = {2014, 2103, 1208, 2087, 1604, 714, 1700, 1800, 1900, 2100, 2200, 2000} 2for y in domain: 3 if (y % 4 == 0 and y % 100 != 0) or (y % 400 == 0): 4 print("L(" + str(y) + ") is true because " + str(y) + " is a leap year.") 5 else: 6 print("L(" + str(y) + ") is false because " + str(y) + " is not a leap year.")
说明
- 第1行: 指定包含不同
y值的定义域。 - 第2行: 遍历定义域中的每个
y值,判断是否为闰年。 - 第3行:
if语句中的谓词为 是闰年。 - 第4行: 当谓词为真时执行此行。
- 第6行: 当谓词为假时执行此行。
Quiz
哪个选项是谓词?