Realne zastosowania języka Prolog

Trudno nie zgodzić się z opinią, że Prolog jest językiem pod wieloma względami ciekawym. Chociażby dlatego, iż reprezentuje on paradygmat programowania logicznego, który zdecydowanie nie należy do najczęściej używanych. Sądzę, że owa odmienność od tego, z czym mamy styczność na co dzień jest jednym z powodów, dla których warto poznać pewne podstawy Prologa. Zyskujemy w ten sposób nową perspektywę, której nie osiągnęlibyśmy zapoznając się tylko z technologiami z tej samej rodziny i o podobnej filozofii do tych znanych nam wcześniej.

Przyznajcie sami, czy powyższy fragment (z którym jako jego autor w pełni się zgadzam) nie brzmi trochę górnolotnie, a równocześnie nieco zbyt… pusto? Tego typu opinia, jako jedyny argument podnosząca w zasadzie tylko zaletę w postaci poznania odmiennego sposobu rozwiązywania problemów, nie dość że nie satysfakcjonuje, to jeszcze rodzi pytania:

  • Do czego, oprócz zwykłego „znania go”, może przydać się nam Prolog?
  • Jakie rzeczywiste problemy można rozwiązywać z jego pomocą?
  • Czy jest to język, którego znajomość będziemy mogli w jakiś sposób „spieniężyć”, i który da się wykorzystać komercyjnie (pomijając pisanie książek traktujących o nim)?
  • Czy istnieją jakieś przykłady normalnych, użytecznych aplikacji, które powstały z wykorzystaniem Prologa?

Przyznam, że tak postawione pytania wzbudziły moją ciekawość – postanowiłem więc zbadać ów temat, aby odpowiedzieć na nie. Zadanie to nie było jednak trywialne. O ile bowiem znalezienie przykładów oprogramowania napisanego w C++, Javie, Pythonie, czy innej popularnej obecnie technologii nie stanowi większego problemu, o tyle wyszukanie aplikacji stworzonych z wykorzystaniem Prologa nie jest już takie proste. Czy ktokolwiek kiedykolwiek użył w ogóle tego języka do innego celu niż modelowanie drzewa genealogicznego i relacji rodzinnych lub rozwiązywanie zagadek logicznych? Przekonajcie się sami:

Uczenie innych

Szukając realnych zastosować Prologa z pewnością natkniemy się na zabarwione humorystyczną nutą komentarze w stylu „it’s used for teaching Prolog”. Cóż, jest to jakieś zastosowanie. Warto je rozważyć zwłaszcza jeżeli jeszcze studiujecie i wiążecie swoją dalszą karierę z pracą na uczelni. 😉 Mówiąc zaś bardziej poważnie, przekazywanie innym wiedzy z zakresu programowania logicznego przez osoby, które dobrze je poznały, może być całkiem sensowną opcją. Co ciekawe, podobno Prolog ma tendencję łatwiej wchodzić do głowy tym, którzy dopiero zaczynają swoją przygodę z programowaniem, aniżeli ludziom z umysłami już zakorzenionymi w pięknych zasadach programowania obiektowego. Może więc warto podjąć się misji przybliżania języka Prolog szerszemu gronu odbiorców? Może akurat któryś z uczniów użyje go do stworzenia czegoś, co zmieni świat?

Systemy eksperckie

