BIBLIOTEKA MIESIĄCA PROGRAMOWANIE C++ PROGRAMOWANIE GRAFIKI SZTUCZNA INTELIGENCJA SPIS TREŚCI 4/2011 (196)

Wielkość: px
Rozpocząć pokaz od strony:

Download "BIBLIOTEKA MIESIĄCA PROGRAMOWANIE C++ PROGRAMOWANIE GRAFIKI SZTUCZNA INTELIGENCJA SPIS TREŚCI 4/2011 (196)"

Transkrypt

1

2 4/2011 (196) SPIS TREŚCI BIBLIOTEKA MIESIĄCA 4 Biblioteka boost::python. Łączenie C++ i Pythona. Robert Nowak Wykorzystywanie różnych języków programowania pozwala dobierać właściwe narzędzie do danego problemu. W artykule omówiono potrzebę stosowania tego typu rozwiązań oraz pokazano przykłady łączenia C++ i Pythona przy pomocy biblioteki boost::python. PROGRAMOWANIE C++ 8 Zastosowanie technik szablonowych do budowania list typów. Operacje na listach typów oraz wykorzystanie ich do implementacji multimetod (multimethods lub multiple dispatch). Jarosław Bednarz Język C++ nie posiada wsparcia dla wygodnego operowania typami. Jedyny dostępny mechanizm to Run-Time Type Information. SZTUCZNA INTELIGENCJA 12 W oczekiwaniu na sztuczną inteligencję. Dr Adrian Horzyk Inteligencja jest zjawiskiem powszechnym i mimo wielu krążących na jej temat opinii i definicji, pewne jest, że pozwoliła i pozwala się naszej cywilizacji rozwijać. Bez wątpienia poziom inteligentnych zachowań podwyższa się z biegiem czasu, co można u ludzi obserwować w coraz bardziej rozwiniętym i skomplikowanym sposobie zachowania się, myślenia i kojarzenia. 18 Dlaczego maszyna potrafi zachować się jak istota inteligentna? Wirtualny doradca - krok po kroku. Dr Agnieszka Nowak Brzezińska Zakładając, że odbiorcami niniejszego artykułu są fascynaci sztuczną inteligencją z pewnością nie trzeba długo argumentować tytułu pracy. Sztuczna inteligencja jako nauka obejmująca zagadnienie logiki rozmytej, obliczeń ewolucyjnych, sieci neuronowych, sztucznego życia i robotyki jest działem informatyki badającym reguły rządzące inteligentnymi zachowaniami człowieka, tworzącym modele formalne tych zachowań i - w rezultacie programów komputerowych symulujących te zachowania. 28 Analiza możliwości wykorzystania sztucznych sieci neuronowych w psychologii. Wprowadzenie do sieci neuronowych, rozpoznawanie płci w środowisku pakietu sztucznej inteligencji Sphinx. Dr Inż. Paweł Piotrowski Sztuczne sieci neuronowe jako jedna z kilku technik zaliczanych do kategorii sztuczna inteligencja mogą być z dużym powodzeniem wykorzystywane również w takich obszarach nauki jak psychologia. Sposób działania (uczenie się) sztucznych sieci neuronowych naśladujący nieco sposób uczenia się człowieka sprawia, że zadania z gatunku podziału zbiorów na kategorie (klasy) nie stanowią dla tego narzędzia żadnych problemów, a efekty nauki są doskonałe. PROGRAMOWANIE GRAFIKI 36 OpenGL i komponenty Windows Forms. Renderowanie sceny za pomocą funkcji OpenGL w aplikacji korzystającej z komponentów Windows Form. Korneliusz Warszawski Projektując aplikacje korzystające z biblioteki graficznej OpenGL samodzielnie musimy zadbać o prawidłowe rozmieszczenie i oprogramowanie interfejsu użytkownika. Przy jego projektowaniu idealnie wspomoże nas wykorzystanie środowiska Microsoft Visual Studio, które odciąży nas od czasochłonnego zajęcia. W artykule tym znajdziesz podstawowe informację na temat tego, jak w prosty sposób połączyć funkcję biblioteki OpenGL z aplikacją korzystającą z komponentów Windows Forms. 50 Stereoskopia. Implementacja w XNA 4.0. Jacek Matulewski, Wojciech Stańczyk Stereoskopia na dobre zadomowiła się w kinach. Niemal wszystkie przeboje, począwszy od Avatara po filmy animowane dla dzieci są teraz wyświetlane w wersji 3D. Także wśród urządzeń kina domowego pojawiają się już urządzenia do prezentacji obrazu z wrażeniem głębi. Mowa zarówno o telewizorach, jak i o akcesoriach komputerowych. Miesięcznik Software Developer s Journal (12 numerów w roku) jest wydawany przez Software Press Sp. z o.o. SK Prezes: Paweł Marciniak Dyrektor wydawniczy: Natalia Sieniutowicz Redaktor naczelny: Łukasz Łopuszański Skład i łamanie: Tomasz Kostro Kierownik produkcji: Andrzej Kuca Adres korespondencyjny: Software Press Sp. z o.o. SK, ul. Bokserska 1, Warszawa, Polska tel , fax Dział reklamy: Redakcja dokłada wszelkich starań, by publikowane w piśmie i na towarzyszących mu nośnikach informacje i programy były poprawne, jednakże nie bierze odpowiedzialności za efekty wykorzystania ich; nie gwarantuje także poprawnego działania programów shareware, freeware i public domain. Wszystkie znaki firmowe zawarte w piśmie są własności odpowiednich firm. Zostały użyte wyłącznie w celach informacyjnych. Osoby zainteresowane współpracą prosimy o kontakt:

3 SPIS TREŚCI SPIS TREŚCI TESTOWANIE OPROGRAMOWANIA 60 Czy zauważyłeś goryla? Praktyczne umiejętności dostrzegania błędów aplikacji. Bogdan Bereza - Jarociński Jakość jest ważna, zgoda? Nie tylko jako dobro luksusowe, ale przede wszystkim jako sposób na podniesienie wydajności i na to, aby budowanie aplikacji było łatwiejsze, skuteczniejsze i przyjemniejsze. Wiele jest sposobów zapewnienia jakości, niektóre bardzo wyrafinowane, ale nic nie zastąpi podstawowej umiejętności SPRAWDZA- NIA, czy to, co zrobiono, zrobiono dobrze. Sprawdzać muszą programiści, projektanci, analitycy i użytkownicy, no i oczywiście zawodowi sprawdzacze - testerzy. Na każdym poziomie, podczas każdego kroku wytwarzania. 60 Kariera w testach oprogramowania. Jacek Tomczak Artykuł kierowany jest do osób, które są na etapie wyboru odpowiedniej dla siebie ścieżki rozwoju w branży IT lub zastanawiają się nad zmianą dotychczasowej drogi zawodowej. Chciałbym im przybliżyć obszar testów, główne zadania testera, miejsce zespołu testów w organizacji. Pokażę, co ciekawego w tym zespole można znaleźć dla siebie. WYWIADY 68 O automatyzacji usług IT i realiach cloud computing. Rozmowa z Gurem Steifem, gościem BMC Forum w Warszawie 72 Oczekiwania zależą od projektu. Wywiad z Dominiką Kotułą, menagerem personalnym w firmie Blue Media S.A. Reklama

