// Translate monotone MDDs to SAT // Together with AMO translation func convertMDD2Clauses(store mdd.IntervalMddStore, pb *Threshold) (clauses sat.ClauseSet) { pred := sat.Pred("mdd" + strconv.Itoa(pb.Id)) top_lit := sat.Literal{true, sat.NewAtomP1(pred, store.Top)} clauses.AddTaggedClause("Top", top_lit) for _, n := range store.Nodes { v_id, l, vds := store.ClauseIds(*n) if !n.IsZero() && !n.IsOne() { v_lit := sat.Literal{false, sat.NewAtomP1(pred, v_id)} last_id := -1 for i, vd_id := range vds { if last_id != vd_id { vd_lit := sat.Literal{true, sat.NewAtomP1(pred, vd_id)} if i > 0 { literal := pb.Entries[len(pb.Entries)-l+i-1].Literal clauses.AddTaggedClause("1B", v_lit, sat.Neg(literal), vd_lit) } else { clauses.AddTaggedClause("0B", v_lit, vd_lit) } } last_id = vd_id } } else if n.IsZero() { v_lit := sat.Literal{false, sat.NewAtomP1(pred, v_id)} clauses.AddTaggedClause("False", v_lit) } else if n.IsOne() { v_lit := sat.Literal{true, sat.NewAtomP1(pred, v_id)} clauses.AddTaggedClause("True", v_lit) } } return }