CLP a programowanie logiczne
Transkrypt
CLP a programowanie logiczne
Constraint Logic Programming Krzysztof Szcześniak, Leszek Zaczyński Plan prezentacji ● Wstęp ● Charakterystyka – Programowanie logiczne – CLP a programowanie logiczne – Semantyka – Ograniczenia ● Przykłady ● Implementacje Wstęp ● Constraint Logic Programing – Odmiana programowania logicznego rozszerzona o zagadnienia/funkcjonalności programowania z ograniczeniami – Opracowane w latach 80-tych przez J. Jaffara i J.L. Lasseza Programowanie logiczne – Programowanie logiczne to metoda programowania, w której program podawany jest jako pewien zestaw zależności, a obliczenia są dowodem pewnego twierdzenia w oparciu o te zależności. – Program to zbiór reguł będących klauzulami Horna, czyli na przykład wyrażeń postaci: a :- b, c, d co jest równoznaczne z: ( b ^ c ^ d ) => a – Szczególnymi regułami są fakty, które mają postać a , oznacza to że wyrażenie a jest zawsze prawdziwe – Przykład matka(X,Y):-rodzic(X,Y), kobieta(X) CLP a programowanie logiczne ● ● ● Interpreter programowania logicznego poszukuje w bazie wiedzy wszystkich możliwych wartości parametrów dla których podane twierdzenie jest prawdziwe – symbole są jedynie łańcuchami znaków, w żaden sposób nie są interpretowane, mała wydajność Programowanie z ograniczeniami pozwala wprowadzić dodatkowe znaczenie dla każdego symbolu związane z oprogramowywaną dziedziną – podejście lepiej modeluje problem oraz jest wydajniejsze Przykład: a(X, Y) :- X+Y>0, b(X), c(Y) Element X+Y>0 pełni tutaj role ograniczenia nałożonego na poszukiwane rozwiązania X oraz Y Semantyka ● ● Formalnie semantykę CLP można zdefiniować w oparciu o pojęcie wyprowadzenia. Przejście jest para dwójek twierdzenie/ograniczenia, oznaczanym jako <T,Z> => <T ',Z'>. – T - bieżące twierdzenie, zawiera literały, które interpreter próbuje udowodnić oraz ograniczenia, które muszą być spełnione – Z – zbiór wszystkich do tej pory napotkanych ograniczeń Para taka wyraża możliwość przejścia ze stanu <T,Z> do stanu <T ',Z'>, do którego może dojść w trzech przypadkach: – można przenieść ograniczenie z twierdzenia do zbioru ograniczeń – można zastąpić literał przez ciało nowego wariantu klauzuli rozpoczynającej się tym samym predykatem dodając ciało nowego wariantu oraz powyższe równości do twierdzenia – Z i Z' są równoważne w sensie przyjętej semantyki ograniczeń Semantyka – kolejność działania ● Na początku działania interpretera twierdzeniem bieżącym jest główne twierdzenie całego programu, natomiast zbiór ograniczeń jest pusty. Następnie interpreter usuwa pierwszy element bieżącego twierdzenia i go analizuje – ● sprawdza czy literał ten to ograniczenie czy zwykły literał Jeśli jest to ograniczenie, to dodawane jest ono do zbioru ograniczeń. W przeciwnym przypadku wybierana jest klauzula, na której początku znajduje się predykat taki sam jak badany literał klauzula ta następnie jest przeformułowywana poprzez zastąpienie jej zmiennych nowymi zmiennymi Podczas tych operacji dokonywane są pewne sprawdzenia. W szczególności zbiór ograniczeń sprawdzany jest pod katem spójności za każdym razem gdy dodawane są do niego nowe elementy Semantyka – udowadnianie ● ● ● Interpreter udowadnia twierdzenie w momencie, gdy bieżące twierdzenie jest puste i wszystkie ograniczenia ze zbioru ograniczeń są spełnione. Rezultatem wykonania powyższych operacji jest bieżący zbiór ograniczeń (ewentualnie uproszczony). Ciąg przejść to wyprowadzenie. Twierdzenie T może być udowodnione jeśli istnieje wyprowadzenie z <T,Ø > do <Ø,Z> dla pewnego zbioru możliwych do spełnienia ograniczeń Z. Innymi słowy twierdzenie jest dowiedzione zgodnie z ta semantyka, jeśli istnieje ciąg wyborów literałów i klauzul Ograniczenia - drzewa ● CLP wykorzystujące terminy (elementy wyrażeń) będące drzewami emulują zwykłe programowanie logiczne poprzez zapisywanie podstawień jako ograniczenia w zbiorze ograniczeń. Terminem może być zmienna, stała lub funktor wywołany dla innych terminów. Ograniczeniami mogą być jedynie równość lub nierówność dwóch terminów. Ograniczenia – dziedziny rzeczywiste ● W przypadku użycia dziedzin rzeczywistych terminami są wyrażenia operujące na liczbach rzeczywistych. Jeśli nie użyto funktorów, to terminy są po prostu zwykłymi wyrażeniami na liczbach rzeczywistych które mogą zawierać zmienne. W takim przypadku wartością zmiennej może być jedynie konkretna liczba. Ograniczenia – dziedziny ograniczone ● ● W przypadku dziedziny ograniczonej zmienne mogą przyjąć wartości jedynie z pewnego określonego,ograniczonego zbioru – Określenie poprzez przedział zapis X::[1..10] oznacza, ze zmienna X może przyjąć dowolna wartość całkowita należąca do przedziału [1, 10] – specyfikacja dziedziny poprzez wypisanie wszystkich elementów, np.: X::[1, 3, 4]. Podobnie jak w przypadku dziedzin rzeczywistych, dla dziedzin będących podzbiorem zbioru liczb całkowitych można używać funktorów. Terminem może być wtedy wyrażenie całkowitoliczbowe, stała lub wywołanie funktora dla innych terminów. Przykład ● ● Często przytaczanymi w literaturze przykładami są zagadki słowne, np. SEND + MORE = MONEY lub DONALD + GERALD = ROBERT. Polegają one na tym, aby każdej literze przypisać jednoznacznie inna cyfrę. Po podstawieniu wyznaczonych cyfr za odpowiadające im litery powinno się otrzymać poprawne wyrażenie matematyczne. Program napisany w języku CLP rozwiązuje ta zagadkę znacznie szybciej niż jego odpowiednik w Prologu dzięki zastosowaniu ograniczeń. Przykład - rozwiązanie dgr_pro :% generujemy wszystkie możliwe kombinacje permutation ( [D, O, N, A, L, G, E, R, B, T], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) , % eliminujemy kombinacje z początkowymi zerami D > 0, G > 0, R > 0, % wybieramy kombinacje spełniające równanie z zadania 100000* D + 10000* O + 1000* N + 100* A + 10* L + D + 100000* G + 10000* E + 1000* R + 100* A + 10* L + D =:= 100000* R + 10000* O + 1000* B + 100* E + 10* R + T, % wypisujemy wynik write ([D, O, N, A, L, D]), write (’+\n’), write ([G, E, R, A, L, D]), write (’=\n’), write ([R, O, B, E, R, T]). Implementacje CLP ● ● Oparte na Prologu – CLP(R) – Prolog III – Prolog IV – CHIP – SICStus – GNU Prolog – SWI-Prolog – YAP Prolog Nie oparte na Prologu – Trilogy – Oz Źródła ● ● ● ● ● http://en.wikipedia.org/wiki/Constraint_programming http://student.agh.edu.pl/~kawulak/?file=MIW06-CLP.pdf http://pl.wikipedia.org/wiki/Programowanie_logiczne http://www.sciences.univnantes.fr/info/perso/permanents/monfroy/Teaching/Cours/ ConstraintLecture-PS-PDF/P1CP_Lecture/Part14_Code_Examples/program_examples.pdf