Свертывание пар дубликатов в прологе - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь написать программу на Прологе, чтобы свернуть пары дубликатов, когда они находятся рядом друг с другом.

Вот несколько примеров,

[1,2,2,3, 4] -> [1,2,3,4]

[1,2,2,2,3,4] -> [1,2,2,3,4]

То, что я пытаюсь сделать, выглядит следующим образом ...

 Look at the 3 elements in the front, 
    if they are equal,
    collapse them into 2, 
    set head to 3rd element.

 Look at 2 elements in front,
    if they are equal,
    collapse them into 1, 
    set head to 2nd element. 

Look at 2 elements in front,
   if they are not equal,
   do nothing,
   set head to 2nd element.

Я думаю, что эта логика должна работать, но я очень плохо знаком с Прологом и не знаю, как это написать.

Это то, что у меня есть

unecho([X],[X]).
unecho([X,Y,Z|XS],YS) :-
X=Y,
    Y=Z,
    unecho([Z|XS],YS).
unecho([X,Y|XS],YS):-
    X = Y,
    unecho([X|XS],YS).
unecho([X,Y|XS],[X|YS]):-
    X \= Y,
    unecho([Y|XS],YS).

Когда мой ввод не совпадает ([1,2,2,2,3,4], X), мой вывод X = [1,2, 3,4] когда это должно быть [1,2,2,3,4].

1 Ответ

0 голосов
/ 30 ноября 2018

Вам не нужно правило 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] .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...