【问题标题】:Compute Dot Product of Two Vectors计算两个向量的点积
【发布时间】:2011-02-05 17:05:09
【问题描述】:

我应该在 prolog 中创建一个谓词,以便 iprod(List1, List2, Result) 采用两个长度相等的列表,每个列表都包含整数。结果是两个向量的点积。

例如,List1 = [1,2,3]List2 = [4,5,6],则结果将是 1*4 + 2*5 + 3*6。另外我不应该使用内置的 dotproduct 函数。

到目前为止我的代码:

iprod([],[], 0).
iprod([H1|List1], [H2|List2], Result is H1 * H2) :- iprod(List1, List2, Result).

【问题讨论】:

  • 那么问题是什么?是“你会为我做这个作业吗”?
  • 有关在 SO 上寻求家庭作业帮助的指南,请阅读 "How to ask and answer homework questions?"
  • 让我重新表述一下。以上是问题题。我到了 Result = ((0 is 2 * 4) is 1 * 3) 的地步。为什么 Result 不是实际数字?相反,它给了我所有的计算?
  • 您没有显示代码,因此很难想象是什么导致了您为 Result 报告的有趣表达式。通常“=”不会对算术表达式求值,它只会将算术表达式(公式)统一为一个术语,但谓词“is”将强制算术表达式的值被统一。所以我怀疑你需要更好地理解“=”和“is”的不同用法。在这种情况下展示你的代码的重要性是看你是否喜欢在 Prolog 中解决问题的递归方法。毕竟,向量/列表显然可以有任何长度。
  • 好的,我会仔细检查以确保我理解其中的区别。这是我的代码,希望它有意义。 iprod([],[], 0)。 iprod([H1|List1], [H2|List2], 结果是 H1 * H2) :- iprod(List1, List2, Result)。

标签: lambda prolog


【解决方案1】:

在 Visual Prolog 中:

domains
  ilist=integer*

predicates
  iprod(ilist, ilist, integer, integer)

clauses
  iprod([], _, R, R).    
  iprod([X|Xs], [Y|Ys], A, R):-
    M = X * Y,
    Rnew = A + M,
    iprod(XS, Ys, Rnew, R).


goal
  iprod([1,2,3],[4,5,6], 0, R).

结果为@​​987654322@。抱歉,目前没有其他可用的 Prolog 实现。

【讨论】:

  • 这是一个很好的方法,稍加改动就可以变成ISO Prolog:iprod([ ],[ ],R,R)。 iprod([X|Xs],[Y|Ys],A,R) :- Anew 是 (X*Y) + A, iprod(Xs,Ys,Anew,R)。 iprod(Xvct,Yvct,DotP):- iprod(Xvct,Yvct,0,DotP)。也许关于从 iprod/3 扩展到 iprod/4 的解释会对新的 Prolog 程序员有所帮助?
【解决方案2】:

使用 SWI-Prolog:

?- use_module(@987654321@). true. ?- maplist(\X^Y^Z^(Z=X*Y),[1,2,3],[4,5,6],Dots). Dots = [1*4, 2*5, 3*6]. ?- maplist(\X^Y^Z^(Z is X*Y),[1,2,3],[4,5,6],Dots). Dots = [4, 10, 18].

【讨论】:

  • 您已经制作了两个列表的逐项产品。两个向量的点积(这里用相等长度的列表表示)是一个标量(数值),即您产生的乘积之和。
  • 没错,但 OP 的难点在于理解句法统一与算术评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2016-05-07
  • 2017-10-21
  • 1970-01-01
  • 2022-12-09
  • 2016-03-22
相关资源
最近更新 更多