Brisanje iz seznama v prologu
Iz E-študij, proste zakladnice študentskega znanja
Procedura brisi odstrani element iz seznama in ga vrne v S.
brisi(Element,[Element|Rep],Rep). brisi(Element,[Glava|Rep],[Glava|Rep1]) :- brisi(Element,Rep,Rep1).
- Primer
?- brisi(c,[a,b,c,d,e],S). S = [a,b,d,e]
Iskanje ?- brisi(c,[a,b,c,d,e],S).:
S = [a|Rep1'] brisi(c,[b,c,d,e],Rep1') Rep1' = [b|Rep1''] brisi(c,[c,d,e],Rep1'') %robni pogoj Rep1'' = [d,e] Rep1' = [b,d,e] S = [a,b,d,e]
Izboljšano brisanje
Pri izboljšanem brisanju nam ob brisanju elementa, ki v seznamu ne obstaja, namesto "no" vrne enak seznam.
Dodati je treba robni primer:
brisi(_,[],[]). brisi(Element,[Element|Rep],Rep). brisi(Element,[Glava|Rep],[Glava|Rep1]) :- brisi(Element,Rep,Rep1).
Brisanje večih znakov iz seznama
Ob nespremenjeni funkciji nam briše samo po en znak iz seznama.
?- brisi(c,[a,b,c,d,c,e,c,f],S). S = [a,b,d,c,e,c,f]; S = [a,b,c,d,e,c,f]; S = [a,b,c,d,c,e,f]; S = [a,b,c,d,c,e,c,f]; no
Popraviti je potrebno splošni primer - preveriti je potrebno še rep:
brisi(_,[],[]). brisi(Element,[Element|Rep],Rep1):- brisi(Element,Rep,Rep1). brisi(Element,[Glava|Rep],[Glava|Rep1]) :- brisi(Element,Rep,Rep1).
?- brisi(c,[a,b,c,d,c,e,c,f],S). S = [a,b,d,e,f]; %zahtevamo s podpičjem še drug način reševanja S = [a,b,d,e,c,f]; %avtomatsko vračanje, zadnjega c ne odstrani S = [a,b,d,c,e,f]; %avtomatsko vračanje, predzadnjega c ne odstrani, naprej deluje normalno S = [a,b,d,c,e,c,f]; %avt. vrač., prejšnjo "normalno" reševanje reši na drug način . .
Odstranitev neželenih rezultatov
Želimo, da nam takoj po 1. odgovoru vrne "no", ker v drugih odgovorih obstajajo še brisani znaki:
Stavek ne preverja ali sta glava in element različna. Potrebujemo pogoj, ki preveri če sta glava in element različna.
brisi(_,[],[]). brisi(Element,[Element|Rep],Rep1):- brisi(Element,Rep,Rep1). brisi(Element,[Glava|Rep],[Glava|Rep1]) :- Element \== Glava, %neenakost, morata biti različna brisi(Element,Rep,Rep1).