Inductive eqT {A} (x : A) : A -> Type :=
reflT : eqT x x. Definition Bi_inv (A B : Type) (f : (A -> B)) :=
sigT (fun (g : B -> A) =>
sigT (fun (h : B -> A) =>
sigT (fun (α : forall b : B, eqT (f (g b)) b) => forall a : A, eqT (h (f a)) a))). Definition TEquiv (A B : Type) := sigT (fun (f : A -> B) => Bi_inv _ _ f).
Axiom UA : forall (A B : Type), TEquiv (TEquiv A B) (eqT A B). Definition idtoeqv {A B} (e : eqT A B) : TEquiv A B :=
sigT_rect (fun _ => TEquiv A B)
(fun (f : TEquiv A B -> eqT A B) H =>
sigT_rect _ (* (fun _ => TEquiv A B) *)
(fun g _ => g e)
H)
(UA A B).
(* 2. Alternative example by Guillaume *)
Inductive foo (A : Prop) : Prop := Foo : foo A. Axiom bar : forall (A : Prop) (P : foo A -> Prop), (A -> P (Foo A)) -> Prop.
(* This used to fail with a Not_found, we fail more graciously but a heuristic could be implemented, e.g. in some smart occur-check
function, to find a solution of then form ?P := fun _ => ?P' *)
Fail Check (fun e : ?[T] => bar ?[A] ?[P] (fun g : ?[A'] => g e)).
(* This works and tells which solution we could have inferred *)
Check (fun e : ?[T] => bar ?[A] (fun _ => ?[P]) (fun g : ?[A'] => g e)).
(* For the record, here is the trace in the failing example:
In (fun e : ?T => bar ?[A] ?[P] (fun g : ?A' => g e)), we have the existential variables
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.