命题逻辑能处理“今天下雨”“如果一个数能被 4 整除,那么它能被 2 整除”这类已经有真假的语句。进入证明以后,我们经常要说更细的事:某个对象有某种性质,所有对象都有某种性质,至少有一个对象有某种性质,或者恰好有一个对象有某种性质。
谓词逻辑就是为这类话准备的语言。它把“对象”“性质”“关系”和“范围”分开,让一句话可以被检查、被否定、被翻译,也可以被放进证明。
这一章的目标很朴素:看见“所有”“存在”“唯一存在”时,不靠语感猜,而是能写出清楚的量词表达式;看见量词表达式时,也能知道它到底要求检查什么。
命题是已经能判断真假的陈述。例如“4 是偶数”是真命题,“5 是偶数”是假命题。
谓词先保留一个空位。比如“ 是偶数”还不能直接判断真假,因为 还没有被指定。把 换成 4,它变成真命题;把 换成 5,它变成假命题。
我们常把谓词写成 、、。这里的字母不是神秘缩写,只是给“某个性质”或“某个关系”起一个名字。

一个变量的谓词通常表达性质。例如:
两个或多个变量的谓词通常表达关系。例如:
如果指定 、,那么 是真命题;如果指定 、,那么 是假命题。
谓词本身不是命题。它像一个还没填完的句子。给自由变量赋值,或者用量词把变量绑定起来以后,它才变成有真假的完整陈述。
在 中, 是自由变量。它还没有被量词管理,也没有被具体赋值。
在 中, 被全称量词绑定;在 中, 被存在量词绑定。绑定以后,整个式子不再依赖某个未说明的 ,而是在指定范围内说一句完整的话。
例如:
这句话只有在我们知道 从哪里取值时才完整。如果 在实数范围内取值,它是真的;如果 在复数范围内取值,符号 本身就需要重新解释。
论域是变量允许取值的范围。它可以是整数、实数、某个班级的学生、某个网站的用户,也可以是一张数据表里的记录。
同一个谓词,换了论域,整句话可能改变真假。比如 。
如果论域是所有自然数,并且自然数从 1 开始,那么“每个 都满足 ”是假的,因为 3、4、5 都不满足。
如果论域是 ,同一句全称判断就是真的。

有两种常见写法。
第一种是在句子前先说明论域。例如:“在整数范围内,令 表示 是偶数。”后面再写 或 。
第二种是把论域条件写进公式。例如“每个偶整数的平方都能被 4 整除”可以写成:
其中 表示“ 是偶数”, 表示“ 能被 4 整除”,论域是整数。
也可以写成:
这两种写法的核心一样:先把变量从哪里取值说清楚。
量词错误常常不是因为公式写得太难,而是因为论域被省略了。同一句“所有数都满足……”在自然数、整数、有理数、实数和复数中可能完全不同。
全称量词 读作“对所有”或“任意”。存在量词 读作“存在”或“至少有一个”。
表示论域中的每一个对象都满足 。
表示论域中至少有一个对象满足 。

要证明 为真,只要拿出一个对象 ,并说明 为真。这个 叫作见证。
要证明 为假,只要拿出一个对象 ,并说明 为假。这个 叫作反例。
这两个词很有用。它们把“存在”和“全称”的检查方式压缩成两句话:存在命题找见证,全称命题怕反例。
题目:把“每个偶整数的平方都能被 4 整除”写成谓词逻辑公式,并说明每个部分的含义。
先定论域。题目说的是整数,所以让变量 在 中取值。
再定义谓词。令 表示“ 是偶数”,令 表示“ 能被 4 整除”。
“所有满足条件的对象都有性质”通常写成 ,不是 。后者会要求论域里的每个对象都满足 ,这比原句强得多。
“存在一个偶质数”应写成:
这里用合取 ,因为我们要找同一个 ,它既是偶数,又是质数。
如果误写成:
意思会变弱。只要找到一个不是偶数的 ,蕴含 就会为真,这不能表达“存在一个偶质数”。
否定含量词的句子时,最稳的办法是先用中文理解它,再写公式。
“并非所有学生都交了作业”是什么意思?不是“所有学生都没交”,而是“至少有一个学生没交”。
“不存在学生交了作业”是什么意思?它才是“每个学生都没交”。

两条规则如下:
这就是量词版本的德摩根律。否定推进到里面时, 和 要互换。
题目:论域中有学生和课程。令 表示“学生 完成了课程 的项目”。否定下面的句子,并写成自然中文:
先读原句。它说:对每门课程 ,都存在一名学生 ,使得这名学生完成了这门课的项目。
对整个公式取否定:
否定全称时,找一个反例就够了;否定存在时,要把所有可能对象都排除。这个差别会直接影响证明和反例构造。
当一个句子里有两个变量,量词顺序常常决定意思。
看下面两句话:
第一句说:每个 都可以找到一个适合它的 。不同的 可以对应不同的 。
第二句说:存在一个同一个 ,它适合所有 。这通常强得多。

