我无法理解eclipse约束编程框架中search / 6函数的this文档。
我知道选择参数基本上会影响值排序。
选择方法似乎也选择了变量排序,但我并不完全理解它的所有选项。
我真的不了解其他参数,所以我想知道是否有人可以用文字解释它们。我对约束逻辑编程理论有很好的理解,所以请随意参考这些概念。我只是不了解该文档中的很多CS术语(arity等)
谢谢
答案 0 :(得分:4)
我会尝试尽可能简短地回答它,因为search/6
是您在ECLiPSe系统中可以找到的最复杂的谓词之一。
尽管如此,可能最好在ECLiPSe用户邮件列表中询问更详细的后续问题。
search/6
谓词是用于控制搜索CLP问题解决方案的通用谓词。它允许用户控制搜索树的形状(沿分支的变量顺序,分支的顺序以及访问的搜索树的部分)。谓词有6个参数:search(+L, ++Arg, ++Select, +Choice, ++Method, +Option)
。 (+
和++
表示参数的模式)
前两个参数组合在一起。 L
是变量列表或术语列表。如果它是前者,则Arg
必须为0,如果是后者,则Arg
表示应在搜索期间实例化的变量的位置,例如:
search([A,B],0,input_order,indomain,complete,[]).
或
search([p(1,A),p(2,B)],2,input_order,indomain,complete,[]).
在这两种情况下,变量A
和B
都会在搜索过程中实例化。
第三个参数是选择方法。 search/6
使用此方法从列表L
中选择要实例化的下一个变量。
最简单的选项是input_order
:搜索只是迭代列表中的变量。在上面的示例中,它将首先实例化A
,然后B
。其他选项考虑域大小和/或附加到变量的约束数,并相应地进行选择。例如,first_fail
选择具有最小域的变量。如果A
的当前域名为[1,2,3]
且B
域名为[1,3]
,则会先选择B
并进行实例化。如果多个变量具有相同的最小域大小,则将选择按输入顺序排列的第一个变量。考虑域大小的选择方法实现了动态变量排序,因为域大小将在搜索期间发生变化(缩小),具体取决于约束所实现的传播量。
其他选择方法现在应该是不言自明的。
也可以定义自己的选择方法,前提是实现它的谓词具有arity 2,即有两个参数。谓词必须将变量作为输入并计算一些标准值。将选择具有最小标准值的变量。
第四个参数是选择方法。选择变量后,选择方法将控制在搜索期间尝试其域中的值的顺序。
最简单的选项是indomain
,它以升序选择变量当前域中的值。即,如果变量A
具有域[1,3,5]
,则搜索最初将A
绑定为1,在回溯时将其绑定到3,最后绑定到5. indomain_middle
将从3开始,然后是1,然后是5。
更复杂的选择方法(即indomain
除外)将删除回溯的尝试值,即基本上添加其他约束,如A#\=1
。这将导致额外的传播,这反过来允许更早地检测不可行性。从您在问题中链接到的search/6
文档中运行n-queens示例时,您可以看到效果。
同样,也可以定义自己的选择方法。谓词必须是arity 1或3.如果arity为1,则谓词将一个变量作为输入并将其绑定到一个值(或做出一些其他选择来改变变量的域)。如果arity为3,那么您可以使用这两个附加参数传递一些可用于选择的状态信息。
第五个参数是搜索方法。这将控制搜索应探索的搜索树部分的大小(而选择方法控制沿树分支的变量顺序,而选择方法控制搜索树中分支的顺序)。
最简单的选项是complete
,它从左到右搜索树,直到树用完为止。所有其他选项(除了对称性破坏)都是不完整的搜索方法,即搜索树中将有未分析的分支。如果解决方案在这样一个未探索的分支的叶子上,那么它将不会被发现。您必须确保选择和选择方法以不完整搜索方法能够找到解决方案的方式对搜索树进行整形。例如,选项bbs
限制了搜索期间可以进行的回溯数量。如果该号码用尽,则搜索将停止。
对称性破坏只会以某种方式排除与其他分支等效(对称)的分支。
第六个参数是search/6
文档中描述的可能的附加选项列表。通常情况下,你不需要它们。