您正在计算的内容通常被称为dot product(也称为标量产品或内积)。
你写你不允许使用库。这肯定是指外部库---不是标准库是SWI Prolog的一部分,对不对?
以下谓词list_list_dotProduct/3
大致对应于您实施的代码。它采用有限域约束(#>=)/2
和(#=)/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
和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).
我想'X = [1,1]'在你的例子中也是正确的答案。你想让它产生所有答案吗?或者你有其他约束?基于这个例子,我假设你只处理非负整数?你没有说。这是一项任务吗?你可以使用CLPFD库吗?这将是处理这个问题的自然方法。 – lurker 2015-04-03 01:06:23
@lurker是的,它应该产生所有答案与非原生整数输入。它来自任务,因此我不能使用任何库。谢谢。 – Pig 2015-04-03 01:27:43