1. Podstawowe cechy paradygmatu programowania w logice:
deklaratywny styl programowania,
mechanizm wnioskowania, formuły Hornowskie,
środki kontroli nad wnioskowaniem/obliczeniem.
Mechanizm rezolucji dla klasycznego rachunku zdań.
2. Składnia logiki pierwszego rzędu. Uniwersum Herbranda.
Formuły Hornowskie.
Definicja spełniania dla formuł Hornowskich.
Unifikacja i rezolucja w logice pierwszego rzędu. Twierdzenie o istnieniu
najbardziej ogólnego unifikatora (MGU).
3. SLD rezolucja w logice pierwszego rzędu. Twierdzenie o pełności dla rezolucji i SLD rezolucji.
Twierdzenie o nierozstrzygalności SLD rezolucji.
Reprezentowanie wiedzy w Prologu.
Podstawy pracy z interpreterem Prologu (Swi-Prolog).
4. Znaczenie symboli '=' i '==' w Prologu. Kontrola nad przebiegiem wykonania programu: kolejność wyboru
klauzul do unifikacji, nawracanie, odcięcie (cut), wymuszenie nawrotu (fail).Sledzenie wykonania programu. Meta predykaty: clause/2, assert/1, retract/1.
5. Obsługa plików, programowanie wejścia i wyjścia.
Arytmetyka w Prologu. Znaczenie 'is' oraz '=:='.
6. Negacja w Prologu. Założenie o domkniętości świata (closed world assumption).
SLDNF rezolucja. Modele stabilne.
7. Reprezentowanie struktur rekurencyjnych: lista, drzewo.
Technika programowania z akumulatorem.
Listy różnicowe.
8. Wprowadzenie do rachunku lambda.
Interpretacje wartości logicznych, instrukcji
warunkowej, iloczynu kartezjańskiego w rachunku lambda.
Redukcje termów. Operator punktu stałego Y.
9. Arytmetyka w rachunku lambda.
Własności programowania funkcyjnego:
przejrzystość referencyjna, niezmienność danych, bezstanowość, brak efektów ubocznych,
funkcje jako podstawowe obiekty, rekursja, leniwa ewaluacja, typy,
polimorfizm, funkcje wyższych rzędów.
10. Wprowadzenie do języka Haskell.
Podstawy składni, konwencje nazewnicze i pierwsze programy.
Podstawowe typy: logiczny, znakowy, typy liczbowe.
Listy, pary, typy funkcji.
Operacje curry i uncurry.
Polimorfizm. Klasy typów.
Definiowanie typów.
11. Definiowanie funkcji: wyrażenia lambda, złożenie funkcji, rekursja, dopasowywanie wzorca.
Definiowanie funkcji przez równoległą rekursję.
Podstawowe operacje na listach.
12. Typy rekurencyjne. Definiowanie funkcji działających na typach
rekurencyjnych. Implementacja drzewa.
13. Kontynuacje i monady.
Problem obsługi wejścia i wyjścia w językach funkcyjnych, efekty uboczne, niepowtarzalność wyniku.
Typ IO. Obsługa plików.
14. Struktury nieskonczone w Haskellu.
15. Elementy programowania funkcyjnego w imperatywnych językach programowania.
Połączenie paradygmatów: funkcyjne programowanie w logice. Język Curry.
|