Nivel 7 · Completitud en Lean (experto)
Reglas estructurales y derivadas
Antes de la corrección y la completitud se registran tres lemas que se usan repetidamente. Cada uno es un metateorema demostrado por inducción sobre reglas o exhibiendo una derivación.
Debilitamiento (monotonía en el contexto)
Si y , entonces .
A probar: , bajo las hipótesis y .
Por inducción sobre la derivación de , generalizando sobre (la hipótesis de inducción, abreviada HI, queda disponible para cualquier contexto que incluya al de la premisa). En todos los casos se dispone de y, por monotonía de la inserción, de para toda fórmula . Se tratan uno por uno los siete constructores; en cada caso la última regla de la derivación se reaplica sobre . Se muestran completos tres casos representativos; los cuatro restantes (E, E, E y RAA) siguen exactamente el mismo patrón que su análogo mostrado (reaplicar la regla sobre las conclusiones de las HI, con la misma inclusión o su versión insertada), y están escritos en su totalidad en la tesis.
- hipótesis. La derivación es . De y se sigue , y:
- I. Termina en . La HI aplicada a la premisa con da , y:
- I. Termina en . La HI con da , y:
En cada caso la conclusión es la requerida sobre , lo que cierra la inducción.
Extracto de NaturalDeduction.lean.
theorem weakening {Γ φ} (d : ND Γ φ) : ∀ {Δ}, Γ ⊆ Δ → ND Δ φ := by induction d with | hyp hmem => intro Δ hsub; exact ND.hyp (hsub hmem) | impI _ ih => intro Δ hsub; exact ND.impI (ih (insert_subset_insert hsub)) | impE _ _ ih1 ih2 => intro Δ hsub; exact ND.impE (ih1 hsub) (ih2 hsub) | negI _ ih => intro Δ hsub; exact ND.negI (ih (insert_subset_insert hsub)) | negE _ _ ih1 ih2 => intro Δ hsub; exact ND.negE (ih1 hsub) (ih2 hsub) | botE _ ih => intro Δ hsub; exact ND.botE (ih hsub) | classical _ ih => intro Δ hsub; exact ND.classical (ih (insert_subset_insert hsub))Las siete ramas | reflejan exactamente los siete casos de la demostración;
insert_subset_insert es el lema de Mathlib
usado en los tres
casos con descarga.
Vista interna (CIC). induction d se elabora a ND.rec aplicado con el motivo
Obsérvese que el motivo es a su vez un tipo (cuantifica sobre ); por eso la
demostración «generaliza sobre » antes de inducir. Cada rama proporciona la premisa menor
correspondiente de ND.rec y, al poder usar las hipótesis de inducción ih, reconstruye la
conclusión con el mismo constructor sobre el contexto mayor. Todo el bloque de tácticas se elabora
a un único término cerrado de tipo
∀ {Γ φ}, ND Γ φ → ∀ {Δ}, Γ ⊆ Δ → ND Δ φ.
Introducción de doble negación
Si entonces .
A probar: , bajo la hipótesis . Se construye la derivación paso a paso.
- Como , la regla de hipótesis da (1).
- Por debilitamiento (Lema 11.8) de con : (2).
- E sobre (1) y (2): (3).
- I descargando en (3): .
El árbol completo es:
Extracto de NaturalDeduction.lean.
theorem dni {Γ φ} (d : ND Γ φ) : ND Γ (~~φ) := by apply ND.negI exact ND.negE (ND.hyp (Set.mem_insert _ _)) (weakening d (Set.subset_insert _ _))Demostración por casos clásica
El siguiente lema es el motor del paso de descarga de átomos de la página 7. Es «la ley del tercero excluido, usada en silencio»: nunca se forma un objeto disyunción, simplemente se divide la prueba.
Si y , entonces .
A probar: , bajo las hipótesis y .
Estrategia. Se aplica RAA; basta derivar . Para ello se construyen dos subderivaciones, y , y se combinan con E.
Subderivación : .
Subderivación : .
Combinación. Con como y como (tomando ), la regla E y luego RAA cierran la prueba:
Extracto de NaturalDeduction.lean.
theorem byCases {Γ φ χ} (d1 : ND (insert φ Γ) χ) (d2 : ND (insert (~φ) Γ) χ) : ND Γ χ := by apply ND.classical have e1 : ND (insert (~χ) Γ) (~φ) := by apply ND.negI refine ND.negE (ND.hyp ?_) (weakening d1 ?_) · exact Set.mem_insert_of_mem _ (Set.mem_insert _ _) · exact Set.insert_subset_insert (Set.subset_insert _ _) have e2 : ND (insert (~χ) Γ) (~~φ) := by apply ND.negI refine ND.negE (ND.hyp ?_) (weakening d2 ?_) · exact Set.mem_insert_of_mem _ (Set.mem_insert _ _) · exact Set.insert_subset_insert (Set.subset_insert _ _) exact ND.negE e2 e1Vista interna (CIC). dni y byCases no son inducciones: cada uno ensambla directamente un
término ND a partir de constructores. Por ejemplo, dni d se elabora a
un árbol de constructores cuyas hojas son la hipótesis y el debilitamiento (construido
recursivamente) de . Los bloques have e1 … := by … en byCases construyen las dos
subderivaciones como subtérminos nombrados, y exact ND.negE e2 e1 los inserta en el constructor
E. Así, estas «reglas derivadas» son admisibles por construcción: cada una es una función
que devuelve una derivación genuina, no una nueva primitiva del cálculo.