[[
✎ pl:prolog:lab_prolog_ansic
]]
aiWiki
Pokaż stronę
Ostatnie zmiany
Indeks
Zaloguj
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== Wstęp ====== Prolog można łatwo zintegrować z językiem //ANSI C//. W [[http://www.swi-prolog.org/|SWI]] służy do tego podstawowy [[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreign.html|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 należy kompilować przy pomocy załączonego pliku {{:pl:prolog:prolog_lab:Makefile-lab-ansic.txt|Makefile}}. Należy go skopiować pod nazwą //Makefile// do katalogu, w którym będą zapisywane programy tworzone 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 ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_initialise()|int PL_initialise(int argc, char *argv[])]]'', a zatrzymuje ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_cleanup()|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ę ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_toplevel()|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 ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_open_foreign_frame()|fid_t PL_open_foreign_frame()]]'' oraz ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_close_foreign_frame()|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ń ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_discard_foreign_frame()|void PL_discard_foreign_frame(fid_t id)]]'' oraz ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_rewind_foreign_frame()|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 ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_call()|int PL_call(term_t goal, module_t m)]]''. Uruchamiane wyrażenie możemy stworzyć za pomocą wywyołania ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigninclude.html#PL_chars_to_term()|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 ''[[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreigntypes.html#PL_new_term_ref()|term_t PL_new_term_ref()]]''. * **Zadanie:** Należy napisać program, 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 z C ===== ===== Unix: polecenia systemowe ===== [[http://www.swi-prolog.org/packages/clib.html|pakiet Clib]] ===== Unix: sockety ===== [[http://www.swi-prolog.org/packages/clib.html|pakiet Clib]] ====== Źródła ====== * [[http://gollem.science.uva.nl/SWI-Prolog/Manual/Contents.html|Podręcznik SWI]] * [[http://gollem.science.uva.nl/SWI-Prolog/Manual/foreign.html|Foreign Language Interface]] * [[http://www.swi-prolog.org/packages/clib.html|Pakiet Clib]]
pl/prolog/lab_prolog_ansic.1196091684.txt.gz
· ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry