转载自:https://mp.weixin.qq.com/s/yvlQFf6rfGB4FFEblT4e6g
4 练习
练习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. [] = [_|[]].
练习4.2 语法上正确的下列哪些是E表?如果表示是正确的,表有多少个元素?
1. [1|[2,3,4]]
2. [1,2,3|[]]
3. [1|2,3,4]
4. [1|[2|[3|[4]]]]
5. [1,2,3,4|[]]
6. [[]|[]]
7. [[1,2]|4]
8. [[1,2],[3,4]|[5,6,7]]
练习4.3 编写谓词second(X, List)来检查X是否是List的第二个元素。
练习4.4 编写一个谓词swap12(List1, List2),它检查List1是否与List2相同,除了交换前两个元素。
练习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).
应该给出:
X = [one,nine,two].
您的程序也应该朝另一个方向工作。例如,如果您给它查询
?- listtran([eins,neun,zwei],X).
X = [one, nine, two].
它应该返回:
X = [eins,sieben,sechs,zwei].
(提示:要回答此问题,请先问自己“如何翻译数字单词的空表?”。这是基本情况。对于非空表,请先翻译表的头,然后使用递归来翻译尾巴。)
练习4.6 编写谓词twice(In,Out),其谓词的左参数是一个表,其谓词第二个参数的表是一个由两次写入左表中的每个元素组成的表。例如,查询
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].
(提示:要回答此问题,请先问自己“第一个参数为空表时会发生什么?”。这是基本情况。对于非空表,请考虑应该对头部使用什么,然后使用递归处理尾巴。)
练习4.7 绘制以下三个查询的搜索树:
?- member(a,[c,b,a,y]).
?- member(x,[a,b,c]).
?-member(X,[a,b,c]).
(搜索树在第2章中介绍了。)