这可能是一个愚蠢的问题,但在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).
但是一切都是假的。
我有什么问题吗?
答案 0 :(得分:1)
没有提供关于期望什么样的论点的信息,但您可以通过查看multiply
的子句来确定它:
multiply([],_,[]).
这表明第一个和第三个参数是某种列表。
multiply([V0|Rest], V1, [Result|Others]):-
multiply(Rest,V1,Others),
inner_product(V0,V1,Result).
inner_product
虽然未定义为@CapelliC指出,但表明V0
和V1
是向量(或在prolog中,列表根据内积的定义,相同长度的标量数量)。 Result
值将是标量。
因此,multiply(M1, V, Result).
成功:
M1
必须是列表或矩阵列表。每个内部列表必须长度相同,且必须是标量值的列表V
必须是标量值的列表,其长度与M1
Result
将是标量值的向量(列表),列表的长度将等于M1
的长度(具有与M1
相同数量的标量有向量)。换句话说,它遵循标准矩阵/向量乘法的规则。
查看显示的所有测试用例,它们都会失败,因为它们都不符合上述所有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]