Stik dveh seznamov v prologu
Iz E-študij, proste zakladnice študentskega znanja
Stik dveh seznamov v prologu predstavlja način kako iz dveh ločenih seznamov ustvarimo enega samega tako, da prvemu na konec repa dodamo še drugi seznam.
?- stik([a,b,c],[d,e],S). S=[a,b,c,d,e]
S=[a,b,c,d,e]= [a,b,c|[d,e]] = [a,b,c]|[]]
^-v prazni seznam vstavimo 2. seznam
[H][ T ] [ y ] -----x------ --y-- [H][ T Y ]
stik([],Seznam,Seznam). %robni primer, če je en seznam prazen je drugi seznam že rezultat stik([Glava|Rep],Seznam2,[Glava|Rep3]):- stik(Rep,Seznam2,Rep3).
Primeri
?- stik([a,b,c],[d,e],S). S = [a,b,c,d,e]; no
?- stik(S1,S2,[a,b,c]). S1 = [], S2 = [a,b,c] ? ; S1 = [a], S2 = [b,c] ? ; S1 = [a,b], S2 = [c] ? ; S1 = [a,b,c], S2 = [] ? ; no
?- stik(S,_,_). S = [] ? ; S = [_A] ? ; S = [_A,_B] ? ; S = [_A,_B,_C] ? ; S = [_A,_B,_C,_D] ? yes
Iskanje poljubnega elementa v seznamu:
?- stik(_,[X|_],[a,b,c]). X = a ? ; X = b ? ; X = c ? ; no
?- stik(_,S1,[a,b,c]), stik(Pods,_,S1). S1 = [a,b,c], Pods = [] ? ; S1 = [a,b,c], Pods = [a] ? ; S1 = [a,b,c], Pods = [a,b] ? ; S1 = [a,b,c], Pods = [a,b,c] ? ; S1 = [b,c], Pods = [] ? ; S1 = [b,c], Pods = [b] ? ; S1 = [b,c], Pods = [b,c] ? ; S1 = [c], Pods = [] ? ; S1 = [c], Pods = [c] ? ; S1 = [], Pods = [] ? ; no
Lahko definiramo novo relacijo
podseznam(P,S):- stik(_,S1,S), stik(P,_,S1).
?- podseznam(Pods,[a,b,c]). Pods = [] ? ; Pods = [a] ? ; Pods = [a,b] ? ; Pods = [a,b,c] ? ; Pods = [] ? ; Pods = [b] ? ; Pods = [b,c] ? ; Pods = [] ? ; Pods = [c] ? ; Pods = [] ? ; no
?- stik(S1,[a,b],S). S = [a,b], S1 = [] ? ; S = [_A,a,b], S1 = [_A] ? ; S = [_A,_B,a,b], S1 = [_A,_B] ? ; S = [_A,_B,_C,a,b], S1 = [_A,_B,_C] ? ; S = [_A,_B,_C,_D,a,b], S1 = [_A,_B,_C,_D] ? yes