Brisanje iz seznama v prologu

Iz E-študij, proste zakladnice študentskega znanja

Skoči na: navigacija, iskanje

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).
Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja