Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 11

A DISCIPLINE OF PROGRAMMING EDEGER W.

DIJKSTRA

UVOD
Ve dugo vremena sam elio da napi em knjigu koja bi uglavnom li ila na ovu: s jedne strane, znao sam da programi mogu da imaju neodoljivu i duboku lepotu svoje logike, sa druge strane bio sam primoran da priznam da je ve ina programa prikazana na na in koji odgovara mehani kom izvr enju koji su, ak ako u njima i ima neke ljepote, sasvim neprikladni ljudskom poimanju. Drugi razlog mome nezadovoljstvu jeste da se algoritmi esto objavljuju u obliku gotovog dijela, gdje se jedva pominje ve ina razmatranja koja su imala svoju ulogu tokom procesa smi ljanja ovih algoritama i koja bi trebala da opravdaju kona an oblik dovr rnih programa. Moja je po etna ideja bila da objavim izvjestan broj lijepi algoritama na takav na in da italac moze da shvati njihovu ljepotu. Ja sam to zamislio da uradim tako to bih opisao (stvarni ili izmi ljeni) proces smi ljanja, koji bi svaki put dovodio do programa koji se razmatra. Ostao sam vijeran svojoj prvobitnoj zamisli utoliko to je jezgro monografije dugi niz poglavlja, gdje se u svakom novi problem postavlja i rije ava sa druge strane, kona na knjiga je dosta razli ita od one koju sam zamislio. Zadatak koji sam bio sebi postavio: da prika em rije enje na prirodan i ubjedljiv na in provociralo je jo toliko toga da u se uvijek sa rado u sje ati da sam ga preduzeo. Kad se preduzme pisanje knjige poput ove, odmah se postavi pitanje: Kojim se jezikom slu iti za programiranje? i ovo nije pitanje puke prezentacije! Najva niji, ali i najneuhvatljiviji aspekat svakog alata je njegov je uticaj na navike onih koji se obu avaju da se njime slu e. Kad je ovaj alat jezik za programiranje, njegov uticaj je (svi alo se to nama ili ne) uticaj na na e navike mi ljenja. Analiziraju i ovaj uticaj, koliko mi je samo znanje dopu talo, zaklju io sam da ni jedan od postoje ih jezika za programiranje (niti podskup nekog od njih) nebi odgovarao mojoj namjeri. S druge strane, bio sam jo sasvim nespreman da izradim novi jezik za programiranje da sam se zakleo da to ne u preduzeti jo narednih pet godina, a imao sam vrsto osje anje da taj period jo nije istekao. (Pre toga trebalo je jo neke stvari u initi, izme u ostalog, trebalo je napisati i ovu monografiju). Poku ao sam da rije im ovu protivrije nost tako to bih izradio samo mini jezik koji bi odgovarao svojoj namjeni i gdje bih se kona no opredjelio samo tamo gdje bi bilo neizbje no i gdje bi bilo dovoljno opravdano. Ako se ovo moje ustezanje i ograni enje koja sam sebi postavio pogre no razumiju mogu u initi da ova monografija razo ara mnoge potencijalne itaoce. Ona e sigurno razo arati svakog ko te inu programiranja poistovje uje sa te ko ama lukave upotrebe razu enih i baroknih pribora, poznatih kao visoki jezici za programiranje ili jo gore kao sistem za programiranje. Onima koji se budu osje ali prevarenim mojim ignorisanjem svih takvih d id a mid a, mogu samo da odgovorim pitanjem: Jeste li sasvim sigurni da sve te d id e mid e i sva ta sjajna svojstva takozvanih mo nih jezika za programiranje zbilja pripadaju skupu re enja, a ne mo da skupu problema?. Jedino mogu da se nadam da e oni, bez obzira to ja koristim mini jezik, prou iti ovaj tekst; pa po to to u ine, mo da e se slo iti da ak i bez svih d id a mid a ostaje tako bogata materija da se name e pitanje Je li ove d id e mid e uop te ikada trebalo uvoditi? Svim itaocima sa posebnim zanimanjem za sintezu jezika za programiranje samo mogu sa aljenjem da ka em da za sada ne mogu biti eksplicitniji o ovom problemu. S druge strane, nadam se da e ih ova monografija inspirisati i omogu iti im da izbjegnu neke gre ke koje bi mo da u inili da je nisu pro itali. Tokom samog pisanja koje je bilo izvor neprekidnog iznena enja i uzbu enja istekao je tekst koji je bio dosta razli it od onog to sam u po etku imao na umu. Po eo sam sa (razumljivom) te njom da prika em svoj razvoj programa ne to formalnijim aparatom nego to sam uobi avao da inim na svojim uvodnim predavanjima, gdje se semantika uglavnom navodila intuitivno, a dokazivanje korektnosti je bila uobi ajena mje avina rigoroznih argumenata, mahanja rukama i elokvencije. Postavljaju i neophodnu osnovu za ovakav formalniji prikaz, do iveo sam dva iznena enja. Prvo je iznena enje da su tzv. predikatni transformatori koje sam odabrao kao svoje sredstvo omogu ili neposredno definisanje relacije izme u po etnih i kona nih stanja, bez ikakve reference na me ustanja, odnosno na stanja u koja se mo e dospjeti u toku odvijanja programa. Bio

