CLP:对结构变量的约束?
CLP: Constraints on structured variables?
让我们假设以下场景……一个 5x5 的网格,假设有 3 个数字。
我们想定义对职位的约束。在 CLP 中,我们通常用整数定义约束,所以这是一种实现方式:
... Fig1X #\= 2, Fig1Y #\= 3, ....
即我们为每个 X 和 Y 位置都有单独的变量。有没有一种方法可以定义基于整数的结构化变量的约束。举个例子:
.... Fig1 #\= (2,4) ...
场景仅供参考。
我主要对你们如何处理结构化变量感兴趣,是否有标准做法。
在像您这样的情况下,"structured variables" 具有仅包含数字字段的固定结构,您不需要 "structured variable" 的概念。您在概念上只使用数字元组(或数字变量)。
有时这些元组最好表示为列表,因为这样您就可以直接应用将列表作为参数的全局约束。例如,要限制点 [X,Y]
不在对角线上,您可以写
alldifferent([X,Y])
或使用 table-constraint 将其约束到给定的一组坐标:
table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])
在其他情况下,最好使用 structures 和描述性仿函数,例如 point(X,Y)
或 rect(X1,Y1,X2,Y2)
,然后编写相应的约束包装器,例如作为
points_differ(point(X,Y), point(V,W)) :-
X#\=V or Y#\=W.
或
rect_contains_point(rect(I,J,K,L), point(PI,PJ)) :-
I #=< PI, PI #=< K,
J #=< PJ, PJ #=< L.
特别是与您示例中的几何任务相关的问题,至少有以下完全不同的概念方法:
geost/N
:这些约束提供了一个专用的 mini-language 用于推理 multi-dimensional 对象。这是一种非常强大和灵活的方法,可用于 SICStus Prolog 以及其他一些约束系统。
- 具体化约束。例如,您可以声明
X #= 2 #==> Y #\= 4
来表示如果 X
等于 2,Y
一定不能 为 4。因此,(X,Y)
自动不同于 (2,4)
.
- extensional constraints(在许多 Prolog 系统中可用作
table/2
、fd_relation/2
等)让您 明确地 枚举可接受的元组集或其补充。
- 重塑你的任务是通过布尔指标在允许的位置之间进行选择。有关此方法的示例,请参阅 Packing Squares。
这些方法会带来不同的后果 trade-offs。以上顺序大致反映了我个人的喜好和建议。但是,根据手头的情况,一种方法可能比其他方法有显着优势。
CSP 中的建模部分有时被称为一门艺术而不是一门科学,这也是因为有太多不同的可能性可供选择,并且先验地不清楚哪种模型最好也因为有太多许多 trade-offs——例如便利性、便携性、可扩展性、速度、内存等——都涉及。
让我们假设以下场景……一个 5x5 的网格,假设有 3 个数字。 我们想定义对职位的约束。在 CLP 中,我们通常用整数定义约束,所以这是一种实现方式:
... Fig1X #\= 2, Fig1Y #\= 3, ....
即我们为每个 X 和 Y 位置都有单独的变量。有没有一种方法可以定义基于整数的结构化变量的约束。举个例子:
.... Fig1 #\= (2,4) ...
场景仅供参考。
我主要对你们如何处理结构化变量感兴趣,是否有标准做法。
在像您这样的情况下,"structured variables" 具有仅包含数字字段的固定结构,您不需要 "structured variable" 的概念。您在概念上只使用数字元组(或数字变量)。
有时这些元组最好表示为列表,因为这样您就可以直接应用将列表作为参数的全局约束。例如,要限制点 [X,Y]
不在对角线上,您可以写
alldifferent([X,Y])
或使用 table-constraint 将其约束到给定的一组坐标:
table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])
在其他情况下,最好使用 structures 和描述性仿函数,例如 point(X,Y)
或 rect(X1,Y1,X2,Y2)
,然后编写相应的约束包装器,例如作为
points_differ(point(X,Y), point(V,W)) :-
X#\=V or Y#\=W.
或
rect_contains_point(rect(I,J,K,L), point(PI,PJ)) :-
I #=< PI, PI #=< K,
J #=< PJ, PJ #=< L.
特别是与您示例中的几何任务相关的问题,至少有以下完全不同的概念方法:
geost/N
:这些约束提供了一个专用的 mini-language 用于推理 multi-dimensional 对象。这是一种非常强大和灵活的方法,可用于 SICStus Prolog 以及其他一些约束系统。- 具体化约束。例如,您可以声明
X #= 2 #==> Y #\= 4
来表示如果X
等于 2,Y
一定不能 为 4。因此,(X,Y)
自动不同于(2,4)
. - extensional constraints(在许多 Prolog 系统中可用作
table/2
、fd_relation/2
等)让您 明确地 枚举可接受的元组集或其补充。 - 重塑你的任务是通过布尔指标在允许的位置之间进行选择。有关此方法的示例,请参阅 Packing Squares。
这些方法会带来不同的后果 trade-offs。以上顺序大致反映了我个人的喜好和建议。但是,根据手头的情况,一种方法可能比其他方法有显着优势。
CSP 中的建模部分有时被称为一门艺术而不是一门科学,这也是因为有太多不同的可能性可供选择,并且先验地不清楚哪种模型最好也因为有太多许多 trade-offs——例如便利性、便携性、可扩展性、速度、内存等——都涉及。