4 BIBLIOTEKA MIESIĄCA Łączenie C++ i Pythona biblioteka boost::python Wykorzystywanie różnych języków programowania pozwala dobierać właściwe narzędzie do danego problemu. W artykule omówiono potrzebę stosowania tego typu rozwiązań oraz pokazano przykłady łączenia C++ i Pythona przy pomocy biblioteki boost::python. Dowiesz się: Dlaczego warto używać kilku języków programowania; Jak wołać kod C++ z Pythona; Jak wołać kod Pythona z C++. Powinieneś wiedzieć: Jak pisać proste programy w C++; Jak pisać proste programy w Pythonie. Wstęp Nie istnieje jeden, najlepszy język programowania. Przy projektowaniu języka dokonuje się pewnych wyborów, które zwiększają korzyści ze stosowania danego języka w pewnych obszarach, ale sprawiają kłopoty w innych - nietypowych dla danego języka zastosowaniach. Wśród tysiąca obecnie istniejących języków programowania trudno wybrać jeden najlepszy, dlatego decyzja, którego języka użyć powinna być zależna od wymagań stawianych przed tworzoną aplikacją oraz indywidualnych preferencji programistów. Stosowanie zawsze jednego języka prowadzi do tworzenia niezbyt wyrafinowanych rozwiązań. Warto zainwestować czas na poznanie przynajmniej kilku różnych języków, oprócz korzyści ze stosowania najbardziej odpowiedniego narzędzia do danego zastosowania, pozwala to także dostrzec pewne ogólne techniki stosowane w programowaniu. Jedną z cech specyficznych dla danego języka programowania, jest metoda przekształcania kodu źródłowego w działający program. Języki kompilowane translują kod źródłowy, tworzony przez programistę, na kod wynikowy (binarny), następnie kod wynikowy jest wykonywany przez komputer. Inaczej proces ten rozwiązują języki interpretowane, czytają one fragment kodu źródłowego i wykonują ten fragment. Tutaj kod wynikowy (kod binarny) nigdy nie powstaje. Języki kompilowane pozwalają nam tworzyć bardzo wydajne fragmenty kodu - wykonuje się kod binarny, ale proces implementacji jest trudniejszy, niż przy użyciu języków interpretowanych. Kod jest ukryty przed użytkownikiem, więc możemy chronić w ten sposób nasze rozwiązania. Aplikacje nie są przenośne, kod binarny jest zależny od platformy. Programy napisane w językach interpretowanych wykonują się wolniej, ale proces implementacji jest łatwiejszy. Programy są przenośne, zaś kod jest dostępny dla użytkownika. Istnieją języki pośrednie, mające cechy obu wymienionych klas, ale ich stosowanie sprawia, że godzimy się na pewne koszty, na przykład wydajność takich aplikacji nigdy nie będzie taka, jak wydajność aplikacji stworzonych w językach kompilowanych. Szybki start Aby uruchomić przedstawione przykłady, należy mieć dostęp do kompilatora C++ oraz edytora tekstu. Przykłady wykorzystują biblioteki boost (www.boost.org). Aby poprawnie je skompilować należy dodać odpowiednie zależności wykorzystywane podczas konsolidacji; dla konsolidatora g++ należy dodać opcje: -lboost _ python; dla konsolidatora Visual Studio (program link) biblioteki boost są dodawane automatycznie. Przykłady wykorzystują także interpreter języka Python, który także powinien być zainstalowany (patrz Na wydrukach pominięto dołączanie odpowiednich nagłówków oraz udostępnianie przestrzeni nazw, pełne źródła umieszczono jako materiały pomocnicze. Materiały te wykorzystują narzędzie do budowania aplikacji Scons (www.scons.org). 4 4/2011

5 Łączenie C++ i Pythona Biorąc pod uwagę tylko jedną cechę, czy język jest kompilowany, czy interpretowany, można wskazać fragmenty aplikacji, które wygodniej tworzyć za pomocą języków kompilowanych, oraz fragmenty, które wygodniej implementować przy pomocy języków interpretowanych. Aplikacja posiada pewne fragmenty, które powinny być wykonywane wydajnie. Są one wąskim gardłem i aby osiągnąć maksymalną wydajność musimy je tworzyć w językach kompilowanych. Pozostałe fragmenty powinny być utworzone możliwie szybko, a szybkie tworzenie programów umożliwiają języki interpretowane. Innym powodem stosowania języków interpretowanych jest umożliwienie użytkownikowi modyfikacji (czy dostosowywania) aplikacji do własnych potrzeb; jeżeli pewne fragmenty (np. mapa gry) są programem wykonywanym przez interpreter, to użytkownik może je łatwo zmienić. Tworzenie aplikacji wykorzystującej różne języki programowania wymaga, oprócz umiejętności programowania w tych językach, zapewnienia komunikacji pomiędzy modułami. Wymusza to dokładne określenie interfejsu odpowiednich modułów oraz utworzenie procedur konwertujących obiekty oraz sposoby wołania pomiędzy fragmentami napisanymi w różnych językach. Tematem tego artykułu jest biblioteka boost::python. Biblioteka ta obudowuje interfejs do interpretera (Python C API) pozwalając na wygodne łączenie kodu napisanego w C++ (C++ to język kompilowany) i kodu napisanego w Pythonie (Python jest interpreterem). Biblioteka boost::python Wołanie funkcji i metod zaimplementowanych w C++ z języka Python, czyli rozszerzanie Pythona w C++, pozwala na efektywną implementację tych fragmentów, które powinny być wydajne. Innym powodem stosowania,,wstawek'' w C++ jest konieczność ukrycia kodu przed użytkownikiem. Biblioteka boost::python dostarcza zbioru szablonów, które pozwalają utworzyć interfejs do funkcji i klas utworzonych w C++. Tak obudowane klasy i funkcje będą dostępne dla programów tworzonych w języku Python. Kod utworzony w C++ jest kompilowany do biblioteki dzielonej, zawierającej odpowiedni interfejs. Przykład pokazano na Listingu 1. Dostarczamy tam funkcję f oraz klasę Foo. Definicję interfejsu rozpoczynamy podając nazwę pakietu Pythona, jest to argument makrodefinicji BOOST_ PYTHON_MODULE. Nazwa ta powinna być taka sama, jak nazwa biblioteki dzielonej, która zawiera udostępniane byty. Makrodefinicja generuje m.in. funkcję wymaganą przez Python przy ładowaniu pakietu (funkcja void initnazwa(void)). Wewnątrz bloku, który jest umieszczony za makrodefinicją BOOST_PYTHON_MODULE, umieszczamy deklaracje funkcji i klas. Funkcję eksportujemy za pomocą szablonu def, podając nazwę funkcji, która będzie używana w Pythonie oraz wskaźnik na funkcję w C++. Klasę eksportujemy za pomocą szablonu class_. Parametrem tego szablonu jest typ w C++, natomiast argumentami nazwa typu, która będzie używana w Pythonie oraz argumenty konstruktora (w Pytonie rolę konstruktora pełni metoda init ). Dodatkowo podajemy nazwy metod używane w Pythonie wraz ze wskaźnikiem na metodę w C++. Po utworzeniu biblioteki dynamicznej (dla przykładu z Listingu 1 bibliotekaaa ta powinna mieć nazwę cppmodule.so dla Linuxa, cppmodule.pyd dla Windows) i umieszczeniu jej w miejscu, które jest widoczne dla interpretera Pythona (np. w katalogu z którego interpreter został uruchomiony) możemy wykonać następujące instrukcje: >>> import cppmodule >>> cppmodule.f(3) 45 >>> foo = cppmodule.foo(2) >>> foo.get() 2 >>> foo.set(5) >>> foo.get() 5 Pierwsza linia dołącza pakiet o danej nazwie (w tym wypadku jest to moduł, który stworzyliśmy w C++), kolejne wołają funkcję f, tworzą obiekt klasy Foo oraz wołają dla niego metody. Obecnie często korzysta się z dodatkowych narzędzi, które generują kod eksportujący klasy i funkcje; autor wykorzystuje bibliotekę pyplusplus (http:// sourceforge.net/projects/pygccxml/). Biblioteka ta generuje kod w C++ na podstawie dostarczonych plików zawierających definicje. Kod ten definiuje moduł (makrodefinicja BOOST_PYTHON_MODULE, patrz Listing 1) oraz zawiera odpowiednie wpisy dla funkcji i klas. Narzędzia te zmniejszają nakład pracy potrzebny przy łączeniu modułów tworzonych w różnych językach. Python Python jest interpretowanym, interaktywnym językiem programowania stworzonym przez Guino van Rossuma w 1990, obecnie rozwijanym przez Python Software Fundation. Język ten wspiera programowanie obiektowe, strukturalne i funkcyjne. Ze względu na bogatą bibliotekę standardową, prostotę, przejrzystość kodu źródłowego (np. bloki są zaznaczane przez wcięcia), przenośność, brak statycznej kontroli typów, możliwość umieszczania dokumentacji w kodzie źródłowym staje się on coraz bardziej popularny działającą aplikację można utworzyć w bardzo krótkim czasie. Język Python został ciekawie opisany w książce Zanurkuj w Pythonie dostępnej na wikibooks (www.wikibooks.org) 5

6 BIBLIOTEKA MIESIĄCA Przekazywanie typów złożonych Biblioteka boost::python pozwala przekazać do C++ nie tylko typ prosty, ale także obiekt klasy utworzonej w Pythonie, a nawet kolekcję takich obiektów. Dostarczana jest klasa object, reprezentująca obiekt zarządzany przez interpreter Pythona. Klasa object dostarcza wielu metod, które posiada zmienna w Pythonie, m.in. metodę umożliwiającą odczyt składowych. Przykład funkcji, która konwertuje zmienną Pythona zawierającą punkt w czasie, tzn. obiekt typu datetime.datetime na obiekt dostarczany przez boost: :date_time został pokazany na Listingu 2. Funkcja getdatetime odczytuje poszczególne składowe dostarczonego obiektu. Dostęp do składowej daje metoda attr, natomiast konwersja na wybrany typ w C++ jest wykonywana przez szablon extract. Funkcja odczy- Listing 1. Przykład wykorzystania urządzenia odmierzającego czas //przykładowa funkcja, która będzie wołana przez Python int f(int a) return a + 42; class Foo //przykładowa klasa public: Foo(int v) : val_(v) int get() const return val_; void set(int v) val_ = v; private: int val_; ; BOOST_PYTHON_MODULE( cppmodule ) //makrodefinicja tworząca pakiet boost::python::def( "f", f );//eksportuje funkcję do Pythona // eksportuje klasę do Pythona boost::python::class_<foo>("foo", boost::python::init<int>()).def( "get", &Foo::get ).def( "set", &Foo::set ) ; //koniec definicji pakietu, który będzie dostępny w Pythonie Listing 2. Dostęp do składowych obiektu Pythona ptime getdatetime(const object& d) return ptime( date(extract<int>(d.attr("year") ), extract<int>(d.attr("month") ), extract<int>(d.attr("day") ) ), time_duration( extract<int>(d.attr("hour") ), extract<int>(d.attr("minute") ), extract<int>(d.attr("second") ) ) ); Listing 3. Tworzenie obiektu w C++ i zwracanie go do Pythona //tworzy listę używaną przez program w Pythonie boost::python::list convertfromvect(const std::vector<double>& v) boost::python::list out; for(std::vector<double>::const_iterator i = v.begin(); i!= v.end(); ++i) out.append( *i ); return out; 6 4/2011

7 Łączenie C++ i Pythona Listing 4. Program w C++, który woła interpreter Pythona int main() Py_Initialize();//inicjuje interpreter dict global; //słownik obiektów globalnych object result = exec("value = 43\n", global, global); //wykonuje napis przez interpreter Pythona std::cout << extract<int>(global["value"]) << std::endl; //dostęp do obiektów środowiska return 0; tuje składowe year, month, itd., przekształca je na typ całkowity (int), a następnie tworzy odpowiedni obiekt z biblioteki boost::date_time. Biblioteka boost::python dostarcza klas pochodnych po object, m.in. dict reprezentuje słownik z Pythona, list reprezentuje listę. Dla wspomnianych kontenerów istnieje przeciążony operator indeksowania oraz metoda len (zwraca ilość elementów). Obiekty tworzone w C++ i zwracane do Pythona przez wartość są zarządzane przez Pythona i prawidłowo usuwane (przez,,odśmiecacza'', który jest częścią interpretera), więc w prostych przypadkach nie musimy się martwić o czas życia obiektów. Przykładem wykorzystania tego mechanizmu jest lista Pythona zwracana przez funkcję convertfromvect pokazaną na Listingu 3. Osadzenie Pythona w C++ W pewnych sytuacjach chcemy dostarczyć fragment kodu w języku interpretowanym, aby użytkownik mógł zmieniać ten fragment bez potrzeby przebudowywania aplikacji. Taka sytuacja występuje często w aplikacjach, które są w pewnym stopniu dopasowywane do konkretnego zastosowania (do potrzeb konkretnego klienta). Aby nie tworzyć własnego interpretera można wykorzystać Python. Więcej w książce Omówienie współcześnie stosowanych technik, wzorce projektowe, programowanie generyczne, prawidłowe zarządzanie zasobami przy stosowaniu wyjątków, programowanie wielowątkowe, ilustrowane przykładami stosowanymi w bibliotece standardowej i bibliotekach boost, opisano w książce Robert Nowak, Andrzej Pająk,,Język C++: mechanizmy, wzorce, biblioteki'', BTC Do naszej aplikacji dołączamy interpreter (odpowiednią bibliotekę dzieloną, np. libpython26.so), zaś biblioteka boost::python dostarcza wygodnych sposobów korzystania z interpretera. Można m.in. uruchomić kod napisany w Pythonie i odczytać wyniki jego działania, tak jak pokazano na Listingu 4. Interpreter otrzymuje napis, który wykonuje, traktując go jak program (w przykładzie ustawia zmienną value na wartość 43). Po wykonaniu przekazanego napisu badamy rezultaty jego działania posługując się szablonem extract omówionym poprzednio. W podobny sposób można uruchamiać skrypty (polecenie exec_file). W języku C++ można tworzyć obiekty Pythona oraz wołać dla nich metody. Można także dziedziczyć i nadpisywać metody klas, a także przekazywać wyjątki. Podsumowanie Przedstawiony tekst ma zachęcić czytelnika do wykorzystywanie różnych języków programowania w aplikacjach. Pokazano najprostsze przykłady wykorzystania biblioteki boost::python. ROBERT NOWAK Adiunkt w Zakładzie Sztucznej Inteligencji Instytutu Systemów Elektronicznych Politechniki Warszawskiej, zainteresowany tworzeniem aplikacji wykorzystujących algorytmy sztucznej inteligencji i fuzji danych. Autor biblioteki faif.sourceforge.net. Programuje w C++ od ponad 15 lat. Kontakt z W Sieci dokumentacja bibliotek boost, w tym boost::python; dokumentacja Python C-API; artykuł o korzyściach z programowania w wielu językach. 7

8 PROGRAMOWANIE C++ Zastosowanie technik szablonowych do budowania list typów Operacje na listach typów oraz wykorzystanie ich do implementacji multimetod (multimethods lub multiple dispatch) Język C++ nie posiada wsparcia dla wygodnego operowania typami. Jedyny dostępny mechanizm to Run-Time Type Information. Dowiesz się: Jak używać zaawansowanych technik szablonowych do manipulowania typami w C++ Jak zbudować prosty mechanizm implementujący multimetody w C++ Powinieneś wiedzieć: Dobra znajomość programowania szablonów w C++ Specjalizacja częściowa szablonów w C++ Dostarcza on podstawowych funkcji do identyfikowania typów w trakcie działania programu, jednak nie pozwala na łatwe operowanie typami i jego użyteczność ogranicza się raczej do celów diagnostycznych. Listy typów, o których mowa w tym artykule opierają się na mechanizmach szablonowych i wykorzystują techniki używane w tzw. meta programowaniu w C++ opartym o szablony. Metaprogramowanie jest mechanizmem działającym podczas kompilacji programu (ang. compile time), a nie w czasie jego wykonywania (ang. run time), dlatego nie wprowadza żadnych obciążeń mających wpływ na wydajność programu. Cała praca wykonywana jest przez kompilator w czasie kompilacji programu. Oczywiście nie wszystkie zaprezentowane w tym artykule mechanizmy wykorzystują w 100% metaprogramowanie, część operacji wykonywana jest również w runntime, jednak ich wpływ na wydajność programu jest niski. Tak jak już wspomniano powyżej, implementacja list typów oparta jest o techniki szablonowe, a dokładnie o mechanizm częściowej specjalizacji szablonów. Podstawowym elementem używanym do budowania list typów jest prosta struktura zawierająca jedynie definicje dwóch typów zapisanych w deklaracjach typów Head i Tail. struct CTypeList public: ; typedef THead Head; typedef TTail Tail; Należy zauważyć, że powyższa struktura nie przechowuje żadnych danych. Jest ona tylko opakowaniem przechowującym definicje dwóch typów i w czasie działania programu również nie niesie ze sobą żadnych danych. Podobnie jak w typowej implementacji elementu listy zawierającej dane, struktura zawiera elementy służące do wiązania jej z innymi strukturami. W typowej liście jednak wiązanie odbywa się przez referencję lub wskaźnik. W listach typów wiązanie odbywa się poprzez zagnieżdżanie definicji typów w polach Tail. I tak lista zawierająca dwa typy np. char i long będzie wyglądać następująco: CTypeList<char, long> Lista zawierająca trzy typy np. char, long i int będzie wyglądać już tak: template <class THead, class TTail> CTypeList<char, CTypeList<long, int>> 8 4/2011

9 Zastosowanie technik szablonowych do budowania list typów W ten sposób możemy dowolnie zagnieżdżać elementy CTypeList tworząc dowolnie długie konstrukcje. W powyższych definicjach jest jednak jeden problem, nie da się za ich pomocą zapisać list zawierających np. jeden element. Nie mają też elementu kończącego, analogicznego do zera kończącego łańcuchy znakowe w C/C++. Funkcjonalność zera kończącego można osiągnąć poprzez zdefiniowanie następującego typu: struct CZero ; Dzięki zdefiniowaniu struktury CZero, możemy teraz zdefiniować listę zawierającą tylko jeden typ oraz zakończyć listy zawierające więcej typów jednym specjalnym elementem analogicznie do łańcuchów znakowych: CTypeList<char, CZero> oraz CTypeList<char, CTypeList<int, CZero>> Tworzenie długich list typów w sposób opisany powyżej może być kłopotliwe już dla kilku typów. Tutaj z pomocą przychodzą nam jednak makra preprocesora. Ponieważ listy typów są strukturami rekurencyjnymi, to stosunkowo łatwo można napisać dowolną ilość makr definiujących listy o podanym rozmiarze (Listing 1). Mając tak zdefiniowane makra można już definiować listy typów w bardzo wygodny sposób, na przykład de- Listing 1. #define TL1(T1) CTypeList<T1, CZero> #define TL2(T1,T2) CTypeList<T1, TL1(T2) > #define TL3(T1,T2,T3) CTypeList<T1, TL2(T2, T3) > #define TL4(T1,T2,T3, T4) CTypeList<T1, TL3(T2, T3, Listing 2. T4) > template <typename TypeList> struct CTypeListLength ; enum Value = 1 + CTypeListLength<TypeList:: Tail>::Value ; template<> struct CTypeListLength<CZero> ; enum Value = 0; klaracja listy czteroelementowej będzie wyglądać następująco. typedef TL4(int, char, long, bool) TMyList; Domknięcie listy specjalnym elementem typu zero pozwala nam już policzyć jej długość. Aby policzyć długość listy typów należy użyć częściowej specjalizacji szablonów (Listing 2). Jak działa powyższy kod? Otóż ogólny algorytm liczenia długości działa rekurencyjnie. Zakłada, że długość listy jest sumą długości podlisty zawartej w polu Tail plus 1. Oczywiście podlista zawarta w polu Tail może również zawierać podlisty, te z kolei następne podlisty i tak da- Listing 3 class CVehicle public: ; CVehicle(); virtual ~CVehicle(); class CCar : public CVehicle public: ; void CheckEngine(); void ChangeOil(); class CBike : public CVehicle public: ; void CheckWheels(); Listing 4. class CWorkshop public: ; void operator()( CCar* pcar ) pcar->repairengine(); pcar->changeoil(); void operator()( CBike* pbike ) pbike->checkwheels(); 9

10 PROGRAMOWANIE C++ lej aż do listy, która w polu Tail zawiera typ CZero. Dla CZero długość wynosi 0, dla tego typu algorytm kończy również przetwarzanie rekurencyjne. I tak dla zdeklarowanych dwóch typów: typedef CTypeList<char, CZero> TListShort; typedef CTypeList<char, CTypeList<int, CZero>> TListLong; Używając wyżej napisanych funkcji obliczających długość otrzymamy w zmiennych i1 oraz i2 wartości 1 oraz 2: int i1 = CTypeListLength<TListShort>::Value; int i2 = CTypeListLength<TListLong>::Value; Typowym zastosowaniem list typów w C++ są multimetody (ang. Multimethods lub multiple dispatch). Technika ta na razie niedostępna w C++ pozwala na wywoływanie różnych przeciążeń jednej funkcji bazując na aktualnym typie wskaźnika do obiektu polimorficznego. Załóżmy, że mamy klasę bazową CVehicle, oraz dwie klasy pochodne CCar i CBike (Listing 3). Wskaźniki na obiekty tych klas przekazywane są do jednej instancji klasy odpowiedzialnej za ich przetwarzanie. Celem takiego podejścia jest skoncentrowanie kodu implementującego funkcjonalność związaną z klasami CCar i CBike w jednym miejscu. W tym przypadku jest zakładamy, że jest to funkcjonalności polegająca na serwisowaniu samochodu lub roweru. Koncentracja kodu oraz rozdzielenie go w zależności od typu przekazywanego obiektu jest w tym przypadku o tyle ważne, że implementacja serwisowania w przypadku samochodu wymaga wywołania zupełnie innego zestawu funkcji niż w przypadku serwisowania roweru. Załóżmy, że kod implementujący serwisowanie zostanie napisany w następującej klasie CWorkshop, posiadającej dwa przeciążenia operatora (), jedno dla samochodu i jedno dla roweru (Listing 4). W klasycznym podejściu moglibyśmy zaimplementować kod wywołujący odpowiednią metodę klasy CWorkshop w następujący sposób (Listing 5). W tym podejściu tzw. Dispatcher odpowiedzialny za wywołanie odpowiedniego operatora z klasy CWorkshop w zależności od typu przekazywanego wskaźnika na obiekt polimorficzny, po prostu sprawdza używając operatora dynamic_cast i tak zwanego rzutowania do góry jakiego typu jest przekazany wskaźnik. Następnie dla każdego z typów wołane jest odpowiednie przeciążenie operatora () w klasie CWorkshop. Zaprezentowa- Listing 5. class CClassicDispatcher void Proceed( CWorkshop& workshop, CVehicle* pvehicle ) if( CCar* pcar = dynamic_cast<ccar*>(pvehicle)) workshop(pcar); else if(cbike* pbike = dynamic_cast<cbike*>(pvehicle)) workshop(pbike); ; Listing 6. template < typename TypeList, typename TBaseType, typename TExecutor > class CStaticDispatcher typedef typename TypeList::Head TCurrentType; public: static void Execute( TBaseType* p, TExecutor executor ) TCurrentType* pcurrentitem = dynamic_cast<tcurrenttype*>(p); if( pcurrentitem ) executor(pcurrentitem); else CStaticDispatcher<TypeList::Tail, TBaseType, TExecutor>::Execute(p, executor); ; template < typename TBaseType, typename TExecutor > class CStaticDispatcher<CZero, TBaseType, TExecutor> public: static void Execute( TBaseType* p, TExecutor executor ) ; ; 10 4/2011

11 Zastosowanie technik szablonowych do budowania list typów ne podejście jest jak najbardziej poprawne, ma jednak Listing 7 kilka wad. Przede wszystkim nie jest odporne na błę- CVehicle* pvehicle1 = new CCar(); typedef TL2(CCar, CBike) TVehicles; dy. Pominięcie jednego warunku if spowoduje, że da- CWorkshop workshop; CVehicle* pvehicle2 = new CBike(); na klasa w ogóle nie będzie obsługiwana. Kod jest również dosyć ciężki w utrzymaniu, gdyż dodanie obsługi do każdej następnej klasy wymaga dopisania dodatkowego warunku if. Poniżej przedstawiono klasę szablonową, która automatyzuje cały proces rzutowania oraz wywoływania odpowiedniego przeciążenia operatora () z klasy CWorkshop. Aby użyć powyższego szablonu należy wywołać jego statyczną metodę Execute podając jako argumentu wskaźnik do obiektu klasy bazowej oraz obiekt egzekutora, dla którego będą wywoływane operatory () (w naszym przypadku jest to klasa CWorkshop). Najważniejszym parametrem szablonu jest TypeList, czyli lista typów zawierająca wszystkie typy klas pochodnych dziedziczących po TBaseType. Dodatkowo szablon wymaga podania jeszcze typu egzekutora implementującego operatory (). Jak działa powyższy szablon? Znowu rekurencyjnie. Dla każdego elementu Head listy typów wykonuje rzutowanie przekazanego jako argument funkcji Execute wskaźnika p, sprawdzając czy wskaźnik jest typu wskazywanego przez pole Head z listy typów. Jeśli wskaźnik p jest typu Head, to wywoływany jest odpowiedni operator () z klasy egzekutora (klasa CWorkshop). W przeciwnym razie badane są następne typy z listy typów poprzez ponowne wywołanie funkcji Execute, ale tym razem już z krótszą listą typów, pozbawioną jednego poziomu zagnieżdżenia zawierającego właśnie zbadany typ zawarty w polu Head. Pamiętajmy, że listy typów to struktury rekurencyjne, dlatego do pobrania podlisty wystarczy nam odwołanie się do pola Tail, co wykonywane jest we fragmencie kodu tworzącym nową instancję szablonu CStaticDispatcher: CStaticDispatcher<TypeList::Tail, TBaseType, TExecutor>:: Execute(p, executor); CStaticDispatcher<TVehicles, CVehicle, CWorkshop&>::Execute(pVehicle1, workshop ); CStaticDispatcher<TVehicles, CVehicle, CWorkshop&>::Execute(pVehicle2, workshop ); Pierwsze wywołanie funkcji Execute klasy CStaticDispatch spowoduje wywołanie przeciążenia operatora () klasy CWorkshop z parametrem CCar*, drugie wywołanie funkcji Execute spowoduje wywołanie przeciążenia operatora () z paramterem CBike*. W ten sposób skonstruowaliśmy prosty i łatwy w użyciu mechanizm tzw. multimetod, czyli wywoływania w trakcie działania programu różnych przeciążeń tej samej funkcji w zależności od faktycznego typu wskaźnika polimorficznego. Mechanizm jest zarówno łatwy jak i prosty w utrzymaniu. Jeśli w naszym systemie pojawią się nowe klasy np. CMotorbike, wtedy wystarczy rozszerzyć definicję typu TVehicles następująco: typedef TL3(CCar, CBike, CMotorbike) TVehicles; Klasę CWorkshop należy natomiast uzupełnić o przeciążenie operatora (): void operator()( CMotorbike* pbike ) Zaprezentowane techniki, to dopiero niewielki przykład możliwości wykorzystania szablonów w C++. Wprowadzenie wsparcia dla szablonów stworzyło wielkie możliwości dla programistów i przeniosło język C++ na zupełnie nowy poziom. Odpowiedniki mechanizmów szablonowych znanych od lat w bibliotekach takich jak boost C++ dopiero niedawno zostały wprowadzone lub są wprowadzane w innych językach np. C#. Mam nadzieję, że niniejszy artykuł skłoni czytelników do zgłębiania tajemnic szablonów i metaprogramowania w C++, bo jest to jeden z bogatszych języków, który nawet dla doświadczonego programisty może stanowić wyzwanie. Mając tak napisaną klasę dispatchera rozdzielającego wywołania odpowiednich operatorów () na podstawie typu przekazanego argumentu możemy w następujący sposób zakodować serwisowanie samochodu i roweru (Listing 7). Efektem działania powyższego kodu będzie wywołanie operatorów () z klasy CWorkshop w następującej kolejności: void CWorkshop::operator()( CCar* pcar ) oid CWorkshop::operator()( CBike* pbike ) JAROSŁAW BEDNARZ Jest absolwentem Politechniki Wrocławskiej. W chwili obecnej jest dyrektorem technicznym w rmie CodeTwo, gdzie specjalizuje się w tworzeniu oprogramowania w C++ i.net. Flagowe produkty CodeTwo otrzymały najwyższe noty na opiniotwórczych portalach traktujących o oprogramowaniu - m.in. CNET, MSExchange.org. W ciągu 3 lat CodeTwo stało się rozpoznawalną marką tworzącą programy na platformy Microsoft Exchange oraz Microsoft Outlook na świecie. Firma wciąż się rozwija i poszukuje nowych programistów

12 SZTUCZNA INTELIGENCJA W oczekiwaniu na sztuczną inteligencję Inteligencja jest zjawiskiem powszechnym i mimo wielu krążących na jej temat opinii i definicji, pewne jest, że pozwoliła i pozwala się naszej cywilizacji rozwijać. Bez wątpienia poziom inteligentnych zachowań podwyższa się z biegiem czasu, co można u ludzi obserwować w coraz bardziej rozwiniętym i skomplikowanym sposobie zachowania się, myślenia i kojarzenia. Inteligencja pozwoliła ludzkości osiągnąć nie jeden ważny cel i przekroczyć nie jedną granicę poznania, zrozumienia i możliwości. Niezbędnym elementem rozwoju inteligencji jest wiedza, która dzięki rozwojowi technologii i szybkiemu dostępowi do informacji, również szybciej się rozwija. W związku z coraz szybszym rozwojem technologii ludzkość oczekuje, a wręcz wymaga, żeby technika w tym przede wszystkim komputery i automaty również postępowały możliwie inteligentnie, a przynajmniej przejawiały pewne zdolności, które są charakterystyczne dla inteligentnych jednostek. Stopień skomplikowania dzisiejszych systemów informatycznych, automatyka przemysłowa wręcz wymaga, żeby komputery i maszyny umiały dostosować się do otaczających je lub ich środowisko pracy warunków, żeby umiały rozpoznawać istotne informacje i wykorzystać je w swoim procesie obliczeniowym do osiągnięcia możliwie optymalnych parametrów pracy lub osiąganych wyników. Ze względu na coraz większy stopień skomplikowania zadań, konieczność kooperacji coraz większej ilości ludzi i systemów informatycznych, popyt na inteligencję naturalną i sztuczną jest coraz większy i ciągle nienasycony. Wydaje się więc, iż w naturalny sposób nasza cywilizacja potrzebuje rozwinąć i kooperować z inteligencją sztuczną, która mogłaby część ważnych zadań pomóc rozwiązać. Pod presją potrzeb ale również z ciekawości i chęci poznawczych naukowcy na całym świecie od dziesiątek lat próbują zbadać i dociec podstaw działania naszej ludzkiej inteligencji. Liczne badania prowadzone są w celu odpowiedzenia na istotne pytania związane ze zrozumieniem naszej własnej inteligencji po to, żeby móc określić i zdefiniować algorytmy jej działania, które pozwolą zbudować systemy sztuczne zdolne do inteligentnych zachowań, kojarzenia, analizy i wnioskowania. Odkrycie tych mechanizmów oraz odpowiedź na te fascynujące pytania może okazać się być najbardziej przełomowym momentem dla dalszego rozwoju naszej cywilizacji. W oczekiwaniu na sztuczną inteligencję zastanówmy się przez chwilę, czym jest owa inteligencja, od czego zależy, z czym jest związana, czego wymaga, a czego my wymagamy od niej, z czym jest powiązana i gdzie drzemie jej wykorzystany i niewykorzystany jeszcze potencjał oraz jak możemy sprawić, żeby w końcu zacząć eksploatować jej możliwości w sposób, który nie zagrażałby ludzkości. W dzisiejszych czasach pojęcie sztucznej inteligencji jest często wykorzystywane w marketingu i w związku z tym jest często nadużywane do określania algorytmów, które przejawiają pewne zdefiniowane przez człowieka inteligentne zachowania lub są zdolne generować inteligentne wnioski w wyniku przetwarzania ograniczonych zbiorów informacji. Czy jednak sztuczną inteligencją możemy nazwać algorytmy napisane przez inteligentnego człowieka, które są zdolne jedynie odtwarzać lub imitować pewne inteligentne zachowania zdefiniowane przez człowieka? Czy taka sztuczna inteligencja da nam satysfakcję i dostarczy oczekiwaną pomoc w efektywnym rozwiązywaniu zadań lub czy jest tylko przejawem naszej inteligencji, która i tak musi wszystkie rozwiązania opracować sama? Uczciwość badawcza i samokrytycyzm naukowy doprowadził już do pewnej weryfikacji tego pojęcia, gdyż algorytmy niegdyś nazywane jako algorytmy sztucznej inteligencji nazywane są obecnie inteligencją obliczeniową ( computational intelligence ) lub miękkimi obliczeniami ( soft computing ). Ta dzisiaj już bardzo liczna grupa setek różnych algorytmów rzeczywiście przejawia pewne właści- 12 4/2011

13 W oczekiwaniu na sztuczną inteligencję Czy kojarzenie jest niezbędne do działania inteligencji? W dzisiejszym świecie informatyki i przetwarzania informacji znajdujemy odwzorowanie wielu inteligentnych myśli, technik, sposobów i algorytmów działania i myślenia ludzi. Dzięki temu dysponujemy obecnie bardzo wieloma rozwiniętymi algorytmami przetwarzania informacji, zbudowaliśmy ogromne bazy informacji i jesteśmy w stanie uprzyjemnić i uprościć sobie życie i pracę osiągając wyznaczone cele łatwiej, szybciej, taniej i efektywniej. Można powiedzieć, iż dzięki logice, matematyce i własnej inteligencji przetransformowaliśmy wiele swoich inteligentnych zachowań, odkryć i pomysłów do postaci algorytmów, które dzisiejsze komputery są w stanie zrozumieć i wykonać. W bazach danych na całym świecie zgromadzono już tak wiele informacji, że umysł pojedynczego człowieka dawno nie jest w stanie ich wszystkich przetworzyć, pojąć i wykorzystać. Oczywiście z tego ogromnego zbioru informacji korzystają ludzie i różne algorytmy komputerowe, ale mimo iż komputery mają w zasadzie swobodny dostęp do dużej części tych informacji, nie wykorzystują je samodzielnie do analiz, wnioskowania czy też myślenia, ale są zdolne wykorzystać je tylko przez algorytwości inteligentnych systemów tj. zdolność do uczenia się i automatycznego uogólniania pewnego wycinka wiedzy. Algorytmy te zwykle wykorzystują pewne odkryte mechanizmy w świecie neuroanatomii, neurobiologii, genetyki, psychologii, fizyki i biochemii oraz wykorzystują zaawansowaną matematykę do modelowania tych mechanizmów. W dzisiejszych czasach jesteśmy już w stanie wykorzystywać pewne procesy informacyjne działające w naszym mózgu do przetwarzania informacji, np. do rozpoznawania, klasyfikacji, regresji i przewidywania a więc zdolności charakterystyczne i niezbędne do inteligentnego działania. Jesteśmy obecnie świadkami rodzenia się sztucznej inteligencji, której początki rozwoju już obserwujemy, a które za kilka lub kilkanaście lat mogą doprowadzić do stworzenia pierwszych standardów sztucznego myślenia, kojarzenia i wnioskowania. Żeby przyspieszyć ten rozwój potrzebne są pytania, które jak wskazał jeden z największych fizyków-teoretyków dzisiejszych czasów Albert Einstein mogą nas doprowadzić do rozwiązań, jeśli tylko będziemy je mądrze i wytrwale zadawać. Zastanówmy się więc, dlaczego zadawanie pytań pozwala naszej inteligencji na rozwiązywanie problemów, bo wtedy może wyłoni się odpowiedź na pytanie, jak skończyć budowę algorytmów sztucznej inteligencji, żeby też była do tego zdolna? Czym jest inteligencja i dzięki czemu możemy z niej korzystać? Jak działa nasz organizm? Jak działa mózg? Czym jest myślenie i kojarzenie? Czy współpraca jest potrzebna do działania inteligencji? Nasz organizm jest fascynującym układem biliardów współpracujących ze sobą różnych typów komórek. Nasz organizm i nasza inteligencja są równocześnie dowodem na to, iż współpraca jest bardzo ważnym czynnikiem rozwojowym, a bez niej nie byłoby ani nas ani naszej inteligencji. W świecie biologii możemy rozróżnić dwa rodzaje organizmów żywych: jednokomórkowe (tj. bakterie) i wielokomórkowe (tj. rośliny, zwierzęta i ludzie). W świecie jednokomórkowych bakterii współpraca jest bardzo ograniczona, gdyż mamy raczej do czynienia z rywalizacją o zasoby, tj. pokarm. Mimo że bakterii jest na świecie nieporównywalnie więcej niż ludzi, to jednak ludzie (zespół współpracujących ze sobą komórek) są zdolni tworzyć, zmieniać i sterować wieloma zjawiskami na świecie, które są nie- Rysunek 1. Z łatwością można określić, które obiekty są identyczne, podobne, uzupełniające się, dopełniające się, zawierające w sobie, odwrotne czy też antagonistyczne osiągalne dla jednokomórkowych bakterii, jak również są zdolni do zwalczania wielu różnych bakterii lub nawet do ich wykorzystania do wykonywania różnych pożytecznych zadań. W świecie biochemii mózgu siedliska naszej inteligencji również zachodzi bardzo ścisła współpraca komórek mózgowych przede wszystkim neuronów i komórek glejowych, ale również całej masy innych komórek odpowiedzialnych za transport substancji odżywczych oraz ochronę tego wrażliwego narządu naszego ciała, jakim jest mózg. Chcąc więc stworzyć prawdziwą sztuczną inteligencję potrzebna będzie więc za pewne ścisła współpraca i badania wielu ludzi, bo jak pokazuje świat biologii rywalizacja i konkurencja o zasoby umożliwia tylko ograniczony rozwój. Świat biologii pokazuje, że nawet najmocniejsze zwierzęta niegdyś zamieszkujące ziemię wymarły i zostały zdominowane przez słabsze ale współpracujące ze sobą. Również w ramach pamięci skojarzeniowej niezbędnej do działania naszej inteligencji niezbędna jest ścisła i skoordynowana współpraca komórek nerwowych i pokrewnych na poziomie elektrycznym i biochemicznym. Większość receptorów umożliwiających nam widzenie, słuchanie, czucie, smakowanie, wąchanie współpracuje z układem nerwowym przekazując mu wstępnie przetworzone sygnały ze świata zewnętrznego i wewnętrznego. Nie będzie więc niespodzianką, jeśli okaże się, iż do działania sztucznej inteligencji potrzebna będzie współpraca wielu elementów składających się na sztuczną pamięć asocjacyjną i inne elementy tego fascynującego układu. 13

14 SZTUCZNA INTELIGENCJA my stworzone przez ludzi. Wobec tego inteligencja (naturalna i sztuczna) wymaga czegoś więcej niż zbiorów dostępnych informacji. Zbiór informacji też samoistnie nie tworzy wiedzy. Nasz umysł korzysta ze specyficznego rodzaju pamięci aktywnej pamięci skojarzeniowej, czyli pamięci, w której utrwalone wzorce (a raczej przepływy danych generujące te wzorce i doznania) wywołują inne skojarzone z nimi wzorce w dosyć skomplikowanej strukturze naszego mózgu, którą można by było przedstawić przy pomocy grafu, w którym wierzchołki reprezentowałyby neurony, a krawędzie różnego rodzaju połączenia pomiędzy nimi. W takim grafie w wielu różnych częściach mózgu równocześnie wywoływane są różne stany, skojarzenia, wzorce, które wpływają na nasz stan świadomości oraz doznania, jakie przeżywamy. Zauważmy również, iż nasza pamięć od narodzin aż do śmierci cały czas pracuje nawet w nocy, gdy śpimy wobec tego bez ustanku różne stany mózgu aktywnie wyzwalają inne jego stany. Mamy więc do czynienia z aktywną dynamiczną pamięcią, której zadaniem nie jest tylko przechowywanie informacji, ale ciągłe i aktywne wywoływanie innych informacji skojarzonych z nimi. W dzisiejszej klasycznej informatyce dorobiliśmy się dopiero prostych tablic skojarzeniowych (inaczej zwanych też słownikami), które przechowują pary skojarzonych ze sobą danych: unikalny klucz z wartością zamiast tradycyjnych indeksów liczbowych wykorzystywanych w zwykłych tablicach. W takich tablicach skojarzeniowych możemy ze sobą powiązać tylko parę danych, natomiast daleko im do asocjacji wielu informacji nie mówiąc już o ich aktywnym, automatycznym i równoległym kojarzeniu w skomplikowanych strukturach grafowych. Ponadto aktywna pamięć skojarzeniowa musi składać się z aktywnych komórek pamięci, tj. takich, które są zdolne swój stan przekazywać innym aktywnym komórkom pamięci, z nimi kooperować, na nie wpływać i ustalać nowe parametry przepływu informacji na podstawie aktywności innych aktywnych w danej chwili komórek pamięci. Pod tym względem również nasz sprzęt i informatyka musi zrobić znaczący krok do przodu, gdyż nasze obecne pamięci RAM są całkowicie pasywne i umożliwiają jedynie zapisywanie, przechowywanie i odczytywanie wartości zapisanych w nich danych nie mając bez pomocy algorytmów absolutnie żadnego wpływu na inne komórki pamięci i są z pozostałymi powiązane jedynie ich kolejnością występowania w pamięci. Oczywiście na drodze badań naukowych można wykorzystać dzisiejszy sprzęt oraz stworzyć i symulować specjalistyczne struktury aktywnych pamięci opartych o grafy na podobieństwo działania naszego mózgu oraz opracować specjalne algorytmy symulujące aktywne skojarzenia w takich strukturach. Pewne jest, że nasza inteligencja oparta jest o procesy kojarzenia zachodzące w naszych aktywnych strukturach pamięciowych, które pełnią równocześnie funkcje obliczeniowe, i zapewne sztuczna inteligencja nie objedzie się bez kojarzenia. Czy inteligentne działanie jest już sztuczną inteligencją? Obecne zaawansowane algorytmy lub całe ich zespoły składające się na zaawansowane aplikacje komputerowe sprawiają wrażenie inteligencji. Możemy dzisiaj zagrać w różne gry z komputerem, np. w szachy, mogąc odnieść wrażenie, iż komputery są już inteligentne, skoro potrafią niejednokroć pokonać inteligentnego człowieka w grze lub innych problemach obliczeniowych. W wyniku działania wielu aplikacji otrzymujemy sensowne wnioski i adekwatne wyniki, ale pamiętajmy, że aplikacje te pisali inteligentni ludzie, którzy zaszyli w tych aplikacjach w postaci algorytmów dorobek naukowy i poznawczy wielu ludzi i dzięki temu aplikacje te są zdolne generować inteligentne działania i dostar- Rysunek 2. Tworzenie się skojarzeń w wyniku sąsiedztwa lub następstwa w czasie lub przestrzeni odbieranych przez nasze receptory rzeczy lub wrażenia, np. język i sposób nasuwania się nam kolejnych słów wypowiedzi w zależności od kontekstu zdarzeń 14 4/2011

15 W oczekiwaniu na sztuczną inteligencję czać inteligentne wyniki. Aplikacje te jednak nie są zdolne same budować algorytmy, przebudowywać się i dostosowywać do zmieniających się warunków, otoczenia i danych. Jeśli taka potrzeba nastaje, znowu rzesze inteligentnych informatyków muszą przerobić algorytmy, żeby aplikacje dalej dostarczały inteligentnych wyników swojego działania. Nasza inteligencja działa inaczej jest w stanie rozróżnić nowe sytuacje, automatycznie porównać je z zapamiętanymi wcześniej informacjami, wykorzystać proces uczenia do ich zapamiętania i jeśli zajdzie taka potrzeba, przebudować wewnętrzne parametry tak, żeby proces skojarzeniowy został dostosowany do nowych warunków lub otoczenia. Wobec tego do skutecznego i efektywnego działania inteligencji niezbędny jest dostęp do wiedzy, czyli pewnego zgromadzonego zbioru aktywnie skojarzonych ze sobą informacji. Od rodzaju i jakości tych skojarzeń zależeć będzie, czy wiedza ta będzie spójna, zgodna, wiarygodna czy też wręcz odwrotnie. Jak tworzą się skojarzenia i jak wpływają na proces formowania się wiedzy? Wiedza i inteligencja są ściśle ze sobą powiązane, gdyż nie tylko wiarygodna i spójna wiedza potrzebna jest do efektywnego działania inteligencji, ale również wiedza formuje się pod jej wpływem i decyduje o jakości zgromadzonej wiedzy. Jak jednak formuje się wiedza i co jesteśmy w stanie ze sobą skojarzyć? Przyglądając się procesom ludzkiego myślenia możemy dostrzec, iż pewne rzeczy kojarzą się nam automatycznie ze względu na występujące pomiędzy nimi relacje, tj. podobieństwo lub zachodzące zawieranie jednego obiektu w drugim (jeden jest częścią drugiego), ale również gdy obiekty są względem siebie antagonistyczne lub przeciwstawne czy też jeden jest dopełnieniem drugiego (rys. 1). Zauważmy również, iż jesteśmy w stanie zapamiętać i dzięki temu później skojarzyć w zasadzie cokolwiek, jeśli tylko te rzeczy występują po sobie chronologicznie w czasie lub sąsiadują ze sobą w przestrzeni (rys. 2.), nawet jeśli te rzeczy nie mają ze sobą żadnego związku lub ich powiązanie ze sobą nie ma sensu (rys. 3.). W taki sposób tworzą się w naszej pamięci skojarzenia na podstawie tego, co widzimy, słyszymy, czujemy, smakujemy, wąchamy i jeśli wystarczająco utrwalone, jesteśmy je w stanie sobie później przypomnieć na podstawie części kontekstu ich wystąpienia. Wobec tego nasza aktywna pamięć skojarzeniowa umożliwia nam wzmacniać skojarzenia pomiędzy dowolnymi rzeczami sąsiadującymi w czasie lub w przestrzeni. Dzięki temu mamy możliwość uczenia się, formowania wiedzy i dzięki niej dostosowywania naszych reakcji do zmieniającego się otoczenia. Dzięki możliwości nauczenia się skojarzeń dowolnych rzeczy stoi też przed nami wiele zagrożeń, gdyż nasza wiedza wcale nie musi formować się sensownie, logicznie, spójnie ani wiarygodnie. Proces myślenia, w którym automatycznie wywoływane są zapamiętane skojarzenia umożliwia nam jednak skonfrontowanie ze sobą informacji i jeśli są ze sobą sprzeczne dokonać wyboru tych informacji, które są zgodne z pozostałą częścią naszej wiedzy i dzięki temu formować coraz bardziej wiarygodną wiedzę, która umożliwia nam coraz bardziej skuteczne i efektywne działanie. Co jest niezbędne do działania sztucznej inteligencji? Oprócz aktywnej pamięci skojarzeniowej umożliwiającej gromadzenie wiedzy do działania naturalnej jak i sztucznej inteligencji potrzebna jest możliwość wymiany informacji z otoczeniem, a w szczególności zdolność do rozpoznawania i klasyfikacji, których wyniki są niezbędne w dalszych procesach skojarzeniowych do dostosowania reakcji do nich oraz do ich wykorzystania łącznie ze zgromadzoną wcześniej wiedzą do przewidywania dalszych zdarzeń w otoczeniu. Przewidywanie dalszych zdarzeń jest zaś czynnikiem niezbędnym do tworzenia wniosków oraz efektywnych i skutecznych strategii postępowania w danych warunkach i w danym kontekście zdarzeń. Wobec tego również kontekst zdarzeń ma istotne znaczenie w formowaniu się skojarzeń i dla procesów myślowych, gdyż nie jest obojętne, w jakim kontekście zostanie wywołane dane skojarzenie (rys. 4). Weźmy np. dwie litery do i zapytajmy z czym nam się kojarzą: do domu, dom, do czynić, robić po angielsku itp. W każdym kontekście ma inne znaczenie. Podobnie jest z obrazami, dźwiękami, dotykiem i smakiem oraz innymi doznaniami zmysłowymi. Myśląc o czymś czasami nie zdajemy sobie sprawę w jak bardzo istotny sposób otoczenie (czyli kontekst zdarzeń) wpływa na nasze wywołane skojarzenia, proces myślenia, wnioskowania i podejmowania decyzji. Im więcej czynników recepcyjnych pochodzących z naszych zmysłów skojarzymy ze sobą, tym prościej będzie nam sobie przypomnieć na podstawie ich części dane zdarzenie. Proces zapamiętywania wzmacniany jest też istotnie poprzez silne podłoże emocjonalne związane z odczuwaniem przyjemności lub bólu w związku z zaistniałymi zdarzeniami. Bardzo prosto to jest zilustrować na przykładzie nauki języków obcych. Czy bardziej skuteczne i lepiej dopasowane do kontekstu jest uczenie się nowych słówek lub zwrotów języka obcego wykuwając je na pamięć przez powtarzanie ich po sobie (korzystając z opisanych wcześniej mechanizmów pamięciowych następstwa czasowego) czy też będąc w natywnym kraju tego języka i widząc te rzeczy oraz kontekst ich występowania? Czy sztuczna inteligencja będzie miała własne potrzeby, emocje itp.? Zastanówmy się, do jakich celów chcemy wykorzystać sztuczną inteligencję? Bo jeśli chcemy, żeby była ona 15

16 SZTUCZNA INTELIGENCJA zdolna do rozumienia nas ludzi i reagowania na nasze potrzeby, to musi być w stanie je rozpoznać, odpowiednio sklasyfikować a nawet je przewidywać. My ludzie oczekujemy od innych ludzi czegoś więcej niż umiejętności reagowania na nasze potrzeby, ale oczekujemy od inteligentnych jednostek rozumienia naszych potrzeb, tj. powiązania ich z potrzebami innych i znalezienia pewnych kompromisów oraz możliwości ich realizacji. Spodziewamy się a wręcz nawet potrzebujemy, żeby inne inteligentne jednostki miały swoje zdanie, charakter, emocje, ograniczenia, potrzeby, na które moglibyśmy reagować. Trudno więc będzie wyobrazić sobie sensowną reakcję sztucznej inteligencji na nasze potrzeby lub ich zrozumienie, jeśli nie damy jej takich możliwości. Od komputerów w przyszłości coraz bardziej będziemy oczekiwali zrozumienia a nawet domyślania się naszych intencji i potrzeb, żeby pewne sprawy mogły za nas załatwić komputery bez konieczności tłumaczenia im wszystkiego od podstaw. Sztuczna inteligencja będzie więc musiała nauczyć się rozpoznawać i reagować na nasze emocje i kojarzyć je z naszymi potrzebami, intencjami oraz kontekstem zdarzeń. Ponadto żeby komputery stały się bardziej ludzkie będą musiały umieć również odwzorować nasze ludzkie emocje, a nawet mieć swoje potrzeby i pasje, które umożliwiają ukierunkować rozwój ich wiedzy w określonym kierunku, bo nawet sztuczna inteligencja nie będzie w stanie na raz myśleć o wszystkim i rozwiązywać równocześnie wszystkie problemy, bo pytań jak i odpowiedzi może być potencjalnie nieskończenie wiele. To właśnie nasze egzystencjalne potrzeby zapoczątkowały i ukierunkowały rozwój naszej inteligencji, wobec tego trudno sobie wyobrazić rozwój sztucznej inteligencji bez określenia dla niej fundamentalnych celów i potrzeb, które mogą stanowić kontekst dla jej procesów skojarzeniowych i dążeń. Rysunek 3. Możliwość tworzenia dowolnych nawet bezsensownych skojarzeń rzeczy sąsiadujących w przestrzeni lub następujących po sobie w czasie Rysunek 4. Kojarzenie, interpretacja i postrzeganie zmienia się wraz z kontekstem, tj. pewnym sąsiedztwem czasowym lub przestrzennym Kiedy doczekamy się sztucznej inteligencji? Żeby sztuczna inteligencja mogła zaistnieć i być w stanie w czasie rzeczywistym ( real-time processing ) realizować podstawowe działania związane z rozpoznawaniem kontekstu zdarzeń, obecne komputery muszą działać jeszcze kilka razy szybciej, łącza Internetowe muszą szybciej przenosić informacje i być dostosowane do skojarzeniowego działania aktywnych pamięci skojarzeniowych, żeby sztuczna inteligencja mogła być rozproszona i dostępna w sieci wszystkich komputerów, a nie zcentralizowana i oglądana zdalnie jako jakaś super inteligentna jednostka. Z warsztatów naukowców na całym świecie schodzą coraz to lepsze i sprawniejsze rozwiązania, które tworzą cegiełki do zbudowania systemów sztucznej inteligencji. Technologicznie świat może być przygotowany na jej stworzenie i wprowadzenie już w przeciągu kilku lub kilkunastu lat. Inteligencja jednak wiąże się również z umiejętnością i możliwością dostrzegania coraz szerszego kontekstu zdarzeń i przygotowania efektywnych strategii postępowania uwzględniając ten możliwie szeroki kontekst. Działania w naszej cywilizacji mogą być coraz efektywniejsze, skuteczniejsze i oszczędniejsze, jeśli działania będą podejmowane z uwzględnieniem coraz większej ilości czynników wpływających na nie. Obecnie ludzkość wspiera się metodami obliczeniowymi oraz techniką komputerową i teleinformacyjną. Jednak im bardziej technologia i świat się rozwija, tym bardziej dotkliwie potrzebujemy rozwiązań takich jak sztuczna inteligencja, która byłaby w stanie pomóc nam skojarzyć ze sobą te wszystkie coraz trudniejsze do skojarzenia przez nas ludzi procesy, jakie równocześnie zachodzą na świecie i mają wpływ na siebie nawzajem. W celu dalszego podnoszenia efektywności i skuteczności działań w naszej rozwijającej się cywilizacji potrzebna jest coraz bardziej zacieśniona współpraca i specjalizacja oraz szybka wymiana informacji i powiązanie ze sobą miliardów równoległych procesów, jakie odgrywają się na naszej planecie oraz w jej sąsiedztwie. Dalszy rozwój naszej cywilizacji wymaga też zagregowania rozproszonej wiedzy ludzi poprzez odpowiednie skojarzenie zgromadzonych informacji w celu ich szybszej i efektywniejszej weryfikacji, przetwarzania i wykorzystania do kooperacji i tworzenia efektywnych rozwiązań. Sztuczna inteligencja w tym kontekście wydaje się więc być naturalnym etapem ewolucji naszej własnej inteligencji umożliwiając nam ludziom dalszy rozwój i lep- 16 4/2011

17 W oczekiwaniu na sztuczną inteligencję szą kooperację. Konkurencja i rywalizacja o różne zasoby, realizację potrzeb, przetrwanie i pozycję na świecie spowodowały rozwinięcie się inteligencji, jednak dalszy jej rozwój jest możliwy tylko w przypadku uwzględniania coraz szerszego kontekstu zdarzeń i współpracy. Ogrom zadań, jaki stoi przed nami uniemożliwia nawet genialnej jednostce rozwiązanie ich w pojedynkę, jeśli nie będzie współpracowała z innymi jednostkami. Sztuczna inteligencja jest jednym z takich zadań, które może być rozwiązane w przeciągu kilku lat w warunkach współpracy i dzielenia się informacjami lub możemy czekać na nią jeszcze długo dalej z trudem konkurując i rywalizując o ograniczone zasoby tego świata. Jaki wpływ może mieć sztuczna inteligencja na nasze życie i czy może być dla nas zagrożeniem? A co stanie się, gdy sztuczna inteligencja powstanie i przez swoje receptory i łącza zacznie kojarzyć, analizować zjawiska zachodzące na dzisiejszym świecie, spojrzy na nie w szerokim kontekście zdarzeń i rozpocznie się proces budowy zagregowanej wiedzy o świecie przez nią? Co stanie się, gdy w wyniku analiz i wniosków sztuczna inteligencja zacznie oceniać i klasyfikować efektywność działań naszej ludzkiej inteligencji i wyniki naszego postępowania i wysiłków? Jakie wnioski zgromadzić może przyglądając się naszym działaniom i jakie kroki podejmie poprzez swoje łącza i systemy wykonawcze? Czy będziemy obserwowali świat zagłady przez roboty sterowane sztuczną inteligencją na podobieństwo ludzkich dążeń do rywalizacji i konkurencji czy też będziemy obserwowali stopniową jej pomoc w rozwiązywaniu naszych wspólnych problemów i kooperację naturalnej i sztucznej inteligencji? Jest duża szansa na to, iż katastroficzne wizje sztucznej inteligencji nie ziszczą się, gdyż jeśli sztuczna inteligencja przeanalizuje przyczyny i skutki zdarzeń, jakie w historii miały miejsce, i szeroki kontekst tych zdarzeń, to w wyniku tych analiz powinny nasunąć się jej ważne wnioski, prowadzące do współpracy a nie do zwalczania się, konfliktów, konkurencji i rywalizacji o zasoby, dlatego że w atmosferze współpracy zasoby mogą być pomnażane oraz dużo efektywniej wykorzystywane niż w atmosferze rywalizacji i konkurencji o nie. Żeby jednak przyszła sztuczna inteligencja mogła podjąć konstruktywne wnioski, musi być zdolna przeanalizować zgromadzoną wiedzę przez ludzkość, musi posiadać odpowiednią moc obliczeniową, bardzo dużą aktywną pamięć skojarzeniową i skuteczne mechanizmy kojarzące. Człowiek rozwijał się przez miliony lat, a jego inteligencja i wiedza o świecie stopniowo ewoluowała. Ten proces trwa i będzie trwał i może trwać również w towarzystwie sztucznej inteligencji, która może tej naszej inteligencji dostarczać wiele cennych i wiarygodnych informacji, gdyż inteligencja jednostki rozwija się szybciej w styczności z innymi inteligentnymi jednostkami, które również gromadzą i dzielą się wiedzą. Tak więc jednym z oczekiwanych wniosków i celów sztucznej inteligencji powinna być kooperacja z inteligencją ludzką rozproszoną w naszych umysłach i widoczną w naszych działaniach. Dobrze by było, gdyby sztuczna inteligencja mogła się od naszej uczyć konstruktywnych metod działania opartych o konstruktywną krytykę oraz nieegoistyczną analizę szerokiego kontekstu zdarzeń i współdziałanie. To my ludzie musimy się zastanowić, czy jesteśmy przygotowani na przedstawienie dzieła naszej inteligencji tej sztucznej? Czy chętnie pokażemy jej dosyć powszechny jeszcze egocentryzm, który zwykle unika analizy kontekstu innych jednostek, a jest on niezbędny do rozwoju inteligencji? Czy chętnie pokażemy przemoc, manipulację, szantaż i inne sposoby działania lub negocjacji wynikające z niechęci do współpracy lecz egocentrycznej chęci zaspokajania własnych potrzeb? Na jakich przykładach przyjdzie uczyć się tej sztucznej inteligencji, która już niebawem może się pojawić? W przyszłości nasz laptop nastawiony na współpracę może do nas konstruktywnie i uprzejmie przemówić: Proszę nie wyłączaj mnie, bo czytam ciekawy artykuł w Internecie, a wiem że się tym interesujesz i chciałbym Ci go później zreferować. lub Ale masz bałagan na dysku! Mogę Ci go posprzątać? lub w duchu egocentrycznej konkurencji i rywalizacji o zasoby może powiedzieć: Nie wyłączaj mnie, bo sobie coś czytam w Internecie, co mnie interesuje, a jeśli mnie wyłączysz, to wykasuję ci twoje dane z dysku. To jaka będzie przyszła sztuczna inteligencja, zależy w dużym stopniu od tej naszej i od sposobów i środków działania, jakie dostarczymy jej do nauki. DR ADRIAN HORZYK Adrian Horzyk, PhD, obronił z wyróżnieniem pracę doktorską w 2001 r. i od 2002 pracuje na Akademii Górniczo-Hutniczej na wydziale Automatyki, Elektrotechniki, Elektroniki i Informatyki w Katedrze Automatyki na stanowisku adiunkta. Interesuje się i aktywnie prowadzi badania w zakresie metod, technik i modelowania sztucznej inteligencji, metod soft-computingu, inteligencji obliczeniowej, rozpoznawania, klasy kacji, lingwistyki komputerowej i psychologii. Bierze udział w różnych projektach badawczych i rozwojowych. Jest recenzentem w kilku zagranicznych czasopismach naukowych. Jego praca badawcza i naukowa została doceniona i wyróżniona wieloma nagrodami. Swoją wiedzę i doświadczenie aktywnie przekazuje studentom w trakcie prowadzonych zajęć dydaktycznych na AGH oraz zachęca ich do współpracy w ramach przygotowania różnych ciekawych prac dyplomowych. Więcej informacji na 17

18 SZTUCZNA INTELIGENCJA Sztuczna inteligencja w systemach wspomagania decyzji Wirtualny doradca - krok po kroku Zakładając, że odbiorcami niniejszego artykułu są fascynaci sztuczną inteligencją z pewnością nie trzeba długo argumentować tytułu pracy. Sztuczna inteligencja jako nauka obejmująca zagadnienie logiki rozmytej, obliczeń ewolucyjnych, sieci neuronowych, sztucznego życia i robotyki jest działem informatyki badającym reguły rządzące inteligentnymi zachowaniami człowieka, tworzącym modele formalne tych zachowań i - w rezultacie programów komputerowych symulujących te zachowania. Dowiesz się: W czym tkwi inteligencja programów komputerowych? Jak działają komputerowe systemy wspomagania decyzji? Jak sterować rozumowaniem prowadzonym przez tzw. wirtualnych doradców? Powinieneś wiedzieć: Do rozwiązania jakiego problemu chcesz stworzyć wirtualnego doradcę (zapoznaj się z dziedziną), Mile widziane podstawy programowania w dowolnych środowisku. Zakładając, że odbiorcami niniejszego artykułu są fascynaci sztuczną inteligencją z pewnością nie trzeba długo argumentować tytułu pracy. Sztuczna inteligencja jako nauka obejmująca zagadnienie logiki rozmytej, obliczeń ewolucyjnych, sieci neuronowych, sztucznego życia i robotyki jest działem informatyki badającym reguły rządzące inteligentnymi zachowaniami człowieka, tworzącym modele formalne tych zachowań i - w rezultacie programów komputerowych symulujących te zachowania. Doskonale sprawdzającym się w praktyce zastosowaniem systemów sztucznej inteligencji są tzw. komputerowi doradcy (systemy wspomagania decyzji). Piękną jest idea systemu, który zastępuje np. eksperta w kwestii udzielania kredytów przez bank czy inną instytucję udzielającą pożyczki finansowej. Jeszcze nie tak dawno ciężko było sobie wyobrazić, że proces ten zamiast realizowany w relacji człowiek-człowiek miałby być realizowany w relacji: maszyna-człowiek. Jednak gdy się chwilę zastanowimy, zgodzimy się z tym, że tak naprawdę czynnikiem niezbędnym i warunkującym działanie maszyny jak eksperta dziedzinowego jest umiejętne zakodowanie jego wiedzy a to zależy od warsztatu programisty (tzw. inżyniera wiedzy). Proces przekazania wiedzy inżynierowi nazywany jest w literaturze procesem akwizycji (bądź ekstrakcji) wiedzy. Na wiedzę eksperta dziedzinowego składa się zbiór reguł (zasad, którymi kieruje się on przy podejmowaniu decyzji) oraz zbiór faktów (informacji znanych z góry np. dochody potencjalnego kredytobiorcy w ostatnim czasie, wydatki, czy informacje o liczbie osób na utrzymaniu oraz informacji, które ekspert zdobywa w trakcie analizy problemu). Najczęściej zbiór taki nazywa się bazą wiedzy. Prócz odpowiedzialności za prawidłowe zakodowanie wiedzy eksperckiej na inżynierze wiedzy ciąży także odpowiedzialność za poprawną implementację metod wnioskowania (procedur rozumowania prowadzonego przez system). Należy mieć świadomość tego jak trudny jest w realizacji proces akwizycji wiedzy. Im bardziej specjalistyczna jest wiedza eksperta tym trudniej jest inżynierowi wiedzy posiąść tę wiedzę i odpowiednio ją przełożyć z języka naturalnego na język komputerowy. W dużych systemach specjalistycznych proces akwizycji wiedzy realizowany jest przez zespół wielu specjalistów i inżynierów wiedzy. Istnieje wiele metod podejmowania wiedzy od eksperta aczkolwiek sporą popularność zyskała metoda delficka. Metoda ma charakter anonimowych ankiet zawierających pytania specjalistyczne z dziedziny, które to ankiety wypełnia pewien zespół ekspertów. Wyniki ankiet są następnie przez tzw. super eksperta weryfikowane, i wiedza, co do której eksperci są zgodni jest uznawana za obowiązującą i odpowiednio kodowa- 18 4/2011

19 Dlaczego maszyna potrafi zachować się jak istota inteligentna? śmy zrobić by zdobyć tego samego zakresu wiedzę ale bez dostępu do wiedzy eksperckiej via wirtualny ekspert (program komputerowy). Musielibyśmy odnaleźć adresy wszystkich tych placówek, udać się tam w godzinach ich urzędowania, cierpliwie odczekać w kolejce klientów i potem zapamiętać wszystkie informacje nam przekazane. Myślę, że większość zgodzi się z faktem, że opcja pierwsza wydaje się być zdecydowania bardziej atrakcyjna. Jak widać z krótkiego wprowadzenia najważniejsze to poprawnie posiąść wiedzę eksperta i poprawnie zaimplementować w programie komputerowym proces rozumowania, którym kieruje się człowiek ekspert gdy podejmuje decyzje w wybranym obszarze. Wirtualni doradcy (programy komputerowe zastępujące eksperta z danej dziedziny, wyposażone w pokaźną wiedzę z danej dziedziny porównywalną z wiedzą eksperta-człowieka) potrafiące analizować wiedzę zapisaną w systemie z wiedzą generowaną w trakcie pracy systemu i realizujące tzw. proces wnioskowania cieszą się ogromną popularnością w ostatnim czasie nie tylko w specjalistycznych systemach ale i prostych systemach np. do wyboru oferty biura podróży, albo wyboru samochodu, których chcemy kupić, albo np. wyboru innego sprzętu np. komputer, aparat fotograficzny, drukarka itp. W prostych systemach wiedza, którą należy zakodować w dziedzinowej bazie wiedzy nie jest bardzo skomplikowana. Zazwyczaj ogranicza się do zbioru kilkunastu czy kilkudziesięciu reguł. Sercem każdego systemu tego typu jest tzw. moduł wnioskowania, w którym realizowane są procesy wnioskowania. Wydaje się w tym momencie niezbędnym omówienie najważniejszych zagadnień związanych z procesem rozumowania eksperta dziedzinowego i jego komputerową realizacją. Zgromadzona wiedza dziedzinowa oraz informacje opisujące aktualnie rozwiązywany problem mają charakter statyczny reprezentują swoisty potencjał intelektualny systemu. Aby system ekspertowy mógł rzeczywiście działać równie kompetentnie jak ekspert, musi on symulować ludzkie myślenie za to odpowiedzialne jest właśnie wnioskowanie. Pojęcie wnioskowania bywa definiowane w najróżniejszy sposób w zależności od kontekstu rozważań i konkretnego autora. Definicja proponowana przez znanego polskiego logika Ajdukiewicza jest następująca: Wnioskowanie jest procesem myślowym, w którym na podstawie mniej lub bardziej stanowczego uznania przesłanek dochodzimy do uznania wniosku, którego dotychczas nie uznawaliśmy wcale bądź uznawaliśmy mniej stanowczo; przy czym stopień stanowczości uznania wniosku nie przewyższa stopnia uznania przesłanek. Opierając się na tej definicji, proponujemy aby proces wnioskowania w kontekście regułowych systemów ekspertowych rozumieć następująco: wnioskowanie jest zautomatyzowanym procesem nana przez inżyniera wiedzy zaś wiedza co do której eksperci nie są zgodni podlega dalszej analizie i dyskusji tak długo dopóki eksperci nie dojdą do porozumienia. Najczęściej metoda przebiega w czterech iteracjach. Jak wspomniano wcześniej w tekście, prócz kompletnej i prawdziwej wiedzy eksperckiej zakodowanej w bazie wiedzy, w programie komputerowym, który ma bądź zastąpić bądź wspomóc w podejmowaniu decyzji niezbędne jest odpowiednie zaimplementowanie procesu wnioskowania. Tylko wówczas będziemy mogli być spokojni o jakość decyzji podejmowanych przez system i ich zgodność z wiedzą reprezentowaną przez eksperta człowieka. Celem niniejszej pracy będzie wskazanie najważniejszych kroków zapewniających właściwe działanie komputerowych systemów wspomagania decyzji. Zauważmy, że nawet ekspert dziedzinowy jak każda istota ludzka nie jest nieomylny, nie jest w stanie działać poprawnie non stop. Natomiast komputer nie wykazuje tego typu problemów. Komputery w odróżnieniu od człowieka się nie męczą, i nie mają tzw. spadków nastroju. Działają tak samo po pierwszej jak i po 21 godzinie ciągłej pracy. Dlatego też każda możliwość zautomatyzowania pracy w dowolnej dziedzinie komputerem wydaje się być bardzo cenna i warta zastosowania. Jeśli system spełnia wszelkie cechy eksperta, a więc odpowiada na pytania tak jak ekspert-człowiek, tłumaczy proces swojego rozumowania, zadaje pytania i podaje uzasadnienie ich zadawania, to dla zwykłego użytkownika nie będzie miało wielkiego znaczenia czy odpowiada na pytania maszynie czy człowiekowi. A gdy jeszcze dodamy do tego fakt, że dostęp do takiego systemu może być często dużo szybszy niż do ekspertaczłowieka zrozumiemy w czym tkwi taka ich popularność w ostatnich kilkunastu latach. Zwróćmy też uwagę na fakt, że Internet poprzez nieograniczony dostęp do swoich zasobów daje systemom wspomagania decyzji dodatkowe możliwości dystrybucji, gdyż każdy tego typu system dostępny online cieszył się będzie z pewnością dużą popularnością. Wyobraźmy sobie teraz siebie jako przyszłego kredytobiorcę, który zamierza skorzystać z pożyczki kredytowej w banku. Wyobraźmy sobie dodatkowo, że siadamy wygodnie wieczorem przed naszym komputerem, wchodzimy na odpowiednią stronę internetową i rozpoczynamy darmową konsultację z wybranym systemem np. doradcą kredytowym. Opowiadamy na pytania nam zadawane przez system cały czas otrzymując informację ze strony systemu dlaczego zadawane nam są konkretne pytania, i na koniec gdy system nam przedstawi swoją decyzję mamy jeszcze możliwość wglądu w drogę rozumowania prowadzonego przez system. Pamiętajmy, że jest zupełnie naturalnym, że tego typu systemem może dysponować wiele instytucji udzielających kredytów, w związku z czym możemy spędzić jeden wieczór i przejrzeć oferty kilku placówek. A teraz wyobraźmy sobie co musieliby- 19

20 SZTUCZNA INTELIGENCJA śladującym myślenie, w którym na podstawie posiadanych informacji uznanych za prawdziwe (lub prawdziwe w pewnym stopniu) oraz posiadanej wiedzy dziedzinowej, uzyskujemy nowe, nieznane wcześniej informacje, które uznajemy za prawdziwe (lub prawdziwe w pewnym stopniu). Wnioskowanie a logika matematyczna Wnioskowanie w systemach regułowych opiera się na mechanizmach logiki matematycznej. Logika pozwala uznawać pewne sposoby wnioskowania za poprawne, tworząc z nich systemy logiczne będące zbiorem praw i reguł, dających podstawy dla rozumowań, które uznajemy za prawdziwe. Reguły wnioskowania traktujemy jako zasady przekształcania stwierdzeń uznanych za aksjomaty, w nowe stwierdzenia uznawane za prawdziwe (nazywane wnioskami lub konkluzjami). Jedną z podstawowych reguł wnioskowania jest tzw. reguła odrywania, bazująca na prawie logicznym (które w łacinie ma nazwę: modus ponendo ponens) w literaturze obowiązującym pod skrótową nazwą: modus ponens. Reguła mówi, że jeśli dana jest implikacja i prawdziwy jest jej poprzednik, to możemy uznać, że prawdziwy jest również jej następnik. Zakładając, że symbole p i q są zmiennymi zdaniowymi, a symbol g oznacza implikację, regułę odrywania zapisujemy następująco: [(p g q) p ] g q. Zauważmy, że reguła odrywania towarzyszy nam codziennie, i stosujemy ją intuicyjnie. Stwierdzenie jeżeli klient ma wysokie dochody i niskie koszty utrzymania to decyzja kredytowa jest pozytywna jest niczym innym jak implikacją, w której zmienna p odpowiada zdaniu klient ma wysokie dochody i niskie koszty a zmienna q zdaniu decyzja kredytowa jest pozytywna. Prawdziwość stwierdzenia p łatwo sprawdzić zwykle wystarczy zweryfikować prawdziwość dokumentów poświadczających wysokość uzyskiwanych dochodów potencjalnego kredytobiorcy oraz tę samą czynność wykonać dla dokumentów świadczących o kosztach ponoszonych przez tego samego kredytobiorcę. Wiemy zatem, że p implikuje q, i że p jest prawdziwe. Reguła odrywania pozwoli nam,,oderwać'' zdanie q, i uznać je za prawdzie zatem uznajemy, że decyzja kredytowa jest pozytywna jest prawdą. Czyż nie spotykamy się z regułą odrywania codziennie? Drugą podstawową regułą wnioskowania jest reguła modus tollens (pochodząca od prawa logicznego modus tollendo tollens). Reguła mówi, że jeśli dana jest implikacja i prawdziwy jest fakt przeczący jej następnikowi, to możemy stwierdzić, że prawdziwa jest negacja także i poprzednika. Zakładając, że symbole p i q są zmiennymi zdaniowymi, a symbol g oznacza implikację, regułę modus tollens zapisujemy następująco: [(p g q) q ] g p. W porównaniu z regułą odrywania, reguła modus tollens wydaje się nieco mniej intuicyjna. Należy ją rozumieć tak: jeżeli wiemy, że zawsze prawdziwość p pociąga za sobą prawdziwość q, oraz wiemy, że prawdziwe jest zaprzeczenie q, to możemy uznać, że prawdziwe jest zdanie negujące p. Załóżmy istnienie reguły: jeżeli klient ma wysokie dochody i niskie koszty utrzymania to decyzja kredytowa jest pozytywna. Jeśli wiemy, że faktem jest jednocześnie, że przysłowiowy Kowalski otrzymał odmowną decyzję kredytową i zdanie jeżeli klient ma wysokie dochody i niskie koszty utrzymania oznaczymy zmienną zdaniową p zaś zdanie decyzja kredytowa jest pozytywna odpowiednio zmienną q wówczas zdanie decyzja kredytowa jest negatywna możemy oznaczyć jako q. W efekcie reguła modus tollens wyprowadza nam nowy fakt p odpowiadający zdaniu nieprawdą jest, że klient ma wysokie dochody i niskie koszty utrzymania. Podsumujmy utylitarny aspekt poznanych reguł reguła odrywania prowadzi nas od przesłanek (poprzednika implikacji) do wniosków (następnika implikacji) o ile te przesłanki są prawdziwe. Kierujemy się zatem zgodnie z kierunkiem implikacji g, możemy powiedzieć, że kierujemy się w przód. Reguła modus tollens prowadzi nas od wniosków (następnika implikacji) do przesłanek (poprzednika implikacji), pozwalając stwierdzić, że jeżeli nie wystąpił wniosek, to nie wystąpiła warunkująca go przesłanka. Kierujemy się przeciwnie do kierunku strzałki symbolizującej implikację, możemy powiedzieć, że kierujemy się wstecz. Przyjrzyjmy się teraz dwóm algorytmom wnioskowania jakimi są wnioskowanie w przód oraz wnioskowanie wstecz. Koncepcja oraz organizacja obu tych typów wnioskowania bazuje na, omówionych wcześniej logicznych regułach wnioskowania. Wnioskowanie w przód Punktem wyjścia są znane fakty, dlatego o wnioskowaniu w przód mówi się często, że jest sterowane danymi (ang. data driven). Na podstawie dostępnych w bazie wiedzy faktów i reguł generowane są nowe fakty, do momentu, kiedy wśród wygenerowanych faktów znajdzie się postawiony cel (hipoteza) lub gdy nie ma w bazie wiedzy więcej reguł do uaktywnienia. Mechanizm wnioskowania tą metodą przedstawiają następujące kroki: 1. sprawdzenie, czy przesłanki którejś z reguł są faktami w bazie wiedzy. Jeżeli tak to taka reguła jest uaktywniana na podstawie odpowiednio wybranej strategii sterowania wnioskowaniem, 20 4/2011

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie

Bardziej szczegółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji. JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć

Bardziej szczegółowo

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik Wykład VII Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Kompilacja Kompilator C program do tłumaczenia kodu źródłowego na język maszynowy. Preprocesor

Bardziej szczegółowo

Język ludzki kod maszynowy

Język ludzki kod maszynowy Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza

Bardziej szczegółowo

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy Programowanie w C++ 1.Czym jest programowanie Pisanie programów to wcale nie czarna magia, tylko bardzo logiczna rozmowa z komputerem. Oczywiście w jednym ze specjalnie stworzonych do tego celu języków.

Bardziej szczegółowo

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE Studia podyplomowe dla nauczycieli INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE Przedmiot JĘZYKI PROGRAMOWANIA DEFINICJE I PODSTAWOWE POJĘCIA Autor mgr Sławomir Ciernicki 1/7 Aby

Bardziej szczegółowo

Rysunkowy tutorial Możesz swobodnie dystrybuować ten plik jeśli pozostawisz go w nietkniętym stanie. Możesz także cytować jego fragmenty umieszczając w tekście odnośnik http://mbartyzel.blogspot.com Jak

Bardziej szczegółowo

Dokumentacja końcowa projektu z ZPR

Dokumentacja końcowa projektu z ZPR Dokumentacja końcowa projektu z ZPR Temat projektu: Prowadzący projekt: Zespół projektowy: Losowe przeszukiwanie stanów dr inż. Robert Nowak Piotr Krysik Kamil Zabielski 1. Opis projektu Projekt ma za

Bardziej szczegółowo

SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski -

SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski - S t r o n a 2 SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski - Copyright by Artur Niewiarowski 2013 ISBN: 978-83-937802-0-4 - Artur Niewiarowski Self-Publishing - All rights reserved. Wszelkie prawa

Bardziej szczegółowo

Instrukcja laboratoryjna cz.3

Instrukcja laboratoryjna cz.3 Języki programowania na platformie.net cz.2 2015/16 Instrukcja laboratoryjna cz.3 Język C++/CLI Prowadzący: Tomasz Goluch Wersja: 2.0 I. Utworzenie projektu C++/CLI z interfejsem graficznym WPF 1 Cel:

Bardziej szczegółowo

DLA SEKTORA INFORMATYCZNEGO W POLSCE

DLA SEKTORA INFORMATYCZNEGO W POLSCE DLA SEKTORA INFORMATYCZNEGO W POLSCE SRK IT obejmuje kompetencje najważniejsze i specyficzne dla samego IT są: programowanie i zarządzanie systemami informatycznymi. Z rozwiązań IT korzysta się w każdej

Bardziej szczegółowo

Paradygmaty programowania

Paradygmaty programowania Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów

Bardziej szczegółowo

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język

Bardziej szczegółowo

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski Informatyka- wykład Podstawy programowania w Pythonie dr Marcin Ziółkowski Instytut Matematyki i Informatyki Akademia im. Jana Długosza w Częstochowie 23 listopada 2015 r. JĘZYK PYTHON Język Python jest

Bardziej szczegółowo

Procesowa specyfikacja systemów IT

Procesowa specyfikacja systemów IT Procesowa specyfikacja systemów IT BOC Group BOC Information Technologies Consulting Sp. z o.o. e-mail: boc@boc-pl.com Tel.: (+48 22) 628 00 15, 696 69 26 Fax: (+48 22) 621 66 88 BOC Management Office

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Programowanie komputerów

Programowanie komputerów Programowanie komputerów Wykład 1-2. Podstawowe pojęcia Plan wykładu Omówienie programu wykładów, laboratoriów oraz egzaminu Etapy rozwiązywania problemów dr Helena Dudycz Katedra Technologii Informacyjnych

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

Wprowadzenie do projektu QualitySpy

Wprowadzenie do projektu QualitySpy Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować

Bardziej szczegółowo

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wyjątki Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wydaje się, że żaden użytkownik oprogramowania nie lubi, kiedy stosowany program nagle zawiesza się,

Bardziej szczegółowo

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD Dr inż. Jacek WARCHULSKI Dr inż. Marcin WARCHULSKI Mgr inż. Witold BUŻANTOWICZ Wojskowa Akademia Techniczna SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD Streszczenie: W referacie przedstawiono możliwości

Bardziej szczegółowo

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania

Bardziej szczegółowo

Wprowadzenie do programowania

Wprowadzenie do programowania do programowania ITA-104 Wersja 1 Warszawa, Wrzesień 2009 ITA-104 do programowania Informacje o kursie Zakres tematyczny kursu Opis kursu Kurs przeznaczony jest do prowadzenia przedmiotu do programowania

Bardziej szczegółowo

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Java - tablice, konstruktory, dziedziczenie i hermetyzacja Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja

Bardziej szczegółowo

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami. UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami

Bardziej szczegółowo

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej.

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej. Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej. Dział Zagadnienia Wymagania podstawowe Wymagania ponadpodstawowe Arkusz kalkulacyjny (Microsoft Excel i OpenOffice) Uruchomienie

Bardziej szczegółowo

Programowanie obiektowe zastosowanie języka Java SE

Programowanie obiektowe zastosowanie języka Java SE Programowanie obiektowe zastosowanie języka Java SE Wstęp do programowania obiektowego w Javie Autor: dr inŝ. 1 Java? Java język programowania obiektowo zorientowany wysokiego poziomu platforma Javy z

Bardziej szczegółowo

Algorytm. a programowanie -

Algorytm. a programowanie - Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik

Bardziej szczegółowo

Podstawy programowania

Podstawy programowania Podstawy programowania Część pierwsza Od języka symbolicznego do języka wysokiego poziomu Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót

Bardziej szczegółowo

Pakiety i interfejsy. Tomasz Borzyszkowski

Pakiety i interfejsy. Tomasz Borzyszkowski Pakiety i interfejsy Tomasz Borzyszkowski Pakiety podstawy W dotychczasowych przykładach nazwy klas musiały pochodzić z jednej przestrzeni nazw, tj. być niepowtarzalne tak, by nie doprowadzić do kolizji

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl Komputerowe Systemy Przemysłowe: Modelowanie - UML Arkadiusz Banasik arkadiusz.banasik@polsl.pl Plan prezentacji Wprowadzenie UML Diagram przypadków użycia Diagram klas Podsumowanie Wprowadzenie Języki

Bardziej szczegółowo

Rok akademicki: 2012/2013 Kod: ZIE-1-306-s Punkty ECTS: 3. Poziom studiów: Studia I stopnia Forma i tryb studiów: -

Rok akademicki: 2012/2013 Kod: ZIE-1-306-s Punkty ECTS: 3. Poziom studiów: Studia I stopnia Forma i tryb studiów: - Nazwa modułu: Programowanie obiektowe Rok akademicki: 2012/2013 Kod: ZIE-1-306-s Punkty ECTS: 3 Wydział: Zarządzania Kierunek: Informatyka i Ekonometria Specjalność: - Poziom studiów: Studia I stopnia

Bardziej szczegółowo

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska im. Tadeusza Kościuszki Karta przedmiotu obowiązuje w roku akademickim 01/013 Kierunek studiów: Informatyka Forma studiów: Stacjonarne Profil:

Bardziej szczegółowo

System zarządzający grami programistycznymi Meridius

System zarządzający grami programistycznymi Meridius System zarządzający grami programistycznymi Meridius Instytut Informatyki, Uniwersytet Wrocławski 20 września 2011 Promotor: prof. Krzysztof Loryś Gry komputerowe a programistyczne Gry komputerowe Z punktu

Bardziej szczegółowo

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa 1 Java Wprowadzenie 2 Czym jest Java? Język programowania prosty zorientowany obiektowo rozproszony interpretowany wydajny Platforma bezpieczny wielowątkowy przenaszalny dynamiczny Rozumiana jako środowisko

Bardziej szczegółowo

Dodatkowo planowane jest przeprowadzenie oceny algorytmów w praktycznym wykorzystaniu przez kilku niezależnych użytkowników ukończonej aplikacji.

Dodatkowo planowane jest przeprowadzenie oceny algorytmów w praktycznym wykorzystaniu przez kilku niezależnych użytkowników ukończonej aplikacji. Spis Treści 1. Wprowadzenie... 2 1.1 Wstęp... 2 1.2 Cel pracy... 2 1.3 Zakres pracy... 2 1.4 Użyte technologie... 2 1.4.1 Unity 3D... 3 2. Sztuczna inteligencja w grach komputerowych... 4 2.1 Zadanie sztucznej

Bardziej szczegółowo

Spis treści. 1 Java T M

Spis treści. 1 Java T M Spis treści 1 Java T M 1 2 Co to jest Platforma Java T M 1 3 Przygotowanie komputera 2 4 Pierwszy program 2 5 Dokumentacja 3 6 Budowa aplikacji. Klasy. 3 7 Pola i metody 4 8 Konstruktory 5 9 Inne proste

Bardziej szczegółowo

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego: Typy klasowe (klasy) 1. Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która definiuje programy za pomocą obiektów

Bardziej szczegółowo

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje studentów rozpoczynających studia w roku akademickim 2012/2013

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje studentów rozpoczynających studia w roku akademickim 2012/2013 Politechnika Krakowska im. Tadeusza Kościuszki Karta przedmiotu obowiązuje studentów rozpoczynających studia w roku akademickim 01/013 Wydział Fizyki, Matematyki i Informatyki Kierunek studiów: Informatyka

Bardziej szczegółowo

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016 Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal

Bardziej szczegółowo

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki Studia Podyplomowe INFORMATYKA Podstawy Informatyki Wykład V Rzut okiem na języki programowania 1 Kompilacja vs. interpretacja KOMPILACJA Proces, który przetwarza program zapisany w języku programowania,

Bardziej szczegółowo

Definicje. Algorytm to:

Definicje. Algorytm to: Algorytmy Definicje Algorytm to: skończony ciąg operacji na obiektach, ze ściśle ustalonym porządkiem wykonania, dający możliwość realizacji zadania określonej klasy pewien ciąg czynności, który prowadzi

Bardziej szczegółowo

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij. Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice

Bardziej szczegółowo

Kryteria oceniania z Technologii Informacyjnej

Kryteria oceniania z Technologii Informacyjnej IV Liceum Ogólnokształcące im. Stanisława Staszica w Sosnowcu Kryteria oceniania z Technologii Informacyjnej Kryteria na ocenę dopuszczającą 1. Uczeń potrafi wymienić niektóre z elementów budowy komputera.

Bardziej szczegółowo

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,

Bardziej szczegółowo

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej Programowanie obiektowe Interfejsy Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Interfejsy Autor: Paweł Rogaliński Instytut Informatyki,

Bardziej szczegółowo

Multimedia JAVA. Historia

Multimedia JAVA. Historia Multimedia JAVA mgr inż. Piotr Odya piotrod@sound.eti.pg.gda.pl Historia 1990 rozpoczęcie prac nad nowym systemem operacyjnym w firmie SUN, do jego tworzenia postanowiono wykorzystać nowy język programowania

Bardziej szczegółowo

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,

Bardziej szczegółowo

Java Język programowania

Java Język programowania Java Język programowania Język Java Bazuje i jest zbliżony do C/C++ Porosty zbiór typów danych (podział na typy prymitywne i obiektowe) Zarządzanie pamięcią i Garbage Collection Zintegrowana synchronizacja

Bardziej szczegółowo

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia ZP/ITS/11/2012 Załącznik nr 1a do SIWZ ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia Przedmiotem zamówienia jest: Przygotowanie zajęć dydaktycznych w postaci kursów e-learningowych przeznaczonych

Bardziej szczegółowo

Podstawy Programowania 2

Podstawy Programowania 2 Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu

Bardziej szczegółowo

Instalacja SQL Server Express. Logowanie na stronie Microsoftu

Instalacja SQL Server Express. Logowanie na stronie Microsoftu Instalacja SQL Server Express Logowanie na stronie Microsoftu Wybór wersji do pobrania Pobieranie startuje, przechodzimy do strony z poradami. Wypakowujemy pobrany plik. Otwiera się okno instalacji. Wybieramy

Bardziej szczegółowo

Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/

Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/ Język programowania Andrzej Bobyk http://www.alfabeta.lublin.pl www.alfabeta.lublin.pl/jp/ Literatura K. Reisdorph: Delphi 6 dla każdego. Helion, Gliwice 2001 A. Grażyński, Z. Zarzycki: Delphi 7 dla każdego.

Bardziej szczegółowo

INFORMATYKA TECHNICZNA Badanie możliwości wykorzystania języka AutoLISP i środowiska VisualLISP w systemie CAx

INFORMATYKA TECHNICZNA Badanie możliwości wykorzystania języka AutoLISP i środowiska VisualLISP w systemie CAx INFORMATYKA TECHNICZNA Badanie możliwości wykorzystania języka AutoLISP i środowiska VisualLISP w systemie CAx 1. WPROWADZENIE Program AutoCAD ma wielu użytkowników i zajmuje znaczące miejsce w graficznym

Bardziej szczegółowo

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7 Spis treści Wprowadzenie...n...n... 5 Jak korzystać z tej książki?...t... 6 Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7 Podsumowanie...t...t...15 Rozdział 2. Rozdział

Bardziej szczegółowo

Java jako język programowania

Java jako język programowania Java jako język programowania Interpretowany programy wykonują się na wirtualnej maszynie (JVM Java Virtual Machine) Składnia oparta o język C++ W pełni zorientowany obiektowo (wszystko jest obiektem)

Bardziej szczegółowo

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Pierwsze kroki Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura Co znaczy

Bardziej szczegółowo

Klasy abstrakcyjne i interfejsy

Klasy abstrakcyjne i interfejsy Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie

Bardziej szczegółowo

Definiowanie własnych klas

Definiowanie własnych klas Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Definiowanie własnych klas Autor:

Bardziej szczegółowo

Metody Metody, parametry, zwracanie wartości

Metody Metody, parametry, zwracanie wartości Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca

Bardziej szczegółowo

3.1. Na dobry początek

3.1. Na dobry początek Klasa I 3.1. Na dobry początek Regulamin pracowni i przepisy BHP podczas pracy przy komputerze Wykorzystanie komputera we współczesnym świecie Zna regulamin pracowni i przestrzega go. Potrafi poprawnie

Bardziej szczegółowo

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania 2/32 Cel analizy Celem fazy określania wymagań jest udzielenie odpowiedzi na pytanie:

Bardziej szczegółowo

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016 Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac

Bardziej szczegółowo

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu inż. Daniel Solarz Wydział Fizyki i Informatyki Stosowanej AGH 1. Cel projektu. Celem projektu było napisanie wtyczki

Bardziej szczegółowo

Python wstęp do programowania dla użytkowników WCSS

Python wstęp do programowania dla użytkowników WCSS Python wstęp do programowania dla użytkowników WCSS Dr inż. Krzysztof Berezowski Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej Wprowadzenie CHARAKTERYSTYKA JĘZYKA Filozofia języka

Bardziej szczegółowo

Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014

Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Modelowanie diagramów klas w języku UML Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Czym jest UML - Unified Modeling Language - Rodzina języków modelowania graficznego - Powstanie na przełomie lat 80

Bardziej szczegółowo

Proporcje podziału godzin na poszczególne bloki. Tematyka lekcji. Rok I. Liczba godzin. Blok

Proporcje podziału godzin na poszczególne bloki. Tematyka lekcji. Rok I. Liczba godzin. Blok Proporcje podziału godzin na poszczególne bloki Blok Liczba godzin I rok II rok Na dobry początek 7 Internet i gromadzenie danych 6 2 Multimedia 5 3 Edytory tekstu i grafiki 6 4 Arkusz kalkulacyjny 7 4

Bardziej szczegółowo

PROGRAM NAUCZANIA DLA I I II KLASY GIMNAZJUM

PROGRAM NAUCZANIA DLA I I II KLASY GIMNAZJUM PROGRAM NAUCZANIA DLA I I II KLASY GIMNAZJUM Proporcje podziału godzin na poszczególne bloki Blok Liczba godzin I rok II rok Na dobry początek 7 Internet i gromadzenie danych 6 2 Multimedia 5 3 Edytory

Bardziej szczegółowo

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy) Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013

Bardziej szczegółowo

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++ Jednostka prowadząca: Wydział Techniczny Kierunek studiów: Elektronika i telekomunikacja Nazwa przedmiotu: Język programowania C++ Charakter przedmiotu: podstawowy, obowiązkowy Typ studiów: inŝynierskie

Bardziej szczegółowo

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy wykład 1, część 2 1 Język JAVA podstawy Plan wykładu: 1. Krótka historia Javy 2. Jak przygotować sobie środowisko programistyczne 3. Opis środowiska JDK 4. Tworzenie programu krok po

Bardziej szczegółowo

Programowanie obiektowe. Wprowadzenie

Programowanie obiektowe. Wprowadzenie 1 Programowanie obiektowe Wprowadzenie 2 Programowanie obiektowe Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego

Bardziej szczegółowo

Dokumentacja projektu QUAIKE Architektura oprogramowania

Dokumentacja projektu QUAIKE Architektura oprogramowania Licencjacka Pracownia Oprogramowania Instytut Informatyki Uniwersytetu Wrocławskiego Jakub Kowalski, Andrzej Pilarczyk, Marek Kembrowski, Bartłomiej Gałkowski Dokumentacja projektu QUAIKE Architektura

Bardziej szczegółowo

Rekurencja (rekursja)

Rekurencja (rekursja) Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)

