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

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

  • 相关阅读:
    "饼状图/环形图/玫瑰图"组件:<chart-pie> —— 快应用组件库H-UI
    "柱状图"组件:<chart-bar> —— 快应用组件库H-UI
    "折线图"组件:<chart-line> —— 快应用组件库H-UI
    "进度条"组件:<chart-progress> —— 快应用组件库H-UI
    "警告提示"组件:<alert> —— 快应用组件库H-UI
    "全局提示"组件:<message> —— 快应用组件库H-UI
    "滑动操作"组件:<swipe-action> —— 快应用组件库H-UI
    Git使用总结之修改了用户名之后git无法使用
    Facebook授权登录
    Android键盘显示和隐藏
  • 原文地址:https://www.cnblogs.com/seaman-h-zhang/p/4643983.html
Copyright © 2020-2023  润新知