Predavanje 6 MLTI

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 2014/15) 1 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 A pridružuje neki jedinstven element f (a) B. Pri tome, element a nazivamo original ili argument, a b njegova slika dobijena pomoću funkcije f. Skup A naziva se izvorni skup funkcije f, dok se skup B naziva odredišni skup ili kodomen funkcije f. Ukoliko neki element a A ima svoj pridruženi element f (a), kaže se da je funkcija definirana za argument a, u suprotnom se kaže da je nedefinirana za argument a. Skup svih vrijednosti a A za koje je funkcija definirana naziva se domen funkcije, dok se skup svih vrijednosti b B koji su slika nekog elementa iz A (tj. za koje postoji a A takav da je b = f (a)) 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 f : 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 f (ne nužno potpuna) definira kao uređena trojka f = (ℱ, 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 (a, b) ℱ zapisujemo kao b = f (a) i kažemo da funkcija f elementu a pridružuje element b = f (a). Činjenica da je relacija ℱ funkcijska garantira da je za svako a A vrijednost f (a), ukoliko uopće postoji, jedinstveno određena. Sama relacija ℱ naziva se graf funkcije f. Odnosno, graf funkcije f je skup definiran kao ℱ = {(a, f (a)) | 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 f kao f (X) = { f (x) | f 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 n-torke se definiraju posredno preko funkcija, pa se uređena n-torka (a1, a2, ..., an) definira se kao funkcija f sa skupa {1, 2, ..., n} u skup {a1, a2, ..., an } za koju vrijedi f (1) = a1, f (2) = a2, ..., f (n) = an, 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 = {a1, a2, a3, ... an}, tada (potpunu) funkciju f : A f (A) često obilježavamo i kao f = ( ( ) () ( ) ( ) )

description

matematicka logika i teorija, etf, zeljko juric

Transcript of Predavanje 6 MLTI

Page 1: Predavanje 6 MLTI

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 2014/15)

1

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 A pridružuje neki jedinstven element f (a) B. Pri tome, element a nazivamo original ili argument, a b njegova slika dobijena pomoću funkcije f. Skup A naziva se izvorni skup funkcije f, dok se skup B naziva odredišni skup ili kodomen funkcije f. Ukoliko neki element a A ima svoj pridruženi element f (a), kaže se da je funkcija definirana za argument a, u suprotnom se kaže da je nedefinirana za argument a. Skup svih vrijednosti a A za koje je funkcija definirana naziva se domen funkcije, dok se skup svih vrijednosti b B koji su slika nekog elementa iz A (tj. za koje postoji a A takav da je b = f (a)) 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 f : 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 f (ne nužno potpuna) definira kao uređena trojka f = (ℱ, 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 (a, b) ℱ zapisujemo kao b = f (a) i kažemo da funkcija f elementu a pridružuje element b = f (a). Činjenica da je relacija ℱ funkcijska garantira da je za svako a A vrijednost f (a), ukoliko uopće postoji, jedinstveno određena. Sama relacija ℱ naziva se graf funkcije f. Odnosno, graf funkcije f je skup definiran kao

ℱ = {(a, f (a)) | 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 f kao f (X) = { f (x) | f 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 n-torke se definiraju posredno preko funkcija, pa se uređena n-torka (a1, a2, ..., an) definira se kao funkcija f sa skupa {1, 2, ..., n} u skup {a1, a2, ..., an } za koju vrijedi f (1) = a1, f (2) = a2, ..., f (n) = an, 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 = {a1, a2, a3, ... an}, tada (potpunu) funkciju f : A f (A) često obilježavamo i kao

f = ( ( ) ( ) ( ) ( )

)

Page 2: Predavanje 6 MLTI

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 2014/15)

2

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

AB = { (

), (

), (

), (

), (

), (

), (

), (

) }

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 #(AB) = #A#B.

Ukoliko je domen neke funkcije neki skup uređenih n-torki, npr. Descartesov proizvod više skupova A1 A2 ... An, tada su originali uređene n-torke oblika (a1, a2, ..., an) A1 A2 ... An. Da bismo pojednostavili pisanje, po dogovoru umjesto f ((a1, a2, ..., an)) pišemo prosto f (a1, a2, ..., an) i kažemo da je funkcija f funkcija sa n argumenata, pri čemu pod argumentima ovdje podrazumijevamo koordinate uređene n-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 a1 i a2 iz A vrijedi a1 a2 f (a1) f (a2). Tako, na primjer, funkcija sa ℝ u ℝ, koja svakom elementu x ℝ pridružuje vrijednost f (x) = x2, nije injektivna, jer je 1 –1, a ipak je f (1) = f (–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 f (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 f (x) = x2 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 f : ℝ ℝ, ali jeste sirjekcija ako je posmatramo kao funkciju f : ℝ ℝ+ (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 (ℱ–1, B, A), gdje je ℱ–1 inverzna relacija relacije ℱ, naziva se inverzija funkcije f. Ukoliko je ℱ–1 također funkcijska relacija, tako da ova trojka ispunjava uvjete da može biti funkcija, tada se ona naziva inverzna funkcija funkcije f, i obilježava sa f –1. Dakle, f –1 = (ℱ–1, B, A). Ukoliko inverzna funkcija postoji, tada iz f (a) = b slijedi f–1(b) = a. Ukoliko se insistira da inverzna funkcija mora biti potpuna funkcija, tada inverzna funkcija funkcije f postoji ako i samo ako je f bijekcija. Ukoliko se ne insistira na potpunosti inverzne funkcije, tada je potreban i dovoljan uvjet za egzistenciju f –1 injektivnost funkcije f.

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

Restrikcija (ili suženje) funkcije f = (ℱ, A, B) na domen A1 A je funkcija f1 = (ℱ1, A1, B) za koju vrijedi ℱ1 ℱ, odnosno koja je takva da za svaki element a A1 vrijedi f1(a) = f (a). Ako je f1 restrikcija funkcije f, tada isto kažemo da je f ekstenzija (ili proširenje) funkcije f1 na domen A.

U slučajevima kada ne postoji inverzna funkcija funkcije f, uvijek je moguće naći inverznu funkciju neke restrikcije f1 funkcije f na neki domen A1 A. Pri tome se, za različite restrikcije, mogu dobiti različite inverzne funkcije. Na primjer, iako funkcija f : ℝ ℝ zadana pravilom f (x) = x2 nema inverznu funkciju, njene restrikcije f1 : ℝ+ ℝ+ i f2 : ℝ– ℝ+ gdje su ℝ+ i ℝ– skupovi nenegativnih i nepozitivnih realnih brojeva respektivno, a koje su zadane istim pravilima f1(x) = x2 i f2(x) = x2, imaju respektivno

Page 3: Predavanje 6 MLTI

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 2014/15)

3

inverzne funkcije date pravilima f1–1(x) = √ i f2–1(x) = –√ . U malo slobodnijem izražavanju, ovako definirane funkcije f1

–1 i f2–1 također nazivamo inverzne funkcije funkcije f, iako je jasno da to nije u

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 x A kažemo da je fiksna tačka funkcije f ukoliko vrijedi f(x) = x. Na primjer, funkcija f : ℝ ℝ zadana pravilom f (x) = x3 – 6 x2 + 12 x – 6 ima tri fiksne tačke x = 1, x = 2 i x = 3. Skup X A za koji vrijedi f (X) = X naziva se invarijanta funkcije f. Svi elementi invarijante mogu ali ne moraju biti fiksne tačke. Na primjer, skup X = {2, 6} je invarijanta funkcije f : ℝ ℝ zadane pravilom f(x) = 8 – x (jer je f (2) = 6 i f (6) = 2, pa je f (X) = X), iako niti x = 2 niti x = 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 f1 = (ℱ1, A, B) i f2 = (ℱ2, B, C), u oznaci f1

○ f2, smatramo funkciju f1 ○ f2 = (ℱ1

○ ℱ2, A, C). Dakle, ako je f1 : A B i f2

: B C, tada je f1 ○ f2

: A C, pri čemu je (f1 ○ f2)(a) = f2( f1(a)). 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 f2

○ f1 onako kako je ovdje definiran produkt f1 ○ f2, odnosno ( f1

○ f2)(a) = f1( f2(a)).

Funkciju f(n) definiranu rekurzivnim pravilom f(n) = f(n–1) ○ f uz početni uvjet f (1) = f nazivamo n-ti stepen odnosno n-ta iteracija funkcije f. Tako vrijedi f(2)(x) = f (f (x)), f (3)( x) = f ( f ( f (x))) i, općenito, f(n)(x) = f ( f(n–1)(x)). Funkcija i(x) za koju vrijedi i(x) = x nazivamo identička funkcija (za njeno potpuno određenje, neophodno je specificirati i odgovarajući domen). Korisno je usvojiti da je f (0)(x) = i(x). Lako je provjeriti da vrijedi f ○ f–1 = f–1 ○ f = i.

Nekim vrstama funkcijama daju se i posebna imena. Tako se, na primjer, funkcija f : {1, 2, ..., n} A naziva konačni niz (konačna sekvenca) u skupu A, dok se funkcija f : ℕ A naziva beskonačni niz (beskonačna sekvenca), ili samo niz (sekvenca). Umjesto f (i) tada tipično pišemo fi .

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 f (x), recimo izrazom poput f (x) = x2 + 5. Međutim, izuzetno je značajno razlikovati funkciju f i vrijednost funkcije f za neku zadanu vrijednost x, koju obilježavamo sa f (x). Recimo, u navedenom primjeru, nipošto ne treba shvatiti da je sama funkcija f jednaka izrazu x2 + 5, nego je vrijednost funkcije f za zadanu vrijednost argumenta x jednaka vrijednosti izraza x2 + 5. To jasno govori i oznaka f (x) koju jasno čitamo kao “vrijednost funkcije f za vrijednost argumenta x”. Dakle, f (x) je broj (uz pretpostavku da je kodomen funkcije f neki skup brojeva), dok f nije broj, nego funkcija. Međutim, kako ćemo zapisati čemu je jednaka sama funkcija f ukoliko znamo izraz koji definira vrijednost f (x)? 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 f (x) = x2 + 5, možemo pisati

f = x . x2 + 5

Dakle, izraz x . x2 + 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 x . x2 + 5 i y . y2 + 5 predstavljaju posve istu funkciju. Za razliku od toga, primijetimo da f (x) i f (y) nisu jedno te isto: f (x) je vrijednost funkcije za vrijednost argumenta x, dok je f (y) vrijednost funkcije za vrijednost argumenta y, a vrijednosti argumenata x i y 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 (x . x2 + 5)(3) posve legalan. U osnovi, on je identičan izrazu f (3) u kojem je funkcija f definirana izrazom f (x) = x2 + 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. Očigledno, iz prikazane neformalne definicije -operatora slijedi x . f (x) = f, tako da je, u izvjesnom smislu, -operator inverzan operatoru primjene funkcije na svoj argument.

Page 4: Predavanje 6 MLTI

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 2014/15)

4

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 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 f = a . b . a + b i ispitajmo šta je, recimo, f (3). Prema definiciji -operatora, direktno slijedi f (3) = b . 3 + b. Dakle, primjena funkcije f na vrijednost argumenta 3 daje kao rezultat izraz b . 3 + b koji je i sam funkcija. Imamo interesantnu situaciju: f 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 f (3)(2) i odgovor je, naravno, 3 + , odnosno 5. Općenito je f (x)( y) = x + y. Jasno je da možemo pisati i nešto poput g = f (3), tako da je g(x) = 3 + x, ili jednakost poput (a . b . a + b)(3)(2) = 5. Drugim riječima, f 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 f (x, y) upravo f (x)( y). Inače, interpretaciju po kojoj se funkcije koje zavise od više argumenata poput f (x1, x2, ..., xn) interpretiraju kao kaskada f (x1)(x2) ... (xn) (za razliku od uobičajene interpretacije prema kojoj se radi o funkciji čiji je argument uređena n-torka (x1, x2, ..., xn)) 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 g = f . x . f ( f ( f (x))). Da bismo vidjeli šta predstavlja ovaj izraz, pretpostavimo da je h neka funkcija. Tada je g(h) = x . h(h(h(x))). Očigledno, g(h) je ponovo funkcija i to takva da vrijedi g(h)(x) = h(h(h(x))). Dakle, g(h) je funkcija koja primijenjena na argument x daje isti rezultat kao funkcija h primijenjena tri puta uzastopno (funkciju g mogli bismo čitati kao “triput”). Primijetimo da funkcija g kao svoj argument zahtijeva ponovo neku funkciju (lako se vidi da bi izraz poput g(2) bio besmislen), tako da je g 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

f = x x2 + 5

Stoga je, u Maple-sintaksi, izraz poput (x x2 + 5)(3) legalan (i vrijednost mu je jednaka 14). 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.

Page 5: Predavanje 6 MLTI

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 2014/15)

5

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 a ℛ b tipično pišemo a ≼ b odnosno a ≺ b. Pri tome, ukoliko je a b, kažemo da se element a nalazi ispred elementa b (u odnosu na posmatranu relaciju poretka), odnosno da se element b nalazi iza elementa a. Za element c kažemo da se nalazi između elemenata a i b (u odnosu na posmatranu relaciju poretka “≼”) ukoliko vrijedi a ≼ c i c ≼ b, dok za elemente a i b kažemo da su susjedni ukoliko ne postoji element c koji bi se nalazio između elemenata a i b. Najzad, kažemo da je element a neposredni prethodnik elementu a ukoliko je a ≼ b i ukoliko su pored toga elementi a i b 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 a i b vrijedi ili a ≼ b, ili b ≼ a, dok kod relacije parcijalnog poretka to ne mora vrijediti. Kod relacija parcijalnog poretka, ukoliko za par različitih elemenata a i b ne vrijedi niti a ≼ b, niti b ≼ a, tada kažemo da su a i b neuporedivi u odnosu na razmatranu relaciju poretka. Ukoliko je za neku relaciju parcijalnog poretka pripadna relacija “biti neuporediv” tranzitivna (tj. ukoliko kad god su a i b kao i b i c 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.

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 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 z1 ≺ z2 ako i samo ako je | z1 | < | z2 |. 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 z1 neuporediv sa z2 (u odnosu na ovu relaciju) i z2 neuporediv sa z3, tada je jasno da je tada i z1 neuporediv sa z3, 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.

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 = {a, b, c+ 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

Page 6: Predavanje 6 MLTI

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 2014/15)

6

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.

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, {a} 2, {b} 3, {c} 5, {a, b} 6, {a, c} 10, {b, c} 15 i {a, b, c} 30.

Prethodni primjer ukazuje na potrebu sljedeće definicije. Za dva uređena skupa (X, ≼1) i (Y, ≼2) 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 “≼1” relacijom “≼2” očuva poredak, odnosno, formalno rečeno, ukoliko postoji neko obostrano jednoznačno (bijektivno) preslikavanje f : X Y (koje obavlja traženo preimenovanje) takvo da iz x ≼1 y slijedi f (x) ≼2 f ( y). Samo preslikavanje f naziva se izomorfizam sa uređenog skupa (X, ≼1) na (Y, ≼2).

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 = {Sx | Sx = { y | y X y ≼ x} x X}

Pri tome je traženi izomorfizam dat kao

f (x) = { y | y X y ≼ x}.

š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

{a} {b} {c}

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

{a, b, c}

a

b c

{a}

{b, c}

{a, b, c}

{a, c}

{a, b}

{b}

{c}

Page 7: Predavanje 6 MLTI

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 2014/15)

7

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 “≺” odgovarajuća relacija strogog poretka koja odgovara relaciji poretka “≼” (odnosno relacija prema kojoj je x ≺ y ako i samo ako je x ≼ y i x y). Skup svih elemenata x X za koje vrijedi a ≼ x ≼ b naziva se segment sa krajevima a i b (u odnosu na razmatrani uređeni skup), dok se skup svih elemenata x za koje vrijedi a ≺ x ≺ b naziva interval sa krajevima a i b. Segment odnosno interval sa krajevima a i b obilježavaju se respektivno sa [a .. b] i (a .. b). Formalno zapisano, imamo

[a .. b] = {x X | a ≼ x x ≼ b}

(a .. b) = {x X | a ≼ x x ≼ b x a x b}

Umjesto oznaka [a .. b] i (a .. b) mogu se koristiti i oznake [a, b] odnosno (a, b), ali samo ako ne postoji opasnost brkanja sa obilježavanjem uređenih parova, s obzirom da se oznaka (a, b) 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] = {x ℕ : 5 | x x | 50} = {5, 10, 25, 50}

[10 .. 30] = {x ℕ : 10 | x x | 30} = {10, 30}

[15 .. 25] = {x ℕ : 15 | x x | 25} =

[15 .. 60] = {x ℕ : 15 | x x | 60} = {15, 30, 60}

(5 .. 50) = {x ℕ : 5 | x x | 50 x 5 x 50} = {10, 25}

(10 .. 30) = {x ℕ : 10 | x x | 30 x 10 x 30} =

(15 .. 25) = {x ℕ : 15 | x x | 25 x 15 x 25} =

(15 .. 60) = {x ℕ : 15 | x x | 60 x 15 x 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.

Neka je (X, ≼) neki uređen skup. Za element x 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 x ≼ y za svako y X. Slično, za element x 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 y ≼ x za svako y 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 y X (y x) takav da je y ≼ x. Slično, element x je maksimalni element uređenog skupa (X, ≼) ukoliko ne postoji element koji se

Page 8: Predavanje 6 MLTI

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 2014/15)

8

nalazi iza njega, odnosno ukoliko ne postoji y X (y x) takav da je x ≼ y. 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:

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 Xn možemo uvesti relaciju poretka tako što ćemo definirati da je (a1, a2, ..., an) ≼ (b1, b2, ..., bn) ako i samo ako za neki indeks k = 1 .. n vrijedi da je ak ≼ bk i ai = bi za sve vrijednosti i < k. 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 X3 imamo (a1, a2, a3) ≼ (b1, b2, b3) ako je a1 ≼ b1, ili ako je a1

= b1 i a2 ≼ b1, ili ako je a1 = b1 i a2 = b2 i a3 ≼ b3.

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.

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 {x | x ℤ x < + 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

2 3 5

6 10 15

Page 9: Predavanje 6 MLTI

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 2014/15)

9

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 X kažemo da je gornja granica (majoranta) skupa A ukoliko je y ≼ x za svako y A (tj. ukoliko su svi elementi skupa A ispred njega). Slično, element x X je donja granica (minoranta) skupa A ukoliko je x ≼ y za svako y 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 = {x ℝ | –1 < x < + 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 x za koje je x | 10, x | 20 i x | 25. 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 | x, 20 | x i 25 | x, 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 x ≾ y i y ≾ x čak i kad je x y. Na primjer, ukoliko u skup ℝ2 uvedemo relaciju “≾” takvu da vrijedi (x1, y1) ≾ (x2, y2) ako i samo ako je x1 x2, tada “≾” nije relacija poretka, ali jeste relacija kvaziporetka. Slično, uvedemo li u skup kompleksnih brojeva relaciju prema kojoj je z1 ≾ z2 ako i samo ako je | z1 | | z2 |, takva relacija nije relacija poretka ali jeste kvaziporetka (za dva različita kompleksna broja z1 i z2 koji imaju isti modul istovremeno vrijedi i z1 ≾ z2 i z2 ≾ z1), 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). 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 x ≾ y niti y ≾ x).

Svakoj relaciji kvaziporetka “≾” u nekom skupu X može se pridružiti jedna relacija ekvivalencije po kojoj je x ~ y ako i samo ako je x ≾ y i y ≾ x (tada kažemo da su x i y kvaziekvivalentni u odnosu na relaciju “≾”). Sada, ako ukoliko posmatramo faktor-skup X /~ u odnosu na tako definiranu relaciju

Page 10: Predavanje 6 MLTI

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 2014/15)

10

ekvivalencije i definiramo relaciju “≼” uzimajući da je ,x] ≼ [y] ako i samo ako je x ≾ y, tako definirana relacija “≼” postaje relacija poretka u skupu X /~ (nije teško vidjeti da ova definicija ne ovisi o izboru konkretnih predstavnika x i y klasa [x] i [ y]). 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 x i y za koje istovremeno vrijedi i x ≼ y i y ≼ x. 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 n-arnim relacijama. Klasične operacije sa skupovima, poput

