anchor.diff:      Debug.WriteLine("It reached the terminator.")
       Failure
   
  +  let testLeftEqualities (lowTypeMatcher: ILowTypeMatcher) (leftEqualities: seq<_>) right ctx =
  +    let mutable continue' = true
  +    let mutable state = ctx
  +    let e = leftEqualities.GetEnumerator()
  +    while continue' && e.MoveNext() do
  +      let (_, x) = e.Current
  +      let result = lowTypeMatcher.Test right x state
  +      match result with
  +      | Matched ctx -> state <- ctx
  +      | _ -> continue' <- false
  +    if continue' then
  +      Matched state
  +    else
  +      Failure
  +
     let testVariableEquality (lowTypeMatcher: ILowTypeMatcher) left right (ctx: Context) =
       let left, right = Equations.sortTerm left right
       Debug.WriteLine(sprintf "Test equaliity of \"%s\" and \"%s\"." (LowType.debug left) (LowType.debug right))
  
positive.code:       Debug.WriteLine("The numbers of the parameters are different.")
        Failure
      else
        Seq.zip leftTypes rightTypes
        |> Seq.fold (fun result (left, right) ->
          Debug.WriteLine(sprintf "Test %s and %s." (LowType.debug left) (LowType.debug right))
          Debug.Indent()
          let result = MatchingResult.bindMatched (lowTypeMatcher.Test left right) result
          Debug.Unindent()
          result
        ) (Matched ctx)
  
    let choiceRule (lowTypeMatcher: ILowTypeMatcher) left right ctx =
      match left, right with
  
negative.code:                 (LowType.debug right)
                  (List.map Equations.debugEquality leftEqualities))
        let result =
          testLeftEqualities lowTypeMatcher leftEqualities right ctx
          |> MatchingResult.bindMatched (Equations.tryAddEquality left right)
        Debug.WriteLine(
          match result with
  