【问题标题】:Relational/Logic Programming in Python?Python中的关系/逻辑编程?
【发布时间】:2010-12-27 10:03:24
【问题描述】:

我是一名长期的 Python 开发人员,最近被介绍给 Prolog。我喜欢将关系规则用于某些类型的任务的概念,并希望将其添加到我的曲目中。

有没有好的 Python 逻辑编程库?我在 Google 上进行了一些搜索,但只找到以下内容:

jtauber's blog series on relational_python

很想与其他一些人进行比较...谢谢!

-aj

【问题讨论】:

  • 哇,伙计...我尊重任何甚至可以阅读序言的人! +1
  • 我也试了一下:github.com/evertheylen/logicpy。它试图在过多的 Python 魔法和过于繁琐的使用之间找到一个很好的平衡。
  • 这是一篇博客文章中一个可信的“真实世界”示例。看起来不错,除了错误消息(来自验证)做得不好(你得到通过/失败,没有解释为什么是jeffersonheard.github.io/2016/11/…

标签: python prolog logic-programming


【解决方案1】:

您可能想要使用pyDatalog,这是我为实现Datalog 的Python 开发的一个逻辑编程库。它还与 SQLAlchemy 一起使用逻辑子句查询关系数据库。

【讨论】:

  • 您需要披露它是您的项目!
【解决方案2】:

也许您应该在 Google 上搜索“Python 中的逻辑编程”。 Pyke 看起来很有希望:

Pyke 引入了一种逻辑编程形式(受 Prolog 启发)来 Python 社区通过提供基于知识的推理引擎 (专家系统)100% 用 Python 编写。

与 Prolog 不同,Pyke 与 Python 集成,允许您调用 Pyke 来自 Python 并在其中混合 Python 语句和表达式 您的专家系统规则。

【讨论】:

  • @Richie,看起来很有用。谢谢指点!
  • 来自 Pyke 的页面:“Pyke 通过提供以 100% Python 编写的基于知识的推理引擎(专家系统),向 Python 社区引入了一种逻辑编程形式(受 Prolog 启发)。”跨度>
【解决方案3】:

随着我们迈向 2019 年,我推荐 PySWIP 而非此处推荐的其他人。与 Pyke(9 年前)或 PyLog(6 年前)不同,它得到积极维护并且界面简单。

【讨论】:

  • 在 PySWIP 中应用表格是否直接(以避免无限循环等...?),就像在 pyDatalog 中一样。
【解决方案4】:

LogPyminiKanren(一种关系编程语言)在 Python 中的实现。它继承了core.logic 的传统,这是 Clojure 中卓越的逻辑编程解决方案。 LogPy 旨在与预先存在的代码库进行互操作。

【讨论】:

    【解决方案5】:

    另一个选项是Yield Prolog

    【讨论】:

      【解决方案6】:

      您还可以查看 Dee,它为 Python 添加了关系:http://www.quicksort.co.uk

      【讨论】:

      • Dee 是 D 的实现吗(如 Date 的书中所述?)
      • 它是(没有对象/类型规范)
      • 太糟糕了,它似乎已经死了。看起来很有希望
      【解决方案7】:

      最近在 Python(或者更确切地说是 RPython)中的 Prolog 实现 Pyrolog。它仍然是实验性的。

      【讨论】:

      • 这很酷,但它与python互操作吗?它是在 pypy 之上编写的,它还支持(著名的)python 实现,但我不清楚这意味着互操作。另外,虽然我在这里,blog.herraiz.org/archives/238 已经有几年的历史了,但列出了各种选项(它暗示了 pyrolog 互操作,但听起来它只是因为 pypy 而被假设,这就是我所质疑的)。跨度>
      • 概念验证。因此,与资源一起使用可能会允许这样做。
      【解决方案8】:

      您还应该检查 PyLog:

      http://cdsoft.fr/pylog/

      它有一个非常干净和简单的语法和实现。

      【讨论】:

        【解决方案9】:

        你可以看看pytholog。 它完全用 python 编写,没有与 prolog 的接口,它模仿 prolog 的语法、方法和回溯。 只需启动一个知识库并为其提供事实和规则,然后运行查询。

        import pytholog as pl
        food_kb = pl.KnowledgeBase("food")
        food_kb(["food_type(gouda, cheese)",
                "food_type(ritz, cracker)",
                "food_type(steak, meat)",
                "food_type(sausage, meat)",
                "food_type(limonade, juice)",
                "food_type(cookie, dessert)",
                "flavor(sweet, dessert)",
                "flavor(savory, meat)",
                "flavor(savory, cheese)",
                "flavor(sweet, juice)",
                "food_flavor(X, Y) :- food_type(X, Z), flavor(Y, Z)"])
        
        print(food_kb.query(pl.Expr("food_flavor(What, sweet)")))
        # [{'What': 'limonade'}, {'What': 'cookie'}]
        print(food_kb.query(pl.Expr("flavor(sweet, dessert)")))
        # ['Yes']
        

        它还支持计算和概率

        battery_kb = pl.KnowledgeBase("battery")
        battery_kb([
            "battery(dead, P) :- voltmeter(battery_terminals, abnormal, P2), P is P2 + 0.5",
            "battery(dead, P) :- electrical_problem(P), P >= 0.8",
            "battery(dead, P) :- electrical_problem(P2), age(battery, old, P3), P is P2 * P3 * 0.9",
            "electrical_problem(0.7)",
            "age(battery, old, 0.8)",
            "voltmeter(battery_terminals, abnormal, 0.3)"])
        
        battery_kb.query(pl.Expr("battery(dead, Probability)"))
        # [{'Probability': 0.8}, {'Probability': 'No'}, {'Probability': 0.504}]
        

        它也可以用于查找图中节点之间的路径。

        graph = pl.KnowledgeBase("graph")
        graph([
            "edge(a, b, 6)", "edge(a, c, 1)", "edge(b, e, 4)",
            "edge(b, f, 3)", "edge(c, d, 3)", "edge(d, e, 8)",
            "edge(e, f, 2)",
            "path(X, Y, W) :- edge(X , Y, W)",
            "path(X, Y, W) :- edge(X, Z, W1), path(Z, Y, W2), W is W1 + W2"])
        
        answer, path = graph.query(pl.Expr("path(a, f, W)"), show_path = True)
        print(answer)
        # [{'W': 9}, {'W': 12}, {'W': 14}]
        
        print([x for x in path if str(x) > "Z"])
        # ['d', 'b', 'e', 'c']
        
        answer, path = graph.query(pl.Expr("path(a, e, W)"), show_path = True, cut = True)
        print(answer)
        # [{'W': 10}]
        
        print([x for x in path if str(x) > "Z"])
        # ['b']
        

        【讨论】:

          【解决方案10】:

          另一种选择是使用in-memory relational databases。毕竟 SQL 是最流行的关系语言,它和 Prolog 有很多相似之处。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多