You are on page 1of 231
Edsger W. Dijkstra Umiejetnosc programowania Z angielskiego przelozyli BARBARA OSUCHOWSKA I WLADYSLAW M. TURSKI Wydawnictwa Naukowo-Techniczne Warszawa 1978 A Discipline of Programming Dane o oryginale EpscEr W. DUKSTRA ‘Burroughs Research Fellow, Professor Extraordinarius, ‘Technological University, Eindhoven Original English language edition published by Prentice-Hall, Inc. Englewood Cliffs, New Jersey, USA Copyright © 1976 by Prentice-Hall, Inc. All rights reserved Copyright © for the Polish edition by Wydawnictwa Naukowo-Techniczne Warszawa 1978 All rights reserved Printed in Poland W ksiaive tej Autor, jeden z najwybitniejszych informatykéw Swiata, praedstawia swe poslady na umiejetnos programowania, traktowana jako zdyscyplinowane postepowanie mySlowe sluzace pYecyzyjnemu i oszczednemu wyrazaniu rozwiazafi postawionych zadafi. Za pomoca_ specjalnego jezyka o skromnej budowie i écisle okreslonej semantyce konstruuje wiele niezwykle udanych algorytmow, ilestrujac pray ich okazji pewne ogdlne zasady dobrego programowania. Liczne, bardzo osobiste komentarze i eseje na tematy zwigzane z metodami programowania nadajq ksiazce unikalny charakter zywej gawedy, nader pouczajacej, a przy tym bardzo interesujacej. Ksiazka jest praeznaczona la programistow, projektantéw systeméw przetwarzania informacji, pracownikéw nauki zaimujacych sig informatyka, studentéw kierunk6w informatycznych oraz dla przedstawicieli innych dyscyplin, interesujacych sig przetwarzaniem informacji. 681.3.06 Obwolute, oktadke uklad typograficzny serii projektowat ‘Tapeusz, PIETRZYE Redaktor technicany ANNA NAPIORKOWSKA Spis tresci Stowo wstepne VIL Przedmowa Ix 0 Spraweza abstrakcja 1 1 Rola jezykéw programowania 6 2 Stany i ich charakteryzowanie 9 3 Charakteryzowanie semantyki 15 4 Semantyczne scharakteryzowanie jezyka programowania 24 5 Dwa twierdzenia 37 O budowie konstrukeji 6 koniczacych si¢ pomysInie 41 7 Raz jeszcze o algorytmie Euklidesa 45 8 eee 51 9 O ograniczaniu niedeterminizmu 73 10 Esej o pojeciu ,,zasiggu zmiennych” 80 1 1 Zmienne tablicowe 95 VI ‘SPIS TRESCI 12 Twierdzenie o Liniowym Przeszukaniu 107 13. Zadanie o kolejne} permutagji 109 Zadanie o holenderskiej 14 fladze narodowej 113 ] 5 Aktualizacja kartoteki sekwencyjnej 119 1 6 Jeszcze o problemach taczenia 125 Zadanie przypisywane 1 7 R.W. Hammingowi 131 1 8 Zadanie o powtérzeniach wzorca 137 Przedstawienie liczby 19 w postaci sumy dwu kwadratéw 142 20 Zadanie o najmniejszym ezynniku pierwszym duzej liczby 145 2 Zadanie o najbardziej 1 odizolowanych wsiach 151 22 Zadanie o najkrétszym drzewie powiazati 156 Algorytm Rema zapisywania 23 klas r6wnowaznosci 163 24 Zadanie o tréjwymiarowej powloce 170 Znajdowanie maksymalnej 25 silnej sktadowej grafu 195 26 O podrecznikach i realizacjach 205 27 Rzut oka wstecz 213 Stowo wstepne Kronikarze starszych dyscyplin intelektualnych - poezji, muzyki, sztuk pigknych inauk zwykli sktadaé hold tym wybitnym praktykom, ktérych dzieta wzbogacily doznania i poglebily zrozumienie ze strony ich mitosnikéw, a przy tym natchnely i wspomogly talenty nasladowcéw. Nowatorstwo tych praktykéw opiera sie na mistrzowskim opanowaniu warsztatu i precyzyjnym pojmowaniu glebokich pod- staw. Sila i klarownoSé Srodkéw wyrazu, a takze ich ogdIna kultura, niejednokrot- nie potegowaly ich wplyw. W niniejszej ksiazce, napisanej ze zwykta dla Autora kultura, propaguje On swe radykalnie nowe poglady na istote programowania maszyn cyfrowych. Na pod- stawie tych poglad6w zbudowal On caly nowy zespét metod programowania i Srodkéw ich wyrazu, demonstrujac i wyprébowujac je na wielu eleganckich i sprawnych przyktadach. Dzielo to bez watpienia zostanie uznane za jeden ze stupéw milowych na drodze ku programowaniu jako dyscyplinie intelektualnej. C.A.R. HOARE Przedmowa Od dawna chciatem napisa¢ ksiazke taka mniej wigcej jak ta: wiedziatem bowiem, te programy moga urzekaé glebokim pig¢knem swej logiki, a przeciez musiatem przyznaé, te wigkszosé z nich przedstawia sie w postaci choé zdatnej do mecha- nicznego wykonania, to jednak nader skutecznie skrywajacej urode programu przed ludzkim okiem. Drugim érédlem mego niezadowolenia jest zwyczaj publi- kowania algorytméw w postaci gotowych wyrobéw, przy prawie zupetnym pomi- nigciu ksztaltujacych je rozwazari, ktére powinny przeciez uzasadniaé te ostatecz- na postaé. Poczatkowo zamierzatem oglosié garsé pi¢knych algorytméw — tak by Cazytelnik mégt docenié ich urok, i chcialem to osiagnaé opisujac - prawdziwy lub wymySlony ~ tok projektowania, za kazdym razem zmierzajacy do wlasciwego programu. Pozostatem wierny memu wstepnemu zamiarowi na tyle, Ze trzonem tej monografii jest dtugi ciag rozdziat6w poswigconych analizie i rozwiazanin poszezegélnych zadaii; jednak, z drugiej strony, ksiazka ta w ostatecznym rachun- ku jest catkiem inna niz przewidywalem, poniewaz dobrowolnie podjety trud przedstawienia rozwiazati w sposdb naturalny i przekonujacy tak ja wzbogacit, 2e wiecznie bede wdzigczny za jego podjecie. Zaczynajac pisaé ksiazke taka jak ta, od razu trzeba odpowiedzieé na pytanie »ktérym jezykiem programowania sie postuzyé?”, a nie jest to tylko problem pre- zencji! Najwadniejsza, lecz takze i najmniej uchwytna cecha katdego narzedzia jest jego wplyw na przyzwyczajenia, jakich nabieraja ci, ktérzy przysposobili sie do jego uzywania. Jesli narzedziem jest jezyk programowania, to niezaleanie od naszych checi wplywa on na nasze przyzwyozajenia intelektualne. Po najdosko- nalszym, na jakie mnie byto‘sta¢, zbadaniu tych wplywéw doszeditem do przeko- nania, 2e zaden z istniejacych jezykéw programowania ani ted Zaden z ich podzbio- tow nie przyda sie do moich celéw; z drugiej strony, tak bardzo bytem éwiadom swego nieprzygotowania do projektowania nowego jezyka programowania, 2e Poprzysiegtem sobie nie czynié tego przez najblizsze pigs lat, a jak najwyraénicj czutem, 2e ten okres jeszcze nie minat. (Choéby dlatego, #e wezeSniej musiatem napisaé te ksigzke). Sprébowalem rozwiklaé ten konflikt projektujac zaledwie mini-jezyk przydatny do moich celéw, podejmujac te tylko decyzje, ktére wyda- waly mi sig nieuchronne i dostatecznie zasadne. PRZEDMOWA Takie wahania i dobrowolnie przyjete skrepowanie moze rozczarowaé wielu nie- wyrozumialych sposréd potencjalnych czytelnikéw tej monografii. Z pewnosciq nie zadowoli ona tych, co trudnosé programowania utozsamiaja z trudnoécig przebieglego wykorzystywania zawilych barokowych konstrukeji zwanych ,,je- zykami programowania wysokiego poziomu” i — co jeszcze gorsze — ,,systemami programowania”. Gdy poczuja sie oszukani tym, Ze po prostu zignoruje wszelkie arabeski jezykowe, odpowiem im tylko: ,,Czy jesteScie calkiem pewni, Ze te ara- beski, te wszystkie cudowne ulatwienia zawarte w waszych ,poteznych’ jezykach programowania rzeczywiscie stu2a rozwiazywaniu, a nie utrudnianiu zadai?” Pozostaje mi tylko nadzieja, ze mimo iz stosuje zaledwie mini-jezyk, zechca oni przeczytaé moja ksiqtke; uczyniwszy to, byé moze zgodza sie, ze nawet bez ara- besek jezykowych pozostaje tak bogaty przedmiot studiéw, iz watpié mozna, czy wiekszosé tych arabesek w ogdle powinna byé wynaleziona. Czytelnikom za$ z wyrainym zacigciem do projektowania jezykéw moge tylko wyrazié sw6j zal, 2e jak dotychezas nie czuje sie na silach, by méwié o tym bardziej szczegdtowo; z drugiej strony, zywie przekonanie, Ze ta monografia bedzie dla nich tymezaso- wym natchnieniem i pozwoli unikngé niektérych przynajmniej biedéw, ktére mogliby popeinié nie przeczytawszy jej. Z aktu pisania ~ a byt on érddlem nieustannych niespodzianek i podniet — wylonit sig tekst raczej odmienny od tego, ktéry sobie poczatkowo umyslitem. Rozpoczy- natem ze (zrozumialym przeciez) zamiarem ukazania procesu powstawania mych programéw za pomoca aparatu nieco tylko bardziej formalnego niz ten, ktérego zwyktem byt uzywaé w mych (wstepnych) wykladach, w ktérych semantyke wpro- wadzalem zazwyczaj intuicyjnie, a dowody poprawnosci byly utarta mieszaning Scistych argumentagji, gestéw i elokwencji. Ktadgc niezbedne fundamenty pod bardziej formalne podejécie, zetknatem sig z dwiema niespodziankami. Pierwszq stalo sig to, 2e transformatory predykatéw, ktére wybratem za swoje glowne na- rzedzie, daly mi moZliwoS¢ bezposredniego okreSlenia relacji migdzy poczatkowym i koficowym stanem ‘obliczenia™, bez jakiegokolwiek odwotywania sie do stanéw przejSciowych, ktére moga wynikaé z wykonywania programu. Przyjatem to z wdziecznoscia, jako 2e mona bylo teraz wyragnie rozgraniczyé dwie zasadnicze troski programisty: troske o matematyczna poprawnoéé programu (tj. 0 to, czy program definiuje wlasciwy zwigzek migdzy poczatkowym i koficowym stanem ‘obliczenia’, a ako sig rzekto transformatory predykatéw dostarczaja po temu formalnego narzedzia, uwalniajac od koniecznosci obserwacji procesu oblicze- niowego) i inzynierska troske 0 wydajnoSé (co do ktérej wiadomo juz, ze moze byé okreélana tylko wzgledem ‘konkretnej! realizacji). Wielce pomocne okazato si¢ odkrycie, ze jeden i ten sam tekst programu zawsze dopuszcza dwie niejako uzupelniajace sig interpretacje: jako zapis transformatora predykatu, ktéra to interpretacja bardziej sprzyja naszym zamiarom, i jako zapis wykonalnych in- strukeji, ktéra to interpretacje chetnie pozostawiam maszynom! Druga niespo- * Tekst ujgty w nawiasty © } pochodzi od Thumaczy. - Przyp. red. PRZEDMOWA, dzianka okazalo si¢ to, 2e najbardziej naturalne i systematyczne zapisy transforma- toréw predykatéw, jakie mogtem wymyélié, jeSli je rozwataé jako zapisy wykonal- nych instrukeji, zdajq sig odpowiadaé niedeterministycznym realizacjom ‘maszy- nowym). Przez pewien czas wzdragatem sie przed mySla 0 wprowadzeniu niede- terminizmu juz w jednoprogramowaniu (doskonale zdajac sobie sprawe z tego, jakie komplikacje wprowadza niedeterminizm w wieloprogramowaniu!), dopoki nie uSwiadomitem sobie, 2e interpretacja tekstu ‘programu! jako zapisu transfor- matora predykatu ma prawo do niezaleénej egzystencji. (Patrzac wstecz mozna zauwazyé, ze wiele probleméw, jakie stworzyto wicloprogramowanie, wynikto wylacznie z uprzedzenia, kazacego przypisywa¢ nicuzasadniona wage determiniz- mowi ‘obliczeti). Doszediem w koticu do tego, ze traktuje niedeterminizm jako sytuacje normalna, determinizm zaé - jako niezbyt ciekawy przypadek szczegdlny. Potozywszy fundamenty, zabratem sig do tego, co chciatem zrobié od poczatku, tj, do rozwiqzania dtugiego ciagu zadant. Ta czynnos¢ okazala sig nadspodziewanie przyjemna. Poczutem, Ze aparat formalny pozwala mi na znacznie lepsze niz dotychczas ujmowanie istoty mej pracy; z przyjemnoscig odkrytem, Ze jawnie podejmujac badanie ‘warunkéw? korica ‘iteracji!, uzyskujemy bardzo przydatne wskazéwki heurystyczne — do tego stopnia przydatne, 2e zaczqlem 2atowaé, iz tak powszechne jest jeszcze zamitowanie do czeSciowej poprawnosci “programow, tj. poprawnosci pod warunkiem ukosiczenia obliczen’, Najwi¢kszq przyjemnosé sprawito mi jednak to, Ze dla wigkszosci zadan, ktére ju2 przedtem rozwiqzatem, tym razem uzyskatem piekniejsze rozwiqzania! Dodato mi to otuchy, gdyz uzna- Jem, Ze wypracowane metody rzeczywiscie zwiekszyly moje mozliwosci jako pro- gramisty. Jak nalezy studiowaé te monografie? Najlepszq rada jest przestawaé czytaé na- tychmiast po opisie zadania i prébowaé je rozwiazaé samodzielnie przed dalsza lektura. Proba samodzielnego rozwiazania wydaje sie jedyna droga oceny trudno- Sci zadania; stwarza ona Czytelnikowi modliwosé poréwnania wtasnego rozwia- zania z podanym w ksigzce; moze daé satysfakeje ze znalezienia rozwiazania lep- szego niz moje. Przy okazji stowo pociechy: nie nalezy sig martwié, gdy tekst wyda sie trudny w czytaniu. Ci, ktdrzy czytali rekopis tej ksiazki, niejednokrotnie dochodzili do wniosku, ze jest on trudny (lecz sowicie wynagradza prace wlozona w lekturg!); ilekroé jednak analizowalismy ich trudnosci, dochodzilismy do wspél- nego wniosku, Ze ,,wine” ponosi nie tekst (tj. sposdb pisania), lecz sam przedmiot. Wynika z tego moral, ze niebanalny algorytm jest po prostu niebanalny, a jego ostateczny opis w jezyku programowania jest wielce skondensowany w poréwna- niu z rozwazaniami, ktére uzasadniaja jego budowe: nie powinnismy przeto daé sig zwieS¢ zwartoSci ostatecznego tekstu! Jeden z mych asystentéw zaproponowat — a ja wiernie to przekazuje, bo sugestia moze okazaé si¢ celna - by te ksiq2ke stu- diowaé w niewielkich grupach. (Musze tutaj dodaé w nawiasie jeszcze jedna uwa- Be na temat ,,trudnosci” tej ksig#ki. PoSwieciwszy wiele lat mego naukowego zy- ciorysu na wyjaSnienie zadafi programistéw, tak by staly sie one przystepniejsze XI XII PRZEDMOWA. intelektualnie, ze zdziwieniem (i ku memu zmartwieniu) spotykam sig z oskarze- niem, Ze moje wysitki ,utrudnily programowanie”. Przeciez trudnosci byly zaw- sze, a tylko dzieki ich ujawnianiu mozemy 2ywié nadzieje, te zamiast rozpacka- nych kodéw, tj. tekst6w majacych range niewiele wyésza od nie potwierdzonych hipotez, ktére moze obalié pierwszy kontrprzyktad, nauczymy si¢ konstruowaé godne zaufania programy. Nie musze chyba dodawaé, ze zaden z programéw za- mieszczonych w tej ksiqéce nie byt testowany na maszynie). Winienem Czytelnikowi wyjasnienie, dlaczego mj mini-jezyk jest tak skromny, ze nie zawiera ani procedur, ani nawet rekurencji. Poniewaz kazde rozszerzenie jezyka wymagatoby dodania kilku rozdziatéw do tej ksia¢ki i tym samym zwigk- szatoby jej ceng, nie musze zapewne tlumaczyé sie z tego, Ze nie wprowadzitem wielu moéliwych rozszerzei (takich jak np. wieloprogramowanie). Procedury zajmowaly jednak zazwyczaj tak bardzo eksponowane miejsce, a rekurencje tak powszechnie uwazano za probierz akademickiej dostojnosci w informatyce, Ze nie obejdzie sie bez wyjasnien. Przede wszystkim ta monografia nie jest przeznaczona dla poczatkujacych, moge przeto sie spodziewaé, ze mym Czytelnikom nieobce sq te pojecia. Ponadto ni- niejsza ksigzka nie jest podrecznikiem konkretnego jezyka programowania, a za- tem pominigcie owych dwu konstrukeji oraz brak przyktadéw ich zastosowati nie powinny byé interpretowane jako oznaka mej nieumiejetnosci czy te niecheci wzgledem ich uzywania; nie nalezy tez sadzi¢, ze odradzam stosowanie procedur i rekureneji tym, ktérzy potrafig robié to dobrze. Po prostu te pojecia nie byly mi potrzebne po to, by wytozyé to, co chciatem, a wigc by zademonstrowaé, jak istotne przy konstruowaniu wszechstronnie dobrych programéw jest staranne rozgrani- czenie zainteresowati: skromne Srodki mini-jezyka stwarzaja a% nadto rozlegte moéliwoéci dla niebanalnych i bardzo zadowalajacych konstrukeji ‘programo- wych?. Powydsze wyjasnienie, mimo Ze wystarczajace, nie jest jednak zupelne. Niezaleznie od wszystkiego, od dawna uwazatem za konieczne przedstawienie iteracji jako samoistnej konstrukcji. Od pojawienia sig jezykéw programowania ,,dynamiczny” charakter instrukeji przypisania* zdawat sie kolidowaé ze ,,statyczna” natura tradycyjnej matematyki. Brak adekwatnej teorii powodowal, ze matematykom niezbyt odpowiadala instrukcja przypisania, a poniewaz to wlaSnie instrukeje iteracyjne powoduja koniecznosé wprowadzenia ‘pojecia! przypisywania ‘war- tosci! zmiennym, matematykom nie podobaly sig takze instrukeje iteracyjne. Gdy pojawily sig jezyki programowania bez instrukeji przypisania i iteracji - takie np. jak czysty Lisp - wiele oséb odetchneto z ulga: mozna juz bylo wrécié na dobrze znany grunt i mieé by najstabsza, ale zawszeé nadzieje, ze z programowania da sie jeszcze zrobié dzialalnosé o mocnych i dostojnych podstawach matematyeznych. (Az do dzisiaj wsrdd co bardziej teoretyzujacych informatykéw panuje przeko- nanie, Ze programy rekurencyjne sa ,,bardziej naturalne” niz iteracyjne). * Instrukeje przypisania nazywa sie nickiedy takze instrukejq podstawienia. ~ Przyp. tlum. PRZEDMOWA Na alternatywe, tj. na wyposazenie pary iteracja i przypisanie ‘wartosci} zmiennej w solidne i stosowalne podstawy matematyczne, przyszlo poczeka¢ jeszcze dzie- sigé lat. W wyniku okazato sie, czego dowodzi niniejsza monografia, Ze semantyke iteracyjnej moéna ujaé w terminach rekurencyjnych zwiazkéw migdzy predykatami, podczas gdy semantyczna definicja rekurencji wymaga, w ogélnym przypadku, utycia rekurencyjnych zwiqzkéw migdzy transformatorami predyka- téw. Dowodzi to catkiem jasno, przynajmniej z mego punktu widzenia, dlaczego ogélny przypadek rekurengji jest o rzad wielkosci bardziej ztotony od zwykiej iteracji. Dlatego tez boli mnie, ilekroé widze, jak semantyke instrukeji iteracyjnej while B do S definiuje sie przez semantyke wywotania whiledo (B, S) procedury rekurencyjnej (opisanej w skiadni Algolu 60): procedure whiledo (condition, statement); begin if condition then begin statement; whiledo (condition, statement) end end Mimo #e taka definicja jest poprawna, boli mnie ona, bo nie lubie strzelaé do wrdbli z armaty, i to bez wzgledu na to, jak skuteczna okaze sie w tym przypadku armata, Dla cate} generacji teoretykéw informatyki, ktérzy weszli w dziedzing w latach szeSédziesiatych, powyésza definicja rekurencyjna jest nie tylko , natural- na”, lecz takze ,,wierna”. Poniewaz jednak nie odwotujac sie do pojecia iteragji nie mozemy okreslié nawet tego, co powinna robié maszyna Turinga, niewielkie pregiecie w druga strong wydalo mi sie wskazane. Braku bibliografii nie bede wyjaSnial, ani te2 za ten brak nie bedg przepraszaé. PopzigKOwaNta. BezpoSredni wplyw na te ksiq2ke, badz to przez swa gotowosé dyskutowania zamierzonej tresci, badé to przez skomentowanie (czeSci) gotowego rekopisu, mieli: C. Bron, R.M. Burstall, W.H.J. Feijen, C.A.R. Hoare, D.E. Knuth, M. Rem, J.C, Reynolds, D.T. Ross, C.S. Scholten, G. Seegmiiller, N. Wirth iM. Woodger. Jest dla mnie zaszczytem, 2e moge za Ich wspétprace podzi¢kowaé w druku. Ponadto jestem gleboko zobowiazany Burroughs Corporation za stwo- rzone mi moéliwoSci i udostepnienie niezbednych srodkéw, a takze wdzieczny mej Zonie za Jej niezawodna pomoc i zachete. EpsGER W. DIKSTRA Nuenen, Holandia XI Spraweza abstrakcja Sprawoza abstrakcja jest tak fundamentalna dla catego pojecia algorytmu, te zazwyczaj przyjmuje sie ja za oczywista i pomija milczeniem. Stuzy ona do wza- jemnego odwzorowywania rdéznych obliczeti, Inaczej powiedziawszy, spraweza abstrakcja odnosi sie do pewnego sposobu my$lowego ujmowania obliczeti, dzigki ktéremu, traktujac konkretne obliczenie jako element obszernej klasy obliczeti i abstrahujac od wzajemnych réznic migdzy jej elementami, na mocy okreslenia catej klasy orzekamy o wlasnoSciach wszystkich obliczeri tej Klasy, a przeto i o wiasnosciach konkretnie interesujacego nas obliczenia. Aby jasno przedstawi¢, co mamy na mysli méwigc obliczenie, opisze nie liczace urzadzenie, ,,produkujace” — unikam umySlnie terminu ,,obliczajace” — powiedz- my, najwigkszy wspélny podzielnik NWP liczb 111 i 259. Urzadzenie to sklada sie z dwu kawatkéw tektury, natoZonych na siebie. Na wierzchnim kawatku napi- sano ,,NWP (111, 259) =”; gdy zechcemy, by urzadzenie wyprodukowalo wy- nik, zdejmujemy gérnq tekturke i ktadziemy na lewo od dolnej, na ktérej mozemy teraz odezytaé napis ,,37”. Prostota tekturowego urzadzenia jest jego wielka zaleta, przyémiona, niestety, dwoma brakami: powaznym i drobnym. Drobnym brakiem jest to, Ze oméwione urzadzenie moze co prawda byé uzyte do produkowania najwigkszego wspélnego podzielnika liozb 111 i 259, lecz ma niewiele innych zastosowai. Powaznym bra- kiem natomiast jest to, 2e niezaleinie od tego, jak wnikliwie zbadamy budowe urzadzenia, przekonanie co do poprawnosci otrzymanej odpowiedzi mozemy oprzeé li tylko na zaufaniu wzgledem producenta, ktéry mégt przeciez popetnié blad przy projektowaniu urzadzenia lub podczas produkcji naszego egzemplarza. Z drobnym brakiem moéna sobie poradzié, biorac ogromny kawat kartonu po- Kayty prostokatna siatka catkowitych wspétrzednych x i y, spetniajgcych warunki 0 0, owo n jest zmienna o zupelnie innym charakterze. Po drugie, w rozwazanym kontekécie uzywamy terminu zmienna dla okreslenia obiektu trwajacego w czasie, ktéry si¢ nie zmienia, chyba 2e zostanie wykonana jakaé ‘wzgledem niego zewnetrzna! czynnoSé. Lepszy zapewne bylby wiec ter- min ,,zmienialna stala”, bedziemy si¢ jednak trzymaé ustalonej juz w tej mierze tradycji). Inny sposéb Zargonowego uchwycenia istoty kétka w sumatorze, ktére (prawie) zawsze zajmuje jedno ze swych dziesigciu polozeti, czyli jest w jednym ze swych dziesigciu stanéw, polega na skojarzeniu z tym kétkiem dziesiecioelementowej przestrzeni standw. W tym przypadku kazdy stan (polozenie) zostaje skojarzony z pewnym elementem ‘punktem!, a zbidr tych elementéw — zgodnie z matematycz= ng tradycja - okresla sig mianem przestrzeni lub, jesli chcemy byé dokladniejs przestrzeni stanéw. Zamiast méwié, 2e zmienna ma (prawie) zawsze jednq ze swych moi#liwych wartosci, mozemy to samo wyrazié méwiac, 2e system sktada- jacy sig z jednei zmiennej znajduje sie (prawie) zawsze w jednym z punktow swej STANY I ICH CHARAKTERYZOWANIE Przestrzeni stanéw. Przestrzen stanéw opisuje zasieg swobody systemu: nie moze on jej ‘nigdy’ opuscié. Tyle 0 pojedynczym kétku w sumatorze. Wezmy teraz pod uwage rejestr zbudo- wany z rzedu oSmiu takich kétek. Poniewaz kazde z kélek rejestru jest w jednym ze swoich dziesigciu motliwych standw, rejestr jako catoéé jest w jednym ze swych 100 000 000 modliwych réznych stanéw, przy czym kaddy z tych stanéw jest od- powiednio identyfikowany liczba, a raczej rzadkiem cyfr ukazujacych sie w okien- ku. Przez ustalenie standw poszczegéInych kétek ustala sie stan Tejestru jako catosci i, praeciwnie, katdy okreslony stan rejestru jako caloSé determinuje stany po- szezegdlnych kétek, Méwimy przeto - podobnie jak w jednym z poprzednich rozdziatéw ~ ze przestrzeni stanéw catego rejestru powstaje jako iloczyn kartezjati- ski przestrzeni-stanéw poszczegdInych oSmiu kétek. Liczba elementow przestrzeni stanéw catego rejestru jest réwna iloczynowi liczb elementéw w przestrzeniach stanéw poszezegélnych kétek (z tego tet powodu uzywamy okreslenia iloczyn kartezjatiski). Zaletnie od przyjetego punktu widzenia, mozemy uwadat rejestr za pojedyneza “(prosta)! zmienna, przyjmujaca 10° réénych standéw lub za zmienna ztozona, skladajacq sig ze zmiennych przyjmujacych po 10 wartosci katda, tj. z poszezegél- nych kétek. Jesli nasze zainteresowania ograniczaja si¢ do wartoSci iczb! ukazu- Jacych sie w okienku, bedziemy zapewne skionni uwataé rejestr za nierozktadalna catoéé, natomiast konserwator wymieniajacy kétko ze startym zabkiem z pewnos- cig uwaza rejestr za obiekt ztozony. Omawiajac algorytm Euklidesa napotkaligmy inny przyktad konstruowania prze- strzeni stanéw; zauwazylismy wéwezas, Ze potozenie zetonu na planszy moze byé réwnie dobrze zidentyfikowane przez polotenia dwu péltetonéw w odpowiednich punktach osi, tj. przez kombinacjg (a doktadniej powiedziawszy — uporzadkowa- nq pare) dwu zmiennych x i y. (Pomyst identyfikowania punktu na plaszczyinie z wartosciami rzednej i odcigtej tego punktu pochodzi od Kartezjusza, ktéry go zastosowat tworzac geometri¢ analityczng; uzywajac terminu iloczyn kartezjariski czcimy autora tego pomystu). Zeton na planszy by! wprowadzony po to, aby zilustrowaé fakt, 2¢ postepujace obliczenie - np. wykonywanie algorytmu Eukli- desa - moze byé widziane jako wedréwka systemu po jego przestrzeni standw. Zgodnie z ta metafora, o stanie poczatkowym mowimy takze ,,punkt wyjécia”. W tej ksiqace bedziemy sie zajmowaé gtéwnie, a moze nawet i wylacznie, systema- mi, dla ktérych przestrzenie stanéw okaza sie w koticu iloczynami kartezjatiski- mi, Nie nalezy przez to przypuszezaé, 4e chcg w ten sposdb zasugerowaé, it prze- strzenie stanéw utworzone z iloczynéw kartezjatiskich sq uniwersalnym i jedynym lekarstwem na wszystkie problemy; zdaje sobie doskonale sprawe, ze weale tak nie jest. W miare postepu naszych rozwazan wyjasni sie jednak, dlaczego takie Przestrzenie zastuguja na szczegéInq uwage i dlaczego idea iloczynu kartezjati- skiego odgrywa tak wazng role w wielu jezykach programowania, 2/11 12/2 STANY ICH CHARAKTERYZOWANIB Zanim, wszelako, posuniemy si¢ dalej, chcialbym wspomnieé pewien dylemat, ktérego nie unikniemy. Gdy - stosujac iloczyn kartezjatiski — budujemy przestrzehi standw, nie zawsze umiemy z gory przewidzieé, czy potrafimy dobrze zinterpreto- -waé wszystkie elementy tej przestrzeni. Taka sytuacje ilustruje sie zazwyczaj przy- Ktadem charakteryzowania dat roku para (dziet, miesiac), przy czym ,,dziei” jest zmienng przyjmujaca 31 wartosci (od 1 do 31), ,,miesiqc” za$ - zmienng przyj- mujacq 12 wartosci (od ,,styczeti” do ,,grudziei”), Powstaje wowezas przestrzeit stanéw liczaca 372 elementy, podezas gdy 2aden rok nie ma wi¢cej niz 366 dni. Jak nale2y interpretowaé np. (31, czerwiec)? Albo trzeba taka pare wykluczyé, wprowadzajac tym samym niedozwolone daty - a wige niejako zgodzimy sie na to, by taki uktad byt wewnetrznie niezupeiny ‘tj. by wymagal zewnetrznej ingerencji lub dodatkowej informagji, decydujacej o legalnogci poszczegélnych par’, albo tea zezwolimy na to, by taka para byla uznana za alternatywnq nazwe ‘synonim? ktérej§ z prawdziwych dats przyréwnujac ja np. do (1, lipiec) i w tym jednak przy- padku informacja zawarta w samych parach okaze sig niewystarczajqca i interpre- tacja bedzie wymagaé dodatkowego arédla informacji. Zjawisko nie wykorzysta- nych clementéw przestrzeni standw nieuchronnie wystepuje wtedy, gdy liczba stanéw, ktére choemy rozrézniaé, jest liczba pierwsza, ‘a przestrzeti choemy trak- towaé jako iloczyn kartezjatiski). ‘Nazewnictwo wprowadzane automatycznie przez utworzenie iloczynu kartezjati- skiego umodliwia identyfikacje pojedynczych elementéw; np. moge powiedzie¢, ze moje urodziny przypadaja na dzied (11, maj). Dzi¢ki Kartezjuszowi mamy inny jeszcze sposéb wyrazenia tego faktu: data moich urodzin, (dzieh, miesiqc), speinia rownanie (dzieti = 11) A (miesigc = maj) Poniewat jedna tylko data spelnia to réwnanie, mozna je uzna¢ za nieco skompli- kowany spos6b okreélania tego jednego dnia roku. Zaleta r6wnat polega jednak na tym, Ze moga byé z powodzeniem zastosowane do wyznaczania wigcej ni2 jedno- elementowych zbioréw rozwiazai. Banalnym przykladem bytoby okreSlenie dat Bozego Narodzenia (Gaiei = 25) V (dziesi = 26)) A (miesige = grudziet) lecz juz np. okreSlenie zbioru dni, w ktérych otrzymuje pensje, przez rownanie (dziei = 23) ukazuje dobitnie przewage takiej definicji nad wyliczeniem (23, styczeti), (23, luty), (23, marzec) itd, Z tych rozwatan wyrainie wynika, ze tatwoS¢ scharakteryzowania zbioru standw za pomoca réwnati podobnych do powyészych zalezy od tego, czy zbiér, ktéry pragniemy scharakteryzowaé, ,,pasuje” do struktury przestrzeni standw, tj. czy pasuje do wprowadzonego uktadu wspétzednych. W ukladzie wspétrzednych ‘wprowadzonym w naszym przyktadzie byloby np. nader niewygodnie charaktery- STANY I ICH CHARAKTERYZOWANIE zowaé zbidr dat przypadajacych w ten sam dzieni tygodnia, co (1, styczefi). Wiele decyzji podejmowanych przez programistéw dotyczy wprowadzania przestrzeni stanéw z ukladami wspdirzednych przydatnych do ich celéw, to zaS wlaSnie da- 2enie “do uzyskania przydatnych wspéirzednych! czesto powoduje, Ze wprowadza sig przestrzen stanow liczaca wielokrotnie wigcej elementéw niz potrzeba 'z punktu widzenia samego problemu’, W poprzednich rozwazaniach napotkaliémy jeszcze jeden przyklad zastosowania rownania do scharakteryzowania zbioru stanéw; w opisie planszy naszej tekturo- ‘wej maszyny stu2acej do obliczania NWP (X, Y) uzyligmy mianowicie r6wnania Mee Oe do scharakteryzowania zbioru punktéw, ktéry nazwaligmy prosta wyntkowa. Byt to zbidr stanéw koricowych ~ w tym sensie, ze obliczenie koriczyto sie wtedy i tylko wtedy, gdy osiagato stan spelniajacy r6wnanie x = y. W naszych réwnaniach obok wspétrzednych przestrzeni standw, tj. obok zmien- nych, ktérych wartosci odzwierciedlaja postep procesu obliczeniowego, wystepu- a takze state (takie jak np. ,,23” i ,,maj”). Oprécz zmiennych i stalych moga tez wystepowaé tzw. zmienne wolne, ktére mozna uwazaé za ,,nieokreSlone stale”, uzywane specjalnie po to, aby powigzaé z soba rézne stany osiagane w kolejnych etapach jednego procesu obliczeniowego. Dla przyktadu - podezas konkretnego wykonania algorytmu Euklidesa, podjetego w punkcie poczatkowym (X, ¥), wszystkie stany beda spetniaty zalednosé NWP(x, y) = NWP(X, Y)AO Q (czytaj ,,P pociaga Q”) jest spelniony we wszystkich punktach przestrzeni standw, z wyjatkiem punktéw, w ktérych jest speiniony predykat P i jednoczesnie nie jest spetniony predykat O. Wymagajac, aby predykat P => => nww(S, R) byt speiniony dla wszystkich stanéw, 2adamy, by w kaddym stanie spelniajacym predykat P byt takze spelniony predykat nww(S, R); ‘innymi stowy?, predykat P jest dostatecznym warunkiem wstepnym. W odniesieniu do zbioréw oznacza to, 2e zbidr stanéw charakteryzujacy sig spetnieniem predykatu P stanowi podzbiér zbioru charakteryzujqcego sig spetnieniem predykatu nww(S, R). Jeéli 3/17

You might also like