Learn Prolog Now 翻译 - 第二章 - 合一和证明搜索 - 第三节, 练习题和答案

练习题 2.1 下面各组语句中,哪些组是能够合一的?如果能够合一,请给出变量初始化的信息。

1. bread = bread.

2. ‘Bread‘ = bread.

3. ‘bread‘ = bread.

4. Bread = bread.

5. bread = sausage.

6. food(bread) = bread.

7. food(bread) = X.

8. food(X) = food(bread).

9. food(bread, X) = food(Y, sausage).

10. food(bread, X, beer) = food(Y, sausage, X).

11. food(bread, X, beer) = food(Y, kahuna_burger).

12. food(X) = X.

13. meal(food(bread), drink(beer)) = meal(X, Y).

14. meal(food(bread), X) = meal(X, drink(beer)).

我的答案及其解释:

1. bread = bread. 可以合一,相同的原子;

2. ‘Bread‘ = bread. 不能合一,因为是不同的原子;

3. ‘bread‘ = bread. 可以合一,相同的原子;

4. Bread = bread. 可以合一,变量Bread初始化为bread;

5. bread = sausage. 不能合一,因为是不同的原子;

6. food(bread) = bread. 不能合一,一个是复杂语句,一个是原子;

7. food(bread) = X. 可以合一,变量X初始化为food(bread);

8. food(X) = food(bread). 可以合一,变量X初始化为bread;

9. food(bread, X) = food(Y, sausage). 可以合一,变量X初始化为sausage,变量Y初始化为bread;

10. food(bread, X, beer) = food(Y, sausage, X). 不能合一,无法初始化X;

11. food(bread, X, beer) = food(Y, kahuna_burger). 不能合一,两个复杂语句的元数不同;

12. food(X) = X. 可以合一,根据我机器的实现,变量X初始化为food(X);

13. meal(food(bread), drink(beer)) = meal(X, Y). 可以合一,变量X初始化为food(bread),变量Y初始化为drink(beer);

14. meal(food(bread), X) = meal(X, drink(beer)). 不能合一,无法初始化X。

练习题 2.2 给出一个知识库,及其基于这个知识库的查询,请选择那些查询是能够满足的,如果能够满足,请给出相关的变量初始化信息。

知识库如下:

house_elf(dobby).

witch(hermione).
witch(‘McGonagall‘).
witch(rita_skeeter).

magic(X) :- house_elf(X).
magic(X) :- wizard(X).
magic(X) :- witch(X).

查询如下:

?- magic(house_elf).

?- wizard(harry).

?- magic(wizard).

?- magic(‘McGonagall‘).

?- magic(Hermione).

并且绘制出magic(Hermione)的搜索树。

我的答案和解释:

1. ?- magic(house_elf). 我的Prolog实现对这个问题会报错,因为wizard这个谓词没有具体实现;但是这个查询整体来说是无效的,因为它既不是事实,有不能被推导出;

2. ?- wizard(harry). 我的Prolog实现会报错,因为wizard谓词没有在知识库中定义;

3. ?- magic(wizard). 我的Prolog实现会报错,因为wizard谓词没有定义;

4. ?- magic(‘McGonagall‘). Prolog回答true,因为magic(‘McGonagall‘) -> witch(‘McGonagall‘),而witch(‘McGonagall‘)是知识库中定义的事实;

5. ?- magic(Hermione). 注意这点的Hermione是首字母大写的,即这是一个变量,所以这里的答案是:

  Hermione = dobby;

  Hermione = hermione;

  Hermione = ‘McGonagall‘.

magic(hermione)的搜索树如下:

练习题 2.3 有如下的微型词库(即,一些个体单词的信息),和由一个句法规则(定义了一个句子由如下的顺序构成:一个量词,一个名词,一个动词,一个量词,

一个名词)组成的微型语法。如果要在这个知识库中找到合理的句子,应该如何进行查询?列出所有符合语法规则的句子。

知识库如下:

word(determiner, a).
word(determiner, every).
word(noun, criminal).
word(noun, ‘big kahuna burger‘).
word(verb, eats).
word(verb, likes).

sentence(Word1, Word2, Word3, Word4, Word5) :-
    word(determiner, Word1),
    word(noun, Word2),
    word(verb, Word3),
    word(determiner, Word4),
    word(noun, Word5).