DJIKSTRA MATEMATICKI PRINCIPI PROGRAMIRANJA

sam veoma sre an zbog ovog jer to omogu ava jasno razdvajanje dvije osnovne brige programera: brige za matemati ku korektnost (tj. da li program defini e odgovaraju u relaciju me u po etnim i kona nim stanjem predikatni transformator pru a formalni pribor za ovo ispitivanje, bez da upli ete u sliku sam tok ra unanja) i in injersku brigu o efikasnosti (za koju je sada jasno da je definisana samo u smislu implementacije). Kao jedno od najsretnijih otkri a, pokazalo se da je svaki tekst programa uvijek mogu e interpletirati na skoro komplementarna na ina:  interpletirati ga kao kod predikatskog transformatora, to nama odgovara  interpletirati ga kao izvr ni kod, to bih ja volio da prepustim ma inama Drugo je iznena enje da su najprirodniji i najsistemati niji kodovi predikatskih transformatora koje sam mogao da smislim uvijek povla ili nedeterministi ke implementacije kada bi ih promatrali kao izvr ne kodove. Za neko vrijeme sam bio u asnut od pomisli uvo enja nedeterminizma ve u monoprogramiranju (komplikacije koje je nedeterminizam donjeo kod multiprogramiranja bile su mi suvi e dobro poznate), dok nisam shvatio da interpletacija teksta kao predikatnog transformatora ima sopstveni i nezavisni smisao postojanja. (U osvrtu mo emo da primjetimo da mnogi od problema koje je multiprogramiranje izazvalo u pro losti nisu ni ta drugo nego posljedica nekada nje te nje da se determinizmu pridaje nepotreban zna aj.) Kona no je do lo da smatram nedeterminizam kao normalnu okolnost, dok se determinizam sveo na poseban slu aj i to na ne suvi e interesantan poseban slu aj. Po to sam postavio osnove, poduzeo sam ono to sam oduvjek elio da uradim, tj. da rije im jedan dugi niz problema. Uraditi ovo bilo je neo ekivano u ivanje. Iskusio sam da mi formalni aparat omogu ava da se mnogo vr e dr im onoga to radim nego to sam do tada bio navikao; imao sam zadovoljstvo da otkrijem da eksplicitno razmatranje okon anja mo e imati ogromnu heuristi ku vrijednost do te mjere da sam po eo da alim naklanjanje parcijalnoj korektnosti, koje je danas tako op te. Me utim, najve e je zadovoljstvo bilo da sam za mnoge probleme, koje sam bio ranije rije io, ovaj put na ao jo ljep e rije enje. To je bilo veoma ohrabruju e jer sam to shvatio kao naznaku da su metodi koje sam razvio zbilja usavr ili moju sposobnost programiranja. Kako bi trebalo prou avati ovu monografiju? Najbolji savjet koji mogu da dam je da prestanete sa itanjem im je problem opisan i da poku ate sami da rije ite problem, prije nego to nastavite sa itanjem. Poku aj da sami rije ite problem je jedini na in da se uvjerite koliko je problem te ak, daje vam mogu nost da sopstveno rije enje uporedite sa mojim, a mo e vam donjeti zadovoljstvo da sami otkrijete rije enje koje je bolje od moga. I, jo da vas nagovorim: nemojte se deprimirati kad utvrdite da je tekst daleko od toga da je lak za itanje. Oni koji su prou avali rukopis esto su na li da je te ak (ali jednako zahvalan). Me utim, svaki put kada smo analizirali te ko e, zajedno smo do li do zaklju ka da je sama materija kriva, a ne tekst, odnosno na in izlaganja. Jedina pouka koja se otuda mo e izvu i je da je netrivijalan algoritam jednostavno netrivijalan i da je njegov opis programskim jezikom veoma kompaktan u pore enju sa razmatranjima koja opravdavaju njegov izgled: kratko a kona nog teksta programa ne bi trebalo da vas zavara. Jedan od mojih asistenata je predlo io da manje grupe studenata treba zajedno da ju prou avaju i ja ga vijerno prenosim jer mo da bude od koristi. Ovdije moram da dodam paternalisti ku napomenu o te ini teksta. Po to sam mnogo godina svog nau nog ivota posvetio razja njavanju zadataka programiranja, sa ciljem da ga u inim bolje sprovodivim u intelektualnom smislu, na svoje zaprepa enje (i gnijev) do iveo sam da se ovaj moj napor dosljedno nagra uje optu bom da sam ja na inio programiranje te kim. Me utim, te ko a je uvijek postojala i ako je samo u inimo vidljivom mo emo sa nadati da emo biti sposobni da izra ujemo programe u koje emo imati visoko povjerenje, umjesto da pravimo prljave programe, tj. da pravimo programe zasnovane na jedva utemljenim naga anjima koji ekaju da budu pobijeni prvim protivprimjerom. Vjerovatno je nepotrebno napomenuti da ni jedan program iz ove monografije nije bio provjeren na ma ini. ii

