Skip to main content

101030027

Page 1


Spis treści

Rozdział 0 Wprowadzenie 2

0.1 Rola algorytmów 4

0.2 Historia informatyki 6

0.3 Zawartość książki 12

0.4 Nadrzędne zagadnienia informatyki 14

Rozdział 1 Przechowywanie danych 24

1.1 Bity i ich przechowywanie 26

1.2 Pamięć główna 34

1.3 Pamięć masowa 38

1.4 Przedstawianie informacji w postaci bitów 44

*1.5 System binarny 53

*1.6 Przechowywanie liczb całkowitych 58

*1.7 Przechowywanie ułamków 66

*1.8 Dane i programowanie 72

*1.9 Kompresja danych 80

*1.10 Błędy komunikacji 87

Rozdział 2 Operowanie danymi 100

2.1 Architektura komputera 102

2.2 Język maszynowy 105

2.3 Wykonywanie programu 113

*2.4 Instrukcje arytmetyczno-logiczne 121

*2.5 Komunikacja z innymi urządzeniami 126

*2.6 Programowanie operacji na danych 133

*2.7 Inne architektury 143

Rozdział 3 Systemy operacyjne 156

3.1 Historia systemów operacyjnych 158

3.2 Architektura systemu operacyjnego 163

3.3 Koordynowanie działań maszyny 172

*3.4 Obsługa konkurencji wśród procesów 176

3.5 Bezpieczeństwo 182

* Gwiazdki wskazują podrozdziały opcjonalne.

Rozdział 4 Sieć i Internet 194

4.1 Podstawy działania sieci 196

4.2 Internet 207

4.3 World Wide Web 220

*4.4 Protokoły internetowe 230

*4.5 Prosta komunikacja klient serwer 238

4.6 Cyberbezpieczeństwo 243

Rozdział 5 Algorytmy 262

5.1 Koncepcja algorytmu 264

5.2 Reprezentacja algorytmu 268

5.3 Odkrywanie algorytmów 277

5.4 Struktury iteracyjne 284

5.5 Struktury rekurencyjne 297

5.6 Wydajność i poprawność 306

Rozdział 6 Języki programowania 326

6.1 Perspektywa historyczna 328

6.2 Tradycyjne koncepcje programowania 339

6.3 Jednostki proceduralne 355

6.4 Implementacja języka 365

6.5 Programowanie obiektowe 375

*6.6 Programowanie równoległych działań 382

*6.7 Programowanie deklaratywne 385

Rozdział 7 Inżynieria oprogramowania 400

7.1 Dyscyplina inżynierii oprogramowania 402

7.2 Cykl życia oprogramowania 406

7.3 Metodologie inżynierii oprogramowania 411

7.4 Modułowość 414

7.5 Narzędzia do pracy 423

7.6 Zapewnienie jakości 432

7.7 Dokumentacja 436

7.8 Interfejs człowiek–maszyna 438

7.9 Własność i odpowiedzialność za oprogramowanie 442

Rozdział 8 Abstrakcje danych 452

8.1 Podstawowe struktury danych 454

8.2 Powiązane pojęcia 459

8.3 Implementowanie struktur danych 462

8.4 Krótkie studium przypadku 479

8.5 Niestandardowe typy danych 485

8.6 Klasy i obiekty 490

*8.7 Wskaźniki w języku maszynowym 491

Rozdział 9 Systemy baz danych 504

9.1 Podstawy baz danych 506

9.2 Model relacyjny 513

*9.3 Bazy obiektowe 526

*9.4 Utrzymywanie integralności bazy danych 529

*9.5 Tradycyjne struktury plików 533

9.6 Eksploracja danych 543

9.7 Społeczny wpływ technologii bazodanowych 546

Rozdział 10 Grafika komputerowa 556

10.1 Zakres grafiki komputerowej 558

10.2 Przegląd grafiki 3D 561

10.3 Modelowanie 563

10.4 Renderowanie 573

*10.5 Sposoby na oświetlenie globalne 586

10.6 Animacje 589

Rozdział 11 Sztuczna inteligencja 600

11.1 Inteligencja i maszyny 602

11.2 Postrzeganie 608

11.3 Rozumowanie 615

11.4 Dodatkowe obszary badań 629

11.5 Sztuczne sieci neuronowe 636

11.6 Robotyka 642

11.7 Myśląc o konsekwencjach 645

Rozdział 12 Teoria obliczalności 658

12.1 Funkcje i ich obliczanie 660

12.2 Maszyna Turinga 663

12.3 Uniwersalne języki programowania 668

12.4 Funkcje nieobliczalne 674

12.5 Złożoność problemów 680

