let prove 
    ?(callin=fun _ _ -> ()) 
    ?(callout=fun _ _ _ -> ()) 
    wpo ~interactive prover
    =
  Task.todo
    begin
      fun () ->
        callin wpo prover ; 
        let log = Log.create wpo in
        task_for interactive prover log wpo
          >>! fun s -> 
            let r = result s in
            Log.close log ;
            Wpo.set_result wpo prover r ;
            callout wpo prover r
    end