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).

15. 7*3+2 = *(7, +(3,2)).

16. *(7, (3+2)) = 7*(+(3,2)).

我的答案和解释:

1. Prolog会回答:X = 3*4,因为这是一个合一。

2. Prolog回答: X = 12,因为is会促使计算。

3. Prolog会报错,因为变量X出现在is右端,没有初始化。

4. Prolog会回答:X = Y. 因为这是一个合一,变量X和Y会共享一个值。

5. Prolog会回答:true。

6. Prolog会回答:true。

7. Prolog会报错,因为变量X出现在is右端,没有初始化。

8. Prolog会回答:X = 3。

9. Prolog会回答:true。

10. Prolog会回答:X = 3。

11. Prolog会回答:true。

12. Prolog会回答:true。

13. Prolog会回答:true。因为两个复杂语句能够合一。

14. Prolog会回答:true。因为两个复杂语句能够合一。

15. Prolog会回答:false,因为两个复杂语句不能合一,第一个复杂语句为:7*3+2,第二个复杂语句为:7*(3+2)。

 16, Prolog会回答:true,因为两个复杂语句能够合一。

练习题5.2

1. 定义一个谓词increment/2,其中第二个参数比第一个参数大1,比如,increment(4, 5)是正确的,increment(4,6)是错误的。

2. 定义一个谓词sum/3,其中第三个参数是第一个参数和第二个参数之和,比如sum(4, 5, 9)是正确的,sum(4, 6, 12)是错误的。

我的答案:

1. increment(First, Second) :- Second is First + 1.

2. sum(Add1, Add2, Sum) :- Sum is Add1 + Add2.

练习题5.3

定义一个谓词addone/2,其中第一个参数是整数列表,第二个参数是第一个整数列表每个对应位置元素加1后的整数列表,比如,查询:

?- addone([1, 2, 7, 2], X).

X = [2, 3, 8, 3]

我的答案:

addone([], []).

addone([H1|T1], [H2|T2]) :- H2 is H1 + 1, addone(T1, T2).

练习题5.4

在之前的章节里,我们已经讨论了accMax/3谓词,可以返回一个整数列表的最大值。请稍微修改这个谓词,转换为另外一个谓词,accMin/3,可以返回一个整数列表的最小值。

我的答案:

accMin([H|T], A, Min) :- H < A, accMin(T, H, Min).

accMin([H|T], A, Min) :- H >= A, accMin(T, A, Min).

accMin([], A, A).

min([H|T], Min) :- accMin([H|T], H, Min).

练习题5.5

在数学中,一个n阶向量是n个数字组成的列表。比如,[2, 5, 12]是一个3阶向量,[45, 27, 3, -4, 6]是一个5阶向量。关于向量一个基础的操作时标量乘法,在这个操作中,向量中的

每个元素都和一个数字相乘。比如,如果将一个3阶的向量[2, 7 ,4]和数字3进行标量乘法,得到了结果是一个3阶向量:[6, 21, 12]。

请写出一个谓词scalarMult/3,其中第一个参数是一个整数,第二个参数是一个整数列表,第三个参数是标量乘法的结果,比如:

?- scalarMult(3, [2, 7, 4], Result).

Result = [6, 21, 12]

我的答案:

scalarMult(Num, [], []).

scalarMult(Num, [H|T1], [H1|T2]) :- H1 is H*Num, scalarMult(Num, T1, T2).

练习题5.6

接上题,在向量中另外一个基础操作时点乘(dot product)。这个操作将会合并两个相同阶的向量为一个数字。具体操作方式是:两个向量相同位置的元素相乘,然后将结果相加。比如,

[2, 5, 6]和[3, 4, 1]的点乘是:6 + 20 + 6,即32。请写一个dot/3,第一个参数是一个整数列表,第二个参数是和第一个参数长度相同的整数列表,第三个参数是点乘的结果。比如:

?- dot([2, 5, 6], [3, 4, 1], Result).

Result = 32

我的答案:

dotAcc([], [], Acc, Acc).

dotAcc([H1|T1], [H2|T2], Acc, Result) :-

  NewAcc is Acc + (H1*H2),

  dotAcc(T1, T2, NewAcc, Result).

dot(L1, L2, Result) :- dotAcc(L1, L2, 0, Result).

时间: 2024-10-18 09:45:56

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

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 翻译 - 第五章 - 数字运算 - 第二节,数字运算与列表

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

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中

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 翻译 - 第三章 - 递归 - 第三节,练习题和答案

练习题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 翻译 - 第三章 - 递归 - 第二节,规则顺序,目标顺序,终止

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

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,

《Python核心编程》 第五章 数字 - 课后习题

课后习题  5-1 整形. 讲讲 Python 普通整型和长整型的区别. 答:普通整型是绝大多数现代系统都能识别的. Python的长整型类型能表达的数值仅仅与你机器支持的(虚拟)内存大小有关. 5-2 运算符 (a) 写一个函数,计算并返回两个数的乘积 (b) 写一段代码调用这个函数,并显示它的结果 答: def pro(a,b): p = a*b return p a = int(raw_input("a=")) b = int(raw_input("b="))