PROLOG Prolog jest językiem programowania w logice: --> Standard ISO --> Implementacja SWI Prolog --> Implementacja GNU Prolog OBSŁUGA ------- Używamy gprolog (GNU Prolog). Interesują nas dwie komendy: gplc plik_programu.pro --> kompiluje plik_programu.pro do postaci wykonywalnej. Uruchamiamy wynikowy plik ./plik_programu i lądujemy w konsoli. gprolog --> uruchamia konsolę interaktywną. Skróty klawiszowe: ^c przerywa działanie (h -- help, e -- exit) ^d kończy działanie zaakceptowanie wyniku ; następny wynik a wszystkie wyniki KONWENCJE --------- Zmienne pisane wielkimi literami. Stałe pisane małymi literami. _ (podkreślenie) oznacza dowolną nieistotną wartość. Termy to wyrażenia --> proste (stałe i zmienne) --> złożone (termy proste połączone funktorami) Funktory , i ; lub :- jeśli Kropka kończy wyrażenie . koniec warunku SKŁADNIA -------- Zad. Sprawdź następujące predykaty (warunki) w odniesieniu do zmiennych i stałych: T=S. unifikacja (czyli przyrównanie logiczne) A=b. unifikacja a=b. unifikacja var(T). czy T jest zmienną? nonvar(T). czy T nie jest zmienną? atom(T). czy T jest stałą, ale nie liczbą? number(T). czy T jest liczbą? compound(T). czy T jest termem złożonym? Inne --> str.55 manuala [www.gprolog.org/manual/gprolog.pdf] = tak, jeśli unifikacja możliwa \= tak, jeśli unifikacja niemożliwa == tak, jeśli porównanie wypadło pozytywnie \== tak, jeśli porównanie wypadło negatywnie @< tak, jeśli term mniejszy od drugiego @=< tak, jeśli term mniejszy równy od drugiego @> tak, jeśli term większy od drugiego @>= tak, jeśli term większy równy od drugiego Operatory i funkcje arytmetyczne --> str. 67,68 manuala =:= arytmetyczna równość =\= arytmetyczna nierówność <, =< arytmetycznie mniejsze, mniejsze równe >, >= arytmetycznie większe, większe równe Zad. Sprawdź odpowiedzi systemu na poniższe zapytania para(a,b)=para(x,y). para(a,b)=para(X,Y). para(a,b)=para(X,Y),Z=para(Y,X). FUNKCJE vs. RELACJE ------------------- Relacja jest podzbiorem iloczynu kartezjańskiego XxY, przy czym jeden element z X może być w relacji z więcej niż jednym elementem z Y. Funkcja jest relacją, która jest jednoznacznym odwzorowaniem X-->Y. Prolog operuje nie tylko na funkcjach, ale również na relacjach. Pozwala to na znajdowanie więcej niż jednego wyniku spełniającego wszystkie zadane warunki. Zad. Pokrewieństwo. Stwórz plik tekstowy genealogia.pro o treści: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rodzice(uranus, gaia, rhea). rodzice(uranus, gaia, cronus). rodzice(cronus, rhea, zeus). rodzice(cronus, rhea, hera). rodzice(cronus, rhea, demeter). rodzice(zeus, leto, artemis). rodzice(zeus, leto, apollo). rodzice(zeus, demeter, persephone). ojciec(X, Y) :- rodzice(X, _, Y). matka(X, Y) :- rodzice(_, X, Y). rodzic(X, Y) :- ojciec(X, Y); matka(X, Y). dziadek(X, Z) :- ojciec(X, Y), rodzic(Y, Z). babcia(X, Z) :- matka(X, Y), rodzic(Y, Z). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Skompiluj go i uruchom komendami: gplc genealogia.pro ./genealogia Znajdź rodziców Zeusa poleceniem: | ?- rodzic(Rodzic,zeus). | ?- matka(Rodzic,zeus). itd. Listy ----- Funktor . (kropka) oznacza dodanie elementu (głowy) do reszty listy (ogona) Zapis z kropką Zapis równoważny [] [] .(a,[]) [a] .(a,.(b,[])) [a,b] .(.(a,[]),.(.(a,.(b,[])),[])) [[a],[a,b]] Przykład: równoważność zapisów ------------------------------ | ?- XZ = .(.(a,[]),.(.(a,.(b,[])),[])). Przykład: odwrócenie listy -------------------------- | ?- L1=[1,2,3,4], L1=[A,B,C,D], L2=[D,C,B,A]. Inne operacje na listach ------------------------ member(X,[1,2,3]). <==> L=[1,2,3], member(X,L). append([1,2,3],[2,3,4],N). <==> L=[1,2,3], M=[2,3,4], append(L,M,N) select(1,[1,2,3],L). ... Zad. Wykonaj polecenie append(L1,L2,L3). Kolejne rozwiązania przewijaj średnikiem, albo wciśnij a dla wyświetlenia wszystkich. Co się dzieje? Wyjście przez ^c b (break). Zad. Wykonaj polecenie | ?- append(X,Y,[a,b,c]). Zad. Wykonaj polecenia | ?- select(X,[1,2,3],L) | ?- select(a,L,[1,2,3])