type binder_type =
- Declaration
- | Definition
+ Declaration of Cic.name * Cic.term
+ | Definition of Cic.name * Cic.term
;;
type metasenv = (int * Cic.term) list;;
-type context = (binder_type * Cic.name * Cic.term) list;;
+type named_context = binder_type list;;
-type sequent = context * Cic.term;;
+type sequent = named_context * Cic.term;;
let proof =
ref (None : (UriManager.uri * metasenv * Cic.term * Cic.term) option)
exception NotImplemented
-(*CSC: Funzione che deve sparire!!! *)
-let cic_context_of_context =
+let cic_context_of_named_context =
List.map
(function
- Declaration,_,t -> t
- | Definition,_,_ -> raise NotImplemented
+ Declaration (_,t) -> Cic.Decl t
+ | Definition (_,t) -> Cic.Def t
)
;;
(*CSC: generatore di nomi? Chiedere il nome? *)
| C.Anonimous -> C.Name "fresh_name"
in
- ((Declaration,n',s)::ctx,ty,C.Lambda(n',s,bo))
+ ((Declaration (n',s))::ctx,ty,C.Lambda(n',s,bo))
| C.LetIn (n,s,t) ->
let (ctx,ty,bo) = collect_context t in
- ((Definition,n,s)::ctx,ty,C.LetIn(n,s,bo))
+ ((Definition (n,s))::ctx,ty,C.LetIn(n,s,bo))
| _ as t -> [], t, (C.Meta newmeta)
in
let revcontext',ty',bo' = collect_context ty in
(* Invariant: context is the actual context of the meta in the proof *)
metano,context,ty
in
- (*CSC: deve sparire! *)
- let context = cic_context_of_context context in
+ let context = cic_context_of_named_context context in
if R.are_convertible (T.type_of_aux' metasenv context bo) ty then
begin
refine_meta metano bo [] ;
(* Invariant: context is the actual context of the meta in the proof *)
metano,context,ty
in
- (*CSC: deve sparire! *)
- let ciccontext = cic_context_of_context context in
+ let ciccontext = cic_context_of_named_context context in
let mgu,mgut = CicUnification.apply metasenv ciccontext term ty in
let mgul',uninstantiatedmetas = fix_andreas_meta mgu mgut in
let bo' =
(* Invariant: context is the actual context of the meta in the proof *)
metano,context,ty
in
- (*CSC: deve sparire! *)
- let ciccontext = cic_context_of_context context in
+ let ciccontext = cic_context_of_named_context context in
let termty = T.type_of_aux' metasenv ciccontext term in
let uri,cookingno,typeno,args =
match termty with
(*CSC: che si guadagni nulla in fatto di efficienza. *)
let replace = ProofEngineReduction.replace ~what:term ~with_what:term' in
let ty' = replace ty in
- let context' = List.map (function (bt,n,t) -> bt,n,replace t) context in
+ let context' =
+ List.map
+ (function
+ Definition (n,t) -> Definition (n,replace t)
+ | Declaration (n,t) -> Declaration (n,replace t)
+ ) context
+ in
let metasenv' =
List.map
(function
(*CSC: che si guadagni nulla in fatto di efficienza. *)
let replace = ProofEngineReduction.replace ~what:term' ~with_what:term in
let ty' = replace ty in
- let context' = List.map (function (bt,n,t) -> bt,n,replace t) context in
+ let context' =
+ List.map
+ (function
+ Declaration (n,t) -> Declaration (n,replace t)
+ | Definition (n,t) -> Definition (n,replace t)
+ ) context
+ in
let metasenv' =
List.map
(function
refine_meta metano bo' [newmeta2,term; newmeta1,newmeta1ty];
goal :=
Some
- (newmeta1,((Declaration, C.Name "dummy_for_cut", term)::context,
+ (newmeta1,((Declaration (C.Name "dummy_for_cut", term))::context,
newmeta1ty))
;;
+let letin term =
+ let module C = Cic in
+ let curi,metasenv,pbo,pty =
+ match !proof with
+ None -> assert false
+ | Some (curi,metasenv,bo,ty) -> curi,metasenv,bo,ty
+ in
+ let (metano,context,ty) =
+ match !goal with
+ None -> assert false
+ | Some (metano,(context,ty)) -> metano,context,ty
+ in
+ let ciccontext = cic_context_of_named_context context in
+ let _ = CicTypeChecker.type_of_aux' metasenv ciccontext term in
+ let newmeta = new_meta () in
+ let newmetaty = CicSubstitution.lift 1 ty in
+ let bo' = C.LetIn (C.Name "dummy_for_letin",term,C.Meta newmeta) in
+ refine_meta metano bo' [newmeta,newmetaty];
+ goal :=
+ Some
+ (newmeta,
+ ((Definition (C.Name "dummy_for_letin", term))::context, newmetaty))
+;;
+
exception NotConvertible;;
(*CSC: Bug (or feature?). [input] is parsed in the context of the goal, *)
None -> assert false
| Some (metano,(context,ty)) -> metano,context,ty
in
- (*CSC: deve sparire! *)
- let ciccontext = cic_context_of_context context in
+ let ciccontext = cic_context_of_named_context context in
(* are_convertible works only on well-typed terms *)
ignore (CicTypeChecker.type_of_aux' metasenv ciccontext input) ;
if CicReduction.are_convertible goal_input input then