prolog谓词的求和不起作用

prolog谓词的求和不起作用,prolog,Prolog,与标题状态一样,我试图返回子谓词返回值的总和,但它不起作用。这是我的密码: addlistnum([],[],X). addlistnum(digits(Y,[A|T]),digits(F,[B|T]),X) :- X is Y + F. digits(Num, List) :- digits(0, List, Num). digits(Num, [], Num). digits(N, [A|As], Num) :- N1 is N * 10 + A, digits(

与标题状态一样,我试图返回子谓词返回值的总和,但它不起作用。这是我的密码:

addlistnum([],[],X).
addlistnum(digits(Y,[A|T]),digits(F,[B|T]),X) :-
   X is Y + F.

digits(Num, List) :-
   digits(0, List, Num).

digits(Num, [], Num).
digits(N, [A|As], Num) :-
   N1 is N * 10 + A,
   digits(N1, As, Num).
子谓词工作得很好。它将列表转换为整数。现在我要求转换值的和。 例如:

?- digits(X,[3,3,3]).
X = 333.                % works as expected
在此基础上,
addlistnum([3,3,3],[2,2,2],X)
应该产生
X=3555
(正如
3555是3333+222
),但我得到的是
false

我还尝试:

addlistnum([],[],X).
addlistnum([A|T],[B|T],X) :-
   X is Y + F,
   digits(Y,[A|T]), 
   digits(F,[B|T]).

它只返回
false
,不提供错误信息。

问题在于以下规则:

addlistnum([],[],X).
addlistnum(digits(Y,[A|T]),digits(F,[B|T]),X) :-
   X is Y + F.
第二个是,“两个列表的相加就是这些列表的整数转换的相加”:


第一个是不必要的,空列表的“位数”为零,因此,此规则还包括“两个空列表的相加为零”

这里有一些基本的误解。您的谓词子句head:
addlistnum(digits(Y,[A | T])、digits(F,[B | T])、X)
似乎意味着您认为
digits
是一个返回值的函数,但它不是这样工作的。当您调用,
addlistnum([3,3,3,3],[2,2,2],X)
时,Prolog尝试将术语
[3,3,3]
与术语
[]
数字(Y[A | T])
匹配,但失败,因为它们显然不匹配。
addlistnum(A,B,X) :-
   digits(NA,A),
   digits(NB,B),
   X is NA + NB.