можно было встроить как lua например?
ну что там с Прологом-то? Что-то получилось?
мой интерес к геймдеву постепенно гаснет, так что в встраиванию Пролога особо интереса нет. Он хорош в экспертных системах, для лексеров\парсеров, 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 и т.п. работать нормально здесь не будет и нужно брать апи с флагами кодировок, конвертирования, выделения памяти и т.п. Хм...
Наверное 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 и т.д и т.п. сишнопрологоапишные нюансы.
ну просто сам по себе Пролог язык достаточно редкий и многие его нюансы проблематично откуда-то узнать. Там на хабре десяток статей всего, да и то особо выдающиеся его заминусовывали, чтоб ещё проблем насоздавать. Так что хз как правильно.
Обсуждают сегодня