Ltac intros_dep :=
match goal with
| |- ?G => change (OpaqueProp G); simple apply ready_for_intros
end;
repeat
match goal with
| |-  OpaqueProp (Typeclass_Rewrite _ -> OpaqueProp _) => fail 1
| _ => apply intro_with_record; intro
end.
Ltac schedule :=
match goal with
| |- OpaqueProp (Typeclass_Rewrite ?L -> _) => constr: (L)
end.
Ltac tactic_rev_rec L1 L2 :=
match L1 with
| nil => L2
| cons ?H ?L => tactic_rev_rec L (cons H L2)
end.
Ltac tactic_rev L :=
match type of L with
| list ?T => tactic_rev_rec L constr:(@nil T)
end.

(* Specifications: *)
Lemma change_schedule: forall (l l': list (sig (fun X: Prop => X))) (G: Prop),
OpaqueProp (Typeclass_Rewrite l -> G) ->
OpaqueProp (Typeclass_Rewrite l' -> G).
Lemma pop_schedule: forall (x: (sig (fun X: Prop => X))) (l: list (sig (fun X: Prop => X))) (G: Prop),
OpaqueProp (Typeclass_Rewrite l -> G) ->
OpaqueProp (Typeclass_Rewrite (x :: l) -> G).
Lemma push_schedule: forall (x: (sig (fun X: Prop => X))) (l: list (sig (fun X: Prop => X))) (G: Prop),
OpaqueProp (Typeclass_Rewrite (x :: l) -> G) ->
OpaqueProp (Typeclass_Rewrite l -> G).