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