@Test
public void testRuleExplanation()
{
final KnowledgeBaseImpl kb = new KnowledgeBaseImpl();
final ATermAppl C = ATermUtils.makeTermAppl("C");
final ATermAppl D = ATermUtils.makeTermAppl("D");
final ATermAppl i = ATermUtils.makeTermAppl("i");
final List<RuleAtom> body = new ArrayList<>();
final List<RuleAtom> head = new ArrayList<>();
body.add(new ClassAtom(C, new AtomIVariable("x")));
head.add(new ClassAtom(D, new AtomIVariable("x")));
final Rule rule = new Rule(head, body);
kb.addClass(C);
kb.addClass(D);
kb.addIndividual(i);
kb.addType(i, C);
kb.addRule(rule);
kb.setDoExplanation(true);
assertTrue(kb.isConsistent());
assertTrue(kb.isType(i, D));
final Set<ATermAppl> actual = kb.getExplanationSet();
kb.setDoExplanation(false);
final Set<ATermAppl> expected = new HashSet<>();
final ATermAppl x = ATermUtils.makeVar("x");
final ATermAppl[] b = new ATermAppl[] { ATermUtils.makeTypeAtom(x, C) };
final ATermAppl[] h = new ATermAppl[] { ATermUtils.makeTypeAtom(x, D) };
expected.add(ATermUtils.makeTypeAtom(i, C));
expected.add(ATermUtils.makeRule(h, b));
assertEquals(expected, actual);
}