To jest stara wersja strony!
Wstęp
Prolog można łatwo zintegrować z językiem ANSI C.
W SWI służy do tego podstawowy interfejs do C
Preliminaria:
znajomość Prologu
znajomość ANSI C
Cel Lab
Ćwiczenia
Etap 1: Podstawy
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.
#include <SWI-Prolog>
int main(int argc, char *argv) {
int retval;
retval = PL_initialise(argc, argv);
if (retval == FALSE)
return(1);
retval = PL_toplevel();
PL_cleanup(retval);
return(retval);
}
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_predicate(module_t m, int flags, predicate_t pred, term_t +t0)
. Przed jej wywołaniem należy jednak za pomocą odpowiednich funkcji dokonać konwersji danych, gdyż typy używane przez język C były by zbyt dużym ograniczeniem dla elastycznego Prologu. Aby konwersja była możliwa, należy wcześniej zallokować termy języka Prolog. Służy do tego między innymi funkcja term_t PL_new_term_refs(int n)
, która zarezerwuje dla aktualnie otwartwej ramki miejsce dla argumentów predykatu, który z koleji można utworzyć za pomocą funkcji predicate_t PL_predicate(const char *name, int arity, const char* module)
.
#include <SWI-Prolog>
int main(int argc, char *argv) {
int retval;
fid_t frame;
predicate_t predicate;
term_t terms;
retval = PL_initialise(argc, argv);
if (retval == FALSE)
return(1);
frame = PL_open_foreign_frame();
predicate = PL_predicate("consult", 1, NULL);
PL_chars_to_term("prolog-code.pl", terms);
PL_call_predicate(NULL, PL_Q_NORMAL, predicate, terms);
PL_close_foreign_frame(frame);
retval = PL_toplevel();
PL_cleanup(retval);
return(retval);
}
Etap 3: Predykaty w C
Prolog z C
Unix: polecenia systemowe
Unix: sockety
Źródła