Skip to main content
Glama

prolog-reasoner

PyPI version Python versions CI License: MIT

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_):

Переменная

По умолчанию

Требуется для

LLM_PROVIDER

openai

библиотеки (openai или anthropic)

LLM_API_KEY

""

только библиотеки — оставьте пустым для MCP

LLM_MODEL

gpt-5.4-mini

библиотеки

LLM_TEMPERATURE

0.0

библиотеки

LLM_TIMEOUT_SECONDS

30.0

библиотеки

SWIPL_PATH

swipl

обоих

EXECUTION_TIMEOUT_SECONDS

10.0

обоих

LOG_LEVEL

INFO

обоих

Бенчмарк

В папке 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

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - A tier

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