了解Prolog中的参数

时间:2014-03-01 11:47:04

标签: prolog

这可能是一个愚蠢的问题,但在Uni,我们看到了一个Prolog段,它可以使数组倍增。它有4个谓词,其中一个我无法理解它的作用或如何执行它。你能给我任何暗示或解释吗?

multiply([],_,[]).
multiply([V0|Rest], V1, [Result|Others]):-
    multiply(Rest,V1,Others),
    inner_product(V0,V1,Result).

我试图像这样运行谓词:

multiply([1,2],3,X).

multiply([[1,2]],[3],X).

multiply([[1,2]],3,X)

multiply([1,2],[3,2],X).

但是一切都是假的。

我有什么问题吗?

1 个答案:

答案 0 :(得分:1)

没有提供关于期望什么样的论点的信息,但您可以通过查看multiply的子句来确定它:

multiply([],_,[]).

这表明第一个和第三个参数是某种列表。

multiply([V0|Rest], V1, [Result|Others]):-
    multiply(Rest,V1,Others),
    inner_product(V0,V1,Result).

inner_product虽然未定义为@CapelliC指出,但表明V0V1向量(或在prolog中,列表根据内积的定义,相同长度的标量数量)。 Result值将是标量。

因此,multiply(M1, V, Result).成功:

  1. M1必须是列表或矩阵列表。每个内部列表必须长度相同,且必须是标量值的列表
  2. V必须是标量值的列表,其长度与M1
  3. 的内部列表相同
  4. 通过递归推断,Result将是标量值的向量(列表),列表的长度将等于M1的长度(具有与M1相同数量的标量有向量)。
  5. 换句话说,它遵循标准矩阵/向量乘法的规则。

    查看显示的所有测试用例,它们都会失败,因为它们都不符合上述所有3个标准。

    multiply([1,2],3,X).      % Fails item #1 above
                              % `3` isn't a vector/list
    multiply([[1,2]],[3],X).  % Fails item #2 above
                              % length of [3] isn't length of [1,2]
    multiply([[1,2]],3,X)     % Fails item #2 above
                              % `3` isn't a vector/list
    multiply([1,2],[3,2],X).  % Fails item #1 above
                              % `[1,2]` isn't a list of lists (matrix)
    

    所以他们都会因为不匹配允许谓词成功的参数的预期配置而失败。

    尝试类似:

    multiply([[1,2,3],[3,2,1]], [1,1,1], X).
    

    你应该得到:

    X = [6,6]