为任何解析表达式语法开发可伸缩的生产规则系统的库
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
syntreenet在pypi提供,只需在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>;