Prolog:将 2 个列表与其中 1 个未实例化的列表相乘?
Prolog: Multiplying 2 lists with 1 of them not instantiated?
我正在尝试编写一个规则,可以 return 两个列表(相同长度)中每个元素的乘积之和。
这是我现在拥有的:
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].
谢谢。
您正在计算的通常称为 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).
我正在尝试编写一个规则,可以 return 两个列表(相同长度)中每个元素的乘积之和。
这是我现在拥有的:
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].
谢谢。
您正在计算的通常称为 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).