首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure core.logic CLP( FD )投影FD变量

Clojure core.logic CLP( FD )投影FD变量
EN

Stack Overflow用户
提问于 2013-04-27 20:27:57
回答 1查看 476关注 0票数 2

我正在使用core.logic的Clojure(FD)库(core.logic版本0.8.3)开发一个简单的正方形打包算法。

方块的表示方式如下:

代码语言:javascript
复制
[[[x11 y11] [x12 y12]] 
 [[x21 y21] [x22 y22] ...]]

每个正方形表示为其左上角和右下角的坐标。

坐标是FD变量,在一定的间隔内。

我希望将解决方案的大小定义为最接近和最远的正方形的右上角和右下角之间的距离。

代码语言:javascript
复制
(defne solution-size-o [size squares]
  ([s sqrs]
    (fresh [closest farthest 
            x11 y11 x22 y22 _1 _2]
    (closest-square   [[x11 y11] _1] sqrs)
    (farthest-square  [_2 [x22 y22]] sqrs)
    (project [x11 y11 x22 y22]
      (let [a (- y22 y11)
            b (- x22 x11)]
        (== s (-> (+ (* a a) (* b b)) Math/sqrt Math/ceil int)))))))

这似乎可以很好地处理纯整数:

代码语言:javascript
复制
(run 1 [q]
  (solution-size-o q [[[0 0] [1 1]] [[1 1] [2 2]]]))
=> (3)

即使使用完全受约束的FD变量

代码语言:javascript
复制
(defn constrained-solution-size []
  (run 1 [q] 
    (fresh [size x11 y11 
                 x12 y12 
                 x21 y21 
                 x22 y22 squares]
      (fd/in x11 y11 x12 y12 x21 y21 x22 y22 (fd/interval 0 2))
      (fd/eq 
        (= x11 0) (= y11 0) (= x21 1) (= y21 1)
        (= x12 (+ x11 1)) (= y12 (+ y11 1))
        (= x22 (+ x21 1)) (= y22 (+ y21 1)))
      (== squares [[[x11 y11] [x12 y12]] [[x21 y21] [x22 y22]]])
      (solution-size-o size squares)
      (== q {:squares squares :size size}))))

(constrained-solution-size)
=> ({:squares [[[0 0] [1 1]] [[1 1] [2 2]]], :size 3})

但是当变量的域没有被完全约束时,它似乎就会崩溃。例如,如果我删除y21 = 1的约束,这意味着y11y21在它们的域中有多个值:

代码语言:javascript
复制
(defn unconstrained-solution-size []
  (run 1 [q] 
    (fresh [size x11 y11 
                 x12 y12 
                 x21 y21 
                 x22 y22 squares]
      (fd/in x11 y11 x12 y12 x21 y21 x22 y22 (fd/interval 0 2))
      (fd/eq 
        (= x11 0) (= y11 0) (= x21 1)
        (= x12 (+ x11 1)) (= y12 (+ y11 1))
        (= x22 (+ x21 1)) (= y22 (+ y21 1)))
      (== squares [[[x11 y11] [x12 y12]] [[x21 y21] [x22 y22]]])
      (solution-size-o size squares)
      (== q {:squares squares :size size}))))

我得到了

代码语言:javascript
复制
(unconstrained-solution-size)
=> ClassCastException clojure.core.logic.LVar cannot be cast to java.lang.Number     clojure.lang.Numbers.minus (Numbers.java:135)

当FD变量的域完全受约束时,project似乎只对FD变量起作用。事情应该是这样的吗?如果是,有没有人有关于如何对FD变量进行非关系运算的建议?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-27 21:36:09

是的,您不能投影没有被约束为单个值的有限域变量。我建议您在Prolog中查看利用CLP(FD)解决问题的现有解决方案。这很可能是因为我们不支持足够的约束来使这个问题易于表达-我们正在努力解决这个问题。

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

https://stackoverflow.com/questions/16252104

复制
相关文章

相似问题

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