List 带累加器的SWI Prolog标量乘法

List 带累加器的SWI Prolog标量乘法,list,prolog,reverse,accumulator,List,Prolog,Reverse,Accumulator,所以我一直在研究以下问题: 编写一个三位谓词scalarMult,其第一个参数是 整数,其第二个参数是整数列表,第三个参数是 参数是第二个参数乘以 第一个。例如,查询 ?- scalarMult(3,[2,7,4],Result). 应该让步 Result = [6,21,12] 在累加器和包装器谓词的帮助下执行此操作 这就是我所做的: scalarMult(I, List1, List2):- scalarMult1(I, List1, [], List2). scalarMult

所以我一直在研究以下问题:

编写一个三位谓词scalarMult,其第一个参数是 整数,其第二个参数是整数列表,第三个参数是 参数是第二个参数乘以 第一个。例如,查询

?-  scalarMult(3,[2,7,4],Result). 
应该让步

Result = [6,21,12] 
在累加器和包装器谓词的帮助下执行此操作

这就是我所做的:

scalarMult(I, List1, List2):- scalarMult1(I, List1, [], List2).

scalarMult1(I,[], A, A).
scalarMult1(I,[H|T], A, Result):- H1 is H*I, scalarMult1(I,T,[H1|A],Result).
唯一的问题是它把新元素放在累加器的前面,所以我最终得到了一个相反的列表(对于上面的例子,我会得到Result=[12,21,6])。我有办法解决这个问题吗?我尝试在代码中使用reverse,但所有尝试都失败了


感谢使用reverse/2工程,实际上:

scalarMult(I, List1, List2):- scalarMult1(I, List1, [], T), reverse(T, List2).

但是我认为使用累加器的要求(这里真的没用)可能是为了验证列表处理的水平。

注意到卡洛关于使用累加器用于教学目的的评论,对于标量乘法/3谓词的直接定义不需要累加器(从
scalarMult/3
重命名;在Prolog中驼峰式不被认为是好的编程风格):


这是处理列表的常见模式的一个实例。它非常常见,以至于一些Prolog实现提供了一个二阶谓词(或元谓词),通常命名为
map/3
maplist/3
,来处理它。

谢谢。你能解释一下那里发生了什么吗?我尝试了两种相反的方式(T,List2)和reverse(List2,T),它们都能工作。这是为什么?使用reverse(List2,T)不是更合乎逻辑,因为T是反向列表吗?@user3281466,在最纯粹的情况下,prolog中的谓词是“关系”它描述参数之间的关系,而不是函数与输入和输出之间的关系。
reverse/2
是一个纯粹的关系型prolog谓词,它说“一个列表是另一个列表的反向”,不管你给哪个列表,另一个都是反向的。因此
reverse(t,List2)
reverse(列表2,T)
将起作用。并非所有谓词都是纯关系谓词。prolog文档指示每个谓词的参数行为(使用
+
-
指示符)。这不是你问题的答案,所以我将把它作为一个注释发布:基于
maplist
的解决方案可能看起来像,
scalar\u mult(N,L,R):-maplist(mul(N,L,R)。mul(X,Y,R):-R是X*Y。
% first exchange argument orders to take advantage of the first-argument
% indexing that is provided in most Prolog implementations
scalar_multiplication(Scalar, Numbers, ScaledNumbers) :-
    scalar_multiplication_(Numbers, Scalar, ScaledNumbers).

% base case; either input list was empty or we finished traversing the list
scalar_multiplication_([], _, []).

% recursive case
scalar_multiplication_([Number| Numbers], Scalar, [ScaledNumber| ScaledNumbers]) :-
    ScaledNumber is Number * Scalar,
    scalar_multiplication_(Numbers, Scalar, ScaledNumbers).