Nawracanie i odcięcie Jakub Czoboda, Jezierski Aleksander, Skierkowski Paweł, Bembenista Kamil, Martynowski Witold.

Slides:



Advertisements
Podobne prezentacje
Instrukcje - wprowadzenie
Advertisements

Programowanie obiektowe
Marcin Piotrowski. Najpopularniejszymi darmowymi przeglądarkami są Internet Explorer, Opera, Mozilla Firefox, Google Chrome.
Równanie różniczkowe zupełne i równania do niego sprowadzalne
Wykład 06 Metody Analizy Programów System Hoare
Programowanie I Rekurencja.
REGUŁOWO-MODELOWE SKORUPOWE SYSTEMY EKSPERTOWE Część 1
Języki programowania C++
VI Rachunek predykatów
Badania operacyjne. Wykład 2
Wykład no 11.
FUNKCJE INFOMACYJNE KOMÓRKA CZY.ADAR KOMÓRKA CZY.ADAR NR. BŁĘDU CZY.TEKST NR. BŁĘDU CZY.TEKST INFO L INFO L CZY. PUSTA BRAK CZY. PUSTA BRAK CZY. BŁ TYP.
Metoda pierwszeństwa operatorów
Liczby Pierwsze - algorytmy
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Sztuczna Inteligencja Reprezentacja wiedzy II Systemy produkcyjne Włodzisław Duch Katedra Informatyki Stosowanej UMK Google: W. Duch.
Materiały pomocnicze do wykładu
Tablice jednowymiarowe 1
SO – LAB3 Wojciech Pieprzyca
FUNKTORY Katarzyna Radzio Kamil Sulima.
Wstęp do interpretacji algorytmów
CO TO JEST ALGORYTM!.
Jest to wyrażenie jednoznacznie stwierdzające, na gruncie danego języka, iż tak a tak jest albo że tak a tak nie jest. Zazwyczaj określa się, iż takim.
Dr Anna Kwiatkowska Instytut Informatyki
Zależności funkcyjne.
Podstawy programowania
Podstawy układów logicznych
Programowanie w logice
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
Elementy Rachunku Prawdopodobieństwa i Statystyki
I. Informacje podstawowe
Zadanie programowania liniowego PL dla ograniczeń mniejszościowych
Elementy Rachunku Prawdopodobieństwa i Statystyki
Zadanie programowania liniowego PL dla ograniczeń mniejszościowych
Systemy wspomagania decyzji
Języki i automaty część 3.
Tworzenie programów, etapów oraz określanie wymagań etapowych
Elżbieta Fiedziukiewicz
Rozwiązanie zadań do zaliczenia I0G1S4 // indeks
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
PRZYGOTOWALI Bartosz Pawlik Daniel Sawa Marcin Turbiński.
Obliczalność czyli co da się policzyć i jak Model obliczeń maszyna licznikowa dr Kamila Barylska.
Zbiory Co to jest zbiór? Nie martw się, jeśli nie potrafisz odpowiedzieć. Nie ma odpowiedzi na to pytanie.
Zagadnienia AI wykład 2.
Zagadnienia AI wykład 5.
Projektowanie postaci formularza:
Warstwowe sieci jednokierunkowe – perceptrony wielowarstwowe
Wykład Rozwinięcie potencjału znanego rozkładu ładunków na szereg momentów multipolowych w układzie sferycznym Rozwinięcia tego można dokonać stosując.
Wstęp do interpretacji algorytmów
Rozdział IV Wyrażenia proceduralne algorytmów Grzegorz Gacek Patryk Gajewski.
Pętle – instrukcje powtórzeń
Wstęp do programowania Wykład 10 Programowanie w logice.
„Filtry i funkcje bazodanowe w EXCELU”
KNW - wykład 3 LOGIKA MODALNA.
DALEJ Sanok Spis treści Pojęcie funkcji Sposoby przedstawiania funkcji Miejsce zerowe Monotoniczność funkcji Funkcja liniowa Wyznaczanie funkcji liniowej,
Etapy procesu sterowania rozmytego
Metody sztucznej inteligencji - Technologie rozmyte i neuronowe 2015/2016 Systemy rozmyte – wnioskowanie Mamdani’ego II © Kazimierz Duzinkiewicz, dr hab.
Zmienne typy danych w VBA. MS Excel – typy danych w języku programowania VBA.
PROLOG NAWRACANIE I ODCIĘCIE
Elementy cyfrowe i układy logiczne
Piotr Kawałek , Mateusz Śliwowski
Matematyka przed egzaminem czyli samouczek dla każdego
PROLOG z BLISKA Przygotowali: Konrad Daniszewski, Adam Kuliński, Konrad Poszwiński, Arkadiusz Trzciński.
Wstęp do Informatyki - Wykład 6
Selekcja danych Korelacja.
Programowanie I Rekurencja.
Wykonali: Jakub Gutkowski, Klaudia Belka, Damian Koncewicz
Haskell Składnia funkcji.
Poszukiwania: ponowna ocena sytuacji
Zapis prezentacji:

