PTQ-0.0.4: 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) where
import Expr
import P
-----------------------------------------------------------------------------
-- Exprも型付きにしたいなぁ
{-
data E -- e
data S -- s
data Prop -- t
-- 関数型はHaskellの -> をそのまま使う
-- 範疇から型への対応
type family Translate x
type instance Translate Sen = Prop
type instance Translate IV = E -> Prop
type instance Translate CN = E -> Prop
type instance Translate (a :/ b) = ((S -> Translate b) -> Translate a)
type instance Translate (a :// b) = ((S -> Translate b) -> Translate 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"))
--- 3. necessarily → λp[□ext p]. ここで,p のタイプは<s, t>とする.
translate (B (Sen :/ Sen) "necessarily") = lambda "p" $ Op1 Box (ext (FVar "p"))
--- 4. j, m, b はタイプがe の定数記号,変数P のタイプは<s, <e, t>>とする.
translate (B (Sen :/ IV){- T -} x) = lambda "p" $ FVar "p" <@> Const x
--- 5. he_n → λP. P {x_n}.x_ はタイプe の変数.
translate (He n) = lambda "p" $ FVar "p" <@> FVar (xn n)
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 f8 :: 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
translate (F9 phi psi) =
case f9 :: 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
Sen :/ IV -> lambda "P" $ Op2 Or (translate phi :@ FVar "P") (translate psi :@ FVar "P") -- T13
-- T14 (講義資料はx_nになるべきところがxになっている)
translate (F10 n alpha phi) =
case f10 :: 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
-- 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"
-- T19
translate (F19 delta) =
lambda "x" $ exists "y" $
translate delta :@
int (lambda "P" (FVar "P" <@> FVar "y")) :@
FVar "x"
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"
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")
-- T25
translate (F25 delta) =
lambda "x" $ exists "y" $ Op1 H $
translate delta :@
int (lambda "P" $ FVar "P" <@> FVar "x") :@
(FVar "y")
-- 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" $ forall "x" $
Op2 And
(Op2 Equiv (FVar "p" <@> FVar "x") (Op2 Id (FVar "x") (FVar "y")))
(FVar "q" <@> FVar "x")
"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
-- それ以外
translate (B _ x) = Const x
-- ユーティリティ
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