Sie sind auf Seite 1von 15

Dr.

Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6


Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Predavanje 6
Funkcijske relacije i funkcije (preslikavanja)

Funkcijske relacije su još jedna važna podvrsta binarnih relacija. To su relacije kod kojih svaki
element izvornog skupa može biti u relaciji najviše sa jednim elementom odredišnog skupa. Njihov
značaj je u tome što su one osnovni gradivni mehanizam za formalno definiranje funkcija odnosno
preslikavanja, koje predstavljaju jedan od temeljnih matematskih pojmova. Neformalno, funkcija iz
nekog skupa A u neki skup B predstavlja pravilo pridruživanja koje nekim ili svim elementima ∈ A
pridružuje neki jedinstven element ( ) ∈ B. Pri tome, element a nazivamo original ili argument, a
njegova slika dobijena pomoću funkcije . Skup A naziva se izvorni skup funkcije , dok se skup B
naziva odredišni skup ili kodomen funkcije . Ukoliko neki element ∈ A ima svoj pridruženi element
( ), kaže se da je funkcija definirana za argument , u suprotnom se kaže da je nedefinirana za
argument . Skup svih vrijednosti ∈ A za koje je funkcija definirana naziva se domen funkcije, dok se
skup svih vrijednosti ∈ B koji su slika nekog elementa iz A (tj. za koje postoji ∈ A takav da je
= ( )) naziva rang funkcije. Jasno je da je domen funkcije podskup njenog izvornog skupa, a rang
podskup njenog odredišnog skupa (kodomena). U slučaju da je funkcija definirana za sve elemente
skupa A (tj. ukoliko je njen domen jednak izvornom skupu), govorimo o potpunoj funkciji, i kažemo da
je funkcija sa (a ne “iz”) skupa A u skup B, što obilježavamo kao : A → B. Ukoliko to nije ispunjeno,
govorimo o parcijalnoj (nepotpunoj) funkciji. U matematici se prećutno podrazumijeva da kada se
kaže samo “funkcija”, tada se misli na potpunu funkciju, dok se u slučajevima kada se radi sa parcijalnim
funkcijama, ta činjenica posebno naglašava.
Formalno se funkcija (ne nužno potpuna) definira kao uređena trojka = (ℱ, A, B), gdje su A i B
neka dva skupa, koji respektivno predstavljaju izvorni i odredišni skup funkcije, dok je ℱ ⊆ A × B neka
funkcijska relacija između A i B. Činjenicu da je ( , ) ∈ ℱ zapisujemo kao = ( ) i kažemo da funkcija
elementu pridružuje element = ( ). Činjenica da je relacija ℱ funkcijska garantira da je za svako
∈ A vrijednost ( ), ukoliko uopće postoji, jedinstveno određena. Sama relacija ℱ naziva se graf
funkcije . Odnosno, graf funkcije je skup definiran kao
ℱ = {( , (a)) | ∈ A}
Ukoliko je skup ℱ takav da se može interpretirati kao skup tačaka u ravni (npr. tačaka izraženih preko
Descartesovih koordinata), tada takvu interpretaciju nazivamo grafik (ili grafikon) funkcije f. Definira
se i slika skupa X ⊆ A pomoću funkcije kao (X) = { ( ) | ∈ X}, tako da je rang funkcije zapravo slika
njenog domena.

U nekim definicijama, pojam funkcije se u potpunosti poistovjećuje sa skupom ℱ, odnosno ne pravi


se razlika između same funkcije i njenog grafa. Međutim, takva definicija ima svojih nedostataka i treba
je izbjegavati. Recimo, iz samog grafa funkcije nije moguće odrediti šta je njen kodomen (mada je
moguće odrediti njen domen i rang), a ukoliko se radi o parcijalnoj funkciji, nije moguće ni odrediti šta
je njen izvorni skup (kod potpunih funkcija, on je svakako jednak domenu). Interesantno je da se u nekim
verzijama teorije skupova pojam funkcije također uzima kao elementaran pojam koji se ne definira (slično
pojmu skupa). U takvim teorijama, uređene -torke se definiraju posredno preko funkcija, pa se uređena
-torka ( , , ..., ) definira se kao funkcija sa skupa {1, 2, ..., } u skup { , , ..., } za koju vrijedi
(1) = , (2) = , ..., ( ) = , odnosno uređena n-torka se poistovjećuje sa onim što ćemo kasnije
definirati kao konačni niz. Bez obzira što takve definicije imaju izvjesnog opravdanja (inače ne bi ni bile
uvedene), mi ćemo se ipak držati definicije u kojoj se funkcije definiraju posredno, pomoću skupova.
Primijetimo i da definicija uređene n-torke kao funkcije implicitno podrazumijeva da je pojam skupa
prirodnih brojeva od ranije poznat, dok definicija prema Kuratowskom to ne zahtijeva, što je njena
bitna prednost.
Ukoliko je domen funkcije konačan skup A = { , , , ..., }, tada (potpunu) funkciju : A → (A)
često obilježavamo i kao

f= ( ) ( ) ( ) ( )
Skup svih funkcija sa skupa B u skup A obilježavamo sa A , odnosno A = { | : B → A}. Na
primjer, ukoliko je A = {0, 1} i B = { , , }, imamo

1
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

A ={ , , , , , , , }

Motivacija za ovu, pomalo neočekivanu definiciju, može se naći u činjenici da u slučaju kada su A i B
konačni skupovi, vrijedi #(A ) = #A# .

Ukoliko je domen neke funkcije neki skup uređenih n-torki, npr. Descartesov proizvod više skupova
A × A × ... × A , tada su originali uređene n-torke oblika ( , , ..., ) ∈ A × A × ... × A . Da bismo
pojednostavili pisanje, po dogovoru umjesto (( , , ..., )) pišemo prosto ( , , ..., ) i kažemo da
je funkcija funkcija sa argumenata, pri čemu pod argumentima ovdje podrazumijevamo koordinate
uređene -torke koja predstavlja original.

Za funkciju kažemo da je injektivna ili da je injekcija (“n” i “j” se čita odvojeno) ukoliko se različiti
elementi iz A preslikavaju u različite elemente iz B, odnosno ukoliko za svaka dva elementa i iz A
vrijedi ≠ ⇒ ( ) ≠ ( ). Tako, na primjer, funkcija sa ℝ u ℝ, koja svakom elementu ∈ ℝ
pridružuje vrijednost ( ) = x, nije injektivna, jer je 1 ≠ −1, a ipak je (1) = (−1). Injektivne funkcije
se još nazivaju i funkcije jedan-na-jedan (engl. one-to-one). Za funkciju kažemo da je sirjektivna
odnosno da je sirjekcija ukoliko je svaki element iz B slika nekog elementa iz A, odnosno ukoliko
vrijedi (A) = B. Drugim riječima, funkcija je sirjektivna ukoliko je njen rang jednak njenom kodomenu.
Ukoliko je funkcija sa kodomenom B sirjektivna, kažemo da je to funkcija na (engl. onto) skup B (a ne
“u” skup B). Funkcija je obostrano jednoznačna, ili bijektivna, ili, prosto bijekcija, ukoliko je
istovremeno injektivna i sirjektivna.

Bitno je napomenuti da iz samog grafa funkcije (odnosno iz poznatog pravila pridruživanja, što se
svodi na isto) nije moguće zaključiti da li je funkcija sirjekcija ili ne, dok se eksplicitno ne specificira šta je
njen kodomen, s obzirom da se kodomen nikako ne može saznati iz grafa funkcije. Drugim riječima,
pojam sirjekcije je relativan u odnosu na zadani kodomen. Na primjer, funkcija sa skupa ℝ zadana pravilom
pridruživanja ( ) = nije sirjekcija ukoliko se zada da je njen kodomen također ℝ (s obzirom da
recimo − nije slika niti jednog elementa ℝ), ali jeste sirjekcija ukoliko se zada da je njen kodomen skup
nenegativnih realnih brojeva ℝ . Dakle, uz isto pravilo pridruživanja, ova funkcija nije sirjekcija ako je
posmatramo kao funkciju : ℝ → ℝ, ali jeste sirjekcija ako je posmatramo kao funkciju : ℝ → ℝ
(odnosno ova funkcija nije funkcija na ℝ nego samo u ℝ, ali jeste funkcija na ℝ ). Iz istog razloga, ni o
bijektivnosti funkcije ne možemo govoriti ukoliko se eksplicitno ne specificira šta je njen kodomen.

Uređena trojka (ℱ , B, A), gdje je ℱ inverzna relacija relacije ℱ, naziva se inverzija funkcije .
Ukoliko je ℱ također funkcijska relacija, tako da ova trojka ispunjava uvjete da može biti funkcija,
tada se ona naziva inverzna funkcija funkcije , i obilježava sa . Dakle, = (ℱ , B, A). Ukoliko
inverzna funkcija postoji, tada iz ( ) = slijedi ( ) = . Ukoliko se insistira da inverzna funkcija
mora biti potpuna funkcija, tada inverzna funkcija funkcije postoji ako i samo ako je bijekcija. Ukoliko
se ne insistira na potpunosti inverzne funkcije, tada je potreban i dovoljan uvjet za egzistenciju
injektivnost funkcije .

U slučajevima kada inverzna funkcija ne postoji (ni kao nepotpuna funkcija), uobičajeno je da se sa
(b) označava skup svih elemenata ∈ A za koje je ( ) = , odnosno (b) = { | ∈ A ∧ ( ) = }.
Na primjer, za funkciju : ℝ → ℝ zadanu pravilom ( ) = inverzna funkcija ne postoji (s obzirom da
ova funkcija nije bijekcija, jer niti je injekcija niti je sirjekcija), ali ipak pišemo (4) = {−2, 2},
(0) = {0} i (−1) = ∅. Tako, možemo posmatrati kao funkciju sa skupa B u partitivni skup
skupa A, odnosno : B → (A). Takvu funkciju nazivamo generalizirana inverzna funkcija funkcije .