To prawdopodobnie jedno z najpopularniejszych produkcyjnych zastosowań tego języka. Dysponując odpowiednią bazą wiedzy oraz prawidłowo zbudowanymi regułami operującymi na przechowywanych w niej danych, aplikacja może symulować działanie eksperta w jakiejś dziedzinie i podejmować decyzje, które z logicznego punktu widzenia są najbardziej korzystne. Zazwyczaj użytkownik ma możliwość formułowania pytań, system ekspertowy udziela na nie odpowiedzi. Przekrój tematów, w których budowane są systemy ekspertowe jest naprawdę spory. Oto przykłady tego typu oprogramowania stworzonego z wykorzystaniem Prologa:

  • WADNES – aplikacja wspierająca obsługę awarii związanych z systemem dystrybucji wody. Zbudowana została w latach 80. w oparciu o środowisko WIESSE (Water Industry Expert System Support Environment), które było bazą również dla innych systemów eksperckich związanych z tą samą branżą.
  • PigE/AUSPIG- system do… hodowli trzody chlewnej. AUSPIG był przeznaczonym dla MS-DOS narzędziem, analizującym informacje wprowadzane przez farmerów i generującym symulacje dotyczące wydajności wzrostu trzody. Jego bolączką był fakt, że aby osiągnąć prawdziwe korzyści z dostarczanych wyników potrzeba było do tego eksperta. Rozwiązaniem okazała się PigE – inteligentna powłoka, która zamieniała dane wyjściowe z systemu AUSPIG na prologowe fakty i umożliwiała ich eksplorowanie normalnemu użytkownikowi.
  • RoadWeather – oprogramowanie przeznaczone do krótkoterminowej prognozy pogody, wykorzystywane do kontrolowania stanu autostrad zimą. W skład zbudowanej dla systemu Windows 3.1 aplikacji wchodziły moduły napisane w FORTRANIE oraz interfejs graficzny i tzw. Expert Weather Advisor – oba stworzone w Prologu. Program oferował użytkownikowi interaktywny interfejs, w którym metodą point&click można było manipulować wizualizowanymi „obiektami pogodowymi”.

To oczywiście nie jedyne przykłady systemów ekspertowych budowanych z użyciem Prologa. Powstało też choćby oprogramowanie wspomagające podejmowanie decyzji z dziedziny medycyny (OSM – Oxford System of Medicine), geologii (Goldfinder), sportu (Fantasy Basketball) czy prawa (lex2).

Prolog w smartfonie

Czy spodziewalibyście się znaleźć prologowe skrypty w oprogramowaniu smartfona? Wprawdzie nie chodzi tu o żadną z najnowszych wersji Androida, ale o, już trochę wiekowe, telefony Nokia N900, N950 oraz N9, niemniej takie użycie pozostaje faktem. Do czego konkretnie wykorzystali język Prolog inżynierowie Nokii w działających pod kontrolą opartego na Linuksie systemu Maemo? Zastosowaniem tym okazała się implementacja reguł zarządzania politykami w module maemo-multimedia. Część napisanego w Prologu kodu można znaleźć w repozytorium na Gitoriousie (link). Myślę, że warto poświęcić czas na jego lekturę – jest to w końcu jeden z nielicznych dostępnych publicznie przykładów produkcyjnego (i to nie to byle jakich zastosowań) kodu w Prologu.

Nokia N900 (fot. Ianaré Sévi)

Reguły sieciowe w Windowsie

Jednym z wartych odnotowania użyć języka Prolog jest jego obecność w systemach z rodziny Windows NT. Został on wykorzystany przy tworzeniu mechanizmów związanych z konfiguracją sieciową, a implementacja której użyto to interpreter o nazwie Small Prolog. Na stronach Microsoftu (obecnie dostępnych już tylko w Web Archive – link) opisano zaprojektowany i wdrożony algorytm. Jak podkreśla David Hovel, autor wspomnianego artykułu, rezultaty użycia Prologa do przedstawionego problemu okazały się nadzwyczaj pozytywne, zarówno z punktu widzenia użytkowników, którzy uważali konfiguracje sieci w tym systemie za prostą i stabilną, jak i z punktu widzenia programistów, chwalących m.in. dobrą rozszerzalność mechanizmów konfiguracyjnych.

Branża kosmiczna

