let teach_until_grades predicate ?(max=0) teacher =
   let rec loop n student examiners grades =
      let (res,grades) = teacher student examiners grades in
      if (predicate grades) || (max != 0 && n>max) then
         (res,grades)
      else
         loop (n+1) res examiners grades
   in
   loop 0