-let disambiguate_term status term =
- let (aliases, metasenv, cic, _) =
- match
- MatitaDisambiguator.disambiguate_term ~dbd:(MatitaDb.instance ())
- ~aliases:(status.aliases) ~context:(MatitaMisc.get_proof_context status)
- ~metasenv:(MatitaMisc.get_proof_metasenv status) term
- with
- | [x] -> x
- | _ -> assert false
- in
- let proof_status =
- match status.proof_status with
- | No_proof -> Intermediate metasenv
- | Incomplete_proof ((uri, _, proof, ty), goal) ->
- Incomplete_proof ((uri, metasenv, proof, ty), goal)
- | Intermediate _ -> Intermediate metasenv
- | Proof _ -> assert false
- in
- let status =
- { status with
- aliases = aliases;
- proof_status = proof_status }
- in
- status, cic
-
-let disambiguate_terms status terms =
- let term = CicAst.pack terms in
- let status, term = disambiguate_term status term in
- status, CicUtil.unpack term
-
-let disambiguate_tactic status = function
- | TacticAst.Transitivity (loc, term) ->
- let status, cic = disambiguate_term status term in
- status, TacticAst.Transitivity (loc, cic)
- | TacticAst.Apply (loc, term) ->
- let status, cic = disambiguate_term status term in
- status, TacticAst.Apply (loc, cic)
- | TacticAst.Absurd (loc, term) ->
- let status, cic = disambiguate_term status term in
- status, TacticAst.Absurd (loc, cic)
- | TacticAst.Exact (loc, term) ->
- let status, cic = disambiguate_term status term in
- status, TacticAst.Exact (loc, cic)
- | TacticAst.Cut (loc, term) ->
- let status, cic = disambiguate_term status term in
- status, TacticAst.Cut (loc, cic)
- | TacticAst.Elim (loc, term, Some term') ->
- let status, cic1 = disambiguate_term status term in
- let status, cic2 = disambiguate_term status term' in
- status, TacticAst.Elim (loc, cic1, Some cic2)
- | TacticAst.Elim (loc, term, None) ->
- let status, cic = disambiguate_term status term in
- status, TacticAst.Elim (loc, cic, None)
- | TacticAst.ElimType (loc, term) ->
- let status, cic = disambiguate_term status term in
- status, TacticAst.ElimType (loc, cic)
- | TacticAst.Replace (loc, what, with_what) ->
- let status, cic1 = disambiguate_term status what in
- let status, cic2 = disambiguate_term status with_what in
- status, TacticAst.Replace (loc, cic1, cic2)
- | TacticAst.Change (loc, what, with_what, ident) ->
- let status, cic1 = disambiguate_term status what in
- let status, cic2 = disambiguate_term status with_what in
- status, TacticAst.Change (loc, cic1, cic2, ident)
-(*
- (* TODO Zack a lot more of tactics to be implemented here ... *)
- | TacticAst.Change_pattern of 'term pattern * 'term * 'ident option
- | TacticAst.Change of 'term * 'term * 'ident option
- | TacticAst.Decompose of 'ident * 'ident list
- | TacticAst.Discriminate of 'ident
- | TacticAst.Fold of reduction_kind * 'term
- | TacticAst.Injection of 'ident
- | TacticAst.LetIn of 'term * 'ident
- | TacticAst.Replace_pattern of 'term pattern * 'term
-*)
- | TacticAst.Reduce (loc, reduction_kind, opts) ->
- let status, opts =
- match opts with
- | None -> status, None
- | Some (l,pat) ->
- let status, l =
- List.fold_right (fun t (status,acc) ->
- let status',t' = disambiguate_term status t in
- status', t'::acc)
- l (status,[])
- in
- status, Some (l, pat)
- in
- status, TacticAst.Reduce (loc, reduction_kind, opts)
- | TacticAst.Rewrite (loc,dir,t,ident) ->
- let status, term = disambiguate_term status t in
- status, TacticAst.Rewrite (loc,dir,term,ident)
- | TacticAst.Intros (loc, num, names) ->
- status, TacticAst.Intros (loc, num, names)
- | TacticAst.Auto (loc,num) -> status, TacticAst.Auto (loc,num)
- | TacticAst.Reflexivity loc -> status, TacticAst.Reflexivity loc
- | TacticAst.Assumption loc -> status, TacticAst.Assumption loc
- | TacticAst.Contradiction loc -> status, TacticAst.Contradiction loc
- | TacticAst.Exists loc -> status, TacticAst.Exists loc
- | TacticAst.Fourier loc -> status, TacticAst.Fourier loc
- | TacticAst.Left loc -> status, TacticAst.Left loc
- | TacticAst.Right loc -> status, TacticAst.Right loc
- | TacticAst.Ring loc -> status, TacticAst.Ring loc
- | TacticAst.Split loc -> status, TacticAst.Split loc
- | TacticAst.Symmetry loc -> status, TacticAst.Symmetry loc
- | TacticAst.Goal (loc, g) -> status, TacticAst.Goal (loc, g)
- | x ->
- print_endline ("Not yet implemented:" ^ TacticAstPp.pp_tactic x);
- assert false
-
-let rec disambiguate_tactical status = function
- | TacticAst.Tactic (loc, tactic) ->
- let status, tac = disambiguate_tactic status tactic in
- status, TacticAst.Tactic (loc, tac)
- | TacticAst.Do (loc, num, tactical) ->
- let status, tac = disambiguate_tactical status tactical in
- status, TacticAst.Do (loc, num, tac)
- | TacticAst.Repeat (loc, tactical) ->
- let status, tac = disambiguate_tactical status tactical in
- status, TacticAst.Repeat (loc, tac)
- | TacticAst.Seq (loc, tacticals) -> (* tac1; tac2; ... *)
- let status, tacticals = disambiguate_tacticals status tacticals in
- let tacticals = List.rev tacticals in
- status, TacticAst.Seq (loc, tacticals)
- | TacticAst.Then (loc, tactical, tacticals) -> (* tac; [ tac1 | ... ] *)
- let status, tactical = disambiguate_tactical status tactical in
- let status, tacticals = disambiguate_tacticals status tacticals in
- status, TacticAst.Then (loc, tactical, tacticals)
- | TacticAst.Tries (loc, tacticals) ->
- let status, tacticals = disambiguate_tacticals status tacticals in
- status, TacticAst.Tries (loc, tacticals)
- | TacticAst.Try (loc, tactical) ->
- let status, tactical = disambiguate_tactical status tactical in
- status, TacticAst.Try (loc, tactical)
- | (TacticAst.IdTac _ | TacticAst.Fail _) as tac ->
- status, tac
-
-and disambiguate_tacticals status tacticals =
- let status, tacticals =
- List.fold_left
- (fun (status, tacticals) tactical ->
- let status, tac = disambiguate_tactical status tactical in
- status, tac :: tacticals)
- (status, [])
- tacticals
- in
- let tacticals = List.rev tacticals in
- status, tacticals
-
-let disambiguate_inddef status params indTypes =
- let add_pi binders t =
- List.fold_right
- (fun (name, ast) acc ->
- CicAst.Binder (`Forall, (Cic.Name name, Some ast), acc))
- binders t
- in
- let ind_binders =
- List.map (fun (name, _, typ, _) -> (name, add_pi params typ)) indTypes
- in
- let binders = ind_binders @ params in
- let asts = ref [] in
- let add_ast ast = asts := ast :: !asts in
- let paramsno = List.length params in
- let indbindersno = List.length ind_binders in
- List.iter
- (fun (name, _, typ, constructors) ->
- add_ast (add_pi params typ);
- List.iter (fun (_, ast) -> add_ast (add_pi binders ast)) constructors)
- indTypes;
- let status, terms = disambiguate_terms status !asts in
- let terms = ref (List.rev terms) in
- let get_term () =
- match !terms with [] -> assert false | hd :: tl -> terms := tl; hd
- in
- let uri =
- match indTypes with
- | (name, _, _, _) :: _ -> MatitaMisc.qualify status name ^ ".ind"
- | _ -> assert false