引入
人类似乎具有知识,人类的知识能够帮助他们做事。在人工智能中,基于知识的智能体对知识的内部表示进行推理来确定要采取的动作。搜索求解智能体具有知识,但这种知识是非常有限且死板的。它们知道可以采取哪些动作,也知道在某个状态采取某个动作将得到哪种结果,但它们不知道一般事实。问题求解智能体具有的知识对寻找从起点到终点的路径这种问题非常有用,但也仅限于此。
问题求解智能体所使用的原子表示也有很大的局限性。例如,在部分可观测的环境中,问题求解智能体表示它对当前状态的了解的唯一选项是列出所有可能的具体状态。基于知识的智能体可以组合或重组信息以适应各种用途。它可以与当下的需要毫不相关,就像数学家证明定理或天文学家计算地球的预期寿命一样。基于知识的智能体能够接受明确描述的目标作为任务,能够通过主动学习或被告知关于环境的新知识快速地获得完成任务的能力,也能够通过更新相关知识适应环境的变化。
基于知识的智能体的核心部件是它的知识库($knowledge$ $base$,$KB$)。知识库是一个语句集。这些语句用知识表示语言表达,代表了关于世界的某种断言。如果一条语句是直接给出的,而不是从其他语句推导而来的,就称它为公理。
向知识库添加新语句以及从知识库查询已知语句的方法是必不可少的。这些操作的标准名称分别是$Tell$和$Ask$。这两个操作都可能涉及推断,也就是从原有语句中推导出新语句。推断必须符合以下要求:当向知识库询问($Ask$)时,答案应当遵循先前已经告知($Tell$)知识库的内容而生成。
与所有的智能体一样,基于知识的智能体以一个感知作为输入,返回一个动作。该智能体维护一个知识库$KB$,这个知识库最初可能包括一些背景知识。每次调用智能体程序时,程序会做 3 件事。首先,它告知知识库它所感知到的东西。然后,它询问知识库它应当采取什么动作。在回答这一查询时,可能会对关于世界的当前状态、可能的动作序列的执行结果等进行大量推理。最后,智能体程序告知知识库它选择的动作,并返回这一动作以便执行。
由于$Tell$和$Ask$的定义,基于知识的智能体并不仅是普通的用来计算动作的程序。它受到位于知识层面的描述的操控,只需要在知识层面明确智能体所具有的知识和它的目标,就可以决定它的行为。智能体设计者可以从空知识库开始,逐条告知智能体语句,直到它明白如何在它的环境中运作。称之为陈述性系统构建方法。相对地,过程性方法将所需的行为直接编码为程序代码。
逻辑
知识库由语句组成。这些语句是根据表示语言的语法表达的,语法规定了所有的合规语句。用简单的算术就能清晰地说明语法这个概念:$x + y = 4$是合规的语句,而$x4y+=$不是。
一种逻辑还必须定义语句的语义,或者说语句的含义。语义定义每条语句在每个可能世界中的真值。例如,算术的语义指明$x + y = 4$在一个$x$为$2$且$y$为$2$的世界为真,但在一个$x$为$1$且$y$为$1$的世界中为假。在标准的逻辑学中,每个可能世界中的每条语句要么为真,要么为假——没有中间地带。
当需要精确描述时,用模型来代替“可能世界”。可能世界可以被认为是(潜在的)真实环境,智能体可能在也可能不在其中,而模型是数学抽象,对于每个相关的语句,每个模型都有固定的真值(真或假)。有了真值的概念,就可以讨论逻辑推理了。这涉及语句之间的逻辑蕴含,即一个语句逻辑上引发另一语句。数学上用:
$$
\alpha \models \beta
$$
来表示语句$\alpha $蕴含语句$\beta $。蕴含的形式化定义是$\alpha \models \beta$: 当且仅当在$\alpha $为真的每个模型中$\beta $也为真。用刚才介绍的记法,可以将其写作:
$$
\alpha \models \beta \text{当且仅当}M\left( \alpha \right) \subseteq M\left( \beta \right)
$$
若$\alpha \models \beta$,说明$\alpha $是比$\beta $更强的断言,它排除了更多的可能世界。蕴含关系用算术来说明会更为亲切一些:很容易理解语句$x=0$蕴含语句$xy=0$。显然,在任一$x$为$0$的模型中,$xy$也必然为$0$(而无论$y$的值是多少)。
如何用蕴含的定义来推导出结论,答案是进行逻辑推断。枚举所有可能的模型来检验在所有$KB$为真的模型中$\alpha $都为真的推断方法叫做模型检,它验证了$M\left( KB \right) \subseteq M\left( \alpha \right) $。将$KB$的所有推论的集合比作干草堆而将$\alpha $比做一根针或许有助于理解蕴含和推断。蕴含正如草堆中的针一样,而推断就像找到这根针的过程。一些形式化记法体现了这种区别:如果一个推断算法$i$可以从$KB$中推导出$\alpha $,则记为:
$$
KB\vdash _i\alpha
$$
读作$\alpha $是由$i$从$KB$中推得的,或$i$从$KB$中推得$\alpha $,一个仅推导蕴含语句的推断算法被称为是可靠的或保真的。可靠性是极为重要的属性。一个不可靠的推断过程在运作时本质上会编造事实——它会声称发现了并不存在的针。易知模型检验在适用时是一个可靠的程序。
完备性也是很重要的属性:如果一个推断算法能够推导出所有蕴含的语句,则它是完备的。真正的草堆大小是有限的,对其进行全面仔细的检查就一定能确定针在不在草堆里,这似乎是很显然的道理。然而,对许多知识库来说,推论的草堆是无限的,因而完备性就成了一个重大问题。幸运的是,逻辑学中有完备的推断过程,其表达能力足以处理许多知识库。
命题逻辑
命题逻辑的语法定义合法的语句,原子语句由单个命题符号构成。使用括号和被称作逻辑联结词的运算符可以将简单语句构造成复合语句。常用的联结词有 5 个,操作优先级为$\lnot $(非)$\land $(与)$\lor $(或)$\Rightarrow $(蕴含)$\Leftrightarrow $(当且仅当)。
了解了命题逻辑的语法后,接下来说明其语义。语义定义了用于判定特定模型中语句真值的规则。命题逻辑中,模型就是对每个命题符号设定真值,即真($true$)或假($false$)。命题逻辑的语义必须指定在给定模型下如何计算任一语句的真值,这是以递归的方式实现的,这些规则也可以用真值表表示:
如果$KB$和$\alpha $总共含有$n$个符号,那么就会有$2^n$个模型。这样,算法的时间复杂性就会达到$O(2^n)$。(空间复杂性仅为$O(n)$,因为枚举是深度优先的。),在后文将展示一个在大多数情况下更高效的算法。遗憾的是,命题蕴含是余$NP$完全的(即很可能不比$NP$完全简单),因此命题逻辑所有已知推断算法的最坏情况复杂性都是输入规模的指数量级。
命题定理证明
逻辑等价:如果两个语句$\alpha $和$\beta $在相同的模型集合中都为真,则这两个语句逻辑等价,可以写作$\alpha \equiv \beta $。($\equiv $用于对语句进行声明,而$\Leftrightarrow $则用作语句的一部分。)常见逻辑等价关系如下图所示,这些等价关系在逻辑中扮演的角色与算术恒等式在普通数学中的角色非常相似。
如果一条语句在所有模型中都为真,则这条语句是有效的。有效的语句也被称为重言式——它们必然为真。由于语句$True$在所有模型中都为真,所有有效的语句都逻辑等价于$True$。有效语句有什么用?从蕴含的定义可以推导出古希腊人早已懂得的演绎定理:
$$
\text{对于任意语句}\alpha \text{和}\beta \text{,}\alpha \models \beta \text{当且仅当}\alpha \Rightarrow \beta \text{是有效的}
$$
因此,可以通过检验$\alpha \Rightarrow \beta $是否在每个模型中为真来确定$\alpha \models \beta $是否成立,或者通过证明$\alpha \Rightarrow \beta $等价于$True$来确定$\alpha \models \beta $是否成立。反过来,演绎定理表明每条有效的蕴涵语句都描述一个合法的推断。
可满足性:如果一条语句在某些模型中为真或能够被满足,则这条语句是可满足的。在命题逻辑中确定语句的可满足性的问题——$SAT$问题——是第一个被证明为$NP$完全的问题。计算机科学中的许多问题实际上都是可满足性问题。例如,所有约束满足问题询问约束是否可以通过某种赋值来满足。
有效性和可满足性当然是有联系的:$\alpha $ 是有效的,当且仅当$\lnot \alpha $是不可满足的;换言之, $\alpha $是可满足的,当且仅当$\lnot \alpha $不是有效的。还能得出下述非常有用的结论:
$$
\alpha \models \beta \text{当且仅当语句}\alpha \land \lnot \beta \text{是不可满足的}
$$
通过检验$\alpha \land \lnot \beta $的不可满足性,可以从证明$\alpha \models \beta $,这正是数学证明方法中标准的归谬法,它也被称为反证法或矛盾法。