2

我正在使用 minikanren 的 LogPy 实现。

我有一些关于婚姻的事实。

from logpy import *
marriedo=Relation()
fact(marriedo,"Bob", "Jane")
fact(marriedo,"Greg", "Anne")
fact(marriedo,"Bob", "Susan")

我可以通过“用户级”运行功能找到某人的妻子

wife = var()
run(1, wife, (marriedo, "Bob", wife))
>('Jane')
run(0, wife, (marriedo, "Bob", wife))
>('Jane', 'Susan')

但是调用run使我脱离了逻辑编程世界,所以它是不可逆的。

尽管如此,我认为我可以通过以下方式检测重婚者:

wives = var()
wife = var()
husband = var()
run(1, husband, arith.gt(len(run(0,wife,(marriedo, husband, wife))),1))

但是(~_105,)每次运行它时都会输出类似数字变化的东西。这不是“鲍勃”。

在 Prolog 中,我相信执行此操作的关键工具是findall/bagof/setoff

我在 minikanren 中看到了一些关于这些的猜测,但没有具体的。

4

0 回答 0