UVOD

itacu dugujem obja njenje za to sam mini jezik zadr ao tako malim da ne sadr i ak ni procedure ni rekurzije. Kako bi svako sljede e pro irenje jezika donjelo knjizi jo nekoliko poglavlja i prema tome je u inilo skupljom, to odsustvo najvjerovatnijih pro irenja (kao npr. multiprogramiranje) ne zahtjeva dodatna obja njenja. Me utim, procedure su uvijek zauzimale tako centralnu ulogu, a rekurzije su opet u ra unarskim naukama tako mnogo bile znak akademskog uva avanja da je neko obja njenje neophodno. Kao prvo, ova monografija nije pisana za po etnike, pa pretpostavljam da su itaoci upoznati sa ovim konceptima. Drugo, ova knjiga nije uvodni tekst za neki jezik za programiranje pa odsustvo ovih konstrukcija i primjera ne treba da se tuma i kao moja nesposobnost ili neraspolo enje da ih koristim, niti kao moja sugestija da neko ko umije da ih koristi ne bi to trebalo da ini. Su tina je da mi nisu bile potrebne da bih prenio svoju poruku tj. kako je pa ljivo odabrana podjela razmatranja su tinska za izradu programa visokog kvaliteta, u svakom smislu. Skromni pribor mini jezika ve nam daje dovoljno irine za netrivijalne, a ipak sasvim zadovoljavaju e izrade programa. Ovo obja njenje, iako dovoljno ipak nije cjelovito. U svakom slu aju, osje am se obaveznim da prika em repetitivnu konstrukciju u njenoj sopstvenoj vrijednosti, iako se meni ini da ovakvo predstavljanje ne bi trebalo da bude neophodno. Kada su jezici za programiranje nastali ini se da se dinami ka priroda naredbe za dodjelu vrijednosti nije sasvim dobro uklapala u stati ku prirodu tradicionalne matermatike. Usled nedostatka odgovaraju e teorije matemati arima dinami ka priroda nije odgovarala, a po to repetitivna konstrukcija stvara problem za dodjelu vrijednosti varijablama to matemati arima nije odgovarala ni repetitivna konstrukcija. Kada su razvijeni jezici za programiranje bez dodjele vrijednosti i bez repetitivne konstrukcije - kao to je isti LISP - mnogi su osjetili olak anje. Takvi su se ponovo na li na poznatim podru ijima i ve su vidjeli tra ak nade da e programiranje postati aktivnost sa dostojnom matemati kom osnovom. (Sve do dana njeg dana me u ra unarskim nau nicima koji su vi e naklonjeni teoriji, jo uvijek postoji iroko rasprostranjeno osje anje da rekurzivni programi prirodnije nastaju nego iterativni.) Trebalo je da ekamo slijede ih deset godina na alternativni prilaz tj. da se par repeticije i dodjele vrijednost varijabli snabdije sa solidnom i efektivnom matemati kom osnovom. Rezultat je bio, kao to e biti prikazano u ovoj monografiji, da se semantika repetitivne konstrukcije mo e definisati rekurzivnom relacijom me u predikatima, dok definicija semantike op te rekurzije zahtjeva rekurentnu relaciju me u predikatnim transformatorima. Ovo jasno pokazuje za to smatram rekurziju za red veli ine kompleksnijom nego samu repeticiju i zato me vre a da vidim semantiku repetitivne konstrukcije 'while B do S' definisanu kao poziv: 'whiledo(B, S)' rekurzivne procedure (opisane sintaksom ALGOL-a 60) procedure whiledo (condition, statment); begin if condition then begin statment; whiledo (condition, statment) end end Vre a me, iako je ta no, jer ne volim da se satarom razbija jaje, ma koliko satara bila efikasna za tu svrhu. Za generaciju ra unarskih teoreti ara koji su se ovom materijom bavili ezdesetih godina, prethodna rekurzivna definicija esto nije samo prirodna nego je ak i jedino istinita. U svjetlu injenice da ak uop te ne mo emo da defini emo rad Turingove ma ine bez da se pozovemo na pojam repeticije, izgleda da se ukazuje potreba ponovnog razmatranja uzajamnog zna aja repeticije i rekurzije. iii

