Предикат, заменяющий два подряд идущих одинаковых элемента одним - Prolog
Формулировка задачи:
помогите решить задачу "Создайте предикат, заменяющий в исходном списке два подряд
идущих одинаковых элемента одним."
Решение задачи: «Предикат, заменяющий два подряд идущих одинаковых элемента одним»
textual
Листинг программы
domains
element=integer
list=element*
predicates
input(list)
output(list)
shift(list,list) /*сдвиг вправо*/
getlast(list,element,element) /*получение последнего элемента*/
deletelast(list,list) /*удаление последнего элемента*/
parLen(list) /*четность длины списка*/
chArPL(list,integer) /*проверка на арифметическую прогрессию списка*/
getLenList(list,integer) /*определение длины списка*/
chpel(list,list) /*замена двух идущих подряд символов - одним */
%start
clauses
input([X|T]):-
write("ввести элемент - y/n: "),
readchar(YN),nl,
YN<>'n',
write("Введи элемент: "),
readInt(X),nl,
input(T).
input([]):-
write("ввод закончен"),nl.
output([]).
output([H|T]):-
write(H),write(" "),
output(T).
shift([],[]).
shift([H|T],[E|L]):-
getlast([H|T],_,E),
deletelast([H|T],L).
getlast([],E,E).
getlast([H|T],_,E):-
getlast(T,H,E).
deletelast([_|[]],[]).
deletelast([H|T1],[H|T2]):-
deletelast(T1,T2).
parLen([]).
parLen([_,_|Tail]):-parLen(Tail).
chArPL([_|[]],_).
chArPL([H,T|TT],N):-
N=T-H,
chArPL([T|TT],N).
getLenList([],N):-N=0.
getLenList([_|L],N):-
getLenList(L,N1),
N=N1+1.
chpel([],_).
chpel([Hi|[Hii|Tii]],[Ho|To]):-
Hi=Hii, Ho=Hi, chpel([Hi|Tii],[Ho|To]).
chpel([Hi|Ti],[Hi|To]):-
chpel(Ti,To).
goal
L=[1,1,2,3,4,4,5,6,6],
output(L),nl,
chpel(L,L1),
output(L1),nl.