Arhn - архитектура программирования

Достигнув результата, затем возвращается в исходное состояние

Так что я в процессе изучения пролога.

Все, что я хочу сделать, это изменить порядок элементов и в результате получить новый список.

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

Код:

accRev([], [], _) :- !.
accRev([], A, R) :- accRev(A, [], R), !.
accRev([H, H2 |T], A, R):-
  append(R, [H], R1),
  append(A, [H2], A1),
  accRev(T, A1, R1), !.
accRev([H], A, R):-
  append(R, [H], R1),
  accRev(A, [], R1), !.

accRevT([], [], _) :- !.
accRevT([], A, R) :- accRev(A, [], R), !.
accRevT([H, H2 |T], A, R):-
  append(R, [H], R1),
  append(A, [H2], A1),
  accRevT(T, [H2 | A], [H | R]), !.
accRevT([H], A, R):-
  append(R, [H], R1),
  accRevT(A, [], [H | R]), !.

Изображение трассировки

Обратите внимание, как он достигает accRev([], [], [1, 3, 2, 4]) (это то, что я хотел бы, чтобы R стал, R = [1, 3, 2, 4])

введите здесь описание изображения

Так что же не так?

29.09.2016

  • См. этот ответ. У вас не должно быть не анонимной переменной _ в предложении конца рекурсии при использовании аккумуляторов. Предложение обычно читается как foo([], Acc, Acc)., а не foo([], [], _).. 29.09.2016
  • Еще одна серьезная проблема с вашим кодом: слишком много сокращений. Вы действительно знаете, что каждый из них делает? Знаете ли вы, если их отсутствие изменит программу? 29.09.2016
  • Что именно вы хотите получить в качестве вывода. Какова цель вашей программы, потому что изменить порядок элементов не очень понятно... 29.09.2016

Ответы:


1

Если вы правильно поняли, что вы пытаетесь сделать, вы можете написать:

  accRev([],[]).
  accRev([X|Y], Lout):-
    split_list([X|Y],Z1),
    split_list(Y,Z2),
    accRev(Z2,Z3),
    append(Z1,Z3,Lout).


split_list([],[]).
split_list([X|[]], [X]).
split_list([X,_|T], [X|R]):-split_list(T,R).

Пример:

?- accRev([1,2,3,4],R).
R = [1, 3, 2, 4] ;
false.

В вашем решении я думаю, что некоторые проблемы были вызваны использованием слишком большого количества сокращений и accRev([], [], _), как написал Борис, а также я думаю, что вам не нужен средний список, потому что, например, пункты:

accRev([], [], _) :- !.
accRev([], A, R) :- accRev(A, [], R), !.

приведет к проблемам, поскольку, если первый список является пустым списком, оба предложения совпадают.

29.09.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..