*12.6 Kryptografia z kluczem publicznym 692

Dodatki 703

Indeks 765

ZADANIA POWTÓRZENIOWE DO ROZDZIAŁU

(Zadania oznaczone gwiazdką dotyczą podrozdziałów opcjonalnych.)

1. a. W czym s ą podobne rejestry ogólnego przeznaczenia i komórki pamięci głównej?

b. Czym różnią się rejestry ogólnego przeznaczenia i komórki pamięci głównej?

2. Odpowiedz na poni ż sze pytania w j ę zyku maszynowym Vole (dodatek C).

a. Zapisz instrukcję 0x2304 jako łańcuch 16 bitów.

b. Zapisz kod operacji instrukcji 0xB2A5 jako łańcuch 4 bitów.

c. Zapisz pole operandu instrukcji 0xB2A5 jako łańcuch 12 bitów.

3. Załóżmy, że blok danych jest przechowywany w komórkach pamięci Vole od adresu 0x98 do 0xA2 włącznie. Ile komórek pamięci znajduje się w tym bloku? Wymień ich adresy.

4. Jaka jest wartość licznika programu w Vole zaraz po wykonaniu instrukcji 0xB0CD?

5. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x05 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x00 0x22

0x01 0x11

0x02 0x32

0x03 0x02

0x04 0xC0

0x05 0x00

Przyjmując, że licznik programu początkowo zawierał 0x00, zapisz zawartość licznika programu, rejestru instrukcji i komórki pamięci pod adresem 0x02 na ko ń cu ka ż dej fazy pobierania cyklu maszynowego do momentu zatrzymania.

6. Załóżmy, że w pamięci maszyny przechowywane są trzy wartości x, y i z. Opisz sekwencję zdarzeń (ładowanie rejestrów z pamięci, zapisywanie wartości w pamięci itd.), które prowadzą do obliczenia x + y + z. Jak będzie w przypadku (2x) + y?

7. Poni ż ej znajduj ą si ę instrukcje napisane w języku maszynowym Vole. Przetłumacz je na język polski.

a. 0x7123 b. 0x40E1 c. 0xA304

d. 0xB100 e. 0x2BCD

8. Załóżmy, że język maszynowy został zaprojektowany z polem kod operacji o długości 4 bitów. Ile różnych typów instrukcji może zawierać język? Co się stanie, jeśli pole kod operacji zostanie zwiększone do 6 bitów?

9. Przetłumacz poniższe instrukcje na instrukcje Vole.

a. Załaduj (LOAD) rejestr 0x6 wartością 0x77.

b. Za ł aduj ( LOAD ) rejestr 0x7 zawarto ś ci ą komórki pamięci 0x77.

c. Skocz ( JUMP ) do instrukcji w komórce pamięci 0x24, jeśli zawartość rejestru 0x0 jest równa wartości w rejestrze 0xA.

d. Obró ć ( ROTATE ) rejestr 0x4 o trzy bity w prawo.

e. Wykonaj operację AND na zawartości rejestrów 0xE i 0x2, umieszczaj ą c wynik w rejestrze 0x1.

10. Przepisz program z rysunku 2.7, zakładając, że wartości do dodania są zakodowane przy użyciu notacji zmiennoprzecinkowej, a nie notacji uzupełnień do dwóch.

11. Sklasyfikuj każdą z poniższych instrukcji Vole pod względem tego, czy jej wykonanie zmieni zawartość komórki pamięci w lokalizacji 0x3C, czy pobierze zawartość komórki pami ę ci w lokalizacji 0x3C, czy też jest niezależne od zawartości komórki pamięci w lokalizacji 0x3C.

a. 0x353C b. 0x253C c. 0x153C d. 0x3C3C e. 0x403C

12. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x03 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x00 0x26

0x01 0x55

0x02 0xC0

0x03 0x00

a. Przetłumacz pierwszą instrukcję na język polski.

b. Je ś li maszyna zostanie uruchomiona z licznikiem programu zawieraj ą cym 0x00, jaki wzorzec bitowy znajdzie się w rejestrze 0x6 po zatrzymaniu się maszyny?

13. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x02 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x00 0x12

0x01 0x21 0x02 0x34

a Jaka byłaby pierwsza wykonana instrukcja, gdyby ś my uruchomili maszyn ę z licznikiem programu zawieraj ą cym 0x00?

b. Jaka byłaby pierwsza wykonana instrukcja, gdyby ś my uruchomili maszyn ę z licznikiem programu zawieraj ą cym 0x01?

14. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x05 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x00 0x12 0x01 0x02

0x02 0x32

0x03 0x42

