0

我正在做一个练习,用几个不同的习语编写一些逻辑代码...... 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 中的相同婴儿步骤)。

4

1 回答 1

0

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

这在 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:如果目标 arg 评估为真,那么您将在结果元组中返回您的值,否则为空结果。

于 2019-11-30T12:02:48.950 回答