Cut-elimination for minimal intuitionistic logic.

LF Specification

[View impcut.elf]
i : type.

form : type.
imp : form -> form -> form.
atom : i -> form.

hyp : form -> type.
conc : form -> type.

init : {P:i} hyp (atom P) -> conc (atom P).
impR : {A:form} {B:form} (hyp A -> conc B) -> conc (imp A B).
impL : {A:form} {B:form} {C:form} conc A -> (hyp B -> conc C) -> hyp (imp A B) -> conc C.

Reasoning

[View impcut.thm]

Click on a command or tactic to see a detailed view of its use.

Specification "impcut.elf".

Define ctx : olist -> prop by
  ctx nil
; nabla p, ctx (<p:hyp A> :: G) := ctx G.

Define name : lfobj -> prop by
  nabla x, name x.

Define fresh : lfobj -> lfobj -> prop by
  nabla x, fresh x A.

Theorem prune : forall G E, nabla (n:lfobj), member (E n) G ->
  exists F, E = x\ F.

Theorem ctx_mem : forall G E, ctx G -> member E G ->
                    exists A P, E = <P:hyp A> /\ fresh P A.

Theorem strength_i : forall G U, ctx G ->
  <G |- U:i> -> <U:i>.

Theorem strength_form : forall G F, ctx G ->
  <G |- F:form> -> <F:form>.

Theorem prune_form : forall F, nabla (x:lfobj), <F x:form> ->
  exists FF, F = x\ FF.

Theorem imp_invert :
  forall G A B DD, ctx G -> <G |- DD:conc (imp A B)> ->
  nabla x, exists EE, <G, x:hyp A |- EE:conc B>.

Theorem cut_admit :
  forall G A C D1 D2, nabla x, ctx G ->
    <A:form> -> <G |- D1:conc A> -> <G, x:hyp A |- D2 x:conc C> -> exists D3, <G |- D3:conc C>.