0x04 0xC0 0x05 0x00

Odpowiadając na poniższe pytania, załóżmy, że maszyna startuje z licznikiem programu równym 0x00.

a. Przetłumacz wykonywane instrukcje na język polski.

b. Jaki wzorzec bitowy będzie znajdował si ę w komórce pami ę ci pod adresem 0x42 po zatrzymaniu się maszyny?

c. Jaki wzorzec bitowy będzie znajdował się w liczniku programu po zatrzymaniu się maszyny?

15. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x09 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x00 0x1C

0x01 0x03

0x02 0x2B

0x03 0x03

0x04 0x5A

0x05 0xBC

0x06 0x3A

0x07 0x00

0x08 0xC0

0x09 0x00

Załóżmy, że maszyna startuje z licznikiem programu zawierającym 0x00.

a. Jaki wzorzec bitowy będzie znajdował si ę w komórce pami ę ci pod adresem 0x00 po zatrzymaniu się maszyny?

b. Jaki wzorzec bitowy będzie znajdował się w liczniku programu po zatrzymaniu się maszyny?

16. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x07 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x00 0x2B

0x01 0x07

0x02 0x3B

0x03 0x06

0x04 0xC0

0x05 0x00

0x06 0x00 0x07 0x23

a. Wypisz adresy komórek pamięci zawierających program, który zostanie wykonany, jeśli uruchomimy maszynę z licznikiem programu zawierającym 0x00.

b. Wypisz adresy komórek pamięci używanych do przechowywania danych.

17. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x0D w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x00 0x20

0x01 0x04

0x02 0x21 0x03 0x01

0x04 0x40

0x05 0x12

0x06 0x51

0x07 0x12

0x08 0xB1

0x09 0x0C

0x0A 0xB0

0x0B 0x06

0x0C 0xC0

0x0D 0x00

Załóżmy, że maszyna startuje z licznikiem programu zawierającym 0x00.

a. Jaki wzorzec bitowy będzie znajdował się w rejestrze 0x0 po zatrzymaniu się maszyny?

b. Jaki wzorzec bitowy będzie znajdował się w rejestrze 0x1 po zatrzymaniu się maszyny?

c. Jaki wzorzec bitowy będzie znajdował się w liczniku programu po zatrzymaniu się maszyny?

18. Załóżmy, że komórki pamięci pod adresami od 0xF0 do 0xFD w Vole zawierają następujące (szesnastkowe) wzorce bitowe:

Adres Zawartość

0xF0 0x20

0xF1 0x00

0xF2 0x22

0xF3 0x02

0xF4 0x23

0xF5 0x04

0xF6 0xB3

0xF7 0xFC

0xF8 0x50

0xF9 0x02

0xFA 0xB0

0xFB 0xF6

0xFC 0xC0

0xFD 0x00

Jeśli uruchomimy maszynę z licznikiem programu zawierającym 0xF0, jaka będzie wartość w rejestrze 0x0, gdy maszyna wykona instrukcję zatrzymania z lokalizacji 0xFC?

19. Jeśli Vole wykonuje instrukcję co mikrosekundę (milionową część sekundy), ile czasu zajmie jej ukończenie programu z zadania 18?

20. Załóżmy, że komórki pamięci pod adresami od 0x20 do 0x28 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0x20 0x12

0x21 0x20

0x22 0x32

0x23 0x30

0x24 0xB0

0x25 0x21

0x26 0x24

0x27 0xC0

0x28 0x00

Załóżmy, że maszyna startuje z licznikiem programu zawierającym 0x20.

a. Jakie wzorce bitowe będą znajdować się w rejestrach 0x0, 0x1 i 0x2 po zatrzymaniu się maszyny?

b. Jaki wzorzec bitowy będzie znajdował si ę w komórce pami ę ci pod adresem 0x30 po zatrzymaniu się maszyny?

c. Jaki wzorzec bitowy będzie znajdował si ę w komórce pami ę ci pod adresem 0xB0 po zatrzymaniu się maszyny?

21. Załóżmy, że komórki pamięci pod adresami od 0xAF do 0xB1 w Vole zawierają następujące wzorce bitowe:

Adres Zawartość

0xAF 0xB0

0xB0 0xB0

0xB1 0xAF

Co by si ę sta ł o, gdyby ś my uruchomili maszynę z licznikiem programu zawierającym 0xAF?

22. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x05 w Vole zawierają następujące (szesnastkowe) wzorce bitowe:

Adres Zawartość

0x00 0x25

0x01 0xB0

0x02 0x35

0x03 0x04

0x04 0xC0

0x05 0x00

