(** {1 MPRI lecture 2-36-1 "Proof of Programs"} *)
(** {2 Propositional logic} *)
predicate a
predicate b
(** arbitrary predicate variables *)
goal and_left: a /\ b -> a
(** almost trivial goal *)
goal excluded_middle : a \/ not a
(** note that the logic is classical, not intuitionistic *)
goal pierce : ((a -> b) -> a) -> a
(** even it contains no negation, this formula is not
provable in intuitionistic logic *)
goal imp_assoc_to_the_right: a -> a -> a
(** be aware that implication associates to the right *)
goal imp_does_not_assoc_to_the_left : (a -> a) -> a
(** Must not be proved. Why3 hint: type 'g' on a failed
proof attempt by CVC4 or Z3 to get a counterexample *)