如何从minikanren/clojure-core.logic中的一组可能值中进行选择?

如何从minikanren/clojure-core.logic中的一组可能值中进行选择?,clojure,scheme,clojure-core.logic,minikanren,Clojure,Scheme,Clojure Core.logic,Minikanren,如何表达n变量从一组n值中获取不同值的约束 例如,可能我想搜索表单的表达式 (op1 a (op2 b c)) 对于最大值,当a、b和c应为1、2和3(以某种顺序),而op1和op2可以是*+-/exp 我可以看到如何使a具有13中的值(例如使用conde)。对于b和c也一样。但我如何排除平等呢?我是否需要循环所有组合并显式排除它们 显然,我可以“手动”完成排除,但我想知道是否有更好(更有效)的方法,或者是否有一个支持库包含类似的内容(我对线性编程libs有更多的经验,通常它们有一系列帮助函数

如何表达
n
变量从一组
n
值中获取不同值的约束

例如,可能我想搜索表单的表达式

(op1 a (op2 b c))
对于最大值,当a、b和c应为1、2和3(以某种顺序),而op1和op2可以是
*+-/exp

我可以看到如何使
a
具有
13
中的值(例如使用
conde
)。对于
b
c
也一样。但我如何排除平等呢?我是否需要循环所有组合并显式排除它们

显然,我可以“手动”完成排除,但我想知道是否有更好(更有效)的方法,或者是否有一个支持库包含类似的内容(我对线性编程libs有更多的经验,通常它们有一系列帮助函数来处理这些常见情况)

把它推广到某些值可能出现一定次数的情况,似乎这是一个阻力

现在我在想,我如何寻找最大值?有没有一本好书或一套关于这个的笔记

[我正在使用clojure,但我的理解是clojure-core.logic和minikanren几乎完全相同]


更新:任何阅读此问题的人如果想获得一个好的介绍,请查看我在下面的评论中提到的内容。

Aha。所以clojure核心包括了cKaren扩展(我应该更仔细地阅读文档)。谢谢是什么让你认为这是一个cKanren扩展?rembero是TRS中定义的一个关系,最近为了方便起见添加到core.logic中。(其中提到克伦)和(描述克伦并提到伦贝罗);如果这不正确,我还缺少其他一些文件吗?好的,现在我已经读了报纸,你是对的,它指的是trs。对于阅读本文的其他人来说,ckanren似乎确实在clojure-core.logic中,但有些东西已经重命名。例如,所有difffd都是differfd。
(run* [q] 
  (fresh [a b c]
    (== q [a b c])
    (fresh [x y z]
      (rembero a '(* + / - exp) x)
      (rembero b x y)
      (rembero c y z))))