Je ś li uruchomimy maszynę z licznikiem programu zawierającym 0x00, to kiedy maszyna zatrzyma się?

23. W każdym z poniższych przypadków napisz krótki program w Vole wykonujący żądane czynności. Załóżmy, że każdy z programów będzie umieszczony w pamięci, począwszy od adresu 0x00.

a. Przenieś wartość z lokalizacji pamięci 0xD8 do lokalizacji pamięci 0xB3.

b. Zamień wartości przechowywane w lokalizacjach pamięci 0xD8 i 0xB3.

c. Jeśli wartość przechowywana w komórce pamięci 0x44 to 0x00, to umieść wartość 0x01 w komórce pamięci 0x46, a w przeciwnym razie umie ść warto ść 0xFF w lokalizacji pamięci 0x46.

24. Gra, która by ł a kiedy ś popularna w ś ród hobbystów komputerowych, to core wars (wojny rdzeniowe) – odmiana Battleshipa. (Termin rdzeń wywodzi się z wczesnej technologii pamięci, w której 0 i 1 były reprezentowane za pomocą pól magnetycznych w małych pierścieniach materiału magnetycznego. Pier ś cienie te nazywano rdzeniami.) Gra toczy się między dwoma przeciwnymi programami, z których każdy jest przechowywany w ró ż nych lokalizacjach tej samej pamięci komputera. Zakładamy, że komputer przełącza się między dwoma programami, wykonując instrukcję jednego programu, a następnie instrukcję drugiego. Celem każdego programu jest spowodowanie nieprawidłowego działania drugiego poprzez nadpisanie na nim niepotrzebnych danych, a żaden program nie zna lokalizacji drugiego.

a. Napisz program w Vole, który podchodzi do gry w sposób defensywny, a przy tym jest jak najmniejszy.

b. Napisz program w Vole, który stara się unika ć ataków ze strony przeciwnego programu, przenosz ą c si ę do ró ż nych lokalizacji. Dok ł adniej, zaczynają c od lokalizacji 0x00, napisz program, który skopiuje się do lokalizacji 0x70, a następnie przeskoczy do lokalizacji 0x70.

c. Rozszerz program z (b), tak aby kontynuowa ł przenoszenie si ę do nowych lokalizacji w pamięci. W szczególności przenie ś swój program do lokalizacji 0x70, w kolejnym kroku przenieś go do 0xE0 (= 0x70 + 0x70), następnie do 0x60 (= 0x70 + 0x70 + 0x70), itd.

25. Napisz program w Vole do obliczania sumy warto ś ci zmiennoprzecinkowych przechowywanych w lokalizacjach pamięci 0xA0, 0xA1, 0xA2 i 0xA3. Twój program powinien umieścić sumę w lokalizacji pamięci 0xA4.

26. Załóżmy, że komórki pamięci pod adresami od 0x00 do 0x05 w Vole zawierają następujące (szesnastkowe) wzorce bitowe:

Adres Zawartość

0x00 0x20

0x01 0xC0

0x02 0x30

0x03 0x04

0x04 0x00

0x05 0x00

Co się stanie, jeśli uruchomimy maszynę z licznikiem programu zawierającym 0x00?

27. Co si ę stanie, je ś li komórki pami ę ci pod adresami 0x08 i 0x09 w Vole zawieraj ą wzorce bitowe odpowiednio 0xB0 i 0x08, a maszyna zostanie uruchomiona z licznikiem programu zawieraj ą cym warto ść 0x08?

28. Załóżmy, że następujący program, napisany w Vole, jest przechowywany w pami ę ci g ł ównej od adresu 0x30 (szesnastkowo). Jakie zadanie wykona program po uruchomieniu?

0x2003

0x2101

0x2200

0x2310

0x1400

0x3410

0x5221

0x5331

0x3239

0x333B

0xB248

0xB038

0xC000

29. Określ kroki związane z wykonaniem przez Vole instrukcji o kodzie operacji 0xB. Wyraź swoją odpowiedź jako zestaw wskazówek, tak jakbyś mówił procesorowi, co ma robić.

30. Określ kroki związane z wykonaniem przez Vole instrukcji o kodzie operacji 0x5. Wyraź swoją odpowiedź jako zestaw wskazówek, tak jakbyś mówił procesorowi, co ma robić

31. Określ kroki związane z wykonaniem przez Vole instrukcji o kodzie operacji 0x6. Wyraź swoją odpowiedź jako zestaw wskazówek, tak jakbyś mówił procesorowi, co ma robić.

