fact: Definition tauto' := mfix2 f (c : list dyn) (p : Prop) : M p := mmatch p as p' return M p' with | True => ret I | [? p1 p2] p1 /\ p2 => r1 <- f c p1 ; r2 <- f c p2 ; ret (conj r1 r2) | [? p1 p2] p1 \/ p2 => mtry r1 <- f c p1 ; ret (or_introl r1) with _ => r2 <- f c p2 ; ret (or_intror r2) end | [? (p1 p2 : Prop)] p1 -> p2 => \nu x:p1, r <- f (Dyn x :: c) p2; abs_fun x r | [? A (q:A -> Prop)] (forall x:A, q x) => \nu x:A, r <- f c (q x); abs_fun x r | [? A (q:A -> Prop)] (exists x:A, q x) => X <- evar A; r <- f c (q X) ; b <- is_evar X; if b then raise NotFound else ret (ex_intro q X r) | [? p'] p':Prop => search p' c end.
imports: Mtac2.Mtac2 Arith.Arith Lists.List Strings.String