(************************************************************************) (* v * The Coq Proof Assistant / The Coq Development Team *) (* Errors.anomaly (Pp.str "Already an indirect opaque") | Direct (d,cu) -> let cu = Future.chain ~pure:true cu (fun (c, u) -> hcons_constr c, u) in match !mk_indirect (d,cu) with | None -> Future.sink cu; NoIndirect([],cu) | Some (dp,i) -> Indirect ([],dp,i) let subst_opaque sub = function | Indirect (s,dp,i) -> Indirect (sub::s,dp,i) | NoIndirect (s,uc) -> NoIndirect (sub::s,uc) | Direct _ -> Errors.anomaly (Pp.str "Substituting a Direct opaque") let iter_direct_opaque f = function | Indirect _ | NoIndirect _ -> Errors.anomaly (Pp.str "Not a direct opaque") | Direct (d,cu) -> Direct (d,Future.chain ~pure:true cu (fun (c, u) -> f c; c, u)) let discharge_direct_opaque ~cook_constr ci = function | Indirect _ | NoIndirect _ -> Errors.anomaly (Pp.str "Not a direct opaque") | Direct (d,cu) -> Direct (ci::d,Future.chain ~pure:true cu (fun (c, u) -> cook_constr c, u)) let join_opaque = function | Direct (_,cu) -> ignore(Future.join cu) | NoIndirect (_,cu) -> ignore(Future.join cu) | Indirect (_,dp,i) -> !join_indirect_local_opaque dp i; !join_indirect_local_univ dp i let force_proof = function | Direct (_,cu) -> fst(Future.force cu) | NoIndirect (l,cu) -> let c, _ = Future.force cu in force_constr (List.fold_right subst_substituted l (from_val c)) | Indirect (l,dp,i) -> let c = Future.force (!get_opaque dp i) in force_constr (List.fold_right subst_substituted l (from_val c)) let force_constraints = function | Direct (_,cu) | NoIndirect(_,cu) -> snd(Future.force cu) | Indirect (_,dp,i) -> match !get_univ dp i with | None -> Univ.ContextSet.empty | Some u -> Future.force u let get_constraints = function | Direct (_,cu) | NoIndirect(_,cu) -> Some(Future.chain ~pure:true cu snd) | Indirect (_,dp,i) -> !get_univ dp i let get_proof = function | Direct (_,cu) -> Future.chain ~pure:true cu fst | NoIndirect(l,cu) -> Future.chain ~pure:true cu (fun (c,_) -> force_constr (List.fold_right subst_substituted l (from_val c))) | Indirect (l,dp,i) -> Future.chain ~pure:true (!get_opaque dp i) (fun c -> force_constr (List.fold_right subst_substituted l (from_val c)))