lojysamban 0.0.1 → 0.0.2
raw patch · 8 files changed
+538/−168 lines, 8 files
Files
- LojbanTools.hs +45/−0
- NotUnif.hs +81/−0
- Prolog2.hs +31/−0
- PrologTools.hs +48/−0
- Unif.hs +180/−0
- lojsamban.hs +0/−166
- lojsamban2.hs +150/−0
- lojysamban.cabal +3/−2
+ LojbanTools.hs view
@@ -0,0 +1,45 @@+module LojbanTools (+ getSentences,+ headTerms,+ bridiTail,+ selbri,+ tailTerms,+ snd3+) where++import Language.Lojban.Parser hiding (LA, Brivla, KOhA, GOhA, NA, LerfuString)+import qualified Language.Lojban.Parser as P+import System.Environment+import Data.Maybe+import Data.Either+import Data.List++getSentences :: Sentence -> [Sentence]+getSentences (IText_1 _ _ _ _ (Just t)) = getSentences t+getSentences (StatementI s1 ss) = s1 : catMaybes (map (\(_, _, s) -> s) ss)+getSentences tbt@(TermsBridiTail _ _ _ _) = [tbt]+getSentences o = error $ show o++headTerms :: Sentence -> [Sumti]+headTerms (TermsBridiTail ts _ _ _) = ts+headTerms _ = []++bridiTail :: Sentence -> Sentence+bridiTail (TermsBridiTail _ _ _ bt) = bt+bridiTail o = o++selbri :: Sentence -> Selbri+selbri (Selbri s) = s+selbri (SelbriTailTerms s _ _ _) = s+selbri t = error $ show t -- P.Brivla ([], "", []) []++tailTerms :: Sentence -> [Sumti]+tailTerms (SelbriTailTerms _ ts _ _) = ts+tailTerms _ = []++readSumtiTail :: SumtiTail -> String+readSumtiTail (SelbriRelativeClauses (P.Brivla (_, n, _) _) _) = n+readSumtiTail st = show st++snd3 :: (a, b, c) -> b+snd3 (_, y, _) = y
+ NotUnif.hs view
@@ -0,0 +1,81 @@+module NotUnif (+ checkAll,+ checkNot,+ deleteFromNot,+ notUnification+) where++import Unif+import Control.Applicative+import Data.Maybe++-- checkAll :: [([Term], Maybe Term)] -> [Maybe [(Term, Term)]] -> Bool+checkAll r [] = True+checkAll r (Nothing : nots) = checkAll r nots+checkAll r (Just [] : nots) = checkAll r nots+checkAll r (Just n : nots) =+ checkNot r (deleteFromNot r n) && checkAll r nots++-- deleteFromNot :: [([Term], Maybe Term)] -> [(Term, Term)] -> [(Term, Term)]+deleteFromNot _ [] = []+deleteFromNot r ((t@(Var _ _), u@(Var _ _)) : ps)+ | null $ filter ((t `elem`) . fst) r = deleteFromNot r ps+ | null $ filter ((u `elem`) . fst) r = deleteFromNot r ps+ | otherwise = (t, u) : deleteFromNot r ps+deleteFromNot r ((t, u) : ps) = (t, u) : deleteFromNot r ps++-- checkNot :: [([Term], Maybe Term)] -> [(Term, Term)] -> Bool+checkNot _ [] = False+checkNot r ((t@(Var _ _), u@(Var _ _)) : ps)+ = null (filter ((\vs -> t `elem` vs && u `elem` vs) . fst) r) ||+-- null (filter ((t `elem`) .fst) r) ||+-- null (filter ((u `elem`) .fst) r) ||+ checkNot r ps+checkNot r ((t@(Var _ _), u) : ps)+ = snd (head $ filter ((t `elem`) . fst) r) /= Just u || checkNot r ps++-- notUnification :: +notUnification ts us = simplify <$> notUnifies ts us++-- notUnify :: Term -> Term -> Maybe (Maybe (Term, Term))+notUnify t u | t == u = Nothing+notUnify t@(Con _) u@(Con _) = Just Nothing+notUnify t u = Just $ Just (t, u)++-- notUnifies :: [Term] -> [Term] -> Maybe [(Term, Term)]+notUnifies [] [] = Nothing+notUnifies [t] [u] = maybeToList <$> notUnify t u+notUnifies (t : ts) (u : us) = case notUnify t u of+ Nothing -> notUnifies ts us+ Just Nothing -> Just []+ Just (Just p) -> case notUnifies ts us of+ Nothing -> Just [p]+ Just [] -> Just []+ Just ps -> Just $ p : ps+notUnifies _ _ = Just []++-- simplify :: [(Term, Term)] -> [(Term, Term)]+simplify :: (Eq sc, Eq s) =>+ [(Term sc s, Term sc s)] -> [(Term sc s, Term sc s)]+simplify = checkSame . map (uncurry order)++-- checkSame :: [(Term, Term)] -> [(Term, Term)]+checkSame :: (Eq sc, Eq s) =>+ [(Term sc s, Term sc s)] -> [(Term sc s, Term sc s)]+checkSame [] = []+checkSame (p : ps) = catMaybes (map (isSame p) ps) ++ p : checkSame ps++-- isSame :: (Term, Term) -> (Term, Term) -> Maybe (Term, Term)+isSame :: Eq a => (a, a) -> (a, a) -> Maybe (a, a)+isSame (x, y) (z, w)+ | x == z = Just (y, w)+ | y == w = Just (x, z)+ | x == w = Just (y, z)+ | y == z = Just (x, w)+ | otherwise = Nothing++-- order :: Term -> Term -> (Term, Term)+order (Con _) (Con _) = error "not occur"+order t@(Var _ _) u@(Con _) = (t, u)+order t@(Con _) u@(Var _ _) = (u, t)+order t u = (t, u)
+ Prolog2.hs view
@@ -0,0 +1,31 @@+module Prolog2 (+ ask,+ Fact,+-- Unify(..),+ Rule(..),+ Term(..),+ TwoD(..),+ Result+) where++import PrologTools+import Unif+import Data.Maybe++ask :: (TwoD sc, Eq sc, Eq s) =>+ sc -> Result sc s -> Fact sc s -> [Rule sc s] -> [Result sc s]+ask sc ret q rs =+ concat $ zipWith (\sc r -> askrule sc ret q r rs) (iterate next $ down sc) rs++askrule :: (TwoD sc, Eq sc, Eq s) =>+ sc -> Result sc s -> Fact sc s -> Rule sc s -> [Rule sc s] -> [Result sc s]+askrule sc ret q r@(Rule fact _ facts notFacts) rs =+ filter (flip checkAll nots) ret'+ where+ ret' = foldl (\rets (sc', f) -> rets >>= \r -> ask sc' r f rs) r0 $ zip (iterate next sc0) $+ map (const . ($ sc0)) facts+ sc0 = down sc+ r0 = case (q sc) `unification` (fact sc0) of+ Nothing -> []+ Just r0' -> maybeToList $ ret `merge` r0'+ nots = concat $ map ((flip (notAsk sc0) rs) . const . ($sc0)) notFacts
+ PrologTools.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-}++module PrologTools (+ TwoD(..),+ Fact,+ NotFact,+ Rule(..),+ notAsk,+ checkAll+) where++import Unif+import NotUnif+import Control.Applicative++class TwoD td where+ next :: td -> td+ down :: td -> td++type Fact sc s = sc -> [Term sc s]+type NotFact sc s = Fact sc s+data Unify sc s+ = Unify (Term sc s) (Term sc s)+ | NotUnify (Term sc s) (Term sc s)+ deriving Show+data Rule sc s = Rule (Fact sc s) [Unify sc s] [Fact sc s] [NotFact sc s]++notAsk :: (TwoD sc, Eq sc, Eq s) => sc ->+ Fact sc s -> [Rule sc s] -> [Maybe [(Term sc s, Term sc s)]]+notAsk sc q rs = zipWith (\sc r -> notAskRule sc q r rs) (iterate next $ down sc) rs++notAskRule :: (TwoD sc, Eq sc, Eq s) => sc ->+ Fact sc s -> Rule sc s -> [Rule sc s] -> Maybe [(Term sc s, Term sc s)]+notAskRule sc q r@(Rule fact unify facts notFacts) rs = liftA concat $+ case match of+ Nothing -> Just []+ Just _ ->+ liftA2 (:) start $ maybeOut $ concat $+ map ((flip (notAsk sc) rs) . const . ($ sc)) facts+ where+ start = notUnification (q sc) $ fact sc+ match = unification [head $ q sc] [head $ fact sc]++maybeOut :: [Maybe a] -> Maybe [a]+maybeOut [] = Just []+maybeOut (Nothing : xs) = Nothing+maybeOut (Just x : xs) = maybe Nothing (Just . (x :)) $ maybeOut xs
+ Unif.hs view
@@ -0,0 +1,180 @@+module Unif (+ unification,+ merge,+ Term(..),+ checkSimple2,+ simplify2All,+ Result+) where++import Control.Applicative+import Data.List hiding (deleteBy)+import Data.Maybe++data Term sc s = Con s | Var sc s deriving (Eq, Show)++type Result sc s = [([Term sc s], Maybe (Term sc s))]++merge :: (Eq sc, Eq s) => Result sc s -> Result sc s -> Maybe (Result sc s)+merge [] uss = Just $ simplify2All uss+merge (tsv@(ts, v1) : tss) uss = case us of+ [] -> merge tss $ tsv : uss+ (us, v2) : rest -> case mergeValue v1 v2 of+ Nothing -> Nothing+ Just v | not $ allEqual $ v2 : map snd rest -> Nothing+ | otherwise -> merge tss $+ (foldr union (union ts us) $ map fst rest, v) : uss'+ where+ us = filterElems ts uss+ uss' = deleteElems' ts uss++allEqual :: Eq a => [a] -> Bool+allEqual [x] = True+allEqual (x : y : xs) = x == y && allEqual (y : xs)++mergeValue :: Eq a => Maybe a -> Maybe a -> Maybe (Maybe a)+mergeValue x@(Just _) y@(Just _)+ | x == y = Just x+ | otherwise = Nothing+mergeValue x@(Just _) _ = Just x+mergeValue _ y = Just y++unification :: (Eq sc, Eq s) => [Term sc s] -> [Term sc s] -> Maybe (Result sc s)+unification ts us = simplify2All <$> (simplify =<< unifies ts us)+-- unification ts us = (simplify =<< unifies ts us)++-- unify :: Term -> Term -> Maybe (Maybe (Term, Term))+unify t u | t == u = Just Nothing+unify t@(Con _) u@(Con _) = Nothing+unify t u = Just $ Just (t, u)++-- unifies :: [Term] -> [Term] -> Maybe [(Term, Term)]+unifies [] [] = Just []+unifies (t : ts) (u : us) = case unify t u of+ Nothing -> Nothing+ Just Nothing -> unifies ts us+ Just (Just p) -> (p :) <$> unifies ts us+unifies _ _ = Nothing++-- before form is bellow+-- [(X, A), (A, Y), (B, Z), (hoge, B)] -- no (hoge, hage) or (B, B)+-- (Var _, Var _), (Con _, Var _), (Var _, Con _)+-- simplified form is bellow+-- [([X, A, Y], Nothing), ([Z, B], Just hoge)]++-- test data+-- a, b, x, y, hoge :: Term+a = Var "" "A"+b = Var "" "B"+x = Var "" "X"+y = Var "" "Y"+z = Var "" "Z"+hoge = Con "hoge"+-- before :: [(Term, Term)]+before = [(x, a), (a, y), (b, z), (hoge, b)]++simplify2All :: (Eq sc, Eq s) => Result sc s -> Result sc s+simplify2All ps+ | checkSimple2 ps = ps+ | otherwise = simplify2All $ simplify2 ps++checkSimple2 :: (Eq sc, Eq s) => Result sc s -> Bool+checkSimple2 = notDup' . map snd++notDup' :: Eq a => [Maybe a] -> Bool+notDup' [] = True+notDup' (Nothing : xs) = notDup' xs+notDup' (Just x : xs)+ | x `elem` (catMaybes xs) = False+ | otherwise = notDup' xs++notDup :: Eq a => [a] -> Bool+notDup [] = True+notDup (x : xs)+ | x `elem` xs = False+ | otherwise = notDup xs++simplify2 [] = []+simplify2 ((ts, v@(Just _)) : ps) = (maybe ts (ts ++) ts', v) : simplify2 ps'+ where+ ts' = lookupSnd v ps+ ps' = deleteSnd v ps+simplify2 (p : ps) = p : simplify2 ps++lookupSnd :: Eq b => b -> [(a, b)] -> Maybe a+lookupSnd x = lookup x . map (\(y, z) -> (z, y))++deleteSnd :: Eq b => b -> [(a, b)] -> [(a, b)]+deleteSnd x = filter ((/= x) . snd)++-- simplify :: [(Term, Term)] -> Maybe [([Term], Maybe Term)]+simplify [] = Just []+simplify ((Con _, Con _) : _) = error "bad before data"+simplify ((t@(Var _ _), u@(Var _ _)) : ps) = case simplify ps of+ Nothing -> Nothing+ Just ps' -> case (lookupElem t ps', lookupElem u ps') of+ (Just (ts, Just v1), Just (us, Just v2))+ | v1 == v2 -> Just $ (union ts us, Just v1) :+ deleteElem t (deleteElem u ps')+ | otherwise -> Nothing+ (Just (ts, Just v1), Just (us, _)) ->+ Just $ (union ts us, Just v1) :+ deleteElem t (deleteElem u ps')+ (Just (ts, _), Just (us, v2)) ->+ Just $ (union ts us, v2) :+ deleteElem t (deleteElem u ps')+ (Just (ts, v1), _) -> Just $ (u : ts, v1) : deleteElem t ps'+ (_, Just (us, v2)) -> Just $ (t : us, v2) : deleteElem u ps'+ (_, _) -> Just $ ([t, u], Nothing) : ps'+simplify ((t@(Var _ _), u) : ps) = case simplify ps of+ Nothing -> Nothing+ Just ps' -> case lookupElem t ps' of+ Just (ts, Just v1)+ | u == v1 -> Just ps'+ | otherwise -> Nothing+ Just (ts, _) -> Just $ (ts, Just u) : deleteElem t ps'+ _ -> Just $ ([t], Just u) : ps'+simplify ((t, u) : ps) = case simplify ps of+ Nothing -> Nothing+ Just ps' -> case lookupElem u ps' of+ Just (us, Just v2)+ | t == v2 -> Just ps'+ | otherwise -> Nothing+ Just (us, _) -> Just $ (us, Just t) : deleteElem u ps'+ _ -> Just $ ([u], Just t) : ps'++deleteElems :: Eq a => [a] -> [([a], b)] -> [([a], b)]+deleteElems = deleteBy $ \x y -> not $ null $ intersect x y++deleteElems' :: Eq a => [a] -> [([a], b)] -> [([a], b)]+deleteElems' xs = filter $ \ys -> null $ intersect xs $ fst ys++deleteBy :: (a -> b -> Bool) -> a -> [(b, c)] -> [(b, c)]+deleteBy _ _ [] = []+deleteBy p x ((y, z) : ps)+ | p x y = ps+ | otherwise = (y, z) : deleteBy p x ps++deleteElem :: Eq a => a -> [([a], b)] -> [([a], b)]+deleteElem _ [] = []+deleteElem x ((xs, y) : ps)+ | x `elem` xs = ps+ | otherwise = (xs, y) : deleteElem x ps++filterElems :: Eq a => [a] -> [([a], b)] -> [([a], b)]+filterElems xs = filter (\ys -> not $ null $ intersect xs $ fst ys)++lookupElems :: Eq a => [a] -> [([a], b)] -> Maybe ([a], b)+lookupElems = lookupBy $ \x y -> not $ null $ intersect x y++lookupBy :: (a -> b -> Bool) -> a -> [(b, c)] -> Maybe (b, c)+lookupBy _ _ [] = Nothing+lookupBy p x ((y, z) :ps)+ | p x y = Just (y, z)+ | otherwise = lookupBy p x ps++lookupElem :: Eq a => a -> [([a], b)] -> Maybe ([a], b)+lookupElem _ [] = Nothing+lookupElem x ((xs, y) : ps)+ | x `elem` xs = Just (xs, y)+ | otherwise = lookupElem x ps
− lojsamban.hs
@@ -1,166 +0,0 @@-import PrologLike-import Language.Lojban.Parser hiding (LA, Brivla, KOhA, GOhA, NA, LerfuString)-import qualified Language.Lojban.Parser as P-import System.Environment-import Data.Maybe-import Data.Either-import Data.List--main :: IO ()-main = do- [fn] <- getArgs- src <- readFile fn- let Right p = parse src- let facts = map readSentence $ getSentences p--- print facts- q <- (readSentence . either (error "bad") id . parse) `fmap` getLine- putStrLn $ case ask q facts of- Just r -> case answerMa r of- Just ma -> ma- Nothing -> case answerRelfuString r of- Just rs -> rs- Nothing -> "go'i"- Nothing -> "nago'i"--- maybe (return ()) putStrLn $ answerRelfuString $ ask q facts--- putStrLn $ if ask q facts then "go'i" else "nago'i"--- putStrLn $ show $ ask q facts--- print q--answerRelfuString :: [[(Term, Term)]] -> Maybe String-answerRelfuString ps- | null answers = Nothing- | otherwise = Just $ intercalate " .ija " answers- where- answers = map answerRelfuString1 ps--answerRelfuString1 :: [(Term, Term)] -> String-answerRelfuString1 ps = "tu'e " ++ intercalate " .ije " (map showDU rsps) ++ " tu'u"- where- rsps = filter isRSPair ps--showDU :: (Term, Term) -> String-showDU (LerfuString ls, LA n) = ls ++ " du la " ++ n-showDU (LerfuString ls, LO n) = ls ++ " du lo " ++ n--isRSPair :: (Term, Term) -> Bool-isRSPair (LerfuString _, _) = True-isRSPair _ = False--answerMa :: [[(Term, Term)]] -> Maybe String-answerMa ps- | null answers = Nothing- | otherwise = Just $ intercalate " .a " answers- where- answers = catMaybes $ map answerMa1 ps--answerMa1 :: [(Term, Term)] -> Maybe String-answerMa1 ps = case lookup (VKOhA "ma") ps of- Nothing -> Nothing- Just (LA n) -> Just $ "la " ++ n- Just (LO n) -> Just $ "lo " ++ n--getSentences :: Sentence -> [Sentence]-getSentences (IText_1 _ _ _ _ (Just t)) = getSentences t-getSentences (StatementI s1 ss) = s1 : catMaybes (map (\(_, _, s) -> s) ss)-getSentences o = error $ show o--headTerms :: Sentence -> [Sumti]-headTerms (TermsBridiTail ts _ _ _) = ts-headTerms _ = []--bridiTail :: Sentence -> Sentence-bridiTail (TermsBridiTail _ _ _ bt) = bt-bridiTail o = o--selbri :: Sentence -> Selbri-selbri (SelbriTailTerms s _ _ _) = s-selbri _ = P.Brivla ([], "", []) []--tailTerms :: Sentence -> [Sumti]-tailTerms (SelbriTailTerms _ ts _ _) = ts-tailTerms _ = []--function :: Selbri -> Function-function (P.Brivla (_, n, _) _) = Brivla n-function (P.GOhA (_, n, _) _ _) = GOhA n-function (P.NA (_, "na", _) _ s) = NA $ function s--readLALO :: Sumti -> Term-readLALO (P.LA (_, "la", _) _ _ ns _) = LA $ concat $ map ((++ ".") . snd3) ns-readLALO (P.LALE (_, "lo", _) _ st _ _) = LO $ readSumtiTail st-readLALO (P.KOhA (_, k@"ma", _) _) = VKOhA k-readLALO (P.KOhA (_, k@"da", _) _) = VKOhA k-readLALO (P.KOhA (_, k@"de", _) _) = VKOhA k-readLALO (P.KOhA (_, k@"di", _) _) = VKOhA k-readLALO (P.KOhA (_, k@"do", _) _) = VKOhA k-readLALO (P.KOhA (_, k, _) _) = KOhA k-readLALO (P.LerfuString s _ _) = LerfuString $ concatMap snd3 s--readSumtiTail :: SumtiTail -> String-readSumtiTail (SelbriRelativeClauses (P.Brivla (_, n, _) _) _) = n-readSumtiTail st = show st--readSentence :: Sentence -> FactRule-readSentence s@(TermsBridiTail _ _ _ _) = Fact f $ h ++ t- where- h = map readLALO $ headTerms s- f = function $ selbri $ bridiTail s- t = map readLALO $ tailTerms $ bridiTail s-readSentence (IJoikJek s [r]) = Rule (readSentence s) (getRule r)--getRule (_, Jek _ _ (_, "ja", _) (Just (_, "nai", _)), _, Just t) = readTUhE t--readTUhE (TUhE _ _ _ t _ _) = map readSentence $ getSentences t--checkKOhA :: FactRule -> FactRule -> [(Term, Term)]-checkKOhA (Fact _ ts1) (Fact _ ts2) = zip ts1 ts2--{--findFacts :: FactRule -> [FactRule] -> [FactRule]-findFacts (Fact f0 _) fs = filter (isFactFor f0) fs--isFactFor :: Function -> FactRule -> Bool-isFactFor f0 (Fact f1 _) = f0 == f1-isFactFor _ _ = False--ask :: FactRule -> [FactRule] -> Bool-ask (Fact (NA f) ts) facts = not $ ask (Fact f ts) facts-ask (Fact (GOhA "du") ts) _ = ts !! 0 == ts !! 1-ask q@(Fact f ts) facts- | q `elem` facts = True- | otherwise = case findRule q facts of- Nothing -> False- Just r -> and $ map (flip ask facts) $ apply ts r--findRule :: FactRule -> [FactRule] -> Maybe FactRule-findRule (Fact f _) rs = let ret = filter (isRuleFor f) rs in- if null ret then Nothing else Just $ head ret--isRuleFor :: Function -> FactRule -> Bool-isRuleFor f0 (Rule (Fact f1 _) _) = f0 == f1-isRuleFor _ _ = False--apply :: [Term] -> FactRule -> [FactRule]-apply ts2 (Rule (Fact _ ts1) fs) = map (changeFactTerms ts1 ts2) fs--changeFactTerms :: [Term] -> [Term] -> FactRule -> FactRule-changeFactTerms ts1 ts2 (Fact f ts) = Fact f $ changeTerms ts1 ts2 ts--changeTerms :: [Term] -> [Term] -> [Term] -> [Term]-changeTerms [] _ ts = ts-changeTerms _ [] ts = ts-changeTerms (t1 : ts1) (t2 : ts2) ts =- changeTerms ts1 ts2 $ changeTerm t1 t2 ts--changeTerm :: Term -> Term -> [Term] -> [Term]-changeTerm _ _ [] = []-changeTerm t1 t2 (t : ts)- | t == t1 = t2 : changeTerm t1 t2 ts- | otherwise = t : changeTerm t1 t2 ts--sampleRule = Rule (Fact (Brivla "pendo") [KOhA "da", KOhA "de"])- [Fact (Brivla "nelci") [KOhA "da", KOhA "de"]]--}--snd3 :: (a, b, c) -> b-snd3 (_, y, _) = y
+ lojsamban2.hs view
@@ -0,0 +1,150 @@+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TupleSections #-}++module Main where++import LojbanTools+import Prolog2+import Language.Lojban.Parser hiding (LA, Brivla, KOhA, GOhA, NA, LerfuString)+import qualified Language.Lojban.Parser as P+import System.Environment+import Data.Maybe+import Data.Either+import Data.List+import Control.Monad+import Control.Arrow+import Control.Applicative++main :: IO ()+main = do+ [fn] <- getArgs+ src <- readFile fn+ let Right p = parse src+ rules = map readSentence $ getSentences p+ Left q <- (readSentenceFact . either (error "bad") id . parse)+ `fmap` getLine+ let answer = ask [] [] q rules+-- print (rules :: [Rule String Atom])+-- print (q [] :: [Term Scope Atom])+ let answer2_1 = unwords $ intersperse ".ija" $ map unwords $ filter ((> 2) . length) $+ map ((\ret -> intersperse ".ije" ret) . map showPair . filter (not . isMA . fst) . regularization . onlyTopVars) answer+ answer2 = unwords $ intersperse ".ija" $ map unwords $ filter ((> 2) . length) $+ map ((\ret -> "tu'e" : intersperse ".ije" ret ++ ["tu'u"]) . map showPair . filter (not . isMA . fst) . regularization . onlyTopVars) answer+ putStr $ case answer of+ [] -> "nago'i\n"+ _ -> case intersperse ".a" $ catMaybes $ (flip map) (map maValue answer) $ (showAtom <$>) of+ [] -> if null answer2 then "go'i\n" else ""+ m -> unwords m ++ "\n"+ if null answer2 then return () else+ if length answer == 1 then putStrLn answer2_1 else putStrLn answer2+-- putStr $ unlines $ map show $ filter (not . isMA . fst) $ map regularization $ map (show . regularization . onlyTopVars) answer+-- putStrLn $ showAnswerAll answer++showAtom :: Atom -> String+showAtom (LA n) = "la " ++ n+showAtom (LO n) = "lo " ++ n++maValue :: Result Scope Atom -> Maybe Atom+maValue r = case filter (not . null . fst) $ map (first $ filter isMA) r of+ [] -> Nothing+ ((_, tv) : _) -> (\(Con v) -> v) <$> tv++isMA :: Term Scope Atom -> Bool+isMA (Var [_] (KOhA "ma")) = True+isMA _ = False++showAnswerAll a = if null a then "nago'i" else+ intercalate " .a " $ map showAnswer $ map (lookupMA . onlyTop) a++showPair :: (Term Scope Atom, Term Scope Atom) -> String+showPair (Var _ (KOhA k), Con (LO n)) = k ++ " du lo " ++ n+showPair (Var _ (LerfuString l), Con (LO n)) = l ++ " du lo " ++ n+showPair (Var _ (KOhA k), Con (LA n)) = k ++ " du la " ++ n+showPair (Var _ (LerfuString l), Con (LA n)) = l ++ " du la " ++ n++regularization :: Result sc s -> [(Term sc s, Term sc s)]+regularization [] = []+regularization ((_, Nothing) : rest) = regularization rest+regularization ((vars, Just val) : rest) = map (, val) vars ++ regularization rest++onlyTopVars :: Result Scope s -> Result Scope s+onlyTopVars = filter (not . null . fst) . map (first $ filter isTopVar)++isTopVar :: Term Scope s -> Bool+isTopVar (Var [_] _) = True+isTopVar _ = False++lookupMA = map snd . filter ((Var "top" (KOhA "ma") `elem`) . fst)++showAnswer as = if null as then "go'i" else showLA $ head as++showLA (Just (Con (LA n))) = "la " ++ n+showLA (Just (Con (LO n))) = "lo " ++ n++onlyTop = filter (not . null . fst) .+ map (\(vars, val) -> (filter isTop vars, val))++isTop :: Term String s -> Bool+isTop (Var "top" _) = True+isTop _ = False++data Atom+ = LA String+ | LO String+ | KOhA String+ | Brivla String+ | GOhA String+ | LerfuString String+ deriving (Show, Eq)++type Scope = [Int]++instance TwoD [Int] where+ next (n : ns) = n + 1 : ns+ down ns = 0 : ns++readSumti :: Scope -> Sumti -> Term Scope Atom+readSumti sc (P.LA (_, "la", _) _ _ ns _) = Con $ LA $ concat $ map snd3 ns+readSumti sc (P.LALE (_, "lo", _) _ st _ _) = Con $ LO $ readSumtiTail st+readSumti sc (P.KOhA (_, k, _) _) = Var sc $ KOhA k+readSumti sc (P.LerfuString s _ _) = Var sc $ LerfuString $ concatMap snd3 s++readSumtiTail :: SumtiTail -> String+readSumtiTail (SelbriRelativeClauses (P.Brivla (_, n, _) _) _) = n+readSumtiTail st = show st++readSelbriAtom (P.GOhA (_, n, _) _ _) = GOhA n++readSelbri :: Selbri -> Either (Term Scope Atom) (Term Scope Atom)+readSelbri (P.Brivla (_, n, _) _) = Left $ Con $ Brivla n+readSelbri (P.GOhA (_, n, _) _ _) = Left $ Con $ GOhA n+readSelbri (P.NA (_, "na", _) _ s) = Right $ Con $ readSelbriAtom s++readSentenceFact :: Sentence -> Either (Fact Scope Atom) (Fact Scope Atom)+readSentenceFact s@(TermsBridiTail _ _ _ _) =+ either (\lf -> Left $ \sc -> lf : (h sc ++ t sc))+ (\rf -> Right $ \sc -> rf : (h sc ++ t sc)) f+ where+ h sc = map (readSumti sc) $ headTerms s+ f = readSelbri $ selbri $ bridiTail s+ t sc = map (readSumti sc) $ tailTerms $ bridiTail s+readSentenceFact (TopText _ _ _ _ (Just s) _) = readSentenceFact s+readSentenceFact o = error $ show o++readSentence :: Sentence -> Rule Scope Atom+readSentence s@(TermsBridiTail _ _ _ _) = Rule (\sc -> f : h sc ++ t sc) [] [] []+ where+ h sc = map (readSumti sc) $ headTerms s+ Left f = readSelbri $ selbri $ bridiTail s+ t sc = map (readSumti sc) $ tailTerms $ bridiTail s+readSentence (IJoikJek s [r]) = Rule f [] (getRule r) (getNotRule r)+ where+ Left f = readSentenceFact s++getRule (_, Jek _ _ (_, "ja", _) (Just (_, "nai", _)), _, Just t) =+ lefts $ readTUhE t+getNotRule (_, Jek _ _ (_, "ja", _) (Just (_, "nai", _)), _, Just t) =+ rights $ readTUhE t++readTUhE (TUhE _ _ _ t _ _) = map readSentenceFact $ getSentences t
lojysamban.cabal view
@@ -2,7 +2,7 @@ cabal-version: >= 1.6 name: lojysamban-version: 0.0.1+version: 0.0.2 stability: experimental author: .iocikun.juj. <PAF01143@nifty.ne.jp> maintainer: .iocikun.juj. <PAF01143@nifty.ne.jp>@@ -19,5 +19,6 @@ location: git://github.com/YoshikuniJujo/lojsamban.git executable lojysamban- main-is: lojsamban.hs+ main-is: lojsamban2.hs+ other-modules: LojbanTools, Prolog2, PrologTools, NotUnif, Unif build-depends: base > 3 && < 5, lojbanParser