%{ In the [[verifications and uses]] article we saw a typical presentation of a logic of verifications and uses, and in article on [[hereditary substitution with zippers]] we saw an attempt to clean up the "ugly part" of that proof by defining a zipper-like structure over terms. The reason that global soundness for this system did not hold is that Twelf could not verify (without the use of a [[structural metric]]) that a "zipped" use was the same size as an "unzipped" use, so [[termination checking]] failed when a recursive
call was made on a term that had been unzipped.
In this article, we give a different solution. This system has something of the flavor of a [[spine form]] presentation; however, as we discussed in the
[[hereditary substitution with zippers]], it is still much closer to a natural deduction system - the analogue of the natural deduction term atm (⊃E (⊃E (⊃E (var x) N1) N2)
N3) in the natural deduction system is
atm x (⊃E (⊃E (⊃E end N1) N2) N3) in this version of "natural deduction" - the form of proofs stays the same
with the exception that the head variable x has been pulled out into the front. }%
%{ == Propositions and rules == }%
prop : type.
atom : type.
%block bl_atom : block {qp : atom}.
a : atom -> prop.
⊃ : prop -> prop -> prop. %infix right 9 ⊃.
∧ : prop -> prop -> prop. %infix right 8 ∧.
hyp : prop -> type.
verif : prop -> type.
use : prop -> prop -> type.
%block bl_hyp : some {A : prop} block {x : hyp A}.
end : use A A.
atm : hyp A -> use A (a Q) -> verif (a Q).
⊃I : (hyp A -> verif B) -> verif (A ⊃ B).
⊃E : use A (B₁ ⊃ B₂) -> verif B₁ -> use A B₂.
∧I : verif A₁ -> verif A₂ -> verif (A₁ ∧ A₂).
∧E₁ : use A (B₁ ∧ B₂) -> use A B₁.
∧E₂ : use A (B₁ ∧ B₂) -> use A B₂.
%{ == Global completeness == }%
%{ Because we have changed the logic, the η-expansion theorem has changed somewhat. Recall that, in the pure system of [[verifications and uses]], the statement of global completeness/η-expansion was that, for all A, we can verify the truth of A in any context where we can use the fact that A is true. In this system, however, we don't ever use A in a vacuum - we always take a hypothesis of B and then prove that, given B, we can use A.
The eta expansion theorem reflects this: it says that, for any A, given an arbitrary B that we have hypothesized to be true and a proof
that we can use A given B, we can prove A.
The structure of the η-expansion theorem's proof is then mostly unchanged from the system of [[verifications and uses]]. }%
eta : {A} ({B} hyp B -> use B A -> verif A) -> type.
%mode eta +A -B.
- : eta (a Q) ([B][x][r] atm x r).
- : eta (A₁ ⊃ A₂) ([B][x][r] ⊃I [y] N₂ B x (⊃E r (N₁ A₁ y end)))
<- eta A₁ ([B] N₁ B : hyp B -> use B A₁ -> verif A₁)
<- eta A₂ ([B] N₂ B : hyp B -> use B A₂ -> verif A₂).
- : eta (A₁ ∧ A₂) ([B][x][r] ∧I (N₁ B x (∧E₁ r)) (N₂ B x (∧E₂ r)))
<- eta A₁ ([B] N₁ B : hyp B -> use B A₁ -> verif A₁)
<- eta A₂ ([B] N₂ B : hyp B -> use B A₂ -> verif A₂).
%worlds (bl_atom | bl_hyp) (eta _ _).
%total A (eta A _).
%{ Let's see some examples of η-expansions: | check = decl }%
%solve _ : {q1}{q2}{q3} eta (a q1 ⊃ a q2 ⊃ a q3) (X q1 q2 q3).
%{ | check = decl }%
%solve _ : {q1}{q2}{q3} eta ((a q1 ⊃ a q2) ⊃ a q3) (X q1 q2 q3).
%{ == Global soundness == }%
%{ The real benefit of this modified natural deduction system is that we no longer need to take any detours to prove the hereditary substitution theorem: when we reach
the atm case where we must verify an atomic proposition by using a proof of its truth, we know exactly what hypothesis we are using. If the
hypothesis is the one we're substituting for, then we call out to the hsubst_rn theorem where we do repeated reductions, and if the hypothesis
is not, we call out to the hsubst_rr theorem where the structure of the use stays essentially the same. }%
hsubst_n : {A} verif A -> (hyp A -> verif B) -> verif B -> type.
hsubst_rr : {A} verif A -> (hyp A -> use C B) -> use C B -> type.
hsubst_rn : {A}{B} verif A -> (hyp A -> use A B) -> verif B -> type.
%mode hsubst_n +A +M₀ +M -N.
%mode hsubst_rr +A +M₀ +R -R'.
%mode hsubst_rn +A +B +M₀ +R -N.
- : hsubst_n A M₀ ([x] ⊃I [y] M x y) (⊃I [y] N y)
<- {y : hyp B₁} hsubst_n A M₀ ([x] M x y) (N y : verif B₂).
- : hsubst_n A M₀ ([x] ∧I (M₁ x) (M₂ x)) (∧I N₁ N₂)
<- hsubst_n A M₀ ([x] M₁ x) (N₁ : verif B₁)
<- hsubst_n A M₀ ([x] M₂ x) (N₂ : verif B₂).
- : hsubst_n A M₀ ([x] atm x (R x)) N
<- hsubst_rn A (a Q) M₀ ([x] R x) N.
- : hsubst_n A M₀ ([x] atm Y (R x)) (atm Y R')
<- hsubst_rr A M₀ ([x] R x) R'.
- : hsubst_rr A M₀ ([x] ⊃E (R x) (M x)) (⊃E R' N)
<- hsubst_rr A M₀ ([x] R x) R'
<- hsubst_n A M₀ ([x] M x) N.
- : hsubst_rr A M₀ ([x] ∧E₁ (R x)) (∧E₁ R')
<- hsubst_rr A M₀ ([x] R x) R'.
- : hsubst_rr A M₀ ([x] ∧E₂ (R x)) (∧E₂ R')
<- hsubst_rr A M₀ ([x] R x) R'.
- : hsubst_rr A M₀ ([x] end) end.
- : hsubst_rn A B₂ M₀ ([x] ⊃E (R x) (M x)) N'
<- hsubst_rn A (B₁ ⊃ B₂) M₀ ([x] R x) ((⊃I [y] N y) : verif (B₁ ⊃ B₂))
<- hsubst_n A M₀ ([x] M x) (M' : verif B₁)
<- hsubst_n B₁ M' ([y] N y) (N' : verif B₂).
- : hsubst_rn A B₁ M₀ ([x] ∧E₁ (R x)) N₁
<- hsubst_rn A (B₁ ∧ B₂) M₀ ([x] R x) (∧I N₁ N₂ : verif (B₁ ∧ B₂)).
- : hsubst_rn A B₂ M₀ ([x] ∧E₂ (R x)) N₂
<- hsubst_rn A _ M₀ ([x] R x) (∧I N₁ N₂ : verif (B₁ ∧ B₂)).
- : hsubst_rn A A M₀ ([x] end) M₀.
%worlds (bl_atom | bl_hyp)
(hsubst_n _ _ _ _)
(hsubst_rr _ _ _ _)
(hsubst_rn _ _ _ _ _).
%reduces B <= A (hsubst_rn A B _ _ _).
%total {(A B C) (M R S)}
(hsubst_n A _ M _)
(hsubst_rr B _ R _)
(hsubst_rn C _ _ S _).