initial
This commit is contained in:
commit
e2914d0ae8
12
Base.hs
Normal file
12
Base.hs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
module Base (
|
||||||
|
Ind,
|
||||||
|
Wordform,
|
||||||
|
Arc (Head,Dep)
|
||||||
|
) where
|
||||||
|
|
||||||
|
type Ind = Int
|
||||||
|
type Wordform = String
|
||||||
|
data Arc τ = Head { role :: τ, dst :: Ind }
|
||||||
|
| Dep { role :: τ, dst :: Ind }
|
||||||
|
deriving (Show,Eq,Ord)
|
||||||
|
|
42
FDP1.hs
Normal file
42
FDP1.hs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{-# LANGUAGE TypeSynonymInstances #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
|
||||||
|
module Main (
|
||||||
|
module ParserW,
|
||||||
|
module Parse,
|
||||||
|
module Step,
|
||||||
|
module G1,
|
||||||
|
module PoliMorf,
|
||||||
|
module Data.ADTTag.IPITag.PoliMorf,
|
||||||
|
module PL1,
|
||||||
|
main
|
||||||
|
) where
|
||||||
|
|
||||||
|
|
||||||
|
import ParserW
|
||||||
|
import Parse
|
||||||
|
import Step
|
||||||
|
import G1
|
||||||
|
import Data.ADTTag.IPITag.PoliMorf
|
||||||
|
import PoliMorf
|
||||||
|
import PL1
|
||||||
|
import Weighted
|
||||||
|
|
||||||
|
instance Show (WeightedList IPITag) where
|
||||||
|
show = show . runWeightedT
|
||||||
|
|
||||||
|
main = do
|
||||||
|
pm <- readPoliMorfHead1 200000 "pm.sorted.uniq.tsv"
|
||||||
|
let l = length (parse' pm pl1' "dom" :: WeightedList (Parse Role (WeightedList IPITag)))
|
||||||
|
putStrLn $ "READY (" ++ show l ++ ")"
|
||||||
|
input <- getLine
|
||||||
|
let WeightedT parses = parseA' pm pl1' input :: WeightedList (Parse Role (WeightedList IPITag))
|
||||||
|
parselist = zip [1..] parses
|
||||||
|
-- sequence_ $ map (\(n,p) -> do
|
||||||
|
-- putStrLn $ "*** [" ++ show n ++ "] ***"
|
||||||
|
-- putStrLn $ show p
|
||||||
|
-- ) parselist
|
||||||
|
|
||||||
|
putStrLn $ "PARSES: " ++ show (length parselist)
|
||||||
|
putStrLn $ "COMPLE: " ++ show (length (filter ((== 1) . trees . bare . snd) parselist))
|
||||||
|
|
55
G1.hs
Normal file
55
G1.hs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
{-# LANGUAGE MonadComprehensions #-}
|
||||||
|
|
||||||
|
{-# LANGUAGE InstanceSigs #-}
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
|
||||||
|
module G1 (
|
||||||
|
module Grammar,
|
||||||
|
G1 (G1),
|
||||||
|
G1' (G1'),
|
||||||
|
links,
|
||||||
|
links',
|
||||||
|
gcs,
|
||||||
|
obl,
|
||||||
|
gcs',
|
||||||
|
obl',
|
||||||
|
LINK (LINK),
|
||||||
|
LINK' (LINK'),
|
||||||
|
OBL (OBL),
|
||||||
|
)where
|
||||||
|
|
||||||
|
import Control.Monad.Plus
|
||||||
|
import Control.Monad.Trans.State
|
||||||
|
import Grammar
|
||||||
|
import Node
|
||||||
|
import Weighted
|
||||||
|
import Prelude.Unicode
|
||||||
|
-- import Data.Foldable
|
||||||
|
|
||||||
|
data G1 τ κ = G1 { links :: WeightedT [] (LINK τ κ), gcs :: [Constraint τ κ], obl :: [OBL τ κ] }
|
||||||
|
|
||||||
|
instance (Eq τ) => Grammar (WeightedT []) τ κ (G1 τ κ) where
|
||||||
|
link g h d = [ (r, gcs g ++ cs) | LINK r p q cs <- links g, p h, q d ]
|
||||||
|
-- sat :: G1 τ κ -> Node τ κ -> Bool
|
||||||
|
-- sat g n = and [ r ∈ (roles n) | OBL p rs <- obl g, p (cat n), r <- rs ]
|
||||||
|
-- pass :: Grammar (WeightedT []) τ κ x => x -> Node τ κ -> Bool
|
||||||
|
-- pass g n = and [ sat g x | x <- preds n ]
|
||||||
|
pass g = all (sat g) . (pure <> preds)
|
||||||
|
where
|
||||||
|
sat g n = and [ r ∈ (roles n) | OBL p rs <- obl g, p (cat n), r <- rs ]
|
||||||
|
|
||||||
|
data G1' τ κ = G1' { links' :: WeightedT [] (LINK' τ κ), gcs' :: [Constraint' (WeightedT []) τ κ], obl' :: [OBL τ κ] }
|
||||||
|
|
||||||
|
instance (Eq τ) => Grammar' (WeightedT []) τ κ (G1' τ κ) where
|
||||||
|
link' g hs ds = [ (r, gcs' g ++ cs) | LINK' r p q cs <- links' g, any p hs, any q ds ]
|
||||||
|
-- sat' g n = and [ r ∈ (roles n) | OBL p rs <- obl' g, c <- (cat n), p c, r <- rs ]
|
||||||
|
|
||||||
|
|
||||||
|
-- instance (Eq τ, Eq κ) => Grammar (StateT Int (WeightedT [])) τ κ (G1 τ κ) where
|
||||||
|
-- link g h d = [ (r, gcs g ++ cs) | f <- links g, LINK r p q cs ← evalState f, p h, q d ]
|
||||||
|
|
||||||
|
data LINK τ κ = LINK τ (κ -> Bool) (κ -> Bool) [Constraint τ κ]
|
||||||
|
data LINK' τ κ = LINK' τ (κ -> Bool) (κ -> Bool) [Constraint' (WeightedT []) τ κ]
|
||||||
|
data OBL τ κ = OBL (κ -> Bool) [τ]
|
66
Grammar.hs
Normal file
66
Grammar.hs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
{-# LANGUAGE MonadComprehensions #-}
|
||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
|
||||||
|
module Grammar where
|
||||||
|
|
||||||
|
import Control.Monad
|
||||||
|
import Control.Monad.Plus
|
||||||
|
import Control.Applicative
|
||||||
|
import Data.List
|
||||||
|
-- import Data.Monoid
|
||||||
|
-- import Control.Monad.Unicode
|
||||||
|
import Node
|
||||||
|
-- import Weighted
|
||||||
|
|
||||||
|
type Constraint τ κ = (τ, Node τ κ, Node τ κ) -> Bool
|
||||||
|
|
||||||
|
class (MonadPlus m, Eq τ {- , Eq κ -}) => Grammar m τ κ γ where
|
||||||
|
|
||||||
|
heads :: γ -> Node τ κ -> m (τ, Node τ κ)
|
||||||
|
heads g n = [ (r,h) | h <- visible g n,
|
||||||
|
(r,cs) <- link g (cat h) (cat n),
|
||||||
|
all ($ (r,h,n)) cs ]
|
||||||
|
|
||||||
|
deps :: γ -> Node τ κ -> m (τ, Node τ κ)
|
||||||
|
deps g n = [ (r,d) | d <- visible g n,
|
||||||
|
(r,cs) <- link g (cat n) (cat d),
|
||||||
|
all ($ (r,n,d)) cs ]
|
||||||
|
|
||||||
|
visible :: γ -> Node τ κ -> m (Node τ κ)
|
||||||
|
visible _ = mfromList . lv
|
||||||
|
|
||||||
|
-- sat :: Grammar m τ κ γ => γ -> Node τ κ -> Bool
|
||||||
|
-- sat = const . const True
|
||||||
|
|
||||||
|
pass :: γ -> Node τ κ -> Bool
|
||||||
|
pass = const . const True
|
||||||
|
-- pass g n = sat g n --all (sat g) ((preds<>pure) n)
|
||||||
|
|
||||||
|
link :: γ -> κ -> κ -> m (τ, [Constraint τ κ])
|
||||||
|
|
||||||
|
|
||||||
|
type Constraint' m τ κ = (τ, Node τ (m κ), Node τ (m κ)) -> Bool
|
||||||
|
|
||||||
|
class (MonadPlus m, Eq τ) => Grammar' m τ κ γ where
|
||||||
|
|
||||||
|
heads' :: γ -> Node τ (m κ) -> m (τ, Node τ (m κ))
|
||||||
|
heads' g n = [ (r,h) | h <- visible' g n,
|
||||||
|
(r,cs) <- link' g (cat h) (cat n),
|
||||||
|
all ($ (r,h,n)) cs ]
|
||||||
|
|
||||||
|
deps' :: γ -> Node τ (m κ) -> m (τ, Node τ (m κ))
|
||||||
|
deps' g n = [ (r,d) | d <- visible' g n,
|
||||||
|
(r,cs) <- link' g (cat n) (cat d),
|
||||||
|
all ($ (r,n,d)) cs ]
|
||||||
|
|
||||||
|
visible' :: γ -> Node τ (m κ) -> m (Node τ (m κ))
|
||||||
|
visible' _ = mfromList . lv
|
||||||
|
|
||||||
|
sat' :: γ -> Node τ (m κ) -> Bool
|
||||||
|
sat' = const . const True
|
||||||
|
|
||||||
|
pass' :: γ -> Node τ (m κ) -> Bool
|
||||||
|
pass' = const . const True
|
||||||
|
|
||||||
|
link' :: γ -> m κ -> m κ -> m (τ, [Constraint' m τ κ])
|
||||||
|
|
10
Lexicon.hs
Normal file
10
Lexicon.hs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
|
||||||
|
module Lexicon (Lexicon,dic)
|
||||||
|
where
|
||||||
|
|
||||||
|
import Control.Monad.Plus
|
||||||
|
|
||||||
|
|
||||||
|
class (MonadPlus m) => Lexicon m a d where
|
||||||
|
dic :: d -> String -> m a
|
116
Node.hs
Normal file
116
Node.hs
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
{-# LANGUAGE MonadComprehensions #-}
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
|
||||||
|
module Node
|
||||||
|
(Node (Node),
|
||||||
|
module Toolbox,
|
||||||
|
module Step,
|
||||||
|
dArcs,hArc,ind, cat,
|
||||||
|
cats,
|
||||||
|
preds,succs,
|
||||||
|
lng,rng,ng,ldp,rdp,dp,lhd,rhd,hd,lmdp,rmdp,lv,le,
|
||||||
|
lhdBy,
|
||||||
|
up,down,root,roots,
|
||||||
|
roles,leftRoles,rightRoles,
|
||||||
|
headless,
|
||||||
|
lastNode)
|
||||||
|
where
|
||||||
|
|
||||||
|
|
||||||
|
import Control.Monad
|
||||||
|
-- import Data.Monoid
|
||||||
|
import Data.List (intercalate,intersperse,find)
|
||||||
|
import Data.Maybe (maybeToList)
|
||||||
|
import Toolbox
|
||||||
|
import Step
|
||||||
|
import Parse
|
||||||
|
import Base
|
||||||
|
|
||||||
|
data Node τ κ = Node {past :: [Step τ κ], future :: [Step τ κ]} -- deriving (Eq)
|
||||||
|
instance {- (Eq τ, Eq κ) => -} Eq (Node τ κ) where
|
||||||
|
n₁ == n₂ = (ind n₁) == (ind n₂)
|
||||||
|
instance {- (Eq τ, Eq κ) => -} Ord (Node τ κ) where
|
||||||
|
compare n₁ n₂ = compare (ind n₁) (ind n₂)
|
||||||
|
|
||||||
|
ind :: Node τ κ -> Ind
|
||||||
|
ind (Node (Step i _ _ _ : _) _) = i
|
||||||
|
|
||||||
|
cat :: Node τ κ -> κ
|
||||||
|
cat (Node (Step _ c _ _ : _) _) = c
|
||||||
|
|
||||||
|
cats = map cat
|
||||||
|
|
||||||
|
hArc, dArcs :: Node τ κ -> [Arc τ]
|
||||||
|
hArc (Node (Step _ _ h _ : _) _) = h
|
||||||
|
dArcs (Node (Step _ _ _ d : _) _) = d
|
||||||
|
|
||||||
|
lastNode :: Parse τ κ -> Node τ κ
|
||||||
|
lastNode p = Node p []
|
||||||
|
|
||||||
|
|
||||||
|
lng, rng :: Node τ κ -> [Node τ κ]
|
||||||
|
|
||||||
|
lng (Node (s:s':p) q) = return (Node (s':p) (s:q))
|
||||||
|
lng _ = mzero
|
||||||
|
|
||||||
|
rng (Node p (s:q)) = return (Node (s:p) q)
|
||||||
|
rng _ = mzero
|
||||||
|
|
||||||
|
ng, preds, succs :: Node τ κ -> [Node τ κ]
|
||||||
|
ng = lng <> rng
|
||||||
|
|
||||||
|
|
||||||
|
preds (Node (s:s':p) q) = let prev = (Node (s':p) (s:q)) in (Node (s':p) (s:q)) : preds prev
|
||||||
|
preds _ = []
|
||||||
|
-- preds = clo lng
|
||||||
|
succs = clo rng
|
||||||
|
|
||||||
|
lhd, rhd, hd, ldp, rdp, dp, le, lv, lmdp, rmdp, down, up, root, roots :: (Ord (Node τ κ)) => Node τ κ -> [Node τ κ]
|
||||||
|
|
||||||
|
ldp n = [ n' | n' <- preds n, Dep _ i <- dArcs n, ind n' == i ]
|
||||||
|
rdp n = [ n' | n' <- succs n, Head _ i <- hArc n', ind n == i ]
|
||||||
|
dp = ldp <> rdp
|
||||||
|
|
||||||
|
lhd v = [ v' | Head _ i <- hArc v, v' <- preds v, ind v' == i ]
|
||||||
|
rhd v = [ v' | v' <- succs v, Dep _ i <- dArcs v', ind v == i ]
|
||||||
|
hd = lhd <> rhd
|
||||||
|
|
||||||
|
ldpBy,rdpBy,dpBy :: (Ord (Node τ κ)) => τ -> Node τ κ -> [Node τ κ]
|
||||||
|
ldpBy r n = [ n' | n' <- preds n, Dep r i <- dArcs n, ind n' == i ]
|
||||||
|
rdpBy r n = [ n' | n' <- succs n, Head r i <- hArc n', ind n == i ]
|
||||||
|
dpBy r = ldpBy r <> rdpBy r
|
||||||
|
|
||||||
|
lhdBy,rhdBy,hdBy :: (Ord (Node τ κ)) => τ -> Node τ κ -> [Node τ κ]
|
||||||
|
lhdBy r n = [ n' | n' <- preds n, Head r i <- hArc n , ind n' == i ]
|
||||||
|
rhdBy r n = [ n' | n' <- succs n, Dep r i <- dArcs n', ind n == i ]
|
||||||
|
hdBy r = lhdBy r <> rhdBy r
|
||||||
|
|
||||||
|
|
||||||
|
le = mrclo lmdp
|
||||||
|
|
||||||
|
lmdp = just minimum . ldp
|
||||||
|
rmdp = just maximum . rdp
|
||||||
|
|
||||||
|
lv = mrclo lmdp >=> lng >=> rclo lhd
|
||||||
|
|
||||||
|
down = clo dp
|
||||||
|
up = clo hd
|
||||||
|
|
||||||
|
root = mrclo hd
|
||||||
|
roots = (filter headless) . preds
|
||||||
|
|
||||||
|
headless :: (Ord (Node τ κ)) => Node τ κ -> Bool
|
||||||
|
headless = null . hd
|
||||||
|
-- roots = preds |? headless
|
||||||
|
|
||||||
|
roles, leftRoles, rightRoles :: Node τ κ -> [τ]
|
||||||
|
roles = leftRoles <> rightRoles
|
||||||
|
leftRoles v = [ r | Dep r _ <- dArcs v ]
|
||||||
|
rightRoles v = [ r | v' <- succs v, Head r i <- hArc v', i==ind v ]
|
||||||
|
|
||||||
|
|
||||||
|
instance (Show τ, Show κ) => Show (Node τ κ) where
|
||||||
|
show (Node p q) = showSteps p ++ " @ " ++ showStepsRev q ++ "\n"
|
||||||
|
where
|
||||||
|
showStepsRev = intercalate " * " . map show
|
||||||
|
showSteps = showStepsRev . reverse
|
173
PL1.hs
Normal file
173
PL1.hs
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
{-# LANGUAGE MonadComprehensions #-}
|
||||||
|
|
||||||
|
module PL1 where
|
||||||
|
|
||||||
|
import G1
|
||||||
|
import Data.ADTTag
|
||||||
|
import Data.ADTTag.IPITag
|
||||||
|
import Control.Applicative
|
||||||
|
import Node
|
||||||
|
import Algebra.Lattice
|
||||||
|
import Prelude.Unicode
|
||||||
|
import Weighted
|
||||||
|
import Control.Monad.Identity
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data Role = Subj | Cmpl | Mod | Poss | Prep | PCmpl | CCmpl | Coord | Conj | Num | Det
|
||||||
|
deriving (Show,Eq,Ord)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ppron = ppron12 ∪ ppron3
|
||||||
|
n = subst ∪ ger
|
||||||
|
|
||||||
|
nominal = n ∪ ppron
|
||||||
|
verbal = fin ∪ praet
|
||||||
|
adjectival = adj ∪ pact ∪ ppas
|
||||||
|
adverbial = adv ∪ pcon ∪ pant
|
||||||
|
|
||||||
|
cmpl'' = n ∩ (gen ∪ dat ∪ acc ∪ inst ∪ prep)
|
||||||
|
|
||||||
|
x = nominal ∪ verbal ∪ adjectival ∪ adverbial
|
||||||
|
|
||||||
|
v' = fin ∪ praet
|
||||||
|
n' = subst ∪ ger
|
||||||
|
|
||||||
|
adj'' = adj ∪ pact ∪ ppas
|
||||||
|
|
||||||
|
adv'' = adv ∪ pcon ∪ pant
|
||||||
|
|
||||||
|
n'' = subst ∪ ppron12 ∪ ppron3
|
||||||
|
|
||||||
|
|
||||||
|
agrNPG, agrC :: Constraint Role IPITag
|
||||||
|
agrNPG = \(_,h,d) -> agrNumber (cat h) (cat d) ∧ agrPerson (cat h) (cat d) ∧ agrGender (cat h) (cat d)
|
||||||
|
agrNCG = \(_,h,d) -> agrNumber (cat h) (cat d) ∧ agrCase (cat h) (cat d) ∧ agrGender (cat h) (cat d)
|
||||||
|
agrC = \(_,h,d) -> test ( agrCase<$>Identity (cat h)<*>Identity (cat d) )
|
||||||
|
|
||||||
|
--right, left, sgl :: Constraint Role IPITag
|
||||||
|
right = \(_,h,d) -> h < d
|
||||||
|
left = \(_,h,d) -> d < h
|
||||||
|
sgl = \(r,h,_) -> r ∉ roles h
|
||||||
|
|
||||||
|
coord = nominalCoord \/ verbalCoord \/ adjectivalCoord
|
||||||
|
|
||||||
|
nominalCoord (_,h,d) = nominal (cat d) ∧ or [ nominal (cat h₂) ∧ agrCase (cat d) (cat h₂) | h₂ <- lhdBy Coord h]
|
||||||
|
|
||||||
|
verbalCoord (_,h,d) = verbal (cat d) ∧ or [ verbal (cat h₂) ∧ agrNumber (cat d) (cat h₂) | h₂ <- lhdBy Coord h ]
|
||||||
|
|
||||||
|
adjectivalCoord (_,h,d) = adjectival (cat d)
|
||||||
|
∧ or [ adjectival (cat h₂)
|
||||||
|
-- && agrNPG (undefined,h₂,d)
|
||||||
|
∧ agrNumber (cat d) (cat h₂)
|
||||||
|
∧ agrCase (cat d) (cat h₂)
|
||||||
|
∧ agrGender (cat d) (cat h₂)
|
||||||
|
| h₂ <- lhdBy Coord h
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
coord' = nominalCoord' -- \/ verbalCoord' \/ adjectivalCoord'
|
||||||
|
|
||||||
|
nominalCoord' (_,h,d) = (alt nominal) (cat d) ∧ or [ (alt nominal) (cat h₂) ∧ (alt2 agrCase) (cat d) (cat h₂) | h₂ <- lhdBy Coord h]
|
||||||
|
|
||||||
|
-- verbalCoord (_,h,d) = verbal (cat d) ∧ or [ verbal (cat h₂) ∧ agrNumber (cat d) (cat h₂) | h₂ <- lhdBy Coord h ]
|
||||||
|
|
||||||
|
-- adjectivalCoord (_,h,d) = adjectival (cat d)
|
||||||
|
-- ∧ or [ adjectival (cat h₂)
|
||||||
|
-- -- && agrNPG (undefined,h₂,d)
|
||||||
|
-- ∧ agrNumber (cat d) (cat h₂)
|
||||||
|
-- ∧ agrCase (cat d) (cat h₂)
|
||||||
|
-- ∧ agrGender (cat d) (cat h₂)
|
||||||
|
-- | h₂ <- lhdBy Coord h
|
||||||
|
-- ]
|
||||||
|
|
||||||
|
|
||||||
|
-- amb f (r,Node i₁ cs₁ h₁ ds₁,Node i₂ cs₂ h₂ ds₂) = or [ c (r,Node i₁ c₁ h,Node t c₂) | c₁ <- cs₁, c₂ <- cs₂ ]
|
||||||
|
|
||||||
|
|
||||||
|
right' = \(_,h,d) -> h < d
|
||||||
|
left' = \(_,h,d) -> d < h
|
||||||
|
|
||||||
|
-- agrNPG', agrC' :: Constraint' (WeightedT []) Role IPITag
|
||||||
|
agrNPG' = \(_,h,d) -> (alt2 agrNumber) (cat h) (cat d) ∧ (alt2 agrPerson) (cat h) (cat d) ∧ (alt2 agrGender) (cat h) (cat d)
|
||||||
|
agrNCG' = \(_,h,d) -> (alt2 agrNumber) (cat h) (cat d) ∧ (alt2 agrCase (cat h) (cat d)) ∧ (alt2 agrGender) (cat h) (cat d)
|
||||||
|
-- agrNCG'' = amb argNCG
|
||||||
|
agrC' = \(_,h,d) -> (alt2 agrCase) (cat h) (cat d)
|
||||||
|
|
||||||
|
agrC''' :: Constraint' (WeightedT []) Role IPITag
|
||||||
|
agrC''' = \(_,h,d) -> test ( agrCase<$>(cat h)<*>(cat d) )
|
||||||
|
|
||||||
|
test :: (Foldable m) => m Bool -> Bool
|
||||||
|
test = foldl (∨) False
|
||||||
|
|
||||||
|
-- right', left', sgl' :: Constraint' (WeightedT []) Role IPITag
|
||||||
|
-- right' = \(_,h,d) -> h < d
|
||||||
|
-- left' = \(_,h,d) -> d < h
|
||||||
|
-- sgl' = \(r,h,_) -> r ∉ roles h
|
||||||
|
|
||||||
|
alt f xs = or [ f x | x <- xs ]
|
||||||
|
alt2 f xs ys = or [ f x y | x <- xs , y <- ys ]
|
||||||
|
|
||||||
|
|
||||||
|
pl1 = G1 { links =
|
||||||
|
WeightedT $ concat
|
||||||
|
[
|
||||||
|
[ LINK Subj v' (n ∩ nom) [agrNPG,sgl,d] #w | (d,w) <- [(left,0.8),(right,0.2)] ],
|
||||||
|
[ LINK Cmpl v' cmpl'' [d] #w | (d,w) <- [(left,0.3),(right,0.7)] ],
|
||||||
|
[ LINK Mod n adjectival [agrNCG] #1 ],
|
||||||
|
[ LINK Prep n' prep [d] #w | (d,w) <- [(left,0.1),(right,0.8)] ],
|
||||||
|
[ LINK Prep v' prep [] #1 ],
|
||||||
|
[ LINK PCmpl prep n [agrC,right] #1 ],
|
||||||
|
[ LINK PCmpl prep (ppron ∩ akc) [agrC,right] #1 ],
|
||||||
|
[ LINK Coord x conj [right] #1 ],
|
||||||
|
[ LINK CCmpl conj x [right,coord] #1 ]
|
||||||
|
],
|
||||||
|
gcs = [obligatoriness],
|
||||||
|
-- sat = saturated,
|
||||||
|
obl = [OBL prep [PCmpl]]
|
||||||
|
}
|
||||||
|
|
||||||
|
pl1' = G1' { links' =
|
||||||
|
WeightedT $ concat
|
||||||
|
[
|
||||||
|
[ LINK' Subj v' (n ∩ nom) [agrNPG',sgl,d] #w | (d,w) <- [(left',0.8),(right',0.2)] ],
|
||||||
|
[ LINK' Cmpl v' cmpl'' [d] #w | (d,w) <- [(left',0.3),(right',0.7)] ],
|
||||||
|
[ LINK' Mod n adjectival [agrNCG'] #1 ],
|
||||||
|
[ LINK' Prep n' prep [d] #w | (d,w) <- [(left',0.1),(right',0.8)] ],
|
||||||
|
[ LINK' Prep v' prep [] #1 ],
|
||||||
|
[ LINK' PCmpl prep n [agrC',right'] #1 ],
|
||||||
|
[ LINK' PCmpl prep (ppron ∩ akc) [agrC',right'] #1 ],
|
||||||
|
[ LINK' Coord x conj [right'] #1 ],
|
||||||
|
[ LINK' CCmpl conj x [right',coord'] #1 ]
|
||||||
|
],
|
||||||
|
gcs' = [obligatoriness'],
|
||||||
|
-- sat = saturated,
|
||||||
|
obl' = [OBL prep [PCmpl]]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- saturated :: Grammar -> Node Role IPITag -> Bool
|
||||||
|
-- sat g n = and [ r ∈ (roles n) | OBL p rs <- obl g, p n, r <- rs ]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- obligatoriness = const True
|
||||||
|
--obligatoriness :: (Eq τ) => Constraint τ κ
|
||||||
|
obligatoriness (r,h,d) | h < d = all sat'' (pure h >>= clo rmdp)
|
||||||
|
| d < h = all sat'' (pure d >>= rclo rmdp)
|
||||||
|
|
||||||
|
sat'' n = and [ r ∈ (roles n) | OBL p rs <- obl pl1, p (cat n), r <- rs ]
|
||||||
|
|
||||||
|
|
||||||
|
obligatoriness' (r,h,d) | h < d = all sat''' (pure h >>= clo rmdp)
|
||||||
|
| d < h = all sat''' (pure d >>= rclo rmdp)
|
||||||
|
|
||||||
|
sat''' n = and [ r ∈ (roles n) | OBL p rs <- obl pl1, (alt p) (cat n), r <- rs ]
|
50
Parse.hs
Normal file
50
Parse.hs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
module Parse -- (Step (Step),Parse,Ind,Arc,(+<-),(+->),(<<),nextId,size,len,trees,ep,eps)
|
||||||
|
where
|
||||||
|
|
||||||
|
-- import Data.List (intercalate)
|
||||||
|
import Base
|
||||||
|
import Step
|
||||||
|
|
||||||
|
import Data.List
|
||||||
|
|
||||||
|
type Parse τ c = [Step τ c]
|
||||||
|
|
||||||
|
ep = []
|
||||||
|
eps = [ep]
|
||||||
|
|
||||||
|
infixl 4 <<, +->, +<-
|
||||||
|
(<<) :: Parse τ κ -> Step τ κ -> Parse τ κ
|
||||||
|
p << s = s : p
|
||||||
|
|
||||||
|
addNode = (<<)
|
||||||
|
|
||||||
|
(+->),(+<-) :: Parse τ κ -> Arc τ -> Parse τ κ
|
||||||
|
(Step i c [] d : p) +-> a = Step i c [a] d : p
|
||||||
|
(Step i c h d : p) +<- a = Step i c h (a:d) : p
|
||||||
|
|
||||||
|
linkHead = (+->)
|
||||||
|
linkDep = (+<-)
|
||||||
|
|
||||||
|
nextId :: Parse τ κ -> Ind
|
||||||
|
nextId [] = 1
|
||||||
|
nextId (Step i _ _ _:_) = i + 1
|
||||||
|
|
||||||
|
len :: Parse τ κ -> Int
|
||||||
|
len p = length p
|
||||||
|
|
||||||
|
size :: Parse τ κ -> Int
|
||||||
|
size p = sum (map stepSize p) where stepSize (Step _ _ h ds) = length (h ++ ds)
|
||||||
|
|
||||||
|
trees :: Parse τ κ -> Int
|
||||||
|
trees p = len p - size p
|
||||||
|
|
||||||
|
|
||||||
|
showParse :: (Show τ, Show κ) => Parse τ κ -> String
|
||||||
|
showParse = concatMap shortStep
|
||||||
|
where
|
||||||
|
shortStep (Step i c h ds) = "<" ++ show i ++ "|" ++ showArcs h ++ "|" ++ showArcs ds ++ ">"
|
||||||
|
showArcs = intercalate "," . map showArc
|
||||||
|
showArc (Head r i) = show r ++ ":" ++ show i
|
||||||
|
showArc (Dep r i) = show r ++ ":" ++ show i
|
||||||
|
|
||||||
|
|
245
ParserW.hs
Normal file
245
ParserW.hs
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
{-# LANGUAGE MonadComprehensions #-}
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
|
||||||
|
module ParserW (
|
||||||
|
module Parse,
|
||||||
|
WeightedList,
|
||||||
|
step,
|
||||||
|
parse,
|
||||||
|
parseA,
|
||||||
|
parse',
|
||||||
|
parseA',
|
||||||
|
-- parseSel,
|
||||||
|
-- selectSize,
|
||||||
|
shift,
|
||||||
|
shift',
|
||||||
|
-- shifts,
|
||||||
|
connect,
|
||||||
|
addHead,
|
||||||
|
addDep) where
|
||||||
|
|
||||||
|
import Lexicon
|
||||||
|
import Grammar
|
||||||
|
import Parse
|
||||||
|
import Node
|
||||||
|
|
||||||
|
import Data.List
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.Sequence
|
||||||
|
import Data.Foldable
|
||||||
|
import Toolbox
|
||||||
|
import Control.Monad
|
||||||
|
import Control.Monad.Trans.State
|
||||||
|
import Control.Monad.Trans.Class
|
||||||
|
import Control.Monad.Plus
|
||||||
|
import Base
|
||||||
|
import Weighted
|
||||||
|
|
||||||
|
|
||||||
|
shift :: (MonadPlus m, Lexicon m κ δ) => δ -> String -> Parse τ κ -> m (Parse τ κ)
|
||||||
|
shift d w p = [ p << Step (nextId p) c [] [] | c <- dic d w ]
|
||||||
|
where
|
||||||
|
nextId [] = 1
|
||||||
|
nextId (Step i _ _ _:_) = i + 1
|
||||||
|
|
||||||
|
|
||||||
|
shift' :: (MonadPlus m, Lexicon m κ δ) => δ -> String -> Parse τ (m κ) -> m (Parse τ (m κ))
|
||||||
|
shift' d w p = return $ p << Step (nextId p) (dic d w) [] []
|
||||||
|
where
|
||||||
|
nextId [] = 1
|
||||||
|
nextId (Step i _ _ _:_) = i + 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- shift :: (MonadPlus m, Lexicon m κ δ) => δ -> String -> Parse τ κ -> StateT Int m (Parse τ κ)
|
||||||
|
-- shift d w p = do nextId <- get
|
||||||
|
-- c <- lift (dic d w)
|
||||||
|
-- let ret = p << Step nextId c [] []
|
||||||
|
-- modify (+ 1)
|
||||||
|
-- return ret
|
||||||
|
|
||||||
|
-- where
|
||||||
|
-- nextId [] = 1
|
||||||
|
-- nextId (Step i _ _ _:_) = i + 1
|
||||||
|
|
||||||
|
|
||||||
|
-- shifts :: (MonadPlus m) => [String] -> Parse -> m Parse
|
||||||
|
-- shifts (s:ss) p = shift s p >>= shifts ss
|
||||||
|
-- shifts [] p = return p
|
||||||
|
|
||||||
|
|
||||||
|
addHead, addDep :: (MonadPlus m, Grammar m τ κ γ) => γ -> Parse τ κ -> m (Parse τ κ)
|
||||||
|
addHead g p = [ p +-> Head r (ind v') | let v = lastNode p, headless v, (r,v') <- heads g v ]
|
||||||
|
addDep g p = [ p +<- Dep r (ind v') | let v = lastNode p, (r,v') <- deps g v, headless v' ]
|
||||||
|
|
||||||
|
addHead', addDep' :: (MonadPlus m, Grammar' m τ κ γ) => γ -> Parse τ (m κ) -> m (Parse τ (m κ))
|
||||||
|
addHead' g p = [ p +-> Head r (ind v') | let v = lastNode p, headless v, (r,v') <- heads' g v ]
|
||||||
|
addDep' g p = [ p +<- Dep r (ind v') | let v = lastNode p, (r,v') <- deps' g v, headless v' ]
|
||||||
|
|
||||||
|
|
||||||
|
connect :: (MonadPlus m, Grammar m τ κ γ) => γ -> Parse τ κ -> m (Parse τ κ)
|
||||||
|
connect g = (addDep g >=> connect g) <> addHead g <> return
|
||||||
|
|
||||||
|
connect' :: (MonadPlus m, Grammar' m τ κ γ) => γ -> Parse τ (m κ) -> m (Parse τ (m κ))
|
||||||
|
connect' g = (addDep' g >=> connect' g) <> addHead' g <> return
|
||||||
|
|
||||||
|
|
||||||
|
step :: (MonadPlus m, Lexicon m κ δ, Grammar m τ κ γ) => δ -> γ -> Wordform -> Parse τ κ -> m (Parse τ κ)
|
||||||
|
step d g w = shift d w >=> connect g |? (<= 4) . trees
|
||||||
|
|
||||||
|
step' :: (MonadPlus m, Lexicon m κ δ, Grammar' m τ κ γ) => δ -> γ -> Wordform -> Parse τ (m κ) -> m (Parse τ (m κ))
|
||||||
|
step' d g w = shift' d w >=> connect' g |? (<= 4) . trees
|
||||||
|
|
||||||
|
steps :: (MonadPlus m, Lexicon m κ δ, Grammar m τ κ γ) => δ -> γ -> [Wordform] -> m (Parse τ κ)
|
||||||
|
steps d g = foldM (flip (step d g)) mzero
|
||||||
|
|
||||||
|
steps' :: (MonadPlus m, Lexicon m κ δ, Grammar' m τ κ γ) => δ -> γ -> [Wordform] -> m (Parse τ (m κ))
|
||||||
|
steps' d g = foldM (flip (step' d g)) mzero
|
||||||
|
|
||||||
|
parser :: (MonadPlus m, Lexicon m κ δ, Grammar m τ κ γ) => δ -> γ -> [Wordform] -> m (Parse τ κ)
|
||||||
|
parser d g = steps d g -- |? (==1) . trees
|
||||||
|
|
||||||
|
parser' :: (MonadPlus m, Lexicon m κ δ, Grammar' m τ κ γ) => δ -> γ -> [Wordform] -> m (Parse τ (m κ))
|
||||||
|
parser' d g = steps' d g -- |? (==1) . trees
|
||||||
|
-- parser = steps |? pass.lastNode
|
||||||
|
|
||||||
|
-- parse :: (Lexicon WeightedList κ δ, Grammar WeightedList τ κ γ) => δ -> γ -> String -> WeightedList (Parse τ κ)
|
||||||
|
parse d g = (parser d g |? (==1) . trees |? pass g . lastNode) . words
|
||||||
|
|
||||||
|
parse' :: (Lexicon WeightedList κ δ, Grammar' WeightedList τ κ γ) => δ -> γ -> String -> WeightedList (Parse τ (WeightedList κ))
|
||||||
|
parse' d g = (parser' d g |? (==1) . trees) . words
|
||||||
|
|
||||||
|
parseA :: (Lexicon WeightedList κ δ, Grammar WeightedList τ κ γ) => δ -> γ -> String -> WeightedList (Parse τ κ)
|
||||||
|
parseA d g = parser d g . words
|
||||||
|
|
||||||
|
parseA' :: (Lexicon WeightedList κ δ, Grammar' WeightedList τ κ γ) => δ -> γ -> String -> WeightedList (Parse τ (WeightedList κ))
|
||||||
|
parseA' d g = parser' d g . words
|
||||||
|
|
||||||
|
|
||||||
|
type WeightedList = WeightedT []
|
||||||
|
|
||||||
|
-- type WeightedList = StateT Int (WeightedT [])
|
||||||
|
|
||||||
|
-- LEXER I PARSER ODDZIELNIE
|
||||||
|
|
||||||
|
-- step :: (Ind,String) -> [Step]
|
||||||
|
-- step (i,w) = [ Step i c [] [] | c <- dic w ]
|
||||||
|
|
||||||
|
-- steps :: [(Ind,String)] -> [[Step]]
|
||||||
|
-- steps [] = [[]]
|
||||||
|
-- _steps ((i,w):t) = [ Step i c [] [] : ss | c <- dic w, ss <- _steps t ]
|
||||||
|
|
||||||
|
-- _lexer = words >>> zip [1..] >>> _steps
|
||||||
|
|
||||||
|
-- -- lexer3 s = map (Node []) (stes s)
|
||||||
|
|
||||||
|
-- -- back = (lng >=> back) <?> pure
|
||||||
|
-- _parser = connect >=> (rng >=> _parser) <?> pure
|
||||||
|
|
||||||
|
-- -- --parser'' ws = shifts ws ep >>= back >>= pa
|
||||||
|
|
||||||
|
-- _parse = _lexer >=> _parser
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- shift :: (MonadPlus m) => Wordform -> Parse -> m Parse
|
||||||
|
-- shift w p = [ p << Step (nextId p) c [] [] | c <- mfromList (dic w) ]
|
||||||
|
-- where
|
||||||
|
-- nextId [] = 1
|
||||||
|
-- nextId (Step i _ _ _:_) = i + 1
|
||||||
|
|
||||||
|
-- shifts :: (MonadPlus m) => [String] -> Parse -> m Parse
|
||||||
|
-- shifts (s:ss) p = shift s p >>= shifts ss
|
||||||
|
-- shifts [] p = return p
|
||||||
|
|
||||||
|
-- addHead, addDep :: (MonadPlus m) => Parse -> m Parse
|
||||||
|
-- addHead p = [ p +-> Arc r (ind v') | let v = lastNode p, headless v, (r,v') <- mfromList (heads v) ]
|
||||||
|
-- addDep p = [ p +<- Arc r (ind v') | let v = lastNode p, (r,v') <- mfromList (deps v), headless v' ]
|
||||||
|
|
||||||
|
-- connect :: (MonadPlus m) => Parse -> m Parse
|
||||||
|
-- connect = (addDep >=> connect) <> addHead <> return
|
||||||
|
|
||||||
|
-- step :: (MonadPlus m) => Wordform -> Parse -> m Parse
|
||||||
|
-- step w = shift w >=> connect
|
||||||
|
|
||||||
|
-- steps :: (MonadPlus m) => [Wordform] -> m Parse
|
||||||
|
-- steps = foldM (flip step) mzero
|
||||||
|
|
||||||
|
-- parser :: (MonadPlus m) => [Wordform] -> m Parse
|
||||||
|
-- parser = steps |? pass.lastNode |? (==1).trees
|
||||||
|
|
||||||
|
-- parse :: String-> [Parse]
|
||||||
|
-- parse = parser . words
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- stepSel :: (Parse -> [Parse]) -> Wordform -> Parse -> [Parse]
|
||||||
|
-- stepSel s w = (shift w >=> connect >=> s)
|
||||||
|
|
||||||
|
-- stepsSel :: (Parse -> [Parse]) -> [Wordform] -> [Parse]
|
||||||
|
-- stepsSel s = foldM (flip (stepSel s)) []
|
||||||
|
|
||||||
|
-- parserSel :: (Parse -> [Parse]) -> [Wordform] -> [Parse]
|
||||||
|
-- parserSel s = stepsSel s >=> selectWith (pass.lastNode) >=> selectSize (==1)
|
||||||
|
|
||||||
|
-- parseSel :: (Parse -> [Parse]) -> String-> [Parse]
|
||||||
|
-- parseSel s = parserSel s . words
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- EXTENSIONS
|
||||||
|
|
||||||
|
-- type Selector = Parse -> [Parse]
|
||||||
|
|
||||||
|
-- sAny :: (Parse -> [Parse])
|
||||||
|
-- sAny v = pure v
|
||||||
|
|
||||||
|
-- selectWith :: (Parse -> Bool) -> (Parse -> [Parse])
|
||||||
|
-- selectWith f v = if f v then [v] else []
|
||||||
|
|
||||||
|
-- selectSize :: (Int -> Bool) -> (Parse -> [Parse])
|
||||||
|
-- selectSize f = selectWith (f . trees)
|
||||||
|
-- sForestSize f p = if f (trees p) then [p] else []
|
||||||
|
|
||||||
|
-- shift' :: (Ind,Word) -> Parse -> [Parse]
|
||||||
|
-- shift' (i,w) p = [ p << (i,c) | c <- dic w]
|
||||||
|
|
||||||
|
-- addHead', addDep' :: Parse -> [Parse]
|
||||||
|
-- addHead' n = [ n +-> (r,ind n') | headless n, (r,n') <- heads' n ]
|
||||||
|
-- addDep' n = [ n +<- (r,ind n') | (r,n') <- deps' n, headless n' ]
|
||||||
|
|
||||||
|
-- connect' :: Parse -> [Parse]
|
||||||
|
-- -- connect = ((addDep <> addHead) >=> connect) <> pure
|
||||||
|
-- connect' = addDep' <> addHead' <> pure
|
||||||
|
|
||||||
|
-- step' :: (Parse -> [Parse]) -> (Ind,Word) -> Parse -> [Parse]
|
||||||
|
-- step' s w = shift' w >=> connect >=> s
|
||||||
|
|
||||||
|
-- step'''' w = shift' w >=> connect
|
||||||
|
|
||||||
|
-- stepS s w = step'''' w >=> s
|
||||||
|
|
||||||
|
-- parser' s = foldM (flip (stepS s)) ep >=> accept'
|
||||||
|
-- parse' s = words >>> zip [1..] >>> parser' s
|
||||||
|
|
||||||
|
-- parserRL s = foldrM ((step' s)) ep >=> accept'
|
||||||
|
-- parseRL s = words >>> zip [1..] >>> parserRL s
|
||||||
|
|
||||||
|
-- type Filter = [Parse] -> [Parse]
|
||||||
|
|
||||||
|
|
||||||
|
-- -- takeWith :: (Parse -> Bool) -> ([Parse] -> [Parse])
|
||||||
|
-- -- takeWith f = filter f
|
||||||
|
|
||||||
|
-- -- takeBestN = mapM (sForestSize)
|
27
PoliMorf.hs
Normal file
27
PoliMorf.hs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
|
||||||
|
module PoliMorf (
|
||||||
|
module Data.ADTTag.IPITag,
|
||||||
|
module PM -- Data.ADTTag.IPITag.PoliMorf
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Control.Monad.Plus
|
||||||
|
import Lexicon
|
||||||
|
import Data.ADTTag.IPITag
|
||||||
|
import qualified Data.ADTTag.IPITag.PoliMorf as PM
|
||||||
|
|
||||||
|
instance (MonadPlus m) => Lexicon m IPITag PM.Dic where
|
||||||
|
dic = PM.dic
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- data SynTag = SUBST' Name1
|
||||||
|
-- | FIN'
|
||||||
|
-- | PREP' Prep
|
||||||
|
-- deriving (Show,Eq,Ord)
|
||||||
|
|
||||||
|
-- data Name1 = Common | Proper
|
||||||
|
|
||||||
|
-- data Prep = PrepPod | PrepDo | PrepNa | PrepW | PrepPrzez | PrepPod
|
||||||
|
-- syn ::
|
14
Role.hs
Normal file
14
Role.hs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
module Role where
|
||||||
|
|
||||||
|
data Role = Subj
|
||||||
|
| Cmpl
|
||||||
|
| Mod
|
||||||
|
| Poss
|
||||||
|
| Prep
|
||||||
|
| PCmpl
|
||||||
|
| CCmpl
|
||||||
|
| Coord
|
||||||
|
| Conj
|
||||||
|
| Num
|
||||||
|
| Det
|
||||||
|
deriving (Show,Eq,Ord)
|
20
Step.hs
Normal file
20
Step.hs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
|
||||||
|
module Step (Step (Step))
|
||||||
|
where
|
||||||
|
|
||||||
|
import Data.List (intercalate)
|
||||||
|
import Base
|
||||||
|
|
||||||
|
data Step τ κ = Step Ind κ [Arc τ] [Arc τ] deriving (Eq,Ord,Show)
|
||||||
|
|
||||||
|
|
||||||
|
-- dst :: Arc
|
||||||
|
-- instance Show Step where
|
||||||
|
-- show (Step i c h d) = show i ++ "." ++ show c ++ showHead h ++ showDeps d
|
||||||
|
-- where showHead [] = ""
|
||||||
|
-- showHead [a] = "(" ++ showArc a ++ ")"
|
||||||
|
-- showDeps [] = ""
|
||||||
|
-- showDeps ds = "[" ++ intercalate " " (map showArc ds) ++ "]"
|
||||||
|
-- showArc (r,i) = show r ++ ":" ++ show i
|
||||||
|
|
66
Toolbox.hs
Normal file
66
Toolbox.hs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
module Toolbox
|
||||||
|
( -- Applicative
|
||||||
|
pure,
|
||||||
|
|
||||||
|
-- Monad
|
||||||
|
(>>=), (>=>),
|
||||||
|
|
||||||
|
-- local
|
||||||
|
(<>),
|
||||||
|
(<!>),(|?),
|
||||||
|
clo, rclo, mclo, mrclo,
|
||||||
|
just
|
||||||
|
)
|
||||||
|
where
|
||||||
|
|
||||||
|
|
||||||
|
import Control.Monad ((>>=),(>=>),MonadPlus(mplus,mzero),mfilter)
|
||||||
|
import Control.Applicative (pure)
|
||||||
|
|
||||||
|
import Data.Foldable
|
||||||
|
|
||||||
|
-- OR
|
||||||
|
|
||||||
|
infixr 6 <>
|
||||||
|
(<>) :: (MonadPlus m) => (a -> m b) -> (a -> m b) -> (a -> m b)
|
||||||
|
(f <> g) x = f x `mplus` g x
|
||||||
|
|
||||||
|
-- SHORT CIRCUIT OR
|
||||||
|
|
||||||
|
infixr 6 <!>
|
||||||
|
(<!>) :: (MonadPlus m, Foldable m) => (a -> m b) -> (a -> m b) -> (a -> m b)
|
||||||
|
(f <!> g) x = let fx = f x in if null fx then g x else fx
|
||||||
|
|
||||||
|
-- VALUE FILTER
|
||||||
|
|
||||||
|
infixl 4 |?
|
||||||
|
(|?) :: (MonadPlus m) => (a -> m b) -> (b -> Bool) -> (a -> m b)
|
||||||
|
f |? g = mfilter g . f
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
clo,mclo,rclo,mrclo:: (MonadPlus m, Foldable m) => (a -> m a) -> a -> m a
|
||||||
|
clo f = f >=> ( pure <> clo f )
|
||||||
|
rclo f = pure <> clo f
|
||||||
|
mrclo f = (f >=> mrclo f) <!> pure
|
||||||
|
mclo f = f >=> mrclo f
|
||||||
|
|
||||||
|
|
||||||
|
-- INPUT: Function f returning element of a list or fails if list empty
|
||||||
|
-- OUTPUT: Function returning the list containing the f value or empty list
|
||||||
|
-- ex: the maximum, the head, the last, e.t.c
|
||||||
|
|
||||||
|
-- the :: ([a] -> b) -> ([a] -> [b])
|
||||||
|
-- (the f) [] = []
|
||||||
|
-- (the f) xs = [f xs]
|
||||||
|
|
||||||
|
just :: ([a] -> b) -> ([a] -> [b])
|
||||||
|
(just f) [] = []
|
||||||
|
(just f) xs = [f xs]
|
||||||
|
|
||||||
|
its :: (a->b) -> ([a]->b)
|
||||||
|
its f = f.head
|
||||||
|
|
||||||
|
their :: (a->b) -> ([a]->[b])
|
||||||
|
their = map
|
||||||
|
|
88
Weighted.hs
Normal file
88
Weighted.hs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
module Weighted
|
||||||
|
where
|
||||||
|
|
||||||
|
import Control.Applicative
|
||||||
|
import Control.Monad
|
||||||
|
import Data.Foldable
|
||||||
|
import Data.Monoid
|
||||||
|
|
||||||
|
newtype Weight = Weight Float deriving (Show,Eq,Ord)
|
||||||
|
|
||||||
|
instance Monoid Weight where
|
||||||
|
mempty = Weight 1
|
||||||
|
Weight w `mappend` Weight w' = Weight (w * w')
|
||||||
|
|
||||||
|
inv :: Weight -> Weight
|
||||||
|
inv (Weight w) = (Weight (1.0 - w))
|
||||||
|
|
||||||
|
data Weighted a = Weighted Weight a
|
||||||
|
|
||||||
|
bare :: Weighted a -> a
|
||||||
|
bare (Weighted _ x) = x
|
||||||
|
|
||||||
|
weight :: Weighted a -> Weight
|
||||||
|
weight (Weighted w _) = w
|
||||||
|
|
||||||
|
instance Functor Weighted where
|
||||||
|
fmap f (Weighted w x) = Weighted w (f x)
|
||||||
|
|
||||||
|
instance Applicative Weighted where
|
||||||
|
pure = Weighted mempty
|
||||||
|
Weighted w f <*> Weighted w' x = Weighted (w <> w') (f x)
|
||||||
|
|
||||||
|
instance Monad Weighted where
|
||||||
|
return = pure
|
||||||
|
(Weighted w x) >>= f = let (Weighted w' y) = f x
|
||||||
|
in Weighted (w<>w') y
|
||||||
|
|
||||||
|
instance (Show a) => Show (Weighted a) where
|
||||||
|
show (Weighted (Weight w) x) = show x ++ "#" ++ show w
|
||||||
|
|
||||||
|
infix 9 #
|
||||||
|
x#w = Weighted (Weight w) x
|
||||||
|
|
||||||
|
instance Eq (Weighted a) where
|
||||||
|
Weighted w1 _ == Weighted w2 _ = w1 == w2
|
||||||
|
|
||||||
|
instance Ord (Weighted a) where
|
||||||
|
Weighted w1 _ <= Weighted w2 _ = w1 <= w2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
newtype WeightedT m a = WeightedT { runWeightedT :: m (Weighted a) }
|
||||||
|
|
||||||
|
instance Functor m => Functor (WeightedT m) where
|
||||||
|
f `fmap` x = WeightedT (liftA f `fmap` runWeightedT x)
|
||||||
|
|
||||||
|
instance Applicative m => Applicative (WeightedT m) where
|
||||||
|
pure = WeightedT . pure . pure
|
||||||
|
f <*> x = WeightedT (liftA2 (<*>) (runWeightedT f) (runWeightedT x))
|
||||||
|
|
||||||
|
instance Alternative m => Alternative (WeightedT m) where
|
||||||
|
empty = WeightedT empty
|
||||||
|
x <|> y = WeightedT ( runWeightedT x <|> runWeightedT y )
|
||||||
|
|
||||||
|
instance (MonadPlus m, Foldable m) => Foldable (WeightedT m) where
|
||||||
|
-- foldr f z c = foldr f z (map bare $ toList $ runWeightedT c)
|
||||||
|
foldr f z c = foldr f z (fmap bare $ runWeightedT c)
|
||||||
|
-- foldr f z c = foldr (f . bare) z (runWeightedT c)
|
||||||
|
|
||||||
|
instance Monad m => Monad (WeightedT m) where
|
||||||
|
return = WeightedT . return . return
|
||||||
|
x >>= f = WeightedT $ do
|
||||||
|
Weighted w a <- runWeightedT x
|
||||||
|
Weighted w' b <- runWeightedT (f a)
|
||||||
|
return (Weighted (w<>w') b)
|
||||||
|
|
||||||
|
instance (Alternative m, Monad m) => MonadPlus (WeightedT m)
|
||||||
|
|
||||||
|
-- instance (MonadPlus m, Traversable m) => Traversable (WeightedT m) where
|
||||||
|
-- traverse f xs = return $ traverse (liftM f) (runWeightedT xs)
|
||||||
|
|
||||||
|
-- traverse f xs | null xs = pure mzero
|
||||||
|
-- | otherwise = foldr (\x v -> mplus <$> f x <*> v) (pure mzero) xs
|
||||||
|
|
||||||
|
|
||||||
|
-- (WeightedT x)= WeightedT $ sequenceA x
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user