packages feed

derivation-trees-0.7.2: Main.hs

{-# LANGUAGE RecordWildCards, DisambiguateRecordFields #-}
import Prelude hiding (abs)
import DerivationTrees
import DerivationTrees.Basics
import DerivationTrees.CPTS


translateE :: [Binding] -> [Binding]
translateE = concatMap translateB

translateJ (Jug v t e) = Jug (translate v) (translate t $$ Many v) (translateE e)

translateB :: Binding -> [Binding]
translateB (V x :- a) = [(V ("\\subR " ++ x) :- (translate a $$ Many (var x))), Mult (V x :- a)]
translateB (Base (x)) = [Base ("\\trans " ++ x)]

translate :: Term -> Term
translate (Var x) = Var ("\\subR " ++ x) 
translate (Con x) = Con ("\\trans " ++ x) 
translate (Sor s) = (lam (Mult (V "A" :- Sor s)) ((Many $ var "A") --> Sor ('~':s)))

translate (App k f a) = App (k++"_m") (App (k++"_i") (translate f) (Many a)) (translate a)
translate (Lam k a b) = Lam (k++"_i") w $
                        Lam (k++"_m") w' $
                        translate b        
   where [w',w] = translateB a
translate (Sub t (V x :- a)) = Sub (Sub (translate t) w) w'
    where w  = Mult (V x :- a)
          w' = V ("\\subR " ++ x) :- translate a
translate t@(Pi k a@(V x :- _) b) 
   = lam (Mult (V "f" :- t)) $
     Pi (k++"_i") w $
     Pi (k++"_m") w' $
     (translate b $$ Many (App k (var "f") (var x)))
   where [w',w] = translateB a




pr0 = Pr ""

axiomJ = translateJ (Jug (Sor "s") (Sor "t") [])
       where a = V "A"
             a' = Many $ var "A"


axiomT = Co "~u" (Many (Sor "s") --> Sor "~t")
          (Ab "~u" 
              (pr0 ("s","~t")
                  (St "t" Ax)
                  (wk "t" Ax Ax))
              
              (pr0 ("t","~u")
                  Ax
                  Ax))          
          (delay CenterA 4 $ Ap (Mult (Unbound :- Sor "t")) 
              (Ab "~v" 
                  (pr0 ("t","~u")
                      (St "u" Ax)
                      (wk "u" Ax Ax))
                  (pr0 ("u","~v") Ax Ax))
                    
              Ax)

ind' = halt "ind'"
ind = halt "ind"
lem = halt "lem"
gamma = [Base "\\Gamma"]

startJ = translateJ $ Jug (Var "x") (Con "A") [V "x" :- Con "A" ,Base ("\\Gamma")]
startT = St "~s" (Ap (Mult (Unbound :- Con "A"))
                     (wk "s~" ind' lem)
                     (St "s" lem))

weakJ = translateJ $ Jug (Con "A") (Con "B") [V "x" :- Con "C" ,Base ("\\Gamma")]
weakT = wk "~s" 
           (wk "s" 
               ind
               lem)
           (Ap (Mult (Unbound :- Con "C"))
               (wk "s" ind' lem) 
               (St "s" lem))

protoPi = (Pi "k" (V "x" :- Con "A") (Con "B"))
protoLam = (Lam "k" (V "x" :- Con "A") (Con "b"))

prodJ = translateJ $ Jug protoPi (Sor "s_3") gamma
prodT = Co "~t_3" (Many protoPi --> Sor "~s_3") 
          (dL $ 
           Ab "~t_3"
             (dL $ Pr "k_i" ("s_1","~s_3") 
                 (wk "s_3" lem lem)
                 (dR $ Pr "k_m" ("~s_1","~s_2") 
                      (detach "1" 31 $ Ap (Mult (Unbound :- Con "A")) 
                          (dL $ wk "s_1" 
                              (wk "s_3"
                                 ind'
                                 lem)
                              lem)
                          (St "s_1" 
                             (named "(2)" $ wk "s_3"
                                             lem
                                             lem))
                          )
                      (wk "~s_1" 
                       (dL $ Ap (Mult (Unbound :- Con "B")) 
                          (wk "s_1" 
                              (wk "s_3"
                                 ind'
                                 lem)
                              lem)
                          (dR $ Ap (Mult (V "x" :- Con "A")) 
                              (dC $wk "s_1" 
                                      (St "s_3" 
                                          lem) 
                                      (halt "(2)")) 
                              (St "s_1" (halt "(2)")))
                          )
                       (halt "(1)"))
                 ))
             (pr0 ("s_3","~t_3") lem Ax)
          )
          (Ap (Mult (Unbound :- Sor "s_3")) 
              (dL $ Ab "~u_3" 
                  (pr0 ("s_3","~t_3")
                    (St "t_3" Ax)
                    (wk "t_3" Ax Ax))
                  (pr0 ("t_3", "~u_3") 
                   Ax
                   Ax))
              (halt "lem"))

{-
subst x a b = 

nf (App _ (Lam _ (Mult (V x :- _)) b) a) = subst x a b

-}




applJ = translateJ $ Jug (App "k" (Con "F") (Con "a")) (Sub (Con "B") (V "x" :- Con "a")) gamma
applT = (Ap (V "\\subR x" :- (translate (Con "A") $$ (Many $ Con "a"))) 
            (Ap (Mult (V "x" :- Con "A"))
                (dL $ Co "~s_B" (translate protoPi) 
                  (dL $ ind)
                  (Pr "k_i" ("s_A","~s_B") 
                      (lem)
                      (Pr "k_m" ("~s_A","~s_B") 
                          (dL $ named "(1)" $ wk "s_A"
                                  (Ap (Mult (Unbound :- Con "A")) (ind') (lem))
                                  lem)
                          (wk "~s_A" 
                              (Ap (Mult (Unbound :- Con "B")) 
                                      (wk "s_A" 
                                       (ind')
                                       (lem)) 
                                      (dC $ Ap (Mult (V "x" :- Con "A")) 
                                              (wk "s_A" lem lem) 
                                              (St "s_A" lem)))
                              (halt "(1)")
                          ))
                   ))
                lem) 
            ind)

abstJ = translateJ $ Jug protoLam protoPi gamma
abstT = Co "~s" (Pi "k_i" (Mult ((:-) (V "x") (Con "A"))) (Pi "k_m" ((:-) (V "\\subR x") (App "" (Con "\\trans A") (Many (Var "x")))) (App "" (Con "\\trans B") (Many $ Con "b"))))
           (dL $ Ab "~s"
             (dL $ Ab "~s"
                 (wk "~s_A" 
                     (wk "s_A" ind lem)
                     (halt "(1)"))
                 (dR $ named "(3)" $ 
                  Pr "k_m" ("~s_A","~s")
                     (named "(1)" $ Ap (Mult (Unbound :- Con "A"))
                         (wk "s_A" ind' lem)
                         (St "s_A" lem))
                     (dR $ wk "~s_A" 
                         (wk "s_A" 
                             (Ap (Mult (Unbound :- Con "B"))
                                 ind'
                                 lem) 
                             lem) 
                         (halt "(1)"))
                  )
                 )
             (Pr "k_i" ("s_A","~s") 
                     lem
                     (halt ("(3)"))))
           (detach "S" 51 $ Ap (Mult (V "f" :- protoPi))
               (dL $ Ab "~t"
                    (dL $ Pr "k_i" ("s_A","~s") 
                        (wk "s" lem lem) 
                        (dR $ Pr "k_m" ("~s_A","~s") 
                            (named "(2)" $ Wk 1 "s" 
                               (halt "(1)") 
                               (wk "s_A" lem lem))
                            (dR $ wk "~s_A" 
                               (dL $ Ap (Mult (Unbound :- Con "B")) 
                                   (wk "s_A" 
                                    (wk "~s"
                                      ind'
                                      lem)
                                    -- (wk "s" lem lem)
                                    (named "(4)" $ wk "s" lem lem)
                                   ) 
                                   (dR $ Ap (Mult (V "x" :- Con "A"))
                                       (dC $ wk "s_A" 
                                           (St "s" lem) 
                                           (halt "(4)")
                                       )
                                       (St "s_A" (halt "(4)"))
                                       ))
                               (halt "(2)"))))
                    (pr0 ("s","~t") lem 
                         (wk "s" Ax lem)))
               lem)

convJ = translateJ $ Jug (Con "A") (Con "B'") gamma
convT = Co "~s" (translate (Con "B") $$ (Many $ Con "A"))
          ind
          (Ap (Mult (Unbound :- Con "B'"))
               ind'
               lem)

main = writeFile "AbsProof.mp" $ unlines $ compile [Figure 0 (interp axiomT axiomJ),
                                 Figure 1 (interp startT startJ),
                                 Figure 2 (interp weakT weakJ),
                                 Figure 3 (interp prodT prodJ),
                                 Figure 4 (interp applT applJ),
                                 Figure 5 (interp abstT abstJ),
                                 Figure 6 (interp convT convJ)
                                ]