我正在使用 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 中看到了一些关于这些的猜测,但没有具体的。