我正在做一个练习,用几个不同的习语写一些逻辑代码.miniKanren,ASP等.对每个人都有感觉。
我有一个关于一些基本问题的问题:
在Prolog中,您可以定义:
human(bob).然后,在REPL中,您可以检查这个事实和非事实的真相:
?- human(bob).
true.
?- human(e_t).
false.在python miniKanren,LogPy中,您可以类似地定义以下事实:
from kanren import fact
fact(human, 'bob')我找不到一个简单地检查“鲍勃是人”的真理的方法。
run函数似乎需要一个变量作为第二个arg,但我并不试图找到变量的值。
我找到的所有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中相同的初始步骤)。
发布于 2019-11-30 12:02:48
所以..。在写这个问题的时候,我玩得更多了,找到了我想要做的事情的秘诀。
这在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计算为true,那么您将在结果元组中获得您的值,否则将为空结果。
https://stackoverflow.com/questions/59115932
复制相似问题