2013-02-11 55 views
1

我想使用这两个谓词模拟矩阵的一个产品和载体:序言倍增列表以及列表的列表

eva([], [], []). 
eva([A|A1], [W], [Res|R1]) :- 
    vectormultiplication(A, W, Res), 
    eva(A1, W, R1). 

vectormultiplication([A], [W], [A*W]). 
vectormultiplication([A|A1], [W|W1], [A*W|Out1]) :- 
    vectormultiplication(A1, W1, Out1). 

凡在EVA的[A|A1]是一个矩阵(或列表清单),[W]是一个向量(列表),[Res|R1]是最终产品。假设vectormultiplication将列表中的每个列表与矢量W相乘。但是,这种策略只会产生错误的回应。有没有什么明显的,我在这里做错了,使我无法获得所需的产品?我目前正在使用SWI Prolog版本5.10

回答

2

您还有其他2个问题分开是证明丹尼尔(+1):这里清理源

eva([], _, []). % here [] was wrong 
eva([A|A1], W, [Res|R1]) :- % here [W] was wrong 
    vectormultiplication(A, W, Res), 
    eva(A1, W, R1). 

vectormultiplication([A], [W], [M]) :- 
    M is A*W. 
vectormultiplication([A|A1], [W|W1], [M|Out1]) :- 
    M is A*W, 
    vectormultiplication(A1, W1, Out1). 

测试:

?- eva([[1,2],[3,5]],[5,6],R). 
R = [[5, 12], [15, 30]] 

处理列表时,这是值得使用maplist如果可用

eva(A, W, R) :- 
    maplist(vectormultiplication1(W), A, R). 

vectormultiplication1(W, A, M) :- 
    maplist(mult, A, W, M). 

mult(A, W, M) :- 
    M is A*W. 

注意我改变了vectormulti的参数顺序因为vector在该循环中是一个“常量”,maplist将参数添加为“展开”。

+0

非常感谢!这解决了我的问题。 – 2013-02-12 03:06:24

2

那么,你的第一个问题是你认为A*W本身会做任何事情。在Prolog中,这只是创建表达式A*W,与*(A,W)foo(A, W)没有任何不同 - 不涉及is/2,不会发生实际的算术减法。这是我快速浏览的唯一真正的问题。

+0

好的,所以我可以创建另一个谓词来处理乘法方面的问题? – 2013-02-12 00:02:15

+0

@CapelliC已经说明了所有需要完成的工作,但我没有抓住快速阅读中的所有问题。 – 2013-02-12 02:01:35