• Nie Znaleziono Wyników

Na początku był Prolog

2.1 Elementy Prologu

2.1.1 Dziedzina wnioskowania

Dziedziną wnioskowania Prologu i CLP jest dziedzina termów zwana również dziedziną Herbranda. Term to dowolny ciąg znaków pozbawiony znaczenia se-mantycznego. Wyróżnia się następujące typy termów :

• atom będący dowolnym ciągiem znaków rozpoczynającym się małą literą lub rozpoczynającym się dowolną literą, lecz znajdującym się pomiędzy podwójnymi lub pojedynczymi górnymi cudzysłowami3. Atomy są nie-numerycznymi (tzn. logicznymi lub symbolicznymi) stałymi. Np. ”pada deszcz” jest stałą logiczną, gdyż w danej sytuacji jest ona lub nie jest prawdą, natomiast ”Antoni Niederliński” jest stałą symboliczną, gdyż nie można jej przyporządkować wartości logicznej. Stosowanie cudzysłowów umożliwia odróżnianie atomów rozpoczynających się dużymi literami od zmiennych;

• zmienna, będąca dowolnym ciągiem znaków rozpoczynającym się dużą li-terą lub podkreślnikiem, np. X, A, Jan, Kto, Co, _kto, _co. Zmienne w Prologu i CLP spełniają rolę niewiadomych, podobnie jak w logice i al-gebrze. Tym różnią się od zmiennych w programach proceduralnych, gdzie są nazwami miejsc pobytu znanych lecz zmieniających się wielkości. Ko-rzystanie ze zmiennych wymaga zadeklarowania dziedzin, z których mogą

3Pojedyncze (proste) cudzysłowy nie będą w książce stosowane. Wynika to stąd, że są one w plikach tekstowych (np. PDF-owych) konwertowane na cudzysłowy leksykograficzne (zakrzywione), które są niezrozumiałe dlaECLiP Sea, co skutkuje tym, ze skanu PDF-owego pliku programu z takimi cudzysłowami nie można uruchomić.

pochodzić wartości tych zmiennych. Jeżeli zmiennej została przyporządko-wana jakaś wartość z jej dziedziny, mówimy że zmienna ta jest uziemiona.

W przeciwnym przypadku uważa się ją za zmienną wolną. Mody zmien-nych są obszerniej omawiane w rozdziale 2.1.3. Zdecydowana większość zmiennych w programach prologowych i clp-owych to zmienne decyzyjne, tzn. zmienne potrzebne dla sformułowania ograniczeń problemu. W pro-gramach mogą również występować zmienne niedecyzyjne, tzn. zmienne nie służące do opisu ograniczeń problemu, lecz np. służące do programo-wania komunikatu generowanego przez program lub do zaprogramoprogramo-wania akumulatora, patrz rozdział 2.1.9;

• liczba będąca stałą całkowitą (np. 9 lub 123) albo stałą zmiennoprzecin-kową w notacji inżynierskiej (np. 3.14 lub 2.79), wyłącznie z kropką dzie-siętną4;

• predykat (po polsku: orzeczenie), będący relacją (po polsku: związkiem, zależnością) pomiędzy zmiennymi, np.

lubi(Kto, Co).

Przykładowy predykat stanowi więc sformalizowaną prefiksową postać po-tocznego infiksowego zdania

"Kto lubi Co",

mającą tę przewagę nad potocznym zdaniem, że umożliwia bezproble-mowy dostęp do argumentów Kto i Co, i może łatwo akomodować więk-szą liczbę zmiennych. Ponieważ Kto i Co są zmiennymi, predykat nie ma wartości logicznej: nie jest ani prawdziwy, ani fałszywy, lecz wieloznacz-ny. Dopiero uziemienie zmiennych Kto i Co, tzn. zastąpienie ich odpo-wiednimi stałymi (np. Kto = "Andrzej Kowalski", Co = prolog) spra-wia, że predykat zostaje uziemiony, tzn. powstaje z niego stwierdzenie

lubi("Andrzej Kowalski",prolog),

które może być prawdą (mówimy wówczas, że predykat jest spełniony), lub może nie być prawdą (mówimy wówczas, że predykat jest niespełniony, a uziemienie, które do tego doprowadziło, nazywa się porażką).

Należy podkreślić, że argumenty predykatu są krotką, tzn. ich kolejność jest istotna i musi być zachowana dla każdego przypadku stosowania te-go predykatu w danym programie. Jest to konieczne, gdyż Prolog i CLP identyfikują zmienne nie po ich nazwie, lecz po ich pozycji w krotce pre-dykatowej. Tak np. predykaty:

lubi("Andrzej Kowalski",prolog),

