Как я могу перевернуть список и заменить все указанные значения другими значениями? - PullRequest
0 голосов
/ 09 сентября 2018

Представьте, что у нас есть список: [1,2,2,3,4]. Проблема может быть разделена на две части:

  • Перевернуть список (мы должны получить [4,3,2,2,1])
  • Заменить, например, все 2 с 100, поэтому мы должны получить [4,3,100,100,1]

Список легко перевернуть, вот рабочий код:

simple_reverse(List, Rev) :-
        simple_reverse(List, Rev, []).

simple_reverse([], L, L).
simple_reverse([H|T], L, SoFar) :-
        simple_reverse(T, L, [H|SoFar]).

Но у меня есть некоторые проблемы с заменой элементов. Я попробовал следующий подход:

reverse(a, b, List, Rev) :-
        reverse(a, b, List, Rev, []).

reverse(a, b, [], L, L).

reverse(a, b, [H|T], L, SoFar) :-
        reverse(a, b, T, L, [H|SoFar]).

reverse(a, b, [a|T], L, SoFar) :-
        reverse(a, b, T, L, [b|SoFar]).

В чем проблема? Кстати, я использую https://swish.swi -prolog.org / для запуска кода.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы можете использовать foldl в сочетании с библиотекой (лямбда):

:- use_module(library(lambda)).
my_reverse(L, A, B, R) :-
    foldl([A,B] +\X^Y^Z^(dif(X, A) -> Z = [X |Y]; Z = [B|Y]), L, [],R).

пример:

?- my_reverse([1,2,2,3,4], 2, 100, R).
R = [4, 3, 100, 100, 1].
0 голосов
/ 09 сентября 2018

Вместо просто a, b (которые являются атомами) вам нужно поместить переменные в предикаты reverse/4 и reverse/5:

reverse(A, B, List, Rev) :-
        reverse(A, B, List, Rev, []).

reverse(_, _, [], L, L).

reverse(A, B, [H|T], L, SoFar) :-
        dif(A,H),              %case where H is not A so we skip it
        reverse(A, B, T, L, [H|SoFar]).

reverse(A, B, [A|T], L, SoFar) :-
        reverse(A, B, T, L, [B|SoFar]).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...