unije, presjeka itd. primjenljive su i na n-arne relacije, ali postoje i posebne operacije namijenjene isključivo za rad sa n-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 n-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 ℛ1 A1 A2 ... An i ℛ2 B1 B2 ... Bm. Njihov Descartesov proizvod ℛ1 ℛ2 dat je pomoću izraza

ℛ1 ℛ2 = {(a1, a2, ..., an, b1, b2, ..., bm) | (a1, a2, ..., an) ℛ1 (b1, b2, ..., bm) ℛ2} Na primjer, neka su zadane (ternarne) relacije ℛ1 = {(1, 2, 3), (4, 1, 6), (3, 2, 4)} i ℛ2 = {(2, 7, 1), (4, 1, 6)}. Tada je

ℛ1 ℛ2 = {(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)}

Primijetimo da ova definicija Descartesovog proizvoda relacija nije u potpunosti ekvivalentna definiciji Descartesovog proizvoda skupova, s obzirom da je (a1, a2, ..., an, b1, b2, ..., bm) ((a1, a2, ..., an), (b1, b2, ..., bm)). S druge strane, ovakva modificirana definicija je znatno pogodnija za praktične primjene.

Količnik relacija ℛ1 i ℛ2, u oznaci ℛ1 ℛ2, je relacija ℛ3 takva da vrijedi ℛ3 ℛ2 = ℛ1, ukoliko takva relacija postoji.

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

