member(H,[H|_]). %czlonek_listy
member(X,[_|T]):-member(X,T).

conc([],L,L). %konkatenacja_list
conc([H1|T1],L2,[H1|T2]):-conc(T1,L2,T2).

add(L,X,[X|L]). %dodawanie_elementy_na_poczatek_listy

nextElement([H|[H1|_]],H,H1). %nastepny_element_po_podanym_na_liscie
nextElement([_|T],X,Y):-nextElement(T,X,Y).

delElement([],_,[]):-!. %usuwa_konkretny_element_z_listy
delElement([H|T],H,T):-!.
delElement([H|T],X,[H|L]):-delElement(T,X,L).

delNext([],_,[]). %usuwa_nastepny_element_na_liscie_po_podanym
delNext(L1,X,L2):-nextElement(L1,X,Y),delElement(L1,Y,L2).

ileEl([],_,0). %ilosc_wystapien_elementu
ileEl([H|T],H,N):-ileEl(T,H,N1),N is N1+1,!.
ileEl([_|T],X,N):-ileEl(T,X,N).

glowy([],[]). %tworzy_liste_glow_z_listy_list
glowy([[H|_]|T],[H|T2]):-glowy(T,T2).

suma([],0). %suma_el_listy
suma([H|T],N):-suma(T,N1),N is N1+H.

ilosc([],0). %ilosc_el_listy
ilosc([_|T],N):-ilosc(T,N1),N is N1+1.

srednia(X,N):-suma(X,S),ilosc(X,I),!,N is S/I.

doubled(L):-conc(X,X,L). %lista_zawierajaca_dwie_identyczne_podlisty

stars(0,[]):-!. %generuje_liste_N_gwiazdek
stars(N,[*|T]):-N1 is N-1,stars(N1,T).

gwiazdki(X,N,L):-ilosc(X,N1),N2 is N-N1,stars(N2,S),conc(X,S,L). %dopelnia_gwiazdkami

odwr([],[]). %odwraca_kolejnosc_listy
odwr([H|T],L):-odwr(T,X),conc(X,[H],L).

palindrom(X):-odwr(X,X).

addlast(X,[],[X]). %dodaje_na_koncu_listy
addlast(X,[H|T],[H|L]):-addlast(X,T,L).

ainm(X,[],[X]). %add_if_not_member
ainm(X,L,L):-member(X,L),!.
ainm(X,L,[X|L]).

filtr([],[]). %usuwa_podwojne_wystapienia_elementu_z_listy
filtr([H|T],L):-filtr(T,L2),ainm(H,L2,L),!.

parzyste([],[]). %wypisuje_tylko_parzyste_elementy_do_listy
parzyste([H|T],L):-parzyste(T,L2),ainp(H,L2,L),!.

ainp(X,[],[X]). %add_if_not_parity
ainp(X,L,L):-X2 is X mod 2,X2=:=1,!.
ainp(X,L,[X|L]).

ucount(X,Y):-filtr(X,X1),ilosc(X1,Y). %liczy_unikalne_elementy
