User:Hdeyoung/monweakfoc.elf

From The Twelf Project
Jump to: navigation, search
This is Literate Twelf
Code: here
Status: %% ABORT %%
Output: here.

Completeness

pol : type.  %name pol S.

pos : pol.
neg : pol. 



sort : type.  %name sort S.

prin : sort.

%block sort-block : block {s : sort}.



term : sort -> type.  %name term T x.

%block term-block : some {S : sort} block {x : term S}.



atm : pol -> type.  %name atm P.

%block atm-block : some {S : pol} block {p : atm S}.



atm-eq : atm S -> atm S -> type.

atm-eq/refl : atm-eq P+- P+-.



prop : pol -> type.  %name prop A.

atom : atm S -> prop S.
tensor : prop pos -> prop pos -> prop pos.
one : prop pos. 
% exists : {S : sort} (term S -> prop pos) -> prop pos.
down : prop neg -> prop pos.
lolli : prop pos -> prop neg -> prop neg.
% forall : {S : sort} (term S -> prop neg) -> prop neg.
monad : prop pos -> prop neg.
says : term prin -> prop pos -> prop neg.



prop-eq : prop S -> prop S -> type.

prop-eq/refl : prop-eq A+- A+-.



prop-resp-atm-eq : {A+- : atm S -> prop S'} atm-eq P1+- P2+- -> prop-eq (A+- P1+-) (A+- P2+-) -> type.
%mode prop-resp-atm-eq +A+- +Deq -Deq'.

- : prop-resp-atm-eq A+- atm-eq/refl prop-eq/refl.

%worlds (sort-block | term-block | atm-block) (prop-resp-atm-eq _ _ _).
%total {} (prop-resp-atm-eq _ _ _).



prop-eq-trans : prop-eq A+- B+- -> prop-eq B+- C+- -> prop-eq A+- C+- -> type.
%mode prop-eq-trans +Deq1 +Deq2 -Deq3.

- : prop-eq-trans prop-eq/refl prop-eq/refl prop-eq/refl.

%worlds (sort-block | term-block | atm-block) (prop-eq-trans _ _ _). 
%total {} (prop-eq-trans _ _ _).


prop-resp-prop-eq : {A+- : prop S -> prop S'} prop-eq B1+- B2+- -> prop-eq (A+- B1+-) (A+- B2+-) -> type.
%mode prop-resp-prop-eq +A+- +Deq -Deq'.

- : prop-resp-prop-eq A+- prop-eq/refl prop-eq/refl.

%worlds (sort-block | term-block | atm-block) (prop-resp-prop-eq _ _ _). 
%total {} (prop-resp-prop-eq _ _ _).



left : prop pos -> type.  %name left L l.

%block left-block : some {A+ : prop pos} block {l : left A+}.



left-resp-prop-eq : left A1+- -> prop-eq A1+- A2+- -> left A2+- -> type.
%mode left-resp-prop-eq +L +Deq -L'.

- : left-resp-prop-eq L prop-eq/refl L.

%worlds (sort-block | term-block | atm-block | left-block) (left-resp-prop-eq _ _ _).
%total {} (left-resp-prop-eq _ _ _).



judgment : type.  %name judgment J.

true : prop neg -> judgment.
lax : prop pos -> judgment.
affirms : term prin -> prop pos -> judgment.



conclusion : type.  %name conclusion C.

conclusion/right : judgment -> conclusion.
conclusion/rfoc : prop pos -> conclusion.
conclusion/lfoc : prop neg -> judgment -> conclusion.



conseq : conclusion -> type.  %name conseq D.

%abbrev right : judgment -> type = [j] conseq (conclusion/right j).
%abbrev rfoc : prop pos -> type = [a+] conseq (conclusion/rfoc a+).
%abbrev lfoc : prop neg -> judgment -> type = [a-] [j] conseq (conclusion/lfoc a- j).

%block rfoc-block : some {A+ : prop pos} block {rf : rfoc A+}.

init+ : left (atom P+) -> rfoc (atom P+).
init- : lfoc (atom P-) (true (atom P-)).
tensorR : rfoc A+ -> rfoc B+ -> rfoc (tensor A+ B+).
tensorL : (left A+ -> left B+ -> right J) -> (left (tensor A+ B+) -> right J).
oneR : rfoc one.
oneL : right J -> (left one -> right J).
% existsR : {T : term S} rfoc (A+ T) -> rfoc (exists S A+).
% existsL : ({a : term S} left (A+ a) -> right J) -> (left (exists S A+) -> right J).
downR : right (true A-) -> rfoc (down A-).
downL : lfoc A- J -> (left (down A-) -> right J).
lolliR : (left A+ -> right (true B-)) -> right (true (lolli A+ B-)).
lolliL : rfoc A+ -> lfoc B- J -> lfoc (lolli A+ B-) J.
% forallR : ({a : term S} right (true (A- a))) -> right (true (forall S A-)).
% forallL : {T : term S} lfoc (A- T) J -> lfoc (forall S A-) J.
laxR : rfoc A+ -> right (lax A+).
monadR : right (lax A+) -> right (true (monad A+)).
monadL : (left A+ -> right (lax C+)) -> lfoc (monad A+) (lax C+). 
affirmsR : rfoc A+ -> right (affirms K A+). 
saysR : right (affirms K A+) -> right (true (says K A+)).
saysL : (left A+ -> right (affirms K C+)) -> lfoc (says K A+) (affirms K C+). 



eta+ : {A+} (rfoc A+ -> right J) -> (left A+ -> right J) -> type. 
%mode eta+ +A+ +D -E.
eta- : {A-} ({J} lfoc A- J -> right J) -> right (true A-) -> type.
%mode eta- +A- +D -E.

- : eta+ (atom P+) 
     (D : rfoc (atom P+) -> right J)
     ([l : left (atom P+)] D (init+ l)).

- : eta+ (tensor A+ B+)
     (D : rfoc (tensor A+ B+) -> right J)
     ([l : left (tensor A+ B+)] tensorL E2 l)
     <- ({rfb : rfoc B+}
	   eta+ A+ ([rfa : rfoc A+] D (tensorR rfa rfb)) (E1 rfb : left A+ -> right J))
     <- ({la : left A+}
	   eta+ B+ ([rfb : rfoc B+] E1 rfb la) (E2 la : left B+ -> right J)).

- : eta+ one
     (D : rfoc one -> right J)
     ([l : left one] oneL (D oneR) l).

- : eta+ (down A-)
     (D : rfoc (down A-) -> right J)
     ([l : left (down A-)] D (downR (E l)))
     <- ({l : left (down A-)}
	   eta- A- ([j] [lfa : lfoc A- j] downL lfa l) (E l : right (true A-))).

%worlds (sort-block | term-block | atm-block | left-block | rfoc-block) (eta+ _ _ _) (eta- _ _ _).
%trustme %total (A+ A-) (eta+ A+ _ _) (eta- A- _ _).



cut+ : {A+} rfoc A+ -> (left A+ -> conseq C) -> conseq C -> type. 
%mode cut+ +A+ +D +E -F.
cut- : {A-} right (true A-) -> lfoc A- J -> right J -> type. 
%mode cut- +A- +D +E -F.
cut< : {A-} lfoc B- (true A-) -> lfoc A- J -> lfoc B- J -> type.
%mode cut< +A- +D +E -F.
cut+lax : {A+} right (lax A+) -> (left A+ -> right (lax C+)) -> right (lax C+) -> type.
%mode cut+lax +A+ +D +E -F. 
cut+lax-lfoc : {A+} lfoc B- (lax A+) -> (left A+ -> right (lax C+)) -> lfoc B- (lax C+) -> type.
%mode cut+lax-lfoc +A+ +D +E -F.
cut+affirms : {A+} right (affirms K A+) -> (left A+ -> right (affirms K C+)) -> right (affirms K C+) -> type.
%mode cut+affirms +A+ +D +E -F. 
cut+affirms-lfoc : {A+} lfoc B- (affirms K A+) -> (left A+ -> right (affirms K C+)) -> lfoc B- (affirms K C+) -> type.
%mode cut+affirms-lfoc +A+ +D +E -F.

%worlds (sort-block | term-block | atm-block | left-block | rfoc-block)
        (cut+ _ _ _ _)
        (cut- _ _ _ _)
        (cut< _ _ _ _)
        (cut+lax _ _ _ _) (cut+lax-lfoc _ _ _ _)
        (cut+affirms _ _ _ _) (cut+affirms-lfoc _ _ _ _).
%trustme %total {(A1+ A2- A3- A4+ A5+ A6+ A7+) [(D1 D2 D3 D4 D5 D6 D7) (E1 E2 E3 E4 E5 E6 E7)]}
        (cut+ A1+ D1 E1 _)
        (cut- A2- D2 E2 _)
        (cut< A3- D3 E3 _)
        (cut+lax A4+ D4 E4 _) (cut+lax-lfoc A5+ D5 E5 _)
        (cut+affirms A6+ D6 E6 _) (cut+affirms-lfoc A7+ D7 E7 _).




atm' : type.  %name atm' P'. 

%block atm'-block : block {p' : atm'}. 



prop' : type.  %name prop' A'.

atom' : atm' -> prop'.
tensor' : prop' -> prop' -> prop'.
one' : prop'.
% exists' : {S : sort} (term S -> prop') -> prop'. 
lolli' : prop' -> prop' -> prop'.
% forall' : {S : sort} (term S -> prop') -> prop'.
monad' : prop' -> prop'.
says' : term prin -> prop' -> prop'.



