Prolog można łatwo zintegrować z językiem ANSI C.
W SWI służy do tego podstawowy Foreign Language Interface
Preliminaria:
Interpreter Prologu uruchamia funkcja int PL_initialise(int argc, char *argv[])
, a zatrzymuje void PL_cleanup(int status)
. Wszystkie wywołania Prologu (poza jednym wyjątkiem opisanym w dalszej części ćwiczenia) muszą zawierać się pomiędzy tymi funkcjami.
SWI-Prolog udostępnia funcję int PL_toplevel()
umożliwającą uruchomienie standardowej konsoli kompilatora z poziomu programu w C.
Należy napisać program w C, który uruchomi konsolę Prologu.
Komunikacja pomiędzy Prologiem a C odbywa się wewnątrz ramek, które określa się za pomocą funkcji fid_t PL_open_foreign_frame()
oraz void PL_close_foreign_frame()
.
Ramki umożliwają cofnięcie zmian w Prologu wprowadzonych przez kod w języku C. Można to zrobić za pomocą wywołań void PL_discard_foreign_frame(fid_t id)
oraz void PL_rewind_foreign_frame(fid_t id)
.
Wewnątrz ramki można wywołać predykat Prologu. Najprościej użyć w tym celu funkcji int PL_call(term_t goal, module_t m)
. Uruchamiane wyrażenie możemy stworzyć za pomocą wywyołania int PL_chars_to_term(const char *chars, term_t -t)
, która skonwertuje string języka C na term języka Prolog. Aby konwersja była możliwa, należy wcześniej zallokować termy. Służy do tego między innymi funkcja term_t PL_new_term_ref()
.
Należy napisać program w C, który za pomocą predykatu consult/1 wczyta program w Prologu, a następnie wykona predykat z załadowanego pliku.
Prolog umożliwa implementację predykatów w języku C. W przypadku SWI predykat jest funkcją zwracającą wartość TRUE
lub FALSE
, przyjmującą argumenty typu term_t
w liczbie równej arności danego predykatu. Przed użyciem argumenty muszą być skonwertowane do typów języka C za pomocą odpowiednich funkcji. Możliwa jest także ich modyfikacja oraz unifikacja.
Predykaty napisane w języku C przed użyciem muszą zostać zarejestrowane przy pomocy funkcji int PL_register_foreign(const char *name, int arity, foreign_t (*function)(), int flags)
przed inicjalizacją Prologu. Po tej czynności mogą być używane zarówno z poziomu języka C jak i Prologu.
Należy napisać w języku C predykat przyjmujący jako argument tekst, który zostanie wypisany na ekranie w ozdobych nawiasach (-=[ ]=-
), a następnie przetestować jego działanie przy pomocy konsoli Prologu.
SWI-Prolog posiada mechanizmy pozwalajace na interację z systemem operacyjnym na którym pracuje. Do najprostrzych należy predykat shell/1, który pozwala na uruchomienie dowolnej aplikacji z poziomu Prologu. Na głębszą interackcję pozwala biblioteka SWI-Prolog C-library.
Należy napisać w Prologu program uruchamiający jednocześnie 4 xtermy.
SWI-Prolog C-library pozwala także na komunikację sieciową, udostępniająć sieciowe API systemu operacyjengo jako predykaty. W Dokumentacji podane są kompletne przykłady implementacji serwerów i klientów napisanych w Prologu.
* Zadanie: Należy napisać w Prologu aplikację pobierającą poprzez protokół HTTP plik tekstowy i wyświetlający go na ekranie. Minimalne żądanie HTTP ma postać:
GET /ścieżka/do/pliku.txt<znak końca linii> <znak końca linii>
Po wysłaniu żądania serwer wysyła nagłówki i zawartość pliku rozdzielone pustą linią a następnie zamyka połączenie.