Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
module IAR
where
import List
import STAL (display)
sumOdds' :: Integer -> Integer
sumOdds' n = sum [ 2*k - 1 | k <- [1..n] ]
sumOdds :: Integer -> Integer
sumOdds n = n^2
sumEvens' :: Integer -> Integer
sumEvens' n = sum [ 2*k | k <- [1..n] ]
sumEvens :: Integer -> Integer
sumEvens n = n * (n+1)
sumInts :: Integer -> Integer
sumInts n = (n * (n+1)) `div` 2
sumSquares' :: Integer -> Integer
sumSquares' n = sum [ k^2 | k <- [1..n] ]
sumSquares :: Integer -> Integer
sumSquares n = (n*(n+1)*(2*n+1)) `div` 6
sumCubes' :: Integer -> Integer
sumCubes' n = sum [ k^3 | k <- [1..n] ]
sumCubes :: Integer -> Integer
sumCubes n = (n*(n+1) `div` 2)^2
data Natural = Z | S Natural
deriving (Eq, Show)
plus m Z = m
plus m (S n) = S (plus m n)
m `mult` Z = Z
m `mult` (S n) = (m `mult` n) `plus` m
expn m Z = (S Z)
expn m (S n) = (expn m n) `mult` m
leq Z _ = True
leq (S _) Z = False
leq (S m) (S n) = leq m n
geq m n = leq n m
gt m n = not (leq m n)
lt m n = gt n m
foldn :: (a -> a) -> a -> Natural -> a
foldn h c Z = c
foldn h c (S n) = h (foldn h c n)
exclaim :: Natural -> String
exclaim = foldn ('!':) []
bittest :: [Int] -> Bool
bittest [] = True
bittest [0] = True
bittest (1:xs) = bittest xs
bittest (0:1:xs) = bittest xs
bittest _ = False
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
fib' n = fib2 0 1 n where
fib2 a b 0 = a
fib2 a b n = fib2 b (a+b) (n-1)
data BinTree = L | N BinTree BinTree deriving Show
makeBinTree :: Integer -> BinTree
makeBinTree 0 = L
makeBinTree (n + 1) = N (makeBinTree n) (makeBinTree n)
count :: BinTree -> Integer
count L = 1
count (N t1 t2) = 1 + count t1 + count t2
depth :: BinTree -> Integer
depth L = 0
depth (N t1 t2) = (max (depth t1) (depth t2)) + 1
balanced :: BinTree -> Bool
balanced L = True
balanced (N t1 t2) = (balanced t1)
&& (balanced t2)
&& depth t1 == depth t2
data Tree = Lf | Nd Int Tree Tree deriving Show
data Tr a = Nil | T a (Tr a) (Tr a) deriving (Eq,Show)
type Dict = Tr (String,String)
split :: [a] -> ([a],a,[a])
split xs = (ys1,y,ys2)
where
ys1 = take n xs
(y:ys2) = drop n xs
n = length xs `div` 2
data LeafTree a = Leaf a
| Node (LeafTree a) (LeafTree a) deriving Show
ltree :: LeafTree String
ltree = Node
(Leaf "I")
(Node
(Leaf "love")
(Leaf "you"))
data Rose a = Bud a | Br [Rose a] deriving (Eq,Show)
rose = Br [Bud 1, Br [Bud 2, Bud 3, Br [Bud 4, Bud 5, Bud 6]]]
len [] = 0
len (x:xs) = 1 + len xs
cat :: [a] -> [a] -> [a]
cat [] ys = ys
cat (x:xs) ys = x : (cat xs ys)
add = foldr plus Z
mlt = foldr mult (S Z)
ln :: [a] -> Natural
ln = foldr (\ _ n -> S n) Z
rev = foldl (\ xs x -> x:xs) []
rev' = foldr (\ x xs -> xs ++ [x]) []
data Peg = A | B | C
type Tower = ([Int], [Int], [Int])
move :: Peg -> Peg -> Tower -> Tower
move A B (x:xs,ys,zs) = (xs,x:ys,zs)
move B A (xs,y:ys,zs) = (y:xs,ys,zs)
move A C (x:xs,ys,zs) = (xs,ys,x:zs)
move C A (xs,ys,z:zs) = (z:xs,ys,zs)
move B C (xs,y:ys,zs) = (xs,ys,y:zs)
move C B (xs,ys,z:zs) = (xs,z:ys,zs)
transfer :: Peg -> Peg -> Peg -> Int -> Tower -> [Tower]
transfer _ _ _ 0 tower = [tower]
transfer p q r n tower = transfer p r q (n-1) tower
++
transfer r q p (n-1) (move p q tower')
where tower' = last (transfer p r q (n-1) tower)
hanoi :: Int -> [Tower]
hanoi n = transfer A C B n ([1..n],[],[])
check :: Int -> Tower -> Bool
check 0 t = t == ([],[],[])
check n (xs,ys,zs)
| xs /= [] && last xs == n = check (n-1) (init xs, zs, ys)
| zs /= [] && last zs == n = check (n-1) (ys, xs, init zs)
| otherwise = False
maxT :: Tower -> Int
maxT (xs, ys, zs) = foldr max 0 (xs ++ ys ++ zs)
checkT :: Tower -> Bool
checkT t = check (maxT t) t
parity :: Tower -> (Int,Int,Int)
parity (xs,ys,zs) = par (xs ++ [n+1], ys ++ [n],zs ++ [n+1])
where
n = maxT (xs, ys, zs)
par (x:xs,y:ys,z:zs) = (mod x 2, mod y 2, mod z 2)
target :: Tower -> Peg
target t@(xs,ys,zs) | parity t == (0,1,1) = A
| parity t == (1,0,1) = B
| parity t == (1,1,0) = C
move1 :: Tower -> Tower
move1 t@(1:_,ys,zs) = move A (target t) t
move1 t@(xs,1:_,zs) = move B (target t) t
move1 t@(xs,ys,1:_) = move C (target t) t
move2 :: Tower -> Tower
move2 t@(1:xs,[],zs) = move C B t
move2 t@(1:xs,ys,[]) = move B C t
move2 t@(1:xs,ys,zs) = if ys < zs then move B C t else move C B t
move2 t@([],1:ys,zs) = move C A t
move2 t@(xs,1:ys,[]) = move A C t
move2 t@(xs,1:ys,zs) = if xs < zs then move A C t else move C A t
move2 t@([],ys,1:zs) = move B A t
move2 t@(xs,[],1:zs) = move A B t
move2 t@(xs,ys,1:zs) = if xs < ys then move A B t else move B A t
done :: Tower -> Bool
done ([],[], _) = True
done (xs,ys,zs) = False
transfer1, transfer2 :: Tower -> [Tower]
transfer1 t = t : transfer2 (move1 t)
transfer2 t = if done t then [t] else t : transfer1 (move2 t)
hanoi' :: Int -> [Tower]
hanoi' n = transfer1 ([1..n],[],[])
zazen :: [Tower]
zazen = hanoi' 64
hanoiCount :: Int -> Integer -> Tower
hanoiCount n k | k < 0 = error "argument negative"
| k > 2^n - 1 = error "argument not in range"
| k == 0 = ([1..n],[],[])
| k == 2^n - 1 = ([],[],[1..n])
| k < 2^(n-1) = (xs ++ [n], zs, ys)
| k >= 2^(n-1) = (ys', xs', zs' ++ [n])
where
(xs,ys,zs) = hanoiCount (n-1) k
(xs',ys',zs') = hanoiCount (n-1) (k - 2^(n-1))
toTower :: Integer -> Tower
toTower n = hanoiCount k m
where
n' = fromInteger (n+1)
k = truncate (logBase 2 n')
m = truncate (n' - 2^k)
data Form = P Int | Conj Form Form | Disj Form Form | Neg Form
instance Show Form where
show (P i) = 'P':show i
show (Conj f1 f2) = "(" ++ show f1 ++ " & " ++ show f2 ++ ")"
show (Disj f1 f2) = "(" ++ show f1 ++ " v " ++ show f2 ++ ")"
show (Neg f) = "~" ++ show f
subforms :: Form -> [Form]
subforms (P n) = [(P n)]
subforms (Conj f1 f2) = (Conj f1 f2):(subforms f1 ++ subforms f2)
subforms (Disj f1 f2) = (Disj f1 f2):(subforms f1 ++ subforms f2)
subforms (Neg f) = (Neg f):(subforms f)
ccount :: Form -> Int
ccount (P n) = 0
ccount (Conj f1 f2) = 1 + (ccount f1) + (ccount f2)
ccount (Disj f1 f2) = 1 + (ccount f1) + (ccount f2)
ccount (Neg f) = 1 + (ccount f)
acount :: Form -> Int
acount (P n) = 1
acount (Conj f1 f2) = (acount f1) + (acount f2)
acount (Disj f1 f2) = (acount f1) + (acount f2)
acount (Neg f) = acount f