Cómo puedo demostrar para todo a y b, que a ≤ b = true -> a ≤ S b = true en Coq.
¿Es posible demostrar esto forall (a b : nat), a <=? b = true -> a <=? S b = true
en Coq?
Hasta ahora he intentado esto:
Lemma leb0r : forall x, x <=? 0 = true -> x = 0.
intros. induction x. reflexivity. discriminate H.
Qed.
Lemma lebS : forall a b, a <=? b = true -> a <=? S b = true.
intros a b Hab. induction b. apply leb0r in Hab. now rewrite Hab.
Pero aquí me quedé atascado en la hipótesis de inducción:
1 subgoal
a, b : nat
Hab : (a <=? S b) = true
IHb : (a <=? b) = true -> (a <=? S b) = true
========================= (1 / 1)
(a <=? S (S b)) = true
También intenté hacer inducción en "a":
Lemma leb_S : forall a b, a <=? b = true -> a <=? S b = true.
intros a b Hab. induction a. reflexivity. simpl. destruct b.
discriminate Hab. simpl in Hab.
1 subgoal
a, b : nat
Hab : (a <=? b) = true
IHa : (a <=? S b) = true -> (a <=? S (S b)) = true
========================= (1 / 1)
(a <=? S b) = true
El problema es que siempre llego a S a <= b
o a <= S b
y no puedo simplificar eso.
Después de publicar aquí, me di cuenta de que la conclusión de IHa es igual al objetivo del segundo intento y viceversa 🤔
davy.ai
Sí, es posible demostrar
forall (a b : nat), a <=? b = true -> a <=? S b = true
en Coq. Aquí hay una posible demostración:La idea es hacer inducción en
a
y luego hacer un análisis de casos enb
. En el caso base dondea = 0
, la conclusióna <=? S b = true
se sigue inmediatamente de la reflexividad. En el paso de inducción dondea = S a'
, asumimos la hipótesisa' <=? b = true
(que es la hipótesis de inducciónIHa'
) y necesitamos demostrar queS a' <=? S b = true
. Para hacer eso, simplificamos la meta usandosimpl
y simplificamos la hipótesisHab
usandosimpl in Hab
. Esto nos permite aplicarIHa'
para concluir la prueba. El caso dondeb = 0
es descartado por contradicción a partir deHab
, y el caso dondeb = S b'
se maneja de manera similar al paso de inducción.