☰
人工智能期末复习:知识表示、归结演绎与搜索策略习题精解
2026/10/13 19:33:04 网站建设 项目流程

简介:人工智能经典习题集及各章总结是一份面向期末备考的配套学习资料,适用于计算机相关专业学生、考研复习者及自学者,聚焦人工智能基础理论、知识表示与推理专题。资源包内共1个doc文档,大小2.19MB,集中包含各章小结、典型习题及详细解答,内容组织贴合课程复习节奏,便于按需查阅。目前已有100人学习/下载,内容覆盖人工智能定义与发展阶段、三大研究学派、搜索技术、产生式规则、框架与语义网络以及归结演绎推理等核心考点,并通过具体案例(如最短旅行路线设计、盗窃犯逻辑推演)展示问题求解思路。读者借助这份资料可以系统梳理AI理论脉络,查漏补缺并强化逻辑推理与知识表示的实际应用能力。

1. 人工智能期末复习为什么先啃这份习题集

期末复习人工智能最头疼的不是公式多,而是概念杂、题目套路深:归结演绎要从自然语言案情一路推成子句集,搜索策略要在代价树里手动扩展节点,知识表示还要区分产生式、谓词、框架和语义网络各自的适用场景。这份"人工智能经典习题集及各章总结"把绪论、知识表示、推理、搜索策略四大部分的小结和习题解答收在一起,每题都给了完整推导过程和答案出处,是考前对照教材逐章查漏补缺的实用资料。适合计算机相关专业准备期末考试、考研复试基础问答,以及想靠典型例题快速建立解题框架的读者。

2. 知识表示:产生式、谓词、框架和语义网络怎么选

知识表示是人工智能的底层问题,也是期末卷面里最容易出"给场景、选表示法"的题目类型。习题集里用旅行商问题讲产生式,用篮球赛比分讲语义网络,用亲属关系讲谓词逻辑,每种表示法的切入角度完全不同。很多初学者把这些表示法当成孤立的考点去背,结果遇到综合题就不知道从哪个角度入手。实际上这些表示法解决的是不同层面的问题:产生式适合表达"条件—动作"的行为规则,谓词适合表达对象之间的关系和逻辑推理,框架适合表达具有固定结构的类对象,语义网络适合表达概念之间的语义联系。做题时先判断题目给了什么信息、要推出什么结论,再选表示法,远比死记定义靠谱。

2.1 产生式规则:把旅行商路线写成IF-THEN

原题是五个城市A、B、C、D、E相互可达且距离已知,某人从A出发,每个城市访问一次后回到A,要找最短旅行路线。这道题除了考最短路径,还要求用产生式规则表示旅行过程。习题集的解法定了一个综合数据库(x),x可以是单个字母也可以是字符串,初始状态为(A),目标状态为(Ax1x2x3x4A)。规则集写成这样:

r1: IF L(S)=5 THEN GOTO(A) r2: IF L(S)<5 THEN GOTO(B) r3: IF L(S)<5 THEN GOTO(C) r4: IF L(S)<5 THEN GOTO(D) r5: IF L(S)<5 THEN GOTO(E)

其中L(S)表示已经走过的城市数,GOTO(x)表示走向城市x。这里有个容易忽略的设计:r1的触发条件是L(S)=5,表示五个城市都已经访问过了,此时必须回到A形成闭环;r2到r5是L(S)<5时可以选择走向尚未访问的城市。这个写法把"访问完全部城市"作为终止条件写进了规则前件,比单纯列出所有转移边更符合产生式系统的表达习惯。

做题时还需注意:综合数据库里的x用来记录已访问的城市序列,规则执行顺序不同会产生不同路线。比如A->C->D->E->B->A的总距离是5+6+8+10+7=36,这个路线是这段习题的标准答案。但要理解这个答案不是产生式规则本身推出来的,产生式只负责描述可选动作,最短路线的比较还是靠枚举或后续的搜索策略完成。所以这道题实际上在考两件事:一是能不能用产生式建模旅行过程,二是能不能在模型上选出最优路线。

2.2 语义网络与谓词:两种关系建模的差异

