/**
  * Updates the <code>node</code> to which <b>(OBJECT)</b> was applied previously.
  *
  * @param context the minimal typing proof context.
  * @param pNode the node to update according to <b>(OBJECT)</b>.
  */
 public void updateObject(MinimalTypingProofContext context, MinimalTypingProofNode pNode) {
   MinimalTypingExpressionProofNode node = (MinimalTypingExpressionProofNode) pNode;
   if (node.getFirstChild().isFinished()) {
     MinimalTypingExpressionProofNode child =
         (MinimalTypingExpressionProofNode) node.getFirstChild();
     TypeEnvironment environment = child.getEnvironment();
     Identifier self = new Identifier("self", Identifier.Set.SELF); // $NON-NLS-1$
     ObjectType objectType = (ObjectType) environment.get(self);
     RowType type = (RowType) objectType.getPhi();
     RowType type2 = (RowType) child.getType();
     try {
       // check type <: type2 and type2 <: type
       // if both true type = type2
       subtypeInternal(type, type2);
       subtypeInternal(type2, type);
     } catch (Exception e) {
       throw new RuntimeException(
           MessageFormat.format(
               Messages.getString("MinimalTypingException.7"),
               node.getExpression().toString())); // $NON-NLS-1$
     }
     ObjectType object = new ObjectType(type);
     // set the type of this node
     context.setNodeType(node, object);
   }
 }
 /**
  * Updates the <code>node</code> to which <b>(DUPL-SUBSUME)</b> was applied previously.
  *
  * @param context the minimal typing proof context.
  * @param pNode the node to update according to <b>(DUPL-SUBSUME)</b>.
  */
 public void updateDuplSubsume(MinimalTypingProofContext context, MinimalTypingProofNode pNode) {
   MinimalTypingExpressionProofNode node = (MinimalTypingExpressionProofNode) pNode;
   Duplication duplication = (Duplication) node.getExpression();
   if (node.getChildCount() == 1 && node.getLastChild().isFinished()) {
     // generate new child node
     context.addProofNode(node, node.getEnvironment(), duplication.getExpressions()[0]);
   } else if (node.getChildCount() > 1 && node.getLastChild().isFinished()) {
     // check if a:tau und e:tau' tau'<: tau
     TypeEnvironment environment = node.getEnvironment();
     Identifier id = duplication.getIdentifiers()[node.getChildCount() - 2];
     MonoType tau = null;
     try {
       tau = (MonoType) environment.get(id);
     } catch (Exception e) {
       throw new RuntimeException(
           MessageFormat.format(
               Messages.getString("MinimalTypingException.9"), id.toString())); // $NON-NLS-1$
     }
     MonoType tau2 = node.getLastChild().getType();
     if (tau == null || tau2 == null)
       throw new RuntimeException(
           MessageFormat.format(
               Messages.getString("MinimalTypingException.2"),
               "self")); //$NON-NLS-1$ //$NON-NLS-2$
     try {
       subtypeInternal(tau, tau2);
       subtypeInternal(tau2, tau);
     } catch (Exception e) {
       throw new RuntimeException(
           MessageFormat.format(
               Messages.getString("MinimalTypingException.2"),
               "self")); //$NON-NLS-1$ //$NON-NLS-2$
     }
   }
   if (node.getChildCount() == duplication.getIdentifiers().length + 1) {
     // set the type of this node
     context.setNodeType(node, node.getFirstChild().getType());
     // all childs added, so nothing more to do
     return;
   }
   // generate new child node
   context.addProofNode(
       node, node.getEnvironment(), duplication.getExpressions()[node.getChildCount() - 1]);
 }