基于prolog数据文件的多用户web应用

基于prolog数据文件的多用户web应用,prolog,swi-prolog,Prolog,Swi Prolog,我正在Flask中开发多用户web应用程序。到目前为止,我使用MySQL作为数据源。现在,我添加了一些需要Prolog作为推理引擎的功能。我的问题涉及到如何处理事实和规则数据。我不认为在每个web请求上从MySQL数据创建Prolog文件是一个好的选择,请在服务器上查阅这个新创建的文件。Prolog数据应该以某种方式保存在服务器上,并且在添加一些事实或规则后,Prolog引擎将进行更新。以前有人遇到过这种情况吗?这种功能的正确实现方式是什么 所以,请看如何在多用户web应用程序中持久化Prolo

我正在Flask中开发多用户web应用程序。到目前为止,我使用MySQL作为数据源。现在,我添加了一些需要Prolog作为推理引擎的功能。我的问题涉及到如何处理事实和规则数据。我不认为在每个web请求上从MySQL数据创建Prolog文件是一个好的选择,请在服务器上查阅这个新创建的文件。Prolog数据应该以某种方式保存在服务器上,并且在添加一些事实或规则后,Prolog引擎将进行更新。以前有人遇到过这种情况吗?这种功能的正确实现方式是什么


所以,请看如何在多用户web应用程序中持久化Prolog数据,每个用户都可以添加一些事实甚至规则。其他用户应立即看到更改的数据。如何以稳健和恰当的方式实现它?

这是一个巨大而复杂的问题。让我们开始分解它

在SWI Prolog端,您需要一个动态但持久的数据库。我来帮你处理

但是,它是一个大的但是,Flask是一个多线程应用程序,这意味着您需要某种方式以多线程方式与SWI Prolog通信,并且您的数据更新也需要是线程安全的。PySWIP无法处理这个问题

对于SWI Prolog,为了线程安全,您需要将所有
库(持久性)
谓词包装在带有互斥体/2的

使用SWI Prolog进行多线程通信的最佳选择是通过pengines。通过这种方式,您可以在自己的服务器上运行SWI Prolog,并通过HTTP请求与之通信。
库(持久性)
谓词使用互斥锁,因此被认为是不安全的,这意味着您必须将它们标记为安全的

有一个
pip安装程序
,但是文档与开发不同步。您不需要调用
pengine.create()
,但需要在
query=pengine.ask()
之后调用
pengine.doAsk(查询)
,并使用
pengine.iampointed(查询)
完成一组查询。阅读这本书的源代码不是一个坏主意


这一切都可以重击在一起,它的工作

这不是一个重复的链接问题,它是Python领域中的一个解决方案。这个问题在程序的Prolog域中,您需要一种在Prolog中保存更改的方法。在SWI Prolog中,库持久性是最好的选择。如果你需要帮助,他们不会删除重复的标签,请再次询问,但只有标签与Prolog…我会考虑保存在数据库中,并从Prolog使用它。看到它是如此复杂,这里有一个模板:我会写在一个博客帖子,当我有一点时间,它!您也可以考虑是否将整个应用程序移植到SWI PROlog。这里有一个SWI Web开发教程:,您可能会发现上面提到的简单模板比termerized html更为熟悉。您认为您可以扩展您的github项目,例如添加一些规则吗?因为我需要动态地添加一些具有不同规则定义和不同数量参数的规则。谢谢,这很有效。但是,在我的计算机上添加一个单词大约需要2.2秒。在有更多用户和更大的事实和规则词汇表的生产环境中可能会出现什么问题。但我想我现在可以接受它。这很奇怪,在我的机器上,打一个像
问候语这样的电话需要0.003到0.005秒。添加形容词(单词)
。虽然可以在SWI Prolog中添加要持久化和调用的规则,但我不推荐这样做。您将绕过沙箱:代码可以访问底层操作系统。这需要pengine的专业知识才能确保安全。相反,我建议您将这些规则存储为Python中的字符串,并将它们与需要它们的查询一起发送,因此它们将被沙盒化
srctext
PengineBuilder
实例化的缩写。