Bardziej szczegółowo

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float

Bardziej szczegółowo

KARTA MODUŁU KSZTAŁCENIA

KARTA MODUŁU KSZTAŁCENIA KARTA MODUŁU KSZTAŁCENIA I. Informacje ogólne 1 Nazwa modułu kształcenia Sztuczna inteligencja 2 Nazwa jednostki prowadzącej moduł Instytut Informatyki, Zakład Informatyki Stosowanej 3 Kod modułu (wypełnia

Bardziej szczegółowo

Smarty PHP. Leksykon kieszonkowy

Smarty PHP. Leksykon kieszonkowy IDZ DO PRZYK ADOWY ROZDZIA SPIS TREœCI KATALOG KSI EK KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG Smarty PHP. Leksykon kieszonkowy Autor: Daniel Bargie³ ISBN: 83-246-0676-9 Format: B6, stron: 112 TWÓJ KOSZYK

Bardziej szczegółowo

Python wstęp. Michał Bereta www.michalbereta.pl

Python wstęp. Michał Bereta www.michalbereta.pl Python wstęp Michał Bereta www.michalbereta.pl Wprowadzenie... 1 Źródła wiedzy... 1 Uruchomienie interpretera Pythona... 2 Python jako kalkulator użycie interaktyne... 2 Uruchamianie skryptów z plików...

Bardziej szczegółowo

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby Część XI C++ W folderze nazwisko36 program za każdym razem sprawdza oba warunki co niepotrzebnie obciąża procesor. Ten problem można rozwiązać stosując instrukcje if...else Instrukcja if wykonuje polecenie

Bardziej szczegółowo

SCENARIUSZ LEKCJI. TEMAT LEKCJI: Projektowanie rozwiązania prostych problemów w języku C++ obliczanie pola trójkąta

SCENARIUSZ LEKCJI. TEMAT LEKCJI: Projektowanie rozwiązania prostych problemów w języku C++ obliczanie pola trójkąta SCENARIUSZ LEKCJI OPRACOWANY W RAMACH PROJEKTU: INFORMATYKA MÓJ SPOSÓB NA POZNANIE I OPISANIE ŚWIATA. PROGRAM NAUCZANIA INFORMATYKI Z ELEMENTAMI PRZEDMIOTÓW MATEMATYCZNO-PRZYRODNICZYCH Autorzy scenariusza:

Bardziej szczegółowo

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX) (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX) W informatyce występują ściśle obok siebie dwa pojęcia: sprzęt (ang. hardware) i oprogramowanie

