172 похожих чатов

Я посмотрел, вообще прикольная тема. Какие есть реализации, чтобы его

можно было встроить как lua например?

4 ответов

7 просмотров

ну что там с Прологом-то? Что-то получилось?

Constantin_FV
ну что там с Прологом-то? Что-то получилось?

мой интерес к геймдеву постепенно гаснет, так что в встраиванию Пролога особо интереса нет. Он хорош в экспертных системах, для лексеров\парсеров, constraint programming и т.п., но это всё ситуативно. Но допустим... допустим, что его таки нужно встроить. Допустим, что у нас есть такой скрипт, рандомно взятый из гугла: мужчина(валерий). мужчина(николай). женщина(анна). женщина(наталья). женщина(елена). родитель(валерий, николай). родитель(елена, николай). родитель(николай, наталья). родитель(николай, анна). родитель(николай, алексей). сестра(X,Y):- женщина(X), родитель(Z, X), родитель(Z, Y), X \= Y. Его можно передать в аргументах для PL_initialise, но интереснее его догрузить. У меня получилось что-то такое: predicate_t consultPred = PL_predicate("consult", 1, null); term_t consultTerm = PL_new_term_ref(); PL_put_string_chars(consultTerm, "blabla/script.pro"); int consultResult = PL_call_predicate(null, 0, consultPred, consultTerm); Однако эксперименты показывают, что основная проблема - кириллица, код на которой для Пролога обычное дело. Ну и это удобно т.к. позволяет править базу данных не программистами. А значит всё апи для char*: PL_predicate, PL_get_string и т.п. работать нормально здесь не будет и нужно брать апи с флагами кодировок, конвертирования, выделения памяти и т.п. Хм...

Constantin_FV
мой интерес к геймдеву постепенно гаснет, так что ...

Наверное PL_predicate можно пытаться обходить через атомы: //вызываем сестра(анна, Y) и читаем из Y имена auto sisterPredName = "сестра"; atom_t sisterAtom = PL_new_atom_mbchars(REP_UTF8, sisterPredName.length, sisterPredName.toStringz); functor_t sisterFunct = PL_new_functor(sisterAtom, 2); predicate_t sisterPred = PL_pred(sisterFunct, null); term_t sisterTerm = PL_new_term_refs(2); Теперь его уже можно открыть в запросе: auto sisterName="анна"; PL_put_chars(sisterTerm, PL_ATOM | REP_UTF8, sisterName.length, sisterName.toStringz); PL_put_variable(sisterTerm + 1); qid_t query = PL_open_query(null, PL_Q_NORMAL, sisterPred, sisterTerm); while (PL_next_solution(query)) { char* buff; PL_get_chars(sisterTerm + 1, &buff, CVT_ATOM | REP_UTF8 | BUF_STACK); writefln("Found solution: %s.", buff.fromStringz); } Выводит: Found solution: наталья. Found solution: алексей. Понятно, что коды возвратов нужно проверять, так где-то есть нулли, какой-то указатель пролог может там где-нить сохранить, который потом соберёт gc и т.д и т.п. сишнопрологоапишные нюансы.

Constantin_FV
Наверное PL_predicate можно пытаться обходить чере...

ну просто сам по себе Пролог язык достаточно редкий и многие его нюансы проблематично откуда-то узнать. Там на хабре десяток статей всего, да и то особо выдающиеся его заминусовывали, чтоб ещё проблем насоздавать. Так что хз как правильно.

Похожие вопросы

Обсуждают сегодня

А случайно нет ли в паскале штатной возможности передать указатель и количество туда где array of в качестве аргумента?
zamtmn
25
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
58
Ну раз я пока тут, задам пару глупых вопросов. Зачем писать на ассемблере если компилятор довольно умный, а ассемблер много времени занимает? В каких прикладных задачах сейчас...
Максим Рябцев
20
Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
12
А какие чаты вообще в ходу? Auto aim? И что еше
do you think you're better off alone? А
13
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта