Проблема с аккумуляторами в прологе - PullRequest
3 голосов
/ 22 ноября 2010

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

Напишите предикат 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).

Но он не работает.Может кто-нибудь сказать мне, почему?Итак, как мне использовать аккумуляторы в Прологе?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

anthares правильно в том смысле, что вы должны уточнить свой базовый вариант.Однако вы также делаете вещи очень неэффективно с вашими append звонками.В Прологе требуется некоторое время, чтобы привыкнуть к силе объединения, но, например, в этом случае это поможет вам сразу настроить список результатов.Попробуйте следующее:

addone([E|Tail], [E1|Rs]) :-
    E1 is E+1,
    addone(Tail, Rs).

Вот и все, что нужно сделать.Сразу же поместив E1 в шаблон второго аргумента, вы уже создали первый элемент списка результатов.Остальные элементы Rs будут созданы во время рекурсии.Очень типичный образец Пролога.

1 голос
/ 22 ноября 2010

Нижняя часть вашей рекурсии должна быть addone([],[])., чтобы NewR были связаны с []

...