Lab 12 - Przemysław Juszczuk
Transkrypt
Lab 12 - Przemysław Juszczuk
Języki programowania deklaratywnego dr Przemysław Juszczuk Katedra Inżynierii Wiedzy laborki 14 dr Przemysław Juszczuk Języki programowania deklaratywnego Języki deklaratywne Główne różnice między paradygmatem deklaratywnym a imperatywnym Omów główne cechy paradygmatu programowania w logice na przykładzie Prologa Główne zastosowania języka Prolog Co to jest obiekt w Prologu i czym się różni od obiektu w języku C (lub innym obiektowym) Termy w Prologu Klauzule i zapytania w Prologu Reguły w Prologu (omów na przykładzie) dr Przemysław Juszczuk Języki programowania deklaratywnego Języki deklaratywne Co to jest unifikacja w Prologu Omów spełnienie celu w Prologu Omów mechanizm rezolucji w Prologu Co to jest odcięcie i do czego można wykorzystać Omów rekurencję w Prologu (przedstaw przykład) Listy w Prologu Omów rekurencję na listach w Prologu (przedstaw przykład) Predykaty wbudowane w Prologu – wymień przykładowe i omów ich działanie Omów główne cechy paradygmatu funkcyjnego oraz wymień koncepcje języków funkcyjnych Co to są funkcje czyste Główne obszary zastosowań dla języków funkcyjnych dr Przemysław Juszczuk Języki programowania deklaratywnego Języki deklaratywne Jakie paradygmaty wspiera język F ] Listy w F ] Wyrażenia lambda w C ] Zapis wiedzy w systemie PC Shell (omów poszczególne bloki) Składnia reguł w systemie PC-Shell (omów na przykładzie) dr Przemysław Juszczuk Języki programowania deklaratywnego paradygmat deklaratywny a imperatywny padarygmat imperatywy - ciąg poleceń, czyli sekwencja instrukcji zmieniających pewien stan maszyny aż do osiągnięcia końcowego wyniku. Stan rozumiany jako zawartość pamięci i rejestrów modyfikowana w kolejnych krokach (instrukcje przypisania, operacje matematyczne, pętle a także możliwość przekazania sterowania do innego miejsca - instrukcja goto). Poszczególne instrukcje (w kodzie maszynowym) są poleceniami zmieniającymi stan maszyny. Imperatywne podejście to np. obiektowe, czy równoległe. Języki: Pascal, C, C++, Java, C ]. paradygmat deklaratywny - szczegółowy opis określonych warunków końcowych, które powinny być spełnione, żeby możliwe było uzyskanie rozwiązania. Mówimy raczej ćo chcemy otrzymać”, a nie ”jakie kroki należy wykonać”, zatem nie ma sekwencji instrukcji modyfikujących stan maszyny krok po kroku. Zatem podejście to polega na opisywaniu tego co nas interesuje a nie jak to zrobić. Istotny jest też determinizm - tzn. dla takiego samego zestawu danych i reguł wynik pozostaje niezmienny. Deklaratywne to programowanie funkcyjne i programowanie w logice. Języki: Lisp, Prolog, Haskell, F ] i SQL. dr Przemysław Juszczuk w logice Języki programowania deklaratywnego cechy paradygmatu programowania zastosowania języka Prolog systemy ekspertowe; automatyczne dowodzenie twierdzeń; symboliczne rozwiązywanie równań; przetwarzanie danych; przetwarzanie języka naturalnego. obiekt w Prologu a obiekt w języku imperatywnym obiekt w języku imperatywnym jest podobny do obiektu w świecie rzeczywistym - posiada pewne cechy oraz zachowanie (pola i metody). Stany przechowywane w zmiennych a zachowaniem sterują metody; obiekt w Prologu - definiujemy jaki jest (a nie z czego się składa i co można z nim zrobić). Opisujemy relacje, jakim podlega ten obiekt. Zatem przy pomocy programu mamy możliwość stawiania pytań. dr Przemysław Juszczuk Języki programowania deklaratywnego termy w Prologu stała; zmienna (symboliczne przedstawienie nazw obiektów, które są w danej chwili dane); struktura (term złożony). Termy złożone budowane są przy pomocy innych termów oraz funktorów (symboli funkcyjnych), np. f (T1 , T2 , ..., T3 ); Term złożony, to obiekt złożony z innych obiektów, czyli atomów, liczb, zmiennych a także innych termów złożonych. dr Przemysław Juszczuk Języki programowania deklaratywnego Klauzule i zapytania w Prologu Program w Prologu składa sie z klauzul i zapytań; Klauzule to fakty i reguły (kolejność klauzul pojawiających się w pliku źródłowym jest bardzo ważna); Zapytanie ma taką samą strukturę jak ciało reguły i tak jak ono kończy się kropką; Zapytania nie zawierające zmiennej to zapytania elementarne wysoki(jan, michal); Zapytania zawierające zmienną to zapytania nieelementarne wysoki(X, michal). Fakty: nazwa relacji znajdującej się przed nawiasem to predykat, natomiast obiekty wewnątrz nawiasów to argumenty. Reguły w Prologu i przykład reguły W języku prolog reguła składa się z głowy i treści, połączonych ze sobą znakami :- i zakończonych znakiem ”.”. Znak :- można traktować jako łącznik jeżeli. dr Przemysław Juszczuk Języki programowania deklaratywnego unifikacja w Prologu Unifikacja, czyli uzgadnianie - mechanizm pozwalający sprawdzić, czy dwa termy są identyczne lub mogą stać się identyczne w wyniku ukonkretnienia (czyli podstawienia odpowiednich wartości za zmienne). Kluczowe jest, aby podstawienie za zmienne było identyczne w całym wyrażeniu. zmienna anonimowa, może mieć inną wartość w różnych miejscach. spełnienie celu w Prologu Procesu mający na celu wykazanie, że istnieje ciąg podstawień i przekształceń pozwalający przypisać zapytaniu wartość logiczną prawda. Poszukiwanie takiego dowodu nazywane jest spełnianiem (obliczaniem) celu. Jeśli cel pasuje do głowy reguły, wówczas mają miejsce odpowiednie podstawienia wewnątrz reguły i tym samym otrzymujemy nowy cel, zastępujący niejako cel początkowy. Jeśli cel ten składa się z kilku predykatów, wówczas zostaje on podzielony na kilka podceli, przy czym każdy z nich traktujemy jak cel pierwotny. dr Przemysław Juszczuk Języki programowania deklaratywnego mechanizm rezolucji Definicja: Proces zastępowania wyrażenia przez inne wyrażenie. Algorytm: 1 Dopóki zapytanie nie jest puste Wybierz term z zapytania Znajdź fakt lub regułę uzgadniającą się z termem. Jeśli nie ma to zwróć fail w przeciwnym razie kontynuuj:Jeśli znaleziono fakt, usuń go z zapytania ; Jeśli znaleziono regułę, zastąp term ciałem reguły. 2 Zwróć success. odcięcie i do czego można wykorzystać Mechanizm odcięcia pozwala zaniechać nawracania przez Prolog do wcześniej dokonanych wyborów. Służy do sterowania nawracaniem i oznaczany jest jako wykrzyknik. Nie nawracamy do wcześniej dokonanych wyborów. Odcięcie jest zawsze spełnione. dr Przemysław Juszczuk Języki programowania deklaratywnego rekurencja w Prologu i przykład wywołanie wewnątrz funkcji samej siebie; każda definicja rekurencyjna musi posiadać przypadek bazowy, który pozwala nie odwoływać się funkcji do samej siebie (w przeciwnym wypadku nigdy się nie zakończy); przykłady to silnia, największy wspólny dzielnik,; w przypadku definicji używamy mechanizmu odcięcia (przykłady z ćwiczeń). dr Przemysław Juszczuk Języki programowania deklaratywnego listy w Prologu Lista jest uporządkowanym ciągiem elementów o dowolnej długości. Jako element listy może być użyty każdy prawidłowy term Prologu, tzn. atom, liczba, zmienna, term złożony w tym także inna lista. umieszczane w nawiasach kwadratowych; lista pusta; listy wewnątrz listy; Lista jest albo strukturą pustą albo strukturą z dwiema składowymi: głową i ogonem; specjalny operator rozdzielający listę na głowę i ogon (kreska pionowa). dr Przemysław Juszczuk Języki programowania deklaratywnego rekurencja na listach w Prologu i przykład przegląd listy (poszczególnych jej elementów) w taki sposób, aby w danym momencie analizować jeden element - rozdzielamy głowę i ogon; dodatkowe rozwiązanie bazowe nie zawierające wywołania rekurencyjnego; pisz([]). pisz([X |Y ]) : −print(X ), nl, pisz(Y ). predykaty wbudowane i przykład member (lista); reverse (lista); write; nl; read (jednoargumentowy predykat przypisujący argumentowi term wpisany z klawiatury); listing. dr Przemysław Juszczuk Języki programowania deklaratywnego cechy paradygmatu funkcyjnego oraz koncepcje języków funkcyjnych obliczenia są traktowane jako realizacja/ewaluacja funkcji (matematycznych) zamiast jawnej zmiany stanu i przekształcenia danych; funkcje czyste, leniwe wartościowanie, rekurencja, funkcje wyższego rzędu. funkcje czyste funkcja jest czysta, jeżeli nie posiada efektów ubocznych, czyli zmian stanu spowodowanych przez funkcję lub wyrażenie; modyfikacją stanu jest np. zmiana wartości zmiennej (dostęp do pamięci), czy zapis do pliku. w przypadku języka czysto funkcyjnego nie ma możliwości definiowania funkcji nieczystych (brak zmiennych). dr Przemysław Juszczuk Języki programowania deklaratywnego obszary zastosowań dla języków funkcyjnych matematyka finansowa; wyrażenia regularne i wyszukiwanie wzorców; budowanie struktur grafowych i działanie na takich strukturach; przetwarzanie danych. paradygmaty w języku F ] zalety paradygmatu funkcyjnego oraz paradygmatu obiektowego (podejście imperatywne); podejście funkcyjne - istotne jest, co ma być zrobione, a nie sposób, w jaki ma to być zrobione; programowanie obiektowe - dostęp do klas, instrukcji. dr Przemysław Juszczuk Języki programowania deklaratywnego listy w F ] lista jest podstawowym typem w języku - odpowiada tablicy w językach imperatywnych; w przeciwieństwie do np. PHP wszystkie jej elementy muszą mieć ten sam typ; lista pusta oznaczana jako [], połączenie dwóch elementów w listę :: wyrażenia lambda w C ] wyrażenie lambda to funkcja anonimowa (tworzenie delegatów); delegaty, czyli wskaźniki na funkcję (tworzymy delegat, który ma jeden parametr np. String i zwraca int; następnie tworzymy funkcję, która również otrzymuje String i zwraca int, a następnie do delegata przypisujemy tę funkcję); umożliwia tworzenie funkcji lokalnych przekazywanych jako argumenty funkcji lub zwracanych jako wartość funkcji. metoda Count z biblioteki Linq, która zlicza elementy spełniające podane wyrażenie lambda. Np. int ile = liczby .Count(n => n%2 == 1). dr Przemysław Juszczuk Języki programowania deklaratywnego Zapis wiedzy w systemie PC Shell Deklaratywna reprezentacja wiedzy w formie reguł i faktów ( w przeciwieństwie do predykatów w Prologu). Reprezentacja wiedzy w formie zwartych bloków oraz pełne rozdzielenie wiedzy eksperta od procedur sterowania. Wiedza ekspercka może być zawarta w kilku źródłach jednocześnie (bazy wiedzy, sieci neuronowe). sources - źródła danych dla bazy (bazy danych, bazy wiedzy, aplikacje bazujące na sieciach neuronowych); facets - zbiór deklaracji dotyczących wybranych atrybutów (wszystkie atrybuty używane w bazie); facts - informacje dodatkowe (stałe, lub będące parametrami dla bazy wiedzy - blok nie jest wymagany); rules - każda reguła w tym bloku składa się części warunkowej oraz konkluzji; control - blok sterujący programu (deklaracje zmiennych oraz instrukcje do wykonania). dr Przemysław Juszczuk Języki programowania deklaratywnego Składnia reguł w systemie PC-Shell całość wiedzy jest kodowana za pomocą reguł i faktów. podstawową strukturą reprezentacji wiedzy jest tu trójka: obiekt-atrybut-wartość. przykład reguły (przesłanki, czyli elementy, które muszą być spełnone, żeby konkluzja reguły dopisana została bo bazy faktów); reguła może zostać uruchomiona tylko, jeżeli wszystkie jej przesłanki są faktami; wnioskowanie w przód oraz wnioskowaniw w tył - jaka jest różnica, znać prosty przykład; wewnątrz reguł nie powinno być alternatywy, czyli sytuacji gdzie mamy x = war1 LUB x = war2, ale taki zapis jest też dopuszczalny (chociaż lepiej rozbijać na dwie reguły); dr Przemysław Juszczuk Języki programowania deklaratywnego