资源

字母块问题(oclpe02)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:clp2*//*标题:字母块问题(oclpe02)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:CLP*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:CLP求解器章节中的示例2*//*《数学编程》一书*//*                                                             *//***************************************************************/过程操作模型;/*除Q和Z之外的每个字母都用一个变量表示*//*每个变量的域是4个块的集合*//*或简称{1,2,3,4}*/设置字母=A B C D E F G H I J K L M N O P R S T U V W X Y/;var块{LETTERS}整数>=1<=4;设置BLOCKS=1..4;/*每个字母块上正好有6个字母*/con每个块六个字母:gcc(块,块中{b的集合}<b,6,6>);/*每个单词中的字母必须位于不同的块上*/set WORDS=/BAKE ONYX ECHO OVAL GIRD SMUG JUMP TORN LUCK VINY LUSH WRAP/;con CanSpell{单词中的w}:gcc({k in 1..length(w)}块[char(w,k)],块中{b的集合}<b,0,1>);/*注2:这些限制也可以通过ALLDIFF约束来实施:con CanSpellv2{w in WORDS}:alldiff({k in 1.length(w)}块[char(w,k)]);*//*通过设置打破块可以互换的对称性包含字母B作为块1的块包含字母A作为block2等*/对于{k in 1..length('BAKE')}修复块[char('BAKE',k)]=k;解决;打印块;退出;