Nawracanie i odcięcie Jakub Czoboda, Jezierski Aleksander, Skierkowski Paweł, Bembenista Kamil, Martynowski Witold

Generowanie wielu rozwiązań Najprościej jest wygenerować wiele rozwiązań na podstawie zbioru faktów wówczas, gdy wiele faktów pasuje do tego zapytania. Jeśli mamy w bazie następujące fakty „ojciec(X,Y)” oznaczające, że Y jest ojcem X: -ojciec(maria, jerzy). -ojciec(jan,jerzy). -ojciec(zuzanna,henryk). -ojciec(jerzy,edward).

Na zapytanie:. - ojciec(X,Y). Będzie istniało kilka odpowiedzi Na zapytanie: ?- ojciec(X,Y). Będzie istniało kilka odpowiedzi. Jeśli będziemy żądali za pomocą średnika kolejnych rozwiązań, otrzymamy takie oto wyniki: X=maria, Y=jerzy; X=jan, Y=jerzy; X=zuzanna, Y=henryk; X=jerzy, Y=edward Dzięki nawracaniu znajdowane są wszystkie rozwiązania z bazy danych. Prolog nie analizuje zwracanych wyników i ich nie zapamiętuje.

Jeśli zadamy zapytanie:. - ojciec(_,X) Jeśli zadamy zapytanie: ?- ojciec(_,X). Otrzymamy: X=jerzy ; X=jerzy ; X=henryk ; X=edward; Jerzy pojawił się dwukrotnie, gdyż jest ojcem Marii i Jana. Jeśli prolog może pokazać to samo w dwojaki sposób, traktuje obie możliwości jako różne rozwiązania

Nawracanie ma miejsce także w sytuacji, kiedy istnieje więcej możliwych rozwiązań głębiej zagnieżdżonych. Przykładowa definicja reguły mówiącej, że „jednym z dzeci X jest Y, może wyglądać tak: Dziecko(X,Y) :- ojciec (Y,X). Wobec tego zapytanie: ?- dziecko(X,Y) da odpowiedzi: X=jerzy, Y=maria ; X=jerzy, Y=jan ; X=henryk, Y=zuzanna; X=edward, Y=jerzy

Działanie mechanizmu nawracania w Prologu Przypuśćmy, że mamy pewien predykat: a określony w programie przez zdania i reguły. Zapiszmy ogólnie regułę dla a w postaci a() :- b(), c(), d(). Przy czym funkcje b, c, d są także definiowane zarówno przez fakty, jak i reguły oraz mogą być relacjami między jakimiś zmiennymi. Mechanizm nawracania (czyli schemat postępowania Prologu podczas „przeszukiwania” bazy wiedzy w celu udzielenia odpowiedzi na pytanie: ?- a()) można przedstawić następująco:

Przeszukiwanie linijka po linijce kodu programu w poszukiwaniu predykatu lub reguły o nazwie a. eśli jest to zdanie Prolog sprawdza, czy dla podanych zmiennych jest ono prawdziwe. Wówczas zwraca YES i sprawdza kolejną linijkę kodu. W pozostałych przypadkach (zdanie jest fałszywe lub nie da się określić jego wartości logicznej) Prolog przechodzi od razu do kolejnej linii kodu

Jeśli odnaleziona będzie reguła, Prolog zacznie przeszukiwanie bazy w celu znalezienia odpowiedzi na zapytanie ?-b(). Uwaga: Baza wiedzy jest przeszukiwana znów od pierwszej linii a nie od miejsca w którym wystąpiła reguła dla a. Po znalezieniu pierwszego zdania lub reguły dla B powtarza się schemat z poprzedniego punktu i tak aż do skonkretyzowania wszystkich argumentów b