Informatyka to dyscyplina, która ma na celu tworzenie podstaw naukowych dla takich tematów, jak projektowanie komputerów, programowanie komputerów, przetwarzanie informacji, rozwiązywanie problemów za pomocą algorytmów i samego procesu tworzenia algorytmów. Daje podstawy dla dzisiejszych zastosowań komputerów, a także fundamenty przyszłej infrastruktury komputerowej.

Ta książka stanowi obszerne wprowadzenie do tej nauki. Będziemy badać szeroki zakres tematów, w tym większość z tych, które składają się na typowy uniwersytecki program nauczania informatyki. Chcemy pokazać pełen zakres i dynamikę tej dziedziny. Dlatego, oprócz samych tematów, interesować nas będzie ich historyczny rozwój, aktualny stan badań oraz perspektywy na przyszłość. Naszym celem jest przedstawienie funkcjonalnego rozumienia informatyki – takiego, które będzie wspierać tych, którzy chcą prowadzić bardziej specjalistyczne studia w tej nauce, a także takiego, które umożliwi osobom z innych dziedzin rozwijanie się w coraz bardziej zaawansowanym technicznie społeczeństwie.

0.1 Rola algorytmów

Zaczniemy od najbardziej podstawowego pojęcia w informatyce – algorytmu Nieformalnie algorytm to zestaw kroków, które określają sposób wykonywania zadania. (Dokładniej omówimy to w dalszej części, w rozdziale 5). Istnieją na przykład algorytmy gotowania (przepisy kulinarne), znajdowania drogi w obcym mieście (trasy), obsługi pralek (zwykle znajdujące się od wewnątrz pokrywy pralki lub być może na ścianie pralni), odtwarzania muzyki (wyrażone w postaci nut) oraz do wykonywania magicznych sztuczek (rysunek 0.1).

Zanim maszyna taka jak komputer bę dzie mog ł a wykona ć zadanie, musi zostać opracowany algorytm wykonania tego zadania i przedstawiony w formie odpowiedniej dla maszyny. Reprezentacja algorytmu nazywana jest programem. Dla wygody ludzi programy komputerowe są zwykle drukowane na papierze lub wyświetlane na ekranach komputerów. Dla wygody maszyn programy zapisywane są w sposób zgodny z technologią maszyny. Proces tworzenia programu, zapisywania go w formie odpowiedniej dla maszyny i przekazywania go maszynie nazywa się programowaniem, a czasem kodowaniem. Programy i reprezentowane przez nie algorytmy są zbiorczo określane jako oprogramowanie, w przeciwieństwie do samej maszyny, która jest traktowana jako sprzęt. Badanie algorytmów rozpoczęło się jako jeden z tematów matematyki. Poszukiwanie algorytmów było ważną działalnością matematyków na długo przed powstaniem współczesnych komputerów. Celem było znalezienie jednego zestawu wskazówek opisujących, jak można rozwiązać wszystkie problemy określonego typu. Jednym z najbardziej znanych przykładów tych wczesnych badań jest algorytm dzielenia do znajdowania ilorazu dwóch liczb wielocyfrowych. Innym przykładem jest algorytm odkryty przez starożytnego greckiego matematyka Euklidesa, do

Sztuczka: Iluzjonista kładzie na stole kilka zakrytych kart do gry i dokładnie je miesza. Następnie, gdy publiczność zażąda odkrycia czerwonej lub czarnej karty, magik odwraca kartę w żądanym kolorze.

Sekret sztuczki i sposób jej wykonania

Krok 1. Z normalnej talii kart wybierz dziesięć czerwonych kart i dziesięć czarnych kart. Rozłóż na stole zakryte karty w dwóch stosach według koloru.

Krok 2. Poinformuj, że wybrałeś kilka kart czerwonych i kilka czarnych.

Krok 3. Podnieś czerwone karty. Pod pretekstem, że układasz je w małą talię, trzymaj je zakryte w lewej ręce, a kciukiem oraz pierwszym palcem prawej ręki zagnij do tyłu róg talii, tak aby każda karta była lekko zagięta do tyłu. Następnie połóż zakrytą talię czerwonych kart na stole, mówiąc: „Na tym stosie znajdują się czerwone karty”.

Krok 4. Podnieś czarne karty. W sposób podobny do tego z kroku 3 zagnij te karty lekko do przodu. Następnie odłóż te karty na stół w zakrytej talii, mówiąc: „Na tym stosie znajdują się czarne karty ”.

Krok 5. Natychmiast po odłożeniu czarnych kart na stół, użyj obu rąk, aby wymieszać czerwone i czarne karty (nadal zakryte), rozkładając je na stole. Wyjaśnij, że karty są dokładnie wymieszane.

