| Skip t -> size_of_term t
| UnsafeCoerce t -> 1 + size_of_term t
;;
-let unitty =
- NCic.Const (NReference.reference_of_spec (NUri.uri_of_string "cic:/matita/basics/types/unit.ind") (NReference.Ind (true,0,0)));;
type obj_kind =
TypeDeclaration of typ_former_decl
let dummyref =
NReference.reference_of_string "cic:/matita/dummy/dummy.ind(1,1,1)"
+type not_term = [`Kind | `KindOrType | `PropKind | `Proposition | `Type];;
+
+let max_not_term t1 t2 =
+ match t1,t2 with
+ `KindOrType,_
+ | _,`KindOrType -> `KindOrType
+ | `Kind,_
+ | _,`Kind -> `Kind
+ | `Type,_
+ | _,`Type -> `Type
+ | `PropKind,_
+ | _,`PropKind -> `PropKind
+ | `Proposition,`Proposition -> `Proposition
+
+let sup = List.fold_left max_not_term `Proposition
+
let rec classify_not_term status context t =
match NCicReduction.whd status ~subst:[] context t with
| NCic.Sort s ->
classify_not_term status ((b,NCic.Decl s)::context) t
| NCic.Implicit _
| NCic.LetIn _
- | NCic.Lambda _
| NCic.Const (NReference.Ref (_,NReference.CoFix _))
- | NCic.Appl [] -> assert false (* NOT POSSIBLE *)
- | NCic.Match _
+ | NCic.Appl [] ->
+ assert false (* NOT POSSIBLE *)
+ | NCic.Lambda (n,s,t) ->
+ (* Lambdas can me met in branches of matches, expecially when the
+ output type is a product *)
+ classify_not_term status ((n,NCic.Decl s)::context) t
+ | NCic.Match (r,_,_,pl) ->
+ let classified_pl = List.map (classify_not_term status context) pl in
+ sup classified_pl
| NCic.Const (NReference.Ref (_,NReference.Fix _)) ->
- (* be aware: we can be the head of an application *)
- assert false (* TODO *)
+ assert false (* IMPOSSIBLE *)
| NCic.Meta _ -> assert false (* TODO *)
+ | NCic.Appl (NCic.Const (NReference.Ref (_,NReference.Fix (i,_,_)) as r)::_)->
+ let l,_,_ = NCicEnvironment.get_checked_fixes_or_cofixes status r in
+ let _,_,_,_,bo = List.nth l i in
+ classify_not_term status [] bo
| NCic.Appl (he::_) -> classify_not_term status context he
| NCic.Rel n ->
let rec find_sort typ =
assert false (* IMPOSSIBLE *)
;;
-type not_term = [`Kind | `KindOrType | `PropKind | `Proposition | `Type];;
-
let classify status ~metasenv context t =
match NCicTypeChecker.typeof status ~metasenv ~subst:[] context t with
| NCic.Sort _ ->
| NCic.Lambda _ -> assert false (* LAMBDA-LIFT INNER DECLARATION *)
| NCic.Rel n -> Var n
| NCic.Const ref -> TConst ref
+ | NCic.Match (_,_,_,_)
+ | NCic.Appl (NCic.Const (NReference.Ref (_,NReference.Fix _))::_) ->
+ Top
| NCic.Appl (he::args) ->
let rev_he_context= rev_context_of_typformer status ~metasenv context he in
TAppl (typ_of status ~metasenv context he ::
(skip_args status ~metasenv context (rev_he_context,args)))
| NCic.Appl _ -> assert false (* TODO: when head is a match/let rec;
otherwise NOT A TYPE *)
- | NCic.Meta _
- | NCic.Match (_,_,_,_) -> assert false (* TODO *)
+ | NCic.Meta _ -> assert false (*TODO*)
+;;
+
+let rec fomega_lift_type_from n k =
+ function
+ | Var m as t -> if m < k then t else Var (m + n)
+ | Top -> Top
+ | TConst _ as t -> t
+ | Unit -> Unit
+ | Arrow (ty1,ty2) -> Arrow (fomega_lift_type_from n k ty1,fomega_lift_type_from n (k+1) ty2)
+ | TSkip t -> TSkip (fomega_lift_type_from n (k+1) t)
+ | Forall (name,kind,t) -> Forall (name,kind,fomega_lift_type_from n (k+1) t)
+ | TAppl args -> TAppl (List.map (fomega_lift_type_from n k) args)
+
+let fomega_lift_type n t =
+ if n = 0 then t else fomega_lift_type_from n 0 t
+
+let fomega_lift_term n t =
+ let rec fomega_lift_term n k =
+ function
+ | Rel m as t -> if m < k then t else Rel (m + n)
+ | BottomElim
+ | UnitTerm
+ | Const _ as t -> t
+ | Lambda (name,t) -> Lambda (name,fomega_lift_term n (k+1) t)
+ | TLambda (name,t) -> TLambda (name,fomega_lift_term n (k+1) t)
+ | Appl args -> Appl (List.map (fomega_lift_term n k) args)
+ | LetIn (name,m,bo) ->
+ LetIn (name, fomega_lift_term n k m, fomega_lift_term n (k+1) bo)
+ | Match (ref,t,pl) ->
+ let lift_p (ctx,t) =
+ let lift_context ctx =
+ let len = List.length ctx in
+ HExtlib.list_mapi
+ (fun el i ->
+ let j = len - i - 1 in
+ match el with
+ None
+ | Some (_,`OfKind _) as el -> el
+ | Some (name,`OfType t) ->
+ Some (name,`OfType (fomega_lift_type_from n (k+j) t))
+ ) ctx
+ in
+ lift_context ctx, fomega_lift_term n (k + List.length ctx) t
+ in
+ Match (ref,fomega_lift_term n k t,List.map lift_p pl)
+ | Inst t -> Inst (fomega_lift_term n k t)
+ | Skip t -> Skip (fomega_lift_term n (k+1) t)
+ | UnsafeCoerce t -> UnsafeCoerce (fomega_lift_term n k t)
+ in
+ if n = 0 then t else fomega_lift_term n 0 t
;;
let rec fomega_subst k t1 =
function
| Var n ->
- if k=n then t1
+ if k=n then fomega_lift_type k t1
else if n < k then Var n
else Var (n-1)
| Top -> Top
let ctx = None::ctx in
let context = (name,NCic.Decl ty)::context in
eat_branch 0 t context ctx t'
- | Top,_ -> assert false (*TODO: HOW??*)
- (*BUG here, eta-expand!*)
+ | Top,_ -> assert false (* IMPOSSIBLE *)
+ | TSkip _, _
+ | Forall _,_
+ | Arrow _,_ -> assert false (*BUG here, eta-expand!*)
| _, _ -> context,ctx, pat
in
try
| `Proposition ->
(match patterns_of pl with
[] -> BottomElim
- | [_lhs,rhs] -> rhs (*BUG HERE: Rels are not ok, bound in the _lhs*)
+ | [lhs,rhs] -> fomega_lift_term (- List.length lhs) rhs
| _ -> assert false)
| `Type ->
Match (ref,term_of status ~metasenv context t, patterns_of pl))
Unit -> UnitTerm
| _ -> term_of status ~metasenv context arg in
eat_args status metasenv (mk_appl acc arg) context t tl
+ | Top ->
+ let arg =
+ match classify status ~metasenv context arg with
+ | `PropKind
+ | `Proposition
+ | `Term `TypeFormer
+ | `Term `PropFormer
+ | `Term `Proof
+ | `Type
+ | `KindOrType
+ | `Kind -> UnitTerm
+ | `Term `TypeFormerOrTerm
+ | `Term `Term -> term_of status ~metasenv context arg
+ in
+ eat_args status metasenv
+ (UnsafeCoerce (mk_appl acc (UnsafeCoerce arg)))
+ context Top tl
| Forall (_,_,t) ->
- eat_args status metasenv (Inst acc)
- context (fomega_subst 1 (typ_of status ~metasenv context arg) t) tl
+ (match classify status ~metasenv context arg with
+ | `PropKind -> assert false (*TODO: same as below, coercion needed???*)
+ | `Proposition
+ | `Term `TypeFormer
+ | `Kind ->
+ eat_args status metasenv (UnsafeCoerce (Inst acc))
+ context (fomega_subst 1 Unit t) tl
+ | `Term _ -> assert false (*TODO: ????*)
+ | `KindOrType
+ | `Type ->
+ eat_args status metasenv (Inst acc)
+ context (fomega_subst 1 (typ_of status ~metasenv context arg) t)
+ tl)
| TSkip t ->
eat_args status metasenv acc context t tl
- | Top -> assert false (*TODO: HOW??*)
| Unit | Var _ | TConst _ | TAppl _ -> assert false (* NOT A PRODUCT *)
;;
if ReferenceMap.mem ref status#extraction_db then
`TypeName
else
- let NReference.Ref (_,ref) = ref in
- match ref with
+ let NReference.Ref (_,r) = ref in
+ match r with
NReference.Con _ -> `Constructor
| NReference.Ind _ -> assert false
| _ -> `FunctionName
function
| Var n -> List.nth ctxt (n-1)
| Unit -> "()"
- | Top -> assert false (* ??? *)
+ | Top -> "Top"
| TConst ref -> pp_ref status ref
| Arrow (t1,t2) ->
bracket size_of_type (pretty_print_type status ctxt) t1 ^ " -> " ^