Skip to main content
Glama

prolog-reasoner

PyPI version Python versions CI License: MIT

LLMのための「論理計算機」としてのSWI-Prolog — MCPサーバーおよびPythonライブラリとして利用可能です。

LLMは自然言語処理には優れていますが、形式論理は苦手です。Prologは論理推論には優れていますが、自然言語を処理できません。prolog-reasonerは、以下の2つの補完的なインターフェースを通じて、LLMにSWI-Prologの実行機能を提供することで、このギャップを埋めます。

  • MCPサーバー — 接続されたLLM(Claudeなど)がPrologコードを記述し、サーバー経由で実行します。サーバー側でLLM APIキーは不要です。

  • Pythonライブラリ — LLMを介さないプログラム向けに、自己修正機能を備えた完全なNL→Prologパイプラインを提供します。OpenAIまたはAnthropicのAPIキーが必要です。

両方のインターフェースで同じProlog実行エンジンを共有しており、ライブラリ版にはその上にLLMベースの翻訳機能が追加されています。

特徴

  • MCPツール (execute_prolog): 任意のSWI-Prologコードをクエリ付きで実行

  • CLP(FD)サポート: スケジューリングや最適化のための制約論理プログラミング

  • 失敗による否定、再帰、その他すべての標準的なSWI-Prolog機能

  • 透過的な中間表現: 実行前にPrologコードの確認・修正が可能

  • ライブラリモード: 自己修正ループを備えたNL→Prolog翻訳(OpenAI / Anthropic)

要件

  • Python ≥ 3.10

  • SWI-Prolog がインストールされ、PATHに通っていること (≥ 9.0)

  • OpenAIまたはAnthropicのAPIキー — ライブラリモードでのみ必要であり、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サーバーは、接続されたLLMによって記述されたPrologコードを実行する単一のツール execute_prolog を提供します。外部のLLM APIを呼び出すことはないため、APIキーは不要です。

Claude Desktop / Claude Code

{
  "mcpServers": {
    "prolog-reasoner": {
      "command": "uvx",
      "args": ["prolog-reasoner"]
    }
  }
}

または、prolog-reasonerを直接インストールしている場合:

{
  "mcpServers": {
    "prolog-reasoner": {
      "command": "prolog-reasoner"
    }
  }
}

Docker (SWI-Prolog同梱)

SWI-Prologをローカルにインストールしたくない場合はDockerを使用してください:

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)

successoutputqueryerror、およびmetadata(実行時間、結果数、切り捨てフラグ)を含むJSONオブジェクトを返します。

ライブラリの使用方法

ライブラリは PrologExecutor(Prologのみ、LLMなし)と PrologReasoner(NL→Prologパイプライン、LLM APIキーが必要)を提供します。

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パイプライン(LLM APIキーが必要)

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/には、LLMのみの推論とLLM+Prolog推論を比較するために、5つのカテゴリ(演繹、推移、制約、矛盾、多段階)にわたる30の論理問題が含まれています。このベンチマークは、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ゲーム理論、3人騎士と嘘つき、TSP-4、ゼブラパズル)に集中しています。これらはまさに、記号ソルバーがパターン補完を凌駕する組み合わせ最適化・探索が重要な領域です。純粋な演繹や推移的な質問では、LLMはすでに強力であり、Prologを追加しても精度は向上せず、レイテンシが増加するだけです。

LLM+Prologの3つの失敗はすべて、推論エラーではなく、LLMが生成したコードの不備(述語定義の欠落、未束縛のCLP(FD)変数)によるProlog実行エラーでした。これらはプロンプトチューニングで対処可能です。

自分で実行する

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