Learn Prolog Now 翻译 - 第四章 - 列表 - 第四节,练习题和答案

练习题4.1

Prolog将会如何回答下面的查询?

1. [a, b, c, d] = [a, [b, c, d]].

2. [a, b, c, d] = [a | [b, c, d]].

3. [a, b, c, d] = [a, b, [c, d]].

4. [a, b, c, d] = [a, b | [c, d]].

5. [a, b, c, d] = [a, b, c, [d]].

6. [a, b, c, d] = [a, b, c | [d]].

7. [a, b, c, d] = [a, b, c, d, []].

8. [a, b, c, d] = [a, b, c, d | []].

9. [] = _.

10. [] = [_].

11. [] = [_ | []].

我的答案和解释:

1. false.

2. true;因为a是头部,|是列表解析符号,[b, c, d]是尾部,结合在一起,就是[a, b, c, d]。

3. false。

4. true;理由同2。

5. false。

6. true;理由同2。

7. false;

8. true;理由同2。

9.  true,因为_代表匿名变量,这个查询相当于将一个空列表和匿名变量进行合一,是能够成功的。

10. false。

11. false。

练习题4.2

下面哪些是正确的列表?如果是列表,其中有多少个元素?

1. [1 | [2, 3, 4]]

2. [1, 2, 3, | []]

3. [1 | 2, 3, 4]

4. [1 | [2 | [3 | [4]]]]

5. [[] | []]

6. [[1, 2] | 4]

7. [[1,2], [3, 4] | [5, 6, 7]]

我的答案和解释:

1. 是列表,长度是4; [1, 2, 3, 4].

2. 是列表,长度是3; [1, 2, 3].

3. 不是列表。

4. 是列表,长度是4; [1, 2, 3, 4].

5. 是列表,长度是4; [1, 2, 3, 4].

6. 是列表,长度是1; [[]].

7. 不是列表。

8. 是列表,长度是5; [[1, 2], [3, 4], 5, 6, 7].

练习题4.3

写出一个谓词second(X, List),可以检查X是否是List的第二个元素。

我的答案:

second(X, [_, X | _]).

一些测试查询:

?- second(2, [1, 2, 3, 4]).

true

?- second(X, [1, 2, 3, 4]).

X = 2

?- second(1, [1, 2, 3, 4]).

false

?- second(1, []).

false

练习题4.4

写出一个谓词swap12(List1, List2),检查两个列表除了头两个元素是互相交换的,其他元素都是相等的。

我的答案:

swap12([H1, H2 | T], [H2, H1 | T]).

一些测试:

?- swap12([1, 2, 3, 4], [2, 1, 3, 4]).

true

?- swap12([1, 2], [2, 1]).

true

?- swap12([1,2,3,4], [1,2,3,4]).

false

练习题4.5

假设存在由如下事实构成的知识库:

tran(eins, one).
tran(zwei, two).
tran(drei, three).
tran(vier, four).
tran(fuenf, five).
tran(sechs, six).
tran(sieben, seven).
tran(acht, eight).
tran(neun, nine).

写一个谓词listtran(G, E),可以将德文的数字列表,翻译为英文的数字列表。比如:

?- listtran([eins, neun, zwei], X).

Prolog会回答:

X = [one, nine, two].

谓词可以从另外一个方向也起作用,比如查询:

?- listtran(X, [one, seven, six, two]).

Prolog会回答:

X = [eins, sieben, sechs, zwei]

我的答案和一些测试:

listtran([], []).

listtran([H1 | T1], [H2 | T2]) :- tran(H1, H2), listtran(T1, T2).

测试:

?- listtran([eins, neun, zwei], X).

X = [one, nine, two].

?- listtran(X, [one, seven, six, two]).

X = [eins, sieben, sechs, zwei]

练习题4.6

请写出一个谓词,twice(In, Out),其中第一个参数是List,第二个参数也是List,其中的元素是第一个List元素的两个,比如:

?- twice([a, 4, buggle], X).

X = [a, a, 4, 4, buggle, buggle].

?- twice([1, 2, 1, 1], X).

X = [1, 1, 2, 2, 1, 1, 1, 1].

我的答案:

twice([], []).

twice([H|T1], [H, H|T2]) :- twice(T1, T2).

练习题4.7

画出下面三个查询的搜索树:

?- member(a, [c, b, a, y]).

?- member(x, [a, b, c]).

?- member(X, [a, b, c]).

此题限于篇幅我不再提供答案,读者如果感兴趣,可以自己尝试画出搜索树。

