首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLP:结构化变量的约束?

CLP:结构化变量的约束?
EN

Stack Overflow用户
提问于 2018-02-22 21:20:18
回答 2查看 185关注 0票数 4

让我们有以下假设的场景..。一个有5x5的网格,比如说3位数。我们想要定义对这些位置的约束。在CLP中,我们通常用整数来定义约束,所以这是一种方法:

代码语言:javascript
复制
  ... Fig1X #\= 2, Fig1Y #\= 3, ....

也就是说,对于每一个X和Y位置,我们都有独立的变量。是否有一种方法来定义基于整数之上的结构化变量的约束。为了举例:

代码语言:javascript
复制
 .... Fig1 #\= (2,4) ...

这个场景只是为了说明。

我主要感兴趣的是如何处理结构化变量,是否有标准的实践。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-25 13:09:03

特别是在几何任务方面,例如在您的示例中,至少有以下非常不同的概念方法:

  1. geost/N:这些约束为多维对象的推理提供了一种专用的迷你语言。这是一种非常强大和灵活的方法,可以在SICStus、Prolog和其他一些约束系统中使用。
  2. 具体化了相似约束。例如,您可以声明X #= 2 #==> Y #\= 4来表示,如果Y等于2,则X不能是4。因此,(X,Y)(2,4)是自动不同的。
  3. extensional constraints (在许多Prolog系统中可用作table/2fd_relation/2等)允许显式枚举可接受的元组集或其补充。
  4. 重构您的任务为通过布尔指示符在允许的位置之间进行选择。有关此方法的示例,请参阅https://stackoverflow.com/a/30285334/1613573

这些方法带来了不同的后果和权衡。我的个人喜好和建议大致反映在上面的顺序中。然而,取决于目前的情况,一种办法可能比另一种办法有很大的好处。

CSPs中的建模部分有时更多地被称为一门艺术而不是一门科学,这也是因为有那么多不同的可能性可供选择,而且还不清楚哪种模型是最好的,还因为涉及到许多权衡--比如方便、可移植性、可伸缩性、速度、内存等等。

票数 4
EN

Stack Overflow用户

发布于 2018-02-23 13:52:02

在像您这样的情况下,“结构化变量”有一个固定的结构,只包含数字字段,您不需要“结构化变量”的概念。在概念上,您只处理数字元组(或数字变量)。

有时,这些元组最好表示为 lists ,因为这样您就可以直接应用以列表作为参数的全局约束。例如,要约束点[X,Y]不位于对角线上,可以编写

代码语言:javascript
复制
alldifferent([X,Y])

或者使用表约束将其约束到给定的一组坐标:

代码语言:javascript
复制
table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])

在其他情况下,最好将结构与描述性函子(如point(X,Y)rect(X1,Y1,X2,Y2) )一起使用,然后编写相应的约束包装器,如

代码语言:javascript
复制
points_differ(point(X,Y), point(V,W)) :-
    X#\=V or Y#\=W.

代码语言:javascript
复制
rect_contains_point(rect(I,J,K,L), point(PI,PJ)) :-
    I #=< PI, PI #=< K,
    J #=< PJ, PJ #=< L.

(后一个例子取自http://eclipseclp.org/examples/shikaku.ecl.txt)

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

https://stackoverflow.com/questions/48937374

复制
相关文章

相似问题

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