<  1  2  3  4  5  6  7  8  9  10  11  12

Commodore cbm 3001 series computer 3032
Commodore cbm 3001 series computer 3032

Czy komputer potrafi myśleć?

Spis treści

Jednostka sterująca Procesora

Na początku przestawię działanie Jednostki Sterującej Procesora zawartego w komputerze. Od niej zależy zdolność komputera do reagowania na informacje zewnętrzne, którymi są rozkazy zawarte w programie (pomijam dodatkowe sygnały sterujące dopływające do procesora w celu organizacji jego pracy).

jednostka sterująca procesora

Jednostka sterująca składa się następujących elementów:

  • Rejestr Rozkazów - przechowuje aktualny kod rozkazu w postaci liczby binarnej odpowiadającej rozkazowi, który ma Procesor wykonać lub jest w trakcie jego wykonywania.

  • Dekoder Rozkazów - rozpoznaje, jaki rozkaz odpowiada liczbie binarnej zapisanej w Rejestrze Rozkazów.

  • Licznik Rozkazów - wskazuje miejsce w pamięci operacyjnej komputera, skąd pobierany jest kod rozkazu i zapisywany do Rejestru Rozkazów. Po rozpoznaniu rozkazu, jaki odpowiada tej liczbie, przez Dekoder Rozkazów, ustawiana jest nowa wartość Licznika Rozkazów wskazująca w pamięci kolejny kod rozkazu do wykonania.

  • Układ Sterujący - steruje elementami wewnętrznymi Procesora realizując rozpoznany rozkaz do wykonania. Poprzez sygnały wyjściowe Procesora steruje również elementami zewnętrznymi komputera.

Działanie jednostki sterującej

Działanie jednostki sterującej rozpoczyna się od pobrania z określonego miejsca pamięci operacyjnej, wskazanego przez Licznik Rozkazów, kodu rozkazu zapisanego w postaci liczby binarnej. Liczba ta zapisywana jest do Rejestru Rozkazów. Na podstawie tej liczby Dekoder Rozkazów rozpoznaje, jaki rozkaz odpowiada tej liczbie i w zależności od tego rozkazu następuje odpowiednie działanie układu sterującego, w postaci określenia kolejnych kroków do wykonania przez elementy procesora, jakimi są na przykład Arytmometr czy pozostałe rejestry procesora. Pobierane są także z pamięci operacyjnej kolejne argumenty rozkazu. Ustawiona jest też nowa zawartość Licznika Rozkazów, określająca teraz adres pamięci, pod którym znajduje się kolejny kod rozkazu do wykonania. Układ sterujący procesora, nie tylko steruje elementami wewnętrznymi procesora, ale również, poprzez odpowiednie wyprowadzenia, układami zewnętrznymi znajdującymi się poza procesorem. Do procesora oprócz rozkazów dochodzą, poprzez dodatkowe wejścia, informacje organizujące pracę procesora.

Jak wynika z powyższego opisu Licznik Rozkazów jest jednym z najważniejszych elementów Procesora, ponieważ dzięki niemu Procesor potrafi pobierać kolejne rozkazy do wykonania. Rejestr ten wskazuje, gdzie Procesor ma szukać w pamięci operacyjnej kolejnego kodu rozkazu do wykonania.

Licznik Rozkazów potrafi wskazywać jedynie adresy komórek należących do pamięci operacyjnej. Zatem, jest bardzo ważne, żeby komputer był wyposażony w pamięć operacyjną i aby przed wykonywaniem programu, kod programu znajdował się w tej pamięci. Widzimy tu więc, dlaczego pamięć operacyjna jest dla procesora taka ważna.

"Rozumienie" komputera na poziomie Procesora sprowadza się jedynie do rozpoznawania rozkazów. Zakres tego rozpoznawania ograniczony jest do listy rozkazów Procesora. Lista ta jest stała dla danego typu Procesora. W zależności od Procesora, lista rozkazów obejmuje od kilkudziesięciu do kilkuset (typowo od 20 do 200).

Jak więc widzimy komputer na poziomie Procesora jest tylko zwykłym automatem i nic nie ma wspólnego z myśleniem (rozpatruję obecną konstrukcję procesora).

Okazuje się, że o jakiejkolwiek zdolności komputera do myślenia możemy mówić dopiero na poziomie, oddzielonym od Procesora, sporą warstwą oprogramowania. Procesor na poziomie rozkazów procesera może jedynie przetwarzać sporą ilość szczegółowej informacji, której ogólnej interpretacji nie zna i nie jest w stanie poznać. Interpretacja ta pojawia się dopiero w górnych warstwach oprogramowania.

Inne elementy Procesora

Oprócz jednostki sterującej Procesor zawiera także Arytmometr, dzięki któremu może wykonywać operacje logiczne i arytmetyczne oraz posiada również Rejestry różnego przeznaczenia. Z obecności Arytmometru wynika, dlaczego Procesor wykonuje tak świetnie operacje arytmetyczne i logiczne, lepiej i szybciej niż człowiek.

Rozmowa z Procesorem

Komputer jako automat uniwersalny posiada możliwość programowania jego pracy. Pierwsze komputery programowano w języku rozkazów Procesora, znanym językiem maszynowym. Język maszynowy składa się z ciągu liczb binarnych odpowiadającym rozkazom procesora, danym i adresom pamięci operacyjnej.

Program w języku maszynowym procesora 8086

{Procedura drukowania znaku}

w kodzie
dwójkowym
w kodzie
dziesiętnym
w kodzie
szesnastkowym
 00011110  
 10001010
 10000110 
 00000008
 00110001
 11010010
 10110100
 00000000
 11001101
 00010111
 11000101 
 10011110
 00000004
 10001000
 00100111
 00011111
     30     
    138 
    134 
      8 
     49 
    210 
    180 
      0 
    205 
     23 
    197 
    158 
      4 
    136 
     39 
     31 
     1E
     8A
     86
     08
     31
     D2
     B4
     00
     CD
     17
     C5
     9E
     04
     88
     27
     1F

Powyżej pokazano, jak wygląda język maszynowy zrozumiały dla Procesora komputera, na przykładzie programu do drukowania znaku na drukarce. Program przedstawiono w trzech postaciach: ciągu liczb w zapisie dwójkowym, dziesiętnym i szesnastkowym.

W pamięci operacyjnej komputera program występuje w postaci zapisu dwójkowego (realizując stany elektryczne: 1 - jest napięcie, 0 - brak napięcia) i w takim systemie rozmawia procesor. Zapis szesnastkowy jest z kolei bardzo zwięzły i nadaje się do używania go przez programistę i wprowadzania programu w postaci języka maszynowego do komputera. Po wprowadzeniu liczby w zapisie szesnastkowym, zamieniana jest ona na postać dwójkową (binarną) i umieszczana w pamięci operacyjnej.

Programista po sporządzeniu programu w języku maszynowym, wprowadza następnie liczby do pamięci operacyjnej komputera, jedna po drugiej, a następnie ustawia wskazanie Licznika Rozkazów Procesora na komórkę pamięci, w której zapisana jest pierwsza liczba z kodu programu.

Język maszynowy jest zrozumiały dla Procesora, ale zupełnie niezrozumiały dla człowieka. Aby zwiększyć tą czytelność programista musiał często objaśniać, co poszczególne liczby oznaczają, aby mieć możliwość dokonania zmian lub korekt w programie lub też, aby przekazać innemu programiście informację, co miał na myśli wybierając dany sposób rozwiązania problemu programistycznego.