习题集里有个用语义网络表示两校篮球赛比分的问题,结局是85:89。语义网络由节点和弧线组成,节点表示物体、概念和状态,弧线表示节点间的关系。比分这件事要拆成"比赛""参赛方""比分"三层:一个"篮球赛"节点,通过"参赛方"弧连到两所学校节点,通过"比分"弧连到"85:89"这个结果节点。如果题目要求更细,还要把"主队""客队"角色分开,甚至用"胜"关系直接把结果指向客队。画图时先定核心事件节点,再向四周引关系弧,关系名尽量用题目原文的动词或介词,避免自创关系导致丢分。

谓词表示法则适合表达更严格的逻辑关系。比如"任何兄弟都有同一个父亲"这种带量词的陈述,语义网络画起来会很别扭,但用谓词公式可以精确表达:(∀x)(∀y)(∀z)(Brother(x,y)∧Father(z,x)→Father(z,y))。做题时判断标准其实很明确:题目中有"如果……那么……""所有……都……""存在……"这类逻辑量词,优先考虑谓词;题目中只是一堆概念和关系名词,优先考虑语义网络。习题集里对框架表示法只给了"槽—侧面—值"的结构定义,本科阶段考框架题很少要求画完整图,更多是给一个对象让你填槽值,比如描述一辆汽车的框架要有"品牌""型号""颜色""价格"这些槽。掌握到这个程度,知识表示这一章的分数就稳了。

表示法核心结构最擅长解决的问题典型例题
产生式规则:IF条件THEN动作过程性知识、控制系统旅行商路径规则
谓词逻辑谓词+量词+联结词带量词的逻辑推理兄弟父亲问题
框架槽、侧面、值结构化对象描述汽车、学生档案
语义网络节点+弧线概念及关系建模篮球赛比分

3. 归结演绎推理:从自然语言到ANSWER子句的完整链条

归结演绎推理是全书逻辑最严密的一章,也是期末大题的高频考点。习题集的盗窃案问题把五个侦察员的证词转成子句集,再通过归结得到ANSWER,整个过程每一步都有严格的逻辑依据。初学者最容易在"把自然语言翻译成谓词"这一步出错,因为自然语言里的"至少""无关""都不是"这些词对应到逻辑联结词时容易搞混。一旦子句集写错,后面归结再熟练也得不出正确答案。这一章的核心不是归结本身,而是翻译和换名。

3.1 把案情描述变成子句集:定义谓词是第一步

定义谓词P(x)表示"x是作案者",五个侦察员的话可以翻译成:

  • A说"赵与钱中至少有一人作案":P(zhao)∨P(qian)
  • B说"钱与孙中至少有一人作案":P(qian)∨P(sun)
  • C说"孙与李中至少有一人作案":P(sun)∨P(li)
  • D说"赵与孙中至少有一人与此案无关":¬P(zhao)∨¬P(sun)
  • E说"钱与李中至少有一人与此案无关":¬P(qian)∨¬P(li)

注意D和E的翻译:这里的"与此案无关"是¬P(x),"至少有一人无关"就是两个否定子句的析取。而问题本身是要求"谁是盗窃犯",所以还要把目标写成谓词:设y是盗窃犯,谓词公式为P(y),将其否定并与ANSWER(y)做析取,得到¬P(y)∨ANSWER(y)。这个技巧非常关键,它把"谁"这个未知量用一个带变量的子句表示,最终通过归结替换读出答案。

这里有一个常见的坑:有人会把"无关"翻译成另一个谓词Q(x),导致子句里出现P和Q混合,归结时无法消解。解决的办法是先明确"无关"在逻辑上就是¬P(x),不要额外引入语义重复的谓词。写子句集时还要注意每个子句内部是析取关系,不同子句之间是合取关系,这一步错了后面全是无用功。

3.2 归结推导与替换σ:一步一步看变量代换

归结的操作是找两个子句中的互补文字对,消去它们并把剩余部分合并成新子句。这道题的推导链比较长,但每一步的配对都值得琢磨:

(7) P(qian)∨¬P(sun) (1)与(4)归结 (8) P(zhao)∨¬P(li) (1)与(5)归结 (9) P(qian)∨¬P(zhao) (2)与(4)归结 (10) P(sun)∨¬P(li) (2)与(5)归结 (11) ¬P(zhao)∨P(li) (3)与(4)归结 (12) P(sun)∨¬P(qian) (3)与(5)归结

