Python中的关系/逻辑编程?

时间:2009-12-16 20:50:22

标签: python prolog logic-programming

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

Python中有没有适合逻辑编程的库?我在谷歌上做了一些搜索,但只发现了以下内容:

jtauber's blog series on relational_python

愿意与其他人比较......谢谢!

-aj

10 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:11)

也许你应该谷歌“用Python编写逻辑程序”。 Pyke看起来很有希望:

  Pyke介绍了一种逻辑编程形式(灵感来自Prolog)   通过提供基于知识的推理引擎来实现Python社区   (专家系统)用100%Python编写。

     

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

答案 2 :(得分:3)

另一个选项是Yield Prolog

答案 3 :(得分:3)

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

答案 4 :(得分:2)

你也可以看看Dee,它增加了与Python的关系:http://www.quicksort.co.uk

答案 5 :(得分:2)

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

答案 6 :(得分:2)

您还应该检查PyLog:

http://cdsoft.fr/pylog/

它具有非常简洁的语法和实现。

答案 7 :(得分:1)

在我们迈向2019年的同时,我推荐PySWIP,胜过这里推荐的其他人。它与Pyke(9年前)或PyLog(6年前)不同,它得到了积极维护,并具有易于使用的界面。

答案 8 :(得分: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']

答案 9 :(得分:0)

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