Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog CLP:结构化变量的约束?_Prolog_Structure_Clp - Fatal编程技术网

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

Prolog CLP:结构化变量的约束?,prolog,structure,clp,Prolog,Structure,Clp,让我们假设以下场景。。。一个5x5的网格,比如说3位数。 我们想在位置上定义约束。在CLP中,我们通常使用整数定义约束,因此这是一种方法: ... Fig1X #\= 2, Fig1Y #\= 3, .... i、 e.每个X和Y位置都有单独的变量。有没有一种方法可以定义对构建在整数之上的结构化变量的约束。举例来说: .... Fig1 #\= (2,4) ... 这个场景只是为了举例说明 我主要感兴趣的是如何处理结构化变量,是否有标准实践。在像您这样的情况下,“结构化变量”有一个只包

让我们假设以下场景。。。一个5x5的网格,比如说3位数。 我们想在位置上定义约束。在CLP中,我们通常使用整数定义约束,因此这是一种方法:

  ... 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#=

(后一个示例取自)

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

  • :这些约束为多维对象的推理提供了专用的迷你语言。这是一种非常强大和灵活的方法,在SICStusProlog和其他一些约束系统中都可以使用
  • 强化约束。例如,如果
    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.