Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Jezyk programowania Prolog

Prolog język programowania logicznego. Program Prologu to opis reguły wnioskowania oraz celu do którego zmierzamy, a rola komputera polega na odpowiednim zastosowaniu reguł aby znaleźć rozwiązanie.

Do programowania w Prologu, używałem darmowego SWI-Prolog oraz edytora SWI-Prolog-Editor.

Instalacja programu

Pobieramy na początek SWI-Prolog, który instalujemy na swoim sprzęcie, a później edytor, który ułatwi nam pracę z programem.

Obsługa programu

Podczas tworzenia nowego projektu powinniśmy go najpierw zapisać, a przed jego uruchomieniem dokonać sprawdzenia (Start - Consult lub klawisz F9). Górne cześć to okno edytora, gdzie umieszczamy fakty oraz reguły.
Jeżeli mamy zamiar wprowadzić jakieś zapytanie to wykonujemy go w dolnej części.

Fakty

W Prologu podaje się bazę faktów i reguł. Potem można wykonywać zapytania na tej bazie.
Podstawową jednostką w Prologu jest predykat. Predykat składa się z nagłówka i
argumentów, na przykład: ojciec(tomasz, agata), gdzie ojciec to nagłówek a tomasz i agata to argumenty.

Przykładowe fakty:rodzic(jacek,krzys). rodzic(iza,krzys). rodzic(jacek,ola). rodzic(iza,ola). rodzic(andrzej,jas). rodzic(anna,jas). rodzic(krystyna,iza). rodzic(krystyna,andrzej). rodzic(halina,jacek). rodzic(jozef,jacek). rodzic(jan,iza). rodzic(jan,andrzej). rodzic(cecylia,halina).

Przykładowe rozwiązanie:?- rodzic(jacek,krzys). yes ?- rodzic(ola,krzys). noSprawdzenie czy Jacek jest rodzicem Krzysia? Tak.

Możemy sprawdzić kto jest rodzicem Oli.?- rodzic(X,ola). jacek ; iza

Dodając kolejne fakty do obecnychkobieta(iza). kobieta(anna). kobieta(ola). kobieta(krystyna). kobieta(halina). kobieta(hanna). kobieta(cecylia). mezczyzna(krzys). mezczyzna(jacek). mezczyzna(andrzej). mezczyzna(jozef). mezczyzna(jan).

Sprawdźmy teraz kto jest wnukami Krystyny.?- rodzic(krystyna, X), rodzic(X,Y).Możemy zapisać to w inny sposób dodając regułębabcia(X,Y):-rodzic(X,Z),rodzic(Z,Y),kobieta(X).

Sprawdźmy czy działa:?- babcia(krystyna,Y). Y = krzys ; Y = ola ; Y = jas. 

Komentarze

0 nowych
Jaahquubel_   13 #1 24.05.2011 16:50

A gdzie jest zakończenie?
Nie za szybko się ten wpis skończył?

Vifon   5 #2 24.05.2011 18:23

Faktycznie brakuje jakiegoś wyraźnego zakończenia, ale zaciekawiłeś mnie. Słyszałem o Prologu, ale nigdy nie chciało mi się zagłębić.
Skopiowałem Twój kod i oto co mam:
uncaught exception: error(existence_error(procedure,rodzic/2),top_level/0)
Kompilator gprolog.

Vifon   5 #3 24.05.2011 20:12

Dobra, już widzę w czym problem. Musiałem to jeszcze skompilować przy użyciu gplc. Mogłeś o tym napisać.

NRN   9 #4 24.05.2011 22:05

Ogółem, polecam w w Windowsie korzystać z SWI-Prolog i dodawanego do niego edytora emacs. Pod linuxem nie pomogę.