Przykład objaśnień programu napisanego w języku maszynowym

 00011110 - Zachowaj zawartość rejestru DS na stosie   
 10001010 - Do rejestru AL ładuj kod znaku z pamięci
 10000110     o adresie SS:BP+08 
 00000008
 00110001 - Ustaw w rejestrze DX (0 = LPT1)
 11010010
 10110100 - Ustaw w rejestrze AH (0 = nr funkcji)
 00000000
 11001101 - Wywołaj przerwanie drukowania znaku
 00010111
 11000101 - Przepisz adres statusu druku z pamięci  
 10011110     o adresie SS:BP+04  do DS:BX
 00000004
 10001000 - Zapisz zawartość AH do komórki pamięci 
 00100111      o adresie DS:BX
 00011111 - Odzyskaj poprzednią zawartość rejestru DS
               ze stosu 
 --------------------------------------------          
 Organizacja stosu dla wywołania procedury drukowania
               
 SS:BP+$00 - poprzednia wartość rejestru BP na stosie
 SS:BP+$02 - adres powrotu z procedury drukowania znaku 
 SS:BP+$04 - adres zmiennej "status" (offs)
 SS:BP+$06 - adres zmiennej "status" (segment)
 SS:BP+$08 - parametr "znak"
 SS:BP+$0A - do dyspozycji treści procedury

W zależności od typu Procesora język maszynowy zmienia się. Aby znać ten język, należy przede wszystkim znać listę jego rozkazów i ogólną zasadę jego działania.

Zaletą programowania w języku maszynowym był bez wątpienia brak posiadania jakiejkolwiek licencji na tworzenie oprogramowania wykonywanego przez procesor (bo sami jesteśmy jego twórcą), co dosyć często występuje w przypadku pisania w językach wyższego poziomu niż język maszynowy. Przed uruchomieniem programów napisanych w języku wyższego poziomu należy skorzystać z programu tłumaczącego ten język, na język zrozumiały dla procesora, a na taki program tłumaczący jego twórca żąda licencji, którą należy kupić.

Symboliczne rozumienie języka Procesora

Już w latach 1945 Konrad Zuse, twórca komputera zerowej generacji o nazwie Z4, starał się maksymalnie ułatwić pisanie programów w języku maszynowym dla swojej maszyny , skutkiem czego opracował układ elektromechaniczny o nazwie "Planfertigungsteil". Ten układ pozwalał programiście używać symbolicznego oznaczania komórek pamięci, instrukcji i operacji arytmetycznych przy tworzeniu programu na maszynę Z4. Takie symboliczne oznaczanie elementów języka maszynowego nazwano później Asemblerem (Assembler). Programista nie musiał już pamiętać znaczenia liczb binarnych języka maszynowego, lecz wystarczały mu symboliczne odpowiedniki rozkazów, operacji i komórek, ujęte w prostej i zrozumiałej dla programisty strukturze języka symbolicznego zwanego Asemblerem. Dzięki Asemblerowi wzrosła szybkość programowania oraz uczenia się i poznawania zasad działania i programowania Procesora.

Należy jednak pamiętać, że Asembler oznaczał nadal programowanie w języku rozkazów Procesora, lecz w ujęciu symbolicznym, a nie liczbowym. Ten symboliczny zapis musiał być z powrotem zamieniany na postać liczbową, tylko że tą czynność nie musiał wykonywać człowiek lecz komputer w postaci programu tłumaczącego znanego Asemblerem.

Program w języku Asembler dla procesora 8086
{ Procedura drukowania znaku }

 Asembler              język maszynowy 
 PUSH DS                 1E 
 MOV AL,[BP + znak]      8A 86 08 
 XOR DX                  31 D2
 MOV AH,0                B4 00
 INT 17                  CD 17
 LDS BX,[BP + status]    C5 9E 04
 MOV [BX],AH             88 27
 POP DS                  1F
 -----------------------
 status = $04 (offs, seg)  
 znak   = $08 (offs)

Powyżej został przedstawiony program drukowania znaku, zapisany w języku Asembler, a obok niego, dla porównania, kod w języku maszynowym (liczby są zapisanie w postaci szesnastkowej). Aby oznaczyć kod szesnastkowy przez liczbą wstawiamy znak $. Poniżej zamieszczono objaśnienie kodu.

Objaśnienie:

 PUSH DS                 Prześlij zawartość rejestru DS na stos 
 MOV AL,[BP + znak]      Do Rejestru AL prześlij zawartość
                            komórki spod adresu SS:BP+$08 
 XOR DX                  Wyzeruj rejestr DX
 MOV AH,0                Wyzeruj rejestr AH
 INT 17                  Wywołanie przerwanie 17
 LDS BX,[BP + status]    Do Rejestrów DS i BX załaduj adres 
                          spod komórki o adresie SS:BP+$04
 MOV [BX],AH             Do komórki o adresie DS:BX prześlij
                           wartość z rejestru AH 
 POP DS                  Przywróć zawartość rejestru DS ze stosu 
 -----------------------
 status = $04 (offs, seg)  
 znak   = $08 (offs)

Z właściwości pamięci ludzkiej wynika, że wiedza człowieka, uczącego się rozkazów procesora, jest ujmowana w postaci konstrukcji symbolicznych, a nie liczbowych. Asembler tylko pomaga i nadaje określony kształt symboliczny i systematyczność wiedzy o programowaniu Procesora i to w sposób ujednolicony. Istotną wadą jest zależność języka od typu Procesora, tzn. ile jest typów Procesorów, tyle jest Asemblerów. Wraz ze zmianą typu Procesora wiedza dotycząca programowania staje się nieaktualna, choć ogólny zarys i doświadczenie programisty pozostaje.

Kolejną wadą programowania na niskim poziomie jest wyraźny ukłon człowieka, w kierunku maszyny, a nie odwrotnie, tzn. głównym punktem zainteresowania i koncentracji wiedzy człowieka jest Procesor, a nie problem, który ma być przez programistę rozwiązany (zbyt dużo drobiazgów z Procesorem pozostaje do rozwiązania do uzyskania konkretnego wyniku).

Pomimo tych wad jednak, kto umiał programować Procesor, ten znał komputer jak własną kieszeń i potrafił wyciągnąć z niego wszystko, co tylko mógł.

Przystosowywanie komputera do człowieka

Człowiek już od dawna marzył, aby jego praca umysłowa wspomagana była zbudowaną przez niego maszyną. Na początku wysiłki człowieka skierowane były na wspomożeniu jego w czynnościach kalkulowania, stąd stworzył maszyny liczące, a w końcowym etapie komputer.

Od 1940 roku, kiedy konstruowano pierwsze modele komputerów (zerowej generacji, opartej na przekaźnikach), zaczęto się zastanawiać nad wykorzystaniem komputerów do zastępowania pracy umysłowej człowieka i sądzono, że jest to tylko kwestią najbliższych lat. Człowiek pokładał w komputerze bardzo dużą nadzieję. Świadczy o tym fakt, że na początku komputer otrzymał miano mózgu elektronowego lub myślącej maszyny. Wszak, w kalkulowaniu sprawdzał się nad wyraz dobrze i to już było dużym osiągnięciem tej maszyny.

Pierwsze komputery były wykorzystane do tego, do czego komputer został stworzony, tzn. do obliczeń numerycznych. Dane wejściowe w postaci liczb były przetwarzane na wynik w postaci również liczbowy, a sam komputer realizował tylko proces obliczeniowy i przetwarzania jednych liczb w inne. Myślenie pozostawione było człowiekowi. Człowiek także musiał zaprogramować cały proces obliczeniowy komputera przy pomocy języka programowania. Językiem tym na początku był język rozkazów Procesora (maszynowy), a później ten sam, lecz w ujęciu symbolicznym (Asembler). Programista ucząc się go musiał dostosowywać się do mowy Procesora.

