Lambda 计算两个向量的点积

Lambda 计算两个向量的点积,lambda,prolog,Lambda,Prolog,我应该在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, Lis

我应该在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).
在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).
结果为
32
。很抱歉,手头没有其他Prolog实现。

使用SWI Prolog:

?- use_module(library(lambda)).
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].
?-使用模块()。
对。
?-地图列表(\X^Y^Z^(Z=X*Y),[1,2,3],[4,5,6],点)。
点=[1*4,2*5,3*6]。
?-地图列表(\X^Y^Z^(Z是X*Y),[1,2,3],[4,5,6],点)。
点=[4,10,18]。

那么问题是什么?是“你愿意为我做这个家庭作业吗?”关于在家庭作业上寻求帮助的指南,请阅读“让我重新措辞”。以上就是问题所在。我得到的结果=(0是2*4)是1*3)。为什么结果不是一个实际的数字?相反,它给了我所有的计算?你没有显示代码,所以很难想象是什么原因导致了你报告的有趣的结果表达式。通常“=”不会对算术表达式求值,它只会统一为算术表达式(公式)的一个术语,但谓词“是”将强制统一算术表达式的值。所以我想你需要更好地理解“=”和“is”的不同用法。在本例中显示代码的重要性在于查看您是否欣赏在Prolog中解决问题的递归方法。毕竟,向量/列表显然可以有任何长度。好的,我会再次检查以确保我理解其中的差异。这是我的代码,希望它有意义。iprod([]、[]、0)。iprod([H1 | List1],[H2 | List2],结果是H1*H2):-iprod(List1,List2,Result)。您已经生成了两个列表的逐项产品。两个向量的点积(此处由等长列表表示)是单个标量(数值),即生成的乘积之和。是的,但OP的困难在于理解语法统一与算术计算。这是一种很好的方法,只需稍作修改,即可转换为ISO Prolog:iprod([],[],R,R)。iprod([X | Xs],[Y | Ys],A,R):-新的is(X*Y)+A,iprod(Xs,Ys,Anew,R)。iprod(Xvct,Yvct,DotP):-iprod(Xvct,Yvct,0,DotP)。也许一个关于从iprod/3扩展到iprod/4的解释会对新的Prolog程序员有所帮助?