在 Prolog 中使用递归获取列表项的乘积?

Get product of the list items by using recursion in Prolog?

如何使用递归得到列表项的乘积?

如果我问:

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

有人知道吗?

我想你会发现这很有效:

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