我正在尝试编写一个规则,该规则可以从两个列表(相同长度)中返回每个元素的乘积之和。
这是我现在所拥有的:
sum(0, _, []).
sum(Result, [H1|T1], [H2|T2]) :-
sum(Remaining,T1, T2),
Remaining is Result - (H1*H2).
当列表之一未实例化时,它将不起作用。为了使以下内容成为可能,我需要进行哪些更改?
sum([1,2],X,3).
X = [3,0].
谢谢。
我正在尝试编写一个规则,该规则可以从两个列表(相同长度)中返回每个元素的乘积之和。
这是我现在所拥有的:
sum(0, _, []).
sum(Result, [H1|T1], [H2|T2]) :-
sum(Remaining,T1, T2),
Remaining is Result - (H1*H2).
当列表之一未实例化时,它将不起作用。为了使以下内容成为可能,我需要进行哪些更改?
sum([1,2],X,3).
X = [3,0].
谢谢。
您计算的内容通常称为点积(也称为标量积或内积)。
你写你不允许使用库。那肯定是指外部库——而不是作为 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).