DJIKSTRA MATEMATICKI PRINCIPI PROGRAMIRANJA

Za odsustvo bibliografije ne nudim niti obja njenje niti izvinjenje. Priznanja. Sljede i ljudi su imali neposredan uticaj na ovu knjigu, bilo voljom da diskutuju o njenom planiranom sadr aju ili komentari u i (dijelove) dovr enog rukopisa: C. Bron, R.M.Burstall, W.H.J.Ferjen, C.A.R.Hoare, D.E.Knuth, M.Rem, J.C.Reznolds, D.T.Ross, C.S.Scholten, G.Seegmuller, N.Wirth, M.Woodger. ast mi je da mogu pismeno da izrazim zahvalnost za njihovu saradnju. Potom, mnogo dugujem Burroughs korporaciji koja mi je pru ila priliku i snabdjela me neophodnim sredstvima i zahvalan sam svojoj supruzi na pouzdanoj podr ci i hrabrenju. EDSGAR W. DIJKSTRA Nuenen, Holandija

iv

0. APSTRAKCIJA POSTUPKA
Apstrakcija postupka tako je duboko u osnovama pojma algoritma da je obi no uzimamo za gotovo i ostavljamo nepomenutom.Njena je namjena da preslikava postupke jedan preko drugoga. Ili, na drugi na in, ona se odnosi na na in kojim stvaramo intelektualno poimanje odre enog ra unanja tako to ga smatramo pripadnikom ve e klase razli itih ra unanja; tako mo emo da apstrahujemo uzajamne razlike me u lanovima klase i, na osnovu definicije klase kao cijeline da u inimo tvrdnje jednako primjenljivim na svaki od lanova pojedina no pa prema tome i na odre ena ra unanja koja elimo da razmatramo. Da bismo potpuno razjasnili ta mislimo pod ra unanjem dozvolite mi da opi em nera unski mehanizam koji proizvodi - namjerno izbjegavam rije ra una - npr. najve i zajedni ki djeljitelj brojeva 111 i 259. Sastoji se od dvije drvene plo e postavljene jedna povrh druge. Na gornjoj je napisano 'NZD(111, 259)='; da bi mehanizam proizveo rezultat podignemo gornju plo u i spustimo je lijevo od donje na kojoj tada mo emo da pro itamo '37'. Jednostavnost mehanizma sa plo icama je velika vrlina, ali je pomra ena sa dva nedostatka, jednim manjim i jednim ozbiljnijim. Manji je u tome da se mehanizam zaista mo e upotrebiti za proizvodnju najve eg zajedni kog djeljitelja 111 i 259, ali jedva za i ta drugo. Me utim, ve i nedostatak se sastoji u tome da, ma kako pa ljivo ispitali konstrukciju mehanizma, na e povjerenje da on zaista proizvodi ta an rezultat mo e biti zasnovano samo na povjerenju u proizvo a a: mogu e je da je proizvo a na inio gre ku, bilo u konstrukciji mehanizma, bilo kada je izra ivao na primjerak. Da bi prevazi li manju zamjerku mogli bi da razmotrimo mogli bi da razmotrimo ogromnu da aru koja bi inila veliku pravougaonu ahovnicu ija bi polja imala cjelobrojne koordinate x i y koji zadovoljavaju 0 x 500 i 0 y 500. Za sva polja (x, y) koja imaju pozitivne koordinate, tj. isklju iv i polja na osama, mo emo da napi emo vrijednost od NZD(x, y) na samim poljima. Drugim rije ima, predla emo dvodimenzionalnu tabelu sa 250000 polja. Sa stanovi ta upotrebljivosti, ovo je veliko unapre enje: umjesto mehanizma koji mo e da isporu i najve i zajedni ki djeljitelj jednog para brojeva sada imamo mehanizam sposoban da isporu i najve i zajedni ki djeljitelj za ma koji od 250000 razli itih parova brojeva. Izvrsno, ali ipak ne bi trebalo da se suvi e odu evljavamo. Jer ono to smo ustanovili kao drugi nedostatak Za to treba da vjerujemo da mehanizam proizvodi ta an rezultat? - sad se umno ilo 250000 puta; sada bi trebali da imamo ogromno povjerenje u proizvo a a. Razmotrimo sada drugi mehanizam. Na istoj ahovnici na kojoj je nacrtana mre a linija koje dijele polja jedino su upisani brojevi od 1 do 500 uz obije ose. Osim toga, nacrtane su i sljede e prave: 1. 2. 3. 4. vertikalna prave ( ije su jedna ine x=const); horizontalne prave ( ije su jedna ine y=const); dijagonale ( ije su jedna ine x+y=const); linija re enja ( ija je jedna ina x=y).

