#swi-prolog #blob #interface #definition #embedding #predicate #extension

swipl

一个用于构建 SWI-Prolog 扩展和在 Rust 应用程序中嵌入 SWI-Prolog 的高级别库

19 个版本

0.3.16 2024 年 2 月 20 日
0.3.15 2023 年 10 月 18 日
0.3.14 2023 年 8 月 3 日
0.3.13 2023 年 1 月 17 日
0.3.4 2021 年 7 月 6 日

#219 in Rust 模式

Download history 31/week @ 2024-04-22 15/week @ 2024-04-29 12/week @ 2024-05-06 16/week @ 2024-05-13 21/week @ 2024-05-20 23/week @ 2024-05-27 26/week @ 2024-06-03 23/week @ 2024-06-10 20/week @ 2024-06-17 21/week @ 2024-06-24 23/week @ 2024-07-01 22/week @ 2024-07-08 22/week @ 2024-07-15 60/week @ 2024-07-22 23/week @ 2024-07-29 21/week @ 2024-08-05

129 个月下载量

Apache-2.0/MIT

355KB
7.5K SLoC

swipl-rs swipl 包

这是 swipl-rs 的核心包,它实现了对 SWI-Prolog 的高级接口(封装了 swipl-fli 包),并公开了所有用于生成绑定、外部谓词定义和 blob 类型的宏(公开了 swipl-macros 包)。

文档

使用 swipl-rs

在您的 Cargo.toml 文件中的依赖项下添加以下行

swipl = "0.3"

然后在您的代码中使用 swipl 导入

use swipl::prelude::*;

请参阅此存储库中的 示例 和文档以获取更多指导。

构建 SWI-Prolog 外部库

为了使用此库构建 SWI-Prolog 可以使用的项目,您必须将您的 crate-type 设置为 cdylib,并提供一个类似于以下的主函数

#[no_mangle]
pub extern "C" fn install() {
    register_predicate_a();
    register_predicate_b();
    // ..etc
}

通过 predicates! 宏定义的所有谓词都有一个相应的 register_<name> 函数,您需要在 install 函数内部调用此函数,使此谓词对 Prolog 可知。此外,您还可以在此处执行在加载时需要执行的任何其他操作。

例如,请参阅 示例项目

构建完成后,您的外部库可以在 Prolog 中按如下方式加载

?- use_foreign_library('target/debug/libswipl_module_example.so').
true.

(替换您的项目名称,如果您进行了发布构建,则替换发布为调试)

测试

在构建时,低级别的 swipl-fli 包将自动发现您的 swipl 安装并链接到该安装。然而,此安装的共享对象可能不在您的路径上。实际上,通常不是这样。这意味着您不能直接运行 cargo test 来运行您的单元测试,因为此链接位置没有存储在任何地方。

为了运行单元测试,请考虑安装 cargo-swipl,方法如下

cargo install cargo-swipl

然后您可以执行 cargo swipl test 来运行测试。 cargo-swipl 会以与 swipl-fli 构建相同的方式自动发现您的 swipl 安装,并在调用 cargo test 之前将其添加到加载路径中。

依赖关系

~2.8–5.5MB
~102K SLoC