Krok 6. Dopóki na stole znajdują się zakryte karty, powtarzaj następujące kroki:

6.1. Poproś publiczność o wybór, czy ma zostać odkryta czerwona czy czarna karta.

6.2. Jeśli żądany kolor jest czerwony i istnieje (zakryta) karta z odpowiednim zagięciem, odwracamy taką kartę, mówiąc: „Oto czerwona karta”.

6.3. Jeśli żądany kolor jest czarny i istnieje (zakryta) karta z odpowiednim zagięciem, odwracamy taką kartę, mówiąc: „Oto czarna karta”.

6.4. W przeciwnym razie powiedz, że nie ma już kart w żądanym kolorze i odwróć pozostałe karty, aby udowodnić swoje stwierdzenie.

Rysunek 0.1 Algorytm magicznej sztuczki

znajdowania największego wspólnego dzielnika dwóch dodatnich liczb całkowitych (rysunek 0.2).

Po znalezieniu algorytmu wykonanie zadania nie wymaga już zrozumienia zasad, na których ten algorytm się opiera. Wystarczy jedynie postępować zgodnie ze wskazówkami. (Możemy zastosować algorytm dzielenia, aby znaleźć iloraz, lub algorytm Euklidesa, aby znaleźć największy wspólny dzielnik, nie wiedząc, dlaczego algorytm działa akurat w taki sposób). W pewnym sensie inteligencja wymagana do rozwiązania danego problemu jest zakodowana w algorytmie. Wychwytywane i przekazywanie inteligencji (lub przynajmniej inteligentnego zachowania) za pomocą algorytmów pozwala nam budować maszyny, które wykonują użyteczne zadania. W konsekwencji poziom inteligencji prezentowany przez maszyny jest ograniczony przez inteligencję, którą można im przekazać za pomocą algorytmów. Możemy skonstruować maszynę do wykonania zadania tylko wtedy, gdy istnieje algorytm do wykonania tego zadania. Z kolei jeśli nie istnieje algorytm do rozwiązania problemu, to rozwiązanie leży poza możliwościami maszyn.

Opis: Algorytm zakłada, że jego dane wejściowe składają się z dwóch dodatnich liczb całkowitych i polega na obliczeniu największego wspólnego dzielnika tych dwóch wartości.

Procedura:

Krok 1. Przypisz M i N odpowiednio wartość większej i mniejszej z dwóch wartości wejściowych.

Krok 2. Podziel M przez N i nazwij resztę R.

Krok 3. Jeśli R nie jest równe 0, przypisz M wartość N, przypisz N wartość R i wróć do kroku 2; w przeciwnym razie największym wspólnym dzielnikiem jest wartość aktualnie przypisana do N.

Rysunek 0.2 Algorytm Euklidesa do znajdowania największego wspólnego dzielnika dwóch dodatnich liczb całkowitych

Określenie ograniczeń możliwości algorytmicznych zostało wprowadzone jako element matematyki w latach 30. XX wieku wraz z publikacją twierdzenia o niezupełności Kurta Gödla. Twierdzenie to zasadniczo mówi, że w każdej teorii matematycznej obejmującej nasz tradycyjny system arytmetyczny istnieją twierdzenia, których prawdziwości lub fałszu nie można ustalić metodami algorytmicznymi. Krótko mówiąc, jakiekolwiek pełne badanie naszego systemu arytmetycznego wykracza poza możliwości działań algorytmicznych. Ta świadomość wstrząsnęła podstawami matematyki, a badanie możliwości algorytmicznych, które po tym nastąpiło, było początkiem dziedziny znanej dziś jako informatyka. W rzeczywistości to właśnie nauka o algorytmach stanowi rdzeń informatyki.

0.2 Historia informatyki

Dzisiejsze komputery mają bogatą genealogię. Jednym z początkowych narzędzi obliczeniowych było liczydło. Historia mówi nam, że prawdopodobnie miało ono swoje korzenie w starożytnych Chinach i było używane we wczesnych cywilizacjach greckich i rzymskich. Maszyna jest dość prosta, składa się z koralików nawleczonych na pręty, które z kolei są zamontowane w prostokątnej ramie (rysunek 0.3). Gdy koraliki są przesuwane wzdłuż prętów, ich pozycje reprezentują zapisane wartości. To właśnie w pozycjach koralików tego typu „komputer” reprezentuje i przechowuje dane. Sterowanie wykonaniem algorytmu wymaga udziału człowieka. Zatem samo liczydło jest jedynie systemem przechowywania danych i musi być połączone z człowiekiem, aby stworzyć kompletną maszynę obliczeniową W okresie po średniowieczu, a przed epoką nowożytną zaczęto poszukiwać bardziej wyrafinowanych maszyn obliczeniowych. Kilku wynalazców zaczęło eksperymentować z technologią kół zębatych. Wśród nich byli Blaise Pascal (1623–1662) z Francji, Gottfried Wilhelm Leibniz (1646–1716) z Niemiec i Charles Babbage (1792–1871) z Anglii. Maszyny te reprezentowały dane poprzez pozycje kół

