嗨我有一个prolog函数/谓词?取两个列表的点积。并希望用它来编写一个函数,从列表和列表列表构建点积列表。所以基本上,dot产品将在列表中的每个列表上调用,函数点位于下面并且它可以工作。
dot([], [], 0).
dot([Head|Tail], [Head2|Tail2], Result) :-
Prod = Head * Head2,
dot(Tail, Tail2, Remaining),
Result is Prod + Remaining.
这是我尝试运行它时每次都失败的函数。任何人都可以帮忙吗?
dotAll([], [[]], [0]).
dotAll(X, [[Head]|[Tail]], Result) :-
dotUnit(X, Head, Prod),
Result = [Prod|Result],
dotAll(X, Tail, Result).
为了总结我的目标,如果我传入此dotAll([1,2,3],[[1,2,3],[4,5,6],[1,2,3]], What).
我想回来,What
是[15,32,15]
。
我知道这是一个满嘴,但我希望有人可以给我一些关于我哪里出错的指示。我对prolog很新。
答案 0 :(得分:1)
我认为dotAll
谓词(来自示例)定义为:
dotAll(Vector, ListOfVectors, Results)
并说Results
是通过Vector
中每个向量取ListOfVectors
的点积得到的点积结果列表。
查看dotAll
谓词:
dotAll(X, [Head|Tail], [Prod|Result]) :- % dotAll of X with [Head|Tail]
% is [Prod|Result] if...
dot(X, Head, Prod), % Prod is the dot product of X w/Head
%Result = [Prod|Result], % This would always fail
dotAll(X, Tail, Result). % AND Result is the list of
% dot products of X with Tail
有关递归案例的说明:
Result = [Prod|Result]
会失败,因为这样说,我有Result
,而且与[Prod|Result]
相同,这是不可能的。[Prod|Result]
)然后基本情况:
dotAll(_, [], []). % dot product of anything with
% an empty list of vectors is empty
关于基本案例的说明:
[]
,因为递归谓词不会将第一个参数减少到空列表。第一个参数始终是您开始使用的向量,该向量用于将数据与向量列表(第二个参数)中的元素相加。由于我们不关心基本情况下的向量是什么,因此我们使用_
。[]
,这是一个空列表,因为基本情况是关于当我们用尽矢量列表时会发生什么,这是一个列表列表。当您到达列表列表的末尾时,您有一个空列表([]
)。[]
而不是[0]
,因为它是合乎逻辑的:如果你使用任何向量的点积与空向量列表,你应该得不到任何结果(一个空列表{ {1}})。使用上述更正:
[]