Проблема с аккумуляторами в прологе
-
27-09-2019 - |
Вопрос
Изучая Пролог, я пытаюсь решить следующую проблему, используя аккумуляторы:
Напишите предикат addone2/, первым аргументом которого является список целых чисел, а вторым аргументом — список целых чисел, полученный добавлением 1 к каждому целому числу в первом списке.Например, запрос
addone([1,2,7,2],X).
должен дать
X = [2,3,8,3].
Я создал следующий код:
addone([], _).
addone([E|Tail], [R|Rs]) :-
NewE is E+1,
append([R|Rs], [NewE], NewRs),
addone(Tail, NewRs).
Но это не работает.Может кто-нибудь сказать мне, почему?Итак, как мне использовать аккумуляторы в Прологе?
Спасибо!
Решение
Anthares прав в том, что вам нужно уточнить базовый вариант.Однако вы также делаете вещи очень неэффективно с помощью своего append
звонки.В Прологе требуется некоторое время, чтобы привыкнуть к возможностям унификации, но, например, в этом случае это поможет вам сразу настроить список результатов.Попробуйте следующее:
addone([E|Tail], [E1|Rs]) :-
E1 is E+1,
addone(Tail, Rs).
Вот и все, что нужно сделать.Сразу разместив E1
в шаблоне вашего второго аргумента вы уже создали первый элемент списка результатов.Остальные элементы Rs
будет создан во время рекурсии.Очень типичный шаблон Пролога.
Другие советы
Нижняя часть вашей рекурсии должна быть addone([],[]).
для того, чтобы NewRs были связаны с []