J'essaie d'enlever tous les membres d'une liste apparaissant après une sous-liste [z,z,z] en Prologue. f.ex removeafterZZZ([a,b,c,z,z,z,a], X) -> X = [a,b,c,z,z,z].
J'ai les méthodes sous-liste y rejoindre donné.
% 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).
J'ai donc réfléchi à trois "options" d'entrée possibles :
1) []
2) quelque chose comme [a,b,c], [a,b,c,z,z] , où la sortie serait automatiquement == entrée
3) quelque chose comme [a,b,c,z,z,z,a]
J'ai donc pensé à 3 règles :
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
Cela ne fonctionne évidemment pas de cette façon, comment puis-je savoir si j'ai déjà écrit z,z,z dans la liste de sortie ? Devrais-je utiliser un compteur ? Comment ?