时间: 2024-08-28 12:15:42

Learn Prolog Now 翻译 - 第四章 - 列表 - 第四节,练习题和答案的相关文章

Learn Prolog Now 翻译 - 第六章 - 列表补遗 - 第一节,列表合并

内容提要: 列表合并的定义 列表合并的使用 列表合并的定义 我们将会定义一个很重要的谓词:append/3,其中所有的参数都是列表.从声明性角度去看,append(L1, L2, L3)的含义是列表L3是列表L1和列表L2的合并结果(合并意味着连接).比如, 如果我们查询: ?- append([a, b, c], [1, 2, 3], [a, b, c, 1, 2, 3]). 或者查询: ?- append([a, [foo, gibble], c], [1, 2, [[], b]], [a,

Learn Prolog Now 翻译 - 第三章 - 递归 - 第三节,练习题和答案

练习题3.1 在之前的章节中,我们已经讨论了如下的谓词逻辑: descend(X, Y) :- child(X, Y). descend(X, Y) :- child(X, Z), descend(Z, Y). 假设我们将谓词逻辑重构如下: descend(X, Y) :- child(X, Y). descend(X, Y) :- descend(X, Z), descend(Z, Y). 这会导致问题吗? 我的答案: 1. 这个谓词逻辑是有问题的,因为规则2中存在左递归的情况,即规则2的主干

Learn Prolog Now 翻译 - 第三章 - 递归 - 第四节,更多的实践和练习

在学习了前三章内容后,我们应该对Prolog编程有了直观和理性的认识.由于合一.变量初始化.证明搜索和递归都是Prolog的核心概念,所以有如下更多的一些实践和练习. 这里我会先录入题目,后期再给出我自己的程序代码和一些思考. 实践1 试想有如下的描述迷宫的知识库.其中的事实描述了点和点之间的联通关系,即connected/2谓词逻辑给出了这样的事实:迷宫中能从参数1的点,直接到达参数2的点.而且, 联通关系是有方向的.单向不能往返的: connected(1,2). connected(3,4

Learn Prolog Now 翻译 - 第五章 - 数字运算 - 第二节,数字运算与列表

内容提要 列表中的一些数字运算,累加器 尾递归调用 列表中的一些数字运算,累加器 关于数字运算最为重要的应用,可能是获取一些数据结构体的一些有用事实,比如列表.例如,知道列表的长度是很有用的.我们将会给出一些使用列表和数字运算的例子. 一个列表的长度是多少?这里有一个递归定义: 1. 空列表的长度为0. 2. 非空列表的长度为 1 + len(T),其中len(T)是非空列表的尾部. 这个定义在Prolog中很容易实现,以下是实现代码: len([], 0). len([_|T], N) :-

Learn Prolog Now 翻译 - 第五章 - 数字运算 - 第一节,Prolog中的数字运算

内容提要 Prolog中的数字运算 Porlog运算的本质 Prolog中的数字运算 Prolog语言本身提供了一些基础的运算符号,对整数进行一些操作(即类似...-3, -2, -1, 0, 1, 2, 3等).多数Prolog的实现同时也提供了一些工具对实数进行操作 (比如浮点数,1.53,6.35,等等).但是我们不会讨论浮点数,因为浮点数在典型的Prolog应用中很少,所以不是本文的重点.但是另一方面,整数是在Prolog 中有典型应用场景的(比如记录列表的长度),所以掌握起应用是十分重

Learn Prolog Now 翻译 - 第五章 - 数字运算 - 第四节,练习题和答案

练习题5.1  Prolog会如何回答下面的问题? 1. X = 3*4. 2. X is 3*4. 3. 4 is X. 4. X = Y. 5. 3 is 1+2. 6. 3 is +(1,2). 7. 3 is X+2. 8. X is 1+2. 9. 1+2 is 1+2. 10. is(X, +(1,2)). 11. 3+2 = +(3,2). 12. *(7,5) = 7*5. 13. *(7, +(3,2)) = 7*(3+2). 14. *(7, (3+2)) = 7*(3+2)

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中如何进行整数的比较 整数比较的实际应用 Prolog中如何进行整数的比较 一些Prolog的运算谓词可以实际地进行运算(即,不需要通过“is”协助),这些运算谓词都是进行整数比较的操作符. 运算实例 Prolog表达式 x < y   X < Y. x ≤ y  X =< Y. x = y  X =:= Y. x /= y X =\= Y. x ≥ y   X >= Y. x > y X > Y. 这些操作符有明确的含义,可以直接在Prolog中