m-arnu relaciju definiranu izrazom

i1, i2, ..., im(ℛ) = {(ai1, ai2, ..., aim) | (a1, a2, ..., an) ℛ}

Na primjer, za relaciju ℛ1 iz prethodnog primjera imamo:

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

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

P(ℛ) = {(a1, a2, ..., an) | (a1, a2, ..., an) ℛ P(a1, a2, ..., an)}

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

Page 11: Predavanje 6 MLTI

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 2014/15)

11

#2 = 2(ℛ1)= {(1, 2, 3), (3, 2, 4)} #1 > 3 #2 < 10(ℛ1) = {(4, 1, 6)}

Ovdje je iskorištena često korištena konvencija da se argumenti predikata koji je opisan nekim izrazom nazivaju prosto #1, #2, #3 itd. da se izbjegnu pretpostavke o tome kako se ti argumenti zaista zovu, Tako je #1 prva koordinata relacije, #2 druga koordinata, itd.

-spajanje relacija ℛ1 i ℛ2 u odnosu na koordinate i, j, u oznaci ℛ ℛ # #

, definira se izrazom

ℛ ℛ # #

= # # (ℛ1 ℛ2)

pri čemu je n broj koordinata relacije ℛ1, dok je neka binarna relacija između i-te koordinate relacije ℛ1 i j-te koordinate relacije ℛ1. Na primjer, za relacije ℛ1 i ℛ2 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 ℛ1 i ℛ2 kod kojih je treća koordinata uređene trojke iz relacije ℛ1 veća od prve koordinate uređene trojke iz relacije ℛ2, što i izražava uvjet #3 > #1.