Restrikcija (ili suženje) funkcije = (ℱ, A, B) na domen A ⊂ A je funkcija = (ℱ , A , B) za koju


vrijedi ℱ ⊂ ℱ, odnosno koja je takva da za svaki element a ∈ A vrijedi ( ) = ( ). Ako je
restrikcija funkcije , tada isto kažemo da je ekstenzija (ili proširenje) funkcije na domen A.

U slučajevima kada ne postoji inverzna funkcija funkcije , uvijek je moguće naći inverznu funkciju
neke restrikcije funkcije na neki domen A ⊂ A. Pri tome se, za različite restrikcije, mogu dobiti
različite inverzne funkcije. Na primjer, iako funkcija : ℝ → ℝ zadana pravilom ( ) = nema inverznu
funkciju, njene restrikcije : ℝ → ℝ i : ℝ → ℝ gdje su ℝ i ℝ skupovi nenegativnih i nepozitivnih
realnih brojeva respektivno, a koje su zadane istim pravilima ( ) = i ( ) = , imaju respektivno
inverzne funkcije date pravilima ( )= i ( ) = − . U malo slobodnijem izražavanju, ovako
definirane funkcije i također nazivamo inverzne funkcije funkcije f, iako je jasno da to nije u

2
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

potpunosti korektno. Ovaj primjer jasno ilustrira da je za potpunu specifikaciju funkcije potrebno
specificirati ne samo pravilo po kojem se vrši pridruživanje, nego i domen i kodomen.

Za element ∈ A kažemo da je fiksna tačka funkcije f ukoliko vrijedi ( ) = . Na primjer, funkcija


: ℝ → ℝ zadana pravilom ( ) = − 6 + 12 − 6 ima tri fiksne tačke = 1, = 2 i = 3. Skup X ⊆ A
za koji vrijedi (X) = X naziva se invarijanta funkcije . Svi elementi invarijante mogu ali ne moraju biti
fiksne tačke. Na primjer, skup X = {2, 6} je invarijanta funkcije : ℝ → ℝ zadane pravilom ( ) = 8 −
(jer je (2) = 6 i (6) = 2, pa je (X) = X), iako niti = 2 niti = 6 nisu fiksne tačke ove funkcije (jedina
njena fiksna tačka je x = 4). Za bijektivnu funkciju sa skupa A u skup A, čitav domen A je invarijanta.

Pod proizvodom (produktom) ili kompozicijom funkcija = (ℱ , A, B) i = (ℱ , B, C), u oznaci


○ , smatramo funkciju ○ = (ℱ ○ ℱ , A, C). Dakle, ako je : A → B i : B → C, tada je ○ : A → C,
pri čemu je ( ○ )( ) = ( ( )). Produkt funkcija u općem slučaju nije komutativan, ali je uvijek
asocijativan. Treba paziti da ove oznake nisu konzistentne u svoj literaturi, jer neki autori definiraju
produkt ○ onako kako je ovdje definiran produkt ○ , odnosno ( ○ )( ) = ( ( )).

Funkciju ( ) definiranu rekurzivnim pravilom ( ) = ( ) ○ uz početni uvjet ( ) = nazivamo


-ti stepen odnosno -ta iteracija funkcije . Tako vrijedi ( ) ( ) = ( ( )), ( ) ( ) = ( ( ( ))) i,
općenito, ( ) ( ) = ( ( ) ( )). Funkcija ( ) za koju vrijedi ( ) = nazivamo identička funkcija (za
njeno potpuno određenje, neophodno je specificirati i odgovarajući domen). Korisno je usvojiti da je
( )
( ) = ( ). Lako je provjeriti da vrijedi ○ = ○ = .

Nekim vrstama funkcijama daju se i posebna imena. Tako se, na primjer, funkcija : {1, 2, ..., } → A
naziva konačni niz (konačna sekvenca) u skupu A, dok se funkcija : ℕ → A naziva beskonačni niz
(beskonačna sekvenca), ili samo niz (sekvenca). U oba slučaja, umjesto ( ) tipično pišemo .

Funkcije čiji su domen i kodomen neki skupovi brojeva obično se zadaju nekim izrazom koji
definira kako se za zadanu vrijednost x računa vrijednost funkcije ( ), recimo izrazom poput
( ) = + 5. Međutim, izuzetno je značajno razlikovati funkciju i vrijednost funkcije za neku zadanu
vrijednost , koju obilježavamo sa f (x). Recimo, u navedenom primjeru, nipošto ne treba shvatiti da je
sama funkcija jednaka izrazu + 5, nego je vrijednost funkcije f za zadanu vrijednost argumenta x
jednaka vrijednosti izraza + 5. To jasno govori i oznaka ( ) koju jasno čitamo kao “vrijednost
funkcije za vrijednost argumenta ”. Dakle, ( ) je broj (uz pretpostavku da je kodomen funkcije
neki skup brojeva), dok nije broj, nego funkcija. Međutim, kako ćemo zapisati čemu je jednaka sama
funkcija ukoliko znamo izraz koji definira vrijednost ( )? Dugo vremena, matematika nije imala neku
konkretnu simboliku pomoću koje bi se to moglo zapisati. Rješenje ovog problema prvi je predložio
logičar A. Church u formi tzv. λ-operatora, koji se naziva i operator apstrakcije. Ovaj neobični
operator od izraza pravi funkciju. Koristi se u obliku λ promjenljiva . izraz, koji predstavlja funkciju koja
navedenu promjenljivu preslikava u vrijednost određenu navedenim izrazom. Recimo, ukoliko je
( ) = + 5, možemo pisati

=λ . +5

Dakle, izraz λ . + 5 predstavlja funkciju koja primijenjena na neki argument, daje vrijednost tog
argumenta dignutog na kvadrat i uvećanog za 5. Napomenimo da je ime promjenljive navedeno iza
λ-operatora formalne prirode, odnosno stvarno ime promjenljive je potpuno nebitno, tako da izrazi
λ . + 5 i λ . + 5 predstavljaju posve istu funkciju. Za razliku od toga, primijetimo da ( ) i ( )
nisu jedno te isto: ( ) je vrijednost funkcije za vrijednost argumenta , dok je ( ) vrijednost funkcije
za vrijednost argumenta , a vrijednosti argumenata i ne moraju biti iste.

Izrazi sa λ-operatorom mogu se koristiti u bilo kojem kontekstu gdje se može koristiti ime ma kakve
funkcije, tako da je, recimo, izraz poput (λ . + 5)(3) posve legalan. U osnovi, on je identičan izrazu
(3) u kojem je funkcija definirana izrazom ( ) = + 5 (dakle, njegova je vrijednost 4), samo što
u njemu nismo posebno imenovali funkciju koja se primjenjuje na argument 3. Stoga se funkcije
definirane λ-operatorom nazivaju i anonimne funkcije (a često i λ-funkcije, po λ-operatoru). Očigledno,
iz prikazane neformalne definicije λ-operatora slijedi λ . f ( ) = f, tako da je, u izvjesnom smislu,
λ-operator inverzan operatoru primjene funkcije na svoj argument.

U mnogim slučajevima, iz konteksta je jasno da li se misli na izraz ili funkciju definiranu tim
izrazom, tako da i bez upotrebe λ-operatora ne dolazi do zabune. Međutim, do zabune može doći kada

3
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

budemo razmatrali neke operacije koje se primjenjuju na funkcije kao cjeline (a ne samo na njihove
individualne vrijednosti), kao i operacije koje različito djeluju na brojeve i na funkcije, te će nam tada
λ-operator dobro poslužiti.
Potreba za λ-operatorom javlja se u mnogim programskim jezicima, pogotovo u programskim
jezicima koji spadaju u skupinu tzv. funkcionalnih programskih jezika (kao što su, recimo, ML, LISP i
Haskell). Potreba za razlikovanjem funkcija i izraza kojim se opisuje preslikavanje koje funkcija vrši
javlja se i u nekim posve klasičnim programskim jezicima (kao što je, recimo, C++), tako da danas
većina modernih programskih jezika poznaje neku formu λ-operatora. U jezik C++ podrška za
anonimne funkcije uvedena dosta kasno (tek u reviziji C++11), što je u mnogim primjenama ranije jako
nedostajalo. Recimo, sve do uvođenja anonimnih funkcija, svaka funkcija koju želimo proslijediti nekoj
drugoj funkciji na obradu morala prethodno imenovati, što je dobro poznato svima koji su u
programskom jeziku C++ koristili funkcije iz biblioteke “algorithm”.
Interesantnu situaciju dobijamo ukoliko kaskadno primijenimo λ-operator. Razmotrimo, na primjer,
izraz = λ . λ . + i ispitajmo šta je, recimo, (3). Prema definiciji λ-operatora, direktno slijedi
f (3) = λ . 3 + . Dakle, primjena funkcije na vrijednost argumenta 3 daje kao rezultat izraz λ . 3 +
koji je i sam funkcija. Imamo interesantnu situaciju: je funkcija koja kao svoj rezultat daje drugu
funkciju (što, naravno, matematika ne zabranjuje, jer nema nikakvog razloga zašto kodomen neke
funkcije ne bi mogao biti neki skup funkcija). Stoga, ima smisla pitati šta je rezultat izraza (3)(2) i
odgovor je, naravno, 3 + , odnosno 5. Općenito je ( )( ) = + . Jasno je da možemo pisati i nešto
poput = (3), tako da je ( ) = 3 + , ili jednakost poput (λ . λ . + )(3)(2) = 5. Drugim riječima,
se, u neku ruku može posmatrati kao funkcija od dva argumenta, ali koji se ne primjenjuju simultano
(jednovremeno) nego sukcesivno (uzastopno). U nekim granama matematičke logike, kao što je recimo
tzv. λ-račun (engl. λ-calculus) s kojim ćemo se ukratko upoznati kasnije, smatra se da je prirodna
interpretacija izraza poput ( , ) upravo ( )( ). Inače, interpretaciju po kojoj se funkcije koje zavise
od više argumenata poput ( , , ..., ) interpretiraju kao kaskada ( )( ) ... ( ) (za razliku od
uobičajene interpretacije prema kojoj se radi o funkciji čiji je argument uređena -torka ( , , ..., ))
popularizirao je logičar H. Curry, tako da se opisana interpretacija često prema njegovom imenu naziva
currying (mada je ona zapravo prvi put predložena od strane M. Schönfinkela). Značajna prednost
ovakve interpretacije leži u činjenici da se pomoću nje lako tretiraju funkcije kod kojih broj argumenata
nije unaprijed određen, što je teško izvesti u klasičnoj interprretaciji.
Pomoću λ-operatora lako je kreirati ne samo funkcije koje kao rezultat daju druge funkcije, nego i
funkcije koje kao svoje argumente primaju druge funkcije (tj. čiji je domen neki skup funkcija). Takve
funkcije se nazivaju funkcije višeg reda, a u nekim oblastima matematike (npr. u funkcionalnoj analizi)
i operatori (specijalno, ako je kodomen takve funkcije neki skup brojeva, ona se naziva funkcional).
Kao primjer, uzmimo recimo izraz poput = λ . λ . ( ( ( ))). Da bismo vidjeli šta predstavlja ovaj
izraz, pretpostavimo da je ℎ neka funkcija. Tada je (ℎ) = λ . ℎ(ℎ(ℎ( ))). Očigledno, (ℎ) je ponovo
funkcija i to takva da vrijedi (ℎ)( ) = ℎ(ℎ(ℎ( ))). Dakle, (ℎ) je funkcija koja primijenjena na argument
daje isti rezultat kao funkcija ℎ primijenjena tri puta uzastopno (funkciju mogli bismo čitati kao
“triput”). Primijetimo da funkcija kao svoj argument zahtijeva ponovo neku funkciju (lako se vidi da
bi izraz poput (2) bio besmislen), tako da je funkcija višeg reda.

