To jest stara wersja strony!
1. Wstęp
Celem tego dokumentu jest omówienie implementacji dedukcyjnego systemu bazodanowego DES, bazującego na języku Datalog. Największa część uwagi zostanie skupiona na praktycznych cechach narzędzia, jakkolwiek zawarte zostaną także uwagi o charakterze bardziej teoretycznym.
2.1. Uwagi odnośnie instalacji
Instalacja narzędzia DES jest wyjątkowo prosta i intuicyjna – dla poszczególnych systemów operacyjnych, w przypadku ściągnięcia wersji wykonywalnej, polega po prostu na uruchomieniu pliku wykonywalnego EXE (Windows) bądź głównego skryptu (Linux).
= 2.1.1. MS Windows =
W przypadku systemu operacyjnego MS Windows mamy do wyboru dwie możliwości:
- plik des.exe – uruchomienie DES w standardowej konsoli:
- plik deswin.exe – konsola dedykowana dla Windows:
2.2. Uwagi o różnych językach
DES ma postać konsoli, w której wprowadza się poszczególne polecenia. Chociaż przewodnim językiem komunikacji jest Datalog, to jednak istnieje także możliwość używania innych języków – Prologu i SQL. Komendy pozwalające na przełączanie się pomiędzy tymi trzeba językami to:
/datalog
/prolog
/sql
Tego typu komendy pozwalają na permanentne (do czasu kolejnego wpisania kolejnej tego typu komendy) przełączenie się na dany język.
Jeśli natomiast chcemy wpisać tylko jedne polecenie w danym języku, odmiennym od aktualnie używanego, należy wykonać nastepujące komendy:
/datalog polecenie
/prolog polecenie
/sql polecenie
2.3. Pomoc
Poniższe komendy służą do uzyskania różnego rodzaju przydatnych informacji:
/help
– wypisuje listę dostępnych w danej chwili komend
/builtins
– wypisuje listę wbudowanych komend i poleceń
3. Opis działania poszczególnych języków
3.1. Datalog
Jest to najważniejszy język DES, z którego to narzędzie wywodzi swoją nazwę. Składnia Datalogu jest bardzo podobna do odpowiednika w Prologu, jedyna różnica jest związana z pewnymi niuansami, o których szerzej za chwilę.
Poniżej punktuję ważne elementy składni języka Datalog:
Termy złożone
W Datalogu mają postać:
t(t1, t2, …, tn)
, gdzie:
t
– symbol funkcyjny (funktor)
t1 … tn
- termy
Atomy
Są to wyrażenia postaci:
a(t1, t2, …, tn)
, gdzie:
a
– predykat (relacja)
t1 … tn
– termy
Wyrażenie warunkowe
Jest to wyrażenie logiczne zawierające:
Funkcje
f(a1, … an)
,gdzie:
a1 … an
– argumenty
Dostępny jest tylko ograniczony zbiór funkcji wbudowanych
3.2. SQL
Składnia jest zgodna ze standardem SQL.
3.2.1. Ograniczenia
W obecnej wersji (1.7) systemu DES, istnieją jednakże liczne ograniczenia. Poniżej wypunktowałem ważniejsze z nich:
brak funkcji agregujących (min, max, avg)
brak grupowania (group by)
brak klauzuli order by
brak więzów bazodanowych, takich jak klucze podstawowe w tabeli
brak podstawowych operacji na widokach (insert / update / delete)
brak informowania o występujących błędach w składni polecenia
brak możliwości wpisywania wielolinijkowych komend
3.2.2. Wielkość liter
W odniesieniu do języka Datalog, w SQL'u podjęto dwie decyzje związane z rozróżnianiem wielkości liter:
podobnie jak w języku Datalog, w identyfikatorach zdefiniowanych przez użytkownika wielkość liter ma znaczenie. Jest to niezgodne z tendencją występującą w klasycznych systemach DBMS.
w odróżnieniu do języka Datalog, we wbudowanych identyfikatorach wielkość liter nie ma znaczenia. Jest to w zgodzie z obecną tendencją występującą w klasycznych systemach DBMS.
3.3. Prolog
Składnia oraz zasady związane z językiem Prolog są w systemie DES takie same jak dla języka Datalog.
3.4. Elementy wspólne
Wspólnym, współdzielonym na identycznych zasadach aspektem każdego z trzech języków systemu DES, są elementy wbudowane. Poniżej opisuję każdy z rodzajów pod kątem składni oraz sposobu bycia wykorzystanym.
3.4.1. Funkcje arytmetyczne
4. Porównanie na przykładach
Po teoretycznych rozważaniach prezentuję kilka praktycznych przykładów programów dla każdego z 3 opisanych językow.
4.1. Rodzina
Rozpoczynamy od klasycznego dla programowania deklaratywnego, przykładu rodziny.
Przykład w języku Datalog / Prolog
father(tom,amy).
father(jack,fred).
father(tony,carolII).
father(fred,carolIII).
mother(graceI,amy).
mother(amy,fred).
mother(carolI,carolII).
mother(carolII,carolIII).
parent(X,Y) :-
father(X,Y)
;
mother(X,Y).
% The above clause for parent is equivalent to:
% parent(X,Y) :-
% father(X,Y).
% parent(X,Y) :-
% mother(X,Y).
ancestor(X,Y) :-
parent(X,Y).
ancestor(X,Y) :-
parent(X,Z),
ancestor(Z,Y).
Jak widzimy w tym przypadku, składnia jest identyczna zarówno dla Prologu, jak i Datalogu.
DES pozwala na zapis alternatywy w jednej regule – jest to równoważne z klasycznym zapisem za pomocą dwóch reguł.
Przykład w języku SQL:
/sql
create table father(father,child);
insert into father values('tom','amy');
insert into father values('jack','fred');
insert into father values('tony','carolII');
insert into father values('fred','carolIII');
create table mother(mother,child);
insert into mother values('graceI','amy');
insert into mother values('amy','fred');
insert into mother values('carolI','carolII');
insert into mother values('carolII','carolIII');
create view parent(parent,child) as select * from father union select * from mother;
create or replace view ancestor(ancestor,descendant) as select parent,child from parent union select parent,descendant from parent,ancestor where parent.child=ancestor.ancestor;
select * from ancestor where ancestor='tom';
select child,father,mother from father,mother where father.child=mother.child;