У меня есть домашнее задание в Прологе, которое я просто не могу решить.
У меня есть предикат Пролога, listsum (L, S) , который завершится успешно, если L - список последовательных чисел, а S - сумма этого списка.
Таким образом, код должен отвечать на эти запросы следующим образом:
?- listsum(L,6).
L = [1, 2, 3] ;
false.
?- listsum(L,45).
L = [1, 2, 3, 4, 5, 6, 7, 8, 9] ;
false.
?- listsum(L,46).
false.
Как видите, сумма может быть истинной, только если она может быть «сделана» с помощью выбора последовательных чисел, которые должны начинаться с 1. Мы могли бы использовать предикат, который мы сделали в предыдущем назначении, которое я уже выполнил:
fromTill(X,X,[X]):-!.
fromTill(L,H,[L|Xs]):-
integer(L),
integer(H),
L=<H,
Z is L+1,
fromTill(Z,H,Xs).
fromTill(L,H,[L|Xs]):-
integer(L),
integer(H),
L>=H,
Z is L-1,
fromTill(Z,H,Xs).
Этот предикат fromTill выдаст список чисел между двумя целыми числами. Итак:
?-fromTill(1,8,X)
X = [1,2,3,4,5,6,7,8]
Так что я не знаю, с чего начать с этого задания. Моей первой мыслью было использовать аккумулятор, который будет определять сумму в списке. Затем предикат fromTill определит, является ли список последовательным, который будет включен в предикат listSum. Итак, пока у меня есть это, но я не знаю, где go следующий:
listsumAcc([], 0).
listsumAcc([H|T], N):-
listsumAcc(T, N1),
N is N1 + H.
Дайте мне знать, если вы могли бы помочь мне! Был бы очень признателен.