我目前正在使用prolog,并希望将两个列表相乘,但采用certian方式。例如:在序言中乘以两个列表
[1,2,3] and [4,5,6] are my two lists.
欲瓶坯以下操作:
(1*4)+(2*5)+(3*6) = 32
,使得每个列表的第一个元素乘以彼此然后与第二元素的加入相乘等等
这是可能进入Prolog吗?
我知道,在其他语言中,你可以做一个递归函数,带有列表头和尾部(其余条目)。这允许一个简单的乘法,但我不认为这是可能的序言?
我目前正在使用prolog,并希望将两个列表相乘,但采用certian方式。例如:在序言中乘以两个列表
[1,2,3] and [4,5,6] are my two lists.
欲瓶坯以下操作:
(1*4)+(2*5)+(3*6) = 32
,使得每个列表的第一个元素乘以彼此然后与第二元素的加入相乘等等
这是可能进入Prolog吗?
我知道,在其他语言中,你可以做一个递归函数,带有列表头和尾部(其余条目)。这允许一个简单的乘法,但我不认为这是可能的序言?
使用内置插件:
mult(X, Y, Z) :- Z is X * Y.
sum_prod(A, B, SumProd) :-
maplist(mult, A, B, Prods),
sumlist(Prods, SumProd). % In GNU Prolog this is sum_list
使用简单的递归:
sum_prod([A|As], [B|Bs], SumProd) :-
sum_prod(As, Bs, SP),
SumProd is SP + A*B.
sum_prod([], [], 0).
使用尾递归:
sum_prod(A, B, SumProd) :-
sum_prod(A, B, 0, SumProd).
sum_prod([A|As], [B|Bs], Acc, SumProd) :-
Acc1 is Acc + A*B,
sum_prod(As, Bs, Acc1, SumProd).
sum_prod([], [], Acc, Acc).
我一直在阅读很多答案Lurker,真的帮助我学习Prolog,谢谢 – user3667111
如果你的列表中的所有项目都是整数,你的Prolog的实现提供clpfd,你可以简单地使用 clpfd内置谓词scalar_product/4
,像这样:
?- scalar_product([1,2,3],[4,5,6],#=,Product).
Product = 32.
编辑: 您可能也有兴趣相关的问题“Prolog: Multiplying 2 lists with 1 of them not instantiated?”,特别是在this answer。
您是否阅读过任何prolog教程或书籍?为什么你会认为递归列表处理在prolog中可能不可行?这是一个非常常见的操作。 – lurker