let rec cposition = function
  | CTrue pos -> 
      pos

  | CDump pos -> 
      pos

  | CLet ([], c) -> 
      cposition c

  | (CConjunction [] | CDisjunction []) -> 
      undefined_position

  | (CConjunction l | CDisjunction l) -> 
      join (cposition (List.hd l)) (cposition (last l))

  | CLet (l, _) ->
      join (sposition (List.hd l)) (sposition (last l))

  | CEquation (p, _, _) -> 
      p

  | CInstance (p, _, _) -> 
      p

and sposition = function 
  | Scheme (p, _, _, _, _) -> 
      p