Я пытаюсь удалить всех членов списка, появляющихся после подсписка [z, z, z] в Прологе.
f.ex removeafterZZZ([a,b,c,z,z,z,a], X) -> X = [a,b,c,z,z,z].
У меня есть методы sublist и join учитывая.
% first argument is a sublist of the second argument
sublist(Sublist, List):-
join(_List1, List2, List),
join(Sublist,_List3, List2).
% we get the list in third argument by joining lists from first two arguments
join([], L, L).
join([Head | Tail1], List2, [Head | Tail3]):-
join(Tail1, List2, Tail3).
Итак, я думал о 3 возможных «вариантах» ввода:
1) []
2) что-то вроде [a, b, c], [a, b, c, z, z], где автоматически выводится == input
3) что-то вроде [a, b, c, z, z, z, a]
Итак, я подумал о 3 правилах:
removeafterZZZ([],[]). %for empty lists
removeafterZZZ(List,X) := %for lists with no [z,z,z] sublist
not ( sublist ( [z,z,z], List)) ,
X = List.
removeafterZZZ([H|T], X) := %for lists with sublist [z,z,z]
join(H, X, X), %join the head of list with X
removeafterZZZ(T, X). %call function again with tail
Так что это, очевидно, не работает таким образом, как я узнаю, что я уже записал z, z, z в список вывода? Должен ли я использовать счетчик? Как?