Prolog CLP:结构化变量的约束?
让我们假设以下场景。。。一个5x5的网格,比如说3位数。 我们想在位置上定义约束。在CLP中,我们通常使用整数定义约束,因此这是一种方法:Prolog CLP:结构化变量的约束?,prolog,structure,clp,Prolog,Structure,Clp,让我们假设以下场景。。。一个5x5的网格,比如说3位数。 我们想在位置上定义约束。在CLP中,我们通常使用整数定义约束,因此这是一种方法: ... Fig1X #\= 2, Fig1Y #\= 3, .... i、 e.每个X和Y位置都有单独的变量。有没有一种方法可以定义对构建在整数之上的结构化变量的约束。举例来说: .... Fig1 #\= (2,4) ... 这个场景只是为了举例说明 我主要感兴趣的是如何处理结构化变量,是否有标准实践。在像您这样的情况下,“结构化变量”有一个只包
... Fig1X #\= 2, Fig1Y #\= 3, ....
i、 e.每个X和Y位置都有单独的变量。有没有一种方法可以定义对构建在整数之上的结构化变量的约束。举例来说:
.... Fig1 #\= (2,4) ...
这个场景只是为了举例说明
我主要感兴趣的是如何处理结构化变量,是否有标准实践。在像您这样的情况下,“结构化变量”有一个只包含数字字段的固定结构,您不需要“结构化变量”的概念。从概念上讲,您只需要处理数字元组(或数字变量) 有时这些元组最好表示为列表,因为这样可以直接应用以列表为参数的全局约束。例如,要约束点
[X,Y]
不在对角线上,可以编写
alldifferent([X,Y])
或者使用表约束将其约束到给定的一组坐标:
table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])
在其他情况下,最好将结构与描述性函子一起使用,例如点(X,Y)
或rect(X1,Y1,X2,Y2)
,然后编写相应的约束包装器,例如
points_differ(point(X,Y), point(V,W)) :-
X#\=V or Y#\=W.
或
rect_包含_点(rect(I,J,K,L),点(PI,PJ)):-
I#=
(后一个示例取自)尤其是与您的示例中的几何任务相关,至少有以下完全不同的概念方法:
X
等于2,则可以声明X\=2\=>Y\=4
,以表示Y
不得为4。因此,(X,Y)
自动不同于(2,4)
table/2
,fd_relationship/2
等提供)用于显式枚举允许的元组集或其补码CSPs中的建模部分有时被称为是一门艺术,而不是一门艺术,这也是因为有太多不同的可能性可供选择,而且不清楚哪种模型是最好的,这也是因为有太多的权衡因素,例如方便性、可移植性、可扩展性、速度、内存等。
dif(图1,(2,4)).
但它在传播方面要弱得多。您是否知道swi prolog是否有类似于表的东西/2SWI的库(clpfd)在/2中有元组。\u。我有一个问题要问JSCHIPMF。在您的代码中,在rect\u size/2中有局部变量Height和Width,它们也受到约束。在SWI中,我使用带有约束的局部变量,不将它们返回给调用者,它们是gabagecollected,我无法得到答案。看起来您的代码是用ECLiPSe编写的。我很感兴趣的是,您不必关心本地clp变量是在ECLiPSe中收集的。@Taku:正确,ECLiPSe不会丢失任何未解决的约束,即使您无法访问其变量。可能发生的最糟糕情况是,顶级查询以未解决的约束终止(=在ECLiPSe术语中为延迟目标)。在本例中,这不会发生,因为标记矩形变量会通过传播导致这些辅助高度/宽度变量的实例化。如果不是这样的话,您就必须将这些变量传递给一个标记例程。我明白了。谢谢你的回答!
rect_contains_point(rect(I,J,K,L), point(PI,PJ)) :-
I #=< PI, PI #=< K,
J #=< PJ, PJ #=< L.