prolog-reasoner
prolog-reasoner
SWI-Prolog как «логический калькулятор» для LLM — доступен в виде MCP-сервера и библиотеки Python.
LLM отлично справляются с естественным языком, но испытывают трудности с формальной логикой. Prolog отлично справляется с логическими рассуждениями, но не может обрабатывать естественный язык. prolog-reasoner устраняет этот разрыв, предоставляя LLM возможность выполнения кода SWI-Prolog через два взаимодополняющих интерфейса:
MCP-сервер — подключенная LLM (например, Claude) пишет код на Prolog и выполняет его через сервер. На стороне сервера не требуется ключ API LLM.
Библиотека Python — полноценный конвейер NL→Prolog с самокоррекцией для программ, где LLM не участвует в цикле выполнения. Требуется ключ API OpenAI или Anthropic.
Оба интерфейса используют один и тот же исполнитель Prolog; библиотека добавляет сверху транслятор на базе LLM.
Возможности
Инструмент MCP (
execute_prolog): выполнение произвольного кода SWI-Prolog с запросомПоддержка CLP(FD): логическое программирование с ограничениями для планирования и оптимизации
Отрицание как неудача (negation-as-failure), рекурсия, все стандартные функции SWI-Prolog
Прозрачное промежуточное представление: возможность инспектировать/изменять код Prolog перед выполнением
Режим библиотеки: трансляция NL→Prolog с циклом самокоррекции (OpenAI / Anthropic)
Требования
Python ≥ 3.10
Установленный SWI-Prolog в переменной PATH (≥ 9.0)
Ключ API для OpenAI или Anthropic — только для режима библиотеки, не для MCP-сервера
Установка
# MCP server only (no LLM dependencies)
pip install prolog-reasoner
# Library with OpenAI
pip install prolog-reasoner[openai]
# Library with Anthropic
pip install prolog-reasoner[anthropic]
# Both providers
pip install prolog-reasoner[all]Настройка MCP-сервера
MCP-сервер предоставляет один инструмент, execute_prolog, который запускает код Prolog, написанный подключенной LLM. Он не вызывает никакой внешний API LLM, поэтому ключ API не требуется.
Claude Desktop / Claude Code
{
"mcpServers": {
"prolog-reasoner": {
"command": "uvx",
"args": ["prolog-reasoner"]
}
}
}Или, если prolog-reasoner установлен напрямую:
{
"mcpServers": {
"prolog-reasoner": {
"command": "prolog-reasoner"
}
}
}Docker (SWI-Prolog в комплекте)
Используйте Docker, если не хотите устанавливать SWI-Prolog локально:
docker build -f docker/Dockerfile -t prolog-reasoner .{
"mcpServers": {
"prolog-reasoner": {
"command": "docker",
"args": ["run", "-i", "--rm", "prolog-reasoner"]
}
}
}Справочник инструментов
execute_prolog(prolog_code, query, max_results=100)
prolog_code— факты и правила Prolog (строка)query— запрос Prolog для выполнения, например,"mortal(X)"(строка)max_results— ограничение количества возвращаемых решений (по умолчанию 100)
Возвращает JSON-объект с полями success, output, query, error и metadata (время выполнения, количество результатов, флаг усечения).
Использование библиотеки
Библиотека предоставляет PrologExecutor (только Prolog, без LLM) и PrologReasoner (конвейер NL→Prolog, требуется ключ API LLM).
Прямое выполнение Prolog (без LLM)
import asyncio
from prolog_reasoner.config import Settings
from prolog_reasoner.executor import PrologExecutor
async def main():
settings = Settings() # no API key needed
executor = PrologExecutor(settings)
result = await executor.execute(
prolog_code="human(socrates). mortal(X) :- human(X).",
query="mortal(X)",
)
print(result.output) # mortal(socrates)
asyncio.run(main())Полный конвейер NL→Prolog (требуется ключ API LLM)
import asyncio
from prolog_reasoner import PrologReasoner, TranslationRequest, ExecutionRequest
from prolog_reasoner.config import Settings
from prolog_reasoner.executor import PrologExecutor
from prolog_reasoner.translator import PrologTranslator
from prolog_reasoner.llm_client import LLMClient
async def main():
settings = Settings(llm_api_key="sk-...") # from env or explicit
llm = LLMClient(
provider=settings.llm_provider,
api_key=settings.llm_api_key,
model=settings.llm_model,
timeout_seconds=settings.llm_timeout_seconds,
)
reasoner = PrologReasoner(
translator=PrologTranslator(llm, settings),
executor=PrologExecutor(settings),
)
translation = await reasoner.translate(
TranslationRequest(query="Socrates is human. All humans are mortal. Is Socrates mortal?")
)
print(translation.prolog_code)
result = await reasoner.execute(
ExecutionRequest(prolog_code=translation.prolog_code, query=translation.suggested_query)
)
print(result.output)
asyncio.run(main())Конфигурация
Все настройки задаются через переменные окружения (префикс PROLOG_REASONER_):
Переменная | По умолчанию | Требуется для |
|
| библиотеки ( |
|
| только библиотеки — оставьте пустым для MCP |
|
| библиотеки |
|
| библиотеки |
|
| библиотеки |
|
| обоих |
|
| обоих |
|
| обоих |
Бенчмарк
В папке benchmarks/ содержится 30 логических задач из 5 категорий (дедукция, транзитивность, ограничения, противоречия, многошаговые задачи) для сравнения рассуждений только с помощью LLM и с помощью LLM+Prolog. Бенчмарк проверяет путь библиотеки (транслятор + исполнитель), так как он требует этап NL→Prolog.
Результаты
Измерено на anthropic/claude-sonnet-4-6, один прогон по 30 задачам:
Конвейер | Точность | Ср. задержка |
Только LLM | 22/30 (73.3%) | 1.7 с |
LLM + Prolog | 27/30 (90.0%) | 3.8 с |
Разбивка по категориям:
Категория | Только LLM | LLM + Prolog |
дедукция | 6/6 | 6/6 |
транзитивность | 6/6 | 5/6 |
ограничения | 3/7 | 6/7 |
противоречия | 4/4 | 3/4 |
многошаговые | 3/7 | 7/7 |
Разрыв сосредоточен в задачах на ограничения (SEND+MORE, 6 ферзей, рюкзак, раскраска K4, задача Эйнштейна) и многошаговых (теория игр Nim, рыцари и лжецы, TSP-4, задача зебры) — именно в комбинаторных областях, где символьные решатели превосходят дополнение паттернов. В чисто дедуктивных или транзитивных вопросах LLM уже сильна, и Prolog добавляет задержку без прироста точности.
Все 3 ошибки LLM+Prolog были ошибками выполнения Prolog из-за некорректного кода, сгенерированного LLM (отсутствие определений предикатов, несвязанные переменные CLP(FD)), а не ошибками рассуждений — это решается настройкой промптов.
Запуск самостоятельно
docker run --rm -e PROLOG_REASONER_LLM_API_KEY=sk-... \
prolog-reasoner-dev python benchmarks/run_benchmark.pyРезультаты сохраняются в benchmarks/results.json.
Разработка
# Build dev image
docker build -f docker/Dockerfile -t prolog-reasoner-dev .
# Run tests (no API key needed — LLM calls are mocked)
docker run --rm prolog-reasoner-dev
# With coverage
docker run --rm prolog-reasoner-dev pytest tests/ -v --cov=prolog_reasoner
# Or via docker compose
docker compose -f docker/docker-compose.yml run --rm testЛицензия
MIT
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rikarazome/prolog-reasoner'
If you have feedback or need assistance with the MCP directory API, please join our Discord server