昨日の今日で
またHaskell。rubycoの日記「人工知能もどき」より。deriveの作りがマズイ。あとで何とかする(かも)。Stateを使うしかないのかしらん。
(追記)ちょっといじりました。うまく動いたが。今はこれがせーいっぱい(「カリオストロの城」より)
(さらに追記)Knowledgeを名前つきデータ型に変更。ちょっとすっきりしたかな。作って壊す。これが人の営み。
module Main (main) where import Text.Regex import Control.Monad.State data Knowledge = Knowledge { key::String, val::String, tag::String } deriving Show main = let l = map learn getData g = given l d = derive l w = map (wisdom) d in output w learn :: String -> Knowledge learn s = case matchRegexAll re1 s of Just (_,_,_,x) -> Knowledge { key = x!!0, val = x!!1, tag = "" } _ -> case matchRegexAll re2 s of Just (_,_,_,y) -> Knowledge { key = y!!0, val = y!!1 ++ "とはいえない存在", tag = "" } _ -> Knowledge { key = "", val = "", tag = "" } where re1 = mkRegex "「(.+?)」は「(.+?)」である。" re2 = mkRegex "「(.+?)」は「(.+?)」ではない。" given :: [Knowledge] -> [Knowledge] given [] = [] given (k:ks) = Knowledge { key = key k, val = val k, tag = "given"}:given ks derive :: [Knowledge] -> [Knowledge] derive x = let y = derive' x x in y ++ derive' y x where derive' a b = concatMap (derive'' a) b derive'' [] _ = [] derive'' (k:ks) l = if (val k == key l) then Knowledge { key = key k, val = val l, tag = "derive" }:derive'' ks l else derive'' ks l wisdom :: Knowledge -> String wisdom k = case matchRegexAll re (val k) of Just (_,_,_,x) -> "「" ++ key k ++ "」は「" ++ x!!0 ++ "」ではない。" _ -> "「" ++ key k ++ "」は「" ++ val k ++ "」である。" where re = mkRegex "(.*)とはいえない存在$" output ws = mapM_ putStrLn ws getData = [ "「ソクラテス」は「人間」である。", "「ミドリムシ」は「動物」である。", "「ミドリムシ」は「葉緑素を持っている存在」である。", "「人間」は「植物」ではない。", "「人間」は「動物」である。", "「動物」は「必ず死ぬ存在」である。", "「葉緑素を持っている存在」は「光合成を行うことができる存在」である。" ]
$ runhugs -98 Solver.hs 「ソクラテス」は「植物」ではない。 「ソクラテス」は「動物」である。 「ミドリムシ」は「必ず死ぬ存在」である。 「人間」は「必ず死ぬ存在」である。 「ミドリムシ」は「光合成を行うことができる存在」である。 「ソクラテス」は「必ず死ぬ存在」である。
なんか足りねぇ。もっとカッコよくする(かも)。