Wstęp

Prolog można łatwo zintegrować z językiem ANSI C.

W SWI służy do tego podstawowy Foreign Language Interface

Preliminaria:

  • znajomość Prologu
  • znajomość ANSI C

Cel Lab

Ćwiczenia

Etap 1: Podstawy

  • Uwagi na początek:
    • Praktycznie wszystkie funkcje interfejsu Prolog ↔ C SWI-Prologu zwracają wartość różną od 0 w przypadku powodzenia i zerową w przypadku błędu.
    • Nawet drobne błędy w użyciu API Prologu mogą zaowocować znaczącą destabilizacją całego programu bądź jego niewytłumaczalmnym działaniem.
    • Programy w C należy kompilować przy pomocy załączonego pliku Makefile. Należy go skopiować pod nazwą Makefile do katalogu, w którym będą źródła programów tworzonych podczas tego ćwiczenia. Po wydaniu komendy make wszystkie pliki *.c zostaną skompilowane i skonsolidowane z Prologiem.
  • Uruchamianie i zatrzymywanie SWI-Prologu:

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.

  • Uruchamianie konsoli SWI-Prologu:

SWI-Prolog udostępnia funcję int PL_toplevel() umożliwającą uruchomienie standardowej konsoli kompilatora z poziomu programu w C.

  • Zadanie:

Należy napisać program w C, który uruchomi konsolę Prologu.

Etap 2: Ładowanie kodu Prologu i uruchamianie predykatów z poziomu C

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().

  • Zadanie:

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.

Etap 3: Predykaty w C

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.

  • Zadanie:

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.

Unix: Polecenia Systemowe

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.

  • Zadanie:

Należy napisać w Prologu program uruchamiający jednocześnie 4 xtermy.

Unix: Sockety

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.

Źródła

pl/prolog/lab_prolog_ansic.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0