Maple_CM

1. 子句化简

  1. 一开始上来先用vsids策略,直到冲突次数达到设置的init,之后再使用2500s的LRB策略,2500s后再次产生冲突分支策略将改为VSIDS策略。
  2. 其存放学习子句有三个集合,学习子句的质量从高到低分别是learnts_core、learnts_tier2、learnts_local
  3. 子句化简只有在重启之后且满足一个与之前化简次数有关的多项式条件的情况下才会被执行,子句化简包括学习子句以及原始子句
  4. 子句化简还会对算例中已经满足的子句和取值为假的文字进行删除
  5. 其中learnts_tier2中的学习子句经过化简之后如果lbd值<=core_lbd_cut则会被转化成core学习子句
  6. 但是子句化简不会对learnts_local中的学习子句进行化简,因为该集合中的学习子句质量较差
  7. 子句化简的思路与glucose_lcm基本一致,是采用对子句中的文字取反后进行单子句传播,导出冲突的办法确定那些是需要保留的文字,其余文字则是冗余文字

2. 子句化简的标准

对子句进行多次vivification化简跟Clause类中内嵌结构体header中字段simplified的数值有关,其默认值为0。对一个子句进行vivification化简,该子句需要满足的标准如下

  1. 该子句未被移除,即header结构体中的字段mark不等于1
  2. header.simplified的值为0
  3. 子句中不包含值为值为1的文字,即子句还未满足

子句化简之后的simplified值:

  • learnts_core、learnts_tier2中进行vivification化简的子句的simplified值会被设置成2
  • usedClauses中进行vivification化简的子句的simplified的值会被设置成3

冲突分析会对跟冲突有关子句的simplified值进行更新,其更新操作如下: ^ca2960

  1. 重新计算子句的LBD值,并且重新计算的LBD值小于之前的LBD值就继续执行下面的操作
  2. 如果LBD值为1,则将该子句的simplified值设置为0
  3. 如果该子句的simplified值大于0,则将simplified值减一
  4. 如果该子句是一个学习子句,检查该子句是否可以标记为更重要的学习子句(标记为不可删除、LOCAL->TIER2、TIER2->CORE)

原始子句额外的化简标准:

  • 原始子句的header.used默认值为0,header.used值为1表示为该原始子句在usedClauses
  1. 只会对usedClauses中的原始子句进行化简
  2. 被化简检查过原始子句的header.used的值会被设置为0,一次对原始子句的化简操作完成之后会将usedClauses清空
  3. 跟冲突有关的原始子句进行完[[Maple_CM#^ca2960|simplified值的更新操作后,]]其header.usedheader.simplified值都为0时才会将该子句放入usedClauses中,并将header.used的值设置为1。但是如果此次冲突分析学习的学习子句的LBD值大于了规定的lbdLimitForOriCls值,会将此次冲突分析添加到usedClauses中的原始子句又全部移除,并将其header.used的值重新设置成为0。
posted @ 2025-03-12 12:17  seonwee  阅读(28)  评论(0)    收藏  举报