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