Da bismo upravljali ovom ma inom treba da sljedimo sljede a uputstva: (da igramo igru prema sljede im pravilima). Kada elimo da na emo najve i zajedni ki djeljitelj dva broj X i Y postavimo kami ak kojim nas je tako e snabdjeo proizvo a na mre u u ta ci sa koordinatom x=X i y=Y. Sve dok se kami ak ne na e na liniji re enja uo avamo najmanji jednakokraki pravougli trougao u ijem se tjemenu pravog ugla nalazi kami ak a jedan od o trih uglova le i na jednoj od koordinatnih osa (bilo ispod, bilo lijevo od kami ka). Po to se kami ak ne nalazi na liniji re enja najmanji trougao e imati samo jedan o tar ugao na jednoj od koordinatnih osa. Potom se kami ak pomjeri u ono drugo o trougaono tjeme trougla. Ovaj potez se ponavlja sve dok kami ak kona no ne dospije na liniju rije enja, kada dospije onda x-koordinata (ili y-kordinata) kona nog polo aja kami ka predstavlja tra eni rezultat.

DJIKSTRA MATEMATICKI PRINCIPI PROGRAMIRANJA

ime mo emo da se poslu imo ako elimo da se uvjerimo da ova ma ina proizvodi ta an rezultat? Ako sa (x,y) ozna imo bilo koji od 249500 polo aja koji ne le e na liniji re enja a sa (x', y') ta ku u koju se kami ak pomjera u sljede em potezu igre, onda: ili je x'=x a y'=y-x ili je x'=x-y a y'=y. Nije te ko dokazati da je NZD(x,y) = NZD(x',y'). Va no je uo iti da isti ovaj argument jednako va i za svaki od 249500 mogu ih poteza. Potom to tako e nije te ko mo emo dokazati da za svaku ta ku (x,y) za koju je x=y (tj. takvu da je (x,y) jedna od 500 ta aka na liniji re enja) da je NZD(x,y)=x. Ponovo je va no uo iti da je isti argument jednako primjenljiv na svaki od 500 ta aka linije rije enja. Tre e a ovo opet nije te ko treba da poka emo da za svaki po etni polo aj (X,Y) postoji kona an broj poteza koji e zbilja dovesti kami ak na liniju re enja uz, ponovo va nu primjedbu da e isti argument jednako va iti za svaki od 250000 po etnih polo aja (X,Y). Tri jednostavna argumenta ija du ina ne zavisi od veli ine koordinatne mre e: u maloj maketi ilustruje korist matematike. Ozna avaju i sa (x, y) ma koji polo aj u kojem se kami ak mo e na i tokom igre koja je po ela od polo aja (X,Y) na a prva teorema nam omogu ava da zaklju imo da e relacija: NZD(x,y) = NZD(X,Y) va iti tokom itave igre ili, kako se u argonu ka e da e biti invarijantna. Druga teorema nam ka e da x koordinatu kona nog polo aja kami ka mo emo uzeti za tra eno rije enje, a tre a teorema nam ka e da kona an polo aj kami ka postoji (odnosno da ga je mogu e dosti i kona nim brojem poteza). Ovim je zavr ena analiza onog to bi mogli da nazovemo svojom apstraktnom ma inom. Na je sljede i zadatak da provjerimo da ahovnica kojom nas je snabdjeo proizvo a zbilja predstavlja vjerni model na e apstraktne ma ine. U tu svrhu treba da provjerimo brojeve upisane du obje ose i da provjerimo jesu li sve linije pravilno nacrtane. Ovo je pone to mu no jer treba da ispitamo objekte iji je broj srazmjeran N a N je u na em slu aju 500, to je du ina stranice kvadrata, no to je jo uvijek bolje nego N2, to je broj mogu ih ra unanja. Alternativna ma ina mogla bi da ne koristi veliku ahovnicu, ve 2 devet-bitna registra, od kojih je svaki sposoban da registruje broj izme u 0 i 500. Jedan bismo registar mogli da iskoristimo da pamti vrijednost x koordinate, a drugi da pamti vrijednost y koordinate, uz dogovor da ove dvije vrijednosti odgovaraju teku im koordinatama kami ka. Tada jednom potezu ma ine odgovara umanjivanje sadr aja jednog registra za vrijednost sadr aja drugog registra. Ra unsku radnju bismo mogli da obavljamo sami, naravno bolje je kada bi ma ina to mogla da radi. Ako elimo da vjerujemo u rezultat treba da je mogu e da se uvjerimo da ma ina ispravno upore uje i oduzima. Ovdje se istorija ponavlja u malom: jednom za svagda (tj. za svaki par n-mesnih binarnih brojeva) izvedemo jedna ine binarnog oduzimanja i onda se uvjerimo da fizi ka ma ina predstavlja vjerni model binarnog oduzima a. Ako je oduzima paralelni, onda je broj provjera proporcionalan broju komponenti i njihovim spregama, proporcionalan sa n=log2 N. Kod serijske ma ine je kompromis vremena rada u odnosu na slo enost mehanizma pomjeren jo za jedan korak. Dozvolite mi, bar radi sopstvenog razmi ljanja, da uo im glavno iz prethodnog primjera. Umjesto da razmatramo pojedina ni problem: kako da izra unamo NZD(111, 259), problem smo uop tili i smatrali ga jednim primjerom iz ire klase problema: kako izra unati NZD(X, Y). Vrijedi ista i da smo problem izra unavanja NZD(111, 259), mogli da uop timo i na drugi na in: mogli smo da ovaj zadatak smatramo kao jedan iz ire klase zadataka kao to su: izra unavanje NZD(111,259), NZS(111, 259), 111*259, 111+259, 111/259, 111-259, 111259, dan sedmice 111-tog dana 259-te godine nove ere itd. Ovim bi nastao 111 i 259 procesor i da bi se dobio eljeni odgovor trebalo bi, kao ulaz, da izdamo zahtijev: molim NZD. Umjesto toga, predlo ilismo NZD ra unar kome kao ulaz treba dati par brojeva 111, 259 da bi proizveo eljeni odgovor to predstavlja sasvim razli itu ma inu. 2

