æäœ + äžç«èŠçŽ ãšã¢ãã€ãã圢æãã $ã€ã³ã©ã€ã³$ 0 $ã€ã³ã©ã€ã³$ ïŒ
a+0=0+a=aã quada+ïŒb+cïŒ=ïŒa+bïŒ+c;
æäœ \å äžç«èŠçŽ ãšã¢ãã€ãã圢æãã 1 ïŒ
a times1=1 timesa=aãa timesïŒb timescïŒ=ïŒa timesbïŒ timesc;
ãŒãã®ä¹æ³ç¹æ§ãæºããããŸãã0 timesx=x times0=0;
ã€ã³ããªã¥ãŒã·ã§ã³ããããã£ïŒïŒxâ²ïŒâ²=x;
ã€ã³ããªã¥ãŒã·ã§ã³ã«å¯ŸãããŒããš1ã®å察æ§ïŒ0â²=1ã1â²=0;
ã¢ãŒã¬ã³ã®æ³åïŒïŒA+BïŒâ²=Aâ² timesBâ²ãïŒA timesBïŒâ²=Aâ²+Bâ²ã
å³å¯ã«èšãã°ãä¹ç®ã¯å ç®ã«é¢ããŠåé
çã§ããå¿
èŠããããŸãããå Žåã«ãã£ãŠã¯ïŒããšãã°ãé»æ°åè·¯ã®å ŽåïŒãããã¯æ£ãããªãå ŽåããããŸãã ãããããããæºããããŠããå Žåãå ç®ãšä¹ç®ã®çµã¿åããã§æ§æãããè€éãªåŒã¯ããã¹ãŠã®æ¬åŒ§ãéãããšã§åé
åŒã®åèšã®åœ¢ã«çž®å°ã§ããŸããéã«ãæ¬åŒ§ããå
±éã®å åãåãåºãããšã§åŒãåçŽåããããšãã§ããŸãã
å Žåã«ãã£ãŠã¯ãã€ã³ããªã¥ãŒã·ã§ã³ã¯å転ã®åœ¹å²ãæãããŸããã€ãŸããä¹ç®æŒç®ã®éèŠçŽ ãçæããŸãã ãã®åŸã次ã®ã¢ã€ãã³ãã£ãã£ãä¿æãããŸãã
x timesxâ²=xâ² timesx=
ããã¯ããŒã«ä»£æ°ãšæµæ代æ°ã«ã¯åœãŠã¯ãŸããŸãããããŒãã«ã«ã¯åœãŠã¯ãŸããŸããã
Haskelläžã®de Morgan代æ°ã®æœè±¡å
äœæ¥ãéå§ããåã«ãããã€ãã®æ¡åŒµæ©èœãæ¥ç¶ããŸãã
{-# LANGUAGE DeriveFunctor, FlexibleInstances, GeneralizedNewtypeDeriving #-}
de Morgan代æ°ã®åã®ã¯ã©ã¹ãå®çŸ©ããŸãã
class DeMorgan a where {-# MINIMAL inv,((<->)|(<|>)),(zero|one) #-} inv :: a -> a zero :: a zero = inv one one :: a one = inv zero (<->) :: a -> a -> a a <-> b = inv (inv a <|> inv b) (<|>) :: a -> a -> a a <|> b = inv (inv a <-> inv b)
ãã®å®çŸ©ã§ã¯ãã¯ã©ã¹ã§ã®äœæ¥ãç°¡çŽ åããããã«ããã§ã«de Morganã®æ³åã䜿çšããŠããŸãã æšæ¬ã®èª¬æã§ã¯ã2ã€ã®ã¢ãã€ãæäœããã®äžç«èŠçŽ ãšã€ã³ããªã¥ãŒã·ã§ã³ã®ãã¡ã®1ã€ã ãã決å®ããã°ååã§ãã
è«çããŒã¿ã®DeMorgan
ã¯ã©ã¹ã®æåã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
instance DeMorgan Bool where zero = False inv = not (<->) = (&&)
ãã¡ãããå¹çäžã®çç±ããã <|>
æŒç®åãæ瀺çã«å®çŸ©ãã䟡å€ããããŸããããã®ç°¡æœãªå®çŸ©ã®ãŸãŸã«ããŠã Bool
åã®ä»£æ°ãå®å
šã«å®çŸ©ããããã«ããŸãã
> True <|> False True > one :: Bool True
ããŒã«ä»£æ°ãããã¯è¯ãã§ãããããŸãã«ãç°¡åã§ãã Lotfie Zadehã®ç²Ÿç¥ã§ãã¡ãžãŒããžãã¯ã®ä»£æ°ãæ§ç¯ããããšã§ãããèŠçŽããŸãããã ãããè¡ãã«ã¯ã Fuzzy
ã©ãããŒã¿ã€ããå®çŸ©ããã³ã³ãã€ã©ãŒã«æ°å€ããããã£ãå°åºããããèŠæ±ããŸãã
newtype Fuzzy = Fuzzy { deFuzzify :: Double } deriving (Show, Num, Fractional, Ord, Eq) instance DeMorgan Fuzzy where zero = 0 inv x = fuzzify $ 1 - x a <|> b = fuzzify $ max ab fuzzify x = 0 `max` x `min` 1
> deFuzzify $ one 1 > deFuzzify $ 0.2 <-> 0.4 0.2 > deFuzzify $ 0.8 <|> 0.4 <-> 0.5 0.5 > deFuzzify $ 0.3 <|> 0.4 <-> 0.5 0.4
ãã¹ãããããªã¹ãã§è¡šãããããŒãã«ã®æãåçŽãªde Morgan代æ°ãå®çŸ©ããŸãã
instance DeMorgan [[a]] where zero = [] (<|>) = (++) inv = transpose
ããã§ã¯ã Data.List
ã©ã€ãã©ãªã®transpose
é¢æ°ã䜿çšããŸããã ãã®ä»£æ°ã®ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
> inv [[1,2],[3,4]] [[1,3],[2,4]] > [[1,2],[3,4]] <-> [[5],[6]] [[1,2,5],[3,4,6]] > [[1,2],[3,4]] <|> [[5,6]] [[1,2],[3,4],[5,6]]
åçŽãªè¡šåœ¢åŒã®é¢æ°ãäœæããããã«äœ¿çšããŸããã
table :: (Show a, Show b) => (a -> a -> b) -> [a] -> [[String]] table f vals = ([[" "]] <-> h) <|> (inv h <-> c) where h = [show <$> vals] c = [show <$> [ fxy | x <- vals] | y <- vals] showTable tbl = putStrLn $ unlines $ unwords <$> tbl
> showTable $ table mod [1..6] 1 2 3 4 5 6 1 0 0 0 0 0 0 2 1 0 1 0 1 0 3 1 2 0 1 2 0 4 1 2 3 0 1 2 5 1 2 3 4 0 1 6 1 2 3 4 5 0
æåŸã«ãæµæãæãåºããŠãæ°åãããæ£ç¢ºã«ã¯ãé€ç®æŒç®ãå®çŸ©ãããŠããæ°åã¿ã€ãã®ãã»ã¢ã«ã¬ã³ä»£æ°ãæ§ç¯ããŸãããã ãããè¡ãã«ã¯ã Frac
ã©ãããŒã¿ã€ããå®çŸ©ããŸãã
newtype Frac a = Frac {getFrac :: a} deriving (Show, Num, Fractional, Functor) instance Fractional a => DeMorgan (Frac a) where zero = 0 inv = (1/) (<->) = (+)
> getFrac $ 2 <-> 6 8.0 > getFrac $ 2 <|> 6 1.5 > getFrac $ 1 <-> (2 <|> (1 <-> 1)) 2.0
äŸãšããŠãå³ã«ç€ºãåè·¯ã®å®å¹æµæãè¡šçŸãã12 Vã®é»å§ã§ã®é»æµåŒ·åºŠãèšç®ããŸãã

> getFrac $ ((6 <|> 12) <-> 4) <|> (3 <-> 5) 4.0 > getFrac $ 12 / ((6 <|> 12) <-> 4) <|> (3 <-> 5) 3.0
ãã¥ã¢ã«ä»£æ°
è€éãªã°ãã·ã¹ãã ã®æå¹åæ§ãŸãã¯ã³ã³ãã³ãµãã³ã¯ã®å®¹éãèšç®ããã«ã¯ã Frac
ã¿ã€ããé©ããŠããŸããããããã®èšç®ã«ã¯ãæŒç®å<|>
ãš<->
ãããã³èŠçŽ zero
ãšone
ã亀æããå¿
èŠããããŸãã æ°åŠè
ã¯ããã®å€æã§å察代æ°ãžã®ç§»è¡ãåãã§èªèããŸãã è¯ãããã«èãããŸãããã¹ããªã³ã°ã®äžŠåæ¥ç¶ãæã2 <-> 3
æžããããããŸããã æŒç®åã®ã»ãã³ãã£ã¯ã¹ãç¶æããã®ã¯è¯ãããšã§ãããèšç®ã®å®è¡æ¹æ³ãå€æŽããŸãã
ããã§ããæ°åŠã¯ãã®ææã掻çšããæ©äŒãäžããŠãããŸãã ã¢ãã€ãã«ã€ããŠã¯ããã¢ã«ã¬ã³ä»£æ°ã«ã€ããŠã¯ãããã¹ãŠãéãã®å察代æ°ãå®çŸ©ãããŠããŸãã Haskellèšèªã§ãã®ç¶æ³ã説æããŸãã å察代æ°çšã®æ°ããDual
ã©ãããŒåãäœæãã a
ãde Morgan代æ°ã§ããå Žåãå察ãde Morgan代æ°ã«ãªãããšããç¥ãããã ããã
newtype Dual a = Dual {getDual :: a} deriving (Show, Num, Fractional, Eq, Ord, Functor) instance DeMorgan a => DeMorgan (Dual a) where zero = Dual one one = Dual zero inv x = inv <$> x Dual a <|> Dual b = Dual $ a <-> b Dual a <-> Dual b = Dual $ a <|> b
ããã§ã3ã€ã®ããã®ã·ã¹ãã ã®æå¹åæ§ãèšç®ã§ããŸãããã®ãã¡ã®1ã€ã¯çŽåã«æ¥ç¶ãããä»ã®ãã¢ã¯äžŠåã«æ¥ç¶ãããŠããŸãã
> getFrac . getDual $ 600 <-> (200 <|> 300) 450.0
åæšè«ã«ãããèšç®ã®ãåºå£ãã§ã®ã¿äœ¿çšãã代æ°ãæå®ã§ããŸãã ãããã£ãŠãæ瀺çã«ãåæã«åŒã®è©äŸ¡æ¹æ³ãå€æŽããã ãã§ãã
ç¡æã®ä»£æ°
ããããæµæã ãã§ãªãããŒãã³ã³ãã³ãµãã³ã€ã«ãªã©ãå«ãåè·¯ãæ³åããŠèšç®ãããå Žåã¯ã©ãã§ããããïŒ ãããŠãã«ãŠã³ãããã ãã§ãªããããããè¡šçŸãããããã¡ã€ã«ã«ä¿åãããããŸããïŒ ãã®ããã«ã¯ãç¡æã®ä»£æ°ãå¿
èŠã§ãã
ãã§ãŒã³ã¯ãäœãèšç®ããªãããŒã¿æ§é ã§è¡šãããŸããããã§ãŒã³ã®ä»£æ°æ§é ãåæ ããde Morgan代æ°ã圢æããŸãã
data Circuit a = Zero | One | Elem a | Inv (Circuit a) | Par (Circuit a) (Circuit a) | Seq (Circuit a) (Circuit a) deriving (Show, Functor)</hs></pre> instance DeMorgan (Circuit a) where zero = Zero one = One (<->) = Seq (<|>) = Par inv = Inv
ãã§ãŒã³èŠçŽ ã®ã€ã³ããªã¥ãŒã·ã§ã³ãŸãã¯ã€ã³ããŒãžã§ã³ã¯æ確ãªæå³ãæã¡ãŸããããæ£ç¢ºããšäžè¬æ§ã®ããã«ãã¿ã€ãã®èª¬æã«ãããå«ããŸããã
æåã®èªç¶ãªæºååã¯ã Circuit
åããde Morgan代æ°ãå®çŸ©ãããŠããä»»æã®åãžã®å€æã§ãã
reduce :: DeMorgan a => Circuit a -> a reduce circ = case circ of Zero -> zero One -> one Elem b -> b Inv a -> inv (reduce a) Par ab -> reduce a <|> reduce b Seq ab -> reduce a <-> reduce b
reduce
é¢æ°ã¯fold
é¢æ°ã«äŒŒãŠãããã¢ãã€ãã®ãªã¹ããä»»æã®ã¢ãã€ãã«fold
ãŸãã foldMap
é¢æ°ãfold
é¢æ°ãããã¡ã³ã¯ã¿ãŒçšã«äœæã§ããã®ãšåãæ¹æ³ã§ã foldMap
é¢æ°ãäœæã§ããŸãã
reduceMap :: DeMorgan b => (a -> b) -> Circuit a -> b reduceMap = reduce . fmap f
ãã®é¢æ°ã䜿çšãããšããã§ãŒã³ã解éãããšãã«äœ¿çšããde Morgan代æ°ãæ瀺çã«æå®ã§ããŸãã
ã¢ãã€ããšç§ãã¡ã®ä»£æ°ã®ç³ã¿èŸŒã¿é¢æ°ã®å®çŸ©ã§ãã®ãããªçŸãã察称æ§ãèŠã€ããããšã¯ã審çŸçãªåã³ãäžããããšãèªããªããã°ãªããŸããïŒ
ããŸããŸãªåè·¯èšèšã¿ã¹ã¯
ãã§ãŒã³ãæ§ç¯ããããã«ããªããžã§ã¯ãæååLumped
ãæŽçããŸããããã«ããã Value a
åè·¯ã®èŠçŽ ã®ãã©ã¡ãŒã¿ãŒã®å€ã«å ããŠãShort Circuit Short
ãšCircuit Break
ãæ瀺çã«è¡šãããšãã§ããŸãã
data Lumped a = Short | Value a | Break deriving (Show, Functor) instance DeMorgan s => DeMorgan (Lumped s) where zero = Break Value r1 <-> Value r2 = Value $ r1 <-> r2 Short <-> r = r r <-> Short = r _ <-> Break = Break Break <-> _ = Break inv Short = Break inv Break = Short inv (Value r) = Value (inv r)
ãšã¬ã¡ã³ãã®ã¿ã€ãã玹ä»ããŸãïŒæµæãã³ã³ãã³ãµãã€ã³ãã¯ã¿ã³ã¹ãããã³åè·¯ãšã¬ã¡ã³ãã®èšèšè
ïŒ
data Element = R Double | C Double | L Double deriving Show res = Elem . R cap = Elem . C coil = Elem . L key True = Zero key False = One
æåŸã«ãå®éšçšã®åçŽãªãã§ãŒã³ãäœæããŸãã
s :: Bool -> Circuit Element sk = res 10 <-> ((res 2 <-> coil 5e-3 <-> key k) <|> cap 10e-9)
ããã§ãèªç±ä»£æ°ã®ããŸããŸãªè§£éãæ§ç¯ããæºåãæŽããŸããã
connect
é¢æ°ã¯ãããŒã«ä»£æ°ã䜿çšããŠåè·¯ãéããŠãããã©ããã決å®ããŸãã
connected :: Circuit Element -> Bool connected = reduceMap f where f el = case el of R _ -> True C _ -> False L _ -> True
> connected (s True) True > connected (s False) False
resistance
é¢æ°ã¯ãåæ°ã®ä»£æ°ã䜿çšããŠãçŽæµã®å®å¹åè·¯æµæã決å®ããŸãã
resistance :: Circuit Element -> Lumped Double resistance = fmap getFrac . reduceMap (fmap Frac . f) where f el = case el of R r -> Value r C _ -> Break L _ -> Short
ããã§ã¯ãèšç®äœæ¥ã¯ããã¡ã³ã¯ã¿ãŒã宣èšããLumped
åã®å
éšã§è¡ãããŸãã
> resistance (s True) Value 12 > resistance (s False) Break
åè·¯ã®ã€ã³ããŒãã³ã¹ãèšç®ããã«ã¯ã Data.Complex
ã¢ãžã¥ãŒã«ãæ¥ç¶ããå¿
èŠããããŸãïŒ
impedance :: Double -> Circuit Element -> Lumped (Complex Double) impedance w = fmap getFrac . reduceMap (fmap Frac . f) where f el = Value $ case el of R r -> r :+ 0 C c -> 1 / (0 :+ w*c) L l -> 0 :+ w*l
> impedance 1e3 (s False) Value (10.0 :+ (-99999.99999999997)) > impedance 1e3 (s True) Value (12.00020001420084 :+ 5.0002100065000405) > impedance 1e6 (s False) Value (10.0 :+ (-100.0)) > impedance 1e6 (s True) Value (10.000832986116954 :+ (-102.04081598653629))
ã³ã³ãã³ãµãã³ã¯ã®èšç®ã«ã€ããŠè©±ããŠããå Žåã¯ã代æ°ããã¥ã¢ã«ã«å€æŽããå¿
èŠããããŸãã
capacity :: Circuit Element -> Lumped Double capacity = fmap (getFrac . getDual) . reduceMap (fmap (Dual . Frac) . f) where f el = case el of R _ -> Short C c -> Value c L _ -> Short
ããããã¹ãŠã®è§£éã«ãããŠãåè·¯ã®ç¹æ§ã®èšç®æ¹æ³ã瀺ããåã
ã®èŠçŽ ã®èšç®æ¹æ³ã®ã¿ã決å®ããç³ã¿èŸŒã¿ã«é©ãã代æ°ãéžæãããšããäºå®ã«æ³šæããŠãã ããã
ãŸãããã§ãŒã³ãæãå¿
èŠãããå Žåã¯ãåªãããã€ã¢ã°ã©ã ã©ã€ãã©ãªã䜿çšããŠãã¯ã¿ãŒã°ã©ãã£ãã¯ã¹ãæ§ç¯ã§ããŸãã ç»åã®çžå¯Ÿçãªé
眮ã®ããã®2ã€ã®ã³ã³ãããŒã¿ãæäŸããŸãïŒ (|||)
-暪ã«äžŠã¹ãŠ(===)
-瞊ã«äžŠã¹ãŠ ããã¯ãç»åã«ã€ããŠã¯ããŒãã«ä»£æ°ã«äŒŒã代æ°ãæ§ç¯ãããã§ãŒã³ã®åã
ã®èŠçŽ ãã©ã®ããã«è¡šçŸããããã説æããåŸãèªç±ä»£æ°ããç»å代æ°ãžæºååãæ§ç¯ããä»»æã®ã¹ããŒã ãæãããšãã§ããããšãæå³ããŸãã ã¡ãªã¿ã«ãã¢ãã€ãã®çŽ°å·¥ãéèªæãªäœ¿çšã確èªãããå Žåã¯ããã®ã©ã€ãã©ãªãšããã«é¢é£ããèšäºã«æ³šæããŠãã ããã
ãããã«
æœè±¡åã®äœ¿çšããã¢ã«ã¬ã³ä»£æ°ã«äžãããã¹ãŠã®å¯èœæ§ãèæ
®ããŸããã§ããã çªãšè€éãªå£è£
æãåãã建ç©ã®æç±ãèšç®ããäŸãæããããšãã§ããŸãã ãŸãã¯ãåæ§èŠçŽ ãšç²æ§èŠçŽ ã®ãã§ãŒã³ãæã€éãã¥ãŒãã³æµäœã®ã¢ããªã³ã°ã
ã¢ãã€ããšãã»ã¢ã«ã¬ã³ä»£æ°ã«ã€ããŠã¯ãäžé£ã®åçŽãªå®çãæãç«ã¡ãŸããäŸãã°ãã¢ãã€ãåã®ç©ãã¢ãã€ãã圢æããããšãç¥ãããŠããŸãã åçã®ã¹ããŒãã¡ã³ãã¯ãde Morgan代æ°ã«ã€ããŠãåœãŠã¯ãŸããŸã;ããã¯ãæ§é äžã®åäžã®ããã»ãŒãžã§äžåºŠã«ããã€ãã®ç¹æ§ãèšç®ããããšãå¯èœã«ããŸãã ããã«ãã¢ãã€ãã§ä»£æ°ã®ãšãã¢ãŒãã£ãºã ãæ§ç¯ãã代æ°çç¹æ§ã ãã§ãªããã¢ãã€ãã®ç¹æ§ãèšç®ããã®ã¯ç°¡åã§ãã æãåçŽãªäŸãšããŠãæµæã®èšç®ãšåæã«ãåè·¯ã«ãã£ãŠæŸåºãããåèšé»åãèšç®ã§ããŸããããã¯ãåçŽãªå ç®ã¢ãã€ãã«ãã£ãŠèª¬æãããŸãã
èªç±ä»£æ°ã¯ãããšãã°ãã¡ãžãŒããžãã¯ã®åé¡ã«äžå¯æ¬ ãªãã1ã€ã®å¯èœæ§ãäžããŸãã ãŸã èšç®ãããŠããªãåŒã¯ã代æ°ã®ååžæ§ã䜿çšããŠåçŽåã§ããŸãã ãã®æé ã¯ãããã°ã©ã ã®å®è¡äžãã€ãŸãä»»æã®ããŒã¿ã䜿çšããŠããã ãéäžçãªèšç®ã®åã«å®è¡ã§ããŸãã èªç±æ§é ãã§ããããšã¯ãWolfram Mathematicaã§ç€ºãããŠããŸãããã®åŒã§ã¯ããã¹ãŠã®åŒã¯æ¬è³ªçã«èªç±ä»£æ°ã§ãã
銬ãè»ãšæ¯èŒããŠãåè»ã«ã¯å€§ããªå¶éããããŸã-ééã§ãã移åã§ããŸããã ãŸããééã«ã¯å€§ããªå¶éããããŸã-åè»ã®ã¿ãããã«æ²¿ã£ãŠç§»åã§ããŸãã ãããããããã®å¶éã¯æ°ããªæ©äŒãæäŸããŸããæ©æŠã倧å¹
ã«æžãããé床ãäžããäœçŸãã®åè»ã«å¯Ÿå¿ããè€éã§å¹ççãªèªåã¢ãŒã·ã§ã³å¶åŸ¡ã·ã¹ãã ãæ§ç¯ã§ããŸãã ãã€ã¯ããã©ã¯ã¿ãŒã§ãã€ã¯ã«ä¹ãããšã¯ã§ããŸããã ããã¯å¶éã§ãã ãããããããä¿èšŒããã°ãé«éãšé«åž¯åå¹
ãæåŸ
ã§ããŸãã
é¢æ°åããã°ã©ãã³ã°ã¯ãããã°ã©ããŒã®æ¥åžžæ¥åã«ããŸããŸãªå¶éãšæ³åŸãè¿œå ããŸãã ç¶æ
ãå€æŽããããšã¯äžå¯èœã§ãããæ§æã¯é£æ³çã§ãããé©çšå¯èœãªãã¡ã³ã¯ã¿ãŒã§ãããã¢ããã¯é©çšå¯èœãªãã¡ã³ã¯ã¿ãŒããã³ã¢ããã®æ³åãªã©ãæºãããªããã°ãªããŸããã ããã¯é¢åãªå ŽåããããŸããããããã®å¶éãšæ³åŸã«äŒŽããã³ãŒãããã®ããã«æ©èœããããšãä¿èšŒããŸãã ãããŠæãéèŠãªããšã¯ãååãšããŠããã¡ã³ã¯ã¿ãã¢ãããé£æ³æ§ããã³åé
æ§ã代æ°ãããã³ããã°ã©ã ã®ä»ã®ã«ããŽãªã«ã€ããŠè©±ãããããã£ãŠãå€ãã®äžä»£ã®æ°åŠè
ã®ææã䜿çšããŠæ¥åžžã®ä»äºã«é©çšããããšãã§ããã®ã¯ããŸãã«ãããã®æ³åŸã®å³å¯ãªéµå®ã§ãã ãããã£ãŠããããã®è€éãªãã®ã¯ãã¹ãŠãFPã®æŸèæã§ã¯ãªããã³ã³ãã¥ãŒã¿ãŒã®ããŒããŠã§ã¢ã®éçºã«ãã£ãŠå©çšå¯èœã«ãªã£ãæ°ããæ©äŒã§ãã ããããç¡èŠããªãã§ãã ããã