我尝试使用MiniZinc中的字符串连接运算符定义约束,求解变量a
和b
:
include "disjunctive.mzn";
var string:a;
var string:b;
constraint("var1/var2" = (a ++ "/" ++ b));
solve satisfy;
output ["\nx=", show(a)];
尽管如此,这似乎是语法错误:
MiniZinc: type error: type error in operator application for `++'. No matching operator found with left-hand side type `string' and right-hand side type `var string'
是否仍然可以使用字符串或数组作为变量解决MiniZinc中的约束?
答案 0 :(得分:4)
在Constraint Programming社区中,直接对字符串进行约束是非常罕见的。虽然我没有看到任何支持字符串变量的通用CP系统,但是有一些研究。 (有关非一般CP系统,请参见下文。)
在MiniZinc中,最好将字符串转换为整数(例如a = 1,b = 2等),然后将所有操作模拟为整数运算。
一个简单的例子是填字游戏生成器:http://hakank.org/minizinc/crossword3/crossword3.mzn,在http://hakank.org/minizinc/crossword3/中有描述。
一个重要的字符串操作是两个字符串的连接,但由于MiniZinc只支持静态(固定长度)数组,因此必须通过定义足够大的“目标数组”来处理。
关于Picat,cp / sat模块也不支持字符串,因此必须应用相同的整数转换。但由于Picat是一种逻辑编程语言(想想Prolog),人们可以使用传统的逻辑编程方法。
请注意,MiniZinc和Picat - 以及大多数其他CP系统 - 支持全局约束“常规”,它使用DFA(确定性有限自动机)来创建约束。例如,参见Nonogram解算器:http://hakank.org/minizinc/nonogram_create_automaton2.mzn以及全局邻接约束的分解:http://hakank.org/minizinc/contiguity_regular.mzn
MiniZinc还支持常规约束的NFA(非确定性)变体。
也就是说,有些系统使用一种支持字符串变量的约束求解方法,虽然AFAIK它们往往只支持字符串变量,而不支持整数,集合等的一般曲目。例如参见Hampi({{3 }})。注意:我查看这些专用系统已经很长时间了。