Sztuczna inteligencja to dziedzina informatyki, której celem jest budowanie autonomicznych maszyn – maszyn, które mogą wykonywać złożone zadania bez interwencji człowieka. Ten cel wymaga, aby maszyny były w stanie postrzegać i rozumować. Takie zdolności należą do kategorii działań zdroworozsądkowych, które – choć naturalne dla ludzkiego umysłu – historycznie okazały się trudne dla maszyn. W rezultacie prace w tej dziedzinie nadal stanowią wyzwanie. W tym rozdziale zajmiemy się niektórymi tematami w tym rozległym obszarze badań.

11.1 Inteligencja i maszyny

Dziedzina sztucznej inteligencji jest dość obszerna i łączy się z innymi zagadnieniami, takimi jak psychologia, neurologia, matematyka, językoznawstwo oraz inżynieria elektryczna i mechaniczna. Aby skoncentrować naszą uwagę, zaczniemy od rozważenia pojęć agenta i typów inteligentnych zachowań, które agent może przejawiać. W rzeczywistości wiele badań nad sztuczną inteligencją można skategoryzować w kategoriach zachowań agentów.

Inteligentne agenty

Agent to „urządzenie”, które reaguje na bodźce z otoczenia. Naturalne jest wyobrażanie sobie agenta jako konkretnej maszyny, takiej jak robot, chociaż agent może przybierać inne formy, takie jak autonomiczny samolot, postać w interaktywnej grze wideo lub proces komunikujący się z innymi procesami przez Internet (być może jako klient, serwer lub równorzędny proces). Większość agentów ma czujniki, za pomocą których otrzymują dane ze swoich środowisk oraz elementy wykonawcze, dzięki którym mogą wpływać na swoje otoczenie. Przykładami czujników są mikrofony, kamery, czujniki odległości czy czujniki do pobierania próbek powietrza lub gleby. Przykładami elementów wykonawczych są koła, nogi, skrzydła, chwytaki czy syntezatory mowy.

Wiele badań nad sztuczną inteligencją można scharakteryzować w kontekście budowania agentów, którzy zachowują się inteligentnie, co oznacza, że działania elementów wykonawczych agenta muszą być racjonalnymi odpowiedziami na dane otrzymywane przez jego czujniki. Te badania możemy sklasyfikować, biorąc pod uwagę różne poziomy tych odpowiedzi.

Najprostszą reakcją jest działanie odruchowe, które jest jedynie z góry ustaloną reakcją na dane wejściowe. Aby uzyskać bardziej „inteligentne” zachowanie, wymagane są bardziej zaawansowane poziomy odpowiedzi. Na przykład możemy wyposażyć agenta w wiedzę o jego środowisku i wymagać, aby odpowiednio dostosował swoje działania. Proces rzucania piłką baseballową jest w dużej mierze działaniem odruchowym, ale ustalenie, jak i gdzie rzucić piłkę, wymaga znajomości aktualnego otoczenia. (Zawodnicy są przy pierwszej i trzeciej bazie). Sposób, w jaki

11.1 Inteligencja i maszyny

taka wiedza ze świata rzeczywistego może być przechowywana, aktualizowana, udostępniana i ostatecznie wykorzystywana w procesie podejmowania decyzji, nadal stanowi trudny problem w sztucznej inteligencji.

Inny poziom reakcji jest wymagany, jeśli chcemy, aby agent dążył do celu takiego jak wygranie partii szachów lub przebrnięcie przez zatłoczone przejście. Takie zachowanie zorientowane na cel wymaga, aby reakcja agenta lub sekwencja odpowiedzi była wynikiem świadomego tworzenia planu działania lub wybrania najlepszego działania spośród dostępnych opcji.

