Statyczne i dynamiczne predykaty Dynamiczne dowodzą lub odwołują pewne reguły, Statyczne nie potrafią tego co dynamiczne, ponieważ ich punkty zostały zebrane w całość, która działa szybciej, ale nie jest modyfikowana w czasie wykonywania.
Statyczne i dynamiczne predykaty Obecnie wszystkie predykaty są statyczne chyba, że użytkownik uczyni je dynamicznymi. W pewnych Prologach wszystkie predykaty są dynamiczne. W innych predykaty są dynamiczne, jeżeli użytkownik załaduje klauzule consult lub reconsult lub statyczne przy załadowaniu ich podczas kompilacji.
Statyczne i dynamiczne predykaty Tworzenie dynamicznego predykatu Utworzenie go za pomocą funkcji assert assert(+term) Wprowadzenie przez dodanie punktów do pliku programu, ale poprzedzając je deklaracją: :- dynamic(jakis/2).
Statyczne i dynamiczne predykaty Dynamiczne predykaty mają także inny rezultat. Informują one system Prolog by 'nie martwił się', jeżeli spróbujemy zapytać o predykat, który jeszcze nie istnieje. W wielu przypadkach, zapytanie wygląda następująco:?- f(a,b). Oczywiście zapytanie wykaże błąd, jeżeli nie ma żadnych punktów f/2 w bazie danych. Jednak gdy zadeklarujemy :- dynamic(f/2). Wtedy zapytanie nie zwróci komunikatu błędu.
Statyczne i dynamiczne predykaty Funkcja abolish, służy do usunięcia predykatu z bazy danych, także dynamicznej deklaracji, jeśli taka istnieje. Do usunięcia wszystkich punktów bez wyczyszczenia ich z dynamicznych deklaracji, powinniśmy wywołać polecenia podobne do poniższych: wyczysc_predykat :- retract(f(_,_)), fail. wyczysc_predykat :- retract (f(_,_) :- _), fail. wyczysc_predykat. Oznacza to: odwołanie wszystkich reguł odpowiadających za f(_,_), a następnie odwołanie wszystkich zaczynających się od f(_,_) i zakończenie sukcesem bez podejmowania dalszych akcji.
Predykat consult i reconsult Zadaniem predykatu consult i reconsult jest czytanie (kompilowanie) kodu źródłowego przy użyciu funkcji read/1 oraz dodanie każdego termu do bazy danych.
Predykat consult i reconsult Istnieje jednak pewien wyjątek. Wszystkie termy zaczynające się od :- są wykonywane jako zapytania do momentu napotkania consult/reconsult. Takie terminy nazywamy EMBEDDED QUERIES (wbudowanie zapytania).
Operacje otwarcia i zamknięcia (see, tell, seen, told) służą wyłącznie do przetwarzania plików tekstowych (sekwencyjnych). Podczas przetwarzania plików sekwencyjnych każda operacja (zapis/odczyt) powoduje automatyczne przejście do następnej pozycji w pliku.
Ogólny schemat przetwarzania pliku Otwarcie pliku Odczyt/zapis Odczyt/zapis }ciąg operacji przetwarzania Zamknięcie pliku
W języku Prolog operacje na plikach opierają się na koncepcji strumienia Program prologowy czyta dane ze strumienia wejściowego i zapisuje dane do strumienia wyjściowego Strumieniem wejściowym i/lub wyjściowym może być dowolny plik o dostępie sekwencyjnym (tekstowy) Terminal użytkownika jest również traktowany jak strumień W trakcie wykonywania programu w danej chwili realizowana może być operacja odczytu i zapisu odpowiednio z/do jednego strumienia wejściowego i jednego strumienia wyjściowego Domyślnym strumieniem wejściowym i wyjściowym jest terminal użytkownika
Użytkownik Aktualny strumień wejściowy Terminal użytkownika Aktualny strumień wyjściowy Plik 1 Plik 2... Program Plik 3 Plik 4...
Otwieranie plików Operacja zmiany aktualnego strumienia wejściowego see(<nazwa_pliku>) Jeżeli plik jest już otwarty to nadal pozostanie w trybie odczytu (nie będzie błędu!)
Otwieranie plików Operacja zmiany aktualnego strumienia wyjściowego tell(<nazwa_pliku>) Jeżeli plik jest już otwarty to nadal pozostanie w trybie zapisu (nie będzie błędu!)
Zamykanie plików Operacja zamknięcia aktualnego strumienia wejściowego seen Predykat ten jest zawsze spełniony. Po wykonaniu strumieniem wejściowym zostaje terminal.
Zamykanie plików Operacja zamknięcia aktualnego strumienia wyjściowego told Predykat ten jest zawsze spełniony. Po wykonaniu strumieniem wyjściowym zostaje terminal.