Konačno, definiraćemo još i prirodno spajanje relacija ℛ1 i ℛ2, u oznaci ℛ1 ℛ2. Prirodno spajanje je definirano samo za relacije ℛ1 i ℛ2 kod kojih se neke koordinate iz ℛ1 i neke koordinate iz ℛ2 popunjavaju iz istih skupova, kao na primjer za relacije ℛ1 A1 A2 A3 i ℛ2 A2 A3 A4 date kao ℛ1 = {(a, b, c), (d, b, c), (b, b, f ), (c, a, d)} i ℛ2 = {(b, c, d), (b, c, e), (a, d, b)}. Da bi se dobila relacija ℛ1 ℛ2, prvo se formira Descartesov proizvod ℛ1 ℛ2. Od dobijenih n-torki uzimaju se samo one koje se poklapaju u koordinatama iz ℛ1 i ℛ2 koje uzimaju vrijednosti iz istih skupova. Na ovaj način su neke koordinate postale identične u svim n-torkama, pa se one izbacuju da ne bi bilo nepotrebnih ponavljanja. Za dati primjer, relacija ℛ1 ℛ2 je podskup od A1 A2 A3 A4, a data je kao

ℛ1 ℛ2 = {(a, b, c, d), (a, b, c, e), (d, b, c, d), (d, b, c, e), (c, a, d, b)}

