练习题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]).
此题限于篇幅我不再提供答案,读者如果感兴趣,可以自己尝试画出搜索树。