有没有办法将数据库表行转换为Prolog事实?

时间:2011-11-17 18:58:07

标签: database postgresql prolog

经过一些研究后,我对Prolog以非常简单的方式表达查询的能力感到惊讶,几乎就像在口头告诉机器该做什么一样。之所以发生这种情况,是因为我在工作中对Propel和PHP感到非常厌烦。

所以,我一直想知道是否有办法将数据库表行(例如Postgres)转换为Prolog事实。这样,我可以停止使用这么多无聊的连接并使用ORM,而是写下这样的东西来得到我想要的东西:

mantenedora_ies(ID_MANTENEDORA, ID_IES) :- 
  papel_pessoa(ID_PAPEL_MANTENEDORA, ID_MANTENEDORA, 1),
  papel_pessoa(ID_PAPEL_IES, ID_IES, 6),
  relacionamento_pessoa(_, ID_PAPEL_IES, ID_PAPEL_MANTENEDORA, 3).

要了解我为何感到无聊,请查看this post。那些代码将被替换为前面这些简单的行,更容易阅读和理解。我只是对此感到好奇,因为在这里更换东西是不可能的。

如果可以在PHP中完成类似的事情,也会很酷。有谁知道这样的事情?

3 个答案:

答案 0 :(得分:1)

检查swi-prolog的ODBC接口(也许还有其他prolog实现的等价物)

http://www.swi-prolog.org/pldoc/doc_for?object=section%280,%270%27,swi%28%27/doc/packages/odbc.html%27%29%29

答案 1 :(得分:1)

Draxler Prolog to SQL编译器,它将一些模式(如您编写的连接)转换为更详细的SQL连接。您可以在相关帖子(prolog to SQL converter)中找到更多信息。

但要注意Prolog也有它的弱点,特别是关于聚合。没有库,获得总和,计数等并不是一件容易的事。而且这些库并不常见,而且易于使用。

我认为你可以尝试专门为equijoins设置PHP DB接口,使用内置功能来缩短查询文本(当这导致代码更易读时)。在SWI-Prolog / ODBC中工作,在那里(就像在PHP中)你需要编写SQL,我有效地发现自己的工作方式,处理与你在其他帖子中显示的非常相似的东西。

我发现另一种有用的方法:我为MySQL备份接口(PHPMyAdmin,真的)使用的SQL子集编写了一个解析器。所以我经常在本地转储我的CMS'DB,加载内存,应用我需要的任务,计算和编写(或应用)insert / update / delete语句,然后上传这些。这可以通过适合内存的DB的有限大小来完成。我已经开发了,现在我用这种天真的方法来维持this小型电子商务。

从PHP编写Prolog应该不会太困难:我会尝试修改已经提供基本序列化格式选择的现有界面,例如真棒Adminer

答案 2 :(得分:1)

我可以想到一些方法 -

  1. 在初始化时,调用一个方法,该方法执行从表中选择所有数据并将其断言到db中。为每个数据库执行此操作。您需要将每行的形状声明为: - dynamic ies_row / 4 etc

  2. 您可以通过覆盖user:prolog_load_files来修改load_files。从这个活动你可以得到类似于#1的东西。这有点看起来像load_files调用的好处。 http://www.swi-prolog.org/pldoc/man?predicate=prolog_load_file%2F2 ...此文档提到了库(http_load),但我无法在任何地方找到它(我最近对此感兴趣)!