MIMINF:Wstęp do programowania (potok funkcyjny): Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 23: | Linia 23: | ||
** przykłady algorytmów i języków programowania w otaczającym nas Świecie, | ** przykłady algorytmów i języków programowania w otaczającym nas Świecie, | ||
** pojęcie dziedziny algorytmicznej. | ** pojęcie dziedziny algorytmicznej. | ||
* Podstawy języka programowania: | * Podstawy języka programowania: | ||
** sposób opisu składni języka programowania -- formalizm Backusa-Naura (wariant gramatyk bezkontekstowych dostosowany do praktycznych zastosowań), | ** sposób opisu składni języka programowania -- formalizm Backusa-Naura (wariant gramatyk bezkontekstowych dostosowany do praktycznych zastosowań), | ||
Linia 33: | Linia 34: | ||
*** rekurencja ogonowa, | *** rekurencja ogonowa, | ||
** definicje lokalne. | ** definicje lokalne. | ||
* Dekompozycja problemu, specyfikacja i weryfikacja programów funkcyjnych: | * Dekompozycja problemu, specyfikacja i weryfikacja programów funkcyjnych: | ||
** warunek początkowy i końcowy, | ** warunek początkowy i końcowy, | ||
** zasady dowodzenia poprawności, | ** zasady dowodzenia poprawności, | ||
** dowodzenie poprawności procedur rekurencyjnych: | ** dowodzenie poprawności procedur rekurencyjnych: | ||
*** | *** funkcja miary dla wywołań rekurencyjnych i własność stopu, | ||
*** | *** poprawność pełna i częściowa, | ||
** przykłady weryfikacji. | ** przykłady weryfikacji. | ||
* Typy danych: | * Typy danych: | ||
** proste typy wbudowane, | ** proste typy wbudowane, | ||
Linia 49: | Linia 52: | ||
** typy wariantowe (drzewa), | ** typy wariantowe (drzewa), | ||
** wyjątki. | ** wyjątki. | ||
* Budowanie abstrakcji za pomocą danych: | * Budowanie abstrakcji za pomocą danych: | ||
** . | ** konstruktory, selektory i modyfikatory, | ||
** bariery abstrakcji, | |||
** przykłady. | |||
* Procedury wyższych rzędów: | * Procedury wyższych rzędów: | ||
** przykłady, | ** przykłady, | ||
Linia 56: | Linia 63: | ||
** zastosowania procedur wyższych rzędów. | ** zastosowania procedur wyższych rzędów. | ||
* Model obliczeń programów funkcyjnych (uproszczona semantyka operacyjna): | |||
** Środowiska i ramki, | |||
** Semantyka definicji globalnych, | |||
** Reprezentacja danych i procedur, | |||
** Aplikacja procedur, | |||
** Rekurencja ogonowa, | |||
** Semantyka definicji lokalnych, | |||
** Odśmiecanie. | |||
* Analiza złożoności: | |||
** rzędy funkcji, | |||
** asymptotyczny koszt pesymistyczny, | |||
** koszt czasowy i pamięciowy, | |||
** koszt zamortyzowany | |||
** przykłady analizy kosztów algorytmów, | |||
* Metoda ''dziel i zwyciężaj'': | |||
** metoda inkrementacyjna, | |||
** podział binarny, | |||
** przykłady: różne algorytmy sortowania, | |||
** quick-sort -- przykład analizy kosztu oczekiwanego. | |||
* Moduły i funktory: | |||
** pojęcie modułu i enkapsulacji, | |||
** struktury, | |||
** sygnatury i zależności między strukturami i sygnaturami, | |||
** funktory, | |||
** funktory wyższych rzędów. | |||
* Konstrukcje imperatywne: | |||
** referencje, | |||
** tablice, | |||
** sekwencyjne złożenie instrukcji (<tt>;</tt>), | |||
** pętle, | |||
** przykłady ilustrujące charakter programowania imperatywnego i jego połączenie z programowaniem funkcyjnym. | |||
* Imperatywne wskaźnikowe struktury danych: | |||
** dwustronne kolejki ze scalaniem i odwracaniem, | |||
** drzewa find-union. | |||
* Dowodzenie poprawności programów imperatywnych: | |||
** logika Hoare'a, | |||
** niezmienniki pętli, | |||
** funkcja miary dla pętli <tt>while</tt> i własność stopu, | |||
** częściowa i pełna poprawność programów, | |||
** przykłady weryfikacji. | |||
* Przeszukiwanie przestrzeni rozwiązań: | |||
** przeszukiwanie z nawrotami (ang. ''back-tracking''): | |||
** obcinanie gałęzi przeszukiwania, | |||
** przykłady, w tym: | |||
*** problem ośmiu hetmanów, | |||
*** algorytm mini-max, | |||
*** <math>\alpha</math>-<math>\beta</math>-obcięcie, | |||
** inne sposoby przeszukiwania niż z nawrotami, | |||
** przykład -- drzewa and-or. | |||
* Technika spamiętywania: | |||
** struktury słownikowe i ich przykładowa implementacja, | |||
** spamiętywanie i uniwersalny spamiętywacz, | |||
** przykłady zastosowania. | |||
* Programowanie dynamiczne: | |||
** uogólnienie problemu i tablicowanie wyników, | |||
** przykłady zastosowania (z wykorzystaniem różnych struktur danych do tablicowania). | |||
* Programowanie zachłanne: | * Programowanie zachłanne: | ||
** algorytm | ** zasada programowania zachłannego, | ||
* | ** przykłady (w tym kody Huffmana). | ||
** | |||
** | Opcjonalne zaawansowane wykłady ("na deser"): | ||
** | |||
* Wyszukiwanie i algorytm Knutha-Morrisa-Pratta (KMP): | |||
** naiwny algorytm wyszukiwania wzorca, | |||
** algorytm KMP, | |||
** zastosowanie algorytmu KMP do wyszukiwania wzorców. | |||
* Procedury dużo wyższych rzędów: | |||
** odraczanie (uleniwianie) obliczeń, | |||
** proceduralna definicja różnych typów danych, | |||
** liczby naturalne Churcha. | |||
* Strumienie: | |||
** pojęcie strumienia, | |||
** implementacja strumieni, | |||
** procedury przekształcające strumienie, | |||
** przykłady strumieni, | |||
** definicje uwikładne strumieni, | |||
** przykłady. | |||
=== Literatura === | === Literatura === | ||
# | # H. Abelson, G. J. Sussman, ''Struktura i interpretacja programów komputerowych'', WNT 2002. | ||
# L. Banachowski, A.Kreczmar, ''Elementy analizy algorytmów'', | # L. Banachowski, A. Kreczmar, ''Elementy analizy algorytmów'', WNT 1987. | ||
# T.H.Cormen, Ch.E.Leiserson, R.L.Rivest, ''Wprowadzenie do algorytmiki'', | # T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, ''Wprowadzenie do algorytmiki'', WNT 2004. | ||
# | # M. Kubica, ''Wstęp do programowania i Metody programowania'', notatki do wykładów, [http://www.mimuw.edu.pl/~kubica/wpf/wpf.ps] | ||
# | # X. Leroy, ''The Objective Caml system'', [http://caml.inria.fr/pub/docs/manual-ocaml/index.html]. | ||
# | # W. Lipski, ''Kombinatoryka dla programistów'', WNT 2004. | ||
# N. Wirth, ''Algorytmy+Struktury danych=Programy'', WNT 2001. |
Aktualna wersja na dzień 14:58, 26 paź 2006
Forma zajęć
Wykład (60 godzin) + ćwiczenia (60 godzin) + laboratorium (30 godzin)
Opis
Jest to podstawowy przedmiot wprowadzający w dziedzinę informatyki. Poświęcony jest on głównie programowaniu i podstawom tworzenia algorytmów. Kurs obejmuje:
- podstawowe pojęcia, takie jak: algorytm, program, specyfikacja, weryfikacja,
- zasady projektowania i tworzenia algorytmów: zasady abstrakcji, dekompozycji problemów,
- podstawy wnioskowania o programach: weryfikacja programów, analiza złożoności programów,
- podstawowe struktury danych,
- techniki tworzenia algorytmów: dziel i zwyciężaj, programowanie zachłanne, dynamiczne i przeszukiwanie z nawrotami.
Całości towarzyszy nauka wybranego funkcyjnego języka programowania (Ocaml).
Sylabus
Autor
- Marcin Kubica — Uniwersytet Warszawski, Instytut Informatyki
Zawartość
- Pojęcie algorytmu:
- historia powstania pojęcia algorytmu,
- bliższe spojrzenie na przykładowy algorytm (rozwiązywanie równań kwadratowych metodą Al-Chuwarizmiego),
- przykłady algorytmów i języków programowania w otaczającym nas Świecie,
- pojęcie dziedziny algorytmicznej.
- Podstawy języka programowania:
- sposób opisu składni języka programowania -- formalizm Backusa-Naura (wariant gramatyk bezkontekstowych dostosowany do praktycznych zastosowań),
- przyrostowy tryb pracy kompilatora,
- wyrażenia i sposób ich obliczania,
- wartości logiczne i wyrażenia warunkowe if-then-else,
- definicje procedur:
- -abstrakcja,
- procedury rekurencyjne,
- rekurencja ogonowa,
- definicje lokalne.
- Dekompozycja problemu, specyfikacja i weryfikacja programów funkcyjnych:
- warunek początkowy i końcowy,
- zasady dowodzenia poprawności,
- dowodzenie poprawności procedur rekurencyjnych:
- funkcja miary dla wywołań rekurencyjnych i własność stopu,
- poprawność pełna i częściowa,
- przykłady weryfikacji.
- Typy danych:
- proste typy wbudowane,
- konstruktory i wzorce,
- produkty kartezjańskie,
- listy,
- deklaracje typów,
- rekordy,
- typy wariantowe (drzewa),
- wyjątki.
- Budowanie abstrakcji za pomocą danych:
- konstruktory, selektory i modyfikatory,
- bariery abstrakcji,
- przykłady.
- Procedury wyższych rzędów:
- przykłady,
- procedury wyższych rzędów i listy,
- zastosowania procedur wyższych rzędów.
- Model obliczeń programów funkcyjnych (uproszczona semantyka operacyjna):
- Środowiska i ramki,
- Semantyka definicji globalnych,
- Reprezentacja danych i procedur,
- Aplikacja procedur,
- Rekurencja ogonowa,
- Semantyka definicji lokalnych,
- Odśmiecanie.
- Analiza złożoności:
- rzędy funkcji,
- asymptotyczny koszt pesymistyczny,
- koszt czasowy i pamięciowy,
- koszt zamortyzowany
- przykłady analizy kosztów algorytmów,
- Metoda dziel i zwyciężaj:
- metoda inkrementacyjna,
- podział binarny,
- przykłady: różne algorytmy sortowania,
- quick-sort -- przykład analizy kosztu oczekiwanego.
- Moduły i funktory:
- pojęcie modułu i enkapsulacji,
- struktury,
- sygnatury i zależności między strukturami i sygnaturami,
- funktory,
- funktory wyższych rzędów.
- Konstrukcje imperatywne:
- referencje,
- tablice,
- sekwencyjne złożenie instrukcji (;),
- pętle,
- przykłady ilustrujące charakter programowania imperatywnego i jego połączenie z programowaniem funkcyjnym.
- Imperatywne wskaźnikowe struktury danych:
- dwustronne kolejki ze scalaniem i odwracaniem,
- drzewa find-union.
- Dowodzenie poprawności programów imperatywnych:
- logika Hoare'a,
- niezmienniki pętli,
- funkcja miary dla pętli while i własność stopu,
- częściowa i pełna poprawność programów,
- przykłady weryfikacji.
- Przeszukiwanie przestrzeni rozwiązań:
- przeszukiwanie z nawrotami (ang. back-tracking):
- obcinanie gałęzi przeszukiwania,
- przykłady, w tym:
- problem ośmiu hetmanów,
- algorytm mini-max,
- --obcięcie,
- inne sposoby przeszukiwania niż z nawrotami,
- przykład -- drzewa and-or.
- Technika spamiętywania:
- struktury słownikowe i ich przykładowa implementacja,
- spamiętywanie i uniwersalny spamiętywacz,
- przykłady zastosowania.
- Programowanie dynamiczne:
- uogólnienie problemu i tablicowanie wyników,
- przykłady zastosowania (z wykorzystaniem różnych struktur danych do tablicowania).
- Programowanie zachłanne:
- zasada programowania zachłannego,
- przykłady (w tym kody Huffmana).
Opcjonalne zaawansowane wykłady ("na deser"):
- Wyszukiwanie i algorytm Knutha-Morrisa-Pratta (KMP):
- naiwny algorytm wyszukiwania wzorca,
- algorytm KMP,
- zastosowanie algorytmu KMP do wyszukiwania wzorców.
- Procedury dużo wyższych rzędów:
- odraczanie (uleniwianie) obliczeń,
- proceduralna definicja różnych typów danych,
- liczby naturalne Churcha.
- Strumienie:
- pojęcie strumienia,
- implementacja strumieni,
- procedury przekształcające strumienie,
- przykłady strumieni,
- definicje uwikładne strumieni,
- przykłady.
Literatura
- H. Abelson, G. J. Sussman, Struktura i interpretacja programów komputerowych, WNT 2002.
- L. Banachowski, A. Kreczmar, Elementy analizy algorytmów, WNT 1987.
- T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, Wprowadzenie do algorytmiki, WNT 2004.
- M. Kubica, Wstęp do programowania i Metody programowania, notatki do wykładów, [1]
- X. Leroy, The Objective Caml system, [2].
- W. Lipski, Kombinatoryka dla programistów, WNT 2004.
- N. Wirth, Algorytmy+Struktury danych=Programy, WNT 2001.