38

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

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

jtauber 关于relational_python 的博客系列

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

-aj

4

10 回答 10

14

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

于 2012-07-04T20:11:51.310 回答
12

也许你应该在谷歌上搜索“Python 中的逻辑编程”。派克看起来很有希望:

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

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

于 2009-12-16T21:32:33.640 回答
7

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

于 2018-11-26T05:05:48.763 回答
5

LogPy是 miniKanren 的实现一种关系编程语言,在 Python 中。它遵循core.logicClojure 中卓越的逻辑编程解决方案的传统。LogPy 旨在与预先存在的代码库进行互操作。

于 2013-05-09T14:38:10.473 回答
3

另一种选择是Yield Prolog

于 2012-03-29T19:10:38.027 回答
2

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

于 2010-10-15T15:53:11.597 回答
2

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

于 2012-03-29T14:52:19.137 回答
2

您还应该检查 PyLog:

http://cdsoft.fr/pylog/

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

于 2012-11-16T10:51:07.667 回答
1

你可以看看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']
于 2020-04-15T07:43:31.200 回答
0

另一种选择是使用内存中的关系数据库。毕竟 SQL 是最流行的关系语言,它和 Prolog 有很多相似之处。

于 2020-05-21T09:37:57.757 回答