{-# OPTIONS_GHC -XTypeOperators -XTypeFamilies   #-}
module Examples where

import Generics.Pointless.Combinators
import Generics.Pointless.Functors hiding (Nat)
import Generics.Pointless.RecursionPatterns

--
-- data type definitions
--

-- Peano's Natural Numbers
data Nat = Z | S Nat deriving (Show, Eq)

-- Con Lists    
data List a = NilL | Cons a (List a) deriving (Show)

-- Binary Node Trees    
data NTree a  = NilT | Node a (NTree a)(NTree a) deriving (Show)

    
-- Binary Leaf Trees    
data LTree a = Leaf a | Branch (LTree a) (LTree a) deriving (Show)

-- Rose Trees 
data Rose a = Forest a [Rose a] deriving (Show)

--
-- Examples
--      


add :: Nat -> Nat -> Nat
-- add Z Z = Z
add Z x = x
add x Z = x
-- add (S Z) Z = (S Z)
-- add Z (S Z) = (S Z)
add (S Z) (S Z) = S (S Z)
-- add Z (S (S Z)) = S (S Z)
-- add (S (S Z)) Z = S (S Z)
add (S Z) (S (S Z)) = S (S (S Z))
add (S (S Z)) (S Z) = S (S (S Z))
-- add (S (S (S Z))) Z = S (S (S Z))
-- add Z (S (S (S Z))) = S (S (S Z))
add (S ( S Z)) (S (S (S Z))) = S (S (S( S( S Z))))

addN :: Nat -> [Nat] -> [Nat]
addN      Z   [] = []
addN   (S Z)  [] = []
addN (S(S Z)) [] = []
addN      Z   [Z] = [Z]
addN      Z   [S Z] = [S Z]
addN      Z   [S(S Z)] = [S(S Z)]
addN      Z   [Z,(S Z)] = [Z,(S Z)]
addN      Z   [(S Z),Z] = [(S Z),Z]
addN   (S Z)  [Z,(S Z)] = [S Z,S(S Z)]
addN   (S Z)  [(S Z),Z] = [S(S Z),S Z]
addN   (S Z)  [Z] = [S Z]
addN   (S Z)  [S Z] = [S(S Z)]
addN   (S Z)  [S(S Z)] = [S(S(S Z))]
addN (S(S Z)) [Z] = [S(S Z)]
addN (S(S Z)) [S Z] = [S(S(S Z))]
addN (S(S Z)) [S(S Z)] = [S(S(S(S Z)))]
addN (S(S Z)) [Z,(S Z)] = [S(S Z),S(S(S Z))]
addN (S(S Z)) [S(S Z),Z] = [S(S(S(S Z))),S(S Z)]


allodd :: [Nat] -> Bool
allodd []  = True
allodd [Z] = False
allodd [S Z] = True
allodd [S(S Z)] = False
allodd [S(S(S Z))] = True
allodd [Z, Z] = False
allodd [Z, S Z] = False
allodd [Z, S(S Z)] = False
allodd [Z, S(S(S Z))] = False
allodd [S Z, Z] = False
allodd [S Z, S Z] = True
allodd [S Z, S(S Z)] = False
allodd [S Z, S(S(S Z))] = True
allodd [S(S Z), Z] = False
allodd [S(S Z), S Z] = False
allodd [S(S Z), S(S Z)] = False
allodd [S(S Z), S(S(S Z))] = False
allodd [S(S(S Z)), Z] = False
allodd [S(S(S Z)), S Z] = True
allodd [S(S(S Z)), S(S Z)] = False
allodd [S(S(S Z)), S(S(S Z))] = True

andL :: [Bool] -> Bool
andL [] = True
andL [True] = True
andL [False] = False
andL [True,True] = True
andL [True,False] = False
andL [False,True] = False
andL [False,False] = False
andL [True,True,True] = True
andL [False,True,True] = False
andL [True,False,True] = False
andL [True,True,False] = False
andL [True,False,False] = False
andL [False,True,False] = False
andL [False,False,True] = False
andL [False,False,False] = False

anD :: Bool -> Bool -> Bool
anD True True = True
anD True False = False
anD False True = False
anD False False = False

appenD  :: [a] -> [a] -> [a]
appenD [] x = x
--appenD [][]        = []
appenD [a][]       = [a]
--appenD [][c]       = [c]
--appenD [][c,d]     = [c,d]
appenD [a][c]      = [a,c]
appenD [a,b][]     = [a,b]
--appenD [] [a,b,c]  = [a,b,c]
appenD [a][c,d]    = [a,c,d]
appenD [a,b][d]    = [a,b,d]
appenD [a,c,d][]   = [a,c,d]
--appenD [][a,b,c,d] = [a,b,c,d]
appenD [a,b][c,d]  = [a,b,c,d]
appenD [a,b,c][d]  = [a,b,c,d]
appenD [a,b,c,d][] = [a,b,c,d]

concaT :: [[a]] -> [a]
concaT [] = []
concaT [[]] = []
concaT [[a]] = [a]
concaT [[],[a]] = [a]
concaT [[a],[]] = [a]
concaT [[a],[b]] = [a,b]
concaT [[c,d]]= [c,d]
concaT [[a,b,c]] = [a,b,c]
concaT [[a,b],[c]] = [a,b,c]
concaT [[a],[c,d]] = [a,c,d]
concaT [[a],[b],[c]] = [a,b,c]
concaT [[a,b],[c,d]] = [a,b,c,d]
--concaT [[a,d],[b],[c]] = [a,d,b,c]
--concaT [[a],[b,d],[c]] = [a,b,d,c]
--concaT [[a],[b],[c,d]] = [a,b,c,d]

droP :: Nat -> [a] -> [a]
droP Z x = x
--droP Z             []      = []
--droP Z             [a]     = [a]

--droP x [] = []
droP (S Z)         []      = []
droP (S (S Z))     []      = []

--droP Z             [a,b]   = [a,b]
--droP Z             [a,b,c] = [a,b,c]
droP (S Z)         [a]     = []
droP (S Z)         [a,b]   = [b]
droP (S Z)         [a,b,c] = [b,c]
droP (S (S Z))     [a]     = []
droP (S (S Z))     [a,b]   = []
droP (S (S Z))     [a,b,c] = [c]
--droP (S (S (S Z))) []      = []
--droP (S (S (S Z))) [a]     = []
--droP (S (S (S Z))) [a,b]   = []
--droP (S (S (S Z))) [a,b,c] = []

eveN :: Nat -> Bool
eveN Z                     = True
eveN (S Z)                 = False
eveN (S (S Z))             = True
eveN (S (S (S Z)))         = False
eveN (S (S (S (S Z))))     = True
eveN (S (S (S (S (S Z))))) = False

evenpos :: [a] -> [a]
evenpos [] = []
evenpos [a] = []
evenpos [a,b] = [b]
evenpos [a,b,c] = [b]
evenpos [a,b,c,d] = [b,d]
evenpos [a,b,c,d,e] = [b,d]
evenpos [a,b,c,d,e,f] = [b,d,f]

evens :: [Nat] -> [Nat]
evens []  = []
evens [Z] = [Z]
evens [S Z] = []
evens [S(S Z)] = [S(S Z)]
evens [S(S(S Z))] = []
evens [Z,Z] = [Z,Z]
evens [Z,S Z] = [Z]
evens [Z,S (S Z)] = [Z,S (S Z)]
evens [Z,S(S(S Z))] = [Z]
evens [S Z, Z] = [Z]
evens [S Z, S Z] = []
evens [S Z, S (S Z)] = [S (S Z)]
evens [S Z, S(S(S Z))] = []
evens [S (S Z), Z] = [S (S Z),Z]
evens [S (S Z), S Z] = [S (S Z)]
evens [S (S Z), S (S Z)] = [S (S Z),S (S Z)]
evens [S (S Z), S(S(S Z))] = [S (S Z)]
evens [S( S (S Z)), Z] = [Z]
evens [S( S (S Z)), S Z] = []
evens [S( S (S Z)), S (S Z)] = [S (S Z)]
evens [S( S (S Z)), S( S (S Z))] = []

eq :: Nat -> Nat -> Bool
eq Z Z = True
eq    Z  (S Z) = False
eq (S Z)    Z  = False
eq       Z   (S (S Z)) = False
eq    (S Z)     (S Z)  = True
eq (S (S Z))       Z   = False
eq          Z    (S (S (S Z))) = False
eq       (S Z)      (S (S Z))  = False
eq    (S (S Z))        (S Z)   = False
eq (S (S (S Z)))          Z    = False

fib :: Nat -> Nat
fib Z = Z
fib (S(Z)) = S(Z)
fib (S(S(Z))) = S(Z)
fib (S(S(S(Z)))) = S(S(Z))
fib (S(S(S(S(Z))))) = S(S(S(Z)))
fib (S(S(S(S(S(Z)))))) = S(S(S(S(S(Z)))))

fibAdd :: Nat -> Nat -> Nat
fibAdd Z (S Z) = (S Z)
fibAdd (S Z) (S Z) = S (S Z)
fibAdd (S Z) (S (S Z)) = S (S (S Z))
fibAdd (S ( S Z)) (S (S (S Z))) = S (S (S( S( S Z))))

flatten :: (NTree a) -> [a]
flatten NilT = []
flatten (Node a NilT NilT) = [a]
flatten (Node a
         (Node b NilT NilT)
         (Node c NilT NilT)) = [a,b,c]
flatten (Node a
         (Node b 
          (Node c NilT NilT)
          (Node d NilT NilT))
         (Node e 
          (Node f NilT NilT)
          (Node g NilT NilT))) = [a,b,c,d,e,f,g]
         
flatapp :: [a] -> [a] -> [a]
flatapp [] [] = []
flatapp [a] [b] = [a,b]
flatapp [a,b,c][d,e,f] = [a,b,c,d,e,f]

heaD :: [a] -> a
heaD [a] = a
heaD [a,b] = a
heaD [a,b,c] = a
heaD [a,b,c,d] = a

incr :: [Nat] -> [Nat]
incr []         = []
incr [Z]        = [S Z]
incr [S Z]      = [S(S Z)]
--incr [S(S Z)]   = [S(S(S Z))]
incr [Z,S Z]    = [S Z,S(S Z)]
--incr [Z,S(S Z)] = [S Z,S(S(S Z))]
incr [S Z,Z]    = [S(S Z),S Z]

iniT:: [a] -> [a]
iniT [a] = []
iniT [a,b] = [a]
iniT [a,b,c] = [a,b]
iniT [a,b,c,d] = [a,b,c]

-- BK for sort only, does not work alone
insert :: Nat -> [Nat] -> [Nat]
--insert Z [] = [Z]
--insert (S Z) [] = [S Z]
--insert (S(S Z)) = [S(S Z)]
insert x [] = [x]        
insert Z [S Z] = [Z,S Z]
insert Z [S(S Z)] = [Z,S(S Z)]
--insert Z [S Z, S(S Z)] = [Z, S(S Z)]
--insert Z (x:xs) = (Z:x:xs)
insert (S Z) [Z] = [Z,(S Z)]
insert (S Z) [S(S Z)] = [S Z, S(S Z)]
insert (S(S Z)) [Z] = [Z, S(S Z)]
insert (S(S Z)) [S Z] = [S Z, S(S Z)]        
insert Z [S Z, S(S Z)] = [Z, S Z, S(S Z)]
insert (S Z) [Z,S(S Z)] = [Z, S Z, S(S Z)]
insert (S(S Z)) [Z, S Z] = [Z, S Z, S(S Z)]

oddpos :: [a] -> [a]
oddpos [] = []
oddpos [a] = [a]
oddpos [a,b] = [a]
oddpos [a,b,c] = [a,c]
oddpos [a,b,c,d] = [a,c]
oddpos [a,b,c,d,e] = [a,c,e]

lasT :: [a] -> a
lasT [a] = a
lasT [a,b] = b
lasT [a,b,c] = c
lasT [a,b,c,d] = d

lastM :: [a] -> Maybe a
lastM [] = Nothing
lastM [a] = Just a
lastM [a,b] = Just b
lastM [a,b,c] = Just c
lastM [a,b,c,d] = Just d

lasts :: [[a]] -> [a]
lasts [] = []
lasts [[a]] = [a]
lasts [[a,b]] = [b]
lasts [[a,b,c]] = [c]
lasts [[b],[a]] = [b,a]
lasts [[c],[a,b]] = [c,b]
lasts [[a,b],[c,d]] = [b,d]
lasts [[c,d],[b]] = [d,b]
lasts [[c],[d,e],[f]] = [c,e,f]
lasts [[c,d],[e,f],[g]] = [d,f,g]
--lasts [[x,c,d],[e,f],[g]] = [d,f,g]

lengtH :: [a] -> Nat
lengtH [] = Z
lengtH [a] = S Z
lengtH [a,b] = S(S Z)
lengtH [a,b,c] = S(S(S Z))

lengths :: [[a]] -> [Nat]
lengths []   = []
lengths [[]] = [Z]
lengths [[a]] = [S Z]
lengths [[b,a]] = [S(S Z)]
--lengths [[c,b,a]] = [S(S(S Z)]
lengths [[],[]] = [Z, Z]
lengths [[],[a]] = [Z,S Z]
lengths [[],[b,a]] = [Z,S(S Z)]

lengths [[a],[]] = [S Z, Z]
lengths [[b],[a]] = [S Z,S Z]
lengths [[c],[b,a]] = [S Z,S(S Z)]

lengths [[c,a],[]] = [S(S Z), Z]
lengths [[b,a],[c]] = [S(S Z),S Z]
lengths [[c,d],[b,a]] = [S(S Z),S(S Z)]

member :: Int -> [Int] -> [Int]
member 1 [] = []
member 2 [] = []
member 1 [1] = [1]
member 1 [2] = []
member 2 [1] = []
member 2 [2] = [2]
--member 1 [1,2] = [1,2]
member 1 [2,1] = [1]
--member 2 [1,2] = [2]
member 2 [2,1] = [2,1]
--member 1 [3,1,2] = [1,2]
--member 1 [1,2,3] = [1,2,3]
member 1 [3,2,1] = [1]

mem :: Int -> [Int] -> Bool
mem 1 [] = False
mem 2 [] = False
mem 3 [] = False
mem 1 [1] = True
mem 2 [1] = False
mem 3 [1] = False
mem 1 [2] = False
mem 2 [2] = True
mem 3 [2] = False
mem 1 [3] = False
mem 2 [3] = False
mem 3 [3] = True

mem 1 [2,1] = True
mem 2 [2,1] = True
--member 1 [3,1,2] = [1,2]
--member 1 [1,2,3] = [1,2,3]
mem 1 [3,2,1] = True

multfst :: [a] -> [a]
multfst [] = []
multfst [a] = [a]
multfst [a,b] = [a,a]
multfst [a,b,c] = [a,a,a]
multfst [a,b,c,d] = [a,a,a,a]
--multfst [a,b,c,d,e] = [a,a,a,a,a]
--multfst [a,b,c,d,e,f] = [a,a,a,a,a,a]

multlst :: [a] -> [a]
multlst [] = []
multlst [a] = [a]
multlst [a,b] = [b,b]
multlst [a,b,c] = [c,c,c]
multlst [a,b,c,d] = [d,d,d,d]
--multlst [a,b,c,d,e] = [e,e,e,e,e]
--multlst [a,b,c,d,e,f] = [f,f,f,f,f,f]

negateAll :: [Bool] -> [Bool]
negateAll []            = []
negateAll [True]        = [False]
negateAll [False]       = [True]
negateAll [False,False] = [True,True]
negateAll [False,True]  = [True,False]
negateAll [True,False]  = [False,True]
negateAll [True,True]   = [False,False]

odD :: Nat -> Bool
odD Z                     = False
odD (S Z)                 = True
odD (S (S Z))             = False
odD (S (S (S Z)))         = True
odD (S (S (S (S Z))))     = False
odD (S (S (S (S (S Z))))) = True

mirror :: (NTree a) -> (NTree a)
mirror NilT = NilT
mirror (Node a NilT NilT) = (Node a NilT NilT)
mirror (Node b
        (Node a NilT NilT)
        (Node c NilT NilT)) = (Node b 
                                 (Node c NilT NilT) 
                                 (Node a NilT NilT))
mirror (Node d
        (Node b 
         (Node a NilT NilT)
         (Node c NilT NilT))
        (Node f 
         (Node e NilT NilT)
         (Node g NilT NilT))) = (Node d
                                   (Node f 
                                    (Node g NilT NilT)
                                    (Node e NilT NilT))
                                   (Node b 
                                    (Node c NilT NilT)
                                    (Node a NilT NilT)))
       
-- fast Pepper
pepper' :: Nat -> [a] -> [(Nat, Maybe a)]
pepper' Z []         = [(Z,Nothing)]
pepper' Z [a]        = [(Z, Just a),(S Z, Nothing)] 
pepper' Z [a,b]      = [(Z, Just a),(S Z, Just b),(S(S Z), Nothing)] 
pepper' Z [a,b,c]    = [(Z, Just a),(S Z, Just b),(S(S Z), Just c),(S(S(S Z)), Nothing)] 
-- pepper' p [a,b,c,d]  = [(p, Just a),(S p, Just b),(S(S p), Just c),(S(S(S p)), Just d),(S(S(S(S p))), Nothing)] 
   
-- pepper i [] = [(i,Nothing)]
-- pepper i (x:xs) = (i,Just (x,i+1)):(pepper' (i+1) xs)
pepper :: Nat -> [a] -> [(Nat, Maybe (a,Nat))]
pepper p []         = [(p,Nothing)]
pepper p [a]        = [(p, Just (a, S p)),(S p, Nothing)] 
pepper p [a,b]      = [(p, Just (a, S p)),(S p, Just (b, S(S p))),(S(S p), Nothing)] 
pepper p [a,b,c]    = [(p, Just (a, S p)),(S p, Just (b, S(S p))),(S(S p), Just (c, S(S(S p)))),(S(S(S p)), Nothing)] 
-- pepper p [a,b,c,d]  = [(p, Just (a, S p)),(S p, Just (b, S(S p))),(S(S p), Just (c, S(S(S p)))),(S(S(S p)), Just (d, S(S(S(S p))))),(S(S(S(S p))), Nothing)] 


powset :: [a] -> [[a]]
powset [] = [[]]
powset [a] = [[a],[]]
powset [a,b] = [[a,b],[a],[b],[]]
powset [a,b,c] = [[a,b,c],[a,b],[a,c],[a],[b,c],[b],[c],[]]
--powset [a,b,c,d] = [[a,b,c,d],[a,b,c],[a,b,d],[a,b],[a,c,d],[a,c],[a,d],[a],[b,c,d],[b,c],[b,d],[b],[c,d],[c],[d],[]]

powapp  :: [a] -> [a] -> [a]
powapp [a][c]      = [a,c]
powapp [a,b][c,d]  = [a,b,c,d]
powapp [a,b,c,d][e,f,g,h]  = [a,b,c,d,e,f,g,h]
--powapp [a,b,c,d,e,f,g,h][i,j,k,l,m,n,o,p]  = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p]

reversE :: [a] -> [a]
reversE [] = []
reversE [a] =[a]
reversE [a,b] = [b,a]
reversE [a,b,c] = [c,b,a]
reversE [a,b,c,d] = [d,c,b,a]
--reversE [a,b,c,d,e] = [e,d,c,b,a]
--reversE [a,b,c,d,e,f] = [f,e,d,c,b,a]


shiftl :: [a] -> [a]
shiftl [] = []
shiftl [a] = [a]
shiftl [a,b] = [b,a]
shiftl [a,b,c] = [b,c,a]
shiftl [a,b,c,d] = [b,c,d,a]
--shiftl [a,b,c,d,e] = [b,c,d,e,a]
--shiftl [a,b,c,d,e,f] = [b,c,d,e,f,a]
--shiftl [a,b,c,d,e,f,g] = [b,c,d,e,f,g,a]
--shiftl [a,b,c,d,e,f,g,h] = [b,c,d,e,f,g,h,a]

shiftr :: [a] -> [a]
shiftr [] = []
shiftr [a] = [a]
shiftr [a,b] = [b,a]
shiftr [a,b,c] = [c,a,b]
shiftr [a,b,c,d] = [d,a,b,c]
-- shiftr [a,b,c,d,e] = [e,a,b,c,d]

snoc :: a -> [a] -> [a]
snoc a []            = [a]
snoc b [a]           = [a,b]
snoc c [a,b]         = [a,b,c]
snoc d [a,b,c]       = [a,b,c,d]
--snoc e [a,b,c,d]   = [a,b,c,d,e]
--snoc f [a,b,c,d,e] = [a,b,c,d,e,f]

sort :: [Nat] -> [Nat]
sort [] = []
sort [Z]        = [Z]
sort [S Z]      = [S Z]
sort [S(S Z)]   = [S(S Z)]        

sort [Z,S Z]        = [Z,S Z]
sort [Z,S(S Z)]     = [Z,S(S Z)]
sort [S Z, Z]       = [Z,S Z]
sort [S Z,S(S Z)]   = [S Z,S(S Z)]
sort [S(S Z), Z]    = [Z,S(S Z)]
sort [S(S Z),S Z]   = [S Z,S(S Z)]        
--sort [Z,S Z,S(S Z)] = [Z,S Z,S(S Z)]
--sort [Z,S(S Z),S Z] = [Z,S Z,S(S Z)]
--sort [S Z,Z,S(S Z)] = [Z,S Z,S(S Z)]
--sort [S Z,S(S Z),Z] = [Z,S Z,S(S Z)]
--sort [S(S Z),Z,S Z] = [Z,S Z,S(S Z)]
sort [S(S Z),S Z,Z] = [Z,S Z,S(S Z)]

sortIns :: Nat -> [Nat] -> [Nat]
sortIns      Z        [] = [Z]
sortIns   (S Z)       [] = [S Z]
sortIns (S(S Z))      [] = [S(S Z)]
sortIns   (S Z)      [Z] = [Z,S Z]
sortIns (S(S Z))     [Z] = [Z,S(S Z)]
sortIns      Z     [S Z] = [Z,S Z]
sortIns (S(S Z))   [S Z] = [S Z,S(S Z)]
sortIns      Z  [S(S Z)] = [Z,S(S Z)]
sortIns   (S Z) [S(S Z)] = [S Z,S(S Z)]
sortIns      Z    [S Z,S(S Z)] = [Z,S Z,S(S Z)]
sortIns   (S Z)     [Z,S(S Z)] = [Z,S Z,S(S Z)]
sortIns (S(S Z))       [Z,S Z] = [Z,S Z,S(S Z)]

suM :: [Nat] -> Nat
suM [] = Z
suM [Z] = Z
suM [S Z] = S Z
suM [S(S Z)] = S(S Z)
suM [Z,Z] = Z
suM [Z,S Z] = S Z
suM [Z,S(S Z)] = S(S Z)
suM [S Z,Z] = S Z
suM [S Z,S Z] = S(S Z)
suM [S Z,S(S Z)] = S(S(S Z))
suM [S(S Z),Z] = S(S Z)
suM [S(S Z),S Z] = S(S(S Z))
suM [S(S Z),S(S Z)] = S(S(S(S Z)))
suM [S(S Z),S Z, S(S Z)] = S(S(S(S(S Z))))

swap:: [a] -> [a]
swap [] = []
swap [a] = [a]
swap [a,b] = [b,a]
swap [a,b,c] = [b,a,c]
swap [a,b,c,d] = [b,a,d,c]
swap [a,b,c,d,e] = [b,a,d,c,e]
swap [a,b,c,d,e,f] = [b,a,d,c,f,e]

switch :: [a] -> [a]
switch [] = []
switch [a] = [a]
switch [a,b] = [b,a]
switch [a,b,c] = [c,b,a]
switch [a,b,c,d] = [d,b,c,a]
--switch [a,b,c,d,e] = [e,b,c,d,a]
--switch [a,b,c,d,e,f] = [f,b,c,d,e,a]

taiL :: [a] -> [a]
taiL [a] = []
taiL [a,b] = [b]
taiL [a,b,c] = [b,c]
taiL [a,b,c,d] = [b,c,d]

takE :: Nat -> [a] -> [a]
takE Z             []      = []
takE Z             [a]     = []
takE Z             [a,b]   = []
--takE Z             [a,b,c] = []
takE (S Z)         []      = []
takE (S Z)         [a]     = [a]
takE (S Z)         [a,b]   = [a]
--takE (S Z)         [a,b,c] = [a]
takE (S (S Z))     []      = []
takE (S (S Z))     [a]     = [a]
takE (S (S Z))     [a,b]   = [a,b]
--takE (S (S Z))     [a,b,c] = [a,b]
takE (S (S (S Z))) []      = []
takE (S (S (S Z))) [a]     = [a]
takE (S (S (S Z))) [a,b]   = [a,b]
--takE (S (S (S Z))) [a,b,c] = [a,b,c]

weave :: [a] -> [a] -> [a]
weave [] [] = []
weave [a][] = [a]
weave [][c] = [c]
weave [a][c] = [a,c]
weave [a,b][] = [a,b]
weave [][c,d] = [c,d]
weave [a,b][c] = [a,c,b]
weave [a][c,d] = [a,c,d]
weave [a,b][c,d] = [a,c,b,d]
weave [a,b,c] [] = [a,b,c]

zeros :: [Nat] -> [Nat]
zeros [] = []
zeros [Z] = [Z]
zeros [S x] = []
zeros [Z,S x] = [Z]
zeros [S x,Z] = [Z]
zeros [S x,S y] = []
zeros [Z,Z] = [Z,Z]
--zeros [Z,S x,S y] = [Z]
--zeros [S x,Z,S y] = [Z]
--zeros [S y,S x,Z] = [Z]
--zeros [Z,Z,S x] = [Z,Z]
--zeros [Z,S x,Z] = [Z,Z]
--zeros [S x,Z,Z] = [Z,Z]
--zeros [Z,Z,Z] = [Z,Z,Z]

-- ---------------------------------------------------------------------------
-- Non-List Problems
-- ---------------------------------------------------------------------------

data Object = O1 | O2 | O3 deriving (Show)
data State = START | LOD Object State | UNL Object State | FLY State deriving (Show)

rocket :: [Object] -> State -> State
rocket [] s    = FLY s
rocket [x] s   = UNL x (FLY (LOD x s))
rocket [x,y] s = UNL x (UNL y (FLY (LOD y (LOD x s))))

data Disc = D0 | D Disc deriving (Show)
data Action = NOOP | MV Disc Peg Peg Action deriving (Show)
data Peg = PegA | PegB | PegC deriving (Show)

hanoi :: Disc -> Peg -> Peg -> Peg -> Action -> Action
hanoi D0 src aux dst s        = MV D0 src dst s
hanoi (D D0) src aux dst s    = MV D0 aux dst 
                                 (MV (D D0) src dst 
                                   (MV D0 src aux s))
hanoi (D(D D0)) src aux dst s = MV D0 src dst
                                 (MV (D D0) aux dst
                                   (MV D0 aux src
                                     (MV (D(D D0)) src dst
                                       (MV D0 dst aux
                                         (MV (D D0) src aux
                                           (MV D0 src dst s ))))))

-- ---------------------------------------------------------------------------
-- Various non-recursive problems
-- ---------------------------------------------------------------------------
data Color = Purple | Yellow
data Size = Large | Small
data Act = Dip | Stretch
data Age = Adult | Child
data Inflate = FF | TT

balloons :: (Color,Size,Act,Age) -> Inflate
balloons(Yellow,Small,Stretch,Adult) = TT
balloons(Yellow,Small,Stretch,Child) = TT
balloons(Yellow,Small,Dip,Adult) = TT
balloons(Yellow,Small,Dip,Child) = TT
balloons(Yellow,Large,Stretch,Adult) = FF
balloons(Yellow,Large,Stretch,Child) = FF
balloons(Yellow,Large,Dip,Adult) = FF
balloons(Yellow,Large,Dip,Child) = FF
balloons(Purple,Small,Stretch,Adult) = FF
balloons(Purple,Small,Stretch,Child) = FF
balloons(Purple,Small,Dip,Adult) = FF
balloons(Purple,Small,Dip,Child) = FF
balloons(Purple,Large,Stretch,Adult) = FF
balloons(Purple,Large,Stretch,Child) = FF
balloons(Purple,Large,Dip,Adult) = FF
balloons(Purple,Large,Dip,Child) = FF

data Weather = Sunny | Rain | Overcast
             | Hot | Cool | Mild | Warm | Cold
             | High |  Normal 
             | Weak |Strong  
             | Change | Same
               
playTennis :: (Weather, Weather, Weather, Weather) -> Bool        
playTennis (Sunny,Hot,High,Weak)         = False
playTennis (Sunny,Hot,High,Strong)       = False
playTennis (Overcast,Hot,High,Weak)      = True
playTennis (Rain,Mild,High,Weak)         = True
playTennis (Rain,Cool,Normal,Weak)       = True
playTennis (Rain,Cool,Normal,Strong)     = False
playTennis (Overcast,Cool,Normal,Strong) = True
playTennis (Sunny,Mild,High,Weak)        = False
playTennis (Sunny,Cool,Normal,Weak)      = True 
playTennis (Rain,Mild,Normal,Weak)       = True
playTennis (Sunny,Mild,Normal,Strong)    = True
playTennis (Overcast,Mild,High,Strong)   = True
playTennis (Overcast,Hot,Normal,Weak)    = True
playTennis (Rain,Mild,High,Strong)       = False    

enjoySport :: (Weather, Weather, Weather, Weather, Weather, Weather) -> Bool   
enjoySport(Sunny,Warm,Normal,Strong,Warm,Same) = True
enjoySport(Sunny,Warm,High,Strong,Warm,Same)   = True
enjoySport(Rain,Cold,High,Strong,Warm,Change) = False
enjoySport(Sunny,Warm,High,Strong,Cool,Change) = True

data LAge = Young | PrePresbyopic | Presbyopic
data LPrescription = Myope | Hypermetrope
data LAstigmatic = No | Yes
data LTears = Reduced | Norml
data LCLType = None | Hard | Soft

lenses :: (LAge, LPrescription, LAstigmatic, LTears) -> LCLType 
lenses (Young,Myope,No,Reduced) = None
lenses (Young,Myope,No,Norml) = Soft
lenses (Young,Myope,Yes,Reduced) = None
lenses (Young,Myope,Yes,Norml) = Hard
lenses (Young,Hypermetrope,No,Reduced) = None
lenses (Young,Hypermetrope,No,Norml) = Soft
lenses (Young,Hypermetrope,Yes,Reduced) = None
lenses (Young,Hypermetrope,Yes,Norml) = Hard
lenses (PrePresbyopic,Myope,No,Reduced) = None
lenses (PrePresbyopic,Myope,No,Norml) = Soft
lenses (PrePresbyopic,Myope,Yes,Reduced) = None
lenses (PrePresbyopic,Myope,Yes,Norml) = Hard
lenses (PrePresbyopic,Hypermetrope,No,Reduced) = None
lenses (PrePresbyopic,Hypermetrope,No,Norml) = Soft
lenses (PrePresbyopic,Hypermetrope,Yes,Reduced) = None
lenses (PrePresbyopic,Hypermetrope,Yes,Norml) = None
lenses (Presbyopic,Myope,No,Reduced) = None
lenses (Presbyopic,Myope,No,Norml) = None
lenses (Presbyopic,Myope,Yes,Reduced) = None
lenses (Presbyopic,Myope,Yes,Norml) = Hard
lenses (Presbyopic,Hypermetrope,No,Reduced) = None
lenses (Presbyopic,Hypermetrope,No,Norml) = Soft
lenses (Presbyopic,Hypermetrope,Yes,Reduced) = None
lenses (Presbyopic,Hypermetrope,Yes,Norml) = None   


-- Ackermann nach Peter:
-- ack    Z     x  = S x
-- ack (S x)    Z  = ack x (S Z)
-- ack (S x) (S y) = ack x (ack (S x) y)

ack :: Nat -> Nat -> Nat
ack      Z                      Z           =                     (S Z)           --(1, 0) =  1
ack      Z                   (S Z)          =                   (S(S Z))          --(1, 1) =  2
ack      Z                 (S(S Z))         =                 (S(S(S Z)))         --(1, 2) =  3
ack      Z               (S(S(S Z)))        =               (S(S(S(S Z))))        --(1, 3) =  4
ack      Z             (S(S(S(S Z))))       =             (S(S(S(S(S Z)))))       --(1, 4) =  5
ack      Z           (S(S(S(S(S Z)))))      =           (S(S(S(S(S(S Z))))))      --(1, 5) =  6
ack      Z         (S(S(S(S(S(S Z))))))     =         (S(S(S(S(S(S(S Z)))))))     --(1, 6) =  7
ack      Z       (S(S(S(S(S(S(S Z)))))))    =       (S(S(S(S(S(S(S(S Z))))))))    --(1, 7) =  8
ack      Z     (S(S(S(S(S(S(S(S Z))))))))   =     (S(S(S(S(S(S(S(S(S Z)))))))))   --(1, 8) =  9
ack      Z   (S(S(S(S(S(S(S(S(S Z)))))))))  =   (S(S(S(S(S(S(S(S(S(S Z))))))))))  --(1, 9) = 10
ack      Z (S(S(S(S(S(S(S(S(S(S Z)))))))))) = (S(S(S(S(S(S(S(S(S(S(S Z))))))))))) --(1,10) = 11
ack   (S Z)                     Z           =                   (S(S Z))          --(1, 0) =  2
ack   (S Z)                  (S Z)          =                 (S(S(S Z)))         --(1, 1) =  3
ack   (S Z)                (S(S Z))         =               (S(S(S(S Z))))        --(1, 2) =  4
ack   (S Z)              (S(S(S Z)))        =             (S(S(S(S(S Z)))))       --(1, 3) =  5
ack   (S Z)            (S(S(S(S Z))))       =           (S(S(S(S(S(S Z))))))      --(1, 4) =  6
ack   (S Z)          (S(S(S(S(S Z)))))      =         (S(S(S(S(S(S(S Z)))))))     --(1, 5) =  7
ack   (S Z)        (S(S(S(S(S(S Z))))))     =       (S(S(S(S(S(S(S(S Z))))))))    --(1, 6) =  8
ack   (S Z)      (S(S(S(S(S(S(S Z)))))))    =     (S(S(S(S(S(S(S(S(S Z)))))))))   --(1, 7) =  9
ack   (S Z)    (S(S(S(S(S(S(S(S Z))))))))   =   (S(S(S(S(S(S(S(S(S(S Z))))))))))  --(1, 8) = 10
ack   (S Z)  (S(S(S(S(S(S(S(S(S Z)))))))))  = (S(S(S(S(S(S(S(S(S(S(S Z))))))))))) --(1, 9) = 11
ack (S(S Z))                    Z           =                 (S(S(S Z)))         --(2, 0) =  3
ack (S(S Z))                 (S Z)          =             (S(S(S(S(S Z)))))       --(2, 1) =  5
ack (S(S Z))               (S(S Z))         =         (S(S(S(S(S(S(S Z)))))))     --(2, 2) =  7
ack (S(S Z))             (S(S(S Z)))        =     (S(S(S(S(S(S(S(S(S Z)))))))))   --(2, 3) =  9
ack (S(S Z))           (S(S(S(S Z))))       = (S(S(S(S(S(S(S(S(S(S(S Z))))))))))) --(2, 4) = 11


--
--data Tile  = B | O | X
--data Class = Lose | Win
--
--tictactoe :: [Tile]-> Class
--tictactoe[X,X,X,X,O,O,X,O,O] = Win
--tictactoe[X,X,X,X,O,O,O,X,O] = Win
--tictactoe[X,X,X,X,O,O,O,O,X] = Win
--tictactoe[X,X,X,X,O,O,O,B,B] = Win
--tictactoe[X,X,X,X,O,O,B,O,B] = Win
--tictactoe[X,X,X,X,O,O,B,B,O] = Win
--tictactoe[X,X,X,X,O,B,O,O,B] = Win
--tictactoe[X,X,X,X,O,B,O,B,O] = Win
--tictactoe[X,X,X,X,O,B,B,O,O] = Win
--tictactoe[X,X,X,X,B,O,O,O,B] = Win
--tictactoe[X,X,X,X,B,O,O,B,O] = Win
--tictactoe[X,X,X,X,B,O,B,O,O] = Win
--tictactoe[X,X,X,O,X,O,X,O,O] = Win
--tictactoe[X,X,X,O,X,O,O,X,O] = Win
--tictactoe[X,X,X,O,X,O,O,O,X] = Win
--tictactoe[X,X,X,O,X,O,O,B,B] = Win
--tictactoe[X,X,X,O,X,O,B,O,B] = Win
--tictactoe[X,X,X,O,X,O,B,B,O] = Win
--tictactoe[X,X,X,O,X,B,O,O,B] = Win
--tictactoe[X,X,X,O,X,B,O,B,O] = Win
--tictactoe[X,X,X,O,X,B,B,O,O] = Win
--tictactoe[X,X,X,O,O,X,X,O,O] = Win
--tictactoe[X,X,X,O,O,X,O,X,O] = Win
--tictactoe[X,X,X,O,O,X,O,O,X] = Win
--tictactoe[X,X,X,O,O,X,O,B,B] = Win
--tictactoe[X,X,X,O,O,X,B,O,B] = Win
--tictactoe[X,X,X,O,O,X,B,B,O] = Win
--tictactoe[X,X,X,O,O,B,X,O,B] = Win
--tictactoe[X,X,X,O,O,B,X,B,O] = Win
--tictactoe[X,X,X,O,O,B,O,X,B] = Win
--tictactoe[X,X,X,O,O,B,O,B,X] = Win
--tictactoe[X,X,X,O,O,B,B,X,O] = Win
--tictactoe[X,X,X,O,O,B,B,O,X] = Win
--tictactoe[X,X,X,O,O,B,B,B,B] = Win
--tictactoe[X,X,X,O,B,X,O,O,B] = Win
--tictactoe[X,X,X,O,B,X,O,B,O] = Win
--tictactoe[X,X,X,O,B,X,B,O,O] = Win
--tictactoe[X,X,X,O,B,O,X,O,B] = Win
--tictactoe[X,X,X,O,B,O,X,B,O] = Win
--tictactoe[X,X,X,O,B,O,O,X,B] = Win
--tictactoe[X,X,X,O,B,O,O,B,X] = Win
--tictactoe[X,X,X,O,B,O,B,X,O] = Win
--tictactoe[X,X,X,O,B,O,B,O,X] = Win
--tictactoe[X,X,X,O,B,O,B,B,B] = Win
--tictactoe[X,X,X,O,B,B,X,O,O] = Win
--tictactoe[X,X,X,O,B,B,O,X,O] = Win
--tictactoe[X,X,X,O,B,B,O,O,X] = Win
--tictactoe[X,X,X,O,B,B,O,B,B] = Win
--tictactoe[X,X,X,O,B,B,B,O,B] = Win
--tictactoe[X,X,X,O,B,B,B,B,O] = Win
--tictactoe[X,X,X,B,X,O,O,O,B] = Win
--tictactoe[X,X,X,B,X,O,O,B,O] = Win
--tictactoe[X,X,X,B,X,O,B,O,O] = Win
--tictactoe[X,X,X,B,O,X,O,O,B] = Win
--tictactoe[X,X,X,B,O,X,O,B,O] = Win
--tictactoe[X,X,X,B,O,X,B,O,O] = Win
--tictactoe[X,X,X,B,O,O,X,O,B] = Win
--tictactoe[X,X,X,B,O,O,X,B,O] = Win
--tictactoe[X,X,X,B,O,O,O,X,B] = Win
--tictactoe[X,X,X,B,O,O,O,B,X] = Win
--tictactoe[X,X,X,B,O,O,B,X,O] = Win
--tictactoe[X,X,X,B,O,O,B,O,X] = Win
--tictactoe[X,X,X,B,O,O,B,B,B] = Win
--tictactoe[X,X,X,B,O,B,X,O,O] = Win
--tictactoe[X,X,X,B,O,B,O,X,O] = Win
--tictactoe[X,X,X,B,O,B,O,O,X] = Win
--tictactoe[X,X,X,B,O,B,O,B,B] = Win
--tictactoe[X,X,X,B,O,B,B,O,B] = Win
--tictactoe[X,X,X,B,O,B,B,B,O] = Win
--tictactoe[X,X,X,B,B,O,X,O,O] = Win
--tictactoe[X,X,X,B,B,O,O,X,O] = Win
--tictactoe[X,X,X,B,B,O,O,O,X] = Win
--tictactoe[X,X,X,B,B,O,O,B,B] = Win
--tictactoe[X,X,X,B,B,O,B,O,B] = Win
--tictactoe[X,X,X,B,B,O,B,B,O] = Win
--tictactoe[X,X,X,B,B,B,O,O,B] = Win
--tictactoe[X,X,X,B,B,B,O,B,O] = Win
--tictactoe[X,X,X,B,B,B,B,O,O] = Win
--tictactoe[X,X,O,X,X,O,O,O,X] = Win
--tictactoe[X,X,O,X,O,X,X,O,O] = Win
--tictactoe[X,X,O,X,O,O,X,O,X] = Win
--tictactoe[X,X,O,X,O,O,X,B,B] = Win
--tictactoe[X,X,O,X,O,B,X,O,B] = Win
--tictactoe[X,X,O,X,O,B,X,B,O] = Win
--tictactoe[X,X,O,X,B,O,X,O,B] = Win
--tictactoe[X,X,O,X,B,B,X,O,O] = Win
--tictactoe[X,X,O,O,X,X,O,X,O] = Win
--tictactoe[X,X,O,O,X,X,O,O,X] = Win
--tictactoe[X,X,O,O,X,O,X,O,X] = Win
--tictactoe[X,X,O,O,X,O,O,X,X] = Win
--tictactoe[X,X,O,O,X,O,B,X,B] = Win
--tictactoe[X,X,O,O,X,O,B,B,X] = Win
--tictactoe[X,X,O,O,X,B,O,X,B] = Win
--tictactoe[X,X,O,O,X,B,O,B,X] = Win
--tictactoe[X,X,O,O,X,B,B,X,O] = Win
--tictactoe[X,X,O,O,X,B,B,O,X] = Win
--tictactoe[X,X,O,B,X,O,O,X,B] = Win
--tictactoe[X,X,O,B,X,O,O,B,X] = Win
--tictactoe[X,X,O,B,X,O,B,O,X] = Win
--tictactoe[X,X,O,B,X,B,O,X,O] = Win
--tictactoe[X,X,O,B,X,B,O,O,X] = Win
--tictactoe[X,X,B,X,O,O,X,O,B] = Win
--tictactoe[X,X,B,X,O,O,X,B,O] = Win
--tictactoe[X,X,B,X,O,B,X,O,O] = Win
--tictactoe[X,X,B,X,B,O,X,O,O] = Win
--tictactoe[X,X,B,O,X,O,O,X,B] = Win
--tictactoe[X,X,B,O,X,O,O,B,X] = Win
--tictactoe[X,X,B,O,X,O,B,X,O] = Win
--tictactoe[X,X,B,O,X,O,B,O,X] = Win
--tictactoe[X,X,B,O,X,B,O,X,O] = Win
--tictactoe[X,X,B,O,X,B,O,O,X] = Win
--tictactoe[X,X,B,B,X,O,O,X,O] = Win
--tictactoe[X,X,B,B,X,O,O,O,X] = Win
--tictactoe[X,O,X,X,X,O,X,O,O] = Win
--tictactoe[X,O,X,X,X,O,O,O,X] = Win
--tictactoe[X,O,X,X,O,O,X,X,O] = Win
--tictactoe[X,O,X,X,O,O,X,B,B] = Win
--tictactoe[X,O,X,X,O,B,X,B,O] = Win
--tictactoe[X,O,X,X,B,O,X,O,B] = Win
--tictactoe[X,O,X,X,B,O,X,B,O] = Win
--tictactoe[X,O,X,X,B,B,X,O,O] = Win
--tictactoe[X,O,X,O,X,X,X,O,O] = Win
--tictactoe[X,O,X,O,X,X,O,O,X] = Win
--tictactoe[X,O,X,O,X,O,X,X,O] = Win
--tictactoe[X,O,X,O,X,O,X,O,X] = Win
--tictactoe[X,O,X,O,X,O,X,B,B] = Win
--tictactoe[X,O,X,O,X,O,O,X,X] = Win
--tictactoe[X,O,X,O,X,O,B,B,X] = Win
--tictactoe[X,O,X,O,X,B,X,O,B] = Win
--tictactoe[X,O,X,O,X,B,X,B,O] = Win
--tictactoe[X,O,X,O,X,B,O,B,X] = Win
--tictactoe[X,O,X,O,X,B,B,O,X] = Win
--tictactoe[X,O,X,O,O,X,O,X,X] = Win
--tictactoe[X,O,X,O,O,X,B,B,X] = Win
--tictactoe[X,O,X,O,B,X,O,B,X] = Win
--tictactoe[X,O,X,O,B,X,B,O,X] = Win
--tictactoe[X,O,X,B,X,O,X,O,B] = Win
--tictactoe[X,O,X,B,X,O,X,B,O] = Win
--tictactoe[X,O,X,B,X,O,O,B,X] = Win
--tictactoe[X,O,X,B,X,O,B,O,X] = Win
--tictactoe[X,O,X,B,X,B,X,O,O] = Win
--tictactoe[X,O,X,B,X,B,O,O,X] = Win
--tictactoe[X,O,X,B,O,X,O,B,X] = Win
--tictactoe[X,O,X,B,B,X,O,O,X] = Win
--tictactoe[X,O,O,X,X,X,X,O,O] = Win
--tictactoe[X,O,O,X,X,X,O,X,O] = Win
--tictactoe[X,O,O,X,X,X,O,O,X] = Win
--tictactoe[X,O,O,X,X,X,O,B,B] = Win
--tictactoe[X,O,O,X,X,X,B,O,B] = Win
--tictactoe[X,O,O,X,X,X,B,B,O] = Win
--tictactoe[X,O,O,X,X,O,X,O,X] = Win
--tictactoe[X,O,O,X,X,O,X,B,B] = Win
--tictactoe[X,O,O,X,X,O,O,X,X] = Win
--tictactoe[X,O,O,X,X,O,B,B,X] = Win
--tictactoe[X,O,O,X,X,B,X,O,B] = Win
--tictactoe[X,O,O,X,X,B,X,B,O] = Win
--tictactoe[X,O,O,X,X,B,O,B,X] = Win
--tictactoe[X,O,O,X,X,B,B,O,X] = Win
--tictactoe[X,O,O,X,O,X,X,X,O] = Win
--tictactoe[X,O,O,X,O,X,X,B,B] = Win
--tictactoe[X,O,O,X,O,O,X,X,X] = Win
--tictactoe[X,O,O,X,O,B,X,X,B] = Win
--tictactoe[X,O,O,X,O,B,X,B,X] = Win
--tictactoe[X,O,O,X,B,X,X,O,B] = Win
--tictactoe[X,O,O,X,B,X,X,B,O] = Win
--tictactoe[X,O,O,X,B,O,X,X,B] = Win
--tictactoe[X,O,O,X,B,O,X,B,X] = Win
--tictactoe[X,O,O,X,B,B,X,X,O] = Win
--tictactoe[X,O,O,X,B,B,X,O,X] = Win
--tictactoe[X,O,O,X,B,B,X,B,B] = Win
--tictactoe[X,O,O,O,X,X,X,O,X] = Win
--tictactoe[X,O,O,O,X,X,O,X,X] = Win
--tictactoe[X,O,O,O,X,X,B,B,X] = Win
--tictactoe[X,O,O,O,X,O,X,X,X] = Win
--tictactoe[X,O,O,O,X,B,X,B,X] = Win
--tictactoe[X,O,O,O,X,B,B,X,X] = Win
--tictactoe[X,O,O,O,O,X,X,X,X] = Win
--tictactoe[X,O,O,O,B,B,X,X,X] = Win
--tictactoe[X,O,O,B,X,X,O,B,X] = Win
--tictactoe[X,O,O,B,X,X,B,O,X] = Win
--tictactoe[X,O,O,B,X,O,X,B,X] = Win
--tictactoe[X,O,O,B,X,O,B,X,X] = Win
--tictactoe[X,O,O,B,X,B,X,O,X] = Win
--tictactoe[X,O,O,B,X,B,O,X,X] = Win
--tictactoe[X,O,O,B,X,B,B,B,X] = Win
--tictactoe[X,O,O,B,O,B,X,X,X] = Win
--tictactoe[X,O,O,B,B,O,X,X,X] = Win
--tictactoe[X,O,B,X,X,X,O,O,B] = Win
--tictactoe[X,O,B,X,X,X,O,B,O] = Win
--tictactoe[X,O,B,X,X,X,B,O,O] = Win
--tictactoe[X,O,B,X,X,O,X,O,B] = Win
--tictactoe[X,O,B,X,X,O,X,B,O] = Win
--tictactoe[X,O,B,X,X,O,O,B,X] = Win
--tictactoe[X,O,B,X,X,O,B,O,X] = Win
--tictactoe[X,O,B,X,X,B,X,O,O] = Win
--tictactoe[X,O,B,X,X,B,O,O,X] = Win
--tictactoe[X,O,B,X,O,X,X,B,O] = Win
--tictactoe[X,O,B,X,O,O,X,X,B] = Win
--tictactoe[X,O,B,X,O,O,X,B,X] = Win
--tictactoe[X,O,B,X,O,B,X,X,O] = Win
--tictactoe[X,O,B,X,O,B,X,B,B] = Win
--tictactoe[X,O,B,X,B,X,X,O,O] = Win
--tictactoe[X,O,B,X,B,O,X,X,O] = Win
--tictactoe[X,O,B,X,B,O,X,O,X] = Win
--tictactoe[X,O,B,X,B,O,X,B,B] = Win
--tictactoe[X,O,B,X,B,B,X,O,B] = Win
--tictactoe[X,O,B,X,B,B,X,B,O] = Win
--tictactoe[X,O,B,O,X,X,O,B,X] = Win
--tictactoe[X,O,B,O,X,X,B,O,X] = Win
--tictactoe[X,O,B,O,X,O,X,B,X] = Win
--tictactoe[X,O,B,O,X,O,B,X,X] = Win
--tictactoe[X,O,B,O,X,B,X,O,X] = Win
--tictactoe[X,O,B,O,X,B,O,X,X] = Win
--tictactoe[X,O,B,O,X,B,B,B,X] = Win
--tictactoe[X,O,B,O,O,B,X,X,X] = Win
--tictactoe[X,O,B,O,B,O,X,X,X] = Win
--tictactoe[X,O,B,B,X,X,O,O,X] = Win
--tictactoe[X,O,B,B,X,O,X,O,X] = Win
--tictactoe[X,O,B,B,X,O,O,X,X] = Win
--tictactoe[X,O,B,B,X,O,B,B,X] = Win
--tictactoe[X,O,B,B,X,B,O,B,X] = Win
--tictactoe[X,O,B,B,X,B,B,O,X] = Win
--tictactoe[X,O,B,B,O,O,X,X,X] = Win
--tictactoe[X,B,X,X,O,O,X,O,B] = Win
--tictactoe[X,B,X,X,O,O,X,B,O] = Win
--tictactoe[X,B,X,X,O,B,X,O,O] = Win
--tictactoe[X,B,X,X,B,O,X,O,O] = Win
--tictactoe[X,B,X,O,X,O,X,O,B] = Win
--tictactoe[X,B,X,O,X,O,X,B,O] = Win
--tictactoe[X,B,X,O,X,O,O,B,X] = Win
--tictactoe[X,B,X,O,X,O,B,O,X] = Win
--tictactoe[X,B,X,O,X,B,X,O,O] = Win
--tictactoe[X,B,X,O,X,B,O,O,X] = Win
--tictactoe[X,B,X,O,O,X,O,B,X] = Win
--tictactoe[X,B,X,O,O,X,B,O,X] = Win
--tictactoe[X,B,X,O,B,X,O,O,X] = Win
--tictactoe[X,B,X,B,X,O,X,O,O] = Win
--tictactoe[X,B,X,B,X,O,O,O,X] = Win
--tictactoe[X,B,X,B,O,X,O,O,X] = Win
--tictactoe[X,B,O,X,X,X,O,O,B] = Win
--tictactoe[X,B,O,X,X,X,O,B,O] = Win
--tictactoe[X,B,O,X,X,X,B,O,O] = Win
--tictactoe[X,B,O,X,X,O,X,O,B] = Win
--tictactoe[X,B,O,X,X,O,O,B,X] = Win
--tictactoe[X,B,O,X,X,O,B,O,X] = Win
--tictactoe[X,B,O,X,X,B,X,O,O] = Win
--tictactoe[X,B,O,X,X,B,O,O,X] = Win
--tictactoe[X,B,O,X,O,X,X,O,B] = Win
--tictactoe[X,B,O,X,O,X,X,B,O] = Win
--tictactoe[X,B,O,X,O,O,X,X,B] = Win
--tictactoe[X,B,O,X,O,O,X,B,X] = Win
--tictactoe[X,B,O,X,O,B,X,X,O] = Win
--tictactoe[X,B,O,X,O,B,X,O,X] = Win
--tictactoe[X,B,O,X,O,B,X,B,B] = Win
--tictactoe[X,B,O,X,B,X,X,O,O] = Win
--tictactoe[X,B,O,X,B,O,X,O,X] = Win
--tictactoe[X,B,O,X,B,O,X,B,B] = Win
--tictactoe[X,B,O,X,B,B,X,O,B] = Win
--tictactoe[X,B,O,X,B,B,X,B,O] = Win
--tictactoe[X,B,O,O,X,X,O,B,X] = Win
--tictactoe[X,B,O,O,X,X,B,O,X] = Win
--tictactoe[X,B,O,O,X,O,X,B,X] = Win
--tictactoe[X,B,O,O,X,O,B,X,X] = Win
--tictactoe[X,B,O,O,X,B,X,O,X] = Win
--tictactoe[X,B,O,O,X,B,O,X,X] = Win
--tictactoe[X,B,O,O,X,B,B,B,X] = Win
--tictactoe[X,B,O,O,O,B,X,X,X] = Win
--tictactoe[X,B,O,O,B,O,X,X,X] = Win
--tictactoe[X,B,O,B,X,X,O,O,X] = Win
--tictactoe[X,B,O,B,X,O,X,O,X] = Win
--tictactoe[X,B,O,B,X,O,O,X,X] = Win
--tictactoe[X,B,O,B,X,O,B,B,X] = Win
--tictactoe[X,B,O,B,X,B,O,B,X] = Win
--tictactoe[X,B,O,B,X,B,B,O,X] = Win
--tictactoe[X,B,O,B,O,O,X,X,X] = Win
--tictactoe[X,B,B,X,X,O,X,O,O] = Win
--tictactoe[X,B,B,X,X,O,O,O,X] = Win
--tictactoe[X,B,B,X,O,X,X,O,O] = Win
--tictactoe[X,B,B,X,O,O,X,X,O] = Win
--tictactoe[X,B,B,X,O,O,X,O,X] = Win
--tictactoe[X,B,B,X,O,O,X,B,B] = Win
--tictactoe[X,B,B,X,O,B,X,O,B] = Win
--tictactoe[X,B,B,X,O,B,X,B,O] = Win
--tictactoe[X,B,B,X,B,O,X,O,B] = Win
--tictactoe[X,B,B,X,B,O,X,B,O] = Win
--tictactoe[X,B,B,X,B,B,X,O,O] = Win
--tictactoe[X,B,B,O,X,X,O,O,X] = Win
--tictactoe[X,B,B,O,X,O,X,O,X] = Win
--tictactoe[X,B,B,O,X,O,O,X,X] = Win
--tictactoe[X,B,B,O,X,O,B,B,X] = Win
--tictactoe[X,B,B,O,X,B,O,B,X] = Win
--tictactoe[X,B,B,O,X,B,B,O,X] = Win
--tictactoe[X,B,B,B,X,O,O,B,X] = Win
--tictactoe[X,B,B,B,X,O,B,O,X] = Win
--tictactoe[X,B,B,B,X,B,O,O,X] = Win
--tictactoe[O,X,X,X,X,O,X,O,O] = Win
--tictactoe[O,X,X,X,X,O,O,X,O] = Win
--tictactoe[O,X,X,X,O,X,O,O,X] = Win
--tictactoe[O,X,X,O,X,X,X,O,O] = Win
--tictactoe[O,X,X,O,X,O,X,X,O] = Win
--tictactoe[O,X,X,O,X,O,X,O,X] = Win
--tictactoe[O,X,X,O,X,O,X,B,B] = Win
--tictactoe[O,X,X,O,X,O,B,X,B] = Win
--tictactoe[O,X,X,O,X,B,X,O,B] = Win
--tictactoe[O,X,X,O,X,B,X,B,O] = Win
--tictactoe[O,X,X,O,X,B,B,X,O] = Win
--tictactoe[O,X,X,O,O,X,X,O,X] = Win
--tictactoe[O,X,X,O,O,X,B,B,X] = Win
--tictactoe[O,X,X,O,B,X,B,O,X] = Win
--tictactoe[O,X,X,B,X,O,X,O,B] = Win
--tictactoe[O,X,X,B,X,O,X,B,O] = Win
--tictactoe[O,X,X,B,X,O,O,X,B] = Win
--tictactoe[O,X,X,B,X,O,B,X,O] = Win
--tictactoe[O,X,X,B,X,B,X,O,O] = Win
--tictactoe[O,X,X,B,X,B,O,X,O] = Win
--tictactoe[O,X,X,B,O,X,O,B,X] = Win
--tictactoe[O,X,X,B,O,X,B,O,X] = Win
--tictactoe[O,X,X,B,B,X,O,O,X] = Win
--tictactoe[O,X,O,X,X,X,X,O,O] = Win
--tictactoe[O,X,O,X,X,X,O,X,O] = Win
--tictactoe[O,X,O,X,X,X,O,O,X] = Win
--tictactoe[O,X,O,X,X,X,O,B,B] = Win
--tictactoe[O,X,O,X,X,X,B,O,B] = Win
--tictactoe[O,X,O,X,X,X,B,B,O] = Win
--tictactoe[O,X,O,X,X,O,O,X,X] = Win
--tictactoe[O,X,O,X,X,O,B,X,B] = Win
--tictactoe[O,X,O,X,X,B,O,X,B] = Win
--tictactoe[O,X,O,X,X,B,B,X,O] = Win
--tictactoe[O,X,O,X,O,O,X,X,X] = Win
--tictactoe[O,X,O,O,X,X,X,X,O] = Win
--tictactoe[O,X,O,O,X,X,B,X,B] = Win
--tictactoe[O,X,O,O,X,O,X,X,X] = Win
--tictactoe[O,X,O,O,X,B,X,X,B] = Win
--tictactoe[O,X,O,O,X,B,B,X,X] = Win
--tictactoe[O,X,O,O,O,X,X,X,X] = Win
--tictactoe[O,X,O,O,B,B,X,X,X] = Win
--tictactoe[O,X,O,B,X,X,O,X,B] = Win
--tictactoe[O,X,O,B,X,X,B,X,O] = Win
--tictactoe[O,X,O,B,X,O,X,X,B] = Win
--tictactoe[O,X,O,B,X,O,B,X,X] = Win
--tictactoe[O,X,O,B,X,B,X,X,O] = Win
--tictactoe[O,X,O,B,X,B,O,X,X] = Win
--tictactoe[O,X,O,B,X,B,B,X,B] = Win
--tictactoe[O,X,O,B,O,B,X,X,X] = Win
--tictactoe[O,X,O,B,B,O,X,X,X] = Win
--tictactoe[O,X,B,X,X,X,O,O,B] = Win
--tictactoe[O,X,B,X,X,X,O,B,O] = Win
--tictactoe[O,X,B,X,X,X,B,O,O] = Win
--tictactoe[O,X,B,X,X,O,O,X,B] = Win
--tictactoe[O,X,B,X,X,O,B,X,O] = Win
--tictactoe[O,X,B,X,X,B,O,X,O] = Win
--tictactoe[O,X,B,O,X,X,B,X,O] = Win
--tictactoe[O,X,B,O,X,O,X,X,B] = Win
--tictactoe[O,X,B,O,X,O,B,X,X] = Win
--tictactoe[O,X,B,O,X,B,X,X,O] = Win
--tictactoe[O,X,B,O,X,B,B,X,B] = Win
--tictactoe[O,X,B,O,O,B,X,X,X] = Win
--tictactoe[O,X,B,O,B,O,X,X,X] = Win
--tictactoe[O,X,B,B,X,X,O,X,O] = Win
--tictactoe[O,X,B,B,X,O,X,X,O] = Win
--tictactoe[O,X,B,B,X,O,O,X,X] = Win
--tictactoe[O,X,B,B,X,O,B,X,B] = Win
--tictactoe[O,X,B,B,X,B,O,X,B] = Win
--tictactoe[O,X,B,B,X,B,B,X,O] = Win
--tictactoe[O,X,B,B,O,O,X,X,X] = Win
--tictactoe[O,O,X,X,X,X,X,O,O] = Win
--tictactoe[O,O,X,X,X,X,O,X,O] = Win
--tictactoe[O,O,X,X,X,X,O,O,X] = Win
--tictactoe[O,O,X,X,X,X,O,B,B] = Win
--tictactoe[O,O,X,X,X,X,B,O,B] = Win
--tictactoe[O,O,X,X,X,X,B,B,O] = Win
--tictactoe[O,O,X,X,X,O,X,X,O] = Win
--tictactoe[O,O,X,X,X,O,X,O,X] = Win
--tictactoe[O,O,X,X,X,O,X,B,B] = Win
--tictactoe[O,O,X,X,X,B,X,O,B] = Win
--tictactoe[O,O,X,X,X,B,X,B,O] = Win
--tictactoe[O,O,X,X,O,X,O,X,X] = Win
--tictactoe[O,O,X,X,O,X,B,B,X] = Win
--tictactoe[O,O,X,X,O,O,X,X,X] = Win
--tictactoe[O,O,X,X,B,X,O,B,X] = Win
--tictactoe[O,O,X,X,B,X,B,O,X] = Win
--tictactoe[O,O,X,O,X,X,X,X,O] = Win
--tictactoe[O,O,X,O,X,X,X,O,X] = Win
--tictactoe[O,O,X,O,X,X,X,B,B] = Win
--tictactoe[O,O,X,O,X,X,B,B,X] = Win
--tictactoe[O,O,X,O,X,O,X,X,X] = Win
--tictactoe[O,O,X,O,X,B,X,X,B] = Win
--tictactoe[O,O,X,O,X,B,X,B,X] = Win
--tictactoe[O,O,X,O,O,X,X,X,X] = Win
--tictactoe[O,O,X,O,B,X,X,B,X] = Win
--tictactoe[O,O,X,O,B,X,B,X,X] = Win
--tictactoe[O,O,X,O,B,B,X,X,X] = Win
--tictactoe[O,O,X,B,X,X,X,O,B] = Win
--tictactoe[O,O,X,B,X,X,X,B,O] = Win
--tictactoe[O,O,X,B,X,X,O,B,X] = Win
--tictactoe[O,O,X,B,X,X,B,O,X] = Win
--tictactoe[O,O,X,B,X,O,X,X,B] = Win
--tictactoe[O,O,X,B,X,O,X,B,X] = Win
--tictactoe[O,O,X,B,X,B,X,X,O] = Win
--tictactoe[O,O,X,B,X,B,X,O,X] = Win
--tictactoe[O,O,X,B,X,B,X,B,B] = Win
--tictactoe[O,O,X,B,O,X,X,B,X] = Win
--tictactoe[O,O,X,B,O,X,B,X,X] = Win
--tictactoe[O,O,X,B,O,B,X,X,X] = Win
--tictactoe[O,O,X,B,B,X,X,O,X] = Win
--tictactoe[O,O,X,B,B,X,O,X,X] = Win
--tictactoe[O,O,X,B,B,X,B,B,X] = Win
--tictactoe[O,O,X,B,B,O,X,X,X] = Win
--tictactoe[O,O,B,X,X,X,X,O,B] = Win
--tictactoe[O,O,B,X,X,X,X,B,O] = Win
--tictactoe[O,O,B,X,X,X,O,X,B] = Win
--tictactoe[O,O,B,X,X,X,O,B,X] = Win
--tictactoe[O,O,B,X,X,X,B,X,O] = Win
--tictactoe[O,O,B,X,X,X,B,O,X] = Win
--tictactoe[O,O,B,X,X,X,B,B,B] = Win
--tictactoe[O,O,B,X,O,B,X,X,X] = Win
--tictactoe[O,O,B,X,B,O,X,X,X] = Win
--tictactoe[O,O,B,O,X,B,X,X,X] = Win
--tictactoe[O,O,B,O,B,X,X,X,X] = Win
--tictactoe[O,O,B,B,X,O,X,X,X] = Win
--tictactoe[O,O,B,B,O,X,X,X,X] = Win
--tictactoe[O,O,B,B,B,B,X,X,X] = Win
--tictactoe[O,B,X,X,X,X,O,O,B] = Win
--tictactoe[O,B,X,X,X,X,O,B,O] = Win
--tictactoe[O,B,X,X,X,X,B,O,O] = Win
--tictactoe[O,B,X,X,X,O,X,O,B] = Win
--tictactoe[O,B,X,X,X,O,X,B,O] = Win
--tictactoe[O,B,X,X,X,B,X,O,O] = Win
--tictactoe[O,B,X,X,O,X,O,B,X] = Win
--tictactoe[O,B,X,X,O,X,B,O,X] = Win
--tictactoe[O,B,X,X,B,X,O,O,X] = Win
--tictactoe[O,B,X,O,X,X,X,O,B] = Win
--tictactoe[O,B,X,O,X,X,X,B,O] = Win
--tictactoe[O,B,X,O,X,X,B,O,X] = Win
--tictactoe[O,B,X,O,X,O,X,X,B] = Win
--tictactoe[O,B,X,O,X,O,X,B,X] = Win
--tictactoe[O,B,X,O,X,B,X,X,O] = Win
--tictactoe[O,B,X,O,X,B,X,O,X] = Win
--tictactoe[O,B,X,O,X,B,X,B,B] = Win
--tictactoe[O,B,X,O,O,X,X,B,X] = Win
--tictactoe[O,B,X,O,O,X,B,X,X] = Win
--tictactoe[O,B,X,O,O,B,X,X,X] = Win
--tictactoe[O,B,X,O,B,X,X,O,X] = Win
--tictactoe[O,B,X,O,B,X,B,B,X] = Win
--tictactoe[O,B,X,O,B,O,X,X,X] = Win
--tictactoe[O,B,X,B,X,X,X,O,O] = Win
--tictactoe[O,B,X,B,X,X,O,O,X] = Win
--tictactoe[O,B,X,B,X,O,X,X,O] = Win
--tictactoe[O,B,X,B,X,O,X,O,X] = Win
--tictactoe[O,B,X,B,X,O,X,B,B] = Win
--tictactoe[O,B,X,B,X,B,X,O,B] = Win
--tictactoe[O,B,X,B,X,B,X,B,O] = Win
--tictactoe[O,B,X,B,O,X,X,O,X] = Win
--tictactoe[O,B,X,B,O,X,O,X,X] = Win
--tictactoe[O,B,X,B,O,X,B,B,X] = Win
--tictactoe[O,B,X,B,O,O,X,X,X] = Win
--tictactoe[O,B,X,B,B,X,O,B,X] = Win
--tictactoe[O,B,X,B,B,X,B,O,X] = Win
--tictactoe[O,B,O,X,X,X,X,O,B] = Win
--tictactoe[O,B,O,X,X,X,X,B,O] = Win
--tictactoe[O,B,O,X,X,X,O,X,B] = Win
--tictactoe[O,B,O,X,X,X,O,B,X] = Win
--tictactoe[O,B,O,X,X,X,B,X,O] = Win
--tictactoe[O,B,O,X,X,X,B,O,X] = Win
--tictactoe[O,B,O,X,X,X,B,B,B] = Win
--tictactoe[O,B,O,X,O,B,X,X,X] = Win
--tictactoe[O,B,O,X,B,O,X,X,X] = Win
--tictactoe[O,B,O,O,X,B,X,X,X] = Win
--tictactoe[O,B,O,O,B,X,X,X,X] = Win
--tictactoe[O,B,O,B,X,O,X,X,X] = Win
--tictactoe[O,B,O,B,O,X,X,X,X] = Win
--tictactoe[O,B,O,B,B,B,X,X,X] = Win
--tictactoe[O,B,B,X,X,X,X,O,O] = Win
--tictactoe[O,B,B,X,X,X,O,X,O] = Win
--tictactoe[O,B,B,X,X,X,O,O,X] = Win
--tictactoe[O,B,B,X,X,X,O,B,B] = Win
--tictactoe[O,B,B,X,X,X,B,O,B] = Win
--tictactoe[O,B,B,X,X,X,B,B,O] = Win
--tictactoe[O,B,B,X,O,O,X,X,X] = Win
--tictactoe[O,B,B,O,X,O,X,X,X] = Win
--tictactoe[O,B,B,O,O,X,X,X,X] = Win
--tictactoe[O,B,B,O,B,B,X,X,X] = Win
--tictactoe[O,B,B,B,O,B,X,X,X] = Win
--tictactoe[O,B,B,B,B,O,X,X,X] = Win
--tictactoe[B,X,X,O,X,O,X,O,B] = Win
--tictactoe[B,X,X,O,X,O,X,B,O] = Win
--tictactoe[B,X,X,O,X,O,O,X,B] = Win
--tictactoe[B,X,X,O,X,O,B,X,O] = Win
--tictactoe[B,X,X,O,X,B,X,O,O] = Win
--tictactoe[B,X,X,O,X,B,O,X,O] = Win
--tictactoe[B,X,X,O,O,X,O,B,X] = Win
--tictactoe[B,X,X,O,O,X,B,O,X] = Win
--tictactoe[B,X,X,O,B,X,O,O,X] = Win
--tictactoe[B,X,X,B,X,O,X,O,O] = Win
--tictactoe[B,X,X,B,X,O,O,X,O] = Win
--tictactoe[B,X,X,B,O,X,O,O,X] = Win
--tictactoe[B,X,O,X,X,X,O,O,B] = Win
--tictactoe[B,X,O,X,X,X,O,B,O] = Win
--tictactoe[B,X,O,X,X,X,B,O,O] = Win
--tictactoe[B,X,O,X,X,O,O,X,B] = Win
--tictactoe[B,X,O,X,X,B,O,X,O] = Win
--tictactoe[B,X,O,O,X,X,O,X,B] = Win
--tictactoe[B,X,O,O,X,X,B,X,O] = Win
--tictactoe[B,X,O,O,X,O,X,X,B] = Win
--tictactoe[B,X,O,O,X,O,B,X,X] = Win
--tictactoe[B,X,O,O,X,B,X,X,O] = Win
--tictactoe[B,X,O,O,X,B,O,X,X] = Win
--tictactoe[B,X,O,O,X,B,B,X,B] = Win
--tictactoe[B,X,O,O,O,B,X,X,X] = Win
--tictactoe[B,X,O,O,B,O,X,X,X] = Win
--tictactoe[B,X,O,B,X,X,O,X,O] = Win
--tictactoe[B,X,O,B,X,O,O,X,X] = Win
--tictactoe[B,X,O,B,X,O,B,X,B] = Win
--tictactoe[B,X,O,B,X,B,O,X,B] = Win
--tictactoe[B,X,O,B,X,B,B,X,O] = Win
--tictactoe[B,X,O,B,O,O,X,X,X] = Win
--tictactoe[B,X,B,X,X,O,O,X,O] = Win
--tictactoe[B,X,B,O,X,X,O,X,O] = Win
--tictactoe[B,X,B,O,X,O,X,X,O] = Win
--tictactoe[B,X,B,O,X,O,O,X,X] = Win
--tictactoe[B,X,B,O,X,O,B,X,B] = Win
--tictactoe[B,X,B,O,X,B,O,X,B] = Win
--tictactoe[B,X,B,O,X,B,B,X,O] = Win
--tictactoe[B,X,B,B,X,O,O,X,B] = Win
--tictactoe[B,X,B,B,X,O,B,X,O] = Win
--tictactoe[B,X,B,B,X,B,O,X,O] = Win
--tictactoe[B,O,X,X,X,X,O,O,B] = Win
--tictactoe[B,O,X,X,X,X,O,B,O] = Win
--tictactoe[B,O,X,X,X,X,B,O,O] = Win
--tictactoe[B,O,X,X,X,O,X,O,B] = Win
--tictactoe[B,O,X,X,X,O,X,B,O] = Win
--tictactoe[B,O,X,X,X,B,X,O,O] = Win
--tictactoe[B,O,X,X,O,X,O,B,X] = Win
--tictactoe[B,O,X,X,B,X,O,O,X] = Win
--tictactoe[B,O,X,O,X,X,X,O,B] = Win
--tictactoe[B,O,X,O,X,X,X,B,O] = Win
--tictactoe[B,O,X,O,X,X,O,B,X] = Win
--tictactoe[B,O,X,O,X,X,B,O,X] = Win
--tictactoe[B,O,X,O,X,O,X,X,B] = Win
--tictactoe[B,O,X,O,X,O,X,B,X] = Win
--tictactoe[B,O,X,O,X,B,X,X,O] = Win
--tictactoe[B,O,X,O,X,B,X,O,X] = Win
--tictactoe[B,O,X,O,X,B,X,B,B] = Win
--tictactoe[B,O,X,O,O,X,X,B,X] = Win
--tictactoe[B,O,X,O,O,X,B,X,X] = Win
--tictactoe[B,O,X,O,O,B,X,X,X] = Win
--tictactoe[B,O,X,O,B,X,X,O,X] = Win
--tictactoe[B,O,X,O,B,X,O,X,X] = Win
--tictactoe[B,O,X,O,B,X,B,B,X] = Win
--tictactoe[B,O,X,O,B,O,X,X,X] = Win
--tictactoe[B,O,X,B,X,X,X,O,O] = Win
--tictactoe[B,O,X,B,X,X,O,O,X] = Win
--tictactoe[B,O,X,B,X,O,X,X,O] = Win
--tictactoe[B,O,X,B,X,O,X,O,X] = Win
--tictactoe[B,O,X,B,X,O,X,B,B] = Win
--tictactoe[B,O,X,B,X,B,X,O,B] = Win
--tictactoe[B,O,X,B,X,B,X,B,O] = Win
--tictactoe[B,O,X,B,O,X,O,X,X] = Win
--tictactoe[B,O,X,B,O,X,B,B,X] = Win
--tictactoe[B,O,X,B,O,O,X,X,X] = Win
--tictactoe[B,O,X,B,B,X,O,B,X] = Win
--tictactoe[B,O,X,B,B,X,B,O,X] = Win
--tictactoe[B,O,O,X,X,X,X,O,B] = Win
--tictactoe[B,O,O,X,X,X,X,B,O] = Win
--tictactoe[B,O,O,X,X,X,O,X,B] = Win
--tictactoe[B,O,O,X,X,X,O,B,X] = Win
--tictactoe[B,O,O,X,X,X,B,X,O] = Win
--tictactoe[B,O,O,X,X,X,B,O,X] = Win
--tictactoe[B,O,O,X,X,X,B,B,B] = Win
--tictactoe[B,O,O,X,O,B,X,X,X] = Win
--tictactoe[B,O,O,X,B,O,X,X,X] = Win
--tictactoe[B,O,O,O,X,B,X,X,X] = Win
--tictactoe[B,O,O,O,B,X,X,X,X] = Win
--tictactoe[B,O,O,B,X,O,X,X,X] = Win
--tictactoe[B,O,O,B,O,X,X,X,X] = Win
--tictactoe[B,O,O,B,B,B,X,X,X] = Win
--tictactoe[B,O,B,X,X,X,X,O,O] = Win
--tictactoe[B,O,B,X,X,X,O,X,O] = Win
--tictactoe[B,O,B,X,X,X,O,O,X] = Win
--tictactoe[B,O,B,X,X,X,O,B,B] = Win
--tictactoe[B,O,B,X,X,X,B,O,B] = Win
--tictactoe[B,O,B,X,X,X,B,B,O] = Win
--tictactoe[B,O,B,X,O,O,X,X,X] = Win
--tictactoe[B,O,B,O,X,O,X,X,X] = Win
--tictactoe[B,O,B,O,O,X,X,X,X] = Win
--tictactoe[B,O,B,O,B,B,X,X,X] = Win
--tictactoe[B,O,B,B,O,B,X,X,X] = Win
--tictactoe[B,O,B,B,B,O,X,X,X] = Win
--tictactoe[B,B,X,X,X,O,X,O,O] = Win
--tictactoe[B,B,X,X,O,X,O,O,X] = Win
--tictactoe[B,B,X,O,X,X,X,O,O] = Win
--tictactoe[B,B,X,O,X,X,O,O,X] = Win
--tictactoe[B,B,X,O,X,O,X,X,O] = Win
--tictactoe[B,B,X,O,X,O,X,O,X] = Win
--tictactoe[B,B,X,O,X,O,X,B,B] = Win
--tictactoe[B,B,X,O,X,B,X,O,B] = Win
--tictactoe[B,B,X,O,X,B,X,B,O] = Win
--tictactoe[B,B,X,O,O,X,X,O,X] = Win
--tictactoe[B,B,X,O,O,X,O,X,X] = Win
--tictactoe[B,B,X,O,O,X,B,B,X] = Win
--tictactoe[B,B,X,O,B,X,O,B,X] = Win
--tictactoe[B,B,X,O,B,X,B,O,X] = Win
--tictactoe[B,B,X,B,X,O,X,O,B] = Win
--tictactoe[B,B,X,B,X,O,X,B,O] = Win
--tictactoe[B,B,X,B,X,B,X,O,O] = Win
--tictactoe[B,B,X,B,O,X,O,B,X] = Win
--tictactoe[B,B,X,B,O,X,B,O,X] = Win
--tictactoe[B,B,X,B,B,X,O,O,X] = Win
--tictactoe[B,B,O,X,X,X,X,O,O] = Win
--tictactoe[B,B,O,X,X,X,O,X,O] = Win
--tictactoe[B,B,O,X,X,X,O,O,X] = Win
--tictactoe[B,B,O,X,X,X,O,B,B] = Win
--tictactoe[B,B,O,X,X,X,B,O,B] = Win
--tictactoe[B,B,O,X,X,X,B,B,O] = Win
--tictactoe[B,B,O,X,O,O,X,X,X] = Win
--tictactoe[B,B,O,O,X,O,X,X,X] = Win
--tictactoe[B,B,O,O,O,X,X,X,X] = Win
--tictactoe[B,B,O,O,B,B,X,X,X] = Win
--tictactoe[B,B,O,B,O,B,X,X,X] = Win
--tictactoe[B,B,O,B,B,O,X,X,X] = Win
--tictactoe[B,B,B,X,X,X,O,O,B] = Win
--tictactoe[B,B,B,X,X,X,O,B,O] = Win
--tictactoe[B,B,B,X,X,X,B,O,O] = Win
--tictactoe[B,B,B,O,O,B,X,X,X] = Win
--tictactoe[B,B,B,O,B,O,X,X,X] = Win
--tictactoe[B,B,B,B,O,O,X,X,X] = Win
--tictactoe[X,X,O,X,X,O,O,B,O] = Lose
--tictactoe[X,X,O,X,X,O,B,O,O] = Lose
--tictactoe[X,X,O,X,X,B,O,O,O] = Lose
--tictactoe[X,X,O,X,O,X,O,O,B] = Lose
--tictactoe[X,X,O,X,O,X,O,B,O] = Lose
--tictactoe[X,X,O,X,O,O,O,X,B] = Lose
--tictactoe[X,X,O,X,O,O,O,B,X] = Lose
--tictactoe[X,X,O,X,O,O,B,X,O] = Lose
--tictactoe[X,X,O,X,O,B,O,X,O] = Lose
--tictactoe[X,X,O,X,O,B,O,O,X] = Lose
--tictactoe[X,X,O,X,O,B,O,B,B] = Lose
--tictactoe[X,X,O,X,B,X,O,O,O] = Lose
--tictactoe[X,X,O,X,B,O,O,X,O] = Lose
--tictactoe[X,X,O,X,B,O,B,B,O] = Lose
--tictactoe[X,X,O,O,X,O,X,B,O] = Lose
--tictactoe[X,X,O,O,O,X,O,X,B] = Lose
--tictactoe[X,X,O,O,O,X,O,B,X] = Lose
--tictactoe[X,X,O,O,O,O,X,X,B] = Lose
--tictactoe[X,X,O,O,O,O,X,B,X] = Lose
--tictactoe[X,X,O,O,O,O,B,X,X] = Lose
--tictactoe[X,X,O,O,O,B,O,X,X] = Lose
--tictactoe[X,X,O,O,B,O,X,X,O] = Lose
--tictactoe[X,X,O,B,X,X,O,O,O] = Lose
--tictactoe[X,X,O,B,X,O,X,O,O] = Lose
--tictactoe[X,X,O,B,X,O,B,B,O] = Lose
--tictactoe[X,X,O,B,O,X,O,X,O] = Lose
--tictactoe[X,X,O,B,O,X,O,O,X] = Lose
--tictactoe[X,X,O,B,O,X,O,B,B] = Lose
--tictactoe[X,X,O,B,O,O,X,X,O] = Lose
--tictactoe[X,X,O,B,O,O,O,X,X] = Lose
--tictactoe[X,X,O,B,O,B,O,X,B] = Lose
--tictactoe[X,X,O,B,O,B,O,B,X] = Lose
--tictactoe[X,X,O,B,B,O,X,B,O] = Lose
--tictactoe[X,X,O,B,B,O,B,X,O] = Lose
--tictactoe[X,X,B,X,X,O,O,O,O] = Lose
--tictactoe[X,X,B,X,O,X,O,O,O] = Lose
--tictactoe[X,X,B,X,B,B,O,O,O] = Lose
--tictactoe[X,X,B,O,X,X,O,O,O] = Lose
--tictactoe[X,X,B,O,O,O,X,X,O] = Lose
--tictactoe[X,X,B,O,O,O,X,O,X] = Lose
--tictactoe[X,X,B,O,O,O,X,B,B] = Lose
--tictactoe[X,X,B,O,O,O,O,X,X] = Lose
--tictactoe[X,X,B,O,O,O,B,X,B] = Lose
--tictactoe[X,X,B,O,O,O,B,B,X] = Lose
--tictactoe[X,X,B,B,X,B,O,O,O] = Lose
--tictactoe[X,X,B,B,B,X,O,O,O] = Lose
--tictactoe[X,O,X,X,X,B,O,O,O] = Lose
--tictactoe[X,O,X,X,O,X,O,O,B] = Lose
--tictactoe[X,O,X,X,O,X,B,O,O] = Lose
--tictactoe[X,O,X,X,O,O,B,O,X] = Lose
--tictactoe[X,O,X,X,O,B,O,O,X] = Lose
--tictactoe[X,O,X,X,O,B,B,O,B] = Lose
--tictactoe[X,O,X,X,B,X,O,O,O] = Lose
--tictactoe[X,O,X,O,O,X,X,O,B] = Lose
--tictactoe[X,O,X,O,O,O,X,X,B] = Lose
--tictactoe[X,O,X,O,O,O,X,B,X] = Lose
--tictactoe[X,O,X,O,O,O,B,X,X] = Lose
--tictactoe[X,O,X,O,O,B,X,O,X] = Lose
--tictactoe[X,O,X,B,X,X,O,O,O] = Lose
--tictactoe[X,O,X,B,O,X,X,O,O] = Lose
--tictactoe[X,O,X,B,O,X,B,O,B] = Lose
--tictactoe[X,O,X,B,O,O,X,O,X] = Lose
--tictactoe[X,O,X,B,O,B,X,O,B] = Lose
--tictactoe[X,O,X,B,O,B,B,O,X] = Lose
--tictactoe[X,O,O,X,X,O,B,X,O] = Lose
--tictactoe[X,O,O,X,O,X,O,X,B] = Lose
--tictactoe[X,O,O,X,O,X,O,B,X] = Lose
--tictactoe[X,O,O,X,O,X,B,O,X] = Lose
--tictactoe[X,O,O,X,O,B,O,X,X] = Lose
--tictactoe[X,O,O,B,X,O,X,X,O] = Lose
--tictactoe[X,O,O,B,O,X,X,O,X] = Lose
--tictactoe[X,O,O,B,O,X,O,X,X] = Lose
--tictactoe[X,O,B,X,O,X,O,O,X] = Lose
--tictactoe[X,O,B,X,O,X,B,O,B] = Lose
--tictactoe[X,O,B,X,O,B,B,O,X] = Lose
--tictactoe[X,O,B,O,O,X,X,O,X] = Lose
--tictactoe[X,O,B,B,O,X,X,O,B] = Lose
--tictactoe[X,O,B,B,O,X,B,O,X] = Lose
--tictactoe[X,O,B,B,O,B,X,O,X] = Lose
--tictactoe[X,B,X,X,X,O,O,O,O] = Lose
--tictactoe[X,B,X,X,O,X,O,O,O] = Lose
--tictactoe[X,B,X,X,B,B,O,O,O] = Lose
--tictactoe[X,B,X,O,X,X,O,O,O] = Lose
--tictactoe[X,B,X,O,O,O,X,X,O] = Lose
--tictactoe[X,B,X,O,O,O,X,O,X] = Lose
--tictactoe[X,B,X,O,O,O,X,B,B] = Lose
--tictactoe[X,B,X,O,O,O,O,X,X] = Lose
--tictactoe[X,B,X,O,O,O,B,X,B] = Lose
--tictactoe[X,B,X,O,O,O,B,B,X] = Lose
--tictactoe[X,B,X,B,X,B,O,O,O] = Lose
--tictactoe[X,B,X,B,B,X,O,O,O] = Lose
--tictactoe[X,B,O,X,X,O,O,X,O] = Lose
--tictactoe[X,B,O,X,X,O,B,B,O] = Lose
--tictactoe[X,B,O,X,O,X,O,X,O] = Lose
--tictactoe[X,B,O,X,O,X,O,O,X] = Lose
--tictactoe[X,B,O,X,O,X,O,B,B] = Lose
--tictactoe[X,B,O,X,O,O,O,X,X] = Lose
--tictactoe[X,B,O,X,O,B,O,X,B] = Lose
--tictactoe[X,B,O,X,O,B,O,B,X] = Lose
--tictactoe[X,B,O,X,B,O,B,X,O] = Lose
--tictactoe[X,B,O,O,X,O,X,X,O] = Lose
--tictactoe[X,B,O,O,O,X,O,X,X] = Lose
--tictactoe[X,B,O,B,X,O,X,B,O] = Lose
--tictactoe[X,B,O,B,X,O,B,X,O] = Lose
--tictactoe[X,B,O,B,O,X,O,X,B] = Lose
--tictactoe[X,B,O,B,O,X,O,B,X] = Lose
--tictactoe[X,B,O,B,O,B,O,X,X] = Lose
--tictactoe[X,B,O,B,B,O,X,X,O] = Lose
--tictactoe[X,B,B,X,X,B,O,O,O] = Lose
--tictactoe[X,B,B,X,B,X,O,O,O] = Lose
--tictactoe[X,B,B,O,O,O,X,X,B] = Lose
--tictactoe[X,B,B,O,O,O,X,B,X] = Lose
--tictactoe[X,B,B,O,O,O,B,X,X] = Lose
--tictactoe[X,B,B,B,X,X,O,O,O] = Lose
--tictactoe[O,X,X,X,X,B,O,O,O] = Lose
--tictactoe[O,X,X,X,O,X,O,B,O] = Lose
--tictactoe[O,X,X,X,O,X,B,O,O] = Lose
--tictactoe[O,X,X,X,O,O,X,B,O] = Lose
--tictactoe[O,X,X,X,O,O,B,X,O] = Lose
--tictactoe[O,X,X,X,O,B,X,O,O] = Lose
--tictactoe[O,X,X,X,O,B,O,X,O] = Lose
--tictactoe[O,X,X,X,O,B,B,B,O] = Lose
--tictactoe[O,X,X,X,B,X,O,O,O] = Lose
--tictactoe[O,X,X,O,X,X,O,O,B] = Lose
--tictactoe[O,X,X,O,X,X,O,B,O] = Lose
--tictactoe[O,X,X,O,X,O,O,B,X] = Lose
--tictactoe[O,X,X,O,X,B,O,O,X] = Lose
--tictactoe[O,X,X,O,X,B,O,B,B] = Lose
--tictactoe[O,X,X,O,O,X,X,B,O] = Lose
--tictactoe[O,X,X,O,O,X,O,X,B] = Lose
--tictactoe[O,X,X,O,O,X,B,X,O] = Lose
--tictactoe[O,X,X,O,O,O,X,X,B] = Lose
--tictactoe[O,X,X,O,O,O,X,B,X] = Lose
--tictactoe[O,X,X,O,O,O,B,X,X] = Lose
--tictactoe[O,X,X,O,O,B,X,X,O] = Lose
--tictactoe[O,X,X,O,O,B,O,X,X] = Lose
--tictactoe[O,X,X,O,B,X,O,X,O] = Lose
--tictactoe[O,X,X,O,B,X,O,B,B] = Lose
--tictactoe[O,X,X,O,B,O,O,X,X] = Lose
--tictactoe[O,X,X,O,B,B,O,X,B] = Lose
--tictactoe[O,X,X,O,B,B,O,B,X] = Lose
--tictactoe[O,X,X,B,X,X,O,O,O] = Lose
--tictactoe[O,X,X,B,O,X,X,O,O] = Lose
--tictactoe[O,X,X,B,O,X,O,X,O] = Lose
--tictactoe[O,X,X,B,O,X,B,B,O] = Lose
--tictactoe[O,X,X,B,O,O,X,X,O] = Lose
--tictactoe[O,X,X,B,O,B,X,B,O] = Lose
--tictactoe[O,X,X,B,O,B,B,X,O] = Lose
--tictactoe[O,X,O,X,X,O,X,B,O] = Lose
--tictactoe[O,X,O,X,O,X,X,B,O] = Lose
--tictactoe[O,X,O,X,O,X,O,X,B] = Lose
--tictactoe[O,X,O,X,O,X,O,B,X] = Lose
--tictactoe[O,X,O,X,O,X,B,X,O] = Lose
--tictactoe[O,X,O,X,O,B,X,X,O] = Lose
--tictactoe[O,X,O,X,O,B,O,X,X] = Lose
--tictactoe[O,X,O,X,B,O,X,X,O] = Lose
--tictactoe[O,X,O,O,X,X,O,B,X] = Lose
--tictactoe[O,X,O,O,B,X,O,X,X] = Lose
--tictactoe[O,X,O,B,O,X,X,X,O] = Lose
--tictactoe[O,X,O,B,O,X,O,X,X] = Lose
--tictactoe[O,X,B,X,O,X,X,O,O] = Lose
--tictactoe[O,X,B,X,O,X,O,X,O] = Lose
--tictactoe[O,X,B,X,O,X,B,B,O] = Lose
--tictactoe[O,X,B,X,O,O,X,X,O] = Lose
--tictactoe[O,X,B,X,O,B,X,B,O] = Lose
--tictactoe[O,X,B,X,O,B,B,X,O] = Lose
--tictactoe[O,X,B,O,X,X,O,O,X] = Lose
--tictactoe[O,X,B,O,X,X,O,B,B] = Lose
--tictactoe[O,X,B,O,X,B,O,B,X] = Lose
--tictactoe[O,X,B,O,O,X,X,X,O] = Lose
--tictactoe[O,X,B,O,O,X,O,X,X] = Lose
--tictactoe[O,X,B,O,B,X,O,X,B] = Lose
--tictactoe[O,X,B,O,B,X,O,B,X] = Lose
--tictactoe[O,X,B,O,B,B,O,X,X] = Lose
--tictactoe[O,X,B,B,O,X,X,B,O] = Lose
--tictactoe[O,X,B,B,O,X,B,X,O] = Lose
--tictactoe[O,X,B,B,O,B,X,X,O] = Lose
--tictactoe[O,O,X,X,O,X,X,O,B] = Lose
--tictactoe[O,O,X,X,O,X,X,B,O] = Lose
--tictactoe[O,O,X,X,O,X,B,X,O] = Lose
--tictactoe[O,O,X,X,O,B,X,X,O] = Lose
--tictactoe[O,O,X,X,O,B,X,O,X] = Lose
--tictactoe[O,O,X,O,X,X,O,X,B] = Lose
--tictactoe[O,O,X,O,X,B,O,X,X] = Lose
--tictactoe[O,O,X,B,O,X,X,X,O] = Lose
--tictactoe[O,O,O,X,X,O,X,X,B] = Lose
--tictactoe[O,O,O,X,X,O,X,B,X] = Lose
--tictactoe[O,O,O,X,X,O,B,X,X] = Lose
--tictactoe[O,O,O,X,X,B,X,X,O] = Lose
--tictactoe[O,O,O,X,X,B,X,O,X] = Lose
--tictactoe[O,O,O,X,X,B,X,B,B] = Lose
--tictactoe[O,O,O,X,X,B,O,X,X] = Lose
--tictactoe[O,O,O,X,X,B,B,X,B] = Lose
--tictactoe[O,O,O,X,X,B,B,B,X] = Lose
--tictactoe[O,O,O,X,O,X,X,X,B] = Lose
--tictactoe[O,O,O,X,O,X,X,B,X] = Lose
--tictactoe[O,O,O,X,O,X,B,X,X] = Lose
--tictactoe[O,O,O,X,B,X,X,X,O] = Lose
--tictactoe[O,O,O,X,B,X,X,O,X] = Lose
--tictactoe[O,O,O,X,B,X,X,B,B] = Lose
--tictactoe[O,O,O,X,B,X,O,X,X] = Lose
--tictactoe[O,O,O,X,B,X,B,X,B] = Lose
--tictactoe[O,O,O,X,B,X,B,B,X] = Lose
--tictactoe[O,O,O,X,B,B,X,X,B] = Lose
--tictactoe[O,O,O,X,B,B,X,B,X] = Lose
--tictactoe[O,O,O,X,B,B,B,X,X] = Lose
--tictactoe[O,O,O,O,X,X,X,X,B] = Lose
--tictactoe[O,O,O,O,X,X,X,B,X] = Lose
--tictactoe[O,O,O,O,X,X,B,X,X] = Lose
--tictactoe[O,O,O,B,X,X,X,X,O] = Lose
--tictactoe[O,O,O,B,X,X,X,O,X] = Lose
--tictactoe[O,O,O,B,X,X,X,B,B] = Lose
--tictactoe[O,O,O,B,X,X,O,X,X] = Lose
--tictactoe[O,O,O,B,X,X,B,X,B] = Lose
--tictactoe[O,O,O,B,X,X,B,B,X] = Lose
--tictactoe[O,O,O,B,X,B,X,X,B] = Lose
--tictactoe[O,O,O,B,X,B,X,B,X] = Lose
--tictactoe[O,O,O,B,X,B,B,X,X] = Lose
--tictactoe[O,O,O,B,B,X,X,X,B] = Lose
--tictactoe[O,O,O,B,B,X,X,B,X] = Lose
--tictactoe[O,O,O,B,B,X,B,X,X] = Lose
--tictactoe[O,O,B,X,O,X,X,X,O] = Lose
--tictactoe[O,O,B,X,O,X,X,O,X] = Lose
--tictactoe[O,O,B,O,X,X,O,X,X] = Lose
--tictactoe[O,B,X,X,O,X,X,O,O] = Lose
--tictactoe[O,B,X,X,O,X,O,X,O] = Lose
--tictactoe[O,B,X,X,O,X,B,B,O] = Lose
--tictactoe[O,B,X,X,O,O,X,X,O] = Lose
--tictactoe[O,B,X,X,O,B,X,B,O] = Lose
--tictactoe[O,B,X,X,O,B,B,X,O] = Lose
--tictactoe[O,B,X,O,X,X,O,X,O] = Lose
--tictactoe[O,B,X,O,X,X,O,B,B] = Lose
--tictactoe[O,B,X,O,X,O,O,X,X] = Lose
--tictactoe[O,B,X,O,X,B,O,X,B] = Lose
--tictactoe[O,B,X,O,X,B,O,B,X] = Lose
--tictactoe[O,B,X,O,O,X,X,X,O] = Lose
--tictactoe[O,B,X,O,B,X,O,X,B] = Lose
--tictactoe[O,B,X,O,B,B,O,X,X] = Lose
--tictactoe[O,B,X,B,O,X,X,B,O] = Lose
--tictactoe[O,B,X,B,O,X,B,X,O] = Lose
--tictactoe[O,B,X,B,O,B,X,X,O] = Lose
--tictactoe[O,B,O,X,X,O,X,X,O] = Lose
--tictactoe[O,B,O,X,O,X,X,X,O] = Lose
--tictactoe[O,B,O,X,O,X,O,X,X] = Lose
--tictactoe[O,B,O,O,X,X,O,X,X] = Lose
--tictactoe[O,B,B,X,O,X,X,B,O] = Lose
--tictactoe[O,B,B,X,O,X,B,X,O] = Lose
--tictactoe[O,B,B,X,O,B,X,X,O] = Lose
--tictactoe[O,B,B,O,X,X,O,X,B] = Lose
--tictactoe[O,B,B,O,X,X,O,B,X] = Lose
--tictactoe[O,B,B,O,X,B,O,X,X] = Lose
--tictactoe[O,B,B,O,B,X,O,X,X] = Lose
--tictactoe[O,B,B,B,O,X,X,X,O] = Lose
--tictactoe[B,X,X,X,X,O,O,O,O] = Lose
--tictactoe[B,X,X,X,O,X,O,O,O] = Lose
--tictactoe[B,X,X,X,B,B,O,O,O] = Lose
--tictactoe[B,X,X,O,X,X,O,O,O] = Lose
--tictactoe[B,X,X,O,O,O,X,X,O] = Lose
--tictactoe[B,X,X,O,O,O,X,O,X] = Lose
--tictactoe[B,X,X,O,O,O,X,B,B] = Lose
--tictactoe[B,X,X,O,O,O,O,X,X] = Lose
--tictactoe[B,X,X,O,O,O,B,X,B] = Lose
--tictactoe[B,X,X,O,O,O,B,B,X] = Lose
--tictactoe[B,X,X,B,X,B,O,O,O] = Lose
--tictactoe[B,X,X,B,B,X,O,O,O] = Lose
--tictactoe[B,X,O,X,X,O,X,O,O] = Lose
--tictactoe[B,X,O,X,X,O,B,B,O] = Lose
--tictactoe[B,X,O,X,O,X,O,X,O] = Lose
--tictactoe[B,X,O,X,O,X,O,O,X] = Lose
--tictactoe[B,X,O,X,O,X,O,B,B] = Lose
--tictactoe[B,X,O,X,O,O,X,X,O] = Lose
--tictactoe[B,X,O,X,O,O,O,X,X] = Lose
--tictactoe[B,X,O,X,O,B,O,X,B] = Lose
--tictactoe[B,X,O,X,O,B,O,B,X] = Lose
--tictactoe[B,X,O,X,B,O,X,B,O] = Lose
--tictactoe[B,X,O,X,B,O,B,X,O] = Lose
--tictactoe[B,X,O,O,O,X,O,X,X] = Lose
--tictactoe[B,X,O,B,X,O,X,B,O] = Lose
--tictactoe[B,X,O,B,O,X,O,X,B] = Lose
--tictactoe[B,X,O,B,O,X,O,B,X] = Lose
--tictactoe[B,X,O,B,O,B,O,X,X] = Lose
--tictactoe[B,X,O,B,B,O,X,X,O] = Lose
--tictactoe[B,X,B,X,X,B,O,O,O] = Lose
--tictactoe[B,X,B,X,B,X,O,O,O] = Lose
--tictactoe[B,X,B,O,O,O,X,X,B] = Lose
--tictactoe[B,X,B,O,O,O,X,B,X] = Lose
--tictactoe[B,X,B,O,O,O,B,X,X] = Lose
--tictactoe[B,X,B,B,X,X,O,O,O] = Lose
--tictactoe[B,O,X,X,O,X,X,O,O] = Lose
--tictactoe[B,O,X,X,O,X,B,O,B] = Lose
--tictactoe[B,O,X,X,O,O,X,O,X] = Lose
--tictactoe[B,O,X,X,O,B,X,O,B] = Lose
--tictactoe[B,O,X,X,O,B,B,O,X] = Lose
--tictactoe[B,O,X,B,O,X,X,O,B] = Lose
--tictactoe[B,O,X,B,O,B,X,O,X] = Lose
--tictactoe[B,O,O,X,X,O,X,X,O] = Lose
--tictactoe[B,O,O,X,O,X,X,O,X] = Lose
--tictactoe[B,O,O,X,O,X,O,X,X] = Lose
--tictactoe[B,O,B,X,O,X,X,O,B] = Lose
--tictactoe[B,O,B,X,O,X,B,O,X] = Lose
--tictactoe[B,O,B,X,O,B,X,O,X] = Lose
--tictactoe[B,O,B,B,O,X,X,O,X] = Lose
--tictactoe[B,B,X,X,X,B,O,O,O] = Lose
--tictactoe[B,B,X,X,B,X,O,O,O] = Lose
--tictactoe[B,B,X,O,O,O,X,X,B] = Lose
--tictactoe[B,B,X,O,O,O,X,B,X] = Lose
--tictactoe[B,B,X,O,O,O,B,X,X] = Lose
--tictactoe[B,B,X,B,X,X,O,O,O] = Lose
--tictactoe[B,B,O,X,X,O,X,B,O] = Lose
--tictactoe[B,B,O,X,X,O,B,X,O] = Lose
--tictactoe[B,B,O,X,O,X,O,X,B] = Lose
--tictactoe[B,B,O,X,O,X,O,B,X] = Lose
--tictactoe[B,B,O,X,O,B,O,X,X] = Lose
--tictactoe[B,B,O,X,B,O,X,X,O] = Lose
--tictactoe[B,B,O,B,X,O,X,X,O] = Lose
--tictactoe[B,B,O,B,O,X,O,X,X] = Lose
--tictactoe[X,X,O,O,X,X,X,O,O] = Lose
--tictactoe[X,X,O,O,O,X,X,X,O] = Lose
--tictactoe[X,X,O,O,O,X,X,O,X] = Lose
--tictactoe[X,O,X,X,X,O,O,X,O] = Lose
--tictactoe[X,O,X,X,O,X,O,X,O] = Lose
--tictactoe[X,O,X,X,O,O,O,X,X] = Lose
--tictactoe[X,O,X,O,X,X,O,X,O] = Lose
--tictactoe[X,O,X,O,O,X,X,X,O] = Lose
--tictactoe[X,O,O,O,X,X,X,X,O] = Lose
--tictactoe[O,X,X,X,X,O,O,O,X] = Lose
--tictactoe[O,X,X,X,O,O,X,O,X] = Lose
--tictactoe[O,X,X,X,O,O,O,X,X] = Lose
--tictactoe[O,X,O,X,X,O,X,O,X] = Lose
--tictactoe[O,X,O,X,O,X,X,O,X] = Lose
--tictactoe[O,X,O,O,X,X,X,O,X] = Lose
--tictactoe[O,O,X,X,X,O,O,X,X] = Lose
--   

pow2 :: Nat -> Nat
pow2 Z = S Z
pow2 (S Z) = S(S Z)
pow2 (S(S Z)) = S(S(S(S Z)))
pow2 (S(S(S Z))) = S(S(S(S(S(S(S(S Z)))))))
--pow2 (S(S(S(S Z)))) = S(S(S(S(S(S(S(S(S(S(S(S(S(S(S(S Z)))))))))))))))

mult :: Nat -> Nat -> Nat
mult Z         Z         = Z
mult Z       (S Z)       = Z
mult Z     (S (S Z))     = Z
mult Z   (S (S (S Z)))   = Z
mult (S Z)       Z       = Z
mult (S Z)     (S Z)     = S Z
mult (S Z)   (S (S Z))   = S (S Z)
mult (S Z) (S (S (S Z))) = S (S (S Z))
mult (S (S Z))     Z     = Z
mult (S (S Z))   (S Z)   = S (S Z)
mult (S (S Z)) (S (S Z)) = S (S (S (S Z)))
mult (S (S (S Z)))   Z   = Z
mult (S (S (S Z))) (S Z) = S (S (S Z))
