- CicTypeChecker.type_of_aux' metasenv context term CicUniv.empty_ugraph in
- match termty with
- (C.Appl [(C.MutInd (equri, 0, [])) ; tty ; t1 ; t2])
- when (U.eq equri Logic.eq_URI) -> (
- match tty with
- (C.MutInd (turi,typeno,exp_named_subst))
- | (C.Appl (C.MutInd (turi,typeno,exp_named_subst)::_)) ->
-
- let consno2 = (* bruuutto: uso un eccezione per terminare con successo! buuu!! :-/ *)
- try
- let rec traverse t1 t2 =
-prerr_endline ("XXXX t1 " ^ CicPp.ppterm t1) ;
-prerr_endline ("XXXX t2 " ^ CicPp.ppterm t2) ;
- match t1,t2 with
- ((C.MutConstruct (uri1,typeno1,consno1,exp_named_subst1)),
- (C.MutConstruct (uri2,typeno2,consno2,exp_named_subst2)))
- when (uri1 = uri2) && (typeno1 = typeno2) && (consno1 = consno2) && (exp_named_subst1 = exp_named_subst2) ->
- 0
- | ((C.Appl ((C.MutConstruct (uri1,typeno1,consno1,exp_named_subst1))::applist1)),
- (C.Appl ((C.MutConstruct (uri2,typeno2,consno2,exp_named_subst2))::applist2)))
- when (uri1 = uri2) && (typeno1 = typeno2) && (consno1 = consno2) && (exp_named_subst1 = exp_named_subst2) ->
- let rec traverse_list l1 l2 =
- match l1,l2 with
- [],[] -> 0
- | hd1::tl1,hd2::tl2 -> traverse hd1 hd2; traverse_list tl1 tl2
- | _ -> raise (ProofEngineTypes.Fail "Discriminate: i 2 termini hanno in testa lo stesso costruttore, ma applicato a un numero diverso di termini. possibile???")
- in traverse_list applist1 applist2
-
- | ((C.MutConstruct (uri1,typeno1,consno1,exp_named_subst1)),
- (C.MutConstruct (uri2,typeno2,consno2,exp_named_subst2)))
- | ((C.MutConstruct (uri1,typeno1,consno1,exp_named_subst1)),
- (C.Appl ((C.MutConstruct (uri2,typeno2,consno2,exp_named_subst2))::_)))
- | ((C.Appl ((C.MutConstruct (uri1,typeno1,consno1,exp_named_subst1))::_)),
- (C.MutConstruct (uri2,typeno2,consno2,exp_named_subst2)))
- | ((C.Appl ((C.MutConstruct (uri1,typeno1,consno1,exp_named_subst1))::_)),
- (C.Appl ((C.MutConstruct (uri2,typeno2,consno2,exp_named_subst2))::_)))
- when (consno1 <> consno2) || (exp_named_subst1 <> exp_named_subst2) ->
- raise (TwoDifferentSubtermsFound consno2)
- | _ -> raise (ProofEngineTypes.Fail "Discriminate: not a discriminable equality")
- in traverse t1 t2
- with (TwoDifferentSubtermsFound consno2) -> consno2
- in
-prerr_endline ("XXXX consno2 " ^ (string_of_int consno2)) ;
- if consno2 = 0
- then raise (ProofEngineTypes.Fail "Discriminate: Discriminating terms are structurally equal")
- else
-
- let pattern =
- (* a list of "True" except for the element in position consno2 which is "False" *)
- match fst(CicEnvironment.get_obj
- CicUniv.empty_ugraph turi) with
- C.InductiveDefinition (ind_type_list,_,nr_ind_params) ->
-prerr_endline ("XXXX nth " ^ (string_of_int (List.length ind_type_list)) ^ " " ^ (string_of_int typeno)) ;
- let _,_,_,constructor_list = (List.nth ind_type_list typeno) in
-prerr_endline ("XXXX nth " ^ (string_of_int (List.length constructor_list)) ^ " " ^ (string_of_int consno2)) ;
- let false_constr_id,_ = List.nth constructor_list (consno2 - 1) in
-prerr_endline ("XXXX nth funzionano ") ;
- List.map
- (function (id,cty) ->
- let red_ty = CicReduction.whd context cty in (* dubbio: e' corretto ridurre in questo context ??? *)
- let rec aux t k =
- match t with
- C.Prod (_,_,target) when (k <= nr_ind_params) ->
- aux target (k+1)
- | C.Prod (binder,source,target) when (k > nr_ind_params) ->
- C.Lambda (binder,source,(aux target (k+1)))
- | _ ->
- if (id = false_constr_id)
- then (C.MutInd(Logic.false_URI,0,[]))
- else (C.MutInd(Logic.true_URI,0,[]))
- in aux red_ty 1
- )
- constructor_list
- | _ -> raise (ProofEngineTypes.Fail "Discriminate: object is not an Inductive Definition: it's imposible")
- in
-
- let (proof',goals') =
- ProofEngineTypes.apply_tactic
- (EliminationTactics.elim_type_tac
- ~term:(C.MutInd(Logic.false_URI,0,[])))
- status
- in
- (match goals' with
- [goal'] ->
- let _,metasenv',_,_ = proof' in
- let _,context',gty' =
- CicUtil.lookup_meta goal' metasenv'
- in
- ProofEngineTypes.apply_tactic
- (T.then_
- ~start:
- (P.change_tac
- ~what:gty'
- ~with_what:
- (C.Appl [
- C.Lambda (
- C.Name "x", tty,
- C.MutCase (
- turi, typeno,
- (C.Lambda ((C.Name "x"),tty,(C.Sort C.Prop))),
- (C.Rel 1), pattern
- )
- );
- t2]
- )
- )
- ~continuation:
- (
-let u = CicUniv.empty_ugraph in
-prerr_endline ("XXXX rewrite<-: " ^ CicPp.ppterm (fst (CicTypeChecker.type_of_aux' metasenv' context' (C.Appl [(C.MutInd (equri,0,[])) ; tty ; t1 ; t2]) u)));
-prerr_endline ("XXXX rewrite<-: " ^ CicPp.ppterm (C.Appl [(C.MutInd (equri,0,[])) ; tty ; t1 ; t2])) ;
-prerr_endline ("XXXX equri: " ^ U.string_of_uri equri) ;
-prerr_endline ("XXXX tty : " ^ CicPp.ppterm tty) ;
-prerr_endline ("XXXX tt1': " ^ CicPp.ppterm (fst(CicTypeChecker.type_of_aux' metasenv' context' t1 u))) ;
-prerr_endline ("XXXX tt2': " ^ CicPp.ppterm (fst(CicTypeChecker.type_of_aux' metasenv' context' t2 u))) ;
-if (fst (CicTypeChecker.type_of_aux' metasenv' context' t1 u)) <> tty then
-prerr_endline ("XXXX tt1': " ^ CicPp.ppterm (fst (CicTypeChecker.type_of_aux' metasenv' context' t1 u))) ;
-if (fst(CicTypeChecker.type_of_aux' metasenv' context' t2 u)) <> tty then
-prerr_endline ("XXXX tt2': " ^ CicPp.ppterm (fst(CicTypeChecker.type_of_aux' metasenv' context' t2 u))) ;
-if (fst(CicTypeChecker.type_of_aux' metasenv' context' t1 u)) <>
-(fst (CicTypeChecker.type_of_aux' metasenv' context' t2 u))
- then prerr_endline ("XXXX tt1': " ^ CicPp.ppterm (fst(CicTypeChecker.type_of_aux' metasenv' context' t1 u))) ; prerr_endline ("XXXX tt2': " ^ CicPp.ppterm (fst(CicTypeChecker.type_of_aux' metasenv' context' t2 u))) ;
-prerr_endline ("XXXX rewrite<- " ^ CicPp.ppterm term ^ " : " ^ CicPp.ppterm (fst(CicTypeChecker.type_of_aux' metasenv' context' term u)));
- T.then_
- ~start:(EqualityTactics.rewrite_back_simpl_tac ~term)
- ~continuation:(IntroductionTactics.constructor_tac ~n:1)
- ))
- (proof',goal')
- | _ -> raise (ProofEngineTypes.Fail "Discriminate: ElimType False left more (or less) than one goal")
- )
- | _ -> raise (ProofEngineTypes.Fail "Discriminate: not a discriminable equality")
- )
- | _ -> raise (ProofEngineTypes.Fail "Discriminate: not an equality")
- in
+ CicTypeChecker.type_of_aux' metasenv context term CicUniv.empty_ugraph
+ in
+ match termty with
+ | (C.Appl [(C.MutInd (equri, 0, [])) ; tty ; t1 ; t2])
+ when LibraryObjects.is_eq_URI equri ->
+ let turi,typeno,exp_named_subst,left_args =
+ match tty with
+ | (C.MutInd (turi,typeno,exp_named_subst)) ->
+ turi,typeno,exp_named_subst,[]
+ | (C.Appl (C.MutInd (turi,typeno,exp_named_subst)::left_args)) ->
+ turi,typeno,exp_named_subst,left_args
+ | _ -> fail "not a discriminable equality"
+ in
+ let consno =
+ match find_discriminating_consno t1 t2 with
+ | Some consno -> consno
+ | None -> fail "discriminating terms are structurally equal"
+ in
+ let pattern = mk_pattern turi typeno consno context left_args in
+ let (proof',goals') =
+ ProofEngineTypes.apply_tactic
+ (EliminationTactics.elim_type_tac
+ (C.MutInd (LibraryObjects.false_URI (), 0, [])))
+ status
+ in
+ (match goals' with
+ | [goal'] ->
+ let _,metasenv',_,_ = proof' in
+ let _,context',gty' = CicUtil.lookup_meta goal' metasenv' in
+ ProofEngineTypes.apply_tactic
+ (T.then_
+ ~start:
+ (ReductionTactics.change_tac
+ ~pattern:(ProofEngineTypes.conclusion_pattern (Some gty'))
+ (fun _ m u ->
+ C.Appl [
+ C.Lambda ( C.Name "x", tty,
+ C.MutCase (turi, typeno,
+ (C.Lambda ((C.Name "x"),
+ (CicSubstitution.lift 1 tty),
+ (C.Sort C.Prop))),
+ (C.Rel 1), pattern));
+ t2 ], m, u))
+ ~continuation:
+ (T.then_
+ ~start:
+ (EqualityTactics.rewrite_simpl_tac
+ ~direction:`RightToLeft
+ ~pattern:(ProofEngineTypes.conclusion_pattern None)
+ term)
+ ~continuation:
+ (IntroductionTactics.constructor_tac ~n:1)))
+ (proof',goal')
+ | [] -> fail "ElimType False left no goals"
+ | _ -> fail "ElimType False left more than one goal")
+ | _ -> fail "not an equality"
+ in