Вам не нужно правило unecho([X,Y,Z|XS],YS)
, потому что вы можете просто просмотреть первые два элемента X
и Y
из [X,Y|Xs]
: в любом случае X
становится главой второго списка (ивы никогда не будете сканировать его снова в рекурсивных вызовах);если X
равно Y
, то вы просто забудете о Y
, в противном случае в рекурсивном вызове будет добавлен Y
:
unecho([X,Y|XS],[X|YS]):-
X = Y,
unecho(XS,YS).
unecho([X,Y|XS],[X|YS]):-
X \= Y,
unecho([Y|XS],YS).
и вам также понадобится предикат для пустого списка:
unecho([],[]).
unecho([X],[X]).
в противном случае unecho([1,1],[1])
завершится неудачей.
Некоторые тесты:
?- unecho([1],X).
X = [1] .
?- unecho([1,1],X).
X = [1] .
?- unecho([1,1,1],X).
X = [1, 1] .
?- unecho([1,1,1,1],X).
X = [1, 1] .
?- unecho([1,1,2],X).
X = [1, 2] .
?- unecho([1,2,2],X).
X = [1, 2] .
?- unecho([1,2,2,2],X).
X = [1, 2, 2] .
?- unecho([1,2,2,2,2],X).
X = [1, 2, 2] .
?- unecho([1,2,2,2,3,3,4],X).
X = [1, 2, 2, 3, 4] .
?- unecho([1,2,2,2,2,3,3,4],X).
X = [1, 2, 2, 3, 4] .