Następnie powtarzane są kroki z poprzednich punktów dla c 0raz d i udzielana jest odpowiedź Yes/No lub zwracane są wartości zmiennych które spełniają zadaną regułę i da się je znaleźć w pierwszym kroku (np. jakiejś iteracji).

Prolog kontynuuje poszukiwania zdań/reguł określających d (przy ustalonych uprzednio zmiennych występujących w a, b, c) i po znalezieniu odpowiedzi lub kolejnej wartości zmiennej wypisuje odpowiedź. Dopiero wtedy, gdy wszystkie możliwości skonkretyzowania wolnych zmiennych w predykacie d zostaną wyczerpane, Prolog zaczyna poszukiwać kolejnych zdań/reguł dla c nie zmieniając zmiennych związanych przy określaniu b. Powtarzane są kroki z podpunktów 2 i dalszych aż do ponownego wypisania odpowiedzi lub wartości zmiennych.

Po wyczerpaniu możliwości określenia b Po wyczerpaniu możliwości określenia b. Prolog kontynuuje szukanie zdań/reguł dla a. Po znalezieniu każdej kolejnej powtarzane są znów wszystkie opisane już kroki aż do wypisania odpowiedzi.

Odcięcie Aby choć trochę kontrolować sposób realizacji programu w Prologu możemy używać operatora odcięcia „!”. Pozwala ono nakazać interpreterowi Prologa, by nie uwzględniał wcześniejszych możliwości wyboru podczas nawracania. Korzystanie z odcięcia jest bardzo istotne, ponieważ pozwala na pominięcie z góry znanych wyników, co w efekcie prowadzi do zwiększenia wydajności programu.

W celu dokładnego zrozumienia działania mechanizmu odcięcia, przyjrzyjmy się poniższemu programowi korzystającemu tylko z mechanizmu nawracania. a(X,Y) :- b(X), c(Y). b(d). b(e). b(f). c(g). c(h). c(i).

W wyniku działania programu otrzymujemy: ?- a(X,Y). X = d Y = g ; X = d Y = h ; X = d Y = i ; X = e Y = g ; X = e Y = h ; X = e Y = i ; X = f Y = g ; X = f Y = h ; X = f Y = i ; No

Jak widać Prolog skonkretyzował dla zmiennej X wartość „d”, a następnie każdą kolejną wartość odpowiadającą zmiennej Y. Jako następne wartości, zmienna X przyjęła „e” oraz „f”, po czym Prolog powtózył poprzednie czynności dla każdej z nich. Często zachodzi jednak potrzeba ograniczenia działania programu i służy do tego właśnie mechanizm odcięcia.

Rozważmy ten sam przykład, tym razem wykorzystujący mechanizm odcięcia. a(X, Y) :- b(X), !, c(Y). b(d). b(e). b(f). c(g). c(h). c(i).

W odpowiedzi otrzymujemy poniższy wynik: ?- a(X,Y). X = d Y = g ; X = d Y = h ; X = d Y = i ; No Jak można zauważyć, program zatrzymał się na etapie skonkretyzowania zmiennej X do wartości „d”.

Dzieje się to za sprawą zamieszczonego w kodzie operatora „ Dzieje się to za sprawą zamieszczonego w kodzie operatora „!”, który przyjmuje pierwsze napotkane rozwiązanie dla wyrażenia b(X) jako jedyne. Jako że symbol odcięcia wystapił przed ukonkretyzowaniem zmiennej Y, wciąż można poszukiwać dla niej alternatyw.

Jako inny przypadek rozważmy poniższy kod: a(X) :- b(X), !, c(X). b(d). b(e). b(f). c(e). Możemy z góry założyć, że gdy X=e, wówczas spełnione jest zarówno „b” jak i „c”. Z powodu zastosowania odcięcia, program zatrzymuje się w momencie przypisania wyrażeniu b(X) wartości „d”, w efekcie zwracając wynik pusty.

Mechanizm odcięcia ma również znaczenia w przypadku, gdy dla jednego celu określone są dwie regułu. Dla przykładu, Prolog analizując poniższy kod: a(X) :- b(X), !, c(X). a(X) :- d(X). b(e). b(f). c(g). d(f). nie tylko odcina nawracanie podczas konkretyzowania zmiennej X, ale również odrzuca pozostałe regułydla a(X). Powoduje to zastosowany w kodzie symbol odcięcia, który blokuje możliwość korzystania z reguł innych niż te, które zostały zadeklarowane przed jego zastosowaniem.