PTQ-0.0.5: src/Translation.hs
-----------------------------------------------------------------------------
-- |
-- Module : Translation
-- Copyright : (c) Masahiro Sakai 2007-2009
-- License : BSD3-style (see LICENSE)
--
-- Maintainer: masahiro.sakai@gmail.com
-- Stability : experimental
-- Portability : non-portable
{-# LANGUAGE TypeOperators, GADTs, TypeSynonymInstances, ScopedTypeVariables #-}
module Translation (translate, catToType) where
import IL
import P
-----------------------------------------------------------------------------
{-
-- 範疇から型への対応
type family Translate x
type instance Translate Sen = Prop
type instance Translate IV = E -> Prop
type instance Translate CN = E -> Prop
type instance Translate Adj = E -> Prop
type instance Translate (a :/ b) = ((S -> Translate b) -> Translate a)
type instance Translate (a :// b) = ((S -> Translate b) -> Translate a)
-}
catToType :: Cat c -> Type
catToType Sen = Prop
catToType IV = E :-> Prop
catToType CN = E :-> Prop
catToType Adj = E :-> Prop -- これで本当にあっている?
catToType (a :/ b) = (S (catToType b)) :-> catToType a
catToType (a :// b) = (S (catToType b)) :-> catToType a
-----------------------------------------------------------------------------
translate :: forall c. P c -> Expr
--- 1. αがgの定義域にあれば,α は,g(α) に翻訳される.
-- 最後に
--- 2. be → λp.λx. p{f^λy.[x = y]}.
--- ここで,変数pのタイプは<s, <<s, <e, t>>, t>>.
translate (B (IV :/ (Sen :/ IV)){- TV -} "be") =
lambda p $ lambda x $
FVar p <@> int (lambda y $ Op2 Id (FVar x) (FVar y))
where
p = ("p", S (S (E :-> Prop) :-> Prop))
x = ("x", E)
y = ("y", E)
--- 3. necessarily → λp[□ext p]. ここで,p のタイプは<s, t>とする.
translate (B (Sen :/ Sen) "necessarily") = lambda p $ Op1 Box (ext (FVar p))
where
p = ("p", S Prop)
--- 4. j, m, b はタイプがe の定数記号,変数P のタイプは<s, <e, t>>とする.
translate (B (Sen :/ IV){- T -} x) = lambda p $ FVar p <@> Const (x, E)
where
p = ("p", S (catToType IV))
--- 5. he_n → λP. P {x_n}.x_ はタイプe の変数.
translate (He n) = lambda p $ FVar p <@> FVar (xn n)
where
p = ("p", S (E :-> Prop))
translate (F2 delta zeta) = trApp delta zeta -- T2
translate (F3 n zeta phi) = -- T3
lambda (xn n) $ Op2 And (translate zeta :@ FVar (xn n)) (translate phi)
translate (F4 alpha delta) = trApp alpha delta -- T4
translate (F5 delta beta) = trApp delta beta -- T5
-- T6 (T5と同じなので省略)
translate (F16 delta phi) = trApp delta phi -- T7
translate (F17 delta beta) = trApp' delta beta -- T8
translate (F6 delta beta) = trApp delta beta -- T9
translate (F7 delta beta) = trApp delta beta -- T10
translate (F8 phi psi) =
case cat :: Cat c of
Sen -> Op2 And (translate phi) (translate psi) -- T11a
IV -> lambda x $ Op2 And (translate phi :@ FVar x) (translate psi :@ FVar x) -- T12a
where
x = ("x", E)
translate (F9 phi psi) =
case cat :: Cat c of
Sen -> Op2 Or (translate phi) (translate psi) -- T11b
IV -> lambda x $ Op2 Or (translate phi :@ FVar x) (translate psi :@ FVar x) -- T12b
where x = ("x", E)
Sen :/ IV -> lambda p $ Op2 Or (translate phi :@ FVar p) (translate psi :@ FVar p) -- T13
where p = ("P", S (E :-> Prop))
-- T14 (講義資料はx_nになるべきところがxになっている)
translate (F10 n alpha phi) =
case cat :: Cat c of
Sen -> translate alpha :@ (int $ lambda (xn n) (translate phi)) -- T14
CN -> lambda y $ translate alpha :@ int (lambda (xn n) (translate phi :@ FVar y)) -- T15
IV -> lambda y $ translate alpha :@ int (lambda (xn n) (translate phi :@ FVar y)) -- T16
where
y = ("y", E)
-- T17
translate (F11 alpha delta) = Op1 Not $ trApp alpha delta
translate (F12 alpha delta) = Op1 F $ trApp alpha delta
translate (F13 alpha delta) = Op1 Not $ Op1 F $ trApp alpha delta
translate (F14 alpha delta) = Op1 H $ trApp alpha delta
translate (F15 alpha delta) = Op1 Not $ Op1 H $ trApp alpha delta
-- T18 (beの扱い以外はT9と同じ)
translate (B (IV :/ Adj) "be") = lambda p $ lambda x $ FVar p <@> FVar x
where
p = ("P", S (E :-> Prop))
x = ("x", E)
-- T19
translate (F19 delta) =
lambda x $ exists y $
translate delta :@ int (lambda p (FVar p <@> FVar y)) :@ FVar x
where
x = ("x", E)
p = ("P", S (E :-> Prop))
y = ("y", E)
translate (F20 delta beta) = trApp delta beta -- T20
translate (F21 delta beta) = trApp delta beta -- T21 (講義資料ではF20を誤って使っている)
-- T22
translate (F22 delta) =
lambda p $ lambda q $ lambda x $
translate delta :@ FVar q :@ FVar p :@ FVar x
where
p = ("P", S (catToType (cat :: Cat T)))
q = ("Q", S (catToType (cat :: Cat T)))
x = ("x", E)
translate (F23 alpha delta) = trApp alpha delta -- T23
translate (F24 alpha beta) = trApp alpha beta -- T24
-- 講義資料のByの解釈は誤り? (型が一致しない)
translate (B (IV :/ (IV :/ (Sen :/ IV)) :/ (Sen :/ IV)){- PP/T -} "by") =
lambda p $ lambda r $ lambda x $
FVar p <@>
(int $ lambda y $ FVar r <@> int (lambda q $ FVar q <@> FVar x) :@ FVar y)
where
p = ("P", S (catToType (Sen :/ IV)))
r = ("R", S (catToType (IV :/ (Sen :/ IV))))
x = ("x", E)
y = ("y", E)
q = ("Q", S (catToType IV))
-- T25
translate (F25 delta) =
lambda x $ exists y $ Op1 H $
translate delta :@
int (lambda p $ FVar p <@> FVar x) :@
(FVar y)
where
x = ("x", E)
y = ("y", E)
p = ("P", S (catToType IV))
-- Det
translate (B (Sen :/ IV :/ CN) s) =
case s of
"a" ->
lambda p $ lambda q $ exists x $
Op2 And (FVar p <@> FVar x) (FVar q <@> FVar x)
"the" ->
lambda p $ lambda q $ exists y $
Op2 And
(forall x $ Op2 Equiv (FVar p <@> FVar x) (Op2 Id (FVar x) (FVar y)))
(FVar q <@> FVar y)
"every" ->
lambda p $ lambda q $ forall x $
Op2 Imply (FVar p <@> FVar x) (FVar q <@> FVar x)
"no" ->
lambda p $ lambda q $ forall x $
Op1 Not (Op2 And (FVar p <@> FVar x) (FVar q <@> FVar x))
_ -> Const (s, catToType (cat :: Cat Det))
where
p = ("p", S (E :-> Prop))
q = ("q", S (E :-> Prop))
x = ("x", E)
y = ("y", E)
-- それ以外
translate (B c x) = Const (x, catToType c)
-- ユーティリティ
trApp :: P (b :/ a) -> P a -> Expr
trApp f a = translate f :@ (int (translate a))
trApp' :: P (b :// a) -> P a -> Expr
trApp' f a = translate f :@ (int (translate a))
xn :: Int -> Name
xn n = ("he_"++show n, E)