以(1)P(zhao)∨P(qian)与(4)¬P(zhao)∨¬P(sun)归结为例:消去P(zhao)和¬P(zhao),剩下P(qian)∨¬P(sun)。这一步的本质是把A和D两人的证词合并推理:既然赵和钱至少一个作案,且赵和孙至少一个与案无关,那么如果孙作案,钱必然作案。每一组归结都对应一条逻辑意义,建议做题时顺手在边上写出推理含义,既方便检查错误,也方便老师给分。

继续归结到关键结论:

(13) P(qian) (2)与(7)归结 (14) P(sun) (2)与(12)归结 (15) ANSWER(qian) (6)与(13)归结,σ={qian/y} (16) ANSWER(sun) (6)与(14)归结,σ={sun/y}

得到ANSWER(qian)和ANSWER(sun),说明钱和孙都是盗窃犯。注意归结过程中(2)被多次使用,这是正常的,子句集里的子句可以被反复引用。替换σ读作"用qian替换变量y",表示目标子句中的未知量y取值为qian时,整个推导连通。手动做这类题时,我习惯在每步归结后面标注用到的子句编号和σ,既能防止自己漏写,也是考试时拿到步骤分的关键。

3.3 用同一套路解"兄弟父亲":把量词消去再看

另一个经典例题是:任何兄弟都有同一个父亲,J和P是兄弟,且J的父亲是D,问P的父亲是谁。比较完整的解法如下:先将F1化作子句,消去量词后得到¬Brother(x,y)∨¬Father(z,x)∨Father(z,y),目标写成¬Father(u,Peter)∨ANSWER(u)。归结过程为:

(5) ¬Brother(J,y)∨Father(D,y) (1)与(3)归结,σ={D/z, J/x} (6) ¬Brother(J,P)∨ANSWER(D) (4)与(5)归结,σ={D/u, P/y} (7) ANSWER(D) (2)与(6)归结

这个例子比盗窃案更直观地展示了换名的价值:在(5)中x被替换为J,z被替换为D,本质上是在说"J的父亲是D,所以J的兄弟的父亲也是D"。一旦理解了归结是通过变量替换把已知事实和目标连接起来,做题就不再是机械配对,而是有方向地选择子句。

4. 搜索策略:代价树、广度优先和深度优先的取舍

搜索策略这一章题目形式多样,但本质都是在一个状态空间中找路径。习题集里五城市交通路线、三开关状态、农夫过河、与或树求代价,这些题目覆盖了盲目搜索、启发式搜索和博弈搜索的主要内容。期末考得最重的通常是代价树的广度优先和深度优先,因为要手动展开节点并计算代价,最能暴露基础是否扎实。

4.1 状态空间搜索的通用套路:OPEN表和CLOSED表的用法

做状态空间搜索题,先把通用流程写清楚:从初始状态出发,扩展当前节点生成一组子节点,检查目标状态是否出现;如果没有,再按某种搜索策略选择下一个扩展节点,重复直到找到目标或无节点可扩展。OPEN表存放刚生成的、还没被扩展过的节点,CLOSED表存放已经扩展过的节点。不同搜索策略的区别,本质就是OPEN表里节点排序方式不同:广度优先把新节点放到表尾,先进先出;深度优先把新节点放到表首,后进先出;代价树广度优先按代价从小到大全局排序;代价树深度优先按代价把小到大放进表首,但只排当前父节点的子节点。

以三开关问题为例:三个琴键开关一字排开,初始状态为"关、开、关",每次必须按下一个开关且只能按一个。用(K1,K2,K3)表示状态,0为关、1为开,初始为(0,1,0),目标可能是(1,1,1)或(0,0,0)。状态转换规则是每次只有一个分量翻转,即从(0,1,0)出发,下一步只能是(1,1,0)、(0,0,0)或(0,1,1)。手动画状态图时按层展开,连续三步后能到达(0,0,0)但到不了(1,1,1),因为从初始状态出发,按奇数次开关得到的1的个数是奇数还是偶数有固定规律。值得留意的是,"每次必须按下一个开关"意味着每个状态有且仅有三个后继状态,搜索树的规模是可控的。

