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 burger‘,‘Jules‘,‘_Jules‘是原子;

Footmassage,Variable2000是变量;

big kahuna burger两者都不是

练习题 1.2 下面的字符序列中哪些是原子,哪些是变量,哪些是复杂语句,哪些什么都不是?给出每个复杂语句的函子和元数。

1. loves(Vincent, mia)

2. ‘loves(Vincent, mia)‘

3. Butch(boxer)

4. boxer(Butch)

5. and(big(burger), kahuna(burger))

6. and(big(X), kahuna(X))

7. _and(big(X), kahuna(X))

8. (Butch kills Vincent)

9. kills(Butch Vincent)

10. kills(Butch, Vincent

我的答案:

‘loves(Vincent, mia)‘是原子;

没有变量;

复杂语句有:

loves(Vincent, mia),函子是loves,元数是2;

boxer(Butch),函子是boxer,元数是1;

and(big(burger), kahuna(burger)),函子是and,元数是2;

and(big(X), kahuna(X)),函子是and,元数是2;

什么都不是的包括:Butch(boxer),_and(big(X), kahuna(X)),(Butch kills Vincent),kills(Butch Vincent),kills(Butch, Vincent。

练习题 1.3 在下面的知识库中,事实,规则,子句和谓词分别有多少个?哪些是规则的头部,哪些是对应的目标?

woman(vincent).

woman(mia).

man(jules).

person(X) :- man(X); woman(X).

loves(X, Y) :- father(X, Y).

father(Y, Z) :- man(Y), son(Z, Y).

father(Y, Z) :- man(Y), daughter(Z, Y).

我的答案:

事实一共有3个,它们是:

woman(vincent).

woman(mia).

man(jules).

规则一共有4个,它们是:

person(X) :- man(X); woman(X).

loves(X, Y) :- father(X, Y).

father(Y, Z) :- man(Y), son(Z, Y).

father(Y, Z) :- man(Y), daughter(Z, Y).

子句一共有7个,它们是:

man(X),woman(X),father(X, Y),man(Y),son(Z, Y),man(Y),daughter(Z, Y)

谓词一共有7个,他们是:

woman,man,person,loves,father,son,daughter;

规则的头部和其包含的目标如下:

头部 包含的目标
person(X) man(X); Woman(X)
loves(X, Y) father(X, Y)
father(Y, Z) man(Y), son(Z, Y)
father(Y, Z) man(Y), daughter(Z, Y)

练习题 1.4 在Prolog中表达以下的逻辑

1. Butch is a killer

2. Mia and Marsellus are married

3. Zed is dead.

4. Marsellus kills everyone who gives Mia a footmassage.

5. Mia loves everyone who is a good dancer.

6. Jules eats anything that is nutritious or tasty.

我的答案:

1. killer(butch).

2. married(mia, marsellus).

3. dead(zed).

4. kills(marsellus, X) :- footmassage(X, mia).

5. loves(mia, X) :- good_dancer(X).

6. eats(jules, X) :- nutritious(X); tasty(X).

两点个人总结:

1. 如果要将现实中的逻辑或者信息使用Prolog的形式表达,那么函子可能会是动词、名字和形容词,而参数应该是名词或者复杂语句。

2. 函子和谓词内在的含义是一致的,这个和传统意义上的函数或者方法是有本质区别的:函数和方式有执行过程,有输入和输出;函子和谓词只是知识库中信息的存储方式,通过查询起作用。

练习题 1.5 假设我们有如下的知识库:

wizard(ron).

hasWand(harry).

quidditchPlayer(harry).

wizard(X) :- hasBroom(X), hasWand(X).

hasBroom(X) :- quidditchPlayer(X).

Prolog会针对下面的查询做出怎么样的回答?

1. wizard(ron).

2. witch(ron).

3. wizard(hermione).

4. witch(hermione).

5. wizard(harry).

6. wizard(Y).

7. witch(Y).

我的答案:

1. Prolog会回答true,因为这是知识库中直接定义的事实。

2. Prolog会报错,因为知识库中没有定义关于witch的任何事实和规则。

3. Prolog会回答false,因为没有直接定义该事实,也不能通过间接推导得出。

4. Prolog会报错,原因同2。

5. Prolog会回答true,因为该事实可以通过间接推导得出。

6. Prolog会回答:Y = ron; Y = harry。

7. Prolog会报错,原则同2。

时间: 2024-10-05 04:14:04

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

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

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

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

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

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 翻译 - 第二章 - 合一和证明搜索 - 第三节, 练习题和答案

练习题 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).

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 翻译 - 第三章 - 递归 - 第一节,递归的定义

在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

Learn Prolog Now 翻译 - 第三章 - 递归 - 第二节,规则顺序,目标顺序,终止

内容提要 规则顺序 目标顺序 终止 Prolog是第一门比较成功的逻辑编程语言.逻辑编程语言内在实现是简单和富有魅力的:程序员的工作简单地说就是描述问题:程序员应该写下(使用语言的逻辑)声明性的规格说明 (即,一个知识库),去描述有趣的状态.事实和关系:程序员不应该告诉计算机如何去实现,而他根据问一些问题去获取信息,逻辑编程语言会给出答案. 然而,以上是理想情况,Prolog本身也确实通过一些重要的特征,往这个方向在努力.但是Prolog不是,重复一次,不是一门完整的逻辑编程语言.如果你只是从声

Learn Prolog Now 翻译 - 第四章 - 列表 - 第二节,列表成员

内容提要 本章主要介绍使用递归操纵列表的一个实际例子:判断一个元素是否在包含在一个列表中. 是时候介绍第一个Prolog中通过递归操纵列表的程序例子了.我们最感兴趣的事情之一是,某个对象是否是列表中的元素.所以,我们想写一个程序,当假设输入是一个对象X和一个列表L, 得出结果是X是否属于L.这个程序的名字通常是:member,是Prolog程序中使用递归操纵列表最简单的例子,如下: member(X, [X|T]). member(X, [H|T]) :- member(X, T). 这就是全部

Learn Prolog Now 翻译 - 第四章 - 列表 - 第一节,列表定义和使用

内容提要 列表定义: 合一在列表中的使用: 匿名变量: 列表定义 正如名字暗示的,列表就是多个元素组成的集合.更精确地说,是元素的有限序列.在Prolog中的列表,有如下的一些具体例子: [mia, vincent, jules, yolanda] [mia, robber(honey_bunny), X, 2, mia] [ ] [mia, [vincent, jules], [butch, girlfriend(butch)]] [[ ], dead(z), [2, [b, c]], [ ]