0.

APSTRAKCIJA POSTUPKA

Drugim rije ima, kada se tra i da se proizvede jedan ili vi e rezultata uobi ajeno je da se problem uop ti tako da se ovi rezultati mogu smatrati pojedina nim uzorcima iz neke ire klase. Me utim, ne vrijedi jednostavno re i da je sve poseban slu aj ne eg op tijeg. Ako elimo da preduzmemo ovakav prilaz moramo da po tujemo dvije obaveze: 1. Treba da budemo sasvim jasni kako uop tavamo, tj. iru klasu moramo da odaberemo pa ljivo, da je defini emo eksplicitno, jer svaki na argument morati da va i za cijelu klasu. 2. Treba da odaberemo (ili, ako ho ete, da izumimo) uop tavanje koje slu i svojoj svrsi. U prethodnom primjeru, sigurno u dati prednost NZD ra unaru nad 111 < 259 procesorom, a pore enje me u njima da e nam da naslutimo koja svojstva ine da uop tavanje slu i svojoj svrsi. ma ina koja na zahtijev mo e kao odgovor da proizvede vrijednost jedne od raznih sumanutih funkcija od 111 i 259 postaje sve te a za provjeru kako broj ovih funkcija raste. To je u o troj suprotnosti sa na im NZD ra unarom NZD ra unar bi bio jednako lo kada bi se sastojao od ahovnice sa 250000 polja, od kojih bi svako sadr avalo gotov odgovor. Jedinstvena osobina na eg NZD ra unara je u tome da ga je mogu e zadati kompaktnim skupom pravila igre, gdje izvo enje igre prema njima proizvodi odgovor. Ogroman je doprinos da nam jedan argument primjenjen na ova pravila omogu ava da doka emo sve bitne tvrdnje o ishodu svake od igara. Cijena koju za ovo treba platiti je da pri svakom od 250000 mogu ih primjena ovog pravila odgovor ne dobijamo s mesta: svaki put igra treba da se odigra prema pravilima. injenica da smo mogli da damo tako kompaktnu formulaciju pravila igre da nam jedinstven argument daje zaklju ak o svakoj od mogu ih igara, tijesno je povezan sa sistemskim rasporedom 250000 ta aka mre e. Bili bismo bespomo ni kada bi se plo a sastojala od bezobli nih, haoti nih obla i a ta aka bez sistemske nomenklature. Me utim, sa stvarima postavljenim kako jesu, mogli smo da razdvojimo kami ak na dva polukami ka, pa da jedan polukami ak pomjerimo nani e, sve dok se ne na e na horizontalnoj osi, a drugi polukami ak da pomjerimo uljevo sve dok se ne na e na vertikalnoj osi. Umjesto da se bavimo sa 250000 mogu ih polo aja kami aka, mo emo da se bavimo sa dva polukami ka od kojih svaki ima samo 500 mogu ih polo aja, odnosno da se bavimo samo sa 1000 polo aja ukupno. U argonu ka emo da: ukupan prostor stanja posmatramo kao Kartezijev proizvod prostora stanja varijabli x i y. Sloboda da jedan kami ak sa dva stepena slobode zamjenimo sa dva kami ka od kojih svaki ima samo jedan stepen slobode, iskori ena je u predlo enoj dvo-registarskoj ma ini. Sa tehni kog stanovi ta, ovo je veoma privla no: samo treba izgraditi registre koji su sposobni da razlikuju 500 razli itih slu ajeva (vrijednosti) i jednostavnom kombinacijom dva registra ukupan broj razli itih slu ajeva se kvadrira. Ovo multiplikativno pravilo nam omogu ava da razlikujemo ogroman broj mogu ih stanja pomo u skromnog broja komponenti, od kojih svaka ima samo skroman broj mogu ih stanja. Dodavanjem ovih komponenti veli ina prostora stanja raste eksponencijalno, ali moramo imati na umu da ovo mo emo da inimo samo pod uslovom da pri tome argument koji logi ki opravdava na u ma ineriju ostaje vrlo kompaktan; kad argument tako e po ne da raste eksponencijalno onda vi e uop te nema smisla konstruisati ma inu. Napomena: Izvrsna ilustracija predhodnog mo e se na i u izumu koji je sada star vi e od 10 vijekova: decimalni brojni sistem. On ima zbilja fascinantno svojstvo da broj potrebnih cifara raste tek proporcionalno logaritmu najve eg broja koga treba napisati. Binarni brojni sistem je ono to se dobija kada se zaboravi da imamo po pet prstiju na ruci. U prethodnom smo se bavili jednim aspektom veli ine, tj. velikim brojem polo aja kami ka (=mogu ih stanja). Postoji i analogna mnogostrukost, tj. veliki broj razli itih igara (=prora una) koji se mogu igrati prema na im pravilima: da budemo ta ni, po jedna igra za svaki po etni polo aj 3

