昨日の今日で

また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
「ソクラテス」は「植物」ではない。
「ソクラテス」は「動物」である。
「ミドリムシ」は「必ず死ぬ存在」である。
「人間」は「必ず死ぬ存在」である。
「ミドリムシ」は「光合成を行うことができる存在」である。
「ソクラテス」は「必ず死ぬ存在」である。

なんか足りねぇ。もっとカッコよくする(かも)。