Сжатие списка в прологе с использованием Member и Append - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время я изучаю пролог и делаю 99 упражнений на пролог.У меня есть вопрос, чтобы сжать список, чтобы все повторяющиеся элементы были удалены.

Желаемый результат:

?- compress([a,a,a,a,b,c,c,a,a,d,e,e,e,e],X).
X = [a,b,c,d,e]

Мой код в настоящее время выглядит так:

compress([],[]).
compress([H|T], X) :- 
    (  \+ member(H, X) -> 
       append([H],X,X)
    ), compress(T,X).

Запустив это с trace, оно всегда завершается ошибкой после первого добавления и возвращает false.У кого-нибудь есть идеи как это решить?

1 Ответ

0 голосов
/ 20 декабря 2018

append([H],X,X) - это чепуха.Если X является конечным списком, вы не можете добавить к нему непустой список и по-прежнему получать тот же список X.

Программы Prolog - это утверждения о фактах и ​​правилах вывода, как математическое доказательство,не такие императивы, как x = [h] + x.Не существует «переменных» в том же смысле, что и в программах на Java / C ++ / JavaScript.

В частности, compress([H|T], X) :- foo, compress(T,X). также выглядит странно, потому что вы говорите, что результат сжатия списка [H|T] (а именно,X) совпадает с результатом сжатия списка T (также X), но только если foo является правильным.

Кроме того, если вы хотите получить [a,b] для[a,b,a], тогда вам, вероятно, придется добавить дополнительные предикаты.Предикат не может ничего «запомнить» (например, он не может «перебрать все элементы и получить только первое вхождение). Он может делать только рекурсивные вызовы.

Если вы в порядке с сохранением только последнего вхождения, я 'напишите это следующим образом:

compress([],[]).  % Empty list
compress([H|T], X) :-
  member(H, T),    % If H is not the last occurrence...
  compress(T, X).  % remove duplicates from the tail, ignore H.
compress([H|T], X) :-
  not(member(H, T)),  % If H is the last occurrence...
  compress(T, XT),    % ...compress the tail...
  append([H], XT, X). % ...and prepend H to the result.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...