4.2 代价树的广度优先与深度优先:谁能保证最优

习题集里的核心例题是:A是出发地,E是目的地,交通费用标在边上,求最小费用路线。标准解法是先画出代价树,再用两种策略分别求解。代价树的广度优先搜索:扩展节点n后把子节点放入OPEN表,计算各子节点代价,按代价从小到大对OPEN表中全部节点排序,然后取队首扩展。这样每次扩展的都是当前已生成节点中代价最小的,第一次搜索到目标节点时,那个目标的代价就是全局最优。过程如下:

  • 扩展A得到B(代价1)、C(代价3)、D(代价4),排序后先扩展B
  • 扩展B得到E(代价1+6=7)、C(代价1+4=5),OPEN里现在是C(3)、D(4)、C2(5)、E1(7)
  • 继续扩展C(3),得到D(3+2=5)、E(3+4=7)
  • 按代价排序不断扩展,直到E以最小代价出队

全部扩展完得到最优路径A->C->D->E,这是代价树广度优先的搜索结果。它的代价保证来自全局排序——任何尚未扩展的节点,其代价都不可能小于队首,所以第一次遇到的解必然是全局最小。

代价树的深度优先搜索则不同:扩展节点n后将其子节点按代价从小到大放入OPEN表首部,也就是只在当前这一层做局部排序,选择当前分支里代价最小的往下走。习题集中的例子走了A->B->D->E,代价17,而最优是A->C->E,代价15。深度优先策略先扩展D1而不顾旁边的C1代价更小,因为C1是A的直接子节点,不在D1的当前排序范围里。书里特别提醒:该题代价树深度优先和广度优先结果相同只是巧合,一般情况下两者得到的结果不一定相同。由于深度优先可能进入无穷分支,它是不完备的。

4.3 两种策略的特性对比与选型建议

对比维度代价树广度优先代价树深度优先
OPEN表排序范围全表按代价排序仅当前子节点排序
首次命中目标是否最优是不一定
完备性完备不完备,可能进入无穷分支
空间开销较大,需保存大量节点较小,沿一条路径深入
适用场景需要全局最优解解路径不深且可接受次优解

实际考试中,如果题目问"求最短路径"而不加说明,默认应该用代价树的广度优先或A*算法;只有在题目明确要求用深度优先策略时,才需要走局部优先的过程并指出得到的解不一定是最优。我一般拿到搜索题先画代价树,标注从初始节点到每个节点的累计代价g(x),这样不管题目要求哪种策略,展开过程都能按图索骥。画代价树时要注意:同一个节点在代价树的不同分支中可能出现多次,需要用下标区分,比如C1、C2,否则后续说明路径时容易混淆。

5. 做题避坑:归结、代价树与状态图里的五个典型误区

期末复习阶段,不少同学对着答案觉得每一步都合理,但自己做题就是推不到正确答案。以下五个问题是我在往年题目和习题集中反复看到的,每一条都是"现象—原因—解决"的结构,建议对照自己的做题习惯检查。

第一,归结演绎推理时,只对目标谓词取否定,没有与ANSWER谓词做析取就直接加入子句集。现象是:归结到最后得到空子句,但写不出"答案是谁"。原因是:缺少ANSWER谓词时,归结只能证明目标为假或目标可达,无法输出变量y的具体取值。解决:目标公式写成¬P(y)∨ANSWER(y),这样归结到只剩ANSWER的原子子句时,就能通过σ替换直接读出答案。记住ANSWER不是一个真实谓词,而是用来"接住"答案的占位符。

第二,代价树深度优先搜索第一次遇到目标就立刻停止,且不检查是否存在代价更小的路径。现象是:用深度优先搜索得到的路径明显比旁边另一条路径费用高,但自己当作最优解提交了。原因是:深度优先只保证"当前分支的局部最小",不保证全局最小。解决:题目若只要求"用深度优先求一个解",得到第一个解就可以停;若问"求最小费用",必须改用代价树广度优先或说明深度优先解未必最优。做题时先把题目要求圈出来,避免用错策略。