Razni programski jezici koji posjeduju λ-operator obično koriste drugačiju (i često jasniju) sintaksu
od sintakse koju je predvidio Church. Na primjer, matematički orjentirani programski jezik Maple
umjesto neintuitivne sintakse λ promjenljiva . izraz koristi logičniju sintaksu promjenljiva → izraz (gotovo
istu sintaksu \ promjenljiva → izraz koristi i programski jezik Haskell). Tako, prema sintaksi jezika
Maple možemo pisati
= → +5
Stoga je, u Maple-sintaksi, izraz poput ( → + 5)(3) legalan (i vrijednost mu je jednaka 14). Jezik
JavaScript za definiranje anonimnih funkcija koristi sintaksu function(promjenljiva) { return izraz; }
koja je isto jasna i intuitivna (mada ne tako kompaktna), dok jezik C++ zbog potrebe za tipizacijom za
istu svrhu koristi sintaksu [](tip_promjenljive promjenljiva) { return izraz; }. Uglavnom, ubuduće
ćemo λ-operator ćemo koristiti u slučajevima kada je izrazito bitno praviti razliku između funkcije i
izraza kojim se opisuje preslikavanje koje funkcija vrši (i to samo onda kada iz konteksta nije posve
jasno da se zaista misli na funkciju), ili kada nije jasno šta je argument te funkcije. Pri tome ćemo
koristiti kako izvornu Churchovu λ -sintaksu, tako i pojednostavljenu Maple-sintaksu.

4
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Relacije poretka i uređeni skupovi