DJIKSTRA MATEMATICKI PRINCIPI PROGRAMIRANJA

kami ka. Na a pravila igre veoma su op ta u smislu da su primjenljiva za ma koji po etni polo aj. Ali, mi smo insistirali na kompaktnom opravdanju za pravila igre, a ovo povla i da i sama pravila igre moraju biti kompaktna. U na em primjeru, ovo se postiglo sljede im na inom: umjesto da nabrajamo: uradi ovo, uradi ono, mi smo pravila igre zadali pomo u pravila kako da se izvede jedan korak, uz uslov koji ka e trebali taj korak da se izvede jo jednom. (Kad smo ve kod toga, u na oj igri ovaj korak treba ponavljati sve dok se ne stigne u stanje u kojem korak nije definisan). Ovo je vrlo mo an na in. Jedan algoritam sadr i konstrukciju klasa prora una koji se mogu desiti i ijim odvijanjem on upravlja; zahvaljuju i uslovljenom ponavljanju koraka, prora uni u ovoj klasi se mogu veoma razlikovati po du ini. S druge strane, na ovo mo emo da gledamo kao na prvu slutnju za to nam trebaju krajnje brze ma ine. Zaprepa uju e je, ipak, da je ovo poglavlje moglo biti napisano dok mi je Euklid gledao preko ramena.

You might also like