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/2ins/2scalar_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).