(** However, while the boolean and propositional formulations of a claim are equivalent from a purely logical perspective, they need not be equivalent _operationally_.  Equality provides an extreme example: knowing that [beq_nat n m = true] is generally of little direct help in the middle of a proof involving [n] and [m]; however, if we convert the statement to the equivalent form [n = m], we can rewrite with it.  The case of even numbers is also interesting.  Recall that, when proving the backwards direction of [even_bool_prop] (i.e., [evenb_double], going from the propositional to the boolean claim), we used a simple induction on [k].  On the other hand, the converse (the [evenb_double_conv] exercise) required a clever generalization, since we can't directly prove [(exists k, n = double k) -> evenb n = true].  For these examples, the propositional claims are more useful than their boolean counterparts, but this is not always the case.  For instance, we cannot test whether a general proposition is true or not in a function definition; as a consequence, the following code fragment is rejected: *)
Fail Definition is_even_prime n :=
if n = 2 then true
else false.
(** Coq complains that [n = 2] has type [Prop], while it expects an elements of [bool] (or some other inductive type with two elements).  The reason for this error message has to do with the _computational_ nature of Coq's core language, which is designed so that every function that it can express is computable and total.  One reason for this is to allow the extraction of executable programs from Coq developments.  As a consequence, [Prop] in Coq does _not_ have a universal case analysis operation telling whether any given proposition is true or false, since such an operation would allow us to write non-computable functions.  Although general non-computable properties cannot be phrased as boolean computations, it is worth noting that even many _computable_ properties are easier to express using [Prop] than [bool], since recursive function definitions are subject to significant restrictions in Coq.  For instance, the next chapter shows how to define the property that a regular expression matches a given string using [Prop].  Doing the same with [bool] would amount to writing a regular expression matcher, which would be more complicated, harder to understand, and harder to reason about.  Conversely, an important side benefit of stating facts using booleans is enabling some proof automation through computation with Coq terms, a technique known as _proof by reflection_.  Consider the following statement: *)
Example even_1000 : exists k, 1000 = double k.
(** The most direct proof of this fact is to give the value of [k] explicitly. *)
(** In particular, the excluded middle is valid for equations [n = m], between natural numbers [n] and [m]. *)

(* Specifications: *)
Theorem restricted_excluded_middle_eq : forall (n m : nat),
n = m \/ n <> m.