Zaczęto zastanawiać się również nad zaprojektowaniem takiego języka, za pomocą którego można byłoby zapisywać algorytmy przetwarzania informacji w sposób zrozumiały dla człowieka i zmusić w ten sposób Procesor, aby zaczął dostosowywać się do rozumienia człowieka.

Stawiano sobie pytania, jak wymyślić taki język programowania, który będzie w jakimś stopniu zbliżony do języka naturalnego. Powstała koncepcja języka programowania wysokiego poziomu - czyli takiego, który będzie odzwierciedlał algorytm rozwiązania jakiegoś problemu w sposób widoczny i czytelny dla człowieka, a nie przedstawiał maszynową realizację tego problemu w języku rozkazów procesora, trudną do rozszyfrowania, nawet dla autora programu. Taki nowy język wymagał z kolei, przed uruchomieniem programu napisanego w tym języku, przetworzenia zapisu tego języka na formę zrozumiałą dla danego typu Procesora w postaci języka maszynowego. Ale tą niewdzięczną czynność tłumaczenia pozostawiano już komputerowi, a programy do tłumaczenia nazwano transatorami i kompilatorami.

Co uzyskano, dzięki koncepcji programowania wysokiego poziomu? Po pierwsze ten nowy język uwzględniał sposób pojmowania problemu przez człowieka, a nie przez Procesor. Po drugie człowiek nie musiał już uczyć się języka rozkazów Procesora, za każdym razem innego z zależności od typu procesora. Zamiast tego komputer posiadał program tłumaczący ten nowy język na język rozkazów Procesor. Program tłumaczący był wcześniej opracowywany przez programistów tworzących kompilatory. Dzięki temu, człowiekowi pozostawało jedynie nauczyć się posługiwać językiem wysokiego poziomu. Tym samym nastąpiło oddzielenie człowieka od Procesora. Człowiekowi potrzebny był tylko edytor do napisania programu w tym języku oraz wiedza z zakresu posługiwania się nowym językiem. Dla Procesora potrzebny był z kolei wspomniany już program do tłumaczenia zapisów w języku wysokiego poziomu na kod zrozumiały dla niego. To otworzyło drogę do powstania wielu języków programowania wysokiego poziomu nawet dowolnie wyimaginowanych. Niektóre z nich stały się światowym standardem w dziedzinie programowania. Było to wielkie osiągnięcie człowieka, że maszynę można było nauczyć rozumieć język, w którym mógł zapisać algorytm rozwiązania jakiegoś problemu w sposób widoczny i czytelny dla niego i innych ludzi.

Język wysokiego poziomu - Turbo Pascal (Borland)
{ wywołanie procedury drukowania znaku }

DrukujZnak(znak, status)

Powyżej przedstawiony został przykład wywołania procedury drukowania znaku w języku wysokiego poziomu (Turbo Pascal). Działanie procedury jest analogiczne do wcześniej pokazanego kodu w języku maszynowym lub w Asemblerze. Sposób organizacji stosu Procesora (występujący w przykładach zapisu maszynowego i Asemblerowego) wyznaczony jest następującą deklaracją procedury w języku wysokiego poziomu (Turbo Pascal):

procedure DrukujZnak(znak:char; var status:byte)

Z powyższego przykładu widać wyraźnie, jak czytelny, zwięzły i prosty do zrozumienia jest język wysokiego poziomu w odróżnieniu od języka maszynowego czy Asemblera.

Ponadto nic nie wiąże ten język z Procesorem, na którym chcemy uruchomić napisany program. Jednakże przez uruchomieniem naszego programu musimy skorzystać z programu (kompilatora) tłumaczącego ten język, na język maszynowy Procesora. Dla różnych Procesorów mamy różne programy tłumaczące, ale postać języka wysokiego poziomu pozostaje ta sama. Pod zapis procedury drukowania nazwanej "DrukujZnak", program tłumaczący wstawia na przykład wcześniej pokazany kod maszynowy.

Choć pierwszym językiem wysokiego poziomu był "Short Order Code", który został opracowany już w 1949 r. przez John Mauchly na potrzeby komputera UNIVAC, to pierwszego istotnego znaczenia nabrał, opracowany w latach 1954-1956 pod kierunkiem J. Backusa w firmie IBM, algorytmiczny język wysokiego poziomu o nazwie Fortran.

Dzisiaj wydaje się rzeczą zupełnie zwyczajną programowanie przy pomocy języka wysokiego poziomu, których mamy do wyboru wiele i nikogo to nie dziwi, ani nie porusza, a większości z nas nawet nie przychodzi do głowy, że jest to jedno z największych osiągnięć człowieka w dziedzinie informatyki tuż po wynalezieniu komputera.

Dzięki realizacji koncepcji języka wysokiego poziomu w postaci języka np. Fortran programista ma możliwość bezpośredniego formułowania wyrażeń matematycznych w stylu tradycyjnym. Jednocześnie język ten pozwala na pisanie programu w postaci procedur i funkcji niezależnie od budowy komputera, rodzaju procesora, używanego systemu operacyjnego. Ta zależność przeniesiona jest na program tłumaczący na język maszynowy danego procesora (interpreter, kompilator). Fortran głównie wykorzystywany jest do obliczeń numerycznych.

Wraz z opracowaniem języka wysokiego poziomu zrealizowało się pragnienie człowieka (w tym przypadku programisty), aby maszyna potrafiła rozumieć go i wykonywać jego polecenia w języku chociaż trochę zbliżonym do języka naturalnego.

Przykład programu w języku Fortan 77

      PROGRAM DFT_EXAMPLE

      PARAMETER (N = 128,M=8)
      DIMENSION FR(N),FI(N),GR(N),GI(N)

      F0 = 1.0/SQRT(FLOAT(N))
      H  = 1.0/(N-1)

      DO      150  I = 1, N
        X     = H*(I-1)
        FR(I) = X*(1.0-X)
        FI(I) = 0.0
  150 CONTINUE

      CALL DFT (FR,FI,GR,GI,N)
      DO      200  I = 1, N
        GR(I) = F0*GR(I)
        GI(I) = F0*GI(I)
  200 CONTINUE

      DO      300  I = 1, N
        GI(I) = -GI(I)
  300 CONTINUE
      CALL DFT (GR,GI,FR,FI,N)
      DO      400  I = 1, N
        FR(I) =  F0*FR(I)
        FI(I) = -F0*FI(I)
  400 CONTINUE
      WRITE (6,999) (H*(I-1),FR(I),I=1,N,M)
      WRITE (6,999)  H*(N-1),FR(N)
      STOP
  999 FORMAT (2F16.8)
      END

      SUBROUTINE DFT (FR,FI,GR,GI,N)

      DIMENSION FR(N),FI(N),GR(N),GI(N)
      PI = 4.0*ATAN(1.0)
      X  = 2*PI/N

      DO      150  I = 1, N
        GR(I) = 0.0
        GI(I) = 0.0
        DO    100  J = 1, N
          Q     = X*(J-1)*(I-1)
          GR(I) = GR(I) + FR(J)*COS(Q) + FI(J)*SIN(Q) 
          GI(I) = GI(I) + FI(J)*COS(Q) - FR(J)*SIN(Q)
  100   CONTINUE
  150 CONTINUE
      RETURN
      END

Po pojawieniu się języka wysokiego poziomu Fortran pojawiły się następne języki tego typu, jak: Lisp (1960), Algol (1960), Cobol (1960), Apl (1962), Simula (1962), Basic (1964), PL/I (1964), Prolog (1971), C (1972), Pascal (1975), Scheme (1975), Modula-2 (1979), dBase (1980), Ada (1980), Smalltalk (1983), Parlog - równoległy Prolog (1983), C++ (1986), Mathematica (1988), Java (1995) i wiele innych.

