1 个不稳定版本
0.1.0 | 2023年5月3日 |
---|
#5 在 #事实
380KB
6K SLoC
Suiron - 用 Rust 编写的推理引擎。
Suiron 是一个快速的推理引擎。其事实/规则定义语言与 Prolog 类似,但有一些区别。
为了了解如何使用 Suiron,对 Prolog 有基本的了解有帮助。以下是一些有用的链接
在以下网址有 Suiron 的在线教程和测试网站:klivo.net/suiron
简要介绍
推理引擎分析存储在知识库中的事实和规则。
Suiron 从文本格式的源文件中加载事实和规则,解析它们,并将它们写入知识库。
以下是一个事实的例子,表示“六月是西奥多之母”
mother(June, Theodore).
在这里我们看到 Suiron 与 Prolog 之间的主要区别。在 Prolog 中,小写单词是 atoms
(即字符串常量)和,大写单词是变量。在 Suiron 中,原子可以是小写或大写。因此,mother
、June
和 Theodore
都是原子。Suiron 的原子甚至可以包含空格。
mother(June, The Beaver).
Suiron 的变量通过在变量名前放置美元符号来定义,例如,$Child。确定六月孩子的查询可以这样编写
mother(June, $Child).
匿名变量也必须以美元符号开头:$_ 。一个简单的下划线 _
被视为原子。以下是一个包含匿名变量的规则的例子
voter($P) :- $P = person($_, $Age), $Age >= 18.
事实和规则也可以在 Rust 应用程序程序中动态创建。可以通过调用函数 parse_complex() 和 make_fact() 来创建 mother(June, Theodore) 事实。
let term = parse_complex("mother(June, Theodore)."); let fact = make_fact(term);
在 Rust 源代码中,可以这样创建查询 mother(June, $Child)
let mother = atom!("mother"); let june = atom!("June"); let child = logic_var!("$Child"); let query = query!(mother, june, child);
Suiron 还支持整数和浮点数,它们以 64 位整数和浮点数的形式实现。
let pi = SFloat(3.14159); let year = SInteger(2023);
如果比较浮点数和整数,整数将转换为浮点数进行比较。
当然,Suiron 支持链表,它们与 Prolog 列表的工作方式相同。链表可以从源文件加载
…, [a, b, c, d] = [$Head | $Tail], …
或在 Rust 中动态创建
let list1 = parse_linked_list("[a, b, c | $X]"); let list2 = make_linked_list(false, terms);
要求
Suiron 使用 Rust/Cargo 版本 1.65.0 开发和测试。
克隆
要在终端窗口中克隆存储库,请运行以下命令
git clone [email protected]:Indrikoterio/suiron-rust.git
存储库有以下子文件夹
- suiron-rust/benches
- suiron-rust/src
- suiron-rust/suiron_demo
- suiron-rust/target
- suiron-rust/tests
苏铁本身源代码位于/src目录下。
/tests子目录包含测试推理机基本功能的程序。可以通过打开命令行界面,移动到suiron-rust文件夹,并运行以下命令来运行测试。
cargo test
/benches目录下的程序(suiron_benchmark.rs)使用Criterion crate运行qsort算法。在一台搭载2.8 GHz双核Intel Core i5处理器的MacBook Pro上,这个基准测试大约需要32毫秒。可以使用以下命令运行程序:cargo bench
。
/suiron_demo子目录包含一个简单的演示程序,该程序可以解析英语句子。如果您打算将苏铁集成到自己的项目中,这是一个很好的参考。请参阅:苏铁演示
/target目录包含构建结果。
使用方法
crate query
使用 suiron
库crate从文件中加载事实和规则,并允许用户查询知识库。可以在终端窗口中按照以下方式运行查询:
cargo run -- test/kings.txt
用户将被提示输入查询,提示如下:?-
下面的查询将打印出所有父子关系。
?- father($F, $C).
按下回车键后,程序将打印出解决方案,每次按下回车键后打印一个解决方案,直到没有更多解决方案为止。
cargo run -- test/kings.txt ?- father($F, $C). $F = Godwin, $C = Harold II $F = Godwin, $C = Tostig $F = Godwin, $C = Edith $F = Tostig, $C = Skule $F = Harold II, $C = Harold No more. ?-
苏铁没有很多内置谓词,但它确实有
- 追加
- 函数式
- 打印
- 打印列表
- nl(换行)
- 包含、排除
- 大于、小于等。
- 算术函数:+、-、*、/
请参阅测试程序以了解如何使用这些示例。
开发者
苏铁是由Cleve(Klivo)Lendon开发的。
联系方式
要联系开发者,请发送电子邮件至 [email protected]。
欢迎评论、建议和批评。
历史
首次发布,2023年5月。
参考
这个推理机受到了Luger和Stubblefield在《AI算法...》第23章和第24章中提出的谓词演算问题求解器的启发。我强烈推荐这本书。
AI算法,数据结构和Prolog、Lisp、Java中的惯例
George F. Luger,William A. Stubblefield,©2009 | Pearson Education, Inc.
ISBN-13: 978-0-13-607047-4
ISBN-10: 0-13-607047-7
许可证
苏铁的源代码采用MIT许可证,您可以在以下位置找到: LICENSE。