如何通过递归获得列表项的产品?
如果我问:
product([s(0), s(s(0)), s(s(0))], S).
结果应为:
S = s(s(s(s(0)))).
但是我一直得到错误的结果。还是没有结果。
我尝试过:
product([], 0).
product([], Res).
product([H1, H2|T], Res) :- T\=[], mul(H1, H2, Res), product(T, Res).
product([H|T], Res) :- mul(H, Res, X), product(T, X).
mul是乘法,可以正常工作。
如果我使用跟踪,我可以看到它找到了结果,但是由于某种原因它失败了。
Call: (10) product([], s(s(s(s(0))))) ? creep
Fail: (10) product([], s(s(s(s(0))))) ? creep
有人知道吗?
答案 0 :(得分:0)
我想您会发现这可以解决问题:
product([], 0).
product([H], H).
product([H1, H2|T], Res) :-
mul(H1, H2, H),
product([H|T], Res).
第一个谓词是平凡的基本情况。
第二个是列表仅包含单个元素的地方-就是答案。
第三个是您拥有两个或更多元素的列表的地方-只需对前两个元素执行mul/3
,然后递归调用product/2
。最终将匹配谓词2并完成。
您的样本输入确实产生s(s(s(s(0))))
。
将来请包括mul/3
的定义。我必须在互联网上找到一个。
%Addition
sum(0,M,M). %the sum of an integer M and 0 is M.
sum(s(N),M,s(K)) :- sum(N,M,K). %The sum of the successor of N and M is the successor of the sum of N and M.
%Multiplication
%Will work for mul(s(s(0)),s(s(0)),X) but not terminate for mul(X,Y,s(s(0)))
mul(0,M,0). %The product of 0 with any integer is 0
mul(s(N),M,P) :-
mul(N,M,K),
sum(K,M,P). %The product of the successor of N and M is the sum of M with the product of M and N. --> (N+1)*M = N*M + M