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

  • 相关阅读:
    linux串口驱动分析
    redis 源代码分析(一) 内存管理
    EJB3.0开发环境的搭建
    Google App Engine 学习和实践
    用EnableMenuItem不能使菜单变灰的原因
    hdu 1171 Big Event in HDU(母函数)
    Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)
    遗传算法入门到掌握(一)
    Amazon SQS简单介绍 上篇
    Matlab画图-非常具体,非常全面
  • 原文地址:https://www.cnblogs.com/seaman-h-zhang/p/4654197.html
Copyright © 2020-2023  润新知