gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:25:46 28 4
gpt4 key购买 nike

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

正方形的表示方式如下:

[[[x11 y11] [x12 y12]] 
[[x21 y21] [x22 y22] ...]]

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

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

我想将解的大小定义为距原点最近和最远的正方形的右上角和右下角之间的距离,分别

(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)))))))

这似乎适用于普通整数:

(run 1 [q]
(solution-size-o q [[[0 0] [1 1]] [[1 1] [2 2]]]))
=> (3)

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

(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 在其域中留下了多个值:

(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}))))

我明白了

(unconstrained-solution-size)
=> ClassCastException clojure.core.logic.LVar cannot be cast to java.lang.Number clojure.lang.Numbers.minus (Numbers.java:135)

似乎 project 仅在 FD 变量的域完全受到约束时才适用。这是应该的吗?如果是的话,有人对如何对 FD 变量进行非关系运算有什么建议吗?

谢谢!

最佳答案

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

关于Clojure core.logic CLP(FD) 投影 FD 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16252104/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com