为任何解析表达式语法开发可伸缩的生产规则系统的库

syntreenet的Python项目详细描述


Free logics from PEGs

syntreenet有助于任何有限域形式的轻松开发 任何一种语言所描述的理论都是可能的。

它提供了一个性能良好、可扩展的知识库。 production system,规则和事实相互作用,产生新的规则和 事实。本文中的事实是提供的pegs中的顶级产品,并且 规则基本上是由一组事实构成的,这些事实作为条件和 另一组事实作为祭奠。

它只依赖于erik rose的优秀的Parsimoniouspeg解析器。

Example Usage

让我们从一个简单的语法开始,用它我们可以构建三元组 主语、谓语和宾语,有两个谓语 从而产生事物的分类。举个例子 更简单的是,我们将使用ascii字符串“element of”代替unicode∈, 用“子集”代替。

语法可能如下:

fact        = word ws pred ws word
pred        = element / subset
element     = "element-of"
subset      = "subset-of"
word        = ~"[a-z0-9]+"
ws          = ~"\s+"

有了这个,我们可以得到如下事实:

a element-of b
b subset-of c
c subset-of d

在这种语言之上,我们可能需要一个逻辑,如果前面的3 事实被添加到知识库中,它还将具有以下内容:

a element-of c
a element-of d
b subset-of d

为此,我们需要一个逻辑,其中的变量范围超过“字”的生产。 因此,我们修改语法,将“word”规则替换为:

word        = v_word / __var__
v_word      = ~"[a-z0-9]+"

有了这个语法,我们现在可以建立一个知识库,并添加适当的规则 对于我们的目的:

>>>fromsyntreenetimportKnowledgeBase>>>grammar="""
>>>    fact        = word ws pred ws word
>>>    pred        = element / subset
>>>    element     = "element-of"
>>>    subset      = "subset-of"
>>>    word        = v_word / __var__
>>>    v_word      = ~"[a-z0-9]+"
>>>    ws          = ~"\s+"
>>> """>>>kb=KnowledgeBase(grammar)>>>kb.tell("X1 element-of X2 ; X2 subset-of X3 -> X1 element-of X3")>>>kb.tell("X1 subset-of X2 ; X2 subset-of X3 -> X1 subset-of X3")

现在我们可以向知识库中添加事实,并查询它们 注意事项:

>>>kb.tell("a element-of b")>>>kb.tell("b subset-of c")>>>kb.tell("c subset-of d")>>>kb.query("a element-of b")True>>>kb.query("a element-of d")True>>>kb.query("c element-of d")False>>>kb.query("X1 subset-of d")[{'X1':'b'},{'X1':'c'}]

Goals

可扩展性:
添加新事实或规则的数量实际上是o(1)加上 知识库中已存在的事实。理论上,这是由于 持有数据(事实和规则)的DAG 通过查阅Python词典进行搜索。实际上,我得到了 相当恒定的值,每一个事实只有十分之几毫秒(这个 取决于语法的复杂性),达到我的能力。 笔记本电脑(总计约200万条事实和规则)。
普遍性:
标题中的“free”是指 pegs描述的形式语言:syntreenet对 它处理任何特定逻辑的语法基础 时刻。
清除并测试代码:
代码遵循可读性的最佳实践,并经过99%的测试 覆盖范围包括分支分析。

Detailed Usage

Install

syntreenetpypi提供,只需在python中使用pip>;=3.7 环境:

$ pip install syntreenet
$ python
>>> import syntreenet

Test

要运行测试,可以从镜像下载源代码,创建Python 它的环境,并使用nose2

$ git clone https://git.sr.ht/~enriquepablo/syntreenet
$ cd syntreenet/
$ virtualenv venv
$ source venv/bin/activate
$ python setup.py develop easy_install syntreenet[testing]
$ nose2

Grammar requirements

注意,这些需求可以在的__init__方法中重写 KnowledgeBase

  • 语法中最高级的产物必须叫做“事实”。
  • 必须在逻辑变量范围内的产品必须具有 以"v_"开头的名称。
  • 这些“逻辑”产品必须作为替代品出现在更高的产品中 对于内置产品“Var”。
  • 要制定规则,两组事实(条件和连续性)必须 用分号连接,并用字符串“->;”连接。
  • 只有条件、连续性和查询可以用变量代替 “逻辑”产品。事实不能。
  • 任何语法产品的名称都不能以2个下划线开头和结尾。
  • 变量以“x”开头,后跟任意数字。

Basic API

api非常简单。如上所示,syntreenet的入口点是 KnowledgeBase类。它是用一个包含peg的字符串实例化的 适用于Parsimonious,并受上述限制的约束。

此类对象提供3种方法:

  • tell(self, sentence):接受字符串形式的事实或规则,并 将其合并到知识库中。
  • query(self, fact):接受字符串形式的事实(可能有变量)。 返回是否可以在知识库中找到事实。如果有的话 变量,它将返回导致事实的变量替换 以字符串到字符串的指令形式出现在知识库中。
  • goal(self, fact):提供一个事实,它将返回需要的事实 把它放到知识库中(不直接添加它)。这是一张表格 反向链锁。

Enrique Pérez Arnaud版权所有(C)2019 enrique@cazalla.net>;

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
SpringWeb中的java更新/通知其他用户   java Lambda性能测试   java Bukkit插件:空白符号   java在按下按钮后改变彩色正方形的大小   javajavac相当于“D”?   java序列化接口   属性无法从属性文件返回值   java我应该使用什么查询来使用Jsoup从html页面提取符号?   java Android Studio项目结构问题   JAVA方法和返回值/公共变量(基础)   java将NativeQuery映射到POJO   java如何在下面的程序中消除NumberFormatException?   在java中获取链表与数组中的对象   java Android Firebase将用户发送到聊天室