W niektórych przypadkach reakcje agenta poprawiają się z czasem, gdy agent się uczy. Może to przybrać formę rozwijania wiedzy proceduralnej (uczenie się „jak”) lub przechowywania wiedzy deklaratywnej (uczenie się „co”). Uczenie się wiedzy proceduralnej zwykle obejmuje proces prób i błędów, w którym agent uczy się odpowiednich działań, będąc karany za złe działania i nagradzany za dobre. Zgodnie z tym podejściem opracowano agenty, które wraz z upływem czasu poprawiają swoje umiejętności w grach z elementami rywalizacji, takich jak warcaby i szachy. Zdobywanie wiedzy deklaratywnej zwykle przybiera formę rozszerzania lub zmieniania „faktów” w zasobach wiedzy agenta. Na przykład baseballista musi wielokrotnie dostosowywać swoją bazę wiedzy (wciąż jest tylko jedna, ale teraz zawodnicy są przy pierwszej i drugiej bazie), na podstawie której określi racjonalne reakcje na przyszłe wydarzenia.

Aby wytworzyć racjonalne reakcje na bodźce, podmiot musi „zrozumieć” bodźce odbierane przez jego czujniki. Oznacza to, że agent musi być w stanie wyodrębnić informacje z danych wytwarzanych przez jego czujniki, czyli innymi słowy, agent musi być w stanie postrzegać. W niektórych przypadkach jest to prosty proces. Sygnały uzyskiwane z żyroskopu mogą być łatwo zapisywane w postaciach wymaganych do obliczeń w celu wyznaczenia odpowiedzi. Ale w innych przypadkach wyodrębnienie informacji z danych wejściowych może być trudne. Przykładami jest rozumienie mowy i obrazów. Ponadto agenty muszą być w stanie sformułować swoje reakcje w pojęciach zgodnych z ich elementami wykonawczymi. Proces ten może być prosty lub może wymagać od agenta sformułowania odpowiedzi jako pełnych, wypowiadanych zdań, co oznacza, że agent musi generować mowę. W rezultacie ważne obszary badań stanowią takie zagadnienia, jak przetwarzanie i analiza obrazów, rozumienie języka naturalnego i generowanie mowy.

Okre ś lone przez nas atrybuty agentów reprezentuj ą zarówno przesz ł e, jak i obecne obszary badań. Oczywiście nie są one od siebie całkowicie niezależne. Chcielibyśmy tworzyć agenty, które mają wszystkie te atrybuty, tworząc agenty rozumiejące dane otrzymywane z ich otoczenia i rozwijających nowe wzorce odpowiedzi poprzez proces uczenia się, którego celem jest maksymalizacja potencjału agenta. Jednak separując różne rodzaje racjonalnych zachowań i realizując je niezależnie, badacze zyskują punkt zaczepienia, który można później połączyć z postępem w innych dziedzinach, aby stworzyć bardziej inteligentne agenty.

Zakończymy ten podrozdział, wprowadzając agenta, który da nam kontekst do naszej dyskusji w podrozdziałach 11.2 i 11.3. Agent będzie przeznaczony do

Rysunek 11.1 Ośmioelementowa łamigłówka w konfiguracji pokazującej rozwiązanie

rozwiązywania łamigłówki złożonej z ośmiu kwadratowych płytek oznaczonych od 1 do 8 zamontowanych w ramie, która może pomieścić łącznie dziewięć takich płytek w trzech rzędach i trzech kolumnach (rysunek 11.1). Wśród płytek w ramce znajduje się puste miejsce, w którym można umieścić dowolny z sąsiednich płytek, co pozwala na ich przesuwanie w ramce. Zadanie polega na tym, aby w pomieszanej układance poprzesuwać płytki z powrotem do ich właściwych pozycji (rysunek 11.1). Nasz agent ma postać pudełka wyposażonego w chwytak, kamerę wideo oraz wskaźnik z gumową końcówką, aby nie ślizgał się podczas przesuwania obiektów (rysunek 11.2). Gdy agent jest po raz pierwszy włączany, jego chwytak zaczyna się otwierać i zamykać, jakby prosząc o układankę. Gdy umieścimy w chwytaku pomieszaną ośmioelementową łamigłówkę, chwytak ją schwyci. Po krótkim czasie wskaźnik maszyny opuści się i zacznie przesuwać płytki w ramce, aż znajdą się one z powrotem na swoich prawidłowych pozycjach. W tym momencie maszyna zwolni łamigłówkę i wyłączy się

Ta maszyna do rozwiązywania łamigłówek ma dwa wskazane przez nas atrybuty agenta. Po pierwsze, musi być w stanie postrzegać – w tym sensie, że musi być w stanie wyodrębnić aktualny stan układanki z obrazu otrzymanego z kamery. Kwestie rozumienia obrazów omówimy w podrozdziale 11.2. Po drugie, musi opracować i zrealizować plan osiągnięcia celu. Te kwestie omówimy w podrozdziale 11.3.

Rysunek 11.2 Nasza maszyna do rozwiązywania łamigłówki

Turn static files into dynamic content formats.

Create a flipbook