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

  • Uwagi na początek:
    • Praktycznie wszystkie funkcje interfejsu Prolog ↔ C SWI-Prologu zwracają TRUE w przypadku powodzenia i FALSE 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.
  • 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.

#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

inne

przyklady

narzedzia

pl/prolog/lab_prolog_ansic.1195831543.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (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