我正在做一个练习,用几个不同的习语编写一些逻辑代码......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.'))
>>> ()
我们可以使用任何东西来代替True
arg:如果目标参数的计算结果为真,那么你将在结果元组中得到你的值,否则结果为空。