Проблема заключается в том, что для значения V
вы обрабатываете только случаи X<V
и X>V
, а не случай X=V
.Фактически, если вы замените X>K
на X>=K
, ваша программа выдаст результат R=8
.
Позвольте мне сказать о вашей программе две вещи:
Прежде всего, выне нужны последние две строки в вашем коде (т.е. additionsmaller([X],K,X):-X<K.
и additionsmaller([X],K,0):-K<X.
).Просто замените эти две строки на additionsmaller([],_,0).
Второе: вам также следует написать хвостовое рекурсивное решение, например:
additionSmallerTail([],_,V,V).
additionSmallerTail([H|T],K,V,V0):-
H >= K,
additionSmallerTail(T,K,V,V0).
additionSmallerTail([H|T],K,V,V0):-
H < K,
V1 is V+H,
additionSmallerTail(T,K,V1,V0).
?- additionSmallerTail([1,2,3,4,2],4,0,R).
R = 8
false
Зачем использовать хвостовую рекурсию? Эта ссылка интересна.