Prolog以点积为基础递归构建列表

时间:2014-03-10 00:12:36

标签: prolog

嗨我有一个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很新。

1 个答案:

答案 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

有关递归案例的说明:

  1. Result = [Prod|Result]会失败,因为这样说,我有Result,而且与[Prod|Result] 相同,这是不可能的。
  2. 如图所示,您可以使用子句中的第三个参数来表示结果列表在递归情况下的外观([Prod|Result]
  3. 然后基本情况:

    dotAll(_, [], []).                       % dot product of anything with
                                             % an empty list of vectors is empty
    

    关于基本案例的说明:

    1. 第一个参数不是[],因为递归谓词不会将第一个参数减少到空列表。第一个参数始终是您开始使用的向量,该向量用于将数据与向量列表(第二个参数)中的元素相加。由于我们不关心基本情况下的向量是什么,因此我们使用_
    2. 第二个参数是[],这是一个空列表,因为基本情况是关于当我们用尽矢量列表时会发生什么,这是一个列表列表。当您到达列表列表的末尾时,您有一个空列表([])。
    3. 第三个参数是空列表[]而不是[0],因为它是合乎逻辑的:如果你使用任何向量的点积与空向量列表,你应该得不到任何结果(一个空列表{ {1}})。
    4. 使用上述更正:

      []