这是一个用 Rust 实现的最小的 Prolog 解释器:
- 用法:可使用Justfile命令运行,如
just test
运行测试,just build
构建独立二进制文件./prolog
,just run FILE
评估FILE
并启动 REPL,just repl
启动 REPL;从命令行调用./prolog -e FILE
可评估FILE
并运行main/0
目标后退出。 - 数据类型:数据单位是“项”,包括原子(以小写字母开头,如
foo
)、整数(唯一支持的数字类型)、变量(以大写字母或_
开头)、复合项(如结构foo(a, b)
和列表[1, 2, 3]
,列表在 Prolog 中也是结构体),没有布尔值,通过统一来评估项。 - 事实、规则和问题:Prolog 程序由事实(如
foo.
或bar(a,b,32).
)、规则(如mortal(Who) :- person(Who).
)和问题(如?- mortal(socrates).
)定义。 - 统一:Prolog 广泛使用模式匹配,通过统一来搜索数据库中的匹配项,变量统一后会变为等价或别名,还有一些使用特殊评估规则的过程。
- 特性:涵盖部分 Prolog 特性,如
fail
、a,b
和a;b
、\+
、!
、->
、=
、_
、is
、数学运算符和函数、比较运算符、consult
加载文件、write
和nl
、trace
和untrace
、特殊语法糖等,更多功能在lib/stdlib.pl
标准库中。 - 局限性和与其他实现的差异:只实现了部分功能,如字符串、浮点数类型、DCG 等不可用;
;
和,
运算符的优先级相反;引号原子名中只允许部分转义字符;变量按内存地址排序不可行;复合项的结构与标准 Prolog 不同;算术div
和mod
与 Prolog 定义不同但相互一致;_
不绑定导致某些查询逻辑不一致;未进行尾递归优化;跟踪功能简化且有限。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。