🚀 MCP Logic
MCP Logic是一个独立的一阶逻辑推理服务器,用TypeScript实现,无需外部二进制依赖。它能够进行定理证明、模型查找等多种逻辑推理任务,为逻辑推理提供了便捷的解决方案。
🚀 快速开始
安装
git clone <repository>
cd mcplogic
npm install
npm run build
运行服务器
npm start
若要在开发时自动重新加载:
npm run dev
Claude Desktop / MCP客户端配置
在MCP配置中添加以下内容:
{
"mcpServers": {
"mcp-logic": {
"command": "node",
"args": ["/path/to/mcplogic/dist/index.js"]
}
}
}
✨ 主要特性
核心推理
- 定理证明:使用归结法证明逻辑语句。
- 模型查找:查找满足前提条件的有限模型。
- 反例检测:查找表明结论不成立的模型。
- 语法验证:预先验证公式,并提供详细的错误信息。
引擎联合
- 多引擎架构:根据公式结构自动选择引擎。
- Prolog引擎(Tau - Prolog):对Horn子句、Datalog和等式推理效率高。
- SAT引擎(MiniSat):处理一般的一阶逻辑和非Horn公式。
- 引擎参数:可显式选择引擎:
'prolog'、'sat'或'auto'。
高级逻辑
- 算术支持:内置谓词:
lt、gt、plus、minus、times、divides。
- 等式推理:包含自反性、对称性、传递性和同余公理。
- CNF子句化:将一阶逻辑转换为合取范式。
- DIMACS导出:导出CNF以用于外部SAT求解器。
MCP协议
- 基于会话的推理:增量式知识库构建。
- 公理资源:可浏览的公理库(范畴论、皮亚诺算术、ZFC等)。
- 推理提示:用于反证法证明、形式化等的模板。
- 详细程度控制:为大语言模型链提供高效的响应。
基础设施
- 独立运行:仅依赖npm包,无需外部二进制文件。
- 结构化错误:提供机器可读的错误信息和建议。
- 254个测试:全面的测试覆盖。
📦 安装指南
git clone <repository>
cd mcplogic
npm install
npm run build
💻 使用示例
基础用法
1. 证明定理(选择引擎)
{
"name": "prove",
"arguments": {
"premises": [
"all x (man(x) -> mortal(x))",
"man(socrates)"
],
"conclusion": "mortal(socrates)",
"engine": "prolog"
}
}
2. 使用SAT引擎证明(非Horn公式)
{
"name": "prove",
"arguments": {
"premises": ["alpha | beta", "alpha -> gamma", "beta -> gamma"],
"conclusion": "gamma",
"engine": "sat"
}
}
3. 查找反例
{
"name": "find-counterexample",
"arguments": {
"premises": ["P(a)"],
"conclusion": "P(b)"
}
}
4. 基于会话的推理
{ "name": "create-session", "arguments": { "ttl_minutes": 30 } }
{ "name": "assert-premise", "arguments": {
"session_id": "abc-123...",
"formula": "all x (man(x) -> mortal(x))"
}}
{ "name": "query-session", "arguments": {
"session_id": "abc-123...",
"goal": "mortal(socrates)"
}}
{ "name": "delete-session", "arguments": { "session_id": "abc-123..." } }
📚 详细文档
可用工具
核心推理工具
| 工具 |
描述 |
| prove |
使用归结法并选择引擎证明语句 |
| check-well-formed |
验证公式语法并提供详细错误信息 |
| find-model |
查找满足前提条件的有限模型 |
| find-counterexample |
查找表明语句不成立的反例 |
| verify-commutativity |
生成范畴图交换性的一阶逻辑公式 |
| get-category-axioms |
获取范畴/函子/幺半群/群的公理 |
会话管理工具
| 工具 |
描述 |
| create-session |
创建具有生存时间(TTL)的新推理会话 |
| assert-premise |
将会话的知识库中添加一个公式 |
| query-session |
使用目标查询累积的知识库 |
| retract-premise |
从知识库中移除特定前提 |
| list-premises |
列出会话中的所有前提 |
| clear-session |
清除所有前提(保持会话活动) |
| delete-session |
完全删除会话 |
引擎选择
prove工具支持自动或显式选择引擎:
{
"name": "prove",
"arguments": {
"premises": ["foo | bar", "-foo"],
"conclusion": "bar",
"engine": "auto"
}
}
| 引擎 |
适用场景 |
功能 |
prolog |
Horn子句、Datalog |
等式、算术、高效合一 |
sat |
非Horn公式、SAT问题 |
完整的一阶逻辑、CNF求解 |
auto |
默认 — 根据公式选择 |
分析子句结构 |
响应中包含engineUsed以显示选择的引擎: |
|
|
{ "success": true, "result": "proved", "engineUsed": "sat/minisat" }
算术和等式
算术支持
使用enable_arithmetic: true启用:
{
"name": "prove",
"arguments": {
"premises": ["lt(1, 2)", "lt(2, 3)", "all x all y all z ((lt(x,y) & lt(y,z)) -> lt(x,z))"],
"conclusion": "lt(1, 3)",
"enable_arithmetic": true
}
}
内置谓词:lt、gt、le、ge、plus、minus、times、divides、mod
等式推理
使用enable_equality: true启用:
{
"name": "prove",
"arguments": {
"premises": ["a = b", "P(a)"],
"conclusion": "P(b)",
"enable_equality": true
}
}
自动注入自反性、对称性、传递性和同余公理。
MCP资源
通过MCP资源协议浏览公理库:
| 资源URI |
描述 |
logic://axioms/category |
范畴论公理 |
logic://axioms/monoid |
幺半群结构 |
logic://axioms/group |
群公理 |
logic://axioms/peano |
皮亚诺算术 |
logic://axioms/set-zfc |
ZFC集合论基础 |
logic://axioms/propositional |
命题重言式 |
logic://templates/syllogism |
亚里士多德三段论模式 |
logic://engines |
可用的推理引擎(JSON格式) |
MCP提示
常见任务的推理模板:
| 提示 |
描述 |
prove-by-contradiction |
设置反证法证明 |
verify-equivalence |
检查公式等价性 |
formalize |
自然语言到一阶逻辑的翻译指南 |
diagnose-unsat |
诊断不可满足的前提 |
explain-proof |
解释已证明的定理 |
详细程度控制
所有工具都支持verbosity参数:
| 级别 |
描述 |
使用场景 |
minimal |
仅显示成功/结果 |
高效的大语言模型链 |
standard |
增加消息、绑定、使用的引擎 |
默认平衡 |
detailed |
增加Prolog程序、统计信息 |
调试 |
{
"name": "prove",
"arguments": {
"premises": ["man(socrates)", "all x (man(x) -> mortal(x))"],
"conclusion": "mortal(socrates)",
"verbosity": "minimal"
}
}
最小响应:{ "success": true, "result": "proved" }
公式语法
此服务器使用与Prover9兼容的一阶逻辑(FOL)语法:
量词
all x (...) — 全称量词(∀x)
exists x (...) — 存在量词(∃x)
连接词
-> — 蕴含(→)
<-> — 双条件(↔)
& — 合取(∧)
| — 析取(∨)
- — 否定(¬)
谓词和项
- 谓词:
man(x)、loves(x, y)、greater(x, y)
- 常量:
socrates、a、b
- 变量:
x、y、z(小写,通常为单个字母)
- 函数:
f(x)、successor(n)
- 等式:
x = y
示例
# 所有人都会死,苏格拉底是人
all x (man(x) -> mortal(x))
man(socrates)
# 存在一个人爱所有人
exists x all y loves(x, y)
# 大于关系的传递性
all x all y all z ((greater(x, y) & greater(y, z)) -> greater(x, z))
🔧 技术细节
引擎联合
EngineManager会自动选择最佳引擎:
- 公式分析:将输入子句化以确定结构。
- Horn检查:如果所有子句都是Horn子句,则使用Prolog。
- SAT备用:非Horn公式将路由到MiniSat。
- 显式覆盖:
engine参数可强制选择特定引擎。
CNF子句化
子句化器将任意一阶逻辑转换为CNF:
- 消除双条件和蕴含。
- 向内推否定(NNF)。
- 标准化变量名。
- 对存在量词进行Skolem化。
- 去掉全称量词。
- 分配析取对合取的运算。
- 提取子句。
DIMACS导出
用于与外部SAT求解器交互:
import { clausify, clausesToDIMACS } from './clausifier';
const result = clausify('(P -> Q) & P');
const dimacs = clausesToDIMACS(result.clauses);
结构化错误
所有错误都包含机器可读的信息:
interface LogicError {
code: LogicErrorCode;
message: string;
span?: { start, end, line, col };
suggestion?: string;
context?: string;
}
📄 API文档
prove
interface ProveArgs {
premises: string[];
conclusion: string;
inference_limit?: number;
engine?: 'prolog' | 'sat' | 'auto';
enable_arithmetic?: boolean;
enable_equality?: boolean;
verbosity?: 'minimal' | 'standard' | 'detailed';
}
interface ProveResult {
success: boolean;
result: 'proved' | 'failed' | 'timeout' | 'error';
message?: string;
engineUsed?: string;
bindings?: Record<string, string>[];
proof?: string[];
prologProgram?: string;
statistics?: { timeMs: number; inferences?: number };
}
check-well-formed
interface CheckArgs {
statements: string[];
verbosity?: 'minimal' | 'standard' | 'detailed';
}
interface ValidationResult {
valid: boolean;
formulaResults: Array<{
formula: string;
valid: boolean;
errors: string[];
warnings: string[];
}>;
}
find-model / find-counterexample
interface FindModelArgs {
premises: string[];
domain_size?: number;
max_domain_size?: number;
verbosity?: 'minimal' | 'standard' | 'detailed';
}
interface ModelResult {
success: boolean;
result: 'model_found' | 'no_model' | 'timeout' | 'error';
model?: {
domainSize: number;
predicates: Record<string, string[]>;
constants: Record<string, number>;
};
}
会话工具
{ session_id: string; expires_at: string; ttl_minutes: number }
{ success: boolean; premise_count: number }
{ success: boolean; result: string; engineUsed?: string }
{ premises: string[]; premise_count: number }
⚠️ 局限性
- 推理深度:复杂证明可能超出限制。
- 模型大小:模型查找器仅限于域元素数量 ≤10 的情况。
- SAT变量:SAT引擎不支持算术。
- 高阶逻辑:仅支持一阶逻辑。
🛠️ 故障排除
有效定理显示“未找到证明”
- 对于复杂证明,增加
inference_limit。
- 对于非Horn公式,尝试
engine: 'sat'。
- 如果使用等式,启用
enable_equality。
模型查找器返回“未找到模型”
- 增加
max_domain_size。
- 检查前提是否矛盾。
会话错误
- 检查会话是否未过期(默认:30分钟)。
- 使用
list-premises检查状态。
🛠️ 开发
npm test
npm run build
npx tsc --noEmit
📄 许可证
MIT
🤝 贡献
- 分叉仓库。
- 创建功能分支。
- 运行测试:
npm test。
- 提交拉取请求。