我的答案和解释:

可以简单地进行如下的查询,然后使用分号“;“查询出每个可能的组合值:

?- sentence(A, B, C, D, E).

将A,B,C,D,E每次的值组合一下(便于阅读),既可以得出所有的答案如下:(限于篇幅,就不一一列举完)

a criminal eats a criminal

a criminal eats a ‘big kahuna burger‘

a criminal eats every crinimal

a criminal eats every ‘big kahuna burger‘

a crinimal likes a crinimal

a crinimal likes a ‘big kahuna burger‘

a crinimal likes every crinimal

a crinimal likes every ‘big kahuna burger‘

...

练习题 2.4 完成下面的填字游戏

有下面6个拉丁单词:

astente, astoria, baratto, cobalto, pistola, statale.

它们被分配到下面的谜题宫格中:

如下的知识库是关于这些单词的简单词库:

word(astante, a,s,t,a,n,t,e).
word(astoria, a,s,t,o,r,i,a).
word(baratto, b,a,r,a,t,t,o).
word(cobalto, c,o,b,a,l,t,o).
word(pistola, p,i,s,t,o,l,a).
word(statale, s,t,a,t,a,l,e).

请构建一个名字为crossword/6的谓词,完成谜题宫格的填写。其中的前三个参数代表从左到右的列上的单词,后三个参数代表从上到下的行上的单词。

我的答案和解释:

crossword/6谓词的定义是这样思考的,首先6个单词,是必须符合知识库中word定义的;其次根据行列交叉的位置,应该是同一字母的原则来进行;最后加入一条后面会涉及的知识,每个单词

不能相等:

crossword(V1, V2, V3, H1, H2, H3) :-
    word(V1,  _,V1H1,_,V1H2,_,V1H3,_),
    word(V2, _,V2H1,_,V2H2,_,V2H3,_),
    word(V3, _,V3H1,_,V3H2,_,V3H3,_),
    word(H1, _,V1H1,_,V2H1,_,V3H1,_),
    word(H2, _,V1H2,_,V2H2,_,V3H2,_),
    word(H3, _,V1H3,_,V2H3,_,V3H3,_),
    V1 \= H1,
    V2 \= H2,
    V3 \= H3.

运行查询的结果如下:

?- crossword(V1, V2, V3, H1, H2, H3).

V1 = astanto, V2 = cobalto, V3 = pistola, H1 = astoria, H2 = baratto, H3 = statale.

填入结果后的谜题宫格如下图所示:

这道题可以对Prolog编程解决问题有一点直观的感觉:我只是描述和构建事实,包括规则也是基于我观察到的现实,并没有告诉计算机如果具体找出这些单词;

—— 救赎之道就在其中。

时间: 2024-10-01 16:15:55

Learn Prolog Now 翻译 - 第二章 - 合一和证明搜索 - 第三节, 练习题和答案的相关文章

Learn Prolog Now 翻译 - 第二章 - 合一和证明搜索 - 第二节, 证明搜索

证明搜索 上一节我们已经学习了合一,本节我们继续学习Prolog是如何通过搜索知识库去决定输入的查询是否能够满足.我们将会学习证明搜索,并通过简单的一个例子去涵盖这个基础的概念. 假设我们有如下的知识库: f(a). f(b). g(a). g(b). h(b). k(X) :- f(X), g(X), h(X). 如果我们查询: ?- k(Y). 这个查询的结果十分明显,即k(b),但是Prolog是如何将其求解出的了?让我们继续看. Prolog读入整个知识库,然后尝试将查询k(Y)和知识库

Learn Prolog Now 翻译 - 第二章 - 合一和证明查询树 - 第一节, 合一

