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

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

原文地址:https://www.cnblogs.com/seaman-h-zhang/p/4643983.html