SlideShare a Scribd company logo
1 of 23
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   Prolog. Programowanie
           KATALOG KSI¥¯EK               Autorzy: W. F. Clocksin, C. S. Mellish
                                         T³umaczenie: Tomasz ¯mijewski
                      KATALOG ONLINE     ISBN: 83-7197-918-5
                                         Tytu³ orygina³u: Programming in Prolog
       ZAMÓW DRUKOWANY KATALOG           Format: B5, stron: 274


              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     Programowanie w Prologu ró¿ni siê zasadniczo od programowania w jêzykach
                                         strukturalnych, takich jak Pascal czy C i jêzykach obiektowych jak Java. Dla wielu osób
                                         zaczynaj¹cych przygodê z Prologiem zaskoczeniem jest fakt, ¿e pisanie programu
         CENNIK I INFORMACJE             w tym jêzyku nie polega na kodowaniu algorytmu. Programista opisuje obiekty i zwi¹zki
                                         miêdzy nimi, a tak¿e podaje warunki, jakie powinno spe³niaæ szukane rozwi¹zanie.
                   ZAMÓW INFORMACJE      System sam przeprowadza obliczenia w oparciu o podane zale¿no ci logiczne, za
                     O NOWO CIACH        programista jedynie czê ciowo mo¿e wp³ywaæ na sposób dzia³ania programu.
                                         Ksi¹¿ka „Prolog. Programowanie” to podrêcznik tego niezwyk³ego jêzyka
                       ZAMÓW CENNIK      programowania stosowanego przy rozwi¹zywaniu problemów z ró¿nych dziedzin:
                                         od logiki matematycznej i symbolicznego rozwi¹zywania równañ przez analizê jêzyka
                                         naturalnego, a¿ do zagadnieñ zwi¹zanych ze sztuczn¹ inteligencj¹. Zawiera ona:
                 CZYTELNIA                  • Wprowadzenie do Prologu
                                            • Podstawowe struktury danych
          FRAGMENTY KSI¥¯EK ONLINE          • Nawracanie, sterowanie nawracaniem za pomoc¹ symbolu odciêcia
                                            • Operacje wej cia/wyj cia
                                            • Predykaty
                                            • Sk³adniê regu³ gramatycznych i analizê jêzyka naturalnego
                                            • Wiele przyk³adowych programów
                                         Wszystkim rozdzia³om towarzysz¹ æwiczenia. Uzupe³nieniem tekstu ksi¹¿ki s¹ dodatki
                                         omawiaj¹ce m.in. rozwi¹zania æwiczeñ i ró¿nice miêdzy najwa¿niejszymi wersjami
                                         Prologu.
                                         „Prolog. Programowanie” to ksi¹¿ka dla studentów matematyki i informatyki, a tak¿e
                                         dla wszystkich zainteresowanych programowaniem opartym na regu³ach logicznych.
                                         Je li chcesz podj¹æ wyzwanie i nauczyæ siê Prologu, jest ksi¹¿ka dla Ciebie.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treści
                Wstęp ............................................................................................... 7
Rozdział 1. Wprowadzenie ................................................................................. 11
                Prolog....................................................................................................................11
                Obiekty i relacje .....................................................................................................12
                Programowanie.......................................................................................................13
                Fakty .....................................................................................................................14
                Zapytania ...............................................................................................................16
                Zmienne.................................................................................................................17
                Koniunkcje.............................................................................................................19
                Reguły ...................................................................................................................23
                Podsumowanie i ćwiczenia ......................................................................................28
Rozdział 2. Prolog z bliska ................................................................................. 31
                Składnia.................................................................................................................31
                    Stałe ................................................................................................................32
                    Zmienne...........................................................................................................32
                    Struktury..........................................................................................................33
                Znaki .....................................................................................................................34
                Operatory...............................................................................................................35
                Równość i unifikacja...............................................................................................37
                Arytmetyka ............................................................................................................38
                Spełnianie celów — podsumowanie..........................................................................42
                    Udane spełnienie koniunkcji celów .....................................................................42
                    Cele i nawracanie..............................................................................................45
                    Unifikacja ........................................................................................................47
Rozdział 3. Korzystanie ze struktur danych......................................................... 49
                Struktury a drzewa..................................................................................................49
                Listy ......................................................................................................................51
                Przeszukiwanie rekurencyjne ...................................................................................54
                Odwzorowania .......................................................................................................57
                Porównywanie rekurencyjne....................................................................................60
                Łączenie struktur ....................................................................................................62
                Akumulatory ..........................................................................................................66
                Struktury ró nicowe................................................................................................68
Rozdział 4. Nawracanie i odcięcie...................................................................... 71
                Generowanie wielu rozwiązań..................................................................................72
                Odcięcie.................................................................................................................75
4                                                                                                      Prolog. Programowanie


                Typowe zastosowania odcięcia.................................................................................80
                   Potwierdzanie wyboru reguły .............................................................................80
                   U ycie odcięcia z predykatem fail ......................................................................84
                   Kończenie generowania mo liwych rozwiązań i ich sprawdzanie ..........................86
                Niebezpieczeństwa wynikające ze stosowania odcięcia ..............................................89
Rozdział 5. Wejście i wyjście ............................................................................. 91
                Czytanie i pisanie termów........................................................................................92
                   Czytanie termów...............................................................................................92
                   Pisanie termów .................................................................................................93
                Czytanie i pisanie znaków .......................................................................................96
                   Czytanie znaków...............................................................................................96
                   Pisanie znaków .................................................................................................97
                Wczytywanie zdań..................................................................................................98
                Czytanie z plików i pisanie do plików..................................................................... 101
                   Otwieranie i zamykanie strumieni..................................................................... 102
                   Zmiana bie ącego strumienia wejściowego i wyjściowego.................................. 103
                   Konsultowanie................................................................................................ 104
                Deklarowanie operatorów...................................................................................... 105
Rozdział 6. Predykaty wbudowane ................................................................... 107
                Wprowadzanie nowych klauzul.............................................................................. 107
                Sukces i pora ka................................................................................................... 109
                Klasyfikacja termów ............................................................................................. 110
                Przetwarzanie klauzul jako termów ........................................................................ 111
                Tworzenie składników struktur i sięganie do nich .................................................... 114
                Wpływ na nawracanie ........................................................................................... 118
                Tworzenie celów zło onych................................................................................... 119
                Równość.............................................................................................................. 122
                Wejście i wyjście .................................................................................................. 122
                Obsługa plików..................................................................................................... 124
                Wyliczanie wyra eń arytmetycznych...................................................................... 124
                Porównywanie termów.......................................................................................... 126
                Badanie działania Prologu ..................................................................................... 127
Rozdział 7. Przykładowe programy ................................................................... 129
                Sortowany słownik w formie drzewa ...................................................................... 129
                Przeszukiwanie labiryntu ....................................................................................... 132
                Wie e Hanoi......................................................................................................... 135
                Program magazynowy........................................................................................... 136
                Przetwarzanie list.................................................................................................. 137
                Zapis i przetwarzanie zbiorów................................................................................ 140
                Sortowanie ........................................................................................................... 142
                U ycie bazy danych .............................................................................................. 145
                    random .......................................................................................................... 145
                    gensym .......................................................................................................... 146
                    findall ............................................................................................................ 147
                Przeszukiwanie grafów.......................................................................................... 149
                Odsiej Dwójki i odsiej Trójki................................................................................. 153
                Ró niczkowanie symboliczne ................................................................................ 155
                Odwzorowywanie struktur i przekształcanie drzew .................................................. 157
                Przetwarzanie programów ..................................................................................... 160
                Literatura ............................................................................................................. 163
Spis treści                                                                                                                              5


Rozdział 8. Usuwanie błędów w programach prologowych................................. 165
                Układ programów ................................................................................................. 166
                Typowe błędy....................................................................................................... 168
                Śledzenie programu............................................................................................... 171
                Śledzenie i punkty kontrolne .................................................................................. 177
                    Sprawdzanie celu ............................................................................................ 179
                    Sprawdzanie przodków.................................................................................... 180
                    Zmiana poziomu śledzenia............................................................................... 181
                    Zmiana sposobu spełnienia celu........................................................................ 182
                    Inne opcje ...................................................................................................... 183
                    Podsumowanie ............................................................................................... 184
                Poprawianie błędów .............................................................................................. 184
Rozdział 9. Użycie reguł gramatycznych w Prologu ........................................... 187
                Parsowanie........................................................................................................... 187
                Problem parsowania w Prologu .............................................................................. 190
                Notacja reguł gramatyki ........................................................................................ 194
                Dodatkowe argumenty .......................................................................................... 196
                Dodatkowe warunki .............................................................................................. 199
                Podsumowanie ..................................................................................................... 201
                Przekształcanie języka na logikę............................................................................. 202
                Ogólniejsze zastosowanie reguł gramatyki .............................................................. 204
Rozdział 10. Prolog a logika............................................................................... 207
                Krótkie wprowadzenie do rachunku predykatów...................................................... 207
                Postać klauzulowa................................................................................................. 210
                Zapis klauzul ........................................................................................................ 215
                Rezolucja i dowodzenie twierdzeń.......................................................................... 216
                Klauzule Horna .................................................................................................... 220
                Prolog.................................................................................................................. 220
                Prolog i programowanie w logice ........................................................................... 222
Rozdział 11. Projekty w Prologu......................................................................... 225
                Łatwiejsze projekty............................................................................................... 225
                Projekty zaawansowane ........................................................................................ 227
Dodatek A Odpowiedzi do niektórych ćwiczeń.................................................. 231
Dodatek B Klauzulowa postać programów ....................................................... 235
Dodatek C Przenośne programy w standardowym Prologu ................................ 241
                Przenośność standardu Prologu .............................................................................. 241
                Ró ne implementacje Prologu................................................................................ 242
                Czego się wystrzegać ............................................................................................ 243
                Definicje wybranych predykatów standardowych .................................................... 244
                    Przetwarzanie znaków..................................................................................... 245
                    Dyrektywy ..................................................................................................... 247
                    Wejście i wyjście strumieniowe........................................................................ 247
                    Ró ne ............................................................................................................ 249
Dodatek D Różne wersje Prologu..................................................................... 251
Dodatek E Dialekt edynburski......................................................................... 255
Dodatek F       micro-Prolog .................................................................................. 263
                Skorowidz...................................................................................... 267
Rozdział 1.
Wprowadzenie

Prolog
   Prolog to komputerowy język programowania. Jego początki sięgają roku 1970, od tego
   czasu u ywano go w aplikacjach związanych z przetwarzaniem symbolicznym, w ta-
   kich dziedzinach, jak:
       relacyjne bazy danych,
       logika matematyczna,
       rozwiązywanie problemów abstrakcyjnych,
       przetwarzanie języka naturalnego,
       automatyzacja projektowania,
       symboliczne rozwiązywanie równań,
       analiza struktur biochemicznych,
       ró ne zagadnienia z dziedziny sztucznej inteligencji.

   Osoby dopiero zaczynające swoją przygodę z Prologiem są zaskoczone tym, e pisanie
   programu w Prologu nie polega na opisywaniu algorytmu, jak to ma miejsce w trady-
   cyjnych językach programowania. Zamiast tego programiści Prologu zajmują się ra-
   czej formalnymi relacjami i obiektami związanymi z danym problemem, badając, które
   relacje są „prawdziwe” dla szukanego rozwiązania. Tak więc Prolog mo e być uwa any
   za język opisowy i deklaratywny. Programowanie w Prologu polega przede wszystkim
   na opisaniu znanych faktów i relacji dotyczących problemu, w mniejszym stopniu na
   podawaniu kolejnych kroków algorytmu. Kiedy programujemy w Prologu, sposób
   pracy komputera częściowo wynika z deklaratywnej semantyki Prologu, częściowo
   z tego, e Prolog na podstawie danego zbioru faktów mo e wnioskować nowe fakty,
   a jedynie częściowo na podstawie jawnie podanych przez programistę instrukcji ste-
   rujących.
12                                                                   Prolog. Programowanie



Obiekty i relacje
     Prolog to komputerowy język programowania u ywany do rozwiązywania proble-
     mów dotyczących obiektów i relacji między nimi.

     Kiedy na przykład mówimy, e „Jan ma ksią kę”, informujemy, e istnieje relacja
     własności między obiektem „Jan” a obiektem „ksią ka”. Co więcej, jest to relacja upo-
     rządkowana: Jan ma ksią kę, ale ksią ka nie ma Jana. Jeśli zadajemy pytanie „Czy Jan
     ma ksią kę?”, staramy się poznać relację. Wiele problemów mo emy opisać, wskazu-
     jąc obiekty i ich relacje. Rozwiązanie problemu polega na za ądaniu od komputera in-
     formacji o obiektach i relacjach, które mo na z naszego programu wywnioskować.

     Nie wszystkie relacje jawnie określają wszystkie obiekty, które ich dotyczą. Kiedy na
     przykład mówimy „Bi uteria jest cenna”, oznacza to, e istnieje relacja „bycia cen-
     nym” dotycząca bi uterii. Nie wiadomo, dla kogo bi uteria jest cenna ani dlaczego.
     Wszystko zale y od tego, co zamierzamy wyrazić. Jeśli tego typu relacje będziemy
     modelować w Prologu, to liczba podawanych szczegółów zale eć będzie od tego, ja-
     kiej odpowiedzi oczekujemy od komputera.

     Mówimy tutaj o obiektach, ale nie nale y mylić tego z popularną metodologią pro-
     gramowania — programowaniem obiektowym. W programowaniu obiektowym obiekt
     to struktura danych, która mo e dziedziczyć pola i metody z hierarchii klas, do której
     sama nale y. Wprawdzie początki programowania obiektowego mo na datować na
     środek lat 60., lecz popularność zyskało w latach 80. i 90., kiedy to pojawiły się takie
     języki jak Smalltalk-80, C++ czy Java.

     Z kolei Prolog ewoluował niezale nie od początku lat 70., zaś jego zaczątkiem były
     postępy programowania w logice. Prologu nie nale y porównywać z językami obiek-
     towymi, takimi jak C++ i Java, gdy Prolog słu y do całkiem innych zadań i całkiem
     inne znaczenie ma w nim słowo „obiekt”. Dzięki elastyczności Prologu mo liwe jest
     napisanie w nim programu, który będzie interpretował podobny do Prologu język obiek-
     towy, ale to ju całkiem inne zagadnienie. Reasumując, kiedy mówimy o obiektach
     w Prologu, nie chodzi nam o struktury danych dziedziczące pola i metody z klasy, ale
     o byty, które mo na opisać termami.

     Prolog stanowi praktyczną i wydajną implementację szeregu aspektów „inteligentnego”
     wykonywania programu: braku determinizmu, równoległości i wywoływania proce-
     dur według wzorca. Prolog zawiera ujednoliconą strukturę danych, term, na bazie któ-
     rej tworzone są wszystkie dane oraz same programy Prologu. Program prologowy
     składa się ze zbioru klauzul, a ka da klauzula to albo fakt opisujący pewną informa-
     cję, albo reguła mówiąca, jak rozwiązanie mo na powiązać z danymi faktami. Tak
     więc Prolog mo na uwa ać za pierwszy krok na drodze ku ostatecznemu celowi pro-
     gramowania w logice. W ksią ce tej nie będziemy zanadto zastanawiać się nad dal-
     szymi implikacjami programowania w logice, nie będzie nas te specjalnie intereso-
     wało, dlaczego Prolog nie jest gotowym językiem programowania w logice. Zamiast
     tego skoncentrujemy się na pisaniu przydatnych programów za pomocą istniejących
     obecnie systemów standardowego Prologu.
Rozdział 1. ♦ Wprowadzenie                                                                 13


       Zanim zaczniemy programować, trzeba jeszcze wspomnieć o jeszcze jednej rzeczy.
       Wszyscy do zapisu relacji u ywamy reguł. Na przykład reguła „Dwoje ludzi jest sio-
       strami, jeśli oboje są kobietami i mają tych samych rodziców” objaśnia znaczenie by-
       cia siostrą. Mówi nam ona te , jak znaleźć dwoje ludzi będących siostrami: wystarczy
       po prostu sprawdzić, czy oboje to kobiety i czy mają tych samych rodziców. Wa ną
       rzeczą jest to, e reguły zwykle są bardzo uproszczone, ale są wystarczająco precy-
       zyjne, aby być definicjami. Nie mo na przecie oczekiwać, e definicja powie nam
       o jakimś obiekcie wszystko.

       Zapewne większość ludzi zgodzi się co do tego, e tak naprawdę „bycie siostrami”
       znaczy o wiele więcej ni wynika to z powy szej reguły. Kiedy jednak rozwiązujemy
       pewien konkretny problem, koncentrujemy się jedynie na regułach z tym problemem
       związanych. Powinniśmy zatem przyjąć specjalnie przygotowaną, uproszczoną defi-
       nicję, która w danym wypadku będzie wystarczająca.



