#知识库 #查询 #事实 #Prolog #规则 #引擎 #suiron

bin+lib suiron-rust

一个快速的类似Prolog的推理引擎

1 个不稳定版本

0.1.0 2023年5月3日

#5#事实

MIT 许可证

380KB
6K SLoC

Suiron - 用 Rust 编写的推理引擎。

Suiron 是一个快速的推理引擎。其事实/规则定义语言与 Prolog 类似,但有一些区别。

为了了解如何使用 Suiron,对 Prolog 有基本的了解有帮助。以下是一些有用的链接

逻辑编程
cse341

在以下网址有 Suiron 的在线教程和测试网站:klivo.net/suiron

简要介绍

推理引擎分析存储在知识库中的事实和规则。

Suiron 从文本格式的源文件中加载事实和规则,解析它们,并将它们写入知识库。

以下是一个事实的例子,表示“六月是西奥多之母”

mother(June, Theodore).

在这里我们看到 Suiron 与 Prolog 之间的主要区别。在 Prolog 中,小写单词是 atoms(即字符串常量)和,大写单词是变量。在 Suiron 中,原子可以是小写或大写。因此,motherJuneTheodore 都是原子。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 开发和测试。

https://rust-lang.net.cn/

克隆

要在终端窗口中克隆存储库,请运行以下命令

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

依赖关系