### Question:
RemiUtils { public static IVecInt backbone(ISolver s) throws TimeoutException { IVecInt backbone = new VecInt(); int nvars = s.nVars(); for (int i = 1; i <= nvars; i++) { backbone.push(i); if (s.isSatisfiable(backbone)) { backbone.pop().push(-i); if (s.isSatisfiable(backbone)) { backbone.pop(); } else { backbone.pop().push(i); } } else { backbone.pop().push(-i); } } return backbone; } private  RemiUtils(); static IVecInt backbone(ISolver s);  }### Answer:
@Test public void testBugUnitClauses() throws ContradictionException, TimeoutException { ISolver solver1 = SolverFactory.newDefault(); ISolver solver2 = SolverFactory.newDefault(); ISolver solver3 = SolverFactory.newDefault(); int[][] cnf1 = new int[][] { new int[] { 1 }, new int[] { 1, -2 }, new int[] { 1, -3 }, new int[] { -1, 2 } }; int[][] cnf2 = new int[][] { new int[] { -1, 2 }, new int[] { 1, -2 }, new int[] { 1, -3 }, new int[] { 1 } }; int[][] cnf3 = new int[][] { new int[] { 1, -2 }, new int[] { -1, 3 }, new int[] { 1, -3 }, new int[] { 1 } }; for (int[] is : cnf1) { solver1.addClause(new VecInt(is)); } for (int[] is : cnf2) { solver2.addClause(new VecInt(is)); } for (int[] is : cnf3) { solver3.addClause(new VecInt(is)); } IVecInt vecInt1 = RemiUtils.backbone(solver1); assertEquals(vecInt1.size(), 2); assertTrue(vecInt1.contains(1)); assertTrue(vecInt1.contains(2)); IVecInt vecInt2 = RemiUtils.backbone(solver2); assertEquals(vecInt2.size(), 2); assertTrue(vecInt2.contains(1)); assertTrue(vecInt2.contains(2)); IVecInt vecInt3 = RemiUtils.backbone(solver3); assertEquals(vecInt3.size(), 2); assertTrue(vecInt3.contains(1)); assertTrue(vecInt3.contains(3)); }