我期望下面的表达式返回许多结果,每个结果由两个cons组成,其中两个cons不是等效的。但是,它返回0的结果。为什么我得不到结果?
(run* [c1 c2]
(fresh [lx ly x1 y1 x2 y2]
(== lx [1 2])
(== ly [4 5])
(membero x1 lx)
(membero x2 lx)
(membero y1 ly)
(membero y2 ly)
(conso x1 y1 c1)
(conso x2 y2 c2)
(!= c1 c2)))预期成果实例:
[(1 . 4) (2 . 5)][(1 . 4) (1 . 5)][(2 . 4) (2 . 5)]我不希望它返回像[(1 . 4) (1 . 4)]这样的结果,其中每个反项中的两个点相等。
如果删除(!= c1 c2)部分,就会得到16个结果,包括两个缺点相同的结果。
如果我将(!= c1 c2)替换为:
(conde
((!= x1 x2))
((!= y1 y2)))它应该做同样的事情,但是显式地检查两个单元格。
发布于 2013-05-10 16:12:22
这不是一个有效的core.logic程序。在尾部不合适的地方,不能使用conso。方案中的miniKanren将允许您这样做,但是core.logic的行为是未定义的。我已经修改了conso的docstring以反映这一点。工作程序:
(run* [c1 c2]
(fresh [lx ly x1 y1 x2 y2]
(== lx [1 2])
(== ly [4 5])
(membero x1 lx)
(membero x2 lx)
(membero y1 ly)
(membero y2 ly)
(== [x1 y1] c1)
(== [x2 y2] c2)
(!= c1 c2)))发布于 2013-05-10 15:53:59
海报上说你不能像这样使用conso是正确的。以下是文档字符串:
一种关系,其中i是集合,因此a是l的第一个。 D是l的其余部分,如果d必须绑在适当的尾巴上。
您应该使用(== [x1 y1] c1)和(== [x2 y2] c2)或(conso x1 [y1] c1)和(conso x2 [y2] c2)来列出合适的列表。
https://stackoverflow.com/questions/16468791
复制相似问题