Вопрос

Изучая Пролог, я пытаюсь решить следующую проблему, используя аккумуляторы:

Напишите предикат 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 были связаны с []

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top