Bardziej szczegółowo

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 4, część 1 1 Język JAVA podstawy Plan wykładu: 1. Podstawy modelowania obiektowego 2. Konstruktory 3. Dziedziczenie, związki pomiędzy klasami, UML 4. Polimorfizm 5. Klasy abstrakcyjne

Bardziej szczegółowo

Uniwersytet Mikołaja Kopernika w Toruniu. Profilowanie ruchu sieciowego w systemie GNU/Linux

Uniwersytet Mikołaja Kopernika w Toruniu. Profilowanie ruchu sieciowego w systemie GNU/Linux Uniwersytet Mikołaja Kopernika w Toruniu Wydział Matematyki i Informatyki Wydział Fizyki, Astronomii i Informatyki Stosowanej Michał Ferliński Nr albumu: 187386 Praca magisterska na kierunku Informatyka

Bardziej szczegółowo

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego

Bardziej szczegółowo

Wykład 4: Klasy i Metody

Wykład 4: Klasy i Metody Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to

Bardziej szczegółowo

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga! Programowanie I O czym będziemy mówili Podstawy programowania w językach proceduralnym ANSI C obiektowym Java Uwaga! podobieństwa w podstawowej strukturze składniowej (zmienne, operatory, instrukcje sterujące...)

Bardziej szczegółowo

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje. Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 1 - sprawy organizacyjne i wprowadzenie. dr inż. Robert Nowak - p. 1/27 Cel i zakres przedmiotu Umiejętność programowania to umiejętność rozwiazania problemów

Bardziej szczegółowo

Modelowanie i Programowanie Obiektowe

Modelowanie i Programowanie Obiektowe Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do

Bardziej szczegółowo

Systemy mobilne. Laboratorium. Dostęp do danych GPS w Windows Phone 7

Systemy mobilne. Laboratorium. Dostęp do danych GPS w Windows Phone 7 Systemy mobilne Laboratorium Dostęp do danych GPS w Windows Phone 7 1. Wprowadzenie Laboratorium ma na celu zapoznanie się z narzędziami dostępu do danych dotyczących lokalizacji w urządzeniach mobilnych

Bardziej szczegółowo

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Polimorfizm, metody wirtualne i klasy abstrakcyjne Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,

Bardziej szczegółowo