vericert.common.Vericertlib
#[local] Open Scope Z_scope.
Inductive Learnt {A: Type} (a: A) :=
| AlreadyKnown : Learnt a.
Tactic Notation "learn" constr(fact) := let name := fresh "H" in learn_tac fact name.
Tactic Notation "learn" constr(fact) "as" simple_intropattern(name) := learn_tac fact name.
Infix "==nat" := eq_nat_dec (no associativity, at level 50).
Infix "==Z" := Z.eq_dec (no associativity, at level 50).
#[global] Opaque Nat.div.
#[global] Opaque Z.mul.
Module Option.
Definition default {T : Type} (x : T) (u : option T) : T :=
match u with
| Some y => y
| _ => x
end.
Definition map {S : Type} {T : Type} (f : S -> T) (u : option S) : option T :=
match u with
| Some y => Some (f y)
| _ => None
end.
Definition liftA2 {T : Type} (f : T -> T -> T) (a : option T) (b : option T) : option T :=
match a with
| Some x => map (f x) b
| _ => None
end.
Definition bind {A B : Type} (f : option A) (g : A -> option B) : option B :=
match f with
| Some a => g a
| _ => None
end.
Definition join {A : Type} (a : option (option A)) : option A :=
match a with
| None => None
| Some a' => a'
end.
Module Notation.
Notation "'do' X <- A ; B" := (bind A (fun X => B))
(at level 200, X name, A at level 100, B at level 200).
End Notation.
End Option.
Parameter debug_print : string -> unit.
Definition debug_show {A B : Type} `{Show A} (a : A) (b : B) : B :=
let unused := debug_print (show a) in b.
Definition debug_show_msg {A B : Type} `{Show A} (s : string) (a : A) (b : B) : B :=
let unused := debug_print (s ++ show a) in b.