CLP:结构化变量的约束



让我们具有以下假设的情况...一个带有5x5的网格,假设3个数字。我们想定义位置的约束。在CLP中,我们通常通过整数定义约束,因此这是一种方法:

  ... Fig1X #= 2, Fig1Y #= 3, ....

即。我们每个X和Y位置都有单独的变量。是否有一种方法可以定义在整数顶部构建的结构化变量的约束。为了示例:

 .... Fig1 #= (2,4) ...

场景仅用于插图。

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

,尤其是与示例中的几何任务有关,至少有以下完全不同的概念方法:

  1. geost/N :这些约束提供了用于推理多维对象的专用迷你语言。这是一种非常有力和灵活的方法,在Sicstus  Prolog中以及其他一些约束中都可以使用。
  2. REFIFIED 约束。例如,您可以陈述X #= 2 #==> Y #= 4表示Y 必须  be 4,如果X等于2。因此,(X,Y)自动与(2,4)不同。
  3. 扩展约束(在许多prolog 系统中以table/2fd_relation/2等提供(让您明确
  4. 重建您的任务是通过布尔值  em>指示器在可允许的位置之间进行选择的。有关此方法的示例,请参见包装方形

这些方法带来了不同的后果和权衡。我个人的喜好和建议大致反映在上述订单中。但是,根据AT 手的情况,一种方法可能比其他方法具有显着优势。

CSP中的建模部分有时被称为艺术,而不是A  Science也是因为有很多不同的可能性可以从中选择&nbsp',而且尚不清楚哪种模型也是最好的,因为还有最好的nbsp;如此多的权衡,例如便利性,可移植性,可扩展性,速度,内存等等。

在像您这样的情况下,"结构化变量"具有仅包含数字字段的固定结构,您不需要"结构化变量"的概念。从概念上讲,您只是与数字(或数字变量(的元素一起工作。

有时这些元组最好用作 lists ,因为您可以直接应用将列表作为参数的全局约束。例如,为了限制一个 [X,Y]不要在对角线上,您可以写

alldifferent([X,Y])

或使用表限制将其限制为给定的坐标集:

table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])

在其他情况下,使用结构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.

(后一个示例来自http://eclipseclp.org/examples/shikaku.ecl.txt(

相关内容

  • 没有找到相关文章

最新更新