private void removeSuperiorityImpl() throws TheoryNormalizerException {
		List<Superiority> superiority = theory.getAllSuperiority();

		List<Rule> rulesToAdd = new ArrayList<Rule>();
		Set<String> rulesToDelete = new TreeSet<String>();

		removeSuperiority_ruleModification(rulesToAdd, rulesToDelete);

		// superiority transform
		Rule newRule1 = null;
		Rule newRule2 = null;
		try {
			for (Superiority s : superiority) {
				newRule1 = null;
				newRule2 = null;

				String superiorRuleId = s.getSuperior();
				String inferiorRuleId = s.getInferior();

				Rule superiorRule = factsAndRules.get(superiorRuleId);
				Rule inferiorRule = factsAndRules.get(inferiorRuleId);

				if (null == superiorRule) throw new TheoryNormalizerException(getClass(),
						ErrorMessage.THEORY_SUPERIOR_RULE_NOT_FOUND_IN_THEORY, new Object[] { superiorRuleId });
				if (null == inferiorRule) throw new TheoryNormalizerException(getClass(),
						ErrorMessage.THEORY_INFERIOR_RULE_NOT_FOUND_IN_THEORY, new Object[] { inferiorRuleId });

				Mode superiorRuleMode = superiorRule.getMode();
				Mode inferiorRuleMode = inferiorRule.getMode();

				Literal supRuleHead = superiorRule.getHeadLiterals().get(0);
				Literal infRuleHead = inferiorRule.getHeadLiterals().get(0);

				if (supRuleHead.isComplementTo(infRuleHead)) {
					String newSupRuleLabel = theory.getUniqueRuleLabel(SUPERIORITY_RULE_PREFIX);

					Literal bodyLiteral = DomUtilities.getLiteral(SYMBOL_INF + "(" + superiorRuleId + ")+", true, //
							superiorRuleMode,null, null, true);
					Literal headLiteralPlus = DomUtilities.getLiteral(SYMBOL_INF + "(" + inferiorRuleId + ")+", false,//
							inferiorRuleMode,null, null, true);
					Literal headLiteralMinus = DomUtilities.getLiteral(SYMBOL_INF + "(" + inferiorRuleId + ")-", false, //
							inferiorRuleMode,null, null, true);

					newRule1 = DomUtilities.getRule(newSupRuleLabel + SUPERIORITY_RULE_POSTFIX_PLUS,
							RuleType.DEFEASIBLE);
newRule1.setOriginalLabel(superiorRuleId);				
					newRule1.setMode(superiorRuleMode);

					newRule1.addBodyLiteral(bodyLiteral);
					newRule1.addHeadLiteral(headLiteralPlus);

					newRule2 = DomUtilities.getRule(newSupRuleLabel + SUPERIORITY_RULE_POSTFIX_MINUS,
							RuleType.DEFEASIBLE);
newRule2.setOriginalLabel(inferiorRuleId);					
					newRule2.setMode(superiorRuleMode);

					newRule2.addBodyLiteral(bodyLiteral);
					newRule2.addHeadLiteral(headLiteralMinus);

					rulesToAdd.add(newRule1);
					rulesToAdd.add(newRule2);
				} else {
					fireTheoryNormalizerMessage(MessageType.WARNING, "The heads of [" + superiorRuleId + "] and ["
							+ inferiorRuleId + "] are not complement to each other!  Superiority relation ignored!");
				}
			}

			theory.updateTheory(rulesToAdd, rulesToDelete, null);
			theory.clearSuperiority();
		} catch (TheoryException e) {
			throw new TheoryNormalizerException(getClass(), ErrorMessage.TRANSFORMATION_SUPERIORITY_REMOVAL_ERROR,
					"Exception throw while updating theory", e);
		} catch (Exception e) {
			throw new TheoryNormalizerException(getClass(), ErrorMessage.TRANSFORMATION_SUPERIORITY_REMOVAL_ERROR,
					"Exception throw whlie removing superiority", e);
		}
	}