您正在计算的内容通常称为点积 http://en.wikipedia.org/wiki/Dot_product(也称为标量积或内积)。
您写道您不被允许使用图书馆。这肯定是指external图书馆——不标准库这是 SWI Prolog 的一部分,对吗?
以下谓词list_list_dotProduct/3
大致对应于您实现的代码。它使用有限域约束(#>=)/2
and (#=)/2
允许非单向整数算术:
:- use_module(library(clpfd)).
list_list_dotProduct([],[],0).
list_list_dotProduct([X|Xs],[Y|Ys],Sum) :-
X #>= 0,
Y #>= 0,
Sum #= X*Y + Sum0,
list_list_dotProduct(Xs,Ys,Sum0).
考虑以下查询:
?- list_list_dotProduct([1,2],Xs,3), label(Xs).
Xs = [1, 1] ;
Xs = [3, 0].
作为额外的奖励,这里有一个替代实施基于预定义的谓词same_length/2
, ins/2
, and scalar_product/4
:
list_list_dotProduct(Xs,Ys,Prod) :-
same_length(Xs,Ys),
Xs ins 0..sup,
Ys ins 0..sup,
scalar_product(Xs,Ys,#=,Prod).