如何重写 core.logic 片段?

How to rewrite the core.logic snippet?

我正在尝试重写下面的 core.logic 代码。

(run* [x y]
    (fd/in x (fd/domain 1 2))
    (fd/in y (fd/domain 1 2)))

o/p,

([1 1] [2 1] [1 2] [2 2])

我尝试了以下版本,但其中 none 个有效,

(run* [x y]
    (fresh [dom (fd/domain 1 2)])
        (fd/in x dom)
        (fd/in y dom)))

;;错误不支持的绑定形式:(fd/domain 1 2)

(run* [x y]
 (fresh [dom]
    (== dom  (fd/domain 1 2))
    (fd/in x dom)
    (fd/in y dom)))

O/P:

([1 1])

(run* [x y]
  (let [dom (fd/domain 1 2)]
  (fd/in x dom)
  (fd/in y dom)))

O/P:

([_0 1] [_0 2])

我尝试的 3 个版本的基本原理是什么?任何帮助将不胜感激。

fd/domain returns 可以与 fd 命名空间中的其他 goals/relations 一起使用的具体值——您可以定义一次并在 [=13] 中使用它=]不止一次:

(let [dom (fd/domain 1 2)]
  (run* [x y]
    (fd/in x dom)
    (fd/in y dom)))
=> ([1 1] [2 1] [1 2] [2 2])

What's the rationale for the 3 versions that I tried?

第一次重构不起作用,因为 freshlet 一样被使用,但它并没有那样起作用; fresh 只允许您为一些新的逻辑变量命名。

第二次重构不起作用,因为域值被绑定到一个逻辑变量,并且 fd/in 想要一个具体的域值作为它的第二个参数——而不是(新的)逻辑变量。

第三次重构不起作用(我假设)因为 let 绑定不会像 inside run* 宏那样工作,它只需要在其主体中包含一系列 goals