Load Param.
Ltac changeall v f P :=
match P with
| 
v => 
f
| 
forall x : ?
T, ?
b => 
let T2 := 
changeall v f T with b2 := 
changeall v f b in
  constr:(
forall x : 
T2, 
b2)
| 
exists x : ?
T, ?
b => 
let T2 := 
changeall v f T with b2 := 
changeall v f b in
  constr:(
exists x : 
T2, 
b2)
| (
fun x : ?
T => ?
b) => 
let T2 := 
changeall v f T with b2 := 
changeall v f b in
  constr:(
fun x : 
T2 => 
b2)
| (?
a ?
b) => 
let a2 := 
changeall v f a with b2 := 
changeall v f b in
  constr:(
a2 b2)
| (?
a -> ?
b) => 
let a2 := 
changeall v f a with b2 := 
changeall v f b in
  constr:(
a2 -> 
b2)
| 
_ => 
P
end.
Ltac setvar v f H :=
match goal with
| [|- ?
P] =>
  
let P2 := 
changeall f v P in
  cut (
forall v, 
f = 
v -> 
P2) ;
  [
intro H ; 
apply (
H (
f) (
refl_equal _)) | 
intros v H ]
end.
Ltac var1 v f :=
 
let H := 
fresh "
H" 
in
 setvar v f H
.
Ltac var0 f :=
 
let v := 
fresh "
v" 
in
 let H := 
fresh "
H" 
in
 setvar v f H
.
Ltac var f :=
 
let v := 
fresh "
v" 
in
 let H := 
fresh "
H" 
in
 setvar v f H ; (
rewrite H || 
idtac)
.
Ltac genclear H := 
generalize H ; 
clear H.
Ltac econtr := 
eapply False_rect ; 
eauto.
Ltac invert_all :=
match goal with
| [ |- ?
Q ] =>
 
match type of Q with
  | 
Prop => 
match goal with
    | [ 
H : 
exists x, 
_ |- 
_ ] => 
inversion_clear H
    end
 | 
_ =>
  
match goal with
    | [ 
H : 
_ /\ 
_ |- 
_ ] => 
inversion_clear H
    | [ 
H : 
_ <-> 
_ |- 
_ ] => 
inversion_clear H
    | [ 
H : { 
x : 
_ & 
_ } |- 
_ ] => 
inversion_clear H
    | [ 
H : { 
x : 
_ | 
_ } |- 
_ ] => 
inversion_clear H
  end
 end
end.
Ltac invall := 
repeat invert_all.
Ltac discr :=
match goal with
| [ 
H1 : ?
k = 
_ , 
H2 : ?
k = 
_ |- 
_ ] => 
rewrite H2 in H1 ; 
clear H2 ; 
discr
| [ 
H1 : ?
k = 
_ , 
H2 : 
_ = ?
k |- 
_ ] => 
rewrite <- 
H2 in H1 ; 
clear H2 ; 
discr
| 
_ => 
discriminate
end.
Ltac contreq :=
match goal with
| [ 
H1 : ?
a <> ?
a |- 
_ ] => 
contradiction (
refl_equal a)
| [ 
H1 : ?
a <> ?
b , 
H2 : ?
b = ?
c |- 
_ ] => 
rewrite H2 in H1 ; 
clear H2 ; 
contreq
| [ 
H1 : ?
a <> ?
b , 
H2 : ?
c = ?
b |- 
_ ] => 
rewrite <- 
H2 in H1 ; 
clear H2 ; 
contreq
| [ 
H1 : ?
a = ?
b -> 
False, 
H2 : ?
b = ?
c |- 
_ ] => 
rewrite H2 in H1 ; 
clear H2 ; 
contreq
| [ 
H1 : ?
a = ?
a -> 
False |- 
_  ] => 
contradiction (
refl_equal a)
| [ 
H1 : ?
a = ?
b -> 
False, 
H2 : ?
c = ?
b |- 
_ ] => 
rewrite <- 
H2 in H1 ; 
clear H2 ; 
contreq
end.
Ltac introvars :=
match goal with
| [ |- ?
P -> ?
Q ] => 
idtac
| [ |- 
forall _, 
_ ] => 
intro ; 
introvars
| 
_ => 
idtac
end.
Ltac dup H := 
generalize H; 
intro.
Lemma ex_set_prop : 
forall (
A : 
Type) 
P,
{
a : 
A | 
P a} -> 
exists a, 
P a.
Proof.
intros ? ? [a Ha]; exists a; auto.
Qed.
Lemma option_inj : 
forall A (
a : 
A) 
b, 
Some a = 
Some b -> 
a = 
b.
Proof.
injection 1; auto.
Qed.
Lemma conj_step : 
forall (
A B : 
Prop), 
A -> (
A -> 
B) -> 
A /\ 
B.
Proof.
tauto.
Qed.
Ltac asplit :=
  
match goal with
    | |- ?
A /\ ?
B =>
      
cut (
A /\ (
A -> 
B)) ; [ 
tauto | 
split ; [ | 
intro ] ]
    | |- (?
A * ?
B)%
type =>
      
cut (
A * (
A -> 
B)) ; [ 
tauto | 
split ; [ | 
intro ] ]
  
end.
Ltac bsplit :=
  
match goal with
    | |- ?
B /\ ?
A =>
      
cut (
A /\ (
A -> 
B)) ; [ 
tauto | 
split ; [ | 
intro ] ]
    | |- (?
B * ?
A)%
type =>
      
cut (
A * (
A -> 
B)) ; [ 
tauto | 
split ; [ | 
intro ] ]
  
end.
Ltac use h := 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ _ )) || 
refine (
_ (
h _ _ _ _ )) || 
refine (
_ (
h _ _ _ )) || 
refine (
_ (
h _ _ )) || 
refine (
_ (
h _ )) || 
fail 1 "
Pas assez d'
arguments".
Ltac invoke h := 
use h ; 
try eassumption ; 
intro ; 
try invall.
Ltac invoke' 
h := 
use h ; 
try eassumption.
Remark if_some_commut : 
forall (
U V : 
Prop) (
d : {
U} + {
V}) (
X : 
Type) (
x1 x2 : 
X), (
if d then Some x1 else Some x2) = 
Some (
if d then x1 else x2).
Proof.
 intros; destruct d; trivial.
Qed.
Ltac bintro := 
refine ((
fun F => 
conj (
fun b => 
proj1 (
F b)) (
fun b => 
proj2 (
F b))) (
fun b => 
_)).
Remark and_assoc : 
forall A B C : 
Prop, (
A /\ 
B) /\ 
C -> 
A /\ 
B /\ 
C.
Proof.
 tauto. Qed.
  Ltac try_dependent_revert i :=
    
match goal with
      | 
h: ?
P |- 
_ => 
        
match P with
          | 
context [ 
i ] => 
revert h
        end
    end.
  
Ltac dependent_revert i := 
    
repeat try_dependent_revert i;
      
revert i.