2011-02-05 217 views
2

我应该在序言中创建一个谓词,使得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). 
+1

那么,有什么问题吗?是“你会为我做这个作业吗”吗? – 2011-02-05 17:08:52

+0

有关寻求SO帮助的准则,请阅读[“如何问及回答作业问题?”](http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework - 问题) – outis 2011-02-05 17:15:18

+0

让我来重述一下。以上是问题的问题。我得到Result =((0是2 * 4)为1 * 3)的点。为什么不结果是一个实际的数字?相反,它给我所有的计算? – Victor 2011-02-05 17:29:02

回答

2

在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实现可用。

1

使用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].