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.