Clearer definition for apply
This commit is contained in:
@ -55,15 +55,24 @@ data EvaluatedForm = TreeCalculus | FSL | AST | Ternary | Ascii | Decode
|
||||
-- Environment containing previously evaluated TC terms
|
||||
type Env = Map.Map String T
|
||||
|
||||
-- Tree Calculus Reduction
|
||||
-- Tree Calculus Reduction Rules
|
||||
{-
|
||||
The t operator is left associative.
|
||||
1. t t a b -> a
|
||||
2. t (t a) b c -> a c (b c)
|
||||
3a. t (t a b) c t -> a
|
||||
3b. t (t a b) c (t u) -> b u
|
||||
3c. t (t a b) c (t u v) -> c u v
|
||||
-}
|
||||
apply :: T -> T -> T
|
||||
apply Leaf b = Stem b
|
||||
apply (Stem a) b = Fork a b
|
||||
apply (Fork Leaf a) _ = a
|
||||
apply (Fork (Stem a1) a2) b = apply (apply a1 b) (apply a2 b)
|
||||
apply (Fork (Fork a1 a2) a3) Leaf = a1
|
||||
apply (Fork (Fork a1 a2) a3) (Stem u) = apply a2 u
|
||||
apply (Fork (Fork a1 a2) a3) (Fork u v) = apply (apply a3 u) v
|
||||
apply (Fork Leaf a) _ = a
|
||||
apply (Fork (Stem a) b) c = apply (apply a c) (apply b c)
|
||||
apply (Fork (Fork a b) c) Leaf = a
|
||||
apply (Fork (Fork a b) c) (Stem u) = apply b u
|
||||
apply (Fork (Fork a b) c) (Fork u v) = apply (apply c u) v
|
||||
-- Left associative `t`
|
||||
apply Leaf b = Stem b
|
||||
apply (Stem a) b = Fork a b
|
||||
|
||||
-- Booleans
|
||||
_false :: T
|
||||
@ -77,7 +86,7 @@ _not = Fork (Fork _true (Fork Leaf _false)) Leaf
|
||||
|
||||
-- Marshalling
|
||||
ofString :: String -> T
|
||||
ofString str = ofList (map ofNumber (map fromEnum str))
|
||||
ofString str = ofList $ map (ofNumber . fromEnum) str
|
||||
|
||||
ofNumber :: Int -> T
|
||||
ofNumber 0 = Leaf
|
||||
@ -87,8 +96,7 @@ ofNumber n =
|
||||
(ofNumber (n `div` 2))
|
||||
|
||||
ofList :: [T] -> T
|
||||
ofList [] = Leaf
|
||||
ofList (x:xs) = Fork x (ofList xs)
|
||||
ofList = foldr Fork Leaf
|
||||
|
||||
toNumber :: T -> Either String Int
|
||||
toNumber Leaf = Right 0
|
||||
@ -126,7 +134,7 @@ toSimpleT s = T.unpack
|
||||
$ replace "Fork" "t"
|
||||
$ replace "Stem" "t"
|
||||
$ replace "Leaf" "t"
|
||||
$ (T.pack s)
|
||||
$ T.pack s
|
||||
|
||||
toTernaryString :: T -> String
|
||||
toTernaryString Leaf = "0"
|
||||
|
Reference in New Issue
Block a user