Programowanie
       W tym rozdziale poka emy najwa niejsze elementy języka w prawdziwych progra-
       mach, ale nie będziemy zanadto zagłębiać się w szczegóły, zasady formalne czy wy-
       jątki. Na razie nie będziemy silili się na kompletność wykładu czy jego formalną po-
       prawność. Chcemy, by czytelnik szybko posiadł umiejętność pisania przydatnych
       praktycznie programów, więc musimy skoncentrować się na podstawach: faktach, za-
       pytaniach, zmiennych, połączeniach i regułach. Inne elementy Prologu, np. listy czy re-
       kurencja, będą omawiane w dalszych rozdziałach.

       Programowanie w Prologu składa się z:
            Deklarowania faktów dotyczących obiektów i związków między nimi.
            Definiowania reguł dotyczących obiektów i związków między nimi.
            Zadawania zapytań o obiekty i związki między nimi.

       Załó my na przykład, e wprowadziliśmy do systemu Prologu przedstawioną wy ej
       regułę dotyczącą sióstr. Moglibyśmy zadać zapytanie, czy Maria i Janina są siostrami.
       Prolog przeszuka swoje informacje o Marii i Janinie, następnie odpowie yes lub no,
       zale nie od swojego stanu wiedzy. Tak więc mo emy uwa ać Prolog za zbiór faktów
       i reguł, które są u ywane do udzielania odpowiedzi na zapytania. Programowanie w Pro-
       logu polega na podawaniu faktów i reguł, zaś system potrafi wnioskować nowe fakty
       na podstawie ju istniejących.

       Prolog to język konwersacyjny, co oznacza, e u ytkownik prowadzi pewnego ro-
       dzaju konwersację z komputerem. Załó my, e siedzimy sobie przy terminalu i mamy
       u yć Prologu. Terminal komputera ma klawiaturę i wyświetlacz. Za pomocą klawiatury
       wprowadza się do komputera dane, zaś komputer na wyświetlaczu (mo e to być moni-
       tor czy drukarka) pokazuje swoje odpowiedzi. Prolog oczekuje, e u ytkownik wpro-
       wadzi wszystkie fakty i reguły dotyczące rozwiązywanego problemu. Następnie Pro-
       log będzie odpowiadał na zadawane pytania.
14                                                                              Prolog. Programowanie


           Teraz zajmiemy się kolejno podstawowymi elementami składowymi Prologu. Nie bę-
           dziemy na razie szczegółowo omawiać wszystkich aspektów tego języka, na to czas
           przyjdzie później, w dalszych rozdziałach.



Fakty
           Najpierw omówimy fakty opisujące obiekty. Załó my, e chcemy w Prologu zanoto-
           wać fakt, e „Jan lubi Marię”. Fakt ten dotyczy dwóch obiektów, Jana i Marii, oraz
           zawiera relację „lubienia”. W prologu fakty zapisuje się w postaci:
              NWDK
LCPOCTKC

           Trzeba pamiętać o kilku rzeczach:
                 Nazwy wszystkich relacji i obiektów muszą się zaczynać małymi literami,
                 jak powy ej: NWDK, LCP, OCTKC.
                 Najpierw zapisuje się relację, a potem jej obiekty rozdzielone przecinkami
                 i ujęte w nawias okrągły.
                 Fakt musi się kończyć kropką ().

           Podczas definiowania związków między obiektami w formie faktów nale y zwrócić
           uwagę na kolejność obiektów umieszczanych w nawiasie. Kolejność ta jest wprawdzie
           dowolna, ale trzeba się na jakąś zdecydować i potem się jej trzymać, aby zapewnić
           jednolitą interpretację tych faktów. Na przykład, w powy szym fakcie osobę lubiącą
           podajemy jako pierwszą, zaś lubianą jako drugą. Wobec tego fakt NWDK
LCPOCTKC
           nie jest równowa ny faktowi NWDK
OCTKCLCP. Pierwszy z nich, zgodnie z przyjętą
           przez nas kolejnością, mówi, e Jan lubi Marię. Jeśli chcemy powiedzieć, e Maria
           lubi Jana, musimy to jawnie zapisać:
              NWDK