Nowy styl programowania

Wraz z pojawieniem się języków wysokiego poziomu pojawił się też styl abstrakcyjnego modelowania rzeczywistości w tych językach w ten sposób, aby abstrakty tej rzeczywistości przekładały się na postać programu do wykonania przez komputer, a z drugiej strony były zrozumiałe dla człowieka i maszyny. Powstała nowa gałąź działalności człowieka, jaką jest tworzenie oprogramowania w językach wysokiego poziomu. Wraz z ogólnym dostępem do języków wysokiego poziomu, rosła też rzesza programistów. Praktycznie każdy, przy odrobinie chęci, może zostać programistą.

Abstrakcja w programowaniu oznacza pewne uproszczenia, zastąpienie skomplikowanych i szczegółowych okoliczności występujących w świecie rzeczywistym zrozumiałym modelem umożliwiającym rozwiązanie problemu. Oznacza to, abstrahowanie od szczegółów, które nie mają wpływu lub mają minimalny wpływ na rozwiązanie problemu. Opracowanie odpowiedniego modelu ułatwia zajęcie się istotą problemu. Tą zdolność nabywa programista podczas wielu lat codziennej pracy programistycznej. Programiści zatem potrafią poprzez abstrakcję przekładać otaczającą rzeczywistość w postać zrozumiałą nie tylko dla człowieka, ale poprzez kompilator (interpreter) dla maszyny.

Kompilator (należący do grupy translatorów) jest programem do tłumaczenia kodu źródłowego (w języku programowania) na język pośredni lub maszynowy, a następnie wynik tłumaczenia ładuje do pliku (może być wykonawczego), natomiast

Interpreter jest programem komputerowym, który po napisaniu wiersza kodu źródłowego przez użytkownika i przyciśnięciu klawisza <Enter> analizuje ten kod i wykonuje.

Wraz z językami programowania wysokiego poziomu powstały  warunki bezpośredniej przemiany ludzkiego intelektu w produkt końcowy i to z pominięciem nakładów materiałowych. Dzięki temu praca umysłowa może być w sposób czysty i bezpośredni przetwarzana na abstrakcyjne modele rzeczywistości w postaci oprogramowania.

Sztuczna Inteligencja

Pomimo pojawienia się języków wysokiego poziomu, komputer w dalszym ciągu sprawiał wrażenie jedynie programowalnego automatu.

Słusznie sądzono, że aby komputer, podobnie jak człowiek, posługiwał się inteligencją, należało go tego nauczyć w postaci dostarczenia mu odpowiedniego oprogramowania.

Aby stworzyć takie oprogramowanie, należało najpierw wiedzieć, co to jest inteligencja, a następnie stworzyć jej model i dopiero na koniec przenieść na komputer w postaci oprogramowania.

Powstawał przy tym zasadniczy problem. Jak człowiek może nauczyć komputer swojej inteligencji, skoro tak na prawdę sam dokładnie nie zna samego siebie ani działania swojego umysłu i to na tyle, aby stworzyć wystarczający model tej inteligencji, celem przełożenia jej na maszynę? Wyrazem tych trudności jest chociażby zwrócenie się człowieka do całej dotychczasowej swojej wiedzy, jaką do tej pory zdobył celem znalezienia tam odpowiedzi. Rezultatem tych poszukiwań jest nowa multidyscyplinarna gałąź nauki zajmująca się działaniem umysłu oraz jego modelowaniem o nazwie kognitywistyka. Nauka ta łączy w sobie takie nauki jak: psychologia poznawcza, neurologia, filozofia umysłu, sztuczna inteligencja (informatyka), lingwistyka (lingwistyka kognitywna - traktująca język ludzki jako wyraz umysłowych zdolności postrzegania świata).

Ludzkość od dość dawna stoi przed poważnym pytaniem. Jaką istotę ma inteligencja człowieka, co ją tworzy i jak ją rozłożyć na czynniki proste (stworzyć jej model). Bez tej wiedzy nie można napisać programu, który nadałby maszynie tą cechę.

Okazało się, że najtrudniej jest zaglądnąć człowiekowi w głąb samego siebie i poddać analizie to, co się wewnątrz niego kryje, jak i w sferze jego umysłu. Jakby udało się tego dokonać, to późniejsze przeniesienie tego na maszynę nie stanowiłoby już zbyt dużej trudności. Byłaby to tylko kwestia czasu.

inteligentny komputer
Inteligentny komputer

Istniało wiele teorii i powstawały nowe, ale były za mało pewne i na tyle ogólnikowe, że nie nadawały się do realizacji w postaci satysfakcjonującego programu dla maszyny. Pewne abstrakcje w tym względzie dawały modele, które niestety przeniesione na komputer nie dawały spodziewanych rezultatów.

To jedno doskonale wiedziano, że z procesora nie da się niczego więcej wycisnąć, oprócz tego, co zostało mu włożone podczas jego produkcji w postaci określonej listy rozkazów. Rozumiano doskonale, że całe sedno kryje się tylko w oprogramowaniu.

Wiedziano również, iż model musi opierać się na rozwiązaniu na tyle prostym i elementarnym, że stopień komplikacji nie będzie wzrastał zbytnio, wraz ze wzrostem złożoności tego modelu. Taką cechę mają tylko odkrycia i wynalazki, a więc rozwiązanie tego problemu prawdopodobnie musiało mieć cechę odkrycia lub wynalazku.

Ponieważ tego zadania nie udało się rozwiązać od razu, postanowiono postępować sukcesywnie, drogą stopniowego dobrze ukierunkowanego rozwoju. Oznaczało to, że nie będzie oczekiwanego i szybkiego uporania się z tym zadaniem.

Często powraca się do teorii raz już porzuconych sądząc, że może ktoś coś tam przeoczył i mniemając, że jeżeli bardziej się w te teorie zagłębić lub je rozszerzyć to znajdzie się przypadkiem rozwiązanie, ale po etapie prób i błędów znowu pozostaje się w punkcie wyjścia.

W tej chwili wydaje się, że człowiek drepce w miejscu, ciągle oczekując na jakieś odkrycie, czy nową, trafną teorię, która w końcu wydyma żagle dalszego rozwoju w tej dziedzinie po okresie stagnacji i spokoju. Być może nowe dokonania w tej dziedzinie są przed nami ukrywane gdzieś w zaciszu laboratoriów zajmujących się sztuczką inteligencją, aby czasem nie przejęła ich konkurencja, dopóki nie ujrzą światła dziennego w postaci efektu końcowego.

Początki Sztucznej Inteligencji

W latach pięćdziesiątych XX wieku oprócz konwencjonalnego oprogramowania, zorientowanego na rozwiązywanie problemów natury numerycznej, zaczęto zastanawiać się nad przetwarzaniem symbolicznym, podobnym do takiego, jakie jest podstawą rozumienia pojęć przez umysł ludzki.

Wiadomym już wtedy było, że człowiek poprzez symbole spogląda na świat oraz konstruuje swoją wiedzę. Symbole pozwalają odrzucić to, co jest nieistotne lub za bardzo szczegółowe, a pozostawić coś ważnego dla człowieka i nadać temu nazwę. Symbole są produktami abstrakcji i na nich opiera się nasza wiedza.

Zaczęły powstawać pierwsze programy oparte na przetwarzaniu symbolicznym, na początku głównie do dowodzenia twierdzeń matematycznych. Ukonstytuowała się nowa klasa programów o nazwie Sztuczna Inteligencja (ang. Artificial Intelligence) lub w skrócie AI.

