A continuación se presentan dos pruebas formalizadas (en Agda) de una versión del principio de casillero. La forma en que he enunciado el principio es así:
Suponga que tiene una lista de números naturales. Entonces, si la suma de los números (número de palomas) es mayor que la longitud de la lista (número de agujeros), la lista tiene un elemento mayor que 1 (el agujero tiene más de 1 paloma).
Primero tengo un par de pruebas sencillas comunes a ambos:
lift : {m : } {ms}
[ n ] (n ms) × (1 < n)
[ n ] (n m ms) × (1 < n)
lift (n , nms , 1<n) = (n , there nms , 1<n)
test : (n : ) (n 1) (1 < n)
test 0 = inj zn
test 1 = inj -refl
test (suc (suc n)) = inj (mm+n 2 n)
Aquí hay una prueba que primero demuestra la versión "negativa" del teorema:
down : {m ms}
( n n (m ms) n 1)
n n ms n 1
down all n nms = all n (there nms)
negative : (l : List )
( n n l n 1)
sum l length l
negative [] all = -refl
negative (n ns) all with test n
... | inj n1 = +-mono- n1 (negative ns (down all))
... | inj 1<n = -elim (< 1<n (all n (here refl)))
up : {m ms}
m 1
( n n ms n 1)
n n m ms n 1
up m1 all n (here refl) = m1
up m1 all n (there nms) = all n nms
search : (l : List )
¬ ( n n l n 1)
[ n ] (n l) × (1 < n)
search [] ¬all = -elim (¬all _ ())
search (n ns) ¬all with test n
... | inj n1 = lift (search ns (¬all up n1))
... | inj 1<n = n , here refl , 1<n
positive : (l : List )
length l < sum l
[ n ] (n l) × (1 < n)
positive l l<s = search l all < l<s (negative l all)
Intenté usar un principio clásico real en lugar de search
pero en realidad terminó siendo más largo.
Aquí está la versión directa (nota, hay un caso omitido para la lista vacía en la prueba, porque el ordenador puede decir que $\mathsf{length}\ l < \mathsf{sum}\ l$ es imposible para la lista vacía):
cancel : {i j k l} k i i + j < k + l j < l
cancel {i} ki i+j<k+l =
+-cancel-< i (<-trans i+j<k+l (+-mono- _ ki))
positive : (l : List )
length l < sum l
[ n ] (n l) × 1 < n
positive (n ns) l<s with test n
... | inj 1<n = (n , here refl , 1<n)
... | inj n1 = lift (positive ns (cancel n1 l<s))
Como puedes ver, la prueba de la afirmación negativa es estructuralmente casi la misma que la prueba directa de la afirmación positiva, porque ambas se limitan a hacer inducción sobre la lista. Probar la versión negativa primero sólo llevó a un trabajo extra derivando la declaración deseada real después (que en sí mismo es casi tan largo como la prueba directa).
En casos como éste -proposiciones decidibles sobre números finitos-, procedimientos como $\mathsf{search}$ permiten utilizar la prueba por contradicción de forma constructiva. Puedes ver esto como que la lógica clásica está justificada, o que no añade ningún poder esencial en esos casos.
Sin embargo, tampoco es necesariamente el caso de que la prueba por contradicción haga que tus pruebas sean más fáciles/cortas. A menudo, los matemáticos utilizan este tipo de pruebas por costumbre, más que porque sean necesarias o (por cualquier medida) beneficiosas. Podrías suponer que ya has demostrado la afirmación negativa, supongo, pero también podrías haber demostrado el principio de encasillamiento y derivar de él la afirmación negativa.
Aquí es el archivo completo que contiene las pruebas.
Hay versiones del principio de encasillamiento en las que la prueba directa es mucho más difícil que la de aquí. Sin embargo, la razón por la que son difíciles tiene que ver con la manipulación de funciones entre tipos finitos, que es el análogo de $\mathsf{cancel}$ . Es posible que la prueba indirecta sea más fácil en ese caso, pero los análogos de hechos sobre el ordenamiento en él también van a ser más difíciles de probar.