Prolog struktury danych oraz obliczenia 1. Arytmetyka?- Y is 2+2. Y = 4?- 5 is 3+3. false.?- Z is 4.5 + (3.9 / 2.1). Z = 6.357142857142857. Wbudowany predykat is bierze wyrażenie po prawej, oblicza je i porównuje z argumentem po lewej. Obliczenia w prologu wyglądają bardzo podobnie jak w innych językach programowania. Najproższe wyrażenie to wyrażenie z samą liczbą np.?- What is 2. What = 2.
Podstawowe operacje arytmetyczne: Infix operators: + dodawanie - odejmowanie * mnożenie / dzielenie liczb zmiennoprzecinkowych // dzielenie liczb całkowitych ^ potęgowanie mod modulo Funkcje: abs() sqrt() log() exp() floor() round() wartośd całkowita pierwiastek logarytm o podstawie e funkcja eksponencjalna funkcja podłogi zaokrąglanie Kolejnośd wykonywania działao jest taka sama jak w większości języków programowania, czyli: ^ jako pierwsze, potem * oraz /, następnie + i -. Jeśli operatory są sobie równe kolejnośd wykonywania jest od lewej do prawej. Na przykład 4+3*2+5 to to samo co (4+(3*2))+5. Prolog obsługuje liczby całkowite oraz zmiennoprzecinkowe i rzutuje je jeśli to potrzebne.
Liczby zmiennoprzecinkowe mogą byd wyrażane przy pomocy formatu E np.: 3.45E-6 * 3.45 x 10-6. Prolog nie służy do rozwiązywania równao, nie rozwiąże zadania z niewiadomą po prawej stronie, czyli np.: 5 is 2+What. Nie obliczy wartości, tylko zwróci false. Zamiast tego powinno byd: What is 5-2. Dużą różnicą pomiędzy Prologiem, a innymi językami programowania jest to, że wyrażenia arytmetyczne nie są obliczane za każdym razem, kiedy wystąpią, ale tylko w konkretnych miejscach. Na przykład 2+2 jest wyliczane jako 4 tylko jeśli jest to argument predykatu z tabeli poniżej, w innych przypadkach jest to po prostu struktura danych złożona z 2, +, 2. R is Expr Oblicza wyrażenie i zapisuje je w R Expr1 =:= Expr2 Prawda jeśli oba wyrażenia są równe Expr1 =\= Expr2 Prawda jeśli wyrażenia są różne Expr1 > Expr2 Prawda jeśli wyrażenie 1 > wyrażenie 2 Expr1 < Expr2 Expr1 >= Expr2 Expr1 =< Expr2
Predykat is bierze wyrażenie po prawej strony, oblicza i wynik umieszcza w argumencie po lewej =:= oblicza dwa wyrażenia i porównuje wyniki =, umieszcza argument po prawej stronie w argumencie po lewej. Po prawej stronie nie musi znajdowad się wyrażenie arytmetyczne, jeśli się znajduje, nie zostanie obliczone. Tak więc:?- What is 2+3. What = 5.?- 4+1 =:= 2+3. true.?- What = 2+3. What = 2+3.
Inne porównania <, >, =<, >= działają tak jak =:=, ale wykonują inny test. Należy zwrócid uwagę na to, że zapisujemy =< oraz >=, nie => i <=, ponieważ takie wyrażenia wyglądają jak strzałki i twórcy Prologa postanowili zostawid je niezdefiniowane. Listy: Ważną strukturą danych w Prologu jest lista. Pusta lista zapisywana jest jako []. Lista jednoelementowa [a] nie jest równoważna pojedynczemu elementowi a. Listę można podzielid na początek i resztę używając. Przykład: [1,2,3,4,5] [First Rest] Tekst podany w cudzysłowie interpretowany jest jako kody ASCII, stąd jeśli napiszemy: Otrzymamy:?- write("abc"). [97,98,99] Metoda jak wyświetlid tekst jako normalny tekst, nie kody ASCII: write_str([head Tail]) :- put(head), write_str(tail). write_str([]).
Stąd widad, że tekst podany w cudzysłowie jest listą znaków (jak String w większości języków programowania). Przykłady struktur: person(name('michael Covington'), gender(male), birthplace(city('valdosta'), state('georgia'))). sentence(noun_phrase(determiner(the), noun(cat)), verb_phrase(verb(chased), noun_phrase(determiner(the)), noun(dog))). Unify With Result a(b,c) X X=a(b,c) a(b,c) a(x,y) X=b, Y=c
a(b,c) a(x) fails a(b,c) a(x,y,z) fails Wbudowany predykat functor zwraca do zmiennych nazwę struktury oraz ilośd argumentów np.: functor(a(b,c,d),x,y). X = a, Y = 3. Wbudowany predykat arg(n,s,x) wstawia pod zmienną X n-ty argument struktury S np.: arg(2,a(b,c,d,e),what). What = c. Można stworzyd zapętloną strukturę, która wskazuje na samą siebie np.:
X = f(x). Error: X = f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f... W takim przypadku możemy użyd: unify_with_occurs_check(x,f(x)). I w wypadku, gdy byłoby zapętlenie, funkcja zwróci false, w innym przypadku nastąpi przypisanie. unify_with_occurs_check(x,f(a)). X = f(a). Ponieważ zapytanie w Prologu jest strukturą, możesz je traktowad jako dane i konstruowad je podczas uruchomienia programu. Call wykonuje argument jak pytanie, więc call(write(`hello there`)) jest równoznaczne z write(`hello there`)