hyp : prop' -> type.  %name hyp H h.

%block hyp-block : some {A : prop'} block {h : hyp A}. 



judgment' : type.  %name judgment' J'.

judgment'/true : prop' -> judgment'.
judgment'/lax : prop' -> judgment'.
judgment'/affirms : term prin -> prop' -> judgment'.



conc : judgment' -> type.  %name conc D.

%abbrev true' : prop' -> type = [a] conc (judgment'/true a).
%abbrev lax' : prop' -> type = [a] conc (judgment'/lax a).
%abbrev affirms' : term prin -> prop' -> type = [k] [a] conc (judgment'/affirms k a).

init' : hyp (atom' P) -> true' (atom' P).
tensor'R : true' A -> true' B -> true' (tensor' A B).
tensor'L : (hyp A -> hyp B -> conc J') -> (hyp (tensor' A B) -> conc J').
one'R : true' one'.
one'L : conc J' -> (hyp one' -> conc J'). 
% exists'R : {T : term S} true' (A T) -> true' (exists' S A).
% exists'L : ({a : term S} hyp (A a) -> conc J') -> (hyp (exists' S A) -> conc J').
lolli'R : (hyp A -> true' B) -> true' (lolli' A B). 
lolli'L : true' A -> (hyp B -> conc J') -> (hyp (lolli' A B) -> conc J'). 
% forall'R : ({a : term S} true' (A a)) -> true' (forall' S A). 
% forall'L : {T : term S} (hyp (A T) -> conc J') -> (hyp (forall' S A) -> conc J'). 
lax'R : true' A -> lax' A.
monad'R : lax' A -> true' (monad' A). 
monad'L : (hyp A -> lax' C) -> (hyp (monad' A) -> lax' C).
affirms'R : true' A -> affirms' K A.
says'R : affirms' K A -> true' (says' K A). 
says'L : (hyp A -> affirms' K C) -> (hyp (says' K A) -> affirms' K C).




erase-atm : atm S -> atm' -> type.

%block erase-atm-block : some {S : pol}
			 block {p : atm S} {p' : atm'} {erase-atm/p : erase-atm p p'}.

%worlds (erase-atm-block) (erase-atm _ _).
 

erase-atm-unique : erase-atm P1+- P -> erase-atm P2+- P -> atm-eq P1+- P2+- -> type.
%mode erase-atm-unique +E1 +E2 -Deq.

- : erase-atm-unique E E atm-eq/refl.

%worlds (erase-atm-block) (erase-atm-unique _ _ _).
%total {} (erase-atm-unique _ _ _).



erase-prop : prop S -> prop' -> type.

erase-prop/atom : erase-prop (atom P+-) (atom' P)
		   <- erase-atm P+- P.
erase-prop/tensor : erase-prop (tensor A+ B+) (tensor' A B)
		     <- erase-prop A+ A
		     <- erase-prop B+ B.
erase-prop/one : erase-prop one one'.
% erase-prop/exists : erase-prop (exists S A+) (exists' S A)
% 		     <- ({a : term S} erase-prop (A+ a) (A a)).
erase-prop/down : erase-prop (down A-) A
		   <- erase-prop A- A.
erase-prop/lolli : erase-prop (lolli A+ B-) (lolli' A B)
		    <- erase-prop A+ A
		    <- erase-prop B- B.
% erase-prop/forall : erase-prop (forall S A-) (forall' S A)
% 		     <- ({a : term S} erase-prop (A- a) (A a)).
erase-prop/monad : erase-prop (monad A+) (monad' A)
		    <- erase-prop A+ A.
erase-prop/says : erase-prop (says K A+) (says' K A)
		   <- erase-prop A+ A.

%worlds (sort-block | term-block | erase-atm-block) (erase-prop _ _).



erase-prop-unique : erase-prop A1+- A -> erase-prop A2+- A -> prop-eq A1+- A2+- -> type.
%mode erase-prop-unique +E1 +E2 -Deq.

- : erase-prop-unique 
     (erase-prop/atom (E : erase-atm P+- P)) 
     (erase-prop/atom E) 
     prop-eq/refl.

- : erase-prop-unique 
     (erase-prop/tensor (E12 : erase-prop B1+ B) (E11 : erase-prop A1+ A))
     (erase-prop/tensor (E22 : erase-prop B2+ B) (E21 : erase-prop A2+ A))
     Deq 
     <- erase-prop-unique E11 E21 (Deq1 : prop-eq A1+ A2+)
     <- erase-prop-unique E12 E22 (Deq2 : prop-eq B1+ B2+)
     <- prop-resp-prop-eq ([a1+] tensor a1+ B1+) Deq1 (Deq3 : prop-eq (tensor A1+ B1+) (tensor A2+ B1+))
     <- prop-resp-prop-eq ([b1+] tensor A2+ b1+) Deq2 (Deq4 : prop-eq (tensor A2+ B1+) (tensor A2+ B2+))
     <- prop-eq-trans Deq3 Deq4 (Deq : prop-eq (tensor A1+ B1+) (tensor A2+ B2+)).

- : erase-prop-unique erase-prop/one erase-prop/one prop-eq/refl.

- : erase-prop-unique 
     (erase-prop/down (E1 : erase-prop A1- A))
     (erase-prop/down (E2 : erase-prop A2- A))
     Deq'
     <- erase-prop-unique E1 E2 (Deq : prop-eq A1- A2-)
     <- prop-resp-prop-eq ([a-] down a-) Deq (Deq' : prop-eq (down A1-) (down A2-)).

- : erase-prop-unique
     (erase-prop/lolli (E12 : erase-prop B1- B) (E11 : erase-prop A1+ A))
     (erase-prop/lolli (E22 : erase-prop B2- B) (E21 : erase-prop A2+ A))
     Deq 
     <- erase-prop-unique E11 E21 (Deq1 : prop-eq A1+ A2+)
     <- erase-prop-unique E12 E22 (Deq2 : prop-eq B1- B2-)
     <- prop-resp-prop-eq ([a1+] lolli a1+ B1-) Deq1 (Deq3 : prop-eq (lolli A1+ B1-) (lolli A2+ B1-))
     <- prop-resp-prop-eq ([b1-] lolli A2+ b1-) Deq2 (Deq4 : prop-eq (lolli A2+ B1-) (lolli A2+ B2-))
     <- prop-eq-trans Deq3 Deq4 (Deq : prop-eq (lolli A1+ B1-) (lolli A2+ B2-)).

- : erase-prop-unique 
     (erase-prop/monad (E1 : erase-prop A1+ A))
     (erase-prop/monad (E2 : erase-prop A2+ A))
     Deq'
     <- erase-prop-unique E1 E2 (Deq : prop-eq A1+ A2+)
     <- prop-resp-prop-eq ([a+] monad a+) Deq (Deq' : prop-eq (monad A1+) (monad A2+)).

- : erase-prop-unique 
     (erase-prop/says (E1 : erase-prop A1+ A))
     (erase-prop/says (E2 : erase-prop A2+ A))
     Deq'
     <- erase-prop-unique E1 E2 (Deq : prop-eq A1+ A2+)
     <- prop-resp-prop-eq ([a+] says K a+) Deq (Deq' : prop-eq (says K A1+) (says K A2+)).

%worlds (sort-block | term-block | erase-atm-block) (erase-prop-unique _ _ _).
%total E1 (erase-prop-unique E1 _ _).



erase-judgment : judgment -> judgment' -> type. 

erase-judgment/true : erase-judgment (true A-) (judgment'/true A)
		       <- erase-prop A- A.
erase-judgment/lax : erase-judgment (lax A+) (judgment'/lax A)
		      <- erase-prop A+ A.
erase-judgment/affirms : erase-judgment (affirms K A+) (judgment'/affirms K A)
			  <- erase-prop A+ A.




% adm-forallL : (left (down (A- T)) -> right J) -> (left (down (forall S A-)) -> right J) -> type.
% %mode adm-forallL +D -E.

% %worlds (sort-block | term-block | atm-block | left-block | rfoc-block) (adm-forallL _ _).
% %trustme %total D (adm-forallL D _).



cmp-conc : conc J' -> erase-judgment J J' -> right J -> type.
%mode cmp-conc +D +E -F.
cmp-lax : true' A -> erase-prop A+ A -> right (lax A+) -> type.
%mode cmp-lax +D +E -F.
cmp-affirms : true' A -> erase-prop A+ A -> right (affirms K A+) -> type.
%mode +{A} +{A+} +{K} +{D : true' A} +{E : erase-prop A+ A} -{F : right (affirms K A+)} (cmp-affirms D E F).
cmp-lolli : true' A -> erase-prop A+ A -> (left (down B-) -> right J) -> (left (down (lolli A+ B-)) -> right J) -> type. 
%mode cmp-lolli +D +E +F -G.
cmp-hyp : hyp A -> erase-prop A+ A -> left A+ -> type.
%mode cmp-hyp  +H -E -L.
cmp-hyp+ : hyp (atom' P) -> erase-prop A+ (atom' P) -> left A+ -> type.
%mode cmp-hyp+ +H +E -L.

- : cmp-hyp+ 
     (H : hyp (atom' P))
     (E : erase-prop A+ (atom' P))
     L'
     <- cmp-hyp H (E' : erase-prop A'+ (atom' P)) (L : left A'+)
     <- erase-prop-unique E' E (Deq : prop-eq A'+ A+)
     <- left-resp-prop-eq L Deq (L' : left A+).


- : cmp-conc
     (init' (H : hyp (atom' P)))
     (erase-judgment/true (erase-prop/atom (E : erase-atm P- P)))
     (downL init- L)
     <- cmp-hyp+ H (erase-prop/down (erase-prop/atom E)) L.

- : cmp-conc
     (tensor'L (D : hyp A -> hyp B -> conc J') (H : hyp (tensor' A B)))
     (E : erase-judgment J J')
     (tensorL F L)
     <- cmp-hyp H (erase-prop/tensor (E2 : erase-prop B+ B) (E1 : erase-prop A+ A)) (L : left (tensor A+ B+))
     <- ({ha : hyp A} {la : left A+} cmp-hyp ha E1 la 
	   -> {hb : hyp B} {lb : left B+} cmp-hyp hb E2 lb
	   -> cmp-conc (D ha hb) E (F la lb : right J)).

- : cmp-conc
     (one'L (D : conc J') (H : hyp one'))
     (E : erase-judgment J J')
     (oneL F L)
     <- cmp-hyp H erase-prop/one (L : left one)
     <- cmp-conc D E (F : right J).
 
% - : cmp-conc
%      (exists'L (D : {a : term S} hyp (A a) -> conc J') (H : hyp (exists' S A)))
%      (E : erase-judgment J J')
%      (existsL F L)
%     <- cmp-hyp H (erase-prop/exists (E1 : {x : term S} erase-prop (A+ x) (A x))) (L : left (exists S A+))
%     <- ({a : term S}
%	   {ha : hyp (A a)} {la : left (A+ a)} cmp-hyp ha (E1 a) la
%	   -> cmp-conc (D a ha) E (F a la : right J)).

- : cmp-conc
     (lolli'R (D : hyp A -> true' B))
     (erase-judgment/true (erase-prop/lolli (E2 : erase-prop B- B) (E1 : erase-prop A+ A)))
     (lolliR F)
     <- ({ha : hyp A} {la : left A+} cmp-hyp ha E1 la -> cmp-conc (D ha) (erase-judgment/true E2) (F la : right (true B-))).

- : cmp-conc
     (lolli'L (D1 : true' A) (D2 : hyp B -> conc J') (H : hyp (lolli' A B)))
     (E : erase-judgment J J')
     (F L)
     <- cmp-hyp H (erase-prop/down (erase-prop/lolli (E2 : erase-prop B- B) (E1 : erase-prop A+ A))) (L : left (down (lolli A+ B-)))
     <- ({hb : hyp B} {lb : left (down B-)} cmp-hyp hb (erase-prop/down E2) lb -> cmp-conc (D2 hb) E (F2 lb : right J))
     <- cmp-lolli D1 E1 F2 (F : left (down (lolli A+ B-)) -> right J).

% - : cmp-conc
%     (forall'R (D : {a: term S} true' (A a)))
%     (erase-judgment/true (erase-prop/forall (E : {x : term S} erase-prop (A- x) (A x))))
%     (forallR F)
%     <- ({a: term S} cmp-conc (D a) (erase-judgment/true (E a)) (F a)).

% - : cmp-conc
%     (forall'L (T : term S) (D : hyp (A T) -> conc J') (H : hyp (forall' S A)))
%     (E : erase-judgment J J')
%     (F' L)
%     <- cmp-hyp H (erase-prop/down (erase-prop/forall (E1 : {x : term S} erase-prop (A- x) (A x)))) (L : left (down (forall S A-))) 
%     <- ({ha : hyp (A T)} {la : left (down (A- T))} cmp-hyp ha (erase-prop/down (E1 T)) la -> cmp-conc (D ha) E (F la : right J))
%     <- adm-forallL F (F' : left (down (forall S A-)) -> right J).

- : cmp-conc (lax'R (D : true' A)) (erase-judgment/lax (E : erase-prop A+ A)) F
     <- cmp-lax D E (F : right (lax A+)).

- : cmp-conc
     (monad'R (D : lax' A))
     (erase-judgment/true (erase-prop/monad (E : erase-prop A+ A)))
     (monadR F)
     <- cmp-conc D (erase-judgment/lax E) F.

- : cmp-conc
     (monad'L (D : hyp A -> lax' C) (H : hyp (monad' A)))
     (erase-judgment/lax (E : erase-prop C+ C))
     (downL (monadL F) L)
     <- cmp-hyp H (erase-prop/down (erase-prop/monad (E1 : erase-prop A+ A))) (L : left (down (monad A+)))
     <- ({ha : hyp A} {la : left A+} cmp-hyp ha E1 la
	   -> cmp-conc (D ha) (erase-judgment/lax E) (F la : right (lax C+))).

- : cmp-conc
     (affirms'R (D : true' A)) 
     (erase-judgment/affirms (E : erase-prop A+ A))
     F
     <- cmp-affirms D E (F : right (affirms K A+)).

- : cmp-conc
     (says'R (D : affirms' K A))
     (erase-judgment/true (erase-prop/says (E : erase-prop A+ A)))
     (saysR F)
     <- cmp-conc D (erase-judgment/affirms E) F.

- : cmp-conc
     (says'L (D : hyp A -> affirms' K C) (H : hyp (says' K A)))
     (erase-judgment/affirms (E : erase-prop C+ C))
     (downL (saysL F) L)
     <- cmp-hyp H (erase-prop/down (erase-prop/says (E1 : erase-prop A+ A))) (L : left (down (says K A+)))
     <- ({ha : hyp A} {la : left A+} cmp-hyp ha E1 la
	   -> cmp-conc (D ha) (erase-judgment/affirms E) (F la : right (affirms K C+))).


- : cmp-lax
     (init' (H : hyp (atom' P)))
     (erase-prop/atom (E : erase-atm P+ P))
     (laxR (init+ L))
     <- cmp-hyp+ H (erase-prop/atom E) (L : left (atom P+)).

- : cmp-lax
     (tensor'R (D1 : true' A) (D2 : true' B))
     (erase-prop/tensor (E2 : erase-prop B+ B) (E1 : erase-prop A+ A))
     F6
     <- cmp-lax D1 E1 (F1 : right (lax A+)) 
     <- cmp-lax D2 E2 (F2 : right (lax B+))
     <- ({rfa : rfoc A+} eta+ B+ ([rfb : rfoc B+] laxR (tensorR rfa rfb)) (F3 rfa : left B+ -> right (lax (tensor A+ B+))))
     <- ({lb : left B+} eta+ A+ ([rfa : rfoc A+] F3 rfa lb) (F4 lb : left A+ -> right (lax (tensor A+ B+))))
     <- ({lb : left B+} cut+lax A+ F1 (F4 lb) (F5 lb : right (lax (tensor A+ B+))))
     <- cut+lax B+ F2 F5 (F6 : right (lax (tensor A+ B+))).

- : cmp-lax
     (tensor'L (D : hyp B1 -> hyp B2 -> true' A) (H : hyp (tensor' B1 B2)))
     (E : erase-prop A+ A)
     (tensorL F L)
     <- cmp-hyp H (erase-prop/tensor (E2 : erase-prop B2+ B2) (E1 : erase-prop B1+ B1)) (L : left (tensor B1+ B2+))
     <- ({hb1 : hyp B1} {lb1 : left B1+} cmp-hyp hb1 E1 lb1 
	   -> {hb2 : hyp B2} {lb2 : left B2+} cmp-hyp hb2 E2 lb2
	   -> cmp-lax (D hb1 hb2) E (F lb1 lb2 : right (lax A+))).

- : cmp-lax one'R erase-prop/one (laxR oneR).

- : cmp-lax
     (one'L (D : true' A) (H : hyp one'))
     (E : erase-prop A+ A)
     (oneL F L)
     <- cmp-hyp H erase-prop/one (L : left one)
     <- cmp-lax D E (F : right (lax A+)).

% - : cmp-lax
%     (exists'R (T : term S) (D : true' (A T)))
%     (erase-prop/exists (E : {x : term S} erase-prop (A+ x) (A x)))
%     F3
%     <- cmp-lax D (E T) (F1 : right (lax (A+ T)))
%     <- eta+ (A+ T) ([rfa : rfoc (A+ T)] laxR (existsR T rfa)) (F2 : left (A+ T) -> right (lax (exists S A+)))
%     <- cut+lax (A+ T) F1 F2 (F3 : right (lax (exists S A+))).

% - : cmp-lax
%     (exists'L (D : {a : term S} hyp (B a) -> true' A) (H : hyp (exists' S B)))
%     (E : erase-prop A+ A)
%     (existsL F L)
%     <- cmp-hyp H (erase-prop/exists (E1 : {x : term S} erase-prop (B+ x) (B x))) (L : left (exists S B+))
%     <- ({a : term S}
%	   {hb : hyp (B a)} {lb : left (B+ a)} cmp-hyp hb (E1 a) lb
%	   -> cmp-lax (D a hb) E (F a lb : right (lax A+))).

- : cmp-lax
     (D : true' A)
     (erase-prop/down (E : erase-prop A- A))
     (laxR (downR F))
     <- cmp-conc D (erase-judgment/true E) (F : right (true A-)).

- : cmp-lax
     (lolli'L (D1 : true' B1) (D2 : hyp B2 -> true' A) (H : hyp (lolli' B1 B2)))
     (E : erase-prop A+ A)
     (F L)
     <- cmp-hyp H (erase-prop/down (erase-prop/lolli (E2 : erase-prop B2- B2) (E1 : erase-prop B1+ B1))) (L : left (down (lolli B1+ B2-)))
     <- ({hb2 : hyp B2} {lb2 : left (down B2-)} cmp-hyp hb2 (erase-prop/down E2) lb2 -> cmp-lax (D2 hb2) E (F2 lb2 : right (lax A+)))
     <- cmp-lolli D1 E1 F2 (F : left (down (lolli B1+ B2-)) -> right (lax A+)).

% - : cmp-lax
%     (forall'L (T : term S) (D : hyp (B T) -> true' A) (H : hyp (forall' S B)))
%     (E : erase-prop A+ A)
%     (F' L)
%     <- cmp-hyp H (erase-prop/down (erase-prop/forall (E1 : {x : term S} erase-prop (B- x) (B x)))) (L : left (down (forall S B-))) 
%     <- ({hb : hyp (B T)} {lb : left (down (B- T))} cmp-hyp hb (erase-prop/down (E1 T)) lb -> cmp-lax (D hb) E (F lb : right (lax A+)))
%     <- adm-forallL F (F' : left (down (forall S B-)) -> right (lax A+)).


- : cmp-affirms 
     (init' (H : hyp (atom' P)))
     (erase-prop/atom (E : erase-atm P+ P))
     (affirmsR (init+ L))
     <- cmp-hyp+ H (erase-prop/atom E) (L : left (atom P+)).

- : cmp-affirms
     (tensor'R (D1 : true' A) (D2 : true' B))
     (erase-prop/tensor (E2 : erase-prop B+ B) (E1 : erase-prop A+ A))
     F6
     <- cmp-affirms D1 E1 (F1 : right (affirms K A+)) 
     <- cmp-affirms D2 E2 (F2 : right (affirms K B+))
     <- ({rfa : rfoc A+} eta+ B+ ([rfb : rfoc B+] affirmsR (tensorR rfa rfb)) (F3 rfa : left B+ -> right (affirms K (tensor A+ B+))))
     <- ({lb : left B+} eta+ A+ ([rfa : rfoc A+] F3 rfa lb) (F4 lb : left A+ -> right (affirms K (tensor A+ B+))))
     <- ({lb : left B+} cut+affirms A+ F1 (F4 lb) (F5 lb : right (affirms K (tensor A+ B+))))
     <- cut+affirms B+ F2 F5 (F6 : right (affirms K (tensor A+ B+))).

- : cmp-affirms
     (tensor'L (D : hyp B1 -> hyp B2 -> true' A) (H : hyp (tensor' B1 B2)))
     (E : erase-prop A+ A)
     (tensorL F L)
     <- cmp-hyp H (erase-prop/tensor (E2 : erase-prop B2+ B2) (E1 : erase-prop B1+ B1)) (L : left (tensor B1+ B2+))
     <- ({hb1 : hyp B1} {lb1 : left B1+} cmp-hyp hb1 E1 lb1 
	   -> {hb2 : hyp B2} {lb2 : left B2+} cmp-hyp hb2 E2 lb2
	   -> cmp-affirms (D hb1 hb2) E (F lb1 lb2 : right (affirms K A+))).

- : cmp-affirms one'R erase-prop/one (affirmsR oneR).

- : cmp-affirms
     (one'L (D : true' A) (H : hyp one'))
     (E : erase-prop A+ A)
     (oneL F L)
     <- cmp-hyp H erase-prop/one (L : left one)
     <- cmp-affirms D E (F : right (affirms K A+)).

% - : cmp-affirms
%     (exists'R (T : term S) (D : true' (A T)))
%     (erase-prop/exists (E : {x : term S} erase-prop (A+ x) (A x)))
%     F3
%     <- cmp-affirms D (E T) (F1 : right (affirms K (A+ T)))
%     <- eta+ (A+ T) ([rfa : rfoc (A+ T)] affirmsR (existsR T rfa)) (F2 : left (A+ T) -> right (affirms K (exists S A+)))
%     <- cut+affirms (A+ T) F1 F2 (F3 : right (affirms K (exists S A+))).

% - : cmp-affirms
%     (exists'L (D : {a : term S} hyp (B a) -> true' A) (H : hyp (exists' S B)))
%     (E : erase-prop A+ A)
%     (existsL F L)
%     <- cmp-hyp H (erase-prop/exists (E1 : {x : term S} erase-prop (B+ x) (B x))) (L : left (exists S B+))
%     <- ({a : term S}
%	   {hb : hyp (B a)} {lb : left (B+ a)} cmp-hyp hb (E1 a) lb
%	   -> cmp-affirms (D a hb) E (F a lb : right (affirms K A+))).

- : cmp-affirms
     (D : true' A)
     (erase-prop/down (E : erase-prop A- A))
     (affirmsR (downR F))
     <- cmp-conc D (erase-judgment/true E) (F : right (true A-)).

- : cmp-affirms
     (lolli'L (D1 : true' B1) (D2 : hyp B2 -> true' A) (H : hyp (lolli' B1 B2)))
     (E : erase-prop A+ A)
     (F L)
     <- cmp-hyp H (erase-prop/down (erase-prop/lolli (E2 : erase-prop B2- B2) (E1 : erase-prop B1+ B1))) (L : left (down (lolli B1+ B2-)))
     <- ({hb2 : hyp B2} {lb2 : left (down B2-)} cmp-hyp hb2 (erase-prop/down E2) lb2 -> cmp-affirms (D2 hb2) E (F2 lb2 : right (affirms K A+)))
     <- cmp-lolli D1 E1 F2 (F : left (down (lolli B1+ B2-)) -> right (affirms K A+)).

% - : cmp-affirms
%     (forall'L (T : term S) (D : hyp (B T) -> true' A) (H : hyp (forall' S B)))
%     (E : erase-prop A+ A)
%     (F' L)
%     <- cmp-hyp H (erase-prop/down (erase-prop/forall (E1 : {x : term S} erase-prop (B- x) (B x)))) (L : left (down (forall S B-))) 
%     <- ({hb : hyp (B T)} {lb : left (down (B- T))} cmp-hyp hb (erase-prop/down (E1 T)) lb -> cmp-affirms (D hb) E (F lb : right (affirms K A+)))
%     <- adm-forallL F (F' : left (down (forall S B-)) -> right (affirms K A+)).


- : cmp-lolli
     (init' (H : hyp (atom' P)))
     (erase-prop/atom (E : erase-atm P+ P))
     (F : left (down B-) -> right J)
     G2
     <- cmp-hyp+ H (erase-prop/atom E) (L : left (atom P+))
     <- ({l : left (down (lolli (atom P+) B-))}
	   eta- B- ([j] [lfb : lfoc B- j] downL (lolliL (init+ L) lfb) l) (G1 l : right (true B-)))
     <- ({l : left (down (lolli (atom P+) B-))}
	   cut+ (down B-) (downR (G1 l)) F (G2 l : right J)). 

- : cmp-lolli
     (tensor'R (D1 : true' A1) (D2 : true' A2))
     (erase-prop/tensor (E2 : erase-prop A2+ A2) (E1 : erase-prop A1+ A1))
     (F : left (down B-) -> right J)
     G6
     <- cmp-lolli D2 E2 F (G1 : left (down (lolli A2+ B-)) -> right J) 
     <- cmp-lolli D1 E1 G1 (G2 : left (down (lolli A1+ (lolli A2+ B-))) -> right J)
     <- ({l : left (down (lolli (tensor A1+ A2+) B-))} {rfa1 : rfoc A1+} {rfa2 : rfoc A2+}
	   eta- B- ([j] [lfb : lfoc B- j] downL (lolliL (tensorR rfa1 rfa2) lfb) l) (G3 l rfa1 rfa2 : right (true B-)))
     <- ({l : left (down (lolli (tensor A1+ A2+) B-))} {rfa1 : rfoc A1+}
	   eta+ A2+ ([rfa2 : rfoc A2+] G3 l rfa1 rfa2) (G4 l rfa1 : left A2+ -> right (true B-)))
     <- ({l : left (down (lolli (tensor A1+ A2+) B-))} {la2 : left A2+}
	   eta+ A1+ ([rfa1 : rfoc A1+] G4 l rfa1 la2) (G5 l la2 : left A1+ -> right (true B-)))
     <- ({l : left (down (lolli (tensor A1+ A2+) B-))}
	   cut+ (down (lolli A1+ (lolli A2+ B-))) (downR (lolliR ([la1 : left A1+] lolliR ([la2 : left A2+] G5 l la2 la1)))) G2 (G6 l : right J)).

- : cmp-lolli
     (tensor'L (D : hyp B1 -> hyp B2 -> true' A) (H : hyp (tensor' B1 B2)))
     (E : erase-prop A+ A)
     (F : left (down B-) -> right J)
     ([l : left (down (lolli A+ B-))] tensorL ([lb1 : left B1+] [lb2 : left B2+] G lb1 lb2 l) L)
     <- cmp-hyp H (erase-prop/tensor (E2 : erase-prop B2+ B2) (E1 : erase-prop B1+ B1)) (L : left (tensor B1+ B2+))
     <- ({hb1 : hyp B1} {lb1 : left B1+} cmp-hyp hb1 E1 lb1 
	   -> {hb2 : hyp B2} {lb2 : left B2+} cmp-hyp hb2 E2 lb2
	   -> cmp-lolli (D hb1 hb2) E F (G lb1 lb2 : left (down (lolli A+ B-)) -> right J)).

- : cmp-lolli 
     one'R
     erase-prop/one
     (F : left (down B-) -> right J)
     G2
     <- ({l : left (down (lolli one B-))}
	   eta- B- ([j] [lfb : lfoc B- j] downL (lolliL oneR lfb) l) (G1 l : right (true B-)))
     <- ({l : left (down (lolli one B-))} 
	   cut+ (down B-) (downR (G1 l)) F (G2 l : right J)).

- : cmp-lolli
     (one'L (D : true' A) (H : hyp one'))
     (E : erase-prop A+ A)
     (F : left (down B-) -> right J)
     ([l : left (down (lolli A+ B-))] oneL (G l) L)
     <- cmp-hyp H erase-prop/one (L : left one)
     <- cmp-lolli D E F (G : left (down (lolli A+ B-)) -> right J).

% - : cmp-lolli
%     (exists'R (T : term S) (D : true' (A T)))
%     (erase-prop/exists (E : {x : term S} erase-prop (A+ x) (A x)))
%     (F : left (down B-) -> right J)
%     G4
%     <- cmp-lolli D (E T) F (G1 : left (down (lolli (A+ T) B-)) -> right J) 
%     <- ({l : left (down (lolli (exists S A+) B-))} {rfa : rfoc (A+ T)}
%	   eta- B- ([j] [lfb : lfoc B- j] downL (lolliL (existsR T rfa) lfb) l) (G2 l rfa : right (true B-)))
%     <- ({l : left (down (lolli (exists S A+) B-))}
%	   eta+ (A+ T) ([rfa : rfoc (A+ T)] G2 l rfa) (G3 l : left (A+ T) -> right (true B-)))
%     <- ({l : left (down (lolli (exists S A+) B-))}
%	   cut+ (down (lolli (A+ T) B-)) (downR (lolliR ([la : left (A+ T)] G3 l la))) G1 (G4 l : right J)).

% - : cmp-lolli
%     (exists'L (D : {a : term S} hyp (B1 a) -> true' A) (H : hyp (exists' S B1)))
%     (E : erase-prop A+ A)
%     (F : left (down B-) -> right J)
%     ([l : left (down (lolli A+ B-))] existsL ([a : term S] [lb1 : left (B1+ a)] G a lb1 l) L)
%     <- cmp-hyp H (erase-prop/exists (E1 : {x : term S} erase-prop (B1+ x) (B1 x))) (L : left (exists S B1+))
%     <- ({a : term S}
%	   {hb1 : hyp (B1 a)} {lb1 : left (B1+ a)} cmp-hyp hb1 (E1 a) lb1
%	   -> cmp-lolli (D a hb1) E F (G a lb1 : left (down (lolli A+ B-)) -> right J)).

- : cmp-lolli
     (D : true' A)
     (erase-prop/down (E : erase-prop A- A))
     (F : left (down B-) -> right J)
     G3
     <- cmp-conc D (erase-judgment/true E) (G1 : right (true A-))
     <- ({l : left (down (lolli (down A-) B-))}
	   eta- B- ([j] [lfb : lfoc B- j] downL (lolliL (downR G1) lfb) l) (G2 l : right (true B-)))
     <- ({l : left (down (lolli (down A-) B-))}
	   cut+ (down B-) (downR (G2 l)) F (G3 l : right J)).

- : cmp-lolli
     (lolli'L (D1 : true' B1) (D2 : hyp B2 -> true' A) (H : hyp (lolli' B1 B2)))
     (E : erase-prop A+ A)
     (F : left (down B-) -> right J)
     ([l : left (down (lolli A+ B-))] G2 l L)
     <- cmp-hyp H (erase-prop/down (erase-prop/lolli (E2 : erase-prop B2- B2) (E1 : erase-prop B1+ B1))) (L : left (down (lolli B1+ B2-)))
     <- ({hb2 : hyp B2} {lb2 : left (down B2-)} cmp-hyp hb2 (erase-prop/down E2) lb2 
	   -> cmp-lolli (D2 hb2) E F (G1 lb2 : left (down (lolli A+ B-)) -> right J))
     <- ({l : left (down (lolli A+ B-))}
	   cmp-lolli D1 E1 ([lb2 : left (down B2-)] G1 lb2 l) (G2 l : left (down (lolli B1+ B2-)) -> right J)).

% - : cmp-lolli
%     (forall'L (T : term S) (D : hyp (B1 T) -> true' A) (H : hyp (forall' S B1)))
%     (E : erase-prop A+ A)
%     (F : left (down B-) -> right J)
%     ([l : left (down (lolli A+ B-))] G2 l L)
%     <- cmp-hyp H (erase-prop/down (erase-prop/forall (E1 : {x : term S} erase-prop (B1- x) (B1 x)))) (L : left (down (forall S B1-))) 
%     <- ({hb1 : hyp (B1 T)} {lb1 : left (down (B1- T))} cmp-hyp hb1 (erase-prop/down (E1 T)) lb1
%	   -> cmp-lolli (D hb1) E F (G1 lb1 : left (down (lolli A+ B-)) -> right J))
%     <- ({l : left (down (lolli A+ B-))}
%	   adm-forallL ([lb1 : left (down (B1- T))] G1 lb1 l) (G2 l : left (down (forall S B1-)) -> right J)).



%block cmp-hyp-block : some {A : prop'} {A+ : prop pos} {E : erase-prop A+ A}
		       block {h : hyp A} {l : left A+} {cmp-hyp/h : cmp-hyp h E l}.
%worlds (sort-block | term-block | erase-atm-block | cmp-hyp-block | rfoc-block | left-block)
        (cmp-conc _ _ _)
        (cmp-lax _ _ _)
        (cmp-affirms _ _ _)
        (cmp-lolli _ _ _ _)
        (cmp-hyp _ _ _)
        (cmp-hyp+ _ _ _).

%total (D1 D2 D3 D4 H5 H6)
       (cmp-conc D1 _ _)
       (cmp-lax D2 _ _)
       (cmp-affirms D3 _ _)
       (cmp-lolli D4 _ _ _)
       (cmp-hyp H5 _ _)
       (cmp-hyp+ H6 _ _).