prolog-reasoner
prolog-reasoner
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)
success、output、query、error、および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_プレフィックス)で行います:
変数 | デフォルト | 必要な対象 |
|
| ライブラリ ( |
|
| ライブラリのみ — MCPの場合は設定不要 |
|
| ライブラリ |
|
| ライブラリ |
|
| ライブラリ |
|
| 両方 |
|
| 両方 |
|
| 両方 |
ベンチマーク
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
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