理解Prolog中的参数
这可能是一个愚蠢的问题,但在Uni,我们看到了一个将数组相乘的Prolog段。它有4个谓词,其中一个我无法理解它做什么或如何执行。你能给我一些提示或解释吗理解Prolog中的参数,prolog,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
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).
但一切都是假的
有什么地方我做错了吗?没有给出关于所需参数类型的信息,但您可以通过查看
乘法的子句来确定:
multiply([],_,[]).
这表明第一个和第三个参数是某种类型的列表
multiply([V0|Rest], V1, [Result|Others]):-
multiply(Rest,V1,Others),
inner_product(V0,V1,Result).
内积
,虽然未定义为@capelic,但表示V0
和V1
是内积定义的长度相同的向量(或在序言中,标量列表)。而结果
值将是一个标量
因此,对于乘法(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]
可能内部产品/3丢失了?。。当缺少谓词时,在乘法(..)之前使用“trace.”来查看盖子下正在做什么。@cape我知道它缺少了,我只给了你一个谓词。不是全部file@magus好的,我会牢记在心的。谢谢你的回答!你帮助我了解了Prolog的工作原理!