Kao što smo vidjeli, relacije ekvivalencije na izvjestan način uopćavaju odnos jednakosti. S druge
strane, relacije poretka uopćavaju odnose poput odnosa “biti manji”, “biti veći”, “biti djeljiv sa”, “biti
podskup od”, itd. Formalno iskazano, za neku relaciju kažemo da je relacija poretka ukoliko je ona
antisimetrična i tranzitivna (u ponekim definicijama se od relacije poretka zahtijeva još i refleksivnost).
Ukoliko je ona pored toga i jako antisimetrična, tada kažemo da se radi o relaciji strogog poretka
(stoga relacija strogog poretka ne može biti refleksivna).
Relacije poretka odnosno strogog poretka obično označavamo specijalnim simbolima poput “≼”
odnosno “≺”, tako da umjesto ℛ tipično pišemo ≼ odnosno ≺ . Svakoj relaciji poretka “≼”
koja nije stroga možemo pridružiti neku relaciju strogog poretka “≺” tako što ćemo definirati da je
≺ ako i samo ako je ≼ i ≠ . Za takvu relaciju strogog poretka kažemo da je pridružena relaciji
poretka “≺”. Slično, svakoj relaciji strogog poretka “≺” možemo pridružiti relaciju nestrogog poretka
“≼” tako što ćemo definirati da je ≼ ako i samo ako je ≺ ili = .
Neka je “≼” neka relacija poretka i “≺” njoj pridružena relacija strogog poretka. Ukoliko je ≺ ,
kažemo da se element nalazi ispred elementa (u odnosu na posmatranu relaciju poretka), odnosno
da se element nalazi iza elementa . Za element c kažemo da se nalazi između elemenata i (u
odnosu na posmatranu relaciju poretka) ukoliko vrijedi ≼ i ≼ , dok za elemente i kažemo da
su susjedni ukoliko ne postoji element različit i od i od koji bi se nalazio između elemenata i .
Najzad, kažemo da je element neposredni prethodnik elementu ukoliko je ≺ i ukoliko su pored
toga elementi i susjedni. Analogno se definira i neposredni sljedbenik.
Ukoliko je relacija poretka ili strogog poretka još i linearna, tada govorimo da se radi o relaciji
potpunog poretka, dok u suprotnom govorimo o relaciji parcijalnog (djelimičnog) poretka. Drugim
riječima, kod relacije potpunog poretka svaka dva različita elementa su uporediva, tj. za svaka dva
različita elementa i vrijedi ili ≼ , ili ≼ , dok kod relacije parcijalnog poretka to ne mora
vrijediti. Kod relacija parcijalnog poretka, ukoliko za par različitih elemenata i ne vrijedi niti ≼ ,
niti ≼ , tada kažemo da su i neuporedivi u odnosu na razmatranu relaciju poretka. Ukoliko je za
neku relaciju parcijalnog poretka pripadna relacija “biti neuporediv” tranzitivna (tj. ukoliko kad god su
i kao i i neuporedivi u odnosu na tu relaciju slijedi da su i a i c također neuporedivi u odnosu na
tu relaciju), tada govorimo o relaciji slabog poretka. Treba napomenuti da većina programskih jezika
koji podržavaju funkcije za sortiranje kolekcija objekata po proizvoljnom kriteriju ne insistira da relacija
kojom se zadaje kriterij sortiranja mora biti relacija potpunog poretka, ali svi zahtijevaju da to bude
barem relacija slabog poretka (i to obično strogog slabog poretka), jer je vrlo upitno šta uopće znači
sortirati kolekciju u odnosu na djelimični poredak koji nije čak ni slabi poredak.
Navedimo nekoliko karakterističnih relacija poretka. Odnosi “biti manji od ili jednak” (“≤”), “biti
veći od ili jednak” (“≥”), “biti manji od” (“<”) i “biti veći od” (“>”) u nekom skupu brojeva predstavljaju
relacije poretka (i to potpunog poretka), pri čemu odnosi “<” i “>” pored toga predstavljaju i relacije
strogog poretka. Odnosi “biti podskup od” (“⊆”) i “biti pravi podskup od” (“⊂”) u nekom skupu skupova
(ne smijemo reći u “skupu svih skupova”, jer ćemo vidjeti kasnije da takav pojam nije logički održiv)
predstavljaju također relacije poretka, ali samo parcijalnog poretka, s obzirom da za proizvoljan par
skupova A i B ne mora vrijediti niti A ⊆ B, niti B ⊆ A (odnosno, dva skupa ne moraju biti uporediva u
odnosu na ove relacije, npr. skupovi A = {1, 3} i B = {3, 4}). Ove dvije relacije nisu čak ni relacije slabog
poretka. Zaista, uzmimo na primjer skupove A = {1, 3}, B = {3, 4} i C = {1, 2, 3}. U ovom slučaju A i B nisu
međusobno uporedivi u odnosu na ove relacije, kao ni skupovi B i C, a ipak je A ⊂ B. Inače, odnos “biti
podskup od” naziva se i relacija inkluzije. Odnos “biti djelilac od” (“ | ”) u skupu prirodnih brojeva
također predstavlja relaciju (nestrogog) parcijalnog poretka, koja također nije relacija slabog poretka.
Primjer relacije (strogog) slabog poretka a koja nije relacija potpunog poretka je relacija u skupu
kompleksnih brojeva prema kojoj je ≺ ako i samo ako je | | < | |. Ovo nije potpuni poredak jer
postoje neuporedivi parovi elemenata (to su oni što imaju isti modul (npr. + 3i i 3+2i). Međutim, ako
je neuporediv sa (u odnosu na ovu relaciju) i neuporediv sa , tada je jasno da je tada i
neuporediv sa , jer sva tri imaju isti modul.
Skup X zajedno sa relacijom poretka “≼” u skupu X ili, formalno, uređeni par (X, ≼), nazivamo
uređeni skup. U ovisnosti da li je “≼” relacija parcijalnog ili potpunog poretka, govorimo o parcijalno
(djelimično) uređenom skupu ili potpuno uređenom skupu. Parcijalno uređeni skup se još naziva i
poset (od engl. Partially Ordered Set), dok se potpuno uređen skup naziva i lanac. Lancem se također
zasniva i svaki podskup nekog uređenog skupa koji je u odnosu na razmatranu relaciju poretka
potpuno uređen.

5
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Poredak u konačnim parcijalno uređenim skupovima pregledno se prikazuje uz pomoć Hasseovih


dijagrama. Hasseovi dijagrami su zapravo reducirani streličasti dijagrami koji odgovaraju pripadnoj
relaciji poretka, u kojima su izostavljene sve petlje, koje su posljedica refleksivnosti, kao i sve strelice
koje su posljedica tranzitivnosti relacije. Drugim riječima, strelicama se spajaju samo elementi koji su
susjedni u odnosu na razmatranu relaciju. Na primjer, slika sa lijeve strane ispod prikazuje Hasseov
dijagram partitivnog skupa (A) skupa A = { , , } uređenog relacijom inkluzije (tj. odnosom “biti
podskup od”). S obzirom da su elementi skupa (A) i sami skupovi, radi usporedbe je sa desne strane
nacrtan Eulerov dijagram koji ilustrira istu situaciju. Sa aspekta preglednosti, prednost je očigledno na
strani Hasseovog dijagrama. Ukoliko usvojimo konvenciju da se oznaka elementa na dijagramu koji se
nalazi ispred nekog drugog elementa na dijagramu uvijek crta iznad tog drugog elementa (tj. ukoliko su
sve strelice na Hasseovom dijagramu usmjerene nagore), tada se strelice u dijagramu mogu potpuno
izostaviti. U slučaju potpuno uređenog skupa, Hasseov dijagram dobija oblik vertikalnog pravca
usmjerenog nagore.
{a, b, c} {a}

{a, b} {a, c}
a
{a, b} {a, c} {b, c}

{a, b, c}

{a} {c} b c
{b}
{b} {c}

{b, c}

Kao još jedan primjer, uzmimo relaciju poretka “ | ” na skupu A = {1, 2, 3, 5, 6, 10, 15, 30}, neformalno
opisanu odnosom “biti djelilac od”, a formalno skupom uređenih parova
{(1, 1), (1, 2), (1, 3), (1, 5), (1, 6), (1, 10), (1, 15), (1, 30), (2, 2), (2, 6),
(2, 10), (2, 30), (3, 3), (3, 6), (3,15),(3, 30), (5, 5), (5, 10), (5, 15),
(5, 30), (6, 6), (6, 30), (10, 10), (10, 30), (15, 15), (15, 30), (30, 30)}
Za potrebe crtanja Hasseovog dijagrama, posmatraju se samo parovi susjednih elemenata (u odnosu na
ovu relaciju), odnosno parovi (1, 2), (1, 3), (1, 5), (2, 6), (2, 10), (3, 6), (3, 15), (5, 10), (5, 15), (6, 30),
(10, 30) i (15, 3 ). Tako dobijamo Hasseov dijagram koji je vizuelno identičan dijagramu iz prethodnog
primjera, u kojem je izvršena zamjena ∅ ↔ 1, { } ↔ 2, { } ↔ 3, { } ↔ 5, { , } ↔ 6, { , } ↔ 10,
{ , } ↔ 15 i { , , } ↔ 30.

Prethodni primjer ukazuje na potrebu sljedeće definicije. Za dva uređena skupa (X, ≼ ) i (Y, ≼ )
kažemo da su izomorfni ukoliko je moguće izvršiti takvo preimenovanje elemenata skupa X u elemente
skupa Y da se nakon obavljenog preimenovanja i zamjene relacije “≼ ” relacijom “≼ ” očuva poredak,
odnosno, formalno rečeno, ukoliko postoji neko obostrano jednoznačno (bijektivno) preslikavanje : X → Y
(koje obavlja traženo preimenovanje) takvo da iz ≼ slijedi ( ) ≼ ( ). Samo preslikavanje
naziva se izomorfizam sa uređenog skupa (X, ≼ ) na (Y, ≼ ).

U prethodnom primjeru smo vidjeli da je skup A sa relacijom poretka “ | ” izomorfan nekom skupu
skupova sa relacijom poretka “⊆”. Ovo nije slučajnost, već pravilo. Naime, nije teško dokazati da je svaki
uređeni skup uvijek izomorfan sa nekim skupom skupova uređenim relacijom inkluzije. Jedan takav
izomorfizam moguće je lako formirati eksplicitno. Konkretno, uređeni skup (X, ≼), gdje je “≼” ma kakva
relacija poretka, izomorfan je sa uređenim skupom (S, ⊆) gdje je skup S skup skupova dat kao

S = {S | S = { | ∈ X ∧ ≼ } ∧ ∈ X}

Pri tome je traženi izomorfizam dat kao


( ) = { | ∈ X ∧ ≼ }.

6
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

što je vrlo jednostavno pokazati. Intuitivno iskazano, svakom elementu skupa X pridružuje se skup svih
elemenata koji su ispred njega u odnosu na razmatranu relaciju poretka (uključujući i njega samog). Na
primjer, skup A = {1, 2, 3, 5, 6, 10, 15, 3 } uređen relacijom “ | ” izomorfan je sa skupom skupova

S = {{1}, {1, 2}, {1, 3}, {1, 5}, {1, 2, 3, 6}, {1, 2, 5, 10}, {1, 3, 5, 15}, {1, 2, 3, 5, 6, 10, 15, 30}}

uređenim relacijom inkluzije. Očigledno, elementi skupa S su skupovi svih djelilaca odgovarajućih
elemenata iz skupa A. Međutim, iz prethodnih primjera je jasno da ovo nije najjednostavniji skup
skupova uređen relacijom inkluzije koji je izomorfan sa uređenim skupom (A, | ). Recimo, sljedeći skup
S = {∅, {2}, {3}, {5}, {2, 3}, {2, 5}, {3, 5}, {2, 3, 5}}

uređen relacijom inkluzije, također je izomorfan sa uređenim skupom (A, | ), a mnogo je jednostavniji
od skupa S. Ovdje su elementi skupa S skupovi svih prostih djelilaca (a ne svih djelilaca) odgovarajućih
elemenata iz skupa A (sami utvrdite kako izgleda izomorfizam u ovom slučaju).

Neka je dat uređeni skup (X, ≼) i neka je “≺” relacija strogog poretka koja odgovara relaciji poretka
“≼” (tj. prema kojoj je ≺ ako i samo ako je ≼ i ≠ ). Skup svih elemenata ∈ X za koje vrijedi
≼ ≼ naziva se segment sa krajevima i (u odnosu na razmatrani uređeni skup), dok se skup
svih elemenata x za koje vrijedi ≺ ≺ naziva interval sa krajevima a i b. Segment odnosno interval
sa krajevima a i b obilježavaju se respektivno sa [ .. ] i ( .. ). Formalno zapisano, imamo

[ .. ] = { ∈ X | ≼ ∧ ≼ }
( .. ) = { ∈ X | ≼ ∧ ≼ ∧ ≠ ∧ ≠ }

Umjesto oznaka [ .. ] i ( .. ) mogu se koristiti i oznake [ , ] odnosno ( , ), ali samo ako ne postoji
opasnost brkanja sa obilježavanjem uređenih parova, s obzirom da se oznaka ( , ) koristi i za tu svrhu.

Važno je uočiti da su pojmovi segmenta i intervala relativni u odnosu na zadani uređeni skup
(klasične definicije segmenta i intervala iz matematičke analize odnose se na uređeni skup (ℝ, ≤)).
Recimo, primjeri nekih segmenata i intervala u uređenom skupu (ℕ, | ), gdje je “ | ” relacija “biti djelilac
od”, glase

[5 .. 50] = { ∈ ℕ : 5 | ∧ | 50} = {5, 10, 25, 50}


[10 .. 30] = { ∈ ℕ : 10 | ∧ | 30} = {10, 30}
[15 .. 25] = { ∈ ℕ : 15 | ∧ | 25} = 
[15 .. 60] = { ∈ ℕ : 15 | ∧ | 60} = {15, 30, 60}

(5 .. 50) = { ∈ ℕ : 5 | ∧ | 50 ∧ ≠ 5 ∧ ≠ 50} = {10, 25}


(10 .. 30) = { ∈ ℕ : 10 | ∧ | 30 ∧ ≠ 10 ∧ ≠ 30} = ∅
(15 .. 25) = { ∈ ℕ : 15 | ∧ | 25 ∧ ≠ 15 ∧ ≠ 25} = ∅
(15 .. 60) = { ∈ ℕ : 15 | ∧ | 60 ∧ ≠ 15 ∧ ≠ 60} = {30}

Ovdje je za specifikaciju elemenata skupa umjesto znaka “ | ” upotrijebljen znak “ : ” (što se inače
ponekad radi) da se izbjegne brkanje sa istom oznakom “ | ” koja se koristi za relaciju “biti djelilac od”.
Iz ovog primjera možemo vidjeti neke osobine koje mogu iznenaditi nekoga ko je navikao da posmatra
segmente i intervale samo u uređenom skupu (ℝ, ≤). Recimo, mnoge će iznenaditi da je segment
[15 .. 25] prazan, jer bi očekivali da on sadrži barem svoje granice 5 i 5. Istina je da u općem slučaju,
segment ne mora sadržavati svoje granice (interval ih nikada ne sadrži, što nije neočekivano).

Za uređen skup u kojem je svaki segment konačan skup kažemo da je lokalno konačan. Drugim
riječima, skup je lokalno konačan ukoliko između svaka dva elementa imamo samo konačno mnogo
elemenata. Jasno je da je svaki konačan skup uvijek i lokalno konačan, neovisno od uvedenog poretka.
Međutim, čak i beskonačni skupovi mogu biti lokalno konačni. Na primjer, uređeni skup (ℕ, ≤) gdje je
“≤” klasična relacija poretka “biti manji ili jednak” predstavlja primjer lokalno konačnog skupa. Ipak,
osobina lokalne konačnosti u beskonačnim skupovima bitno zavisi od pripadne relacije poretka. Na
primjer, skup ℕ neće biti lokalno konačan ukoliko ga uredimo takvom relacijom poretka prema kojoj su
svi neparni brojevi ispred svih parnih brojeva.

7
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Neka je (X, ≼) neki uređen skup. Za element kažemo da je najmanji ili prvi element (ili samo
minimum) uređenog skupa (X, ≼) ukoliko se on nalazi ispred svih ostalih elemenata, odnosno ukoliko
vrijedi ≼ za svako ∈ X. Slično, za element kažemo da je najveći ili posljednji element (ili samo
maksimum) uređenog skupa (X, ≼) ukoliko se on nalazi iza svih ostalih elemenata, odnosno ukoliko
vrijedi ≼ za svako ∈ X. Dalje, za element x kažemo da je minimalni element uređenog skupa (X, ≼)
ukoliko ne postoji element koji se nalazi ispred njega, odnosno ukoliko ne postoji ∈ X ( ≠ ) takav da
je ≼ . Slično, element je maksimalni element uređenog skupa (X, ≼) ukoliko ne postoji element koji
se nalazi iza njega, odnosno ukoliko ne postoji ∈ X ( ≠ ) takav da je ≼ . Razumije se da su svi ovi
pojmovi relativni, odnosno da zavise od uvedenog poretka.
Treba praviti razliku između najmanjeg i minimalnog elementa (tj. između minimuma i minimalnog
elementa), kao i između najvećeg i maksimalnog elementa (tj. između maksimuma i maksimalnog
elementa). U slučaju relacija potpunog poretka ovi pojmovi se poklapaju, međutim kod relacija parcijalnog
poretka postoje razlike. Svaki najmanji element je uvijek minimalan i svaki najveći element je uvijek
maksimalan, ali obrnuto ne mora vrijediti. Također, najmanji i najveći elementi su, ukoliko postoje,
jedinstveni, međutim minimalni i maksimalni elementi ne moraju biti. Na primjer, za uređeni skup
(A, | ) gdje je A = {1, 2, 3, 5, 6, 10, 15, 30}, element 1 je i najmanji i minimalni element, dok je 30 i
najveći i maksimalni element. S druge strane, za uređeni skup (B, | ) gdje je B = {2, 3, 5, 6, 10, 15}
elementi , 3 i 5 su minimalni, a elementi 6, i 5 maksimalni, dok najveći i najmanji elementi ne
postoje. Ovo postaje jasnije ukoliko prikažemo Hasseov dijagram za ovaj uređeni skup:

6 10 15

2 3 5
Može se dokazati da najmanji element (minimum) može postojati samo ako je minimalni element
jedinstven (pri čemu ako postoji, on je jednak tom minimalnom elementu). Međutim, čak i ako je
minimalni element jedinstven, to još uvijek nije garancija da najmanji element postoji. Slično vrijedi za
odnos između najvećeg elementa (maksimuma) i maksimalnog elementa. Recimo, da bismo pokazali da
može postojati jedinstveni minimalni element, a da najmanji element ne postoji, možemo napraviti
takvu relaciju čiji Hesseov dijagram ima više lanaca u pravcu u kojem se elementi “smanjuju”, ali takvih
da je od svih tih lanaca samo jedan konačne dužine (i on se završava minimalnim elementom), dok su
svi ostali beskonačne duzine, tako da na njihovom kraju nema minimalnog elementa. Na taj način će biti
samo jedan minimalni element, ali koji nije najmanji, jer nije manji od onih elemenata u ostalim
lancima. Kao konkretan primjer, uzmimo skup negativnih cijelih brojeva klasično uređen relacijom “<”,
tj. “... < −3 < −2 < − ”, i dodajmo u njega neki dodatni element, recimo “”, za koji ćemo definirati da
je “ < − ”, i da pored toga, “” nije uporediv niti sa jednim drugim elementom. Tada je “”
jedinstveni minimalni element koji nije ujedno i najmanji element.
Neka je (X, ≼) uređeni skup. U skup X možemo uvesti relaciju poretka tako što ćemo definirati da
je ( , , ..., ) ≼ ( , , ..., ) ako i samo ako za neki indeks = 1 .. vrijedi da je ≼ i = za
sve vrijednosti < . Takav poredak nazivamo leksikografski poredak (s obzirom da tako definiramo
abecedni poredak riječi u rječnicima posmatrano u odnosu na osnovni abecedni poredak slova). Na
primjer, u skupu X imamo ( , , ) ≼ ( , , ) ako je ≼ , ili ako je = i ≼ , ili ako je
= i = i ≼ .
Za relaciju potpunog poretka kažemo da je diskretna (odnosno relacija diskretnog poretka)
ukoliko svaki element koji nije prvi ima neposrednog prethodnika i ukoliko svaki element koji nije
posljednji ima neposrednog sljedbenika. Uređeni skup u kojem je relacija poretka diskretna nazivamo
diskretno uređen skup. Na primjer, skupovi ℕ i ℤ su diskretno uređeni u odnosu na relaciju poretka
“<”, koja je u njima relacija diskretnog poretka. Skup ℚ nije diskretno uređen u odnosu na relaciju
poretka “<”, mada ćemo uskoro pokazati da je i u ovom skupu također moguće uvesti diskretnu relaciju
poretka, uz pomoć koje i on može postati diskretno uređen, iako je takva relacija poretka “daleko od
prirodne” (moguće je uvesti diskretan poredak čak i u skup ℝ, isto pomoću neke “neprirodne” relacije).
Lako je uočiti da je u konačnim skupovima svaka relacija poretka uvijek relacija diskretnog poretka.
Također, u lokalno konačnim skupovima pripadna relacija poretka je uvijek relacija diskretnog poretka.
Međutim, svaki diskretno uređeni skup nije uvijek i lokalno konačan. Recimo, nije teško pokazati da skup
ℤ × ℤ uređen leksikografskim poretkom predstavlja diskretno uređeni skup, ali koji nije lokalno konačan.

8
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Za uređeni skup (X, ≼) kažemo da je dobro uređen ukoliko svaki njegov neprazan podskup ima
najmanji element. Na primjer, uređeni skup (ℕ, ≤) je dobro uređen, dok uređeni skup (ℤ, ≤) nije dobro
uređen, s obzirom da njegov podskup { | ∈ ℤ ∧ < } nema najmanji element. S druge strane, uređeni
skup (ℤ, ≼) gdje je “≼” nešto drugačija (nestandardna) relacija poretka prema kojoj se alternativno
izmjenjuju pozitivni i negativni brojevi, tj. za koju vrijedi 0 ≼ 1 ≼ −1 ≼ 2 ≼ −2 ≼ 3 ≼ −3 ≼ ... jeste dobro
uređen. Na osnovu aksioma izbora, kojeg smo već pominjali i koji se javlja već i u naivnoj teoriji
skupova, može se dokazati da se u svaki skup može uvesti relacija poretka takva da on postane dobro
uređen skup (odnosno da se svaki skup može dobro urediti). Međutim, taj dokaz je egzistencijalan a ne
konstruktivan, odnosno dokaz ne nudi nikakav efektivan postupak kako bi se takva relacija poretka
zaista mogla konstruisati za proizvoljno zadani skup. S obzirom da do danas nije pronađen nikakav
efektivan postupak kako bi se mogao dobro urediti recimo skup realnih brojeva ℝ (niti iko ima i
najmanju ideju kako bi se to zaista moglo učiniti), to je jedan od razloga (pored još nekih drugih) zbog
kojeg su danas mnogi spremni da posumnjaju u osnovanost aksioma izbora, koji se doima gotovo
očiglednim. Izvjesni matematičari vjeruju da aksiom izbora vrijedi samo za ne previše velike skupove
(tačnije za sve konačne skupove i tzv. prebrojivo beskonačne skupove, o kojima ćemo kasnije govoriti).

Neka je (X, ≼) uređen skup i neka je A ⊆ X neki njegov podskup. Za element ∈ X kažemo da je
gornja granica (majoranta) skupa A ukoliko je ≼ za svako ∈ A (tj. ukoliko su svi elementi skupa
A ispred njega). Slično, element ∈ X je donja granica (minoranta) skupa A ukoliko je ≼ za svako
∈ A. Najmanji element skupa svih gornjih granica (u odnosu na posmatranu relaciju poretka) naziva se
supremum skupa A (u oznaci sup A), dok se najveći element skupa svih donjih granica naziva infimum
skupa A (u oznaci inf A). Jasno je da je najveći element skupa A, ukoliko postoji, ujedno i njegov
supremum, dok je njegov najmanji element, ukoliko postoji, ujedno i njegov infimum. Također, ukoliko
je sup A ∈ A, tada je sup A ujedno i najveći element skupa A, a ukoliko je inf A ∈ A, tada je inf A ujedno i
najmanji element skupa A. Međutim, supremum i infimum skupa mogu postojati i u slučaju kada skup
nema najveći odnosno najmanji element. Također, u općem slučaju vrijedi sup A ∉ A i inf A ∉ A. Na
primjer, za uređeni skup (ℝ, ≤) i skup A = { ∈ ℝ | −1 < < } najmanji i najveći element skupa A ne
postoji, dok vrijedi inf A = −1 i sup A = . Također, imamo −1 ∉ A i 1 ∉ A.

Razumije se da su svi uvedeni pojmovi relativni u odnosu na izabrani poredak. Recimo, neka je dat
uređeni skup (ℕ, | ) i njegov podskup A = {10, 20, 25}. Donje granice skupa A su svi elementi iz ℕ koji
su ispred elemenata skupa A (u odnosu na usvojeni poredak), tj. elementi za koje je | 10, | 20 i
| 5. Drugim riječima, to su zajednički djelioci od 10, 20 i 25, a to su samo 1 i 5. Gornje granice skupa A
su svi elementi ℕ koji su iza od elemenata skupa A (ponovo u odnosu na usvojeni poredak), tj. elementi
x za koje je 10 | , 20 | i 25 | , a to su broj 100 i svi njegovi umnošci. Stoga je:

inf A = max {1, 5} = 5


sup A = min {100, 200, 300, ...} = 100

Generaliziranjem ovog primjera, možemo zaključiti da su, za ovakav poredak, inf A i sup A ono što se
obično naziva najveći zajednički djelilac i najmanji zajednički sadržilac elemenata iz skupa A. Treba
obratiti pažnju da se “max” i “min” također računaju u odnosu na usvojeni poredak. Maksimum skupa
{1, 5} je 5, ne zato što je < 5, nego što je | 5. Isto tako, minimum skupa {100, 200, 300, ...} je 100 zbog
toga što je | 200, 100 | 3 , itd. Ovdje se slučajno dogodilo da se isti rezultat dobija i kada se
maksimum i minimum računaju u klasičnom smislu, tj. u odnosu na relaciju “<”.

U nekim primjenama je korisno razmatrati i generalizacije relacija poretka koje se nazivaju relacije
kvaziporetka, poznate još i kao relacije pretporetka odnosno praporetka (engl. preorder). Od ovih
relacija zahtijeva se samo da budu refleksivne i tranzitivne, ali ne moraju nužno biti niti simetrične niti
antisimetrične. Tako, relacije kvaziporetka uopćavaju kako relacije parcijalnog poretka, tako i relacije
ekvivalencije. Zbog toga se za njih obično koristi oznaka “≾”. Relacije kvaziporetka razlikuju se od
relacija poretka što je moguće da bude ≾ i ≾ čak i kad je ≠ . Na primjer, ukoliko u skup ℝ
uvedemo relaciju “≾” takvu da vrijedi ( , ) ≾ ( , ) ako i samo ako je ≤ , tada “≾” nije relacija
poretka, ali jeste relacija kvaziporetka. Slično, uvedemo li u skup kompleksnih brojeva relaciju prema
kojoj je ≾ ako i samo ako je | | ≤ | |, takva relacija nije relacija poretka ali jeste kvaziporetka
(za dva različita kompleksna broja i koji imaju isti modul istovremeno vrijedi i ≾ i ≾ ),
Još jedan primjer relacije kvaziporetka koja nije relacija poretka je relacija u nekom grafu (streličastom
dijagramu) po kojoj za čvorove P i Q vrijedi P ≾ Q ako i samo ako postoji put od čvora P do čvora Q (u
toj relaciji istovremeno vrijedi P ≾ Q i Q ≾ P kad god između čvorova P i Q postoji put u oba smjera).

9
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Relacije kvaziporetka također mogu biti djelimične ili potpune, ovisno da li postoje ili ne postoje parovi
neuporedivih elemenata (tj. takvih da ne vrijedi niti ≾ niti ≾ ).

Svakoj relaciji kvaziporetka “≾” u nekom skupu X može se pridružiti jedna relacija ekvivalencije po
kojoj je ~ ako i samo ako je ≾ y i ≾ (tada kažemo da su i kvaziekvivalentni u odnosu na
relaciju “≾”). Sada, ako ukoliko posmatramo faktor-skup X /~ u odnosu na tako definiranu relaciju
ekvivalencije i definiramo relaciju “≼” uzimajući da je [ ] ≼ [ ] ako i samo ako je ≾ , tako definirana
relacija “≼” postaje relacija poretka u skupu X /~ (nije teško vidjeti da ova definicija ne ovisi o izboru
konkretnih predstavnika i klasa [ ] i [ ]). Na taj način se svakoj relaciji kvaziporetka uvijek može
pridružiti odgovarajuća relacija poretka. Intuitivno rečeno, za tako pridruženu relaciju poretka, ne
postoji razlika između onih elemenata i za koje istovremeno vrijedi i ≼ i ≼ . Recimo, za ranije
navedeni primjer relacije kvaziporetka u skupu kompleksnih brojeva, klase kvaziekvivalentnih brojeva
čine svi brojevi čiji su moduli jednaki. Između takvih klasa, lako se uspostavlja klasični poredak tako što
se definira da je jedna klasa manja ili jednaka od druge ako i samo ako je modul ma kojeg elementa
prve klase manji ili jedna od modula ma kojeg elementa druge klase.

n-arne relacije i relacione baze podataka

Recimo sada nešto i o operacijama sa -arnim relacijama. Klasične operacije sa skupovima, poput
unije, presjeka itd. primjenljive su i na -arne relacije, ali postoje i posebne operacije namijenjene
isključivo za rad sa -arnim relacijama. Najvažnije takve operacije su Descartesov (Kartezijev)
proizvod, količnik, projekcija, selekcija, α-spajanje i prirodno spajanje. Ove operacije iskoristio je E.
F. Codd za razvoj modela relacionih baza podataka, koji spada u najviše korištene modele za opisivanje
baza podataka u savremenim računarskim naukama. Kao posljedica toga, izvjesni programski jezici
(poput jezika SQL, koji je najpoznatiji jezik za rad sa relacionim bazama podataka) direktno su zasnovani
na konceptu -arnih relacija i operacijama sa njima. Napomenimo da se u terminologiji relacionih baza
podataka individualne koordinate pojedinih elemenata relacija nazivaju atributi, a skupovi iz kojih
atributi uzimaju vrijednosti nazivaju se domeni atributa. Također, specifične operacije nad relacijama
obično se nazivaju upiti (engl. queries), s obzirom da se pomoću njih izdvajaju informacije pohranjene
u bazi podataka.

Definirajmo prvo Descartesov proizvod relacija. Neka su date dvije relacije ℛ ⊆ A × A × ... × A
i ℛ ⊆ B × B × ... × B . Njihov Descartesov proizvod ℛ × ℛ dat je pomoću izraza

ℛ × ℛ = {( , , ..., , , , ..., )|( , , ..., )∈ℛ ∧( , , ..., )∈ℛ }

Na primjer, neka su zadane (ternarne) relacije ℛ = {(1, 2, 3), (4, 1, 6), (3, 2, 4)} i ℛ = {(2, 7, 1), (4, 1, 6)}.
Tada je
ℛ × ℛ = {(1, 2, 3, 2, 7, 1), (1, 2, 3, 4, 1, 6), (4, 1, 6, 2, 7, 1), (4, 1, 6, 4, 1, 6),
(3, 2, 4, 2, 7, 1), (3, 2, 4, 4, 1, 6)}

Ova definicija Descartesovog proizvoda relacija nije u potpunosti ekvivalentna definiciji Descartesovog
proizvoda skupova, s obzirom da je ( , , ..., , , , ..., ) ≠ (( , , ..., ), ( , , ..., )). S druge
strane, ovakva modificirana definicija je znatno pogodnija za praktične primjene.

Količnik relacija ℛ i ℛ , u oznaci ℛ ÷ ℛ , je relacija ℛ takva da vrijedi ℛ × ℛ = ℛ , ukoliko


takva relacija postoji.

Projekcija , , , (ℛ)relacije ℛ na skup koordinata koji je određen indeksima i, j, k, ... predstavlja


m-arnu relaciju definiranu izrazom

, , , (ℛ) = {( , , ..., )|( , , ..., ) ∈ ℛ}

Na primjer, za relaciju ℛ iz prethodnog primjera imamo:

, (ℛ ) = {(1, 3), (4, 6), (3, 4)} (ℛ ) = {1, 4, 3} (ℛ ) = {2, 1}

Neka je P( , , ..., ) neko svojstvo (predikat) koje koordinate relacije ℛ mogu, ali ne moraju da
posjeduju. Selekcija (ℛ) relacije ℛ u odnosu na svojstvo P data je kao

10
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

(ℛ) = {( , , ..., )|( , , ..., ) ∈ ℛ ∧ P( , , ..., )}

Drugim riječima, (ℛ) predstavlja podskup skupa ℛ sastavljen od onih elemenata relacije ℛ koji
ispunjavaju svojstvo P. Na primjer, za relaciju ℛ1 iz prethodnog primjera imamo:

# (ℛ )= {(1, 2, 3), (3, 2, 4)} # ∧# (ℛ ) = {(4, 1, 6)}


Ovdje je iskorištena često korištena konvencija da se argumenti predikata koji je opisan nekim izrazom
nazivaju prosto # , # , # itd. da se izbjegnu pretpostavke o tome kako se ti argumenti zaista zovu,
Tako je # prva koordinata relacije, # druga koordinata, itd.
α-spajanje relacija ℛ i ℛ u odnosu na koordinate , , u oznaci ℛ ℛ , definira se izrazom
# #

ℛ ℛ = # # (ℛ × ℛ )
# #

pri čemu je broj koordinata relacije ℛ , dok je α neka binarna relacija između -te koordinate relacije
ℛ i -te koordinate relacije ℛ . Na primjer, za relacije ℛ i ℛ iz prethodnog primjera imamo:

ℛ ℛ = {(1, 2, 3, 2, 7, 1), (4, 1, 6, 2, 7, 1), (4, 1, 6, 4, 1, 6), (3, 2, 4, 2, 7, 1)}


# #

Intuitivno rečeno, ovako formirana relacija sadrži samo one kombinacije uređenih trojki iz relacija ℛ i
ℛ kod kojih je treća koordinata uređene trojke iz relacije ℛ veća od prve koordinate uređene trojke iz
relacije ℛ , što i izražava uvjet # > # .

Konačno, definiraćemo još i prirodno spajanje relacija ℛ i ℛ , u oznaci ℛ ℛ . Prirodno spajanje


je definirano samo za relacije ℛ i ℛ kod kojih se neke koordinate iz ℛ i neke koordinate iz ℛ
popunjavaju iz istih skupova, kao na primjer za relacije ℛ ⊆ A × A × A i ℛ ⊆ A × A × A date kao
ℛ = {( , , ), ( , , ), ( , , ), ( , , )} i ℛ = {( , , ), ( , , ), ( , , )}. Da bi se dobila relacija ℛ ℛ ,
prvo se formira Descartesov proizvod ℛ × ℛ . Od dobijenih -torki uzimaju se samo one koje se
poklapaju u koordinatama iz ℛ i ℛ koje uzimaju vrijednosti iz istih skupova. Na ovaj način su neke
koordinate postale identične u svim -torkama, pa se one izbacuju da ne bi bilo nepotrebnih
ponavljanja. Za dati primjer, relacija ℛ ℛ je podskup od A × A × A × A , a data je kao

ℛ ℛ = {( , , , ), ( , , , ), ( , , , ), ( , , , ), ( , , , )}

Za potrebe razumijevanja relacionih modela baza podataka potrebno je još uvesti i još i pojmove
funkcionalnih zavisnosti i ključeva kod -arnih relacija. Neka su X i Y neki skupovi koordinata relacije
ℛ . Kažemo da skup X funkcijski određuje skup Y, u oznaci X → Y, ukoliko ne postoje dvije -torke iz ℛ
koje se poklapaju u koordinatama skupa X, a razlikuju u bar jednoj koordinati skupa Y. Na primjer, neka
je data relacija ℛ = {( , , , ), ( , , , ), ( , , , ), ( , , , )}, pri čemu je ℛ ⊆ A × A × A × A .
Kod ove relacije važe funkcionalne zavisnosti {A , A } → {A }, {A , A } → {A }, itd. Ključ relacije ℛ je
svaki skup X njenih koordinata za koji važi X → {A , A , ..., A }. Značaj ključa sastoji se u tome što se sve
-torke u relaciji mogu jednoznačno identificirati samo na osnovu ključa. Na primjer, skup {A , A } čini
ključ prethodne relacije.

Operacije sa -arnim relacijama i njihovu primjenu demonstriraćemo na nekoliko praktičnih


primjera. Neka je data sljedeća tablica, koja sadrži podatke o studentima nekog fakulteta:

Indeks Prezime Ime Grad Kanton Godina Prosjek


13288 Mehić Meho Zenica ZDK 3 7.67
14121 Perić Pero Mostar HNK 1 8.53
12988 Jović Jovo Doboj RS 2 7.48
14642 Selmić Selma Konjic HNK 3 8.56
13189 Perić Jozo Žepče ZDK 1 8.33
13578 Bajrić Bajro Prijedor RS 4 7.21
14005 Anić Ana Travnik SBK 2 7.98
12844 Vasić Vaso Zenica ZDK 5 8.44
13691 Husić Meho Travnik SBK 3 8.67

11
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Ova tabela, može se modelirati kao 7-arna relacija (nazovimo je, recimo, konkretnijim imenom
“Studenti” umjesto bezličnog imena poput ℛ):

Studenti = {(13288, Mehić, Meho, Zenica, ZDK, 3, 7.67),


(14121, Perić, Pero, Mostar, HNK, 1, 8.53),
(12988, Jović, Jovo, Doboj, RS, 2, 7.48),
(14642, Selmić, Selma, Konjic, HNK, 3, 8.56),
(13189, Perić, Jozo, Žepče, ZDK, 1, 8.33),
(13578, Bajrić, Bajro, Prijedor, RS, 4, 7.21),
(14005, Anić, Ana, Travnik, SBK, 2, 7.98),
(12844, Vasić, Vaso, Zenica, ZDK, 5, 8.44),
(13691, Husić, Meho, Travnik, SBK, 3, 8.67)}

Pretpostavimo sada da nas ne zanimaju svi podaci u tabeli, nego samo informacije o imenu i
prezimenu, godini studiranja i prosjeku za svakog studenta. Ove informacije možemo dobiti primjenom
operacije projekcije na ovu relaciju, u odnosu na tražene koordinate (atribute), kao u sljedećem upitu, u
kojem smo umjesto bezličnih rednih brojeva atributa upotrijebili njihova simbolička imena (npr.
“Prezime” umjesto ):

Prezime me odina Prosjek(Studenti) = {(Mehić, Meho, 3, 7.67), (Perić, Pero, 1, 8.53),


(Jović, Jovo, 2, 7.48), (Selmić, Selma, 3, 8.56), (Perić, Jozo, 1, 8.33),
(Bajrić, Bajro, 4, 7.21), (Anić, Ana, 2, 7.98), (Vasić, Vaso, 5, 8.44),
(Husić, Meho, 3, 8.67)}

Ilustracije radi, ukoliko zanemarimo detalje o tome kako bismo unijeli relaciju “Studenti” u bazu
podataka, u programskom jeziku SQL prikazani efekat projekcije postigli bismo pomoću naredbe
SELECT Prezime, Ime, Godina, Prosjek FROM Studenti

Pretpostavimo sada da smo operaciju projekcije primijenili da izdvojimo informacije o gradovima i


pripadnim kantonima prisutne u relaciji “Studenti”. Kao rezultat dobićemo sljedeće informacije:

rad anton (Studenti) = {(Zenica, ZDK), (Mostar, HNK), (Doboj, RS), (Konjic, HNK),
(Žepče, ZDK), (Prijedor, RS), (Travnik, SBK)}

Interesantno je da smo dobili rezultat koji sadrži 7, a ne 9 parova. Međutim, dvije informacije se
ponavljaju (parovi (Zenica, ZDK) i (Travnik, SBK)), a kako su relacije skupovi, suvišna pojavljivanja
elemenata se ignoriraju. Isti efekat dobili bismo u jeziku SQL primjenim naredbe

SELECT DISTINCT Grad, Kanton FROM Studenti

Riječ “DISTINCT ” naglašava da ne želimo dupliranja elemenata, što je bitno jer se to u jeziku SQL inače
ne podrazumijeva.

Neka nas sad zanimaju informacije o svim studentima koji su na trećoj ili višoj godini studija. Te
informacije možemo dobiti koristeći operaciju selekcije:

odina (Studenti) = {(13288, Mehić, Meho, Zenica, ZDK, 3, 7.67),


(14642, Selmić, Selma, Konjic, HNK, 3, 8.56),
(13578, Bajrić, Bajro, Prijedor, RS, 4, 7.21),
(12844, Vasić, Vaso, Zenica, ZDK, 5, 8.44),
(13691, Husić, Meho, Travnik, SBK, 3, 8.67)}

Ponovo smo umjesto bezlične oznake poput #6 upotrijebili simboličko ime atributa “Godina”. U jeziku
SQL, istu informaciju dobijamo pomoću naredbe
SELECT * FROM Studenti WHERE Godina >= 3

Ukoliko nas zanimaju ne sve informacije o studentima treće ili viših godina studija, nego recimo
samo njihova imena i prezimena, na rezultat prethodne selekcije možemo primijeniti operaciju
projekcije, sa ciljem da izdvojimo samo željene informacije, kao u sljedećoj konstrukciji:

12
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Prezime, me ( odina (Studenti)) = {(Mehić, Meho), (Selmić, Selma), (Bajrić, Bajro),


(Vasić, Vaso), (Husić, Meho)}
Ovoj kombinaciji operacija u jeziku SQL odgovara sljedeća naredba:
SELECT Prezime, Ime FROM Studenti WHERE Godina >= 3

Neka sada želimo pronaći brojeve indeksa onih studenata treće godine čiji je prosjek veći od 8.
Ovdje ponovo treba kombinirati selekciju i projekciju, samo što je ovaj put uvjet nešto komplikovaniji:

ndeks ( odina ∧Prosjek (Studenti)) = {14642, 13691}

Ovoj konstrukciji odgovara sljedeća SQL naredba:


SELECT Indeks FROM Studenti WHERE Godina = 3 AND Prosjek > 8

Da bismo demonstrirali operacije spajanja, potrebna nam je još neka relacija. Pretpostavimo, na
primjer, da nam je data i sljedeća tablica, koja sadrži informacije o brojevima indeksa studenata koji su
angažirani kao demonstratori na pojedinim predmetima:

Indeks Predmet
14642 Fizika
14005 Matematika
12844 Elektrotehnika
14005 Fizika

Ovu tablicu možemo lako modelirati kao binarnu relaciju (nazovimo je, recimo, “Demonstratori”);
Demonstratori = {(14642, Fizika), (14005, Matematika),
(12844, Elektrotehnika), (14005, Fizika)}
Nedostatak ove relacije je što su informacije o demonstratorima koje ona sadrži veoma šture.
Međutim, na osnovu činjenice da se preko broja indeksa iz relacije “Studenti” mogu saznati sve ostale
informacije, moguće je povezati informacije iz ove dvije relacije, tako da za svakog demonstratora možemo
dobiti sve informacije o njemu. Jedan način da to uradimo je da prvo formiramo Descartesov proizvod
relacija “Studenti” i “Demonstratori”, i onda iz tako formiranog proizvoda izdvojimo (operacijom selekcije)
samo one -torke koje se poklapaju u brojevima indeksa uzetih iz jedne i druge tabele. To bi izgledalo
recimo ovako:

Studenti ndeks emonstratori ndeks (Studenti × Demonstratori) =


{(14642, Selmić, Selma, Konjic, HNK, 3, 8.56, 14642, Fizika),
(14005, Anić, Ana, Travnik, SBK, 2, 7.98, 14005, Matematika),
(12844, Vasić, Vaso, Zenica, ZDK, 5, 8.44, 12844, Elektrotehnika),
(14005, Anić, Ana, Travnik, SBK, 2, 7.98, 14005, Fizika)}

Ovdje smo uveli oznake “Studenti.Indeks” odnosno “Demonstratori.Indeks” da naznačimo da se misli na


atribut “Indeks” koji se odnosi na relaciju “Studenti” odnosno “Demonstratori”, što je često korištena
konvencija. U jeziku SQL, istu stvar uradili bismo ovako:
SELECT * FROM Studenti, Demonstratori
WHERE Studenti.Indeks = Demonstratori.Indeks

Ako malo bolje pogledamo, vidjećemo da operacija koju smo upravo izveli nije ništa drugo nego
α-spajanje, u kojem tražimo jednakost istoimenih atributa “Indeks” u relacijama “Demonstratori” i
“Studenti” (rezultat naravno ostaje isti kao i ranije):
Studenti emonstratori
ndeks ndeks

Ne treba pomisliti da je izraz “Indeks = Indeks” identitet, jer se prvi i drugi operand uzimaju iz različitih
relacija (tj. to je zapravo uvjet “Studenti.Indeks = Studenti.Indeks”. U jeziku SQL, to bismo izveli ovako:
SELECT * FROM Studenti INNER JOIN Demonstratori
ON Studenti.Indeks = Demonstratori.Indeks

13
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

U oba slučaja, vidimo da relacija dobijena kao rezultat spajanja sadrži dupliranu informaciju o broju
indeksa studenta. Razumije se da je ovu suvišnu informaciju moguće ukloniti korištenjem operacije
projekcije. Međutim, uz razumnu pretpostavku da atributi “Indeks” u obje relacije imaju isti domen,
operacija prirodnog spajanja daje upravo rezultat bez dupliranja informacija:

Studenti Demonstratori = {(14642, Selmić, Selma, Konjic, HNK, 3, 8.56, Fizika),


(14005, Anić, Ana, Travnik, SBK, 2, 7.98, Matematika),
(12844, Vasić, Vaso, Zenica, ZDK, 5, 8.44, Elektrotehnika),
(14005, Anić, Ana, Travnik, SBK, 2, 7.98, Fizika)}

Mada u jeziku SQL postoji i naredba za realizaciju prirodnog spajanja (koja se dobija pomoću
konstrukcije “NATURAL JOIN”), to i nije toliko bitno, jer se na rezultat spajanja obično dalje primjenjuju
selekcija ili projekcija sa ciljem izdvajanja specifičnih informacija, tako da nije previše bitno da li
koristimo α-spajanje ili prirodno spajanje. Mi ćemo u nastavku koristiti prirodno spajanje, čisto zbog
jednostavnije sintakse.

Neka nas sada zanimaju samo imena i prezimena svih demonstratora. Jasno, na rezultat spajanja
treba primijeniti odgovarajuću projekciju:

Prezime, me (Studenti Demonstratori) = {(Selmić, Selma), (Anić, Ana), (Vasić, Vaso)}

Odgovarajuća SQL naredba je sljedeća:


SELECT DISTINCT Prezime, Ime FROM Studenti INNER JOIN Demonstratori
ON Studenti.Indeks = Demonstratori.Indeks

Ukoliko želimo saznati imena i prezimena samo onih demonstratora koji su angažirani na
predmetu “Fizika”, to možemo uraditi na više načina. Primijetimo da ne možemo prosto primijeniti
selekciju na posljednji rezultat, jer on ne sadrži informacije o predmetima na koje su demonstratori
angažirani. Jedna je mogućnost da selekciju izvršimo nakon obavljenog spajanja, nakon čega koristimo
projekciju da izdvojimo samo one atribute koji nas zanimaju:

Prezime, me ( Predmet izika (Studenti Demonstratori)) = {(Selmić, Selma), (Anić, Ana)}

Odgovarajuća SQL naredba glasila bi ovako:


SELECT Prezime, Ime FROM Studenti INNER JOIN Demonstratori
ON Studenti.Indeks = Demonstratori.Indeks WHERE Predmet = 'Fizika'

Druga mogućnost koja daje isti rezultat je da iz relacije “Demonstratori” prvo izdvojimo samo
informacije o onim studentima koji su angažirani na predmetu “Fizika”, a zatim da obavimo prirodno
spajanje relacije “Studenti” sa tako dobijenom relacijom. Na kraju, kao i u prethodnom slučaju,
projekcijom izdvajamo atribute koji nas zanimaju:

Prezime, me (Studenti Predmet izika (Demonstratori)) = {(Selmić, Selma), (Anić, Ana)}

SQL naredba koja realizira ovaj slijed operacija malo je kompleksnija (ovdje se rezultat selekcije
privremeno imenuje kao nova relacija pod imenom “Pomocna” da bi se moglo obaviti spajanje, s
obzirom da sintaksa jezika SQL omogućava spajanje samo sa relacijama koje posjeduju imena):
SELECT Prezime, Ime FROM Studenti INNER JOIN
(SELECT * FROM Demonstratori WHERE Predmet = 'Fizika') AS Pomocna
ON Studenti.Indeks = Pomocna.Indeks

Pored namjenskih operacija za rad sa -arnim relacijama poput selekcije, spajanja i drugih, klasične
skupovne relacije poput unije, presjeka i drugih nalaze svoje primjene u relacionim bazama podataka. Na
primjer, neka je potrebno pronaći imena i prezimena onih demonstratora koji su angažirani i na
predmetu “Matematika” i na predmetu “Fizika”. Mogli bismo naći posebno imena i prezimena
demonstratora na predmetu “Matematika” i demonstratora na predmetu “Fizika”, a zatim naći zajedničke
elemente tako dobijenih skupova pomoću operacije presjeka. Alternativno, možemo iz relacije
“Demonstratori” izdvojiti informacije o indeksima studenata koji su angažirani na predmetu “Matematika”
i indeksima studenata koji su angažirani na predmetu “Fizika”, nakon čega presjecanjem možemo naći
studente koji su angažirani na oba predmeta. Dalje možemo nastaviti kao u prethodnom primjeru:

14
Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Predavanje 6
Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu (akademska godina 2015/16)

Prezime, me (Studenti ( ndeks( Predmet Matematika(Demonstratori)) ∩


ndeks ( Predmet izika (Demonstratori)))) = {(Anić, Ana)}

Na žalost, dosta izvedbi jezika SQL (začudo) ne poznaje direktno operaciju presjeka (u onima koje
poznaju, ta operacija se izvodi primjenom operatora “INTERSECT”). Srećom, operacija presjeka se
veoma često može simulirati pogodnom primjenom operacije α-spajanja (pri čemu je ponekad potrebno
vršiti α-spajanje relacije sa samom sobom). Recimo, nije teško provjeriti da za proizvoljne dvije relacije
ℛ i ℛ koje posjeduju neki atribut x vrijedi

(ℛ ) ∩ (ℛ ) = ℛ . (ℛ ℛ )

Ova činjenica omogućava da preformuliramo prethodni primjer tako da se može iskazati u vidu SQL
naredbe, recimo na sljedeći način:
SELECT Ime, Prezime FROM Studenti INNER JOIN
(SELECT Prva.Indeks FROM
(SELECT * FROM Demonstratori WHERE Predmet = 'Matematika') AS Prva INNER JOIN
(SELECT * FROM Demonstratori WHERE Predmet = 'Fizika') AS Druga
ON Prva.Indeks = Druga.Indeks) AS Pomocna
ON Studenti.Indeks = Pomocna.Indeks

Iz ovog primjera se može primijetiti da SQL naredbe ne moraju uvijek biti jasno čitljive, kako je to
izgledalo na osnovu prvih nekoliko primjera.

Na kraju, razmotrimo još i prikazane relacije sa aspekta ključeva i funkcionalnih zavisnosti. Relacija
“Studenti” ima očigledan ključ {Indeks}, s obzirom da ne postoje dva studenta koja imaju isti broj
indeksa. U konkretnom primjeru, skup {Ime, Prezime} također predstavlja ključ, jer ne postoje dva
studenta koja imaju isto i ime i prezime, dok {Ime} i {Prezime} nisu ključevi, s obzirom da postoje
studenti sa istim imenima (Mehić Meho i Husić Meho) odnosno studenti sa istim prezimenima (Perić
Pero i Perić Jozo). Međutim, korištenje ovog para atributa kao ključeva se ne preporučuje, s obzirom da
se može desiti da se pojave dva studenta sa istim imenima i prezimena, dok je broj indeksa sigurno
jedinstven. Također, u ovom konkretnom primjeru, ključ je također i {Prosjek}, s obzirom da ne postoje
dva studenta sa istim prosjekom. Ipak, posve je jasno da se radi samo o slučajnosti, te bi upotreba
takvog ključa bila izrazito nepouzdana ukoliko želimo proširiti relaciju podacima o novim studentima.
Konačno, svaki nadskup prikazanih skupova ključeva je, u skladu sa definicijom ključa, također ključ.
Međutim, u praksi je cilj da ključ bude što je god moguće jednostavniji skup atributa.

Što se tiče funkcionalnih zavisnosti, u navedenom primjeru, osim trivijalnih funkcionalnih zavisnosti
generiranih ključevima, imamo jednu logički očitu funkcionalnu zavisnost {Grad} → {Kanton}. Zaista,
podatak o imenu grada u potpunosti određuje podatak o kantonu (odnosno entitetu) u kojem se taj
grad nalazi. U praksi je potrebno broj funkcionalnih zavisnosti svesti na minimum, jer funkcionalne
zavisnosti otežavaju održavanje baze podataka. Zaista, nas niko ne sprečava da u jednom elementu
relacije napišemo da Zenica pripada Zeničko-dobojskom kantonu, a u drugom elementu da pripada
Sarajevskom kantonu. Postoji način da smanjimo broj funkcionalnih zavisnosti, uvođenjem novih
relacija koje opisuju te funkcionalne zavisnosti. Recimo, u navedenom primjeru, mogli bismo uvesti
relaciju “Gradovi” koja bi imala dva atributa “Grad” i “Kanton”, i koja bi opisivala u kojem se kantonu (ili
entitetu) nalazi svaki od gradova. Na primjer:

Gradovi = {(Zenica, ZDK), (Mostar, HNK), (Doboj, RS), (Konjic, HNK), (Žepče, ZDK),
(Prijedor, RS), (Travnik, SBK)}

Sada bismo iz relacije “Studenti” mogli u potpunosti izbaciti atribut “Kanton”. Tada, ukoliko nas
zanimaju kompletne informacije o studentima, uključujući i informaciju o kantonu (entitetu) iz kojeg je
student, mogli bismo prosto koristiti prirodno spajanje relacija “Studenti” i “Gradovi”. Na taj način
imamo garanciju da će svi podaci biti konzistentni. Napomenimo da se tehnike “prečišćavanja” relacija
koje čine neku bazu podataka kojom se, između ostalog, postiže minimalan broj funkcionalnih zavisnosti
nazivaju normalizacija baze podataka.

15

Das könnte Ihnen auch gefallen