我正在尝试创建一个包含列表列表的函数,它将内部列表的总和与外部列表相乘。 到目前为止,我可以总结一个列表,我已经制作了一个函数sumlist([1..n],X),它将返回X =(结果)。但我无法获得另一个功能来有效地使用该功能,我已经尝试了两个是和=无济于事。
答案 0 :(得分:2)
这是你的意思吗?
prodsumlist([], 1).
prodsumlist([Head | Tail], Result) :-
sumlist(Head, Sum_Of_Head),
prodsumlist(Tail, ProdSum_Of_Tail),
Result is Sum_Of_Head * ProdSum_Of_Tail.
其中sumlist/2
是内置的SWI-Prolog。
用法示例:
?- prodsumlist([[1, 2], [3], [-4]], Result).
Result = -36.
答案 1 :(得分:1)
部分“它将内部列表的总和与外部列表相乘”并不是很清楚,但我相信你的意思是,给定列表[L1,...,Ln]
的数字列表,你想要计算{ {1}}其中S1*..*Sn
是Si
中元素的总和(对于每个Li
)。
我认为i
和plus
的存在具有明显的含义(例如mult
恰好在plus(N,M,R)
等于R
时保持不变。首先,我们需要谓词N+M
,以便当sum
是sum(L,S)
的元素之和时S
成立。如果L
为空,L
显然必须是S
:
0
如果sum([],0).
不是空的,而是L
形式,那么我们[N|L2]
必须是S
加上N
的元素总和S2
L2
。换句话说,我们必须同时具有sum(L2,S2)
(以使S2成为L2
的元素之和)和plus(N,S2,S)
。那就是:
sum([N|L2],S) :- sum(L2,S2), plus(N,S2,S).
以同样的方式,您可以找出您正在寻找的谓词p
。我们希望p(L,R)
保留R
,S1
是Sn
到L=[L1,...,Ln]
的产品,其中sum(Li,Si)
和i
适用于所有L
{1}}。如果R
为空,则1
必须为p([],1).
:
L
如果[LL|L2]
不是空的,而是R
形式,那么我们LL
必须是'S'的乘积,L2
元素的总和}和'P',S
中列表总和的乘积。对于sum(LL,S)
,我们已经有p([LL|L2],R) :- sum(LL,S), p(L2,P), mult(S,P,R).
,因此这给了我们以下内容。
sumlist([1,..,n],X)
我想补充的一点是,将这些谓词看作可能用于命令式或函数式编程的函数可能不是一个好主意。 X = (result)
不会返回(result)
; X
是sumlist([1,...,n],X)
的值,p(X) :- q(X)
为真。这需要一种不同的心态。而不是想“如何计算X,使得p(X)成立?”你必须想“P(X)何时举行?”并使用答案(“好吧,如果q(X)或r(X)!”)来制作条款(p(X) :- r(X)
和{{1}})。
答案 2 :(得分:0)
以下是Kaarel's answer的重写(无论如何都是这个意图!)但是tail-recursive。
prodsumlist(List, Result) :-
xprodsumlist(List,1,Result).
xprodsumlist([],R,R).
xprodsumlist([Head|Rest],Sofar,Result) :-
sumlist(Head, Sum_Of_Head),
NewSofar is Sofar * Sum_Of_Head,
xprodsumlist(Rest, NewSofar, Result).