OCTKCLCP

           Oto zestaw faktów wraz z ich interpretacją w języku naturalnym 1:
              EGPP[
NQVQ                 Złoto jest cenne.
              MQDKGVC
LCPKPC              Janina jest kobietą.
              RQUKCFC
LCPNQVQ           Jan posiada złoto.
              QLEKGE
LCPOCTKC            Jan jest ojcem Marii.
              FCLG
LCPICGVCOCTKC       Jan daje Marii gazetę.

           Za ka dym razem, kiedy u ywamy jakiejś nazwy, dotyczy ona konkretnego obiektu.
           Czytelnik zna język polski, więc oczywiste jest, e LCP i OCTKC muszą dotyczyć osób,

1
    W faktach i obiektach nie nale y u ywać polskich liter. Zgodnie ze standardem Prologu w nazwach relacji
    i obiektów mo na korzystać jedynie z alfabetu łacińskiego i pewnych znaków dodatkowych, które zostaną
    podane w dalszych rozdziałach — przyp. tłum.
Rozdział 1. ♦ Wprowadzenie                                                                 15


       ale znaczenie takich nazw jak NQVQ nie od razu będzie jasne. Tego typu słowa nazy-
       wane są słowami niepoliczalnymi. Kiedy u ywamy jakiejś nazwy, musimy przypisać
       jej interpretację.

       Przykładowo, nazwa NQVQ mo e odnosić się do obiektu — wtedy zwykle chodzi nam
       o jakiś kawałek złota. W takiej sytuacji fakt EGPP[
NQVQ oznacza, e dany kawałek
       złota, któremu przypisaliśmy nazwę NQVQ, jest cenny. Z drugiej strony, mo emy uznać,
        e nazwa NQVQ dotyczy pierwiastka o liczbie atomowej 79, wobec czego pisząc EGP
       P[
NQVQ mówimy, e pierwiastek chemiczny złoto jest cenny. Tak więc nazwę
       mo na ró nie interpretować, a o wyborze konkretnej interpretacji decyduje programi-
       sta. Nie stanowi to problemu, pod warunkiem, e będziemy konsekwentnie trzymać
       się jednej interpretacji. Wa ne jest ustalenie tej interpretacji dostatecznie wcześnie,
       kiedy jeszcze dokładnie wiemy, co dana nazwa miała oznaczać.

       Teraz trochę o stosowanej terminologii. Nazwy obiektów występujące w nawiasach
       nazywamy argumentami. Pamiętajmy, e w informatyce słowo „argument” nie ma nic
       wspólnego z potocznym znaczeniem tego słowa, czyli „racją w dyskusji”. Nazwę re-
       lacji znajdującą się przed nawiasem nazywamy predykatem. Wobec tego predykat EGPP[
       ma jeden argument, zaś predykat NWDK ma dwa argumenty.

       Nazwy obiektów i relacji są całkowicie dowolne. Zamiast zapisu NWDK
LCPOCTKC
       równie dobrze moglibyśmy zastosować C
DE, wiedząc, e C oznacza lubienie, D
       oznacza Jana, a E oznacza Marię. Jednak zwykle nazwy dobiera się tak, aby ułatwić
       zapamiętywanie ich znaczenia. Wobec tego z góry trzeba ustalić znaczenie poszcze-
       gólnych nazw i kolejność argumentów, a potem trzeba się ściśle trzymać przyjętej
       konwencji.

       Relacje mogą mieć dowolną liczbę argumentów. Jeśli chcemy zdefiniować predykat
       ITC, w którym podamy dwóch graczy i nazwę gry, będziemy potrzebowali trzech ar-
       gumentów. Oto dwa przykłady takich faktów:
          ITC
LCPOCTKCHWVDQN
          ITC
LCPKPCUVCUGMDCFOKPVQP

       Jak się przekonamy dalej, u ycie wielu argumentów jest konieczne do zapamiętania
       zło onych powiązań między relacjami.

       Mo na deklarować ró ne fakty, tak e fakty, które nie są prawdziwe w świecie ze-
       wnętrznym. Mo na na przykład napisać MTQN
LCPHTCPELC, aby poinformować, e Jan
       jest królem Francji. Jest to oczywiście nieprawda, biorąc pod uwagę, e rządy monar-
       sze we Francji zostały obalone około roku 1792. Prolog jednak nic o tym nie wie i nie
       chce wiedzieć; fakty Prologu pozwalają po prostu zapisywać dowolne relacje między
       obiektami.

       W Prologu zbiór faktów nazywamy bazą danych. Tego słowa u ywa się zawsze, kiedy
       mamy do czynienia ze zbiorem faktów (a, jak dowiemy się potem, tak e reguł) u y-
       wanych do rozwiązania pewnego problemu.
16                                                                 Prolog. Programowanie



Zapytania
     Kiedy mamy ju jakieś fakty, mo emy zadawać dotyczące ich zapytania. W Prologu
     zapytanie wygląda tak samo jak fakt, ale umieszcza się przed nim specjalny symbol
     — pytajnik i minus (!). Rozwa my zapytanie:
       ! RQUKCFC
OCTKCICGVC

     Jeśli OCTKC to osoba o imieniu Maria, a ICGVC to pewna konkretna gazeta, to powy -
     sze zapytanie odpowiada pytaniu Czy Maria ma gazetę? lub Czy istnieje fakt mówiący,
      e Maria ma gazetę? Nie jest to natomiast zapytanie o wszystkie gazety, ani o gazety
     w ogólności.

     Kiedy zadajemy Prologowi zapytanie, przeszukuje on stworzoną wcześniej bazę da-
     nych i szuka faktów pasujących do faktu podanego w zapytaniu. Dwa fakty pasują do
     siebie, jeśli mają takie same predykaty (tak samo pisane) i takie same są odpowiada-
     jące sobie ich argumenty. Jeśli Prolog znajdzie fakt pasujący do zapytania, odpowie
     [GU (tak). Jeśli fakt taki nie zostanie znaleziony, odpowiedzią będzie PQ (nie). Odpo-
     wiedzi pokazywane są na monitorze bezpośrednio pod pytaniem. Załó my, e mamy
     następującą bazę danych:
       NWDK
LCTGMT[D[
       NWDK
LCTGMOCTKC
       NWDK
OCTKCMUKCMC
       NWDK
LCPMUKCMC
       NWDK
LCPHTCPELC

     Jeśli wprowadzimy takie właśnie fakty, mo emy zadawać poni sze zapytania i otrzy-
     mamy pokazane ni ej odpowiedzi (odpowiedzi komputera są pogrubione):
       ! NWDK
LCTGMRKGPKCFG
       PQ
       ! NWDK
OCTKCLCTGM
       PQ
       ! NWDK
OCTKCMUKCMC
       [GU

     Odpowiedzi na pierwsze trzy pytania nie powinny budzić adnych wątpliwości. W Pro-
     logu odpowiedź PQ nale y interpretować jako nie znaleziono niczego pasującego do
     pytania. Trzeba pamiętać, e PQ nie jest równowa ne z odpowiedzią nie — wyobraźmy
     sobie bazę danych o słynnych Grekach:
       QUQDC
UQMTCVGU
       QUQDC
CT[UVQVGNGU

       CVGPE[M
UQMTCVGU

     Mo emy zadawać następujące zapytania:
       ! CVGPE[M
UQMTCVGU
       [GU
       ! CVGPE[M
CT[UVQVGNGU
       PQ
Rozdział 1. ♦ Wprowadzenie                                                              17


       Wprawdzie być mo e Arystoteles ył niegdyś w Atenach, ale nie mo emy tego udo-
       wodnić na podstawie pokazanej bazy danych.

       A co się stanie, gdy zadamy zapytanie o relację, której nie ma w bazie danych? Za-
       łó my, e u ywamy powy szej bazy danych z relacją NWDK i zadajemy jak najbardziej
       rozsądne zapytanie:
          ! MTQN
LCPHTCPELC

       Nasza baza danych niczego nie mówi o królach, choć w bazie występują zarówno
       LCP, jak i HTCPELC. W większości systemów Prologu udzielona zostanie odpowiedź PQ,
       gdy na podstawie bazy danych nie mo na udowodnić adnych faktów dotyczących
       królów. Niemniej standard języka Prolog pozwala albo udzielić odpowiedzi PQ, albo
       przed udzieleniem takiej odpowiedzi wygenerować ostrze enie, albo mo e zostać za-
       prezentowany komunikat o błędzie. Przykładowo, gdybyśmy korzystali z naszej bazy
       danych o Grekach i zadalibyśmy zapytanie
          ! ITGM
UQMTCVGU

       to choć w naszej bazie danych jest informacja, e Sokrates to Ateńczyk, nie wystarcza
       to do udowodnienia, e jest on Grekiem: baza danych nie mówi niczego o Grekach, więc
       z punktu widzenia standardu języka dopuszczalna jest odpowiedź:
          'ZKUVGPEG GTTQT RTQEGFWTG ITGM
          PQ

       To, jak konkretny system się w takiej sytuacji zachowa, zale y od sposobu zaimple-
       mentowania w nim standardu Prologu, więc nie będziemy się tego typu szczegółami
       zajmować.

       Omówione dotąd fakty i zapytania nie są zbyt interesujące — jedyne, co potrafimy, to
       uzyskać te same informacje, które wprowadziliśmy wcześniej do bazy. Znacznie cie-
       kawsze byłoby uzyskanie odpowiedzi na pytania Co lubi Maria? czy Kto ył w Ate-
       nach? Do tego właśnie słu ą zmienne.



Zmienne
       Jeśli chcielibyśmy dowiedzieć się, co lubi Jan, bardzo nieporęcznie byłoby pytać Czy
       Jan lubi ksią ki?, Czy Jan lubi Marię? i tak dalej, a Prolog ka dorazowo udzielałby
       odpowiedzi [GU lub PQ. Znacznie rozsądniej byłoby zapytać Prolog, co lubi Jan. Od-
       powiednie pytanie miałoby postać Czy Jan lubi X? W chwili zadawania takiego za-
       pytania nie wiemy, co oznacza X; chcielibyśmy, aby to Prolog podał nam wszystkie
       mo liwości. Otó w Prologu mo emy nie tylko nazywać konkretne obiekty, ale te
       u ywać takich nazw jak X, oznaczających obiekty, które będą wskazywane przez
       Prolog. Tego typu nazwy nazywamy zmiennymi.

       Kiedy Prolog u ywa zmiennej, mo e być ona ukonkretniona lub nieukonkretniona.
       Zmienna jest ukonkretniona, jeśli odpowiada jakiemuś konkretnemu obiektowi. Zmien-
       na nie jest ukonkretniona, kiedy nie wiemy, jakiemu obiektowi mo e odpowiadać.
18                                                                Prolog. Programowanie


     Prolog odró nia zmienne od nazw konkretnych obiektów w ten sposób, e wszystkie
     nazwy zaczynające się wielkimi literami są traktowane jako zmienne.

     Kiedy Prolog otrzymuje zapytanie zawierające zmienną, przeszukuje wszystkie fakty,
     aby znaleźć obiekt, który mo e zastąpić zmienną. Kiedy zatem pytamy Czy Jan lubi X?,
     Prolog przeszukuje wszystkie fakty, by znaleźć rzeczy, które lubi Jan.

     Zmienna taka jak X nie nazywa sama konkretnego obiektu, ale mo e zastępować obiekt,
     którego nazwy nie potrafimy podać. Na przykład, nie mo emy nadać nazwy czemuś,
     co lubi Jan, więc w Prologu u ywa się tu innego zapisu; zamiast zapytania
       ! NWDK
LCP EQ  EQ NWDK ,CP

     u ywamy zmiennych:
       !NWDK
LCP:

     Zmienne w razie potrzeby mogą mieć dłu sze nazwy, na przykład poni sze zapytanie
     jest poprawne:
       ! NWDK
LCP%QUEQNWDKLCP

     Dlaczego to działa? Po prostu zmienna mo e być dowolną nazwą zaczynającą się
     wielką literą. Przyjmijmy, e mamy do czynienia z poni szą bazą faktów i zapytaniem:
       NWDK
LCPMYKCV[
       NWDK
LCPOCTKC
       NWDK
RCYGNOCTKC

       ! NWDK
LCP:

     Zapytanie interpretujemy jako Czy mamy coś, co lubi Jan? Prolog odpowie na nie:
       :MYKCV[

     i będzie czekał na dalsze instrukcje, które wkrótce te omówimy. Jak Prolog uzyskał
     powy szy wynik? Kiedy zadajemy mu powy sze zapytanie, zmienna : nie jest po-
     czątkowo ukonkretniona. Prolog przegląda bazę danych szukając faktów pasujących
     do zapytania. Póki argument jest zmienną nieukonkretnioną, mo e być zastępowany
     dowolnym innym argumentem występującym w tym samym miejscu w faktach. Pro-
     log wyszukuje dowolne fakty z predykatem NWDK i pierwszym argumentem LCP. drugi
     argument mo e być dowolny, gdy zapytanie w drugim argumencie zawiera zmienną
     nieukonkretnioną. Kiedy odpowiedni fakt zostanie znaleziony, od tej chwili : oznacza
     drugi argument znalezionego faktu. Prolog przeszukuje bazę danych w takiej kolejno-
     ści, w jakiej ją wpisano (czyli od góry do dołu), wobec czego fakt NWDK
LCPMYKCV[
     znajdowany jest jako pierwszy. Zmienna : od tej chwili oznacza obiekt MYKCV[, czyli
     jest ukonkretniona jako MYKCV[. Prolog oznacza miejsce bazy danych, w którym zna-
     leziono pasujący fakt; u ycie tego znacznika omówimy wkrótce.

     Kiedy Prolog znajduje fakt pasujący do zapytania, pokazuje obiekty podstawione pod
     zmienne. W tym wypadku była tylko jedna zmienna, :, i pasowała do obiektu MYKCV[.
     Prolog czeka na dalsze polecenia. Wciśnięcie klawisza Enter oznacza, e wystarcza
     nam znalezione rozwiązanie i dalsze ju nas nie interesują. Jeśli wciśniemy klawisz ;
     (i Enter), Prolog podejmie dalsze przeszukiwanie bazy danych zaczynając od miejsca
     wstawienia znacznika.
Rozdział 1. ♦ Wprowadzenie                                                               19


       Załó my, e po uzyskaniu od Prologu pierwszej odpowiedzi (:MYKCV[) za ądaliśmy
       wznowienia poszukiwań przez wciśnięcie . Oznacza to, e chcemy znaleźć inną od-
       powiedź na to samo zapytanie, czyli chcemy znaleźć inny obiekt, który mo na pod-
       stawić pod :. Wobec tego Prolog musi „zapomnieć”, e : oznaczało MYKCV[ i podjąć
       poszukiwania z nieukonkretnioną zmienną :. Wyszukujemy inne mo liwe rozwiąza-
       nie, więc zaczynamy od znacznika. Następny znaleziony pasujący fakt to NWDK
LCP
       OCTKC. Zmienna : jest ukonkretniana wartością OCTKC, Prolog wstawia znacznik na
       fakcie NWDK
LCPOCTKC. Prolog wyświetla :OCTKC i czeka na dalsze polecenia. Jeśli
       wpiszemy następny średnik, Prolog będzie szukał kolejnego rozwiązania. W naszym
       przykładzie nie ma ju innych obiektów, które lubiłby Jan, więc Prolog kończy wy-
       szukiwanie i pozwala zadawać kolejne zapytania lub deklarować dalsze fakty.

       Co się stanie, jeśli mając takie same fakty, jak powy ej, zadamy zapytanie:
          ! NWDK
:OCTKC

       Oznacza to pytanie Czy jakiś obiekt lubi Marię? Obiektami takimi będą LCP i RCYGN.
       Znowu w celu uzyskania wszystkich mo liwych odpowiedzi korzystamy ze średnika
       i RETURN:
           ! NWDK
:OCTKC   nasze zapytanie
           :LCP              pierwsza odpowiedź; wcisnęliśmy średnik () i RETURN
           :RCYGN            druga odpowiedź; znów wcisnęliśmy średnik ()
                               i RETURN
           PQ                  nie ma więcej odpowiedzi



Koniunkcje
       Załó my, e chcielibyśmy odpowiadać na zapytania dotyczące bardziej zło onych
       relacji, na przykład takich: Czy Jan i Maria lubią się nawzajem? Jednym ze sposobów
       realizacji takiego zapytania byłoby zapytanie, czy Jan lubi Marię, a jeśli Prolog od-
       powiedziałby [GU, zapytanie, czy Maria lub Jana. Tak więc problem składa się z dwóch
       odrębnych celów, które Prolog musi wykazać. Kombinacje tego typu są wśród pro-
       gramistów Prologu wyjątkowo rozpowszechnione, więc wymyślono dla nich specjalną
       notację. Załó my, e mamy bazę danych:
          NWDK
OCTKCEGMQNCFC
          NWDK
OCTKCYKPQ
          NWDK
LCPYKPQ
          NWDK
LCPOCTKC

       Chcemy wiedzieć czy Jan i Maria lubią się nawzajem. W tym celu pytamy Czy Jan lubi
       Marię? i Czy Maria lubi Jana?. Spójnik i oznacza, e interesuje nas koniunkcja celów:
       chcemy spełnić je obydwa. W Prologu spójnik ten zapisujemy jako przecinek ():
          ! NWDK
LCPOCTKC NWDK
OCTKCLCP
20                                                                  Prolog. Programowanie


     Przecinek czytamy jako i, mo na za jego pomocą rozdzielać dowolną liczbę celów,
     które mają być spełnione w celu udzielenia odpowiedzi na pytanie. Kiedy Prolog
     otrzymuje ciąg celów (rozdzielonych przecinkami), stara się spełnić wszystkie cele,
     znajdując pasujące do nich cele z bazy danych. Aby spełniona była cała sekwencja,
     spełnione muszą być wszystkie cele składowe. Jeśli do pokazanej powy ej bazy za-
     damy powy sze zapytanie, odpowiedzią będzie PQ. Pierwszy cel jest prawdziwy, bo
     mamy w bazie informację, e Jan lubi Marię, ale nie występuje nigdzie fakt NWDK
OCTKC
     LCP. Skoro chcieliśmy wiedzieć, czy lubią się nawzajem, odpowiedź na całe zapyta-
     nie brzmi PQ.

     Korzystając ze zmiennych i koniunkcji, mo emy tworzyć naprawdę zło one zapyta-
     nia. Wiemy ju , e nie mo na udowodnić, i Jan i Maria lubią się nawzajem, więc
     chcielibyśmy wiedzieć, czy istnieje coś, co oboje lubią: Czy istnieje coś, co lubi za-
     równo Jan, jak i Maria? Zapytanie takie składa się z dwóch celów:
          Najpierw sprawdzamy czy istnieje jakiś obiekt : lubiany przez Marię.
          Następnie sprawdzamy czy Jan tak e lubi :, cokolwiek by to było.

     Powy sze dwa cele w Prologu mo na zapisać jako koniunkcję:
       ! NWDK
OCTKC: NWDK
LCP:

     Prolog najpierw próbuje spełnić pierwszy cel zapytania. Jeśli zostanie on znaleziony
     w bazie danych, miejsce w bazie danych zostanie zaznaczone i Prolog spróbuje speł-
     nić drugi cel. Jeśli on te zostanie spełniony, Prolog oznaczy miejsce tego celu w ba-
     zie danych i mamy ju rozwiązanie. Najwa niejsze, o czym trzeba pamiętać to to, e
     ka dy cel wstawia do bazy osobną zakładkę.

     Jeśli drugi cel nie zostanie jednak spełniony, Prolog będzie się starał spełnić inaczej
     cel poprzedni (w tym wypadku pierwszy). Pamiętajmy, e Prolog dla ka dego celu
     przeszukuje całą bazę danych. Jeśli fakt z bazy danych zostanie dopasowany, Prolog
     zaznaczy to miejsce, na wypadek gdyby potrzebne było ponowne dopasowywanie te-
     go celu. Kiedy jednak trzeba inaczej dopasować cel, Prolog zaczyna przeszukiwanie
     od znacznika celu, nie od początku bazy danych. Nasze powy sze zapytanie Czy ist-
     nieje coś, co lubi Maria i jednocześnie lubi to Jan?, stanowi przykład u ycia mecha-
     nizmu nawracania:
       1. W bazie danych odszukiwany jest pierwszy cel. Kiedy drugi argument : jest
          nieukonkretniony, mo e przybrać dowolną wartość. Pierwszym znalezionym
          dopasowaniem jest NWDK
OCTKCEGMQNCFC. Wobec tego od tej chwili :
          przybiera wartość LGFGPKG wszędzie tam, gdzie pojawia się :. Prolog
          oznacza w bazie danych miejsce znalezienia faktu na wypadek, gdyby
          konieczne było wznowienie wyszukiwania.
       2. W bazie danych szuka się faktu NWDK
LCPEGMQNCFC. Wynika to stąd,
          e następnym celem jest NWDK
LCP:, zaś : oznacza teraz EGMQNCFC.
          Faktu takiego w bazie nie ma, więc cel zawodzi i Prolog stara się znaleźć inne
          dopasowanie NWDK
OCTKC:, tym razem jednak przeszukiwanie bazy zaczyna
          się od zaznaczonego miejsca. Najpierw konieczne jest cofnięcie ukonkretnienia
          zmiennej :, aby ponownie mogła przybrać dowolną wartość.
Rozdział 1. ♦ Wprowadzenie                                                                  21


         3. Oznaczone miejsce to NWDK
OCTKCEGMQNCFC, więc od tego faktu zaczyna się
            dalsze wyszukiwanie. Nie doszliśmy jeszcze do końca bazy, więc mo na dalej
            sprawdzać co lubi Maria; następny pasujący fakt to NWDK
OCTKCYKPQ.
            Zmienna : otrzymuje teraz wartość YKPQ, Prolog ponownie oznacza miejsce
            wystąpienia tego faktu.
         4. Tak jak poprzednio, Prolog stara się uzgodnić drugi cel, tym razem szukając
            faktu NWDK
LCPYKPQ. Tego celu Prolog nie próbuje uzgadniać z innymi
            wartościami; cel jest nowy, więc przeszukiwana jest cała baza danych.
            Fakt zostaje szybko znaleziony i Prolog generuje odpowiedni komunikat.
            Cel został uzgodniony, więc Prolog oznacza odpowiednie miejsce w bazie
            danych, aby w razie potrzeby zacząć dalsze przeszukiwanie od tego miejsca.
            W bazie danych znajdują się znaczniki wszystkich celów, które Prolog
            uzgadniał.
         5. W tej chwili spełnione są ju oba cele, zmiennej : odpowiada nazwa YKPQ.
            Pierwszy cel spowodował zaznaczenie w bazie danych faktu
            NWDK
OCTKCYKPQ, a drugi — faktu NWDK
LCPYKPQ.

       Tak jak w przypadku wszystkich zapytań, Prolog odnajduje pierwszą odpowiedź, za-
       trzymuje się i czeka na dalsze instrukcje. Jeśli wpiszemy, poszukiwanie rozwiązań
       będzie kontynuowane. Wiemy, e odbywa się to przez próby innego spełnienia oby-
       dwóch zadanych celów od zostawionych wcześniej znaczników.

       Reasumując, koniunkcję celów interpretujemy od strony lewej do prawej, poszcze-
       gólne cele rozdzielamy przecinkami. Ka dy cel mo e mieć lewego i prawego sąsiada.
       Oczywiście pierwszy cel nie ma sąsiada lewego, a ostatni — prawego. Kiedy Prolog ma
       do czynienia z koniunkcją celów, stara się spełnić je kolejno, od lewej do prawej. Jeśli
       cel zostaje spełniony, Prolog umieszcza w bazie danych znacznik w miejscu z tym
       celem powiązanym — mo na na to patrzeć jak na narysowanie strzałki od celu do
       spełniającego go miejsca w bazie danych, przy tym ukonkretniane są wszystkie nie-
       ukonkretnione dotąd zmienne. Wszystko to ma miejsce w pierwszym kroku powy -
       szego wyliczenia. Jeśli zmienna jest ukonkretniana, ukonkretniane są od razu wszyst-
       kie jej wystąpienia. Następnie Prolog stara się uzgodnić prawego sąsiada danego celu
       zaczynając poszukiwanie rozwiązań od początku bazy danych.

       Spełniane są kolejno wszystkie cele, przy czym w bazie danych zostawiane są znacz-
       niki (czyli w naszym przykładzie rysujemy strzałki od celów do odpowiednich fak-
       tów). Kiedy któryś cel zawodzi (nie mo na znaleźć pasującego do niego faktu), Pro-
       log się cofa i stara się inaczej uzgodnić lewego sąsiada, zaczynając poszukiwanie od
       jego znacznika. W takiej chwili wycofywane jest ukonkretnienie wszystkich zmien-
       nych, które miało miejsce w czasie realizacji sąsiedniego celu. Kiedy nie udaje się
       uzgodnić kolejnych celów, do których dochodzimy teraz od prawej strony, Prolog
       wycofuje się w lewo, a kiedy braknie lewego sąsiada, cała koniunkcja zawodzi. Ta-
       kie próby wycofywania się i uzgadniania kolejnych celów koniunkcji nazywamy na-
       wracaniem. Nawracanie omówimy jeszcze w następnym rozdziale, a dokładnie zro-
       bimy to w rozdziale 4.

       Badając przykłady, dla wygody mo emy zapisywać pod ka dą zmienną z celu war-
       tość, na jaką zmienna ta została ukonkretniona. Warto te rysować strzałkę od celu do
22                                                             Prolog. Programowanie


     jego znacznika w bazie danych. Poni ej pokazano cztery rysunki, które pomogą zro-
     zumieć przedstawiony przykład. Na ka dym rysunku pokazano całą bazę danych
     i zapytanie wraz z ponumerowanymi komentarzami. Cele ju uzgodnione dodatkowo
     obramowano.
Rozdział 1. ♦ Wprowadzenie                                                               23




          :YKPQ

       W całej tej ksią ce postaramy się pokazać, gdzie w przykładach zachodzi nawracanie
       i jak wpływa ono na sposób rozwiązywania problemów. Nawracanie jest tak wa ne,
        e poświęcimy mu cały rozdział 4.

       Ćwiczenie 1.1. Poprowadź dalej powy szą analizę obrazkową zakładając, e odpowie-
       dzieliśmy systemowi średnikiem nakazującym znaleźć inne rozwiązania zapytania.



Reguły
       Załó my, e chcemy zapisać fakt, e Jan lubi wszystkich ludzi. Jednym ze sposobów
       byłoby zapisanie szeregu kolejnych faktów:
          NWDK
LCPCNHTGF
          NWDK
LCPDGTVTCPF
          NWDK
LCPE[T[N
          NWDK
LCPFCYKF

       Jednak jest to rozwiązanie niewygodne, szczególnie jeśli w bazie danych mamy setki
       ludzi. Innym sposobem byłoby stwierdzenie, e Jan lubi wszystkie obiekty będące
       osobami. Fakt taki ma postać reguły mówiącej, kogo lubi Jan. Taki zapis jest bardziej
       zwarty od wypisywania kolejno wszystkich osób lubianych przez Jana.

       W Prologu reguł u ywa się do zapisania, e jakiś fakt zale y od grupy innych faktów.
       W języku polskim do stworzenia reguły u ywamy słówka „jeśli”, na przykład:
            U ywam parasola, jeśli pada.
            Jan kupuje wino, jeśli jest ono tańsze od piwa.

       Reguł u ywa się te do zapisywania definicji, na przykład:
            X jest ptakiem jeśli:
               X jest zwierzęciem i
               X ma pióra.
24                                                               Prolog. Programowanie


     lub
             X jest siostrą Y, jeśli:
                X jest kobietą i
                X i Y mają takich samych rodziców.

     W powy szych definicjach zapisanych w języku naturalnym u yto zmiennych X i Y.
     Trzeba pamiętać, e zmienne oznaczają te same obiekty we wszystkich wystąpieniach
     w regule; gdyby było inaczej, byłoby to niezgodne z duchem definicji w ogóle. Na
     przykład w powy szej regule opisującej ptaka nie mo na wykazać, e Fred jest pta-
     kiem tylko dlatego, e Fido jest zwierzęciem, a Maria ma pióra. Ta sama zasada jed-
     nolitej interpretacji zmiennych obowiązuje tak e w regułach Prologu. Jeśli : w jed-
     nym miejscu oznacza Freda, to wszystkie : w tej samej regule oznaczają te Freda.

     Reguła to ogólne stwierdzenie dotyczące obiektów i ich powiązań. Mo emy na przy-
     kład powiedzieć, e Fred jest ptakiem, jeśli Fred jest zwierzęciem i Fred ma pióra,
     oraz e Bertrand jest ptakiem, jeśli Bertrand jest zwierzęciem i Bertrand ma pióra.
     Mo emy zatem pozwolić, by zmienna miała ró ne wartości w przypadkach u ycia re-
     guły, zaś w samej regule musi być interpretowana jednolicie.

     Przyjrzyjmy się teraz kilku przykładom, począwszy od reguły z jedną zmienną i z ko-
     niunkcją.
             Jan lubi ka dego, kto lubi wino,
     czyli
             Jan lubi wszystko, jeśli to lubi wino,
     a gdy zapiszemy to samo za pomocą zmiennych
             Jan lubi X, jeśli X lubi wino.

     W Prologu reguła składa się z głowy i treści, które połączone są symbolem składają-
     cym się z dwukropka i myślnika (). Powy szą regułę mo na zatem zapisać nastę-
     pująco:
       NWDK
LCP:  NWDK
:YKPQ

     Nale y zauwa yć, e reguły tak e kończą się MTQRMæ. Głowa powy szej reguły to NW
     DK
LCP:. Treść, tym razem NWDK
:YKPQ, zawiera koniunkcję celów, które muszą
     być spełnione, aby głowa była prawdziwa. Mo emy na przykład uczynić Jana osobą
     staranniej szukającą obiektów sympatii, dodając do treści reguły więcej celów roz-
     dzielonych RTGEKPMCOK:
       NWDK
LCP:  NWDK
:YKPQ NWDK
:LGFGPKG

     Oznacza to, e Jan lubi wszystkich, którzy lubią wino i jedzenie. Załó my teraz, e
     Jan lubi panie, które lubią wino:
       NWDK
LCP:  MQDKGVC
: NWDK
:YKPQ

     Zawsze kiedy analizujemy regułę Prologu, musimy zwrócić uwagę na to, gdzie znaj-
     dują się w niej zmienne. W powy szej regule trzykrotnie u yto zmiennej :. Kiedy
Rozdział 1. ♦ Wprowadzenie                                                              25


       zmienna ta jest ukonkretniana jakimś obiektem, jest ukonkretniana w całym swoim
       zakresie obowiązywania. W konkretnych przypadkach u ycia reguły zakres obowią-
       zywania to cała reguła, od głowy do kropki na końcu. Wobec tego, jeśli w powy szej
       regule zmienna : zostanie ukonkretniona, aby wskazywała Marię, Prolog będzie starał
       się uzgodnić cele MQDKGVC
OCTKC i NWDK
OCTKCYKPQ.

       Następnie przyjrzyjmy się regule, w której u ywana jest więcej ni jedna zmienna.
       Niech baza danych zawiera fakty dotyczące rodziny królowej Wiktorii. Będziemy ko-
       rzystać z predykatu TQFKEG mającego trzy argumenty: TQFKEG
:; oznacza, e
       rodzice X to Y i Z. Drugi argument to matka, a trzeci to ojciec. U yjemy te predyka-
       tów MQDKGVC i OGE[PC, które nie wymagają objaśnienia. Oto przykład części za-
       wartości bazy:
          OGE[PC
CNDGTV
          OGE[PC
GFYCTF

          MQDKGVC
CNKELC
          MQDKGVC
YKMVQTKC

          TQFKEG
GFYCTFYKMVQTKCCNDGTV
          TQFKEG
CNKELCYKMVQTKCCNDGTV

       Teraz u yjemy opisanej wcześniej reguły dotyczącej siostry. W regule tej definiujemy
       dwuargumentowy predykat UKQUVTC
:; mówiący, e : jest siostrą ;. : jest siostrą ;,
       je eli:
            : jest kobietą,
            matką : jest /, a ojcem 1,
            ; ma takich samych matkę i ojca, jak :.

       Mo emy zapisać zatem następującą regułę:
          UKQUVTC
:; 
             MQDKGVC
:
             TQFKEG
:/1
             TQFKEG
;/1

       Albo tę samą regułę mo na zapisać w jednym wierszu:
          UKQUVTC
:;  MQDKGVC
: TQFKEG
:/1 TQFKEG
;/1

       Matkę i ojca oznaczają zmienne / i 1, choć moglibyśmy u yć te zmiennych /CVMC
       i 1LEKGE. Zauwa my, e te zmienne nie występują w głowie reguły; niemniej są trak-
       towane tak samo, jak wszelki inne zmienne. Kiedy Prolog u ywa reguły, zmienne /
       i 1 początkowo są nieukonkretnione, więc podczas pierwszego dopasowywania celu
       TQFKEG
:/1 są im przypisywane wartości. Kiedy jednak ju raz zostaną ukonkret-
       nione, ukonkretnienie to dotyczy wszystkich wystąpień / i 1 w całej regule. Poni szy
       przykład pomo e zrozumieć sposób u ycia tych zmiennych. Zadajmy zapytanie:
          ! UKQUVTC
CNKELCGFYCTF
26                                                                  Prolog. Programowanie


     Prolog będzie przetwarzał takie zapytanie następująco:
       1. Najpierw zapytanie dopasowywane jest do głowy reguły UKUVGT, więc :
          ukonkretniana jest jako CNKELC, a ; jako GFYCTF. Znacznik odpowiadający
         zapytaniu umieszczony jest na znalezionej regule. Następnie Prolog próbuje
         spełnić kolejno trzy cele z treści reguły.
       2. Pierwszym celem jest MQDKGVC
CNKELC, gdy wcześniej : ukonkretniono
          wartością CNKELC. Cel jest prawdziwy, gdy istnieje odpowiedni fakt w bazie,
         więc ten cel nie zawodzi. W tej sytuacji Prolog oznacza odpowiednie miejsce
         w bazie danych (trzeci zapis). Nie dochodzi do ukonkretnienia adnych
         dodatkowych zmiennych i Prolog przechodzi do uzgadniania następnego celu.
       3. Prolog szuka faktu TQFKEG
CNKELC/1, gdzie / i 1 dopiero mają być
          ukonkretnione. Znaleziony zostaje fakt TQFKEG
CNKELCYKMVQTKCCNDGTV,
         więc cel jest uzgodniony. Prolog oznacza w bazie danych szóstą pozycję,
         ukonkretnia / wartością YKMVQTKC i 1 wartością CNDGTV (mo na ponownie
         u yć zapisu wartości pod celem). Prolog przechodzi do uzgadniania
         następnego celu.
       4. Obecnie Prolog szuka faktu TQFKEG
GFYCTFYKMVQTKCCNDGTV, gdy ju
          w zapytaniu ukonkretniono ; jako GFYCTF, zaś w poprzednim kroku
          ukonkretniono / i 1. Cel udaje się uzgodnić, oznaczany jest odpowiedni fakt
         (piąty w bazie). Jako e był to ostatni cel koniunkcji, cała koniunkcja jest
         prawdziwa i fakt UKQUVTC
CNKELCGFYCTF uznawany jest za prawdziwy,
         wobec czego Prolog odpowiada [GU.

     Załó my teraz, e interesuje nas czy Alicja jest czyjąś siostrą; odpowiednie zapytanie
     ma postać
       ! UKQUVTC
CNKELC:

     Prolog postąpi w następujący sposób:
       1. Zapytanie pasuje do głowy reguły UKQUVTC; zmienna : reguły jest ukonkretniana
          wartością CNKELC. Zmienna : zapytania pozostaje nieukonkretniona, więc
          nieukonkretniona jest te zmienna ; reguły. Zmienne te jednak zostają ze sobą
         powiązane: kiedy jedna z nich zostanie ukonkretniona, druga zostanie
         ukonkretniona tak samo. Na razie jednak obie są jeszcze wolne.
       2. Pierwszy cel, MQDKGVC
CNKELC, udaje się uzgodnić jak poprzednio.
       3. Drugi cel to TQFKEG
CNKELC/1, jest on dopasowywany do faktu
          TQFKEG
CNKELCYKMVQTKCGFYCTF. Znamy ju zatem wartości zmiennych / i 1.
       4. Wartość ; nie jest jeszcze znana, więc trzecim celem jest
          TQFKEG
;YKMVQTKCCNDGTV. Cel ten dopasowywany jest do faktu
          TQFKEG
GFYCTFYKMVQTKCCNDGTV, więc zmienna ; ukonkretniona
          jest wartością GFYCTF.
       5. Cel jest uzgodniony, więc uzgodniona jest cała reguła z wartościami : jako
          CNKELC (znana z zapytania) i ; jako GFYCTF. Jako e zmienna ; z reguły jest
          powiązana ze zmienną : z zapytania, : tak e ma wartość GFYCTF. Prolog
          wyświetla wynik, :GFYCTF.
Rozdział 1. ♦ Wprowadzenie                                                                   27


       Jak zwykle, Prolog czeka na decyzję, czy ma szukać kolejnych rozwiązań zapytania.
       To akurat zapytanie, które zadaliśmy, więcej rozwiązań ju nie ma, zaś sposób dojścia
       Prologu do tego wniosku jest przedmiotem ćwiczenia z końca niniejszego rozdziału.

       Jak widzieliśmy, Prolog mo e pobierać informacje o predykacie NWDK w dwóch posta-
       ciach: mo emy podawać fakty i reguły. Ogólnie rzecz biorąc, predykat definiuje się
       jako zbiór faktów i reguł; jedne i drugie nazywamy klauzulami predykatu. Słowa klau-
       zula u ywać będziemy zawsze mając na myśli fakt lub regułę.

       Zastanówmy się teraz nad następującym zagadnieniem: dana osoba mo e coś ukraść,
       jeśli jest złodziejem i coś lubi, zaś to coś jest wartościowe. W Prologu zapisujemy to:
          OQGAWMTCUE
26  NQFKGL
2 NWDK
26

       U ywamy dwuargumentowego predykatu OQGAWMTCUE, gdzie 2 oznacza potencjalne-
       go złodzieja, a 6 kradzioną rzecz. Reguła ta opiera się na klauzulach NQFKGL i NWDK;
       obie one mogą być zapisane jako mieszanina faktów i reguł. Przyjmijmy, e baza da-
       nych jest taka sama jak poprzednio, ale między symbole
wstawiliśmy numery
       klauzul. Pokazane symbole słu ą do zapisu komentarzy. Komentarze są przez Prolog
       pomijane, ale mo na je dodawać do programu, aby zwiększyć jego czytelność. Dalej
       będziemy odwoływać się do umieszczonych w komentarzach numerów klauzul.
NQFKGL
LCP

More Related Content

What's hot

Język C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyJęzyk C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyWydawnictwo Helion
 
Znajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania koduZnajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania koduWydawnictwo Helion
 
Asembler. Sztuka programowania
Asembler. Sztuka programowaniaAsembler. Sztuka programowania
Asembler. Sztuka programowaniaWydawnictwo Helion
 
Efektywne programowanie w języku Java
Efektywne programowanie w języku JavaEfektywne programowanie w języku Java
Efektywne programowanie w języku JavaWydawnictwo Helion
 
Perełki programowania gier. Vademecum profesjonalisty. Tom 2
Perełki programowania gier. Vademecum profesjonalisty. Tom 2Perełki programowania gier. Vademecum profesjonalisty. Tom 2
Perełki programowania gier. Vademecum profesjonalisty. Tom 2Wydawnictwo Helion
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIWydawnictwo Helion
 
Marketing internetowy w wyszukiwarkach
Marketing internetowy w wyszukiwarkachMarketing internetowy w wyszukiwarkach
Marketing internetowy w wyszukiwarkachWydawnictwo Helion
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowaneWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Photoshop 7. Leksykon kieszonkowy
Photoshop 7. Leksykon kieszonkowyPhotoshop 7. Leksykon kieszonkowy
Photoshop 7. Leksykon kieszonkowyWydawnictwo Helion
 

What's hot (20)

ActionScript. Receptury
ActionScript. RecepturyActionScript. Receptury
ActionScript. Receptury
 
Język C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalistyJęzyk C. Wskaźniki. Vademecum profesjonalisty
Język C. Wskaźniki. Vademecum profesjonalisty
 
Po prostu Pajączek 5 NxG
Po prostu Pajączek 5 NxGPo prostu Pajączek 5 NxG
Po prostu Pajączek 5 NxG
 
Znajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania koduZnajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania kodu
 
Asembler. Sztuka programowania
Asembler. Sztuka programowaniaAsembler. Sztuka programowania
Asembler. Sztuka programowania
 
Efektywne programowanie w języku Java
Efektywne programowanie w języku JavaEfektywne programowanie w języku Java
Efektywne programowanie w języku Java
 
PHP5. Praktyczny kurs
PHP5. Praktyczny kursPHP5. Praktyczny kurs
PHP5. Praktyczny kurs
 
PHP. Programowanie
PHP. ProgramowaniePHP. Programowanie
PHP. Programowanie
 
Perełki programowania gier. Vademecum profesjonalisty. Tom 2
Perełki programowania gier. Vademecum profesjonalisty. Tom 2Perełki programowania gier. Vademecum profesjonalisty. Tom 2
Perełki programowania gier. Vademecum profesjonalisty. Tom 2
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie III
 
Marketing internetowy w wyszukiwarkach
Marketing internetowy w wyszukiwarkachMarketing internetowy w wyszukiwarkach
Marketing internetowy w wyszukiwarkach
 
Delphi. Szybki start
Delphi. Szybki startDelphi. Szybki start
Delphi. Szybki start
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
 
Java. Potrzaski
Java. PotrzaskiJava. Potrzaski
Java. Potrzaski
 
ABC Delphi 7
ABC Delphi 7ABC Delphi 7
ABC Delphi 7
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
C#. Ćwiczenia
C#. ĆwiczeniaC#. Ćwiczenia
C#. Ćwiczenia
 
C. Leksykon kieszonkowy
C. Leksykon kieszonkowyC. Leksykon kieszonkowy
C. Leksykon kieszonkowy
 
Photoshop 7. Leksykon kieszonkowy
Photoshop 7. Leksykon kieszonkowyPhotoshop 7. Leksykon kieszonkowy
Photoshop 7. Leksykon kieszonkowy
 

Similar to Prolog. Programowanie

Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaWydawnictwo Helion
 
Czytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open sourceCzytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open sourceWydawnictwo Helion
 
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowejProjektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowejWydawnictwo Helion
 
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Wydawnictwo Helion
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowaniaWydawnictwo Helion
 
Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduJava. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduWydawnictwo Helion
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaWydawnictwo Helion
 
Algorytmy, struktury danych i techniki programowania. Wydanie III
Algorytmy, struktury danych i techniki programowania. Wydanie IIIAlgorytmy, struktury danych i techniki programowania. Wydanie III
Algorytmy, struktury danych i techniki programowania. Wydanie IIIWydawnictwo Helion
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuWydawnictwo Helion
 
Projektowanie i analiza algorytmów
Projektowanie i analiza algorytmówProjektowanie i analiza algorytmów
Projektowanie i analiza algorytmówWydawnictwo Helion
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Wydawnictwo Helion
 
Linux. Niezbędnik programisty
Linux. Niezbędnik programistyLinux. Niezbędnik programisty
Linux. Niezbędnik programistyWydawnictwo Helion
 

Similar to Prolog. Programowanie (20)

Język C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowaniaJęzyk C++. Koncepcje i techniki programowania
Język C++. Koncepcje i techniki programowania
 
Czytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open sourceCzytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open source
 
Język C. Programowanie
Język C. ProgramowanieJęzyk C. Programowanie
Język C. Programowanie
 
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowejProjektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
Projektowanie oprogramowania. Wstęp do programowania i techniki komputerowej
 
Programowanie. Od podstaw
Programowanie. Od podstawProgramowanie. Od podstaw
Programowanie. Od podstaw
 
Java. Kompendium programisty
Java. Kompendium programistyJava. Kompendium programisty
Java. Kompendium programisty
 
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
 
Java. Rozmówki
Java. RozmówkiJava. Rozmówki
Java. Rozmówki
 
C++. Inżynieria programowania
C++. Inżynieria programowaniaC++. Inżynieria programowania
C++. Inżynieria programowania
 
Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduJava. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
 
Po prostu PowerPoint 2003 PL
Po prostu PowerPoint 2003 PLPo prostu PowerPoint 2003 PL
Po prostu PowerPoint 2003 PL
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowania
 
Algorytmy, struktury danych i techniki programowania. Wydanie III
Algorytmy, struktury danych i techniki programowania. Wydanie IIIAlgorytmy, struktury danych i techniki programowania. Wydanie III
Algorytmy, struktury danych i techniki programowania. Wydanie III
 
Po prostu Word 2003 PL
Po prostu Word 2003 PLPo prostu Word 2003 PL
Po prostu Word 2003 PL
 
JavaScript. Projekty
JavaScript. ProjektyJavaScript. Projekty
JavaScript. Projekty
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładu
 
Po prostu Excel 2003 PL
Po prostu Excel 2003 PLPo prostu Excel 2003 PL
Po prostu Excel 2003 PL
 
Projektowanie i analiza algorytmów
Projektowanie i analiza algorytmówProjektowanie i analiza algorytmów
Projektowanie i analiza algorytmów
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
 
Linux. Niezbędnik programisty
Linux. Niezbędnik programistyLinux. Niezbędnik programisty
Linux. Niezbędnik programisty
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

Prolog. Programowanie

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI Prolog. Programowanie KATALOG KSI¥¯EK Autorzy: W. F. Clocksin, C. S. Mellish T³umaczenie: Tomasz ¯mijewski KATALOG ONLINE ISBN: 83-7197-918-5 Tytu³ orygina³u: Programming in Prolog ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 274 TWÓJ KOSZYK DODAJ DO KOSZYKA Programowanie w Prologu ró¿ni siê zasadniczo od programowania w jêzykach strukturalnych, takich jak Pascal czy C i jêzykach obiektowych jak Java. Dla wielu osób zaczynaj¹cych przygodê z Prologiem zaskoczeniem jest fakt, ¿e pisanie programu CENNIK I INFORMACJE w tym jêzyku nie polega na kodowaniu algorytmu. Programista opisuje obiekty i zwi¹zki miêdzy nimi, a tak¿e podaje warunki, jakie powinno spe³niaæ szukane rozwi¹zanie. ZAMÓW INFORMACJE System sam przeprowadza obliczenia w oparciu o podane zale¿no ci logiczne, za O NOWO CIACH programista jedynie czê ciowo mo¿e wp³ywaæ na sposób dzia³ania programu. Ksi¹¿ka „Prolog. Programowanie” to podrêcznik tego niezwyk³ego jêzyka ZAMÓW CENNIK programowania stosowanego przy rozwi¹zywaniu problemów z ró¿nych dziedzin: od logiki matematycznej i symbolicznego rozwi¹zywania równañ przez analizê jêzyka naturalnego, a¿ do zagadnieñ zwi¹zanych ze sztuczn¹ inteligencj¹. Zawiera ona: CZYTELNIA • Wprowadzenie do Prologu • Podstawowe struktury danych FRAGMENTY KSI¥¯EK ONLINE • Nawracanie, sterowanie nawracaniem za pomoc¹ symbolu odciêcia • Operacje wej cia/wyj cia • Predykaty • Sk³adniê regu³ gramatycznych i analizê jêzyka naturalnego • Wiele przyk³adowych programów Wszystkim rozdzia³om towarzysz¹ æwiczenia. Uzupe³nieniem tekstu ksi¹¿ki s¹ dodatki omawiaj¹ce m.in. rozwi¹zania æwiczeñ i ró¿nice miêdzy najwa¿niejszymi wersjami Prologu. „Prolog. Programowanie” to ksi¹¿ka dla studentów matematyki i informatyki, a tak¿e dla wszystkich zainteresowanych programowaniem opartym na regu³ach logicznych. Je li chcesz podj¹æ wyzwanie i nauczyæ siê Prologu, jest ksi¹¿ka dla Ciebie. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. Spis treści Wstęp ............................................................................................... 7 Rozdział 1. Wprowadzenie ................................................................................. 11 Prolog....................................................................................................................11 Obiekty i relacje .....................................................................................................12 Programowanie.......................................................................................................13 Fakty .....................................................................................................................14 Zapytania ...............................................................................................................16 Zmienne.................................................................................................................17 Koniunkcje.............................................................................................................19 Reguły ...................................................................................................................23 Podsumowanie i ćwiczenia ......................................................................................28 Rozdział 2. Prolog z bliska ................................................................................. 31 Składnia.................................................................................................................31 Stałe ................................................................................................................32 Zmienne...........................................................................................................32 Struktury..........................................................................................................33 Znaki .....................................................................................................................34 Operatory...............................................................................................................35 Równość i unifikacja...............................................................................................37 Arytmetyka ............................................................................................................38 Spełnianie celów — podsumowanie..........................................................................42 Udane spełnienie koniunkcji celów .....................................................................42 Cele i nawracanie..............................................................................................45 Unifikacja ........................................................................................................47 Rozdział 3. Korzystanie ze struktur danych......................................................... 49 Struktury a drzewa..................................................................................................49 Listy ......................................................................................................................51 Przeszukiwanie rekurencyjne ...................................................................................54 Odwzorowania .......................................................................................................57 Porównywanie rekurencyjne....................................................................................60 Łączenie struktur ....................................................................................................62 Akumulatory ..........................................................................................................66 Struktury ró nicowe................................................................................................68 Rozdział 4. Nawracanie i odcięcie...................................................................... 71 Generowanie wielu rozwiązań..................................................................................72 Odcięcie.................................................................................................................75
  • 3. 4 Prolog. Programowanie Typowe zastosowania odcięcia.................................................................................80 Potwierdzanie wyboru reguły .............................................................................80 U ycie odcięcia z predykatem fail ......................................................................84 Kończenie generowania mo liwych rozwiązań i ich sprawdzanie ..........................86 Niebezpieczeństwa wynikające ze stosowania odcięcia ..............................................89 Rozdział 5. Wejście i wyjście ............................................................................. 91 Czytanie i pisanie termów........................................................................................92 Czytanie termów...............................................................................................92 Pisanie termów .................................................................................................93 Czytanie i pisanie znaków .......................................................................................96 Czytanie znaków...............................................................................................96 Pisanie znaków .................................................................................................97 Wczytywanie zdań..................................................................................................98 Czytanie z plików i pisanie do plików..................................................................... 101 Otwieranie i zamykanie strumieni..................................................................... 102 Zmiana bie ącego strumienia wejściowego i wyjściowego.................................. 103 Konsultowanie................................................................................................ 104 Deklarowanie operatorów...................................................................................... 105 Rozdział 6. Predykaty wbudowane ................................................................... 107 Wprowadzanie nowych klauzul.............................................................................. 107 Sukces i pora ka................................................................................................... 109 Klasyfikacja termów ............................................................................................. 110 Przetwarzanie klauzul jako termów ........................................................................ 111 Tworzenie składników struktur i sięganie do nich .................................................... 114 Wpływ na nawracanie ........................................................................................... 118 Tworzenie celów zło onych................................................................................... 119 Równość.............................................................................................................. 122 Wejście i wyjście .................................................................................................. 122 Obsługa plików..................................................................................................... 124 Wyliczanie wyra eń arytmetycznych...................................................................... 124 Porównywanie termów.......................................................................................... 126 Badanie działania Prologu ..................................................................................... 127 Rozdział 7. Przykładowe programy ................................................................... 129 Sortowany słownik w formie drzewa ...................................................................... 129 Przeszukiwanie labiryntu ....................................................................................... 132 Wie e Hanoi......................................................................................................... 135 Program magazynowy........................................................................................... 136 Przetwarzanie list.................................................................................................. 137 Zapis i przetwarzanie zbiorów................................................................................ 140 Sortowanie ........................................................................................................... 142 U ycie bazy danych .............................................................................................. 145 random .......................................................................................................... 145 gensym .......................................................................................................... 146 findall ............................................................................................................ 147 Przeszukiwanie grafów.......................................................................................... 149 Odsiej Dwójki i odsiej Trójki................................................................................. 153 Ró niczkowanie symboliczne ................................................................................ 155 Odwzorowywanie struktur i przekształcanie drzew .................................................. 157 Przetwarzanie programów ..................................................................................... 160 Literatura ............................................................................................................. 163
  • 4. Spis treści 5 Rozdział 8. Usuwanie błędów w programach prologowych................................. 165 Układ programów ................................................................................................. 166 Typowe błędy....................................................................................................... 168 Śledzenie programu............................................................................................... 171 Śledzenie i punkty kontrolne .................................................................................. 177 Sprawdzanie celu ............................................................................................ 179 Sprawdzanie przodków.................................................................................... 180 Zmiana poziomu śledzenia............................................................................... 181 Zmiana sposobu spełnienia celu........................................................................ 182 Inne opcje ...................................................................................................... 183 Podsumowanie ............................................................................................... 184 Poprawianie błędów .............................................................................................. 184 Rozdział 9. Użycie reguł gramatycznych w Prologu ........................................... 187 Parsowanie........................................................................................................... 187 Problem parsowania w Prologu .............................................................................. 190 Notacja reguł gramatyki ........................................................................................ 194 Dodatkowe argumenty .......................................................................................... 196 Dodatkowe warunki .............................................................................................. 199 Podsumowanie ..................................................................................................... 201 Przekształcanie języka na logikę............................................................................. 202 Ogólniejsze zastosowanie reguł gramatyki .............................................................. 204 Rozdział 10. Prolog a logika............................................................................... 207 Krótkie wprowadzenie do rachunku predykatów...................................................... 207 Postać klauzulowa................................................................................................. 210 Zapis klauzul ........................................................................................................ 215 Rezolucja i dowodzenie twierdzeń.......................................................................... 216 Klauzule Horna .................................................................................................... 220 Prolog.................................................................................................................. 220 Prolog i programowanie w logice ........................................................................... 222 Rozdział 11. Projekty w Prologu......................................................................... 225 Łatwiejsze projekty............................................................................................... 225 Projekty zaawansowane ........................................................................................ 227 Dodatek A Odpowiedzi do niektórych ćwiczeń.................................................. 231 Dodatek B Klauzulowa postać programów ....................................................... 235 Dodatek C Przenośne programy w standardowym Prologu ................................ 241 Przenośność standardu Prologu .............................................................................. 241 Ró ne implementacje Prologu................................................................................ 242 Czego się wystrzegać ............................................................................................ 243 Definicje wybranych predykatów standardowych .................................................... 244 Przetwarzanie znaków..................................................................................... 245 Dyrektywy ..................................................................................................... 247 Wejście i wyjście strumieniowe........................................................................ 247 Ró ne ............................................................................................................ 249 Dodatek D Różne wersje Prologu..................................................................... 251 Dodatek E Dialekt edynburski......................................................................... 255 Dodatek F micro-Prolog .................................................................................. 263 Skorowidz...................................................................................... 267
  • 5. Rozdział 1. Wprowadzenie Prolog Prolog to komputerowy język programowania. Jego początki sięgają roku 1970, od tego czasu u ywano go w aplikacjach związanych z przetwarzaniem symbolicznym, w ta- kich dziedzinach, jak: relacyjne bazy danych, logika matematyczna, rozwiązywanie problemów abstrakcyjnych, przetwarzanie języka naturalnego, automatyzacja projektowania, symboliczne rozwiązywanie równań, analiza struktur biochemicznych, ró ne zagadnienia z dziedziny sztucznej inteligencji. Osoby dopiero zaczynające swoją przygodę z Prologiem są zaskoczone tym, e pisanie programu w Prologu nie polega na opisywaniu algorytmu, jak to ma miejsce w trady- cyjnych językach programowania. Zamiast tego programiści Prologu zajmują się ra- czej formalnymi relacjami i obiektami związanymi z danym problemem, badając, które relacje są „prawdziwe” dla szukanego rozwiązania. Tak więc Prolog mo e być uwa any za język opisowy i deklaratywny. Programowanie w Prologu polega przede wszystkim na opisaniu znanych faktów i relacji dotyczących problemu, w mniejszym stopniu na podawaniu kolejnych kroków algorytmu. Kiedy programujemy w Prologu, sposób pracy komputera częściowo wynika z deklaratywnej semantyki Prologu, częściowo z tego, e Prolog na podstawie danego zbioru faktów mo e wnioskować nowe fakty, a jedynie częściowo na podstawie jawnie podanych przez programistę instrukcji ste- rujących.
  • 6. 12 Prolog. Programowanie Obiekty i relacje Prolog to komputerowy język programowania u ywany do rozwiązywania proble- mów dotyczących obiektów i relacji między nimi. Kiedy na przykład mówimy, e „Jan ma ksią kę”, informujemy, e istnieje relacja własności między obiektem „Jan” a obiektem „ksią ka”. Co więcej, jest to relacja upo- rządkowana: Jan ma ksią kę, ale ksią ka nie ma Jana. Jeśli zadajemy pytanie „Czy Jan ma ksią kę?”, staramy się poznać relację. Wiele problemów mo emy opisać, wskazu- jąc obiekty i ich relacje. Rozwiązanie problemu polega na za ądaniu od komputera in- formacji o obiektach i relacjach, które mo na z naszego programu wywnioskować. Nie wszystkie relacje jawnie określają wszystkie obiekty, które ich dotyczą. Kiedy na przykład mówimy „Bi uteria jest cenna”, oznacza to, e istnieje relacja „bycia cen- nym” dotycząca bi uterii. Nie wiadomo, dla kogo bi uteria jest cenna ani dlaczego. Wszystko zale y od tego, co zamierzamy wyrazić. Jeśli tego typu relacje będziemy modelować w Prologu, to liczba podawanych szczegółów zale eć będzie od tego, ja- kiej odpowiedzi oczekujemy od komputera. Mówimy tutaj o obiektach, ale nie nale y mylić tego z popularną metodologią pro- gramowania — programowaniem obiektowym. W programowaniu obiektowym obiekt to struktura danych, która mo e dziedziczyć pola i metody z hierarchii klas, do której sama nale y. Wprawdzie początki programowania obiektowego mo na datować na środek lat 60., lecz popularność zyskało w latach 80. i 90., kiedy to pojawiły się takie języki jak Smalltalk-80, C++ czy Java. Z kolei Prolog ewoluował niezale nie od początku lat 70., zaś jego zaczątkiem były postępy programowania w logice. Prologu nie nale y porównywać z językami obiek- towymi, takimi jak C++ i Java, gdy Prolog słu y do całkiem innych zadań i całkiem inne znaczenie ma w nim słowo „obiekt”. Dzięki elastyczności Prologu mo liwe jest napisanie w nim programu, który będzie interpretował podobny do Prologu język obiek- towy, ale to ju całkiem inne zagadnienie. Reasumując, kiedy mówimy o obiektach w Prologu, nie chodzi nam o struktury danych dziedziczące pola i metody z klasy, ale o byty, które mo na opisać termami. Prolog stanowi praktyczną i wydajną implementację szeregu aspektów „inteligentnego” wykonywania programu: braku determinizmu, równoległości i wywoływania proce- dur według wzorca. Prolog zawiera ujednoliconą strukturę danych, term, na bazie któ- rej tworzone są wszystkie dane oraz same programy Prologu. Program prologowy składa się ze zbioru klauzul, a ka da klauzula to albo fakt opisujący pewną informa- cję, albo reguła mówiąca, jak rozwiązanie mo na powiązać z danymi faktami. Tak więc Prolog mo na uwa ać za pierwszy krok na drodze ku ostatecznemu celowi pro- gramowania w logice. W ksią ce tej nie będziemy zanadto zastanawiać się nad dal- szymi implikacjami programowania w logice, nie będzie nas te specjalnie intereso- wało, dlaczego Prolog nie jest gotowym językiem programowania w logice. Zamiast tego skoncentrujemy się na pisaniu przydatnych programów za pomocą istniejących obecnie systemów standardowego Prologu.
  • 7. Rozdział 1. ♦ Wprowadzenie 13 Zanim zaczniemy programować, trzeba jeszcze wspomnieć o jeszcze jednej rzeczy. Wszyscy do zapisu relacji u ywamy reguł. Na przykład reguła „Dwoje ludzi jest sio- strami, jeśli oboje są kobietami i mają tych samych rodziców” objaśnia znaczenie by- cia siostrą. Mówi nam ona te , jak znaleźć dwoje ludzi będących siostrami: wystarczy po prostu sprawdzić, czy oboje to kobiety i czy mają tych samych rodziców. Wa ną rzeczą jest to, e reguły zwykle są bardzo uproszczone, ale są wystarczająco precy- zyjne, aby być definicjami. Nie mo na przecie oczekiwać, e definicja powie nam o jakimś obiekcie wszystko. Zapewne większość ludzi zgodzi się co do tego, e tak naprawdę „bycie siostrami” znaczy o wiele więcej ni wynika to z powy szej reguły. Kiedy jednak rozwiązujemy pewien konkretny problem, koncentrujemy się jedynie na regułach z tym problemem związanych. Powinniśmy zatem przyjąć specjalnie przygotowaną, uproszczoną defi- nicję, która w danym wypadku będzie wystarczająca. Programowanie W tym rozdziale poka emy najwa niejsze elementy języka w prawdziwych progra- mach, ale nie będziemy zanadto zagłębiać się w szczegóły, zasady formalne czy wy- jątki. Na razie nie będziemy silili się na kompletność wykładu czy jego formalną po- prawność. Chcemy, by czytelnik szybko posiadł umiejętność pisania przydatnych praktycznie programów, więc musimy skoncentrować się na podstawach: faktach, za- pytaniach, zmiennych, połączeniach i regułach. Inne elementy Prologu, np. listy czy re- kurencja, będą omawiane w dalszych rozdziałach. Programowanie w Prologu składa się z: Deklarowania faktów dotyczących obiektów i związków między nimi. Definiowania reguł dotyczących obiektów i związków między nimi. Zadawania zapytań o obiekty i związki między nimi. Załó my na przykład, e wprowadziliśmy do systemu Prologu przedstawioną wy ej regułę dotyczącą sióstr. Moglibyśmy zadać zapytanie, czy Maria i Janina są siostrami. Prolog przeszuka swoje informacje o Marii i Janinie, następnie odpowie yes lub no, zale nie od swojego stanu wiedzy. Tak więc mo emy uwa ać Prolog za zbiór faktów i reguł, które są u ywane do udzielania odpowiedzi na zapytania. Programowanie w Pro- logu polega na podawaniu faktów i reguł, zaś system potrafi wnioskować nowe fakty na podstawie ju istniejących. Prolog to język konwersacyjny, co oznacza, e u ytkownik prowadzi pewnego ro- dzaju konwersację z komputerem. Załó my, e siedzimy sobie przy terminalu i mamy u yć Prologu. Terminal komputera ma klawiaturę i wyświetlacz. Za pomocą klawiatury wprowadza się do komputera dane, zaś komputer na wyświetlaczu (mo e to być moni- tor czy drukarka) pokazuje swoje odpowiedzi. Prolog oczekuje, e u ytkownik wpro- wadzi wszystkie fakty i reguły dotyczące rozwiązywanego problemu. Następnie Pro- log będzie odpowiadał na zadawane pytania.
  • 8. 14 Prolog. Programowanie Teraz zajmiemy się kolejno podstawowymi elementami składowymi Prologu. Nie bę- dziemy na razie szczegółowo omawiać wszystkich aspektów tego języka, na to czas przyjdzie później, w dalszych rozdziałach. Fakty Najpierw omówimy fakty opisujące obiekty. Załó my, e chcemy w Prologu zanoto- wać fakt, e „Jan lubi Marię”. Fakt ten dotyczy dwóch obiektów, Jana i Marii, oraz zawiera relację „lubienia”. W prologu fakty zapisuje się w postaci: NWDK LCPOCTKC Trzeba pamiętać o kilku rzeczach: Nazwy wszystkich relacji i obiektów muszą się zaczynać małymi literami, jak powy ej: NWDK, LCP, OCTKC. Najpierw zapisuje się relację, a potem jej obiekty rozdzielone przecinkami i ujęte w nawias okrągły. Fakt musi się kończyć kropką (). Podczas definiowania związków między obiektami w formie faktów nale y zwrócić uwagę na kolejność obiektów umieszczanych w nawiasie. Kolejność ta jest wprawdzie dowolna, ale trzeba się na jakąś zdecydować i potem się jej trzymać, aby zapewnić jednolitą interpretację tych faktów. Na przykład, w powy szym fakcie osobę lubiącą podajemy jako pierwszą, zaś lubianą jako drugą. Wobec tego fakt NWDK LCPOCTKC nie jest równowa ny faktowi NWDK OCTKCLCP. Pierwszy z nich, zgodnie z przyjętą przez nas kolejnością, mówi, e Jan lubi Marię. Jeśli chcemy powiedzieć, e Maria lubi Jana, musimy to jawnie zapisać: NWDK OCTKCLCP Oto zestaw faktów wraz z ich interpretacją w języku naturalnym 1: EGPP[ NQVQ Złoto jest cenne. MQDKGVC LCPKPC Janina jest kobietą. RQUKCFC LCPNQVQ Jan posiada złoto. QLEKGE LCPOCTKC Jan jest ojcem Marii. FCLG LCPICGVCOCTKC Jan daje Marii gazetę. Za ka dym razem, kiedy u ywamy jakiejś nazwy, dotyczy ona konkretnego obiektu. Czytelnik zna język polski, więc oczywiste jest, e LCP i OCTKC muszą dotyczyć osób, 1 W faktach i obiektach nie nale y u ywać polskich liter. Zgodnie ze standardem Prologu w nazwach relacji i obiektów mo na korzystać jedynie z alfabetu łacińskiego i pewnych znaków dodatkowych, które zostaną podane w dalszych rozdziałach — przyp. tłum.
  • 9. Rozdział 1. ♦ Wprowadzenie 15 ale znaczenie takich nazw jak NQVQ nie od razu będzie jasne. Tego typu słowa nazy- wane są słowami niepoliczalnymi. Kiedy u ywamy jakiejś nazwy, musimy przypisać jej interpretację. Przykładowo, nazwa NQVQ mo e odnosić się do obiektu — wtedy zwykle chodzi nam o jakiś kawałek złota. W takiej sytuacji fakt EGPP[ NQVQ oznacza, e dany kawałek złota, któremu przypisaliśmy nazwę NQVQ, jest cenny. Z drugiej strony, mo emy uznać, e nazwa NQVQ dotyczy pierwiastka o liczbie atomowej 79, wobec czego pisząc EGP P[ NQVQ mówimy, e pierwiastek chemiczny złoto jest cenny. Tak więc nazwę mo na ró nie interpretować, a o wyborze konkretnej interpretacji decyduje programi- sta. Nie stanowi to problemu, pod warunkiem, e będziemy konsekwentnie trzymać się jednej interpretacji. Wa ne jest ustalenie tej interpretacji dostatecznie wcześnie, kiedy jeszcze dokładnie wiemy, co dana nazwa miała oznaczać. Teraz trochę o stosowanej terminologii. Nazwy obiektów występujące w nawiasach nazywamy argumentami. Pamiętajmy, e w informatyce słowo „argument” nie ma nic wspólnego z potocznym znaczeniem tego słowa, czyli „racją w dyskusji”. Nazwę re- lacji znajdującą się przed nawiasem nazywamy predykatem. Wobec tego predykat EGPP[ ma jeden argument, zaś predykat NWDK ma dwa argumenty. Nazwy obiektów i relacji są całkowicie dowolne. Zamiast zapisu NWDK LCPOCTKC równie dobrze moglibyśmy zastosować C DE, wiedząc, e C oznacza lubienie, D oznacza Jana, a E oznacza Marię. Jednak zwykle nazwy dobiera się tak, aby ułatwić zapamiętywanie ich znaczenia. Wobec tego z góry trzeba ustalić znaczenie poszcze- gólnych nazw i kolejność argumentów, a potem trzeba się ściśle trzymać przyjętej konwencji. Relacje mogą mieć dowolną liczbę argumentów. Jeśli chcemy zdefiniować predykat ITC, w którym podamy dwóch graczy i nazwę gry, będziemy potrzebowali trzech ar- gumentów. Oto dwa przykłady takich faktów: ITC LCPOCTKCHWVDQN ITC LCPKPCUVCUGMDCFOKPVQP Jak się przekonamy dalej, u ycie wielu argumentów jest konieczne do zapamiętania zło onych powiązań między relacjami. Mo na deklarować ró ne fakty, tak e fakty, które nie są prawdziwe w świecie ze- wnętrznym. Mo na na przykład napisać MTQN LCPHTCPELC, aby poinformować, e Jan jest królem Francji. Jest to oczywiście nieprawda, biorąc pod uwagę, e rządy monar- sze we Francji zostały obalone około roku 1792. Prolog jednak nic o tym nie wie i nie chce wiedzieć; fakty Prologu pozwalają po prostu zapisywać dowolne relacje między obiektami. W Prologu zbiór faktów nazywamy bazą danych. Tego słowa u ywa się zawsze, kiedy mamy do czynienia ze zbiorem faktów (a, jak dowiemy się potem, tak e reguł) u y- wanych do rozwiązania pewnego problemu.
  • 10. 16 Prolog. Programowanie Zapytania Kiedy mamy ju jakieś fakty, mo emy zadawać dotyczące ich zapytania. W Prologu zapytanie wygląda tak samo jak fakt, ale umieszcza się przed nim specjalny symbol — pytajnik i minus (!). Rozwa my zapytanie: ! RQUKCFC OCTKCICGVC Jeśli OCTKC to osoba o imieniu Maria, a ICGVC to pewna konkretna gazeta, to powy - sze zapytanie odpowiada pytaniu Czy Maria ma gazetę? lub Czy istnieje fakt mówiący, e Maria ma gazetę? Nie jest to natomiast zapytanie o wszystkie gazety, ani o gazety w ogólności. Kiedy zadajemy Prologowi zapytanie, przeszukuje on stworzoną wcześniej bazę da- nych i szuka faktów pasujących do faktu podanego w zapytaniu. Dwa fakty pasują do siebie, jeśli mają takie same predykaty (tak samo pisane) i takie same są odpowiada- jące sobie ich argumenty. Jeśli Prolog znajdzie fakt pasujący do zapytania, odpowie [GU (tak). Jeśli fakt taki nie zostanie znaleziony, odpowiedzią będzie PQ (nie). Odpo- wiedzi pokazywane są na monitorze bezpośrednio pod pytaniem. Załó my, e mamy następującą bazę danych: NWDK LCTGMT[D[ NWDK LCTGMOCTKC NWDK OCTKCMUKCMC NWDK LCPMUKCMC NWDK LCPHTCPELC Jeśli wprowadzimy takie właśnie fakty, mo emy zadawać poni sze zapytania i otrzy- mamy pokazane ni ej odpowiedzi (odpowiedzi komputera są pogrubione): ! NWDK LCTGMRKGPKCFG PQ ! NWDK OCTKCLCTGM PQ ! NWDK OCTKCMUKCMC [GU Odpowiedzi na pierwsze trzy pytania nie powinny budzić adnych wątpliwości. W Pro- logu odpowiedź PQ nale y interpretować jako nie znaleziono niczego pasującego do pytania. Trzeba pamiętać, e PQ nie jest równowa ne z odpowiedzią nie — wyobraźmy sobie bazę danych o słynnych Grekach: QUQDC UQMTCVGU QUQDC CT[UVQVGNGU CVGPE[M UQMTCVGU Mo emy zadawać następujące zapytania: ! CVGPE[M UQMTCVGU [GU ! CVGPE[M CT[UVQVGNGU PQ
  • 11. Rozdział 1. ♦ Wprowadzenie 17 Wprawdzie być mo e Arystoteles ył niegdyś w Atenach, ale nie mo emy tego udo- wodnić na podstawie pokazanej bazy danych. A co się stanie, gdy zadamy zapytanie o relację, której nie ma w bazie danych? Za- łó my, e u ywamy powy szej bazy danych z relacją NWDK i zadajemy jak najbardziej rozsądne zapytanie: ! MTQN LCPHTCPELC Nasza baza danych niczego nie mówi o królach, choć w bazie występują zarówno LCP, jak i HTCPELC. W większości systemów Prologu udzielona zostanie odpowiedź PQ, gdy na podstawie bazy danych nie mo na udowodnić adnych faktów dotyczących królów. Niemniej standard języka Prolog pozwala albo udzielić odpowiedzi PQ, albo przed udzieleniem takiej odpowiedzi wygenerować ostrze enie, albo mo e zostać za- prezentowany komunikat o błędzie. Przykładowo, gdybyśmy korzystali z naszej bazy danych o Grekach i zadalibyśmy zapytanie ! ITGM UQMTCVGU to choć w naszej bazie danych jest informacja, e Sokrates to Ateńczyk, nie wystarcza to do udowodnienia, e jest on Grekiem: baza danych nie mówi niczego o Grekach, więc z punktu widzenia standardu języka dopuszczalna jest odpowiedź: 'ZKUVGPEG GTTQT RTQEGFWTG ITGM PQ To, jak konkretny system się w takiej sytuacji zachowa, zale y od sposobu zaimple- mentowania w nim standardu Prologu, więc nie będziemy się tego typu szczegółami zajmować. Omówione dotąd fakty i zapytania nie są zbyt interesujące — jedyne, co potrafimy, to uzyskać te same informacje, które wprowadziliśmy wcześniej do bazy. Znacznie cie- kawsze byłoby uzyskanie odpowiedzi na pytania Co lubi Maria? czy Kto ył w Ate- nach? Do tego właśnie słu ą zmienne. Zmienne Jeśli chcielibyśmy dowiedzieć się, co lubi Jan, bardzo nieporęcznie byłoby pytać Czy Jan lubi ksią ki?, Czy Jan lubi Marię? i tak dalej, a Prolog ka dorazowo udzielałby odpowiedzi [GU lub PQ. Znacznie rozsądniej byłoby zapytać Prolog, co lubi Jan. Od- powiednie pytanie miałoby postać Czy Jan lubi X? W chwili zadawania takiego za- pytania nie wiemy, co oznacza X; chcielibyśmy, aby to Prolog podał nam wszystkie mo liwości. Otó w Prologu mo emy nie tylko nazywać konkretne obiekty, ale te u ywać takich nazw jak X, oznaczających obiekty, które będą wskazywane przez Prolog. Tego typu nazwy nazywamy zmiennymi. Kiedy Prolog u ywa zmiennej, mo e być ona ukonkretniona lub nieukonkretniona. Zmienna jest ukonkretniona, jeśli odpowiada jakiemuś konkretnemu obiektowi. Zmien- na nie jest ukonkretniona, kiedy nie wiemy, jakiemu obiektowi mo e odpowiadać.
  • 12. 18 Prolog. Programowanie Prolog odró nia zmienne od nazw konkretnych obiektów w ten sposób, e wszystkie nazwy zaczynające się wielkimi literami są traktowane jako zmienne. Kiedy Prolog otrzymuje zapytanie zawierające zmienną, przeszukuje wszystkie fakty, aby znaleźć obiekt, który mo e zastąpić zmienną. Kiedy zatem pytamy Czy Jan lubi X?, Prolog przeszukuje wszystkie fakty, by znaleźć rzeczy, które lubi Jan. Zmienna taka jak X nie nazywa sama konkretnego obiektu, ale mo e zastępować obiekt, którego nazwy nie potrafimy podać. Na przykład, nie mo emy nadać nazwy czemuś, co lubi Jan, więc w Prologu u ywa się tu innego zapisu; zamiast zapytania ! NWDK LCP EQ EQ NWDK ,CP u ywamy zmiennych: !NWDK LCP: Zmienne w razie potrzeby mogą mieć dłu sze nazwy, na przykład poni sze zapytanie jest poprawne: ! NWDK LCP%QUEQNWDKLCP Dlaczego to działa? Po prostu zmienna mo e być dowolną nazwą zaczynającą się wielką literą. Przyjmijmy, e mamy do czynienia z poni szą bazą faktów i zapytaniem: NWDK LCPMYKCV[ NWDK LCPOCTKC NWDK RCYGNOCTKC ! NWDK LCP: Zapytanie interpretujemy jako Czy mamy coś, co lubi Jan? Prolog odpowie na nie: :MYKCV[ i będzie czekał na dalsze instrukcje, które wkrótce te omówimy. Jak Prolog uzyskał powy szy wynik? Kiedy zadajemy mu powy sze zapytanie, zmienna : nie jest po- czątkowo ukonkretniona. Prolog przegląda bazę danych szukając faktów pasujących do zapytania. Póki argument jest zmienną nieukonkretnioną, mo e być zastępowany dowolnym innym argumentem występującym w tym samym miejscu w faktach. Pro- log wyszukuje dowolne fakty z predykatem NWDK i pierwszym argumentem LCP. drugi argument mo e być dowolny, gdy zapytanie w drugim argumencie zawiera zmienną nieukonkretnioną. Kiedy odpowiedni fakt zostanie znaleziony, od tej chwili : oznacza drugi argument znalezionego faktu. Prolog przeszukuje bazę danych w takiej kolejno- ści, w jakiej ją wpisano (czyli od góry do dołu), wobec czego fakt NWDK LCPMYKCV[ znajdowany jest jako pierwszy. Zmienna : od tej chwili oznacza obiekt MYKCV[, czyli jest ukonkretniona jako MYKCV[. Prolog oznacza miejsce bazy danych, w którym zna- leziono pasujący fakt; u ycie tego znacznika omówimy wkrótce. Kiedy Prolog znajduje fakt pasujący do zapytania, pokazuje obiekty podstawione pod zmienne. W tym wypadku była tylko jedna zmienna, :, i pasowała do obiektu MYKCV[. Prolog czeka na dalsze polecenia. Wciśnięcie klawisza Enter oznacza, e wystarcza nam znalezione rozwiązanie i dalsze ju nas nie interesują. Jeśli wciśniemy klawisz ; (i Enter), Prolog podejmie dalsze przeszukiwanie bazy danych zaczynając od miejsca wstawienia znacznika.
  • 13. Rozdział 1. ♦ Wprowadzenie 19 Załó my, e po uzyskaniu od Prologu pierwszej odpowiedzi (:MYKCV[) za ądaliśmy wznowienia poszukiwań przez wciśnięcie . Oznacza to, e chcemy znaleźć inną od- powiedź na to samo zapytanie, czyli chcemy znaleźć inny obiekt, który mo na pod- stawić pod :. Wobec tego Prolog musi „zapomnieć”, e : oznaczało MYKCV[ i podjąć poszukiwania z nieukonkretnioną zmienną :. Wyszukujemy inne mo liwe rozwiąza- nie, więc zaczynamy od znacznika. Następny znaleziony pasujący fakt to NWDK LCP OCTKC. Zmienna : jest ukonkretniana wartością OCTKC, Prolog wstawia znacznik na fakcie NWDK LCPOCTKC. Prolog wyświetla :OCTKC i czeka na dalsze polecenia. Jeśli wpiszemy następny średnik, Prolog będzie szukał kolejnego rozwiązania. W naszym przykładzie nie ma ju innych obiektów, które lubiłby Jan, więc Prolog kończy wy- szukiwanie i pozwala zadawać kolejne zapytania lub deklarować dalsze fakty. Co się stanie, jeśli mając takie same fakty, jak powy ej, zadamy zapytanie: ! NWDK :OCTKC Oznacza to pytanie Czy jakiś obiekt lubi Marię? Obiektami takimi będą LCP i RCYGN. Znowu w celu uzyskania wszystkich mo liwych odpowiedzi korzystamy ze średnika i RETURN: ! NWDK :OCTKC nasze zapytanie :LCP pierwsza odpowiedź; wcisnęliśmy średnik () i RETURN :RCYGN druga odpowiedź; znów wcisnęliśmy średnik () i RETURN PQ nie ma więcej odpowiedzi Koniunkcje Załó my, e chcielibyśmy odpowiadać na zapytania dotyczące bardziej zło onych relacji, na przykład takich: Czy Jan i Maria lubią się nawzajem? Jednym ze sposobów realizacji takiego zapytania byłoby zapytanie, czy Jan lubi Marię, a jeśli Prolog od- powiedziałby [GU, zapytanie, czy Maria lub Jana. Tak więc problem składa się z dwóch odrębnych celów, które Prolog musi wykazać. Kombinacje tego typu są wśród pro- gramistów Prologu wyjątkowo rozpowszechnione, więc wymyślono dla nich specjalną notację. Załó my, e mamy bazę danych: NWDK OCTKCEGMQNCFC NWDK OCTKCYKPQ NWDK LCPYKPQ NWDK LCPOCTKC Chcemy wiedzieć czy Jan i Maria lubią się nawzajem. W tym celu pytamy Czy Jan lubi Marię? i Czy Maria lubi Jana?. Spójnik i oznacza, e interesuje nas koniunkcja celów: chcemy spełnić je obydwa. W Prologu spójnik ten zapisujemy jako przecinek (): ! NWDK LCPOCTKC NWDK OCTKCLCP
  • 14. 20 Prolog. Programowanie Przecinek czytamy jako i, mo na za jego pomocą rozdzielać dowolną liczbę celów, które mają być spełnione w celu udzielenia odpowiedzi na pytanie. Kiedy Prolog otrzymuje ciąg celów (rozdzielonych przecinkami), stara się spełnić wszystkie cele, znajdując pasujące do nich cele z bazy danych. Aby spełniona była cała sekwencja, spełnione muszą być wszystkie cele składowe. Jeśli do pokazanej powy ej bazy za- damy powy sze zapytanie, odpowiedzią będzie PQ. Pierwszy cel jest prawdziwy, bo mamy w bazie informację, e Jan lubi Marię, ale nie występuje nigdzie fakt NWDK OCTKC LCP. Skoro chcieliśmy wiedzieć, czy lubią się nawzajem, odpowiedź na całe zapyta- nie brzmi PQ. Korzystając ze zmiennych i koniunkcji, mo emy tworzyć naprawdę zło one zapyta- nia. Wiemy ju , e nie mo na udowodnić, i Jan i Maria lubią się nawzajem, więc chcielibyśmy wiedzieć, czy istnieje coś, co oboje lubią: Czy istnieje coś, co lubi za- równo Jan, jak i Maria? Zapytanie takie składa się z dwóch celów: Najpierw sprawdzamy czy istnieje jakiś obiekt : lubiany przez Marię. Następnie sprawdzamy czy Jan tak e lubi :, cokolwiek by to było. Powy sze dwa cele w Prologu mo na zapisać jako koniunkcję: ! NWDK OCTKC: NWDK LCP: Prolog najpierw próbuje spełnić pierwszy cel zapytania. Jeśli zostanie on znaleziony w bazie danych, miejsce w bazie danych zostanie zaznaczone i Prolog spróbuje speł- nić drugi cel. Jeśli on te zostanie spełniony, Prolog oznaczy miejsce tego celu w ba- zie danych i mamy ju rozwiązanie. Najwa niejsze, o czym trzeba pamiętać to to, e ka dy cel wstawia do bazy osobną zakładkę. Jeśli drugi cel nie zostanie jednak spełniony, Prolog będzie się starał spełnić inaczej cel poprzedni (w tym wypadku pierwszy). Pamiętajmy, e Prolog dla ka dego celu przeszukuje całą bazę danych. Jeśli fakt z bazy danych zostanie dopasowany, Prolog zaznaczy to miejsce, na wypadek gdyby potrzebne było ponowne dopasowywanie te- go celu. Kiedy jednak trzeba inaczej dopasować cel, Prolog zaczyna przeszukiwanie od znacznika celu, nie od początku bazy danych. Nasze powy sze zapytanie Czy ist- nieje coś, co lubi Maria i jednocześnie lubi to Jan?, stanowi przykład u ycia mecha- nizmu nawracania: 1. W bazie danych odszukiwany jest pierwszy cel. Kiedy drugi argument : jest nieukonkretniony, mo e przybrać dowolną wartość. Pierwszym znalezionym dopasowaniem jest NWDK OCTKCEGMQNCFC. Wobec tego od tej chwili : przybiera wartość LGFGPKG wszędzie tam, gdzie pojawia się :. Prolog oznacza w bazie danych miejsce znalezienia faktu na wypadek, gdyby konieczne było wznowienie wyszukiwania. 2. W bazie danych szuka się faktu NWDK LCPEGMQNCFC. Wynika to stąd, e następnym celem jest NWDK LCP:, zaś : oznacza teraz EGMQNCFC. Faktu takiego w bazie nie ma, więc cel zawodzi i Prolog stara się znaleźć inne dopasowanie NWDK OCTKC:, tym razem jednak przeszukiwanie bazy zaczyna się od zaznaczonego miejsca. Najpierw konieczne jest cofnięcie ukonkretnienia zmiennej :, aby ponownie mogła przybrać dowolną wartość.
  • 15. Rozdział 1. ♦ Wprowadzenie 21 3. Oznaczone miejsce to NWDK OCTKCEGMQNCFC, więc od tego faktu zaczyna się dalsze wyszukiwanie. Nie doszliśmy jeszcze do końca bazy, więc mo na dalej sprawdzać co lubi Maria; następny pasujący fakt to NWDK OCTKCYKPQ. Zmienna : otrzymuje teraz wartość YKPQ, Prolog ponownie oznacza miejsce wystąpienia tego faktu. 4. Tak jak poprzednio, Prolog stara się uzgodnić drugi cel, tym razem szukając faktu NWDK LCPYKPQ. Tego celu Prolog nie próbuje uzgadniać z innymi wartościami; cel jest nowy, więc przeszukiwana jest cała baza danych. Fakt zostaje szybko znaleziony i Prolog generuje odpowiedni komunikat. Cel został uzgodniony, więc Prolog oznacza odpowiednie miejsce w bazie danych, aby w razie potrzeby zacząć dalsze przeszukiwanie od tego miejsca. W bazie danych znajdują się znaczniki wszystkich celów, które Prolog uzgadniał. 5. W tej chwili spełnione są ju oba cele, zmiennej : odpowiada nazwa YKPQ. Pierwszy cel spowodował zaznaczenie w bazie danych faktu NWDK OCTKCYKPQ, a drugi — faktu NWDK LCPYKPQ. Tak jak w przypadku wszystkich zapytań, Prolog odnajduje pierwszą odpowiedź, za- trzymuje się i czeka na dalsze instrukcje. Jeśli wpiszemy, poszukiwanie rozwiązań będzie kontynuowane. Wiemy, e odbywa się to przez próby innego spełnienia oby- dwóch zadanych celów od zostawionych wcześniej znaczników. Reasumując, koniunkcję celów interpretujemy od strony lewej do prawej, poszcze- gólne cele rozdzielamy przecinkami. Ka dy cel mo e mieć lewego i prawego sąsiada. Oczywiście pierwszy cel nie ma sąsiada lewego, a ostatni — prawego. Kiedy Prolog ma do czynienia z koniunkcją celów, stara się spełnić je kolejno, od lewej do prawej. Jeśli cel zostaje spełniony, Prolog umieszcza w bazie danych znacznik w miejscu z tym celem powiązanym — mo na na to patrzeć jak na narysowanie strzałki od celu do spełniającego go miejsca w bazie danych, przy tym ukonkretniane są wszystkie nie- ukonkretnione dotąd zmienne. Wszystko to ma miejsce w pierwszym kroku powy - szego wyliczenia. Jeśli zmienna jest ukonkretniana, ukonkretniane są od razu wszyst- kie jej wystąpienia. Następnie Prolog stara się uzgodnić prawego sąsiada danego celu zaczynając poszukiwanie rozwiązań od początku bazy danych. Spełniane są kolejno wszystkie cele, przy czym w bazie danych zostawiane są znacz- niki (czyli w naszym przykładzie rysujemy strzałki od celów do odpowiednich fak- tów). Kiedy któryś cel zawodzi (nie mo na znaleźć pasującego do niego faktu), Pro- log się cofa i stara się inaczej uzgodnić lewego sąsiada, zaczynając poszukiwanie od jego znacznika. W takiej chwili wycofywane jest ukonkretnienie wszystkich zmien- nych, które miało miejsce w czasie realizacji sąsiedniego celu. Kiedy nie udaje się uzgodnić kolejnych celów, do których dochodzimy teraz od prawej strony, Prolog wycofuje się w lewo, a kiedy braknie lewego sąsiada, cała koniunkcja zawodzi. Ta- kie próby wycofywania się i uzgadniania kolejnych celów koniunkcji nazywamy na- wracaniem. Nawracanie omówimy jeszcze w następnym rozdziale, a dokładnie zro- bimy to w rozdziale 4. Badając przykłady, dla wygody mo emy zapisywać pod ka dą zmienną z celu war- tość, na jaką zmienna ta została ukonkretniona. Warto te rysować strzałkę od celu do
  • 16. 22 Prolog. Programowanie jego znacznika w bazie danych. Poni ej pokazano cztery rysunki, które pomogą zro- zumieć przedstawiony przykład. Na ka dym rysunku pokazano całą bazę danych i zapytanie wraz z ponumerowanymi komentarzami. Cele ju uzgodnione dodatkowo obramowano.
  • 17. Rozdział 1. ♦ Wprowadzenie 23 :YKPQ W całej tej ksią ce postaramy się pokazać, gdzie w przykładach zachodzi nawracanie i jak wpływa ono na sposób rozwiązywania problemów. Nawracanie jest tak wa ne, e poświęcimy mu cały rozdział 4. Ćwiczenie 1.1. Poprowadź dalej powy szą analizę obrazkową zakładając, e odpowie- dzieliśmy systemowi średnikiem nakazującym znaleźć inne rozwiązania zapytania. Reguły Załó my, e chcemy zapisać fakt, e Jan lubi wszystkich ludzi. Jednym ze sposobów byłoby zapisanie szeregu kolejnych faktów: NWDK LCPCNHTGF NWDK LCPDGTVTCPF NWDK LCPE[T[N NWDK LCPFCYKF Jednak jest to rozwiązanie niewygodne, szczególnie jeśli w bazie danych mamy setki ludzi. Innym sposobem byłoby stwierdzenie, e Jan lubi wszystkie obiekty będące osobami. Fakt taki ma postać reguły mówiącej, kogo lubi Jan. Taki zapis jest bardziej zwarty od wypisywania kolejno wszystkich osób lubianych przez Jana. W Prologu reguł u ywa się do zapisania, e jakiś fakt zale y od grupy innych faktów. W języku polskim do stworzenia reguły u ywamy słówka „jeśli”, na przykład: U ywam parasola, jeśli pada. Jan kupuje wino, jeśli jest ono tańsze od piwa. Reguł u ywa się te do zapisywania definicji, na przykład: X jest ptakiem jeśli: X jest zwierzęciem i X ma pióra.
  • 18. 24 Prolog. Programowanie lub X jest siostrą Y, jeśli: X jest kobietą i X i Y mają takich samych rodziców. W powy szych definicjach zapisanych w języku naturalnym u yto zmiennych X i Y. Trzeba pamiętać, e zmienne oznaczają te same obiekty we wszystkich wystąpieniach w regule; gdyby było inaczej, byłoby to niezgodne z duchem definicji w ogóle. Na przykład w powy szej regule opisującej ptaka nie mo na wykazać, e Fred jest pta- kiem tylko dlatego, e Fido jest zwierzęciem, a Maria ma pióra. Ta sama zasada jed- nolitej interpretacji zmiennych obowiązuje tak e w regułach Prologu. Jeśli : w jed- nym miejscu oznacza Freda, to wszystkie : w tej samej regule oznaczają te Freda. Reguła to ogólne stwierdzenie dotyczące obiektów i ich powiązań. Mo emy na przy- kład powiedzieć, e Fred jest ptakiem, jeśli Fred jest zwierzęciem i Fred ma pióra, oraz e Bertrand jest ptakiem, jeśli Bertrand jest zwierzęciem i Bertrand ma pióra. Mo emy zatem pozwolić, by zmienna miała ró ne wartości w przypadkach u ycia re- guły, zaś w samej regule musi być interpretowana jednolicie. Przyjrzyjmy się teraz kilku przykładom, począwszy od reguły z jedną zmienną i z ko- niunkcją. Jan lubi ka dego, kto lubi wino, czyli Jan lubi wszystko, jeśli to lubi wino, a gdy zapiszemy to samo za pomocą zmiennych Jan lubi X, jeśli X lubi wino. W Prologu reguła składa się z głowy i treści, które połączone są symbolem składają- cym się z dwukropka i myślnika (). Powy szą regułę mo na zatem zapisać nastę- pująco: NWDK LCP: NWDK :YKPQ Nale y zauwa yć, e reguły tak e kończą się MTQRMæ. Głowa powy szej reguły to NW DK LCP:. Treść, tym razem NWDK :YKPQ, zawiera koniunkcję celów, które muszą być spełnione, aby głowa była prawdziwa. Mo emy na przykład uczynić Jana osobą staranniej szukającą obiektów sympatii, dodając do treści reguły więcej celów roz- dzielonych RTGEKPMCOK: NWDK LCP: NWDK :YKPQ NWDK :LGFGPKG Oznacza to, e Jan lubi wszystkich, którzy lubią wino i jedzenie. Załó my teraz, e Jan lubi panie, które lubią wino: NWDK LCP: MQDKGVC : NWDK :YKPQ Zawsze kiedy analizujemy regułę Prologu, musimy zwrócić uwagę na to, gdzie znaj- dują się w niej zmienne. W powy szej regule trzykrotnie u yto zmiennej :. Kiedy
  • 19. Rozdział 1. ♦ Wprowadzenie 25 zmienna ta jest ukonkretniana jakimś obiektem, jest ukonkretniana w całym swoim zakresie obowiązywania. W konkretnych przypadkach u ycia reguły zakres obowią- zywania to cała reguła, od głowy do kropki na końcu. Wobec tego, jeśli w powy szej regule zmienna : zostanie ukonkretniona, aby wskazywała Marię, Prolog będzie starał się uzgodnić cele MQDKGVC OCTKC i NWDK OCTKCYKPQ. Następnie przyjrzyjmy się regule, w której u ywana jest więcej ni jedna zmienna. Niech baza danych zawiera fakty dotyczące rodziny królowej Wiktorii. Będziemy ko- rzystać z predykatu TQFKEG mającego trzy argumenty: TQFKEG :; oznacza, e rodzice X to Y i Z. Drugi argument to matka, a trzeci to ojciec. U yjemy te predyka- tów MQDKGVC i OGE[PC, które nie wymagają objaśnienia. Oto przykład części za- wartości bazy: OGE[PC CNDGTV OGE[PC GFYCTF MQDKGVC CNKELC MQDKGVC YKMVQTKC TQFKEG GFYCTFYKMVQTKCCNDGTV TQFKEG CNKELCYKMVQTKCCNDGTV Teraz u yjemy opisanej wcześniej reguły dotyczącej siostry. W regule tej definiujemy dwuargumentowy predykat UKQUVTC :; mówiący, e : jest siostrą ;. : jest siostrą ;, je eli: : jest kobietą, matką : jest /, a ojcem 1, ; ma takich samych matkę i ojca, jak :. Mo emy zapisać zatem następującą regułę: UKQUVTC :; MQDKGVC : TQFKEG :/1 TQFKEG ;/1 Albo tę samą regułę mo na zapisać w jednym wierszu: UKQUVTC :; MQDKGVC : TQFKEG :/1 TQFKEG ;/1 Matkę i ojca oznaczają zmienne / i 1, choć moglibyśmy u yć te zmiennych /CVMC i 1LEKGE. Zauwa my, e te zmienne nie występują w głowie reguły; niemniej są trak- towane tak samo, jak wszelki inne zmienne. Kiedy Prolog u ywa reguły, zmienne / i 1 początkowo są nieukonkretnione, więc podczas pierwszego dopasowywania celu TQFKEG :/1 są im przypisywane wartości. Kiedy jednak ju raz zostaną ukonkret- nione, ukonkretnienie to dotyczy wszystkich wystąpień / i 1 w całej regule. Poni szy przykład pomo e zrozumieć sposób u ycia tych zmiennych. Zadajmy zapytanie: ! UKQUVTC CNKELCGFYCTF
  • 20. 26 Prolog. Programowanie Prolog będzie przetwarzał takie zapytanie następująco: 1. Najpierw zapytanie dopasowywane jest do głowy reguły UKUVGT, więc : ukonkretniana jest jako CNKELC, a ; jako GFYCTF. Znacznik odpowiadający zapytaniu umieszczony jest na znalezionej regule. Następnie Prolog próbuje spełnić kolejno trzy cele z treści reguły. 2. Pierwszym celem jest MQDKGVC CNKELC, gdy wcześniej : ukonkretniono wartością CNKELC. Cel jest prawdziwy, gdy istnieje odpowiedni fakt w bazie, więc ten cel nie zawodzi. W tej sytuacji Prolog oznacza odpowiednie miejsce w bazie danych (trzeci zapis). Nie dochodzi do ukonkretnienia adnych dodatkowych zmiennych i Prolog przechodzi do uzgadniania następnego celu. 3. Prolog szuka faktu TQFKEG CNKELC/1, gdzie / i 1 dopiero mają być ukonkretnione. Znaleziony zostaje fakt TQFKEG CNKELCYKMVQTKCCNDGTV, więc cel jest uzgodniony. Prolog oznacza w bazie danych szóstą pozycję, ukonkretnia / wartością YKMVQTKC i 1 wartością CNDGTV (mo na ponownie u yć zapisu wartości pod celem). Prolog przechodzi do uzgadniania następnego celu. 4. Obecnie Prolog szuka faktu TQFKEG GFYCTFYKMVQTKCCNDGTV, gdy ju w zapytaniu ukonkretniono ; jako GFYCTF, zaś w poprzednim kroku ukonkretniono / i 1. Cel udaje się uzgodnić, oznaczany jest odpowiedni fakt (piąty w bazie). Jako e był to ostatni cel koniunkcji, cała koniunkcja jest prawdziwa i fakt UKQUVTC CNKELCGFYCTF uznawany jest za prawdziwy, wobec czego Prolog odpowiada [GU. Załó my teraz, e interesuje nas czy Alicja jest czyjąś siostrą; odpowiednie zapytanie ma postać ! UKQUVTC CNKELC: Prolog postąpi w następujący sposób: 1. Zapytanie pasuje do głowy reguły UKQUVTC; zmienna : reguły jest ukonkretniana wartością CNKELC. Zmienna : zapytania pozostaje nieukonkretniona, więc nieukonkretniona jest te zmienna ; reguły. Zmienne te jednak zostają ze sobą powiązane: kiedy jedna z nich zostanie ukonkretniona, druga zostanie ukonkretniona tak samo. Na razie jednak obie są jeszcze wolne. 2. Pierwszy cel, MQDKGVC CNKELC, udaje się uzgodnić jak poprzednio. 3. Drugi cel to TQFKEG CNKELC/1, jest on dopasowywany do faktu TQFKEG CNKELCYKMVQTKCGFYCTF. Znamy ju zatem wartości zmiennych / i 1. 4. Wartość ; nie jest jeszcze znana, więc trzecim celem jest TQFKEG ;YKMVQTKCCNDGTV. Cel ten dopasowywany jest do faktu TQFKEG GFYCTFYKMVQTKCCNDGTV, więc zmienna ; ukonkretniona jest wartością GFYCTF. 5. Cel jest uzgodniony, więc uzgodniona jest cała reguła z wartościami : jako CNKELC (znana z zapytania) i ; jako GFYCTF. Jako e zmienna ; z reguły jest powiązana ze zmienną : z zapytania, : tak e ma wartość GFYCTF. Prolog wyświetla wynik, :GFYCTF.
  • 21. Rozdział 1. ♦ Wprowadzenie 27 Jak zwykle, Prolog czeka na decyzję, czy ma szukać kolejnych rozwiązań zapytania. To akurat zapytanie, które zadaliśmy, więcej rozwiązań ju nie ma, zaś sposób dojścia Prologu do tego wniosku jest przedmiotem ćwiczenia z końca niniejszego rozdziału. Jak widzieliśmy, Prolog mo e pobierać informacje o predykacie NWDK w dwóch posta- ciach: mo emy podawać fakty i reguły. Ogólnie rzecz biorąc, predykat definiuje się jako zbiór faktów i reguł; jedne i drugie nazywamy klauzulami predykatu. Słowa klau- zula u ywać będziemy zawsze mając na myśli fakt lub regułę. Zastanówmy się teraz nad następującym zagadnieniem: dana osoba mo e coś ukraść, jeśli jest złodziejem i coś lubi, zaś to coś jest wartościowe. W Prologu zapisujemy to: OQGAWMTCUE 26 NQFKGL 2 NWDK 26 U ywamy dwuargumentowego predykatu OQGAWMTCUE, gdzie 2 oznacza potencjalne- go złodzieja, a 6 kradzioną rzecz. Reguła ta opiera się na klauzulach NQFKGL i NWDK; obie one mogą być zapisane jako mieszanina faktów i reguł. Przyjmijmy, e baza da- nych jest taka sama jak poprzednio, ale między symbole
  • 22. wstawiliśmy numery klauzul. Pokazane symbole słu ą do zapisu komentarzy. Komentarze są przez Prolog pomijane, ale mo na je dodawać do programu, aby zwiększyć jego czytelność. Dalej będziemy odwoływać się do umieszczonych w komentarzach numerów klauzul.
  • 27. OQGAWMTCUE :; NQFKGL : NWDK :; Zauwa my, e definicja NWDK składa się z trzech klauzul: dwóch faktów i jednej reguły. Teraz przyjrzyjmy się, co się będzie działo, kiedy zadamy zapytanie Co mo e ukraść Jan? Najpierw zapiszmy to zapytanie w formie: ! OQGAWMTCUE LCP: Prolog będzie działał następująco: 1. Najpierw odszukana zostanie klauzula pasująca do OQGAWMTCUE, czyli klauzula 5. Prolog oznaczy to miejsce w bazie danych. Jest to reguła, więc aby prawdziwa była głowa, spełnione muszą być cele z jej treści. Wobec tego zmienna : z reguły jest ukonkretniana wartością LCP z zapytania. Widzimy, e mamy do ukonkretnienia dwie zmienne: : z zapytania i ; z reguły, obie zmienne zostają powiązane. Aby reguła została uzgodniona, uzgodnione muszą zostać jej cele; szukanie zaczyna się od pierwszego celu, NQFKGL LCP. 2. Cel jest uzgadniany, gdy istnieje po prostu fakt NQFKGL LCP (klauzula 1.). Prolog oznacza to miejsce w bazie danych, nie są ukonkretniane adne inne zmienne. Prolog następnie stara się spełnić drugi cel klauzuli 5. : jest równowa ne wartości LCP, więc Prolog szuka dopasowań do NWDK LCP;. Zmienna ; nadal nie jest ukonkretniona.
  • 28. 28 Prolog. Programowanie 3. Cel NWDK LCP; pasuje do głowy reguły z klauzuli 4. Zmienna ; występująca w treści reguły jest powiązana z : z głowy, obie zmienne są nieukonkretnione. Aby regułę spełnić, szukamy celu NWDK :YKPQ. 4. Cel jest spełniany, gdy istnieje fakt NWDK OCTKCYKPQ (klauzula 3.). Wobec tego : oznacza teraz nazwę OCTKC. Cel klauzuli 4. został spełniony, więc spełniona jest cała reguła i wynika z niej fakt NWDK LCPOCTKC. Wobec faktu powiązania ; z klauzuli 5. z : (z klauzuli 4.), : te otrzymuje wartość OCTKC. 5. Klauzula 5. jest spełniona, zmienna ; jest ukonkretniona wartością OCTKC. ; była powiązana z drugim argumentem zapytania, więc szukana wartość to OCTKC. Wybraliśmy ten przykład, aby pokazać, jak łatwo jest uzyskać niespodziewane rezul- taty, właśnie takie jak „Jan mo e ukraść Marię”. Do tego wniosku Prolog doszedł na- stępująco: Aby ukraść cokolwiek, Jan musi być przede wszystkim złodziejem. Z klauzuli 1. wynika, e tak właśnie jest. Następnie Jan musi lubić to, co ma ukraść. Z klauzuli 4. wynika, e Jan lubi wszystko, co lubi wino. Z klauzuli 3. wynika, e Maria lubi wino, wobec czego Jan lubi Marię. Wobec tego, e spełnione są obydwa warunki ukradzenia czegoś, Jan mo e ukraść Marię. Zauwa my, e fakt, i Maria lubi czekoladę (klauzula 2.) jest w całym rozumowaniu w ogóle nie u ywany. W powy szym przykładzie wielokrotnie w kolejnych klauzulach u ywaliśmy zmien- nych : i ;. Na przykład w regule OQGAWMTCUE zmienna : oznacza obiekt, który mo e coś ukraść, zaś w regule NWDK oznacza obiekt lubiany. Aby nasz program działał pra- widłowo, Prolog musi uwzględnić, e ta sama zmienna w dwóch ró nych wywołaniach klauzul mo e mieć ró ne znaczenie. Znajomość zakresu obowiązywania zmiennych pozwala uniknąć pomyłek w tym zakresie. Mo na byłoby u yć łatwiejszych do zin- terpretowania nazw zmiennych, ale u yliśmy krótkich, niewiele mówiących nazw, aby pokazać, jak ustalany jest zakres obowiązywania zmiennych. Podsumowanie i ćwiczenia Omówiliśmy ju najwa niejsze zasady Prologu. W szczególności zapoznaliśmy się z: Dodawaniem faktów dotyczących obiektów. Zadawaniem zapytań o fakty. U yciem zmiennych i ich zakresami. Koniunkcją jako sposobem łączenia zdań spójnikiem „i”. Zapisywaniem relacji jako reguł. Podstawami nawracania.
  • 29. Rozdział 1. ♦ Wprowadzenie 29 Tak mały zbiór technik wystarcza do tworzenia przydatnych programów obsługują- cych niewielkie bazy danych. Warto w celu utrwalenia materiału wykonać podane poni ej ćwiczenia. Przed rozpoczęciem pisania programów w wybranym systemie Prologu nale y zaj- rzeć do podręcznika, aby obejrzeć przykład sesji. Nieco praktycznych porad znajduje się tak e w rozdziale 8. Teraz, kiedy znamy ju podstawy Prologu, mo emy przejść do następnego rozdziału, w którym wyjaśnione zostaną niektóre zagadnienia w tym rozdziale tylko wspomnia- ne. Poka emy te , jak w Prologu traktowane są liczby. W następnych kilku rozdzia- łach będziemy mogli docenić mo liwości Prologu i wygodę jego u ycia. Ćwiczenie 1.2. Kiedy reguła UKQUVTC zostanie zastosowana do pokazanej wcześniej bazy danych opisującej rodzinę królowej Wiktorii, otrzymamy więcej ni jedną od- powiedź. Wyjaśnij, skąd te odpowiedzi się biorą i jakie one są. Ćwiczenie 1.3. Inspiracją do tego ćwiczenia było ćwiczenie z ksią ki „Logic for Pro- blem Solving” (Logika a rozwiązywanie problemów) Roberta Kowalskiego wydanej przez North Holland w 1979 roku. Załó my, e zapisano w formie klauzul Prologu następujące relacje: QLEKGE :;
  • 30. : LGUV QLEGO ;
  • 32. : LGUV OCVMæ ;
  • 34. : LGUV Oú E[Pæ
  • 36. : LGUV MQDKGVæ
  • 38. : LGUV TQFKEGO ;
  • 40. : K ; Uæ TÎ PG
  • 41. Nale y zapisać klauzule definiujące relacje: LGUVAOCVMC :
  • 42. : LGUV OCVMæ
  • 44. : LGUV QLEGO
  • 46. : LGUV U[PGO
  • 48. : LGUV UKQUVTæ ;
  • 50. : LGUV FKCFMKGO ;
  • 52. : K ; Uæ TQFG UVYGO
  • 53. Przykładowo, mo na byłoby napisać regułę EKQVMC korzystającą z danych wcześniej reguł MQDKGVC, TQFGPUVYQ i TQFKE: EKQVMC :; MQDKGVC : TQFGPUVYQ : TQFKE ; Mo na te tę regułę zapisać inaczej: EKQVMC :; UKQUVTC : TQFKE ; gdy ma się do dyspozycji regułę UKQUVTC. Ćwiczenie 1.4. Korzystając z przedstawionej w tym rozdziale reguły UKQUVTC wyja- śnij, dlaczego obiekt mo e być swoją własną siostrą. Jak nale y zmienić tę regułę, aby tak nie było? Wskazówka: nale y zało yć, e dany jest predykat FKHH z ćwiczenia 1.3.