Za potrebe razumijevanja relacionih modela baza podataka potrebno je još uvesti i još i pojmove funkcionalnih zavisnosti i ključeva kod n-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 n-torke iz ℛ koje se poklapaju u koordinatama skupa X, a razlikuju u bar jednoj koordinati skupa Y. Na primjer, neka je data relacija ℛ = {(a, a, a, b), (a, b, b, a), (a, a, a, a), (b, b, a, b)}, pri čemu je ℛ A1 A2 A3 A4. Kod ove relacije važe funkcionalne zavisnosti *A1, A2} {A3}, {A2, A3} {A1}, itd. Ključ relacije ℛ je svaki skup X njenih koordinata za koji važi X {A1, A2, ...An+. Značaj ključa sastoji se u tome što se sve n-torke u relaciji mogu jednoznačno identificirati samo na osnovu ključa. Na primjer, skup *A2, A4+ čini ključ prethodne relacije.

Operacije sa n-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

Ova tabela, može se modelirati kao 7-arna relacija (nazovimo je, recimo, konkretnijim imenom

“Studenti” umjesto bezličnog imena poput ℛ):

Page 12: Predavanje 6 MLTI

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 2014/15)

12

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 2):

Prezime, Ime, Godina, 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:

Grad, Kanton(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:

Godina 3(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:

Prezime, Ime(Godina 3(Studenti)) = {(Mehić, Meho), (Selmić, Selma), (Bajrić, Bajro), (Vasić, Vaso), (Husić, Meho)}

Page 13: Predavanje 6 MLTI

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 2014/15)

13

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. Za ovu svrhu ponovo treba kombinirati selekciju i projekciju, samo što je ovaj put uvjet nešto komplikovaniji:

Indeks(Godina = 3 Prosjek > 8(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 n-torke koje se poklapaju u brojevima indeksa uzetih iz jedne i druge tabele. To bi izgledalo recimo ovako:

Studenti.Indeks = Demonstratori.Indeks(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

Page 14: Predavanje 6 MLTI

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 2014/15)

14

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:

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

Odgovarajuća SQL naredba je sljedeća:

SELECT DISTINCT Ime, Prezime 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:

Ime, Prezime(Predmet = Fizika(Studenti Demonstratori)) = {(Selmić, Selma), (Anić, Ana)}

Odgovarajuća SQL naredba glasila bi ovako:

SELECT Ime, Prezime 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:

Ime, Prezime(Studenti Predmet = Fizika(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 Ime, Prezime FROM Studenti INNER JOIN

(SELECT * FROM Demonstratori WHERE Predmet = 'Fizika') AS Pomocna

ON Studenti.Indeks = Pomocna.Indeks

Pored namjenskih operacija za rad sa n-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:

Page 15: Predavanje 6 MLTI

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 2014/15)

15

Ime, Prezime(Studenti (Indeks(Predmet = Matematika(Demonstratori))

Indeks(Predmet = Fizika(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 ℛ1 i ℛ2 koje posjeduju neki atribut x vrijedi

x(ℛ1) x(ℛ2) = ℛ1.x(ℛ1

ℛ2)

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.