- 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
- in
- let mutinds =
- let counter = ref 0 in
- List.map
- (fun _ ->
- incr counter;
- CicUtil.term_of_uri (sprintf "%s#xpointer(1/%d)" uri !counter))
- indTypes
- in
- let subst_mutinds = List.fold_right CicSubstitution.subst mutinds in
- let cicIndTypes =
- List.fold_left
- (fun acc (name, inductive, typ, constructors) ->
- let cicTyp = get_term () in
- let cicConstructors =
- List.fold_left
- (fun acc (name, _) ->
- let typ =
- subst_mutinds (CicUtil.strip_prods indbindersno (get_term ()))
- in
- (name, typ) :: acc)
- [] constructors
- in
- (name, inductive, cicTyp, List.rev cicConstructors) :: acc)
- [] indTypes
- in
- let cicIndTypes = List.rev cicIndTypes in
- status, (UriManager.uri_of_string uri, (cicIndTypes, [], paramsno))
-
-let disambiguate_command status = function
- | TacticAst.Inductive (loc, params, types) ->
- let (status, (uri, (ind_types, vars, paramsno))) =
- disambiguate_inddef status params types
- in
- let rec mk_list = function
- | 0 -> []
- | n -> ("", Cic.Rel ~-117) :: mk_list (n-1)
- in
- (* once we've built the cic inductive types we no longer need terms
- corresponding to parameters, but we need the leftno, and we encode
- it as the length of dummy_params
- *)
- let dummy_params = mk_list paramsno in
- status, TacticAst.Inductive (loc, dummy_params, ind_types)
- | TacticAst.Theorem (loc, thm_flavour, name, ty, body) ->
- let status, ty = disambiguate_term status ty in
- let status, body =
- match body with
- | None -> status, None
- | Some body ->
- let status, body = disambiguate_term status body in
- status, Some body
- in
- status, TacticAst.Theorem (loc, thm_flavour, name, ty, body)
- | TacticAst.Coercion (loc, term) -> assert false (** TODO *)
- | (TacticAst.Set _ | TacticAst.Qed _) as cmd ->
- status, cmd
- | TacticAst.Alias _ as x -> status, x
-
-let disambiguate_executable status ex =
- match ex with
- | TacticAst.Tactical (loc, tac) ->
- let status, tac = disambiguate_tactical status tac in
- status, (TacticAst.Tactical (loc, tac))
- | TacticAst.Command (loc, cmd) ->
- let status, cmd = disambiguate_command status cmd in
- status, (TacticAst.Command (loc, cmd))
- | TacticAst.Macro (_, mac) ->
- command_error
- (sprintf ("The engine is not allowed to disambiguate any macro, "^^
- "in particular %s") (TacticAstPp.pp_macro_ast mac))
-
-let disambiguate_comment status c =
- match c with
- | TacticAst.Note (loc,n) -> status, TacticAst.Note (loc,n)
- | TacticAst.Code (loc,ex) ->
- let status, ex = disambiguate_executable status ex in
- status, TacticAst.Code (loc,ex)
-
-let disambiguate_statement status statement =
- match statement with
- | TacticAst.Comment (loc,c) ->
- let status, c = disambiguate_comment status c in
- status, TacticAst.Comment (loc,c)
- | TacticAst.Executable (loc,ex) ->
- let status, ex = disambiguate_executable status ex in
- status, TacticAst.Executable (loc,ex)
-
-let eval_ast status ast =
- let status,st = disambiguate_statement status ast in
- (* this disambiguation step should be deferred to support tacticals *)
- eval status st
-
-let eval_from_stream status str cb =
- let stl = CicTextualParser2.parse_statements str in
- List.fold_left
- (fun status ast -> cb status ast;eval_ast status ast) status
- stl
-
-let eval_string status str =
- eval_from_stream status (Stream.of_string str) (fun _ _ -> ())
-
-let default_options () =
- let options =
- StringMap.add "baseuri"
- (String
- (Helm_registry.get "matita.baseuri" ^ Helm_registry.get "matita.owner"))
- no_options
- in
- let options =
- StringMap.add "basedir"
- (String (Helm_registry.get "matita.basedir" ))
- options
- in
- options
-
-let initial_status =
- lazy {
- aliases = DisambiguateTypes.empty_environment;
- proof_status = No_proof;
- options = default_options ();
- coercions = [];
- objects = [];
- }
-