Рассчитать сумму списка, существующего из последовательных чисел, в прологе - PullRequest
2 голосов
/ 20 марта 2020

У меня есть домашнее задание в Прологе, которое я просто не могу решить.

У меня есть предикат Пролога, 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.

Дайте мне знать, если вы могли бы помочь мне! Был бы очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...