prolog-reasoner
prolog-reasoner
LLM을 위한 "논리 계산기"로서의 SWI-Prolog — MCP 서버 및 Python 라이브러리로 제공됩니다.
LLM은 자연어 처리에 뛰어나지만 형식 논리에는 어려움을 겪습니다. Prolog는 논리적 추론에 뛰어나지만 자연어를 처리할 수 없습니다. prolog-reasoner는 두 가지 보완적인 인터페이스를 통해 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) 지원: 스케줄링 및 최적화를 위한 제약 논리 프로그래밍
실패로서의 부정(Negation-as-failure), 재귀, 모든 표준 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는 정확도 향상 없이 지연 시간만 추가합니다.
3건의 LLM+Prolog 실패 사례는 모두 추론 오류가 아니라 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