首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解core.logic !=

理解core.logic !=
EN

Stack Overflow用户
提问于 2013-05-09 18:39:12
回答 2查看 240关注 0票数 1

我期望下面的表达式返回许多结果,每个结果由两个cons组成,其中两个cons不是等效的。但是,它返回0的结果。为什么我得不到结果?

代码语言:javascript
运行
复制
(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)替换为:

代码语言:javascript
运行
复制
(conde
  ((!= x1 x2))
  ((!= y1 y2)))

它应该做同样的事情,但是显式地检查两个单元格。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-10 16:12:22

这不是一个有效的core.logic程序。在尾部不合适的地方,不能使用conso。方案中的miniKanren将允许您这样做,但是core.logic的行为是未定义的。我已经修改了conso的docstring以反映这一点。工作程序:

代码语言:javascript
运行
复制
(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)))
票数 5
EN

Stack Overflow用户

发布于 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)来列出合适的列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16468791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档