MIMINF:Wstęp do programowania (potok funkcyjny): Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika) | |||
Linia 39: | Linia 39: | ||
** 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. | ||
Linia 99: | Linia 99: | ||
** przykłady ilustrujące charakter programowania imperatywnego i jego połączenie z programowaniem funkcyjnym. | ** 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.