Aby skoncentrować działania w kierunku AI, w latach pięćdziesiątych zostały założone dwa ośrodki badawcze nad Sztuczną Inteligencją. Pierwszy został założony w roku 1954 przez Allena Newella i Herberta Simona na Uniwersytecie Carnegie Mellon, a drugi w roku 1957 przez John McCarthy na Uniwersytecie MIT (Massachusetts Institute of Technology). Tym zagadnieniem zajmuje się też obecnie wiele innych ośrodków na całym świecie.

Opracowano szereg rozwiązań programowych, ale im bardziej zagłębiano się w temat Sztucznej Inteligencji, tym bardziej rozumiano, w czym tkwią trudności w realizacji takich systemów. Gromadzono doświadczenia w tym kierunku. Korzystano zarówno z wiedzy psychologów jak i własnej wiedzy, intuicji i pomysłów

Pierwszym problemem, jaki się pojawił, był brak skutecznego narzędzia do przenoszenia wymyślonych koncepcji AI na komputer w celu sprawdzenia poprawności tych koncepcji. Bardzo często trzeba było szybko sprawdzić jakąś nową teorię, a myślenie naukowców odbywało się na poziomie wyższym, niż poziom rozkazów procesora. Programowanie w Asemblerze pochłaniało zbyt wiele czasu i wysiłku oraz nie pozwalało skupić się właściwie na modelowaniu Sztucznej Inteligencji. Fortran też nie nadawał się do tego. Był on dobry, ale do przetwarzania numerycznego.

Oznaczało to potrzebę skorzystania z jakiegoś innego języka programowania niż Asembler i Fortran. Potrzebny był język wysokiego poziomu do operowania na symbolach i w dodatku musiał on być wyposażony w mechanizm dynamicznego przydziału pamięci operacyjnej w trakcie działania programu, aby można było łatwo operować na zmieniających się listach czy innych strukturach danych, złożonych z symboli, podczas tworzenia i eksploatowania tych struktur w trakcie działania programu. Taki program musiał przejawiać np. zdolność do gromadzenia doświadczenia podczas interakcji z otoczeniem, co jest jedną z cech inteligencji, a więc jego struktura danych nie mogła być statyczna, ustalana przez programistę podczas pisania kodu źródłowego jeszcze przed uruchomieniem programu. Bo wtedy program byłby jedynie statycznym automatem.

W pierwszym wyżej wymienionym ośrodku do badań nad Sztuczną Inteligencją, na Uniwersytecie Carnegie Mellon, zespół w składzie Allen Newell, J.C. Shaw i Herbert Simon w latach 1954 - 1956 przy współudziale Instytutu Carnegie Institute of Technology opracował pierwszy język do programowania w zakresie Sztucznej Inteligencji o nazwie IPL (Information Processing Language).

W drugim ośrodku na Uniwersytecie MIT, programista John McCarthy opierając się na doświadczeniach wyniesionych z języka IPL opracował w roku 1959 język o nazwie Lisp (od angielskiego List Processing).

Ostatecznie język Lisp stał się tym standardowym językiem do programowania w zakresie Sztucznej Inteligencji. Stosowano go dość powszechnie w Stanach Zjednoczonych, do modelowania systemów opartych o AI. W języku tym opracowywano wiele systemów ekspertowych.

Obecnie Lisp nadal jest używany, jako język wysokiego poziomu, uniwersalnego zastosowania. Nowoczesne kompilatory tego języka dają kod zoptymalizowany i efektywny, porównywalny z C++.