Ciekawostką jest, że prologowy kod zawędrował również poza naszą planetę. W kosmiczną podróż swoje oprogramowanie napisane w Prologu wysyłali zarówno Amerykanie, jak i Rosjanie. Ci pierwsi (tzn. NASA) uczynili to tworząc eksperymentalny system Clarissa, który umożliwia sterowane głosowo przeglądanie procedur na Międzynarodowej Stacji Kosmicznej. Jak wiadomo, codzienna praca astronautów wymaga szczegółowego wykonywania wielu dokładnie zdefiniowanych zadań, takich jak kontrolowanie systemów podtrzymujących życie, prowadzenie eksperymentów naukowych czy sprawdzanie kombinezonów. Standardowo stosowane rozwiązanie w postaci przeglądania PDF-ów wyświetlanych na laptopie nie należy do najbardziej optymalnych, w związku z czym opracowano system Clarissa. Przede wszystkim musi on rozpoznawać czy załoga ISS kieruje komendy w jego stronę, czy po prostu rozmawia między sobą. Program zawiera słownik około 260 wyrazów i wspiera ponad 70 poleceń, m.in. przewijania instrukcji do przodu i do tyłu, dodawania oraz usuwania notatek głosowych, czytania wybranych kroków itd. Oprogramowanie składa się z 6 głównych modułów, do których napisania wykorzystano kilka języków programowania. I tak:  GUI powstał przy użyciu Java Swing, procesor mowy napisano w C++, zaś analizator semantyczny oraz menadżer dialogów zaimplementowano własnie w Prologu (konkretniej mówiąc: SICStus Prologu).

A jak wykorzystało potęgę Prologa przeciwstawne mocarstwo? Otóż radzieccy programiści zaprzęgli go do pracy z wahadłowcami kosmicznymi programu Buran (czy również bezpośrednio na ich pokładzie – pewności nie ma). Niestety trudno znaleźć jakiekolwiek bardziej szczegółowe informacje na ten temat.  Z doniesień CIA (link) wiadomo tylko, że „Sowieci użyli rozwijanego przez Francuzów języka programowania znanego jako Prolog do tworzenia oprogramowania systemu pokładowego dla statków” oraz że wykorzystali go do zdalnej naziemnej kontroli lotu i systemów sztucznej inteligencji, w celu zwiększenia odporności na błędy kontroli misji. Według niektórych źródeł Rosjanie programowali też w dialekcie Prologa o nazwie PROL2, który był zaprojektowany do tworzenia oprogramowania czasu rzeczywistego, więc temat ten wydaje się być wyjątkowo interesujący.

Wahadłowiec kosmiczny Buran przenoszony przez bombowiec M-4 (źródło: Wikimedia)

Przetwarzanie języków naturalnych

NLP (Natural Language Processing) to kolejne po systemach ekspertowych ważne zastosowanie Prologa. Przykładem tego typu aplikacji jest m.in. wspomniane już wcześniej oprogramowanie Clarissa wdrożone na Międzynarodowej Stacji Kosmicznej. Innym reprezentantem należącym do tej grupy jest przykładem IBM Watson – superkomputer, który wyposażony jest w system częściowo napisany Prologu. W 2011 roku Watson wystartował wziął udział w wyzwaniu, polegającym na zmierzeniu się z ludźmi w grze Jeopardy! (w polskiej edycji teleturniej oparty na tych samych zasadach nosił nazwę Va banque). Jej idea to zagadki w formie zdań twierdzących (np. „Był reżyserem serialu Zmiennicy, a jako aktor zagrał pana Jana w filmie Miś„) i odpowiedzi na nie formułowane jako pytania („Kim był Stanisław Bareja?”). Aby zwyciężyć Watson musiał zatem nie tylko posiadać dostęp do odpowiednio obszernej bazy danych, ale też być w stanie we właściwy sposób interpretować zadawane „pytania”. Jak można przeczytać w [2], użycie do tego celu Prologa okazało się korzystnym wyborem i pozwoliło zwiększyć wydajność względem poprzednio wykorzystywanej implementacji.

Finanse