Aha, i to co kolega pokazał, to tylko zestaw faktów i odpytywania w oparciu o nie. Ogółem, można jeszcze definiować predykaty w formie (uprzedzam, piszę z pamięci, mam nadzieję, że to dobrze pamiętam ;P):
---
matka(zofia,adam).
ojciec(jozef,adam).
czy_rodzic(X,Y):-matka(X,Y); ojciec(X,Y).
---
Oznacza to tyle:
---
Matką Adama jest Zofia.
Ojcem Adama jest Józef.
X jest rodzicem Y, jeśli jest matką, lub jeśli jest ojcem.
Gdyby w miejscu średnika znalazł się przecinek, wówczas "lub" należałoby zamienić na "i", a funkcja zawsze by zwracała "no" lub "false", zależnie od środowiska.
Odpytanie powyższej funkcji:
---
czy_rodzic(jozef,adam).
---
Odpowiedź powinna brzmieć "true", lub "true, false.", gdyż, jak znam życie, nastąpi nawrót i sprawdzi przy okazji, zakładając, że nie jest ojcem, czy jest matką :P
To jest zupełnie inna szkoła programowania - nie jest to programowanie imperatywne (na poleceniach / rozkazach), lecz deklaratywne.
---
Dziwi mnie, że autor rozpoczął temat i urwał go w sumie w zarodku. Sporo więcej mógł w pojedynczym wpisie zamieścić. Jeśli kiedyś będę miał trochę czasu i chęci, to oprócz reklamacji o deklaratywnym programowaniu coś zamieszczę ;) Ale, jak zwykle - może wyjść, że to obiecanki cacanki ;p

szymon189   10 #5 25.05.2011 12:54

Sory, ale to był mój pierwszy wpis :) Jeszcze miałem zamiar dodać kolejny wpis na temat reguł.

Vifon   5 #6 25.05.2011 14:21

W takim razie czekam na ciąg dalszy, bo zapowiada się ciekawie, a jestem zbyt leniwy by poszukać jakiegoś tutoriala i trzeba mi podetknąć pod nos. ;) Tylko załącz jakieś szczegóły dotyczące uruchamiania, bo to nie jest takie oczywiste.

NRN   9 #7 25.05.2011 15:55

Vifon, pod windowsem to tyle co klikać "dalej" w instalatorze. Dosłownie ;P A później tworzysz odpowiedni plik na kod, uruchamiasz za jego pomocą interpreter, ewentualnie wydajesz komendę zmiany edytora na emacs. I tyle :D

Szymon, jakbyś chciał coś w sprawie prologa przedyskutować lub jakąś współpracę nawiązać, to jestem chętny ;) Jakkolwiek za deklaratywnym aż tak nie przepadam, to jednak możliwości ma całkiem interesujące ;)

matzu   5 #8 25.05.2011 20:08

Bardzo ubogi ten wpis. Rozumiem, że to pierwszy z kilku, które planujesz. IMO powinieneś zacząć od opisania środowiska, w którym pisze się programy w prologu. Jakieś krótkie wprowadzenie, a więc parę słów o IDE, parę słów o debuggerze. Poza tym z racji tego, że jest to pierwszy wpis, to powinieneś też napisać o zastosowaniach Prolog-a (np. sztuczna inteligencja). I jeszcze jedno ... Jeśli chcesz sprawdzać kto jest wnukiem Krystyny to poprawna reguła wygląda następująco:
rodzic(krystyna, X), rodzic(X,Y),mezczyzna(Y).

matzu   5 #9 25.05.2011 20:19

Dodam jeszcze tylko, że najlepiej to byłoby to zapisać w następujący sposób: wnuk(X,Y):-rodzic(X, Z), rodzic(Z,Y),mezczyzna(Y).

Wówczas wywołując wnuk(krystyna,X) w odpowiedzi dostaniemy tylko imiona wnuków (nie interesują nas przecież imiona ich rodziców).

matzu   5 #10 25.05.2011 20:41

Może jeszcze jedna rzecz, ale teraz już na prawdę ostatnia :). Nie wiem jaki masz plan na ten cykl wpisów, ale mógłbyś go poprowadzić w ten sposób, aby na jego końcu, czytelnicy byli w stanie samodzielnie stworzyć chat bot-a (to jest jedno z ciekawszych zastosowań prolog-a).

LordRuthwen   6 #11 26.05.2011 08:47

Liznęliśmy to na studiach, jakoś nie przekonało mnie to do dalszego wgłębiania się w temat :)

Druedain   14 #12 26.05.2011 09:43

Prolog – zmora na UWr dla studentów na drugim semestrze i jednocześnie rozgrzewka przed Haskellem ^^ Dla mnie ten język pozostaje nieosiągalny :P (oczywiście wspomniany przykład jest jak najbardziej osiągalny; to wszelkiego rodzaju operacje na tablicach są takie urocze).

  #13 26.05.2011 11:37

@NRN | 24.05.2011 22:05 :
Tak - zapomnieliśmy, że Emacs nie jest dostępny na Linuksa ;-) .

szymon189   10 #14 26.05.2011 19:00

Zmodyfikowałem trochę wpis dodając instalację oraz obsługę programu. Pokazałem użycie reguły.

@NRN może razem coś napiszemy w II części?