Fragment programu w języku Lisp

  (defun spr_warunki (nowe-warunki rules)
         (if (not (spr-negatywne nowe-warunki))
            (do ((fakty nowe-warunki (rest fakty))
               (ok nil))
              ((or (endp fakty) ok) (wykonaj ok rules))
                (if (czy-pytac (first fakty))
                 (setf ok (not (zapytaj (first fakty))))
                 (setf ok nil)))
            (progn
               (setf nr_reguly (+ nr_reguly 1))
    (if (> nr_reguly (length rules))(niepowodzenie f_r)
        (prog1
        (spr-warunki (nowa-regula rules nr_reguly) rules))))))
        
  (defun czy-pytac (fakt)
     (endp (member fakt pozytywne :test 'equal)))
       
  (defun spr-negatywne (facts)
             (if (endp negatywne) nil
                   (do ((f facts (rest f))
                   (ok nil (or ok (not (endp (member (first f)
                       negatywne :test 'equal))))))
                              ((or (endp f) ok) ok))))

Myślące komputery V generacji

Obecną klasę komputerów zaliczamy do IV generacji. Oparta jest ona na technologii mikroprocesorowej, wyposażonej w system operacyjny, w którym są uruchamiane programy użytkowe.

Język Prolog

Wizja komputerów myślących w pełni wyposażonych w sztuczną inteligencję (V generacji) nabrała znaczenia w roku 1972, kiedy to na Uniwersytecie w Marsylii (we Francji) zespół prowadzony przez Alaina Colmerauera i Phillipe'a Roussela, zajmujący się badaniami nad sztuczną inteligencją, a w szczególności zastosowaniem logiki i metod wnioskowania do budowy systemów przetwarzania języka naturalnego, opracował język programowania wysokiego poziomu o nazwie Prolog.

Prolog jest językiem symbolicznym przeznaczonym do zarządzania bazą wiedzy zbudowanej w oparciu o ten język. Jego nazwa pochodzi od języka francuskiego Programmation en Logique (programowanie w logice), tak więc jest to język oparty na logice.

Jak wiadomo z neuropsychologii, w korze mózgowej człowieka, w płacie skroniowym lewej półkuli znajdują się ośrodki odpowiadające za logikę myślenia, którą człowiek wykorzystuje do wnioskowania w bazie wiedzy zgromadzonej w pamięci kory mózgowej podczas swojego życia. Ta logika myślenia i zdolność wyciągania wniosków są istotnymi cechami inteligencji człowieka (umiejętność korzystania z nabytej wiedzy). Tłumaczy to zwrot poszukiwań naukowców, zajmujących się sztuczną inteligencją, ku rozwiązaniom opartym na metodach symboliczno-logicznych. Logika ma jeszcze tą dodatkową cechę, że posiada swoje umocowanie w matematyce, z której można pobierać sprawdzone ramy formalne do opisu składni języka programowania opartego na logice. Ponadto, arytmometr mikroprocesora jest wyposażony zarówno w elementy arytmetyczne jak i logiczne, co powoduje, że komputer zarówno sprawnie liczy jak i wykonuje działania logiczne. Tak więc na polu logiki można najłatwiej uzyskać dopasowanie komputera do sposobu myślenia człowieka i na tej płaszczyźnie bardzo łatwo jest symulować to myślenie.

Język Prolog przyniósł spore sukcesy w dziedzinie sztucznej inteligencji, przy produkcji systemów ekspertowych, dedukcyjnych baz danych jak i systemów analitycznych. Bardzo łatwo jest w nim zaprojektować meta-narzędzia do produkcji innych języków np. języków programowania.

Już od samego początku powstania Prologu zdobył on szeroki rozgłos ze względu na opracowanie w tym okresie pierwszego dużego programu w Prologu do komunikacji człowieka z komputerem w języku francuskim. Było to sporym osiągnięciem jak na tamte czasy. Komunikacja człowieka z komputerem w języku naturalnym była jednym z podstawowych celów, jaki stawia przed sobą sztuczna inteligencja, choć pozostaje kwestia rozumienia tego języka przez maszynę, co wydawałoby się jest przynależne tylko człowiekowi.

Ponieważ Prolog wynaleziono we Francji, stał się on w Europie, a później także w Japonii, podstawowym narzędziem do budowy systemów ekspertowych, podobnie jak zastosowanie Lispu  do podobnego celu w Ameryce, w której powstał.

Język Prolog jako odchudzony system ekspertowy

W zasadzie Prolog, można już traktować jako pewnego rodzaju bardzo odchudzony szkielet systemu ekspertowego z gotową reprezentacją regułowej bazy wiedzy, wbudowanymi algorytmami wnioskowania wstecz, możliwością dialogu z użytkownikiem poprzez zadawanie zapytań w tym języku do bazy wiedzy i uzyskiwanie z niej odpowiedzi. Z tego tytułu projektowanie systemów ekspertowych w Prologu jest łatwe i dostępne dla szerokiego kręgu programistów, nawet nie zaznajomionych z technologią systemów ekspertowych. Dzieje się tak dlatego, ponieważ każdy program napisany w Prologu, może już być traktowany, jako pewnego rodzaju system ekspertowy.

Odmienny styl programowania w języku Prolog

W programowaniu, przy użyciu języka Prolog, używa się odmiennej techniki programowania zwanej deklaratywną w odróżnieniu od techniki proceduralnej stosowanej w przypadku innych języków programowania. Programując w Prologu myślimy od samego początku o bazie wiedzy, w zupełnym oderwaniu od rodzaju sprzętu i środowiska, w którym Prolog pracuje. O Prologu można powiedzieć, że jest mocno wzorowany na ludzkim myśleniu, na logice, co czyni go najbardziej wygodnym ze wszystkich znanych narzędzi programowania, do implementacji systemów analitycznych, dialogowych i ogólnie systemów ekspertowych, w których baza wiedzy pełni istotną rolę. Ponadto Prolog jest bardzo wydajny przy pisaniu kodu źródłowego. W przypadku innych języków programowania programista myśli o instrukcjach, funkcjach czy procedurach, które musi wykonać komputer w celu realizacji programu, a to nie jest zgodne z naturą ludzkiego myślenia i wymaga dużej wiedzy, doświadczenia i praktyki w programowaniu (tego trzeba się nauczyć i stale poszerzać umiejętności w trakcie systematycznego programowania).

Program napisany w innych językach niż Prolog sterowany jest kolejnością zapisanych w kodzie programu instrukcji, procedur i funkcji, natomiast napisany w Prolog sterowany jest wnioskowaniem, jakie występuje w bazie wiedzy. W Prologu wnioskowanie jest typu regresywnego (wstecz lub inaczej mówiąc dedukcyjne). Wnioskowanie rozpoczyna się od podania celu, który należy osiągnąć. Mechanizm wnioskowania dokonuje rozbioru celu na podcele w oparciu o posiadaną bazę wiedzy i każdy z tych podceli poddawany jest szczegółowej analizie, aż do uzyskania rozwiązania. Ponadto reguły zawarte w bazie wiedzy w oparciu o dedukcyjne wnioskowanie pozwalają wywnioskować nowe fakty na podstawie tych, które już baza zawiera. Przypomina to twórcze myślenie człowieka.

Porównując np. język Lisp do Prologu oba języki posiadają dynamiczne zarządzanie pamięcią operacyjną oraz wbudowany mechanizm przetwarzania struktur symboli o charakterze list. Lisp stosuje wartościowanie (przypisywanie wartości), natomiast Prolog stosuje uzgadnianie. Prolog ponadto wyposażony jest, jak już wspomniałem, we wbudowany mechanizm wnioskowania, który ożywia aplikacje napisane w Prologu, nadaje im cech inteligentnych, umożliwia natychmiastowy dialog użytkownika z aplikacją w oparciu o bazę wiedzy, która w razie potrzeby, może być powiększana o nowe doświadczenia. Bardzo to ułatwia programowanie, ponieważ główny mechanizm sterowania aplikacji, jakim jest wnioskowanie, pochodzi już od Prologu w postaci zoptymalizowanej i programista nie musi się już zajmować jego implementacją.

Ogólnie język Lisp można ocenić jako bardziej uniwersalny i niższego rzędu niż Prolog, natomiast Prolog za wyspecjalizowany do zarządzania bazą wiedzy, wyposażony dodatkowo we wbudowany mechanizm wnioskowania oraz specjalne instrukcje sterowania tym wnioskowaniem i z inną filozofią programowania niż pozostałe języki. Ta filozofia pozwala na bardzo szybkie osiąganie efektu końcowego (aplikacji).

Jeżeli chodzi o ocenę efektywności, to już sam Lisp jest ok. 8-razy efektywniejszy w pisaniu kodu źródłowego niż C, a Prolog jest jeszcze bardziej efektywny niż Lisp. Tą efektywność Prolog bierze stąd, że sposobem programowania najbardziej przystaje do sposobu myślenia człowieka. Pragnę przypomnieć, że Prolog został opracowany przez zespół zajmujący się budową systemów przetwarzania języka naturalnego z wykorzystaniem sztucznej inteligencji. Bądź co bądź, Lisp też powstał w laboratoriach sztucznej inteligencji, ale 11 lat wcześniej niż Prolog. Ponadto Prolog został wybrany jako język inteligentnych komputerów V generacji.

Kompilatory języka Prolog

Istnieją efektywne kompilatory języka Prolog (tłumaczące na kod wykonawczy). Za przykład, mogę tu podać kompilator Turbo Prolog (TProlog) amerykańskiej firmy Borland, przy pomocy którego projektowałem systemy ekspertowe. Posiada on osiągi porównywalne z kompilatorem Turbo Pascal (TPascal). Turbo Pascal, z którego też korzystałem, był swego czasu najszybszym kompilatorem ze wszystkich kompilatorów istniejących na rynku. Tłumaczył on kod źródłowy bezpośrednio na wykonawczy. Skok z DOS-a do systemu Windows umożliwił równie rewelacyjny pakiet Delphi tej samej firmy, który również przez dłuższy czas służył mi przy moich pracach programistycznych. Z kompilatorem TProlog dostarczany był także interpreter, przy pomocy którego bezpośrednio można było przeprowadzać dialog z bazą wiedzy w ramach opracowanej aplikacji. Przy okazji muszę na łamach tego artykułu podziękować firmie Borland za umożliwienie mi wykonywania pracy dzięki jej produktom. Przede wszystkich dziękuję twórcom Turbo Pascala, Turbo Prologu i Delphi (Turbo Pascal 3 był programistycznym hitem, a Delphi 1 rewelacyjnym skokiem w technologii programowania).

Nie wiem, dlaczego firma Borland wycofała się z rozwijania kompilatora Turbo Prolog. Od któregoś z informatyków słyszałem, że język Prolog posłużył firmie Borland do opracowania pewnego metajęzyka, przy pomocy którego firma ta mogła w prosty sposób wyprodukować kompilator dowolnego języka programowania (Prolog świetnie nadaje się do takich celów). Ale czy to jest prawda, sam nie wiem. Tłumaczyłoby to jednak rezygnację z rozwijania tego kompilatora i skierowanie w ten sposób uwagi odbiorców ku innym produktom.

Przykład bardzo prostego programu w języku Prolog

  lubi(jan, wino).
  lubi(jan, tenis).
  lubi(jan, marta).
  lubi(marta, kwiaty).
  lubi(marta, pomarancze).
  lubi(marta, wino).

Program wydaje się naiwnie prosty. Przedstawia bazę wiedzy złożoną z 6 faktów. Jeżeli uruchomimy program i zadamy pytanie w postaci:

?- lubi(jan, X) and lubi(marta, X)

Otrzymamy odpowiedź:

X = wino

Na kolejne pytanie:

?- lubi(marta, jan)

Otrzymamy odpowiedź:

no

A na pytanie:

?- lubi(jan, tenis)

Otrzymamy odpowiedź:

yes

Wystarczyło napisać zaledwie kilka nie trudnych do zrozumienia wierszy, a już program wiele potrafi zdziałać. Który z języków, oprócz Prologu, to potrafi? Nie musimy przy tym skupiać się nad tym, jak to zrobić, aby uzyskać takie zachowanie się programu, lecz od razu przystępujemy do oceny sensowności otrzymanej z programu odpowiedzi.

Nie musimy też sprawdzać, czy mechanizm wnioskowania działa poprawnie czy nie, gdyż jest prawidłowy, lecz oceniamy sensowność zadanego pytania lub poprawność samej wiedzy w bazie. Na podstawie tego krótkiego programu, już widać potęgę Prologu.

Ktoś inny powiedziałby, że też potrafi, korzystając z gotowych bibliotek, szybko napisać program w języku C, który zachowa się podobnie, a ponadto modyfikować jego działanie.

Poprosiłbym go wtedy, aby uruchomił ten program napisany w C na równoległej maszynie Prologowej realizującej nienumeryczne przetwarzanie danych, w której zaimplementowano sprzętowe mechanizmy wnioskowania, a naturalnym językiem procesora tej maszyny jest Prolog.

Jak wynika z powyższego przykładu, programowanie w Prologu jest łatwe (bo takie musi być z samego podstawowego założenia, aby było lepsze dostosowanie procesu programowania do natury ludzkiego myślenia), ale łatwe nie oznacza mniej wartościowe. Dodatkowo daje od razu pełno satysfakcji przy testowaniu utworzonej aplikacji, stwarzając wrażenie jakbyśmy mieli kontakt z inteligentną maszyną, a tą inteligencję zapewnia wbudowany mechanizm wnioskowania, którego programista nie musi być świadom, z samej przyczyny, że go nie robił. Człowiek też posługuje się wnioskowaniem i dwustanową oceną rzeczy przy wyborze najbardziej optymalnego rozwiązania. Pomimo prostoty programowania Prolog należy do potężnego języka, o bardzo dużych możliwościach w zakresie, do którego został stworzony. Ponadto jest naturalnym językiem inteligentnego komputera V generacji.

Implementacja pracy równoległej w Prologu

Mocną stroną Prologu, nie spotykaną w innych językach programowania, jest możliwość implementacji technik pracy równoległej. Przykładem może być dialekt języka o nazwie Parlog do przetwarzania równoległego. Aby w pełni wykorzystać tą cechę należałoby uruchomić program napisany w Prologu na komputerze z faktycznym, równoległym przetwarzaniem. Do opracowania takiego komputera przeznaczono w latach osiemdziesiątych dwudziestego wieku prawie 1 miliard dolarów.

Z czego wynika ta niespotykana w innych językach programowania cecha? Otóż wynika z tego, że wykonanie programu, napisanego w Prologu, nie jest określone kolejnością zapisanych w kodzie programu instrukcji, funkcji czy procedur, czyli kolejnością wykonania czynności w programie, jak w przypadku innych języków, lecz wnioskowaniem, które może przebiegać w sposób równoległy w różnych odcinkach drzewa bazy wiedzy.

Maszyny wnioskujące a neurokomputery

Pracą równoległą cechują się także sztuczne sieci neuronowe, jak również sieć nerwowa człowieka. Ale czym się różni praca równoległa systemów opartych na Prologu (wnioskowaniu) od pracy równoległej sieci neuronowych? W Prologu praca równoległa odbywa się od razu w sieci symbolicznej, już na poziomie abstrakcji w sposób, jaki sami odczuwamy podczas operacji myślenia. Natomiast w sieciach neuronowych ta praca odbywa się w postaci równoległego rozpływu impulsów w sieci połączeń synaptycznych między neuronami (o wielkości połączenia określonej jego wagą), którą można porównać do pracy na poziomie języka maszynowego specjalnego komputera zwanego neurokomputerem. O jakiejkolwiek zdolności neurokomputera do abstrakcji (na wzór podobny do myślenia człowieka) możemy rozstrzygać dopiero na poziomie, oddzielonym sporą warstwą (warstwami) neuronów (sprawa analogiczna do właściwości kolejnych warstw oprogramowania tradycyjnego komputera).

Neurony na początku sieci mogą jedynie przetwarzać sporą ilość szczegółowej informacji, której ogólnej interpretacji nie znają i nie są w stanie poznać na tym poziomie. W poprzek warstw, neurony nabierają znaczenia w porządku hierarchicznym, od reprezentacji bardziej szczegółowej (jednomodalnej) do bardziej ogólnej w drodze integracji znaczenia szczegółowego (od szczegółowości do ogólności). Interpretacja symboliczna może pojawić się dopiero po przejściu przez ten cały gąszcz neuronów oraz połączeń synaptycznych między nimi.

Ujemną stroną sieci neuronowych jest ich nieprogramowalność. Zamiast tego mamy adaptacyjność w drodze uczenia sieci.

Pozytywną cechą sieci neuronowych jest niezwykła ich zdolność do rozpoznawania złożonych obiektów (o nieokreślonych regułach rozpoznawania) oraz możliwość rekonstrukcji pełnej informacji, na podstawie informacji częściowej i często obarczonej błędami. Posiadają także wytrzymałość na uszkodzenie części jej neuronów.

Ilość neuronów w neurokomputerach stworzonych przez człowieka liczona jest w milionach sztuk, a ilość połączeń między nimi jest tego samego rzędu. Natomiast w mózgu człowieka mamy do czynienia z ilością 105 milionów neuronów i 108 milionów połączeń między nimi. Widzimy tu, jak wielka przepaść istnieje w tej chwili pomiędzy możliwościami technologicznymi, a możliwościami biologicznymi, jakie daje natura.

W układzie nerwowym człowieka można znaleźć przykłady układów, będących nieco przybliżoną wersją funkcjonalną sztucznych sieci neuronowych. Typowym reprezentantem takich układów jest odcinek drogi nerwowej rozciągającej się od receptorów (odbierających bodźce zewnętrzne), a kończącej się na ośrodkach perceptywnych, w których pojawiają się percepcje wzrokowe, słuchowe, czuciowe. Pobudzanie tych ośrodków poprzez drogi kojarzeniowe, wywołuje wyobrażenia. Przykładem może tu być obszar wzrokowy kończący się w płacie potylicznym kory mózgowej, a nawet dalej w skraju płata skroniowego od strony potylicznej, gdzie znajdują się wyższe ośrodki układu wzrokowego. Układy te podobnie jak sztuczne sieci neuronowe posiadają własności równoległo-przestrzenne i ujmują informację całościowo i jednocześnie.

Jednakże w płacie skroniowych kory mózgowej człowieka, jego lewej półkuli mózgowej, znajdują się też obszary kory mózgowej, które cechują się wręcz odmiennymi właściwościami niż sztuczne sieci neuronowe, a mianowicie mają zdolność do używania sekwencyjności, analizy, symboliki, logiki (w tym wnioskowania), abstrakcji, syntaktyki i relacyjności, oceny faktów i działania, rozróżniania poszczególnych szczegółów z całości, formułowania myśli, percepcji czasu, wybiórczości, dosłowności, organizacji i planowania, ukierunkowania uwagi, kontroli nad słowem i pismem, przypisywania faktów i potrafią posługiwać się pamięcią sekwencyjną. Praca tych obszarów możne być z powodzeniem symulowana przez maszyny wnioskujące.

Rewizja poglądów

Możemy jednak przeprowadzić następujące rozważanie teoretyczne. Po co się wzorować na rozwiązaniach biologicznych, które dopiero wtedy wybierają inną alternatywę, kiedy wynika to z potrzeby przystosowania się i odbywa się to wówczas bardzo długo na drodze ewolucji. Możemy od razu odrzucić całą masę neuronalną, programowanie komputeraaby znaleźć się na poziomie abstrakcyjnym, bo skoro tworzymy coś sztucznego, nie musimy tu mieć ścisłego odwzorowania w naturze.

Po co się także zajmować kodem maszynowym (tradycyjnego komputera), którego wymyślenie było jedynie realizacją naszej wyobraźni twórczej, naszą dowolnością, pomysłem, a nie niezbędną koniecznością i wstawić, w miejsce niezrozumiałego dla człowieka języka rozkazów procesora, język symboliczny, przystający do zasad myślenia człowieka, np. Prolog, a dopiero wtedy dostosować do tego języka odpowiednią architekturę sprzętową nowego Procesora. Dzięki temu zamiast sprowadzać wszystko do przetwarzania numerycznego, można mieć do czynienia z przetwarzaniem nienumeracznym, symbolicznym, zrozumiałym dla każdego, a przetwarzanie numeryczne można pozostawić tradycyjnym komputerom.

Aby tego było mało, równoległą pracę np. neurokomputera, można zastąpić równoległym wnioskowaniem.

Dzięki tym zmianom można rozważać sprawy na wspólnym poziomie zarówno dla człowieka, jak i dla maszyny, przy bardzo wygodnej wymianie informacji człowiek-komputer (synteza i analiza mowy, systemy dialogowe w języku naturalnym, rozpoznawanie obrazów, itd).

Taki miej więcej jest sens przełomowego projektu FGCS wpieranego przez wielu naukowców i przez osiem wiodących firm, producentów elektroniki japońskiej.

Projekt FGCS

Po zebraniu odpowiedniego doświadczenia i wiedzy z zakresu Sztucznej Inteligencji, w roku 1979 rozpoczęto badania nad możliwością realizacji komputera V generacji, zorientowanego na nienumeryczne przetwarzanie danych i wyposażonego w sztuczną inteligencję. Patronat nad badaniami objęła Japonia. Efektem tych badań była decyzja budowy pierwszego modelu takiego komputera w ramach projektu FGCS (ang. Fifth-Generation Computer System). W celu realizacji tego projektu w roku 1982 powołano Instytut Komputerów Nowej Generacji (ang. Institute for New Generation Computer Technology).

Był to projekt na miarę przełomu w informatyce. Instytut Komputerów Nowej Generacji powstał przy wsparciu MITI - japońskiego Ministerstwa Przemysłu i Wymiany Międzynarodowej (ang. Ministry of International Trade and Industry) oraz ośmiu firm, wiodących producentów elektroniki w Japonii jak: Fujitsu, Toshiba, Mitsubishi, NEC, Oki, Sharp, Hitachi. Firmy te bardzo były zainteresowane efektami tych prac, bo oznaczałoby to dla nich rynek zbytu dla komputerów o nieznanych dotychczas możliwościach.

W projekcie określono następujące cele:

  1. Sprzętowa realizacja mechanizmów wnioskowania (łączenie faktów i zdobywanie doświadczenia przez maszynę).
  2. Sprzętowa i programowa realizacja mechanizmów wyszukiwania i zarządzania bazą wiedzy.
  3. Uzyskanie pełnej mocy realizowanych mechanizmów wymienionych w punktach 1 i 2 dzięki zastosowaniu Sztucznej Inteligencji oraz realizacja interfejsów zorientowanych na użytkownika (synteza i analiza mowy, rozpoznawanie obrazów, itp.
  4. Systemy ekspertowe (w tym systemy dialogowe).

Projekt realizowano w ramach osobnych grup tematycznych, które zajmowały się następującymi problemami:

  1. Maszyny wnioskujące i rozwiązywanie problemów (wybranie architektury sprzętowej odpowiedniej dla przeprowadzania wnioskowań logicznych i operacji na bazach wiedzy, a następnie budowa prototypu maszyny).
  2. Systemy zarządzania bazą wiedzy (zaprojektowanie języka bazującego na Prologu, odpowiedniego dla opracowanej reprezentacji bazy wiedzy i przeprowadzanych wnioskowań).
  3. Inteligentne interfejsy człowiek-maszyna.

Założono, że projektowane komputery powinny spełniać następujące możliwości:

  • umiejętność wnioskowania i uczenia się,
  • zdolność do zarządzania dużą bazą wiedzy w zakresie pozyskiwania, przetwarzania, generowania i przesyłania wiedzy,
  • zdolność do przetwarzania języka naturalnego i rozumienia ciągłej mowy ludzkiej,
  • zdolność do rozpoznawania i analizy obrazów na podstawie dużej bazy zapamiętanych obrazów.

Jak łatwo zauważyć podobne zadania wyznaczyła również komputerom Sztuczna Inteligencja. Tak więc komputery te powinny być w pełni inteligentne w rozumieniu Sztucznej Inteligencji. Ponieważ do ich realizacji potrzebna była bardzo duża moc obliczeniowa (z punktu widzenia przetwarzania symbolicznego), nie spotykana dotąd w komputerach, wybrano przetwarzanie całkowicie równoległe oparte na sterowaniu wnioskowaniem.

Szacowało się szybkość tych komputerów (w ilości wnioskowań na sekundę) na 100 milionów wnioskowań logicznych na sekundę Ustalono, że językiem maszynowym będzie równoległy Prolog, który ze względu na swoje cechy, był najlepiej stworzony do tego rodzaju komputera (wbudowany algorytm wnioskowania, możliwość zarządzania bazą wiedzy, możliwością realizacji technik równoległego przetwarzania).

Na realizację projektu przeznaczono sumę ok. 1 miliard. dolarów. komputer piątej generacjiPonieważ zamierzenia te miały już swoją podbudowę naukową oraz zgromadzone doświadczenia naukowców i z tego tytułu szansę na powodzenie, podobnymi projektami zajęto się też w innych krajach np. w USA i Wielkiej Brytanii.

O tym, że do projektów podchodzono na poważnie, świadczy chociażby kolejny budżet przeznaczony na realizację inteligentnego komputera w Wielkiej Brytanii w wysokości 350 milionów funtów.

Największą trudnością przy realizacji takich projektów była zwykła chęć uzyskania szybkich efektów końcowych, która blokowała takie przedsięwzięcia. Należy pamiętać, że uzyskanie efektu końcowego w postaci prototypu komputera o niespotykanej dotąd możliwości oznaczałoby dokonanie największego przełomu w historii ludzkości, znacznie przekraczającego samo wynalezienie komputera i przykrywającego inne największe odkrycia i osiągnięcia. Nie wiadomo nawet, czy ludzkość dorosła już do takiego poziomu techniki i czy potrafi ten poziom właściwie przyjąć i wykorzystać. Trudno nawet ogarnąć umysłem, jak wysoki skok cywilizacyjny, tym jednym osiągnięciem byłby dokonany. Istnieje nawet niebezpieczeństwo, że po tak gwałtownym skoku, samo przystosowanie człowieka pozostałoby daleko w tyle. Powstają pytania, czy człowiek już dojrzał do tego, czy nie wykorzysta w niewłaściwy sposób i czy jego psychika gotowa jest na to?

Przebija się też historyczne poczucie pewności, że wspomniany projekt komputera V generacji z 1982 r. w niedalekiej przyszłości stanie się praojcem działających już wtedy komputerów tej generacji, podobnie jak projekt maszyny różnicowej z 1822 r. lub maszyny analitycznej z 1833 r. pana Charles Babbage stał się praojcem dla komputera.

Waldemar Wietrzykowski
Computational Neuroscience
Digital Intelligence Laboratory
email: mail

Zobacz też

Linki

dil

<  1  2  3  4  5  6  7  8  9  10  11  12

Copyright  © 20.12.2007 net3plus  mail