4Przecinki są w Prolog u i CLP z reguły rezerwowane dla oznaczania operacji koniunkcji.

lubi(prolog,"Andrzej Kowalski"),

nie powinny występować w tym samym programie, aczkolwiek w (błędnej) intencji programisty mogą oznaczać to samo. Uporządkowanie argumen-tów ”dziedziczy” predykat po relacji, z kolei relacja ”dziedziczy” uporząd-kowanie argumentów po iloczynie kartezjańskim.

W tym miejscu należy wspomnieć o istnieniu zmiennej anonimowej, bę-dącej zmienną, której nie potrzeba uziemiać. Jest ona stosowana dla za-chowania zadeklarowanej arności predykatów w przypadkach, gdy wartość tej zmiennej jest dla dalszych wnioskowań nieistotna. Np. w przypadku gdy interesuje nas tylko, czy ktoś w jakimś zbiorze studentów w ogóle lubi Prolog, możemy posłużyć się zapytaniem ze zmienną anonimową:

lubi(_,prolog),

na które otrzymamy odpowiedź ”yes” lub ”no”.

Predykaty mogą się zagnieżdżać, tzn. mogą służyć jako argumenty innych predykatów, np.:

lubi(student_2_go_roku(Kto),przedmiot(Co)).

Szczególnym przypadkiem predykatu są funkcje5; wszystkie funkcje są pre-dykatami, lecz nie wszystkie predykaty są funkcjami. Dlatego w dalszym ciągu w zasadzie wszędzie stosowane będzie pojęcie predykatu, z wyjąt-kiem przypadku funkcji tradycyjnie zapisywanych w notacji infiksowej (np.

X1 + X2, gdzie ”+” jest standardowym operatorem dodawania). Tego ty-pu infiksowa notacja jest akceptowana zarówno przez Prolog jak i CLP.

W dalszym ciągu rozróżnia się:

1. Predykaty standardowe (ang. built-in predicates), zdefiniowane i za-projektowane przez twórców Prologu lub języków CLP i udostępnione użytkownikom języka. Predykaty standardowe dzieli się na predyka-ty elementarne, definiujące podstawowe relacje i zawarte w

bibliote-5Dla zbioru n zmiennych o określonych dziedzinach, funkcja przyporządkowuje unikalną wartość jednej zmiennej (zmiennej wyjściowej) z jej dziedziny każdej (n-1)-krotce pozostałych zmiennych (zmiennych wejściowych) z ich dziedzin.

kach ic oraz branch_and_bound, o zmiennych zawartych najwyżej w jednej liście, oraz predykaty globalne, definiujące złożone relacje z bibliotek ic_global, ic_cumulative, ic_edge_finder, ic_edge_

finder3, których argumenty mogą być zawarte w szeregu listach.

2. Predykaty prywatne, zdefiniowane i zaprojektowane przez twórcę pro-gramu prologowego lub clp-owego, o nazwie różnej od nazw predyka-tów standardowych. Predykaty prywatne mogą zawierać listy.

• struktura lub rekord (ang. structure, skrót struct) to złożony typy danych, grupujący powiązane ze sobą termy różnego typu (zwane argumentami struktury) w jednym pojęciu, opatrzonym nazwą wyglądającą jak atom:

nazwa_struktury(arg_1,...,arg_n) .

Argumenty struktury są również krotką, tzn. ich kolejność jest istotna i musi być zachowana dla każdego przypadku stosowania tej struktury.

Struktury pozwalają w przejrzysty sposób opisywać złożone obiekty. Przy-kładem struktury może być informacja o programie:

program(ECLiP Se, CLP, ”domena publiczna”).

Struktury umożliwiają przedstawianie i przetwarzanie zagnieżdżających się relacyjnych baz danych. Aczkolwiek struktury pozornie podobne są do predykatów, występuje między nimi zasadnicza różnica: struktury nigdy nie zawierają zmiennych, co znaczy że są zawsze uważane za prawdziwe.

• lista termów, rozpoczynająca się nawiasem kwadratowym lewostronnym i kończąca się nawiasem kwadratowym prawostronnym, a zawierająca ele-menty listy przedzielone przecinkami. W szczególnym przypadku lista mo-że być pusta. Lista termów (niepusta) momo-że wyglądać następująco:

[a, b, "CDE", 5, F]

a lista pusta jest zapisywana za pomocą dwóch nawiasów kwadratowych jako []. Jeżeli wszystkie elementy listy są uziemione, mówi się iż lista jest uziemiona. Właściwościom list poświęcimy więcej uwagi przy okazji dyskusji rekurencji, zob. rozdział 2.1.8.

Powiązane dokumenty