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.