内容提要: 合一的定义: 一些合一的例子: 触发校验: 使用合一编程: 合一的定义 在上一章的知识库KB4中,我们简单地提及了合一的思想.比如,Prolog将woman(X)和woman(mia)合一,所以把变量X初始化为mia.现在是时候更加细致地研究合一,因为合一是 Prolog中最为基础的思想. 回顾一下Prolog中的三种语句类型: 1. 常量,可能是原子(比如vincent)或者是数字(比如24). 2. 变量,比如X,Z3,List等. 3. 复杂语句,形式为:functor(ter

Learn Prolog Now 翻译 - 第一章 - 事实,规则和查询 - 第二节, Prolog语法介绍

内容摘要: 原子(Atom) 数字(Numbers) 变量(Variables) 复杂语句(Complex Terms) 通过上一节的学习,我们已经大概熟悉了Prolog的编程思路,这一节我们会回过头,详细学习其中的一些语法细节.首先,问一个基础的问题:我们已经在Prolog程序中看到了很多类型的表达式 (比如,jody,playsAirGuitar(mia),和X),但这些仅仅只是例子,是时候更加深入了,到底事实.规则和查询是由什么构成的? 答案就是语句(terms),在Prolog中一共存在

Learn Prolog Now 翻译 - 第一章 - 事实,规则和查询 - 第一节, 一些简单的例子

 该系列文章是网上的Prolog学习资料:www.learnprolognow.org的中文翻译.希望能够通过翻译此学习资料,达到两个目的:第一.系统学习prolog的知识:第二.提升英文文章理解 和翻译能力. 内容摘要: 给出一些Prolog编程的简单例子: Prolog的基本结构:事实,规则和查询: 环境说明: 本系列文章使用的Prolog运行环境是:SWI-Prolog,官网地址是:http://www.swi-prolog.org. Prolog中只有三种基础结构:事实(facts),规

Learn Prolog Now 翻译 - 第一章 - 事实,规则和查询 - 第三节, 练习题和答案

练习题 1.1 下面的字符序列哪些是原子,哪些是变量,哪些两者都不是? 1. vINCENT 2. Footmassage 3. variable23 4. Variable2000 5. big_kahuna_burger 6. 'big kahuna burger' 7. big kahuna burger 8. 'Jules' 9. _Jules 10. '_Jules' 我的答案: vINCENT,variable23,big_kahuna_burger,'big kahuna burg

Learn Prolog Now 翻译 - 第三章 - 递归 - 第一节,递归的定义

在Prolog中,谓词可以递归地定义.简要地讲,一个谓词是递归定义的,如果一个或者多个规则的定义中包含了规则自身. 例子1:消化 考虑如下的知识库: is_digesting(X, Y) :- just_ate(X, Y). is_digesting(X, Y) :- just_ate(X, Z), is_digesting(Z, Y). just_ate(mosquito, blood(john)). just_ate(frog, mosquito). just_ate(stork, frog

ORACLE AUTOMATIC STORAGE MANAGEMENT翻译-第二章ASM Instance(2)

ASM单点故障 经常由用户询问如何避免ASM单点故障的最佳实践.与其他文件系统或卷管理器一样 ASM实例失效会导致运行在上面的RDBMS实例不可用.然而OS 文件系统或卷管理器失效 一般会伴随操作系统崩溃,而asm重启不需要重启服务器. 解决ASM单点故障的最好的办法是把ASM运行在RAC环境通过集群实现高可用.ASM可以 继续运行在其他节点如果一个节点重启或rdbms重启.ASM失效是软崩溃恢复速度要比传统 的文件系统或卷管理器要快. ASM安装 如果服务器或者一个节点上一个ASM实例只管理一

ORACLE AUTOMATIC STORAGE MANAGEMENT翻译-第二章ASM Instance(3)

ASM支持滚动升级,为ASM打patchsets或迁移到新版本可以使用滚动升级的方法,提供一个更高级别 的更底层的高可用.注意,要想使用ASM的滚动迁移特,ASM软件版本至少11.1.此外,滚动升级需要 ORACLE clusterware是最新版本. 图(略) 开始滚动迁移前,你必须使用命令把集群中的ASM实例设置为为rolling migration模式,如(执行版本升级): ALTER SYSTEM START ROLLING MIGRATION TO 11.2.0.2; 记住前面滚动升级

ORACLE AUTOMATIC STORAGE MANAGEMENT翻译-第二章(1)

第二章  ASM INSTANCE ASM实例类型: 10g以后ORACLE instance 类型增加了一种ASM类型,参数INSTANCE_TYPE=ASM进行设置. ASM实例启动命令: startup nomount启动实例和后台进程,但没有挂载磁盘组 mount以后,实例会启动参数文件中ASM_DISKGROUPS指定的磁盘组,如果参数为空就会触发ORA-15110报错信息. ASM 11G以后为mount命令引入了restricted启动参数,以排他方式启动ASM_DISKGROUP