令论域为整数,令 表示 。
公式
是真的。因为给定任意整数 ,都可以取 。
公式
是假的。它要求存在一个整数 ,比所有整数 都大。但整数没有最大数。只要取 ,就会得到 ,不可能为真。
“每个学生都选了一门课程”通常表达:
意思是每个学生至少有一门课。不同学生可以选不同课程。
“有一门课程被每个学生选择”表达:
它要求同一门课覆盖所有学生。两句话看起来只换了几个字,逻辑要求差很多。
同类量词可以交换,例如 与 意思相同, 与 意思也相同。不同类量词相邻时,一般不能随意交换。
存在量词 表示“至少有一个”。如果想表达“恰好有一个”,要用唯一存在。
常见记号是:
它读作“存在唯一的 使得 成立”。

严格写法可以拆成两部分:
等价于:
这句话先说存在一个满足 的 ,再说任何满足 的 都必须等于这个 。换成证明语言,就是先证明“有一个”,再证明“没有第二个”。
题目:在实数范围内,证明存在唯一的 使得 。
先证明存在性。取 ,则 ,所以至少有一个实数满足方程。
“存在唯一”不是“我只看到了一个”。数学证明必须排除第二个对象。在线性方程里可以用代数变形;在集合、函数或图论问题里,唯一性常常要通过假设两个对象都满足条件,再证明它们相等。
多变量谓词可以看成一张关系表。行对应第一个变量,列对应第二个变量,某个格子为真,表示这两个对象之间有关系。
例如 表示“学生 选择课程 ”。一张选课表就能直接读出很多量词句子。

关系表也能解释数据库查询里的量词直觉。“找出至少选过一门课的学生”就是存在查询;“找出选过所有必修课的学生”则要检查一组课程是否都被覆盖。真正写成程序时,形式可能是子查询、集合差或关系除法,但背后的逻辑仍然是 和 。
题目:令 表示“学生 选择课程 ”。翻译下面两句话。
句子 A:每名学生至少选择一门课程。
句子 B:有一门课程被所有学生选择。
句子 A 先说“每名学生”,所以外层量词是 。对固定的学生 ,后面说“至少选择一门课程”,所以内层是 。
句子 A 的公式是:
翻译量词句子时,不要急着写符号。先把四件事说清楚:论域是什么,谓词怎么定义,量词顺序是什么,连接词用蕴含还是合取。
圈出对象类型。句子是在说整数、学生、课程、函数、图中的顶点,还是数据表中的记录?对象类型决定变量和论域。
给性质或关系命名。单个对象的性质写成 ,两个对象之间的关系写成 ,三个对象可以写成 。
把“每个学生都选了一门课”和“有一门课被每个学生选择”混成一句,是量词顺序错误。前者允许每个学生有自己的课程,后者要求同一门课程对所有学生都成立。
把“并非所有对象都满足 P”改写成“所有对象都不满足 P”是常见错误。正确否定是“存在一个对象不满足 P”。
有些中文句子本来就含糊。例如“所有学生都喜欢某门课”可能表示每个学生各自喜欢至少一门课,也可能表示存在一门共同喜欢的课。做数学翻译时,要把这种含糊拆开,不要让公式替你猜意思。
本章的主线可以压成五句话。谓词是带变量的性质或关系;论域决定变量从哪里取值;全称量词检查每一个对象,存在量词寻找至少一个见证;量词否定时全称和存在互换;多重量词的顺序会改变对象之间的依赖关系。
下面的练习不追求计算量,重点是把中文、公式和检查方式对齐。
答案是:
这里要找同一个整数 ,它同时是偶数和质数,所以用合取。数字 2 是一个见证。
逐层否定得到:
中文意思是:存在一个 ,它和任何 都不满足关系 。
第一个公式是真的。对任意实数 ,都可以取 。
第二个公式是假的。它要求存在一个固定实数 ,等于所有实数 的平方。取 得 ,取 得 ,同一个 不可能同时等于 0 和 1。
可以写成:
如果展开唯一存在,可以写成:
“每名学生都借阅过至少一本书”是:
“有一本书被每名学生借阅过”是:
第一个公式允许不同学生借不同书;第二个公式要求同一本书被所有学生借过。
句子中的“每个偶整数”不是说每个整数都是偶数,而是说“如果一个整数是偶数,那么它的平方满足后面的性质”。因此连接词用蕴含。
得到公式:
读回中文就是:对每个整数 ,如果 是偶数,那么 能被 4 整除。
否定穿过第一个量词,全称变存在:
再把否定穿过第二个量词,存在变全称:
读回中文:存在一门课程,没有任何学生完成了这门课的项目。
再证明唯一性。假设 和 都是实数,并且都满足方程:
由 得 ,所以 。由 得 ,所以 。
因此 。任何两个满足方程的实数其实是同一个数,所以解唯一。
句子 B 先说“有一门课程”,所以外层量词是 。这门课程要“被所有学生选择”,所以内层是 。
句子 B 的公式是:
两个公式的词都差不多,但句子 A 允许不同学生选择不同课程;句子 B 要求同一门课覆盖所有学生。
按中文依赖关系排列量词。如果每个对象都可以有自己的选择,通常是 ;如果要先找一个共同对象,再让它适用于全部对象,通常是 。
判断连接词。“所有满足 A 的对象都满足 B”用 ;“存在一个对象同时满足 A 和 B”用 。
最后把公式读回中文。若读回去的意思比原句更强、更弱或换了对象,就回到前一步修正。
它的证明分两步: 是一个解;如果 ,那么 ,所以没有第二个不同的解。