SecuritEase to przykład obszernego systemu, mogącego pochwalić się dużymi i poważnymi wdrożeniami komercyjnymi. Jest to oprogramowanie z branży finansowej, a konkretniej związane z akcjami giełdowymi i przeznaczone m.in. dla biur maklerskich. Aplikacja klientów głównie w Australii i Nowej Zelandii, przy czym szacuje się, że w drugim z wymienionych tu krajów SecuritEase przetwarza większość transakcji giełdowych. Język Prolog został w niej wykorzystany jako główna technologia – według statystyk projektu liczba linii kodu napisanych w tym języku wynosiła w sierpniu 2012 ponad 1.5 miliona. Prologa użyto zarówno do modułów związanych z graficznym interfejsem użytkownika, bazą danych, a także do tworzenia ogólnej logiki aplikacji. Z materiałów zaprezentowanych przez autorów programu (link) dowiedzieć się można paru ciekawych faktów dotyczących korzystania z tak niszowej technologii, począwszy od problemu braku programistów Prologa na rynku i przyjętej strategii developmentu, aż po bibliotekę, której użyto do pisania testów jednostkowych (plunit).

Maszyna wirtualna Javy

Otwórzcie którąkolwiek z najnowszych specyfikacji Java VM (np. 7, 8 lub 9) i wyszukajcie w treści dokumentu wyraz „Prolog”. Zaskoczeni? Przyznajcie, że nie spodziewaliście się spotkać tej technologii w takim miejscu. Prolog wykorzystywany jest w tym przypadku do weryfikacji poprawności kodu bajtowego znajdującego się w plikach .class. Co więcej, wspomniana specyfikacja zawiera nie tylko wzmiankę o takim użyciu, ale całkiem sporo fragmentów prologowego kodu. Jaki płynie z tego wniosek? Jeśli jesteśmy potencjalnymi czytelnikami takich dokumentów technicznych jak JVM Specification, to nieznajomość Prologa może nam nieco skomplikować życie…

Podsumowanie

Wymienione powyżej zastosowania języka Prolog to oczywiście nie wszystkie, lista aplikacji, w których wykorzystano tę technologię jest znacznie dłuższa. Dość obszerne, bo liczące ponad 400 wpisów, zestawienie programów napisanych w Prologu można znaleźć pod tym linkiem. Nie jest to rzecz jasna ilość, która mogłaby się równać z oprogramowaniem powstającym w większości obiektowych języków programowania, jednak pokazuje, że wcale Prolog wcale nie jest tak bezużyteczny, jak przypuszczają niektórzy oraz że przekrój jego zastosowań nie jest tak wąski jak mogłoby się wydawać.

Owszem, prawdopodobieństwo, że użyjesz Prologa w pracy jest póki co raczej niewielkie. Szansa, że zleci Ci to ktoś inny jest zaś zapewne jeszcze mniejsza. Jeśli natomiast Ty sam będziesz znał moc programowania logicznego i potrafił ją wykorzystać, to być może nadarzy Ci się okazja, w której najprostszym, najwydajniejszym i najbardziej eleganckim rozwiązaniem będzie własnie implementacja w Prologu, a Ty z tej okazji skorzystasz. Myślę, że kluczem jest to, aby do konkretnych zadań dobierać prawdziwie odpowiednie narzędzia. A pamiętajmy, że tylko znajomość tych narzędzi pozwoli nam to uczynić. Czy zatem warto uczyć się języka Prolog? Ja głosuję na TAK!

 

Źródła

  1. Sovie Software Productivity: Isolated Gains in an Uphill Battle, CIA.
  2. Natural Language Processing With Prolog in the IBM Watson System, A Lally, P. Fodor, 2011.
  3. The Practical Application of Prolog, AI Expert, 1993.
  4. Is Prolog professionally useful?, Software Engineering StackExchange.
  5. Using Prolog for Developing Real World Artificial Intelligence Applications
  6. Spoken Language Processing in the Clarissa Procedure Browser, M. Rayner et al., 2005.
  7. Prolog and CHR in Finance, 2012.