如何重写 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?
第一次重构不起作用,因为 fresh
像 let
一样被使用,但它并没有那样起作用; fresh
只允许您为一些新的逻辑变量命名。
第二次重构不起作用,因为域值被绑定到一个逻辑变量,并且 fd/in
想要一个具体的域值作为它的第二个参数——而不是(新的)逻辑变量。
第三次重构不起作用(我假设)因为 let
绑定不会像 inside run*
宏那样工作,它只需要在其主体中包含一系列 goals。
我正在尝试重写下面的 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?
第一次重构不起作用,因为 fresh
像 let
一样被使用,但它并没有那样起作用; fresh
只允许您为一些新的逻辑变量命名。
第二次重构不起作用,因为域值被绑定到一个逻辑变量,并且 fd/in
想要一个具体的域值作为它的第二个参数——而不是(新的)逻辑变量。
第三次重构不起作用(我假设)因为 let
绑定不会像 inside run*
宏那样工作,它只需要在其主体中包含一系列 goals。