我有一个用户使用规则引擎构建的等价物。但是在显示规则列表时,我希望能够将每个规则“漂亮地打印”成看起来不错的东西**。在内部,当表示为字符串时,它们看起来像 s 表达式,所以想象一下:
(and (contains "foo" "foobar") (equals 4 (plus 2 2 )))
任何人都可以指出一个以可读方式很好地显示规则的程序吗?
** 也需要本地化,但我想我们会把它留作额外的功劳。
我有一个用户使用规则引擎构建的等价物。但是在显示规则列表时,我希望能够将每个规则“漂亮地打印”成看起来不错的东西**。在内部,当表示为字符串时,它们看起来像 s 表达式,所以想象一下:
(and (contains "foo" "foobar") (equals 4 (plus 2 2 )))
任何人都可以指出一个以可读方式很好地显示规则的程序吗?
** 也需要本地化,但我想我们会把它留作额外的功劳。
也许可以查看正在开发 Attempto Controlled English (ACE) 的Attempto 项目。ACE 允许您用英语的子集编写规则。例如:
If "foo" contains "foobar" and "foobar" does not contain "foo" then 4 = 2 + 2.
ACE 解析器将此类规则转换为称为话语表示结构 (DRS) 的逻辑形式。对于上面的示例,它看起来像这样:
[]
[A]
predicate(A, contain, string(foo), string(foobar))-1
NOT
[B]
predicate(B, contain, string(foobar), string(foo))-1
=>
[]
formula(int(4), =, expr(+, int(2), int(2)))-1
有一个称为 DRS 语言生成器的工具可以将 DRS 转换为 ACE。对于上述 DRS,您将获得:
If "foo" contains "foobar" and it is false that "foobar" contains "foo" then 4 = ( 2 + 2 ).
在您的情况下,您必须将您的规则表示形式转换为 DRS(这应该非常简单),然后您可以直接使用 DRS 语言器。上述工具在 LGPL 许可下可用。