第三,深度优先搜索可能沿着无穷分支一直走,手动展开时根本停不下来。现象是:某道题的状态空间里存在循环路径(比如A->B->A->B),深度优先策略下反复扩展同一状态。原因是:深度优先没有记录已访问状态,或题目没有设置深度限制。解决:在OPEN表里只保留当前路径上的节点,把一个状态已经访问过的后继节点删掉;也可以自行设置一个深度限制(比如不超过城市数N),超出就回溯。

第四,与或树中把"或节点"当"与节点"判断可解。现象是:看到一个节点的某个子节点已经是终止节点,就判定该节点可解,但事实上这个节点如果有"与"弧线连接,需要所有子节点都可解才能判定。原因是:没看弧线标记,只凭节点形状判断。解决:先看节点间的弧线,带弧线的是"与"关系,不带的是"或"关系。与节点要全部子节点可解,或节点只要一个可解。做题顺序建议:先标可解/不可解标记,再从叶节点向上逐层判定,不要跳层。

第五,状态空间图中没有排除非法状态,导致搜索路径里出现荒谬操作。现象是:农夫过河问题从初始状态(0,0,0,0)出发,扩展出了"狼和羊在左岸但农夫在右岸"的节点,后面还接着往下搜。原因是:只按操作符生成状态,没有把题目给出的限制条件转化为约束规则。解决:先把约束状态列全,比如(1,0,0,X)表示农夫在右岸时狼和羊在左岸会出事,这类状态直接禁止扩展;画状态图时每生成一个新状态,先检查是否命中约束条件,命中就丢弃。这条规则同样适用于其他需要状态约束的搜索题。

6. 进阶:用一个小型PROLOG程序验证归结与推理的掌握度

习题集最后一节给了一个亲属关系的小型PROLOG程序,这是全书中唯一可以直接编码运行的例子。把这个程序跑通并做改造,是验证自己是否真正理解谓词逻辑、变量替换和闭世界假设的快捷方式。

domains name=symbol. sex=symbol. age=integer. predicates person(name,sex,age) mother(name,name) father(name,name) brother(name,name) sister(name,name) grandfather(name,name) grandmother(name,name) goal brother(Name1,Name2), write(Name1," is ",Name2,"'s brother!\n"), sister(Name3,Name4), write(Name3," is ",Name4,"'s sister!\n"), grandfather(Name5,Name6), write(Name5," is ",Name6,"'s grandfather!\n"), grandmother(Name7,Name8), write(Name7," is ",Name8,"'s grandmother!\n"). clauses person(alan,m,21). person(john,m,22). person(marry,w,23). person(ann,w,24). mother(alice,alan). mother(alice,john). mother(alice,marry). mother(alice,ann). mother(marry,jane). father(alan,tom). father(tom,ben). brother(Name1,Name2):- person(Name1,m,Age1), person(Name2,m,Age2), mother(Z,Name1), mother(Z,Name2), Age1>Age2. sister(Name3,Name4):- person(Name3,w,Age3), person(Name4,w,Age4), mother(Z,Name3), mother(Z,Name4), Age3>Age4. grandfather(Name5,Name6):- father(Name5,Y), father(Y,Name6). grandmother(Name7,Name8):- mother(Name7,X), mother(X,Name8).

程序的brother和sister规则都定义成"共享同一母亲且年龄更大者为兄/姐",grandfather通过两级father传递,grandmother通过两级mother传递。参数说明:Name1和Name2是待匹配的两个人名,Z是共享的母亲,Age1和Age2用来判定长幼。这里有个容易被忽略的点:这个规则只能推理出"同母"的兄弟姊妹关系,如果两个兄弟只有同父关系,规则不会触发。

一个很实用的验证技巧:在clauses里临时增加一条事实person(danny,m,30)和mother(alice,danny),再运行目标brother(danny,Name),程序会返回danny是john、alan等人的哥哥。如果没有任何输出,说明你的规则写错了或者事实没配对。用同样的思路,可以反向验证归结演绎里"钱和孙是盗窃犯"的结论:把侦察员的子句写成PROLOG事实,把"谁是盗窃犯"写成目标,程序给出的答案应该和手推的ANSWER一致。从那以后我每次复习搜索和推理章节,都强制自己把习题里的推导链对着程序跑一遍,手推对了程序才能过,否则就回头看子句集翻译。希望你也能用这个方法把知识表示和推理的盲区一次扫干净。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询