迷你坎人(日志或其他人)如何断言事实是真的?



我正在做一个练习,用几个不同的习语编写一些逻辑代码......Prolog,miniKanren,ASP等...感受一下每一个。

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

在Prolog中,您可以定义:

human(bob).

然后在 REPL 中,您可以检查此事实和非事实的真实性:

?- human(bob).
true.
?- human(e_t).
false.

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

from kanren import fact
fact(human, 'bob')

我找不到简单地检查"鲍勃是人"真相的秘诀。

run函数似乎需要一个变量作为第二个参数,但我不想找到变量的值。

我找到的所有Kanren示例都首先展示了如何查询关系,例如:

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.'))
>>> ()

我们可以使用任何东西来代替Truearg:如果目标参数的计算结果为真,那么你将在结果元组中得到你的值,否则结果为空。

最新更新