code: private Environment checkLogicalNegation(Expr.LogicalNot expr, boolean sign, Environment environment) {
  		return checkCondition(expr.getOperand(), !sign, environment);
  	}
docs: Type check a logical negation. This is relatively straightforward as we just
  flip the sign. Thus, if something is assumed to hold, then it is now assumed
  not to hold, etc. The following illustrates:
  
  <pre>
  function f(int|null x) -> (bool r):
  return !(x is null) && x >= 0
  </pre>
  
  The effect of the negation <code>!(x is null)</code> is that the type test is
  now evaluated assuming it fails. Thus, it effects the environment by
  asserting <code>x</code> has type <code>(int|null)&!null</code> which is
  equivalent to <code>int</code>.
  
  @param expr
  @param sign
  @param environment
  @return