miniKanren(logpy,或其他)如何断言一个事实是真的?

miniKanren (logpy, or others) how to assert a fact is true?

我正在做一个练习,用几种不同的惯用语编写一些逻辑代码...Prolog、miniKanren、ASP 等...以了解每种习惯。

我有一个关于一些非常基本的问题:

在 Prolog 中你可以定义:

human(bob).

然后在 REPL 中你可以检查这个事实和一个非事实的真实性:

?- human(bob).
true.

?- human(e_t).
false.

在python迷你看人中,LogPy,你可以类似地定义事实:

from kanren import fact

fact(human, 'bob')

我找不到简单检查 "bob is human" 真实性的方法。

run 函数似乎需要一个变量作为第二个参数,但我并没有试图找到变量的值。

我找到的所有看人文示例都是从展示如何查询关系开始的,例如:

from kanren import Relation, fact, run, var

human = Relation()

fact(human, 'bob')
fact(human, 'jim')

x = var('x')

run(0, x, human(x))

# output:
('jim', 'bob')

这更有用,但我想做的比这更简单(只是为了比较 Prolog 中相同的婴儿步骤)。

所以...在写出这个问题的同时,我又进行了更多尝试,找到了我正在尝试做的事情的秘诀。

这在 LogPy miniKanren 中有效,我很想知道类似的用法是否适用于其他实现,例如 Clojure core.logic 等(或者是否有其他方法!)。

from kanren import Relation, fact, run, var

human = Relation()

fact(human, 'bob')

run(0, True, human('bob'))
>>> (True,)

run(0, True, human('E.T.'))
>>> ()

我们可以使用任何东西代替 True arg:如果目标 arg 的计算结果为真,那么您将在结果元组中取回您的值,否则为空结果。