Overloading Haskell numbers, part 1, symbolic expressions.
Haskell's overloaded numerical classes can be (ab)used to do some symbolic maths. This is in no way a new discovery, but I thought I'd write a few lines about it anyway since I've been playing with it the last few days.
First we need a data type to represent expressions. We want constants, variables, and function applications. But we don't want to fix the type of the constants, so that will be a parameter to the type.
data Sym a = Con a | Var String | App String [Sym a]
deriving (Eq, Show)
And we also take the opportunity to derive Eq and Show.
Now we can actually claim that the type Sym N is a number if N is a number. Let do it:
instance (Num a) => Num (Sym a) where
x + y = App "+" [x, y]
x - y = App "-" [x, y]
x * y = App "*" [x, y]
negate x = App "negate" [x]
abs x = App "abs" [x]
signum x = App "signum" [x]
fromInteger x = Con (fromInteger x)
A small interactive session shows that we are on the right track.
Sym1> let x = Var "x" Sym1> x*x + 5 App "+" [App "*" [Var "x",Var "x"],Con 5] Sym1> x*x*x App "*" [App "*" [Var "x",Var "x"],Var "x"] Sym1> 2 + 3 :: Sym Int App "+" [Con 2,Con 3]We can type in normal looking expressions, but when they are printed the Show instance is used so we get to see the raw syntax tree. That has its uses, but it gets old quickly. We want a pretty printer. To get the precedences right we need to define showsPrec and pass it the right arguments. It's a little tedious, but nothing strange.
instance (Show a) => Show (Sym a) where
showsPrec p (Con c) = showsPrec p c
showsPrec _ (Var s) = showString s
showsPrec p (App op@(c:_) [x, y]) | not (isAlpha c) =
showParen (p>q) (showsPrec ql x . showString op . showsPrec qr y)
where (ql, q, qr) = fromMaybe (9,9,9) $ lookup op [
("**", (9,8,8)),
("/", (7,7,8)),
("*", (7,7,8)),
("+", (6,6,7)),
("-", (6,6,7))]
showsPrec p (App "negate" [x]) =
showParen (p>=6) (showString "-" . showsPrec 7 x)
showsPrec p (App f xs) =
showParen (p>10) (foldl (.) (showString f)
(map (\ x -> showChar ' ' . showsPrec 11 x) xs))
Let's try the same examples again:
Sym2> let x = var "x" Sym2> x*x + 5 x*x+5 Sym2> x*x*x x*x*x Sym2> 2 + 3 :: Sym Int 2+3Look we can type expressions and get them back again! The instance Num (Sym a) isn't too bad, the only fishy thing about it is the Eq superclass that is required for Num. We have Eq for Sym, but it doesn't really behave like it should. E.g., the expression 'x==1' would come out as False since the syntax trees are not equal. But this isn't really what we would like, ideally (==) would also turn into something symbol, but that is impossible with the standard Prelude. Let's make some more instances. A few of these definitions are just there to appease the Haskell numerical hierarchy and supply some operations it need.
instance (Fractional a) => Fractional (Sym a) where
x / y = App "/" [x, y]
fromRational x = Con (fromRational x)
instance (Real a) => Real (Sym a) where
toRational (Con c) = toRational c
instance (RealFrac a) => RealFrac (Sym a) where
properFraction (Con c) = (i, Con c') where (i, c') = properFraction c
instance (Floating a) => Floating (Sym a) where
pi = App "pi" []
exp = app1 "exp"
sqrt = app1 "sqrt"
log = app1 "log"
(**) = app2 "**"
logBase = app2 "logBase"
sin = app1 "sin"
tan = app1 "tan"
cos = app1 "cos"
asin = app1 "asin"
atan = app1 "atan"
acos = app1 "acos"
sinh = app1 "sinh"
tanh = app1 "tanh"
cosh = app1 "cosh"
asinh = app1 "asinh"
atanh = app1 "atanh"
acosh = app1 "acosh"
instance (RealFloat a) => RealFloat (Sym a) where
exponent _ = 0
scaleFloat 0 x = x
atan2 = app2 "atan2"
app1 :: String -> Sym a -> Sym a
app1 f x = App f [x]
app2 :: String -> Sym a -> Sym a -> Sym a
app2 f x y = App f [x, y]
Let's put this code to the test by bringing the Complex number module into scope.
Sym3> :m +Data.Complex Sym3 Data.Complex> let x=Var "x"; y=Var "y" Sym3 Data.Complex> sin (x:+y) sin x*cosh y :+ cos x*sinh yAnd by that last expression we have recovered the definition of complex sin as it is given in the Data.Complex module. Let's try another one.
Sym3 Data.Complex> asinh(x:+y) log (sqrt ((x+sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(0.0+(x*y+y*x))*(0.0+ (x*y+y*x)))+abs (1.0+(x*x-y*y)))/2.0))*(x+sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x -y*y))+(0.0+(x*y+y*x))*(0.0+(x*y+y*x)))+abs (1.0+(x*x-y*y)))/2.0))+(y+abs (0.0+ (x*y+y*x))/(sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(0.0+(x*y+y*x))*(0.0+ (x*y+y*x)))+abs (1.0+(x*x-y*y)))/2.0)*2.0))*(y+abs (0.0+(x*y+y*x))/(sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(0.0+(x*y+y*x))*(0.0+(x*y+y*x)))+abs (1.0+(x*x -y*y)))/2.0)*2.0)))) :+ atan2 (y+abs (0.0+(x*y+y*x))/(sqrt ((sqrt ((1.0+(x*x-y*y)) *(1.0+(x*x-y*y))+(0.0+(x*y+y*x))*(0.0+(x*y+y*x)))+abs (1.0+(x*x-y*y)))/2.0)*2.0)) (x+sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(0.0+(x*y+y*x))*(0.0+(x*y+y*x)))+ abs (1.0+(x*x-y*y)))/2.0))Hmmmm, that might be right, but it's rather ugly. There's also a lot of '0.0+...' in that expression. We need something that can simplify expressions. It would also be nice if all constant expressions were evaluated instead of stored. To achieve this we are going to change the representation a little. The App constructor will store the real function used to work on constants as well as the name of it. And while we are at it, we'll get rid of the Var constructor. We might as well use App with an empty argument list. Furthermore, since this is starting to look useful, we'll give the module a proper name and export only the interface we want to be visible. We will hide the details of the Sym type and just export some accessor functions. The simplification happens in the binOp and unOp functions. I have just put some algebraic laws there (assuming the underlying numeric type is a field). The list of rewrites performed by these functions is far from complete. It's just a few that I found useful. Note how the code in binOp pattern matches on constants like 0, 1, and -1 directly. This actually works because of the semantics of Haskell pattern matching against numeric literals. Also note that the constraint on `a' is just Num, even though we do some simplifications with (/) which belongs in Fractional. The instance declarations have been extended somewhat so that constant expressions in the Sym type will behave as the corresponding expressions in the underlying type. A small final run
*Data.Number.Symbolic Data.Complex> 1+x+2 3+x *Data.Number.Symbolic Data.Complex> 1+x*(y-y)-1 0 *Data.Number.Symbolic Data.Complex> sin(x:+1e-10) sin x :+ 1.0e-10*cos x *Data.Number.Symbolic Data.Complex> asinh(x:+y) log (sqrt ((x+sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(x*y+y*x)*(x*y+y*x))+abs (1.0+(x*x-y*y)))/2.0))*(x+sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(x*y+y*x)* (x*y+y*x))+abs (1.0+(x*x-y*y)))/2.0))+(y+abs (x*y+y*x)/(2.0*sqrt ((sqrt ((1.0+(x*x -y*y))*(1.0+(x*x-y*y))+(x*y+y*x)*(x*y+y*x))+abs (1.0+(x*x-y*y)))/2.0)))*(y+abs (x*y +y*x)/(2.0*sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(x*y+y*x)*(x*y+y*x))+abs (1.0+(x*x-y*y)))/2.0))))) :+ atan2 (y+abs (x*y+y*x)/(2.0*sqrt ((sqrt ((1.0+(x*x -y*y))*(1.0+(x*x-y*y))+(x*y+y*x)*(x*y+y*x))+abs (1.0+(x*x-y*y)))/2.0))) (x+sqrt ((sqrt ((1.0+(x*x-y*y))*(1.0+(x*x-y*y))+(x*y+y*x)*(x*y+y*x))+abs (1.0+(x*x-y*y)))/2.0))As the final example shows, there is still a lot to do. Also note how the underlying numeric type has defaulted to Double, and we have a loss of precision in the second to last example. But an implementation of real numbers instead of floating point numbers will have to wait until a later posting.
module Data.Number.Symbolic(Sym, var, con, subst, unSym) where
import Data.Char(isAlpha)
import Data.Maybe(fromMaybe)
import Debug.Trace
data Sym a = Con a | App String ([a]->a) [Sym a]
instance (Eq a) => Eq (Sym a) where
Con x == Con x' = x == x'
App f _ xs == App f' _ xs' = (f, xs) == (f', xs')
_ == _ = False
instance (Ord a) => Ord (Sym a) where
Con x `compare` Con x' = x `compare` x'
Con _ `compare` App _ _ _ = LT
App _ _ _ `compare` Con _ = GT
App f _ xs `compare` App f' _ xs' = (f, xs) `compare` (f', xs')
var :: String -> Sym a
var s = App s undefined []
con :: a -> Sym a
con = Con
subst :: (Num a) => String -> Sym a -> Sym a -> Sym a
subst _ _ e@(Con _) = e
subst x v e@(App x' _ []) | x == x' = v
| otherwise = e
subst x v (App s f es) =
case map (subst x v) es of
[e] -> unOp (\ x -> f [x]) s e
[e1,e2] -> binOp (\ x y -> f [x,y]) e1 s e2
es' -> App s f es'
unSym :: (Show a) => Sym a -> a
unSym (Con c) = c
unSym e = error $ "unSym called: " ++ show e
instance (Show a) => Show (Sym a) where
showsPrec p (Con c) = showsPrec p c
showsPrec _ (App s _ []) = showString s
showsPrec p (App op@(c:_) _ [x, y]) | not (isAlpha c) =
showParen (p>q) (showsPrec ql x . showString op . showsPrec qr y)
where (ql, q, qr) = fromMaybe (9,9,9) $ lookup op [
("**", (9,8,8)),
("/", (7,7,8)),
("*", (7,7,8)),
("+", (6,6,7)),
("-", (6,6,7))]
showsPrec p (App "negate" _ [x]) =
showParen (p>=6) (showString "-" . showsPrec 7 x)
showsPrec p (App f _ xs) =
showParen (p>10) (foldl (.) (showString f) (map (\ x -> showChar ' ' . showsPrec 11 x) xs))
instance (Num a) => Num (Sym a) where
x + y = binOp (+) x "+" y
x - y = binOp (-) x "-" y
x * y = binOp (*) x "*" y
negate x = unOp negate "negate" x
abs x = unOp abs "abs" x
signum x = unOp signum "signum" x
fromInteger x = Con (fromInteger x)
instance (Fractional a) => Fractional (Sym a) where
x / y = binOp (/) x "/" y
fromRational x = Con (fromRational x)
-- Assume the numbers are a field and simplify a little
binOp :: (Num a) => (a->a->a) -> Sym a -> String -> Sym a -> Sym a
binOp f (Con x) _ (Con y) = Con (f x y)
binOp _ x "+" 0 = x
binOp _ 0 "+" x = x
binOp _ x "+" (App "+" _ [y, z]) = (x + y) + z
binOp _ x "+" y | isCon y && not (isCon x) = y + x
binOp _ x "+" (App "negate" _ [y]) = x - y
binOp _ x "-" 0 = x
binOp _ x "-" x' | x == x' = 0
binOp _ x "-" (Con y) | not (isCon x) = Con (-y) + x
binOp _ _ "*" 0 = 0
binOp _ x "*" 1 = x
binOp _ x "*" (-1) = -x
binOp _ 0 "*" _ = 0
binOp _ 1 "*" x = x
binOp _ (-1) "*" x = -x
binOp _ x "*" (App "*" _ [y, z]) = (x * y) * z
binOp _ x "*" y | isCon y && not (isCon x) = y * x
binOp _ x "*" (App "/" f [y, z]) = App "/" f [x*y, z]
{-
binOp _ x "*" (App "+" _ [y, z]) = x*y + x*z
binOp _ (App "+" _ [y, z]) "*" x = y*x + z*x
-}
binOp _ x "/" 1 = x
binOp _ x "/" (-1) = -x
binOp _ x "/" x' | x == x' = 1
binOp _ x "/" (App "/" f [y, z]) = App "/" f [x*z, y]
binOp f x op y = App op (\ [a,b] -> f a b) [x, y]
unOp :: (Num a) => (a->a) -> String -> Sym a -> Sym a
unOp f _ (Con c) = Con (f c)
unOp _ "negate" (App "negate" _ [x]) = x
unOp _ "abs" e@(App "abs" _ _) = e
unOp _ "signum" e@(App "signum" _ _) = e
unOp f op x = App op (\ [a] -> f a) [x]
isCon :: Sym a -> Bool
isCon (Con _) = True
isCon _ = False
instance (Real a) => Real (Sym a) where
toRational (Con c) = toRational c
instance (RealFrac a) => RealFrac (Sym a) where
properFraction (Con c) = (i, Con c') where (i, c') = properFraction c
instance (Floating a) => Floating (Sym a) where
pi = var "pi"
exp = unOp exp "exp"
sqrt = unOp sqrt "sqrt"
log = unOp log "log"
x ** y = binOp (**) x "**" y
logBase x y = binOp logBase x "logBase" y
sin = unOp sin "sin"
tan = unOp tan "tan"
cos = unOp cos "cos"
asin = unOp asin "asin"
atan = unOp atan "atan"
acos = unOp acos "acos"
sinh = unOp sinh "sinh"
tanh = unOp tanh "tanh"
cosh = unOp cosh "cosh"
asinh = unOp asinh "asinh"
atanh = unOp atanh "atanh"
acosh = unOp acosh "acosh"
instance (RealFloat a) => RealFloat (Sym a) where
floatRadix = floatRadix . unSym
floatDigits = floatDigits . unSym
floatRange = floatRange . unSym
decodeFloat (Con c) = decodeFloat c
encodeFloat m e = Con (encodeFloat m e)
exponent (Con c) = exponent c
exponent _ = 0
significand (Con c) = Con (significand c)
scaleFloat k (Con c) = Con (scaleFloat k c)
scaleFloat _ x = x
isNaN (Con c) = isNaN c
isInfinite (Con c) = isInfinite c
isDenormalized (Con c) = isDenormalized c
isNegativeZero (Con c) = isNegativeZero c
isIEEE = isIEEE . unSym
atan2 x y = binOp atan2 x "atan2" y
Labels: Haskell, overloading

32 Comments:
Nice!
I think Haskell would be a great language for implementing a full symbolic algebra system. I'd love to see a nice strongly typed algebra system like Aldor with the laziness of Haskell.
Very cool!
I'd like to see an expression type that statically conveyed the fact that it was simplified (to some extent).
Why was there no follow on bankruptcy then? The bailout of AIG FP went to (wow power leveling) hedge funds that bound credit swaps on Lehman failing or others betting on rating (wow power leveling) declines. AIG has drained over 100 billion from the government. Which had to go to (wow power leveling) those who bet on failures and downgrades. Many of whom (power leveling)were hedge funds. I-banks that had offsetting swaps needed the money from the AIG bailout or they would have been caught. Its an (wow powerleveling) insiders game and it takes just a little bit too much time for most people to think (wow gold) through where the AIG 100 billion bailout money went to, hedge funds and players, many of whom hire from the top ranks of DOJ, Fed, Treasury, etc. ZHANG XIAO CHEN
mens clothing men's sweate, cheap columbia jackets, lacoste sweater, ralph lauren polo shirts,ski clothing. Free Shipping, PayPal Payment. Enjoy your shopping experience on mensclothingstore.us
nike tnEnter the necessary language
translation, up to 200 bytes winter, moves frequently in Chinanike chaussures showing that the deep strategy of the Chinese market. Harvard Business School, tn chaussures according to the relevant survey data show that in recent years the Chinese market three brands, Adidas, Li Ning market share at 21 percent, respectively,
puma shoes
chaussures pumacheap polos
polo shirts
ralph lauren polo shirtssport shoes
ugg boots
mp4
trade chinalacoste polo shirts
chaussure puma femmewedding dressestennis racket
cheap handbags
HAIR STRAIGHTENERS
Cheap Brand Jeans ShopMen Jeans - True Religion Jeans, Women JeansGUCCI Jeans, Levi's Jeans, D&G Jeans, RED MONKEY Jeans, Cheap JeansArmani Jeans, Diesel Jeans, Ed hardy Jeans, Evisu Jeans, Jack&Jones Jeans...
There are ed hardy shirts
,pretty ed hardy shirt for men,
ed hardy womens in the ed hardy online store
designed by ed hardy ,
many cheap ed hardy shirt ,glasses,caps,trouers ed hardy shirts on sale ,
You can go to edhardyshirts.com to have a look ,you may find one of ed hardy clothing fit for you
Top qualitymen's jacket,
These cheap jacket are on sale now,you can find
north face jackets inmage on our web
Do you wannaghd hair straighteners for you own , we have many
cheap ghd hair straightenersin style and great,you can choose one from these
hair straighteners
Authentic chaussure puma
chaussure sport
And chaussure nike shoes
Come here to have a look of our Wholesale Jeans
Many fashionMens Jeans ,eye-catching
Womens Jeans ,and special out standing
Blue Jeans ,you can spend less money on our
Discount Jeans but gain really fine jeans, absolutely a great bargain.
www.crazypurchase.com
China Wholesale
wholesale from china
buy products wholesale
China Wholesalers
http://weddingdressseason.com
And chaussure nike shoes
Come here to have a look of our Wholesale Jeans
Many fashionMens Jeans ,eye-catching
Womens Jeans ,and special out standing
Blue Jeans ,you can spend less money on our
Discount Jeans but gain really fine jeans, absolutely a great bargain.
www.crazypurchase.com
China Wholesale
wholesale from china
buy products wholesale
China Wholesalers
http://weddingdressseason.com
There are ed hardy shirts
,pretty ed hardy shirt for men,
ed hardy womens in the ed hardy online store
designed by ed hardy ,
many cheap ed hardy shirt ,glasses,caps,trouers ed hardy shirts on sale ,
You can go to edhardyshirts.com to have a look ,you may find one of ed hardy clothing fit for you
Top qualitymen's jacket,
These cheap jacket are on sale now,you can find
north face jackets inmage on our web
Do you wannaghd hair straighteners for you own , we have many
cheap ghd hair straightenersin style and great,you can choose one from these
hair straighteners
Authentic chaussure puma
chaussure sport
Thank you so much!!polo shirt men'ssweate,cheap polo shirts cheap columbia jackets, lacoste sweater, ralph lauren polo shirts,ski clothing. Free Shipping, PayPal Payment. Enjoy your shopping experience on mensclothingus.com.We have mens polo shirts.
Awesome!!!Best wishes for you !!wholesale polo shirts is the father of the summer should be prepared to most commonly used item, it has both style and shape of polo clothing, and vest with a random function, so that in the short-sleeved apply to both on many occasions, the pink and black color men's polo shirts brought into effect, lightweight cotton, linen texture to demonstrate masculine temperament and sense of fashion exhaustively. polo shirts for sale
Wonderful!!You can find the father who desire fashionable, intellectual cheap polos simultaneously, you can find a psychologist to study the most harmonious of families should be pink mens clothing, so do not want to take the mature route for the father, buy cheap polos, the learn from such a walk in between the formal and casual styling, refined style to create a sense of mild authority.
Perfect!!You are a outstanding person!Have you ever wore chaussures puma, puma CAT,Puma shoes store gives some preview of puma speed cat,puma basket, puma speed, puma speed and other puma shoes. These puma sport items are at store recently and available for anyone.
Do not mean bad.Thank you so much!Men's polo shirts was the shirt of choice for diverse groups of teenagers.Brightly coloured polo shirts can make you look like a Day-glo dirigible.
Wonderful!You can find the father who desire fashionable eg,uggs fashion,you can enjoy uggs online here, intellectual polo shirt simultaneously.
fantastic!God bless you!Meanwhile,you can visit my China Wholesale,we have the highest quality but the lowest price fashion products wholesale from China.Here are the most popular China Wholesale products for all of you.Also the polo clothing is a great choice for you.
God bless you!I really agree with your opinions.Also,there are some new fashion things here,gillette razor blades.gillette mach3 razor bladesfor men.As for ladies,gillette venus razor blades must the best gift for you in summer,gillette fusion blades are all the best choice for you.
cheap hair straighteners
chi hair straightener
chi flat iron
new polo shirts
cheap Lacoste polo shirts
cheap Lacoste polo shirts
cheap handbags
cheap bags
puma chaussures
chaussures puma
chaussure puma
Men's North Face
Women's North Face
hair straighteners
sexy lingerie store
cheap ugg boots
tattoo wholesale
men's clothing
women's clothing
2009 nike shoes
new nike shoes
Women's max
Men's max 93
nike shox
Nike air force
Nike air max 2003
nike air max ltd
nike air max tn
Nike air rift
Nike air Yeezy
nike airmax
Nike air max 90
Nike air max 97
nike birds nest shoes
nike dunk
nike RT1 shoes
nike SB
nike shox shoes
Nike shox OZ shoes
Nike shox R2 shoes
Nike shox R3 shoes
Nike shox R4 shoes
Nike shox R5 shoes
Nike shox TL3
nike trainers lovers
tennis rackets
Wilson tennis rackets
HEAD tennis rackets
Babolat tennis rackets
視訊|影音視訊聊天室|視訊聊天室|視訊交友|視訊聊天|視訊美女|視訊辣妹|免費視訊聊天室
自慰器|自慰器
網頁設計|網頁設計公司|最新消息|訪客留言|網站導覽
免費視訊聊天|辣妹視訊|視訊交友網|美女視訊|視訊交友|視訊交友90739|成人聊天室|視訊聊天室|視訊聊天|視訊聊天室|情色視訊|情人視訊網|視訊美女
一葉情貼圖片區|免費視訊聊天室|免費視訊|ut聊天室|聊天室|豆豆聊天室|尋夢園聊天室|聊天室尋夢園|影音視訊聊天室||
1
http://www.12hot.com
1)
polo shirts
polo shirts supplies.wholesale polo shirts with great price. 12hot.com offers lot of 10 polo shirts and lot of 20 polo shirts. 12hot.com offers classic fit polo shirts.polo clothing All our shirts made in original factory.
2)
spyder jackets
12hot.com offers spyder jackets :
MENS' Spyder white&red REMOVEABLE CAP and SLEEVES SKI SUIT JACK
MEN'S SPYDER GRAY REMOVEABLE CAP SLEEVES SKI SUIT
MEN'S SPYDER BLACK REMOVEABLE CAP SLEEVES SKI SUIT JACKET
MEN'S SPYDER BLUE REMOVEABLE CAP SLEEVES SKI SUIT Jacket
MEN'S SPYDER WHITE REMOVABLE CAP&SLEEVES SKI SUIT Jacket
MEN'S SPYDER RED NEW STYLE SKI SUIT Jacket
3)
north face jackets
north face jackets,north face jacket. Here is a black The North Face Women's mountain jacket .
4)
Women's Sky Blue The North Face Original Twinset Parka/Jacket
This is a style of sky blue The Women's North Face outdoor and mountaineering apparel .The North Face offers advanced fabrics and technologies for all-weather performance and protection during demanding outdoor action. The design adds darts at the elbow, allowing for easier arm movement and a full range of motion. The internal wind skirt effectively keeps snow and wind out.
100% Omni-Tech!
100% SATISFIDE YOU!
2
http://www.polocart.com
1)
polo shirts
new polo shirts,polo shirts,polo shirt,Ralph Lauren polo shirts,polos .Paypal payment. we have best price.Welcome to wholesale Lacoste polo shirts
3
http://www.polosales.com/
1)
cheap polo shirts
Buy cheap polo shirts,polo shirt,lacoste polo shirts,ralph lauren polo shirts,wholesale polo shirts
4
http://www.superpolos.com/
1)
Lacoste Polo Shirts
Retail and Wholesale Lacoste Polo Shirts Cheap Lacoste Polo Shirts Polo Shirts Cheap Polo Shirts at cheap price with PayPal free shipping
6
http://www.bootsboots.co.uk
ugg boots
UGG short Boots
UGG 5245 tall Boots
UGG 5325 classic Boots
UGG 5359 womens Boots
UGG 5815 tall Boots
UGG 5819 womens Boots
UGG 5825 short Boots
7
http://www.chiflatiron.us
chi flat iron
chi flat iron
InStyler rotating hot iron with a heat resistant carrying bag
New BLUE CAMO CHI Camo Colletion 1" flat iron
New CHI Turbo 2 Big Flat Iron
New GREEN CAMO CHI Camo Colletion 1" flat iron
Black CHI Ceramic Flat Iron Original Farouk Hair Straightener
8
http://www.thehairstraighteners.com
CHI hair straightener
Very Cheap! www.thehairstraighteners.com is a professional supplier to supply CHI hair straightener Welcome to wholesale hair straighteners at www.thehairstraighteners.com.
CHI Straightener Blue Camo
CHI Straightener Green Camo
CHI Straightener Pink Camo
Original CHI Hair Straightener
CHI Turbo Big 2-Inch Hair Straightener
9)
http://www.jacketscart.com
jacketscart
spyder jackets
new discount spyder women's insulated ski jacket in orange
2009 new women's syder jackets insulated in white and red
women's discount spyder ski jacket insulated in red
women's cheap spyder ski suit insulated in pink
brand new men's spyder ski jackets in gray
Perfect!! You are a outstanding person! Do you want to wear stunning discount wedding dresses and join the party wearing beautiful cheap prom dresses?? Or you want all people's eyes can't move from you? The evening formal dresses are the best gift for you!
Fantastic! God bless you! Meanwhile, we have the highest quality but the lowest price fashion cheap wedding dresses. Here are the most popular designer wedding dresses and lace wedding dresses for all of you. Also the cheap evening dresses is a great choice for you. Let you dream come ture!!
Do not mean bad.Thank you so much! I just want to show some fashion wedding dress to all of you. I like wedding dresses, because wedding for a girl, it is the most special day in her life. Do you want to have the beautiful wedding dresses in perfect day??
Best wishes for you! May be you are interested in party cocktail dresses, and you may need cheap bridesmaid dress for you special Occasions. We can provide cheap cocktail dresses, cheap flower girl dresses even the plus size wedding dresses. You can choose that you like!
婚活 悩み
カップリングパーティー
ウェディングドレス
募金
税理士
インプラント
カラコン
ボイストレーニング
債務整理
民事再生
自己破産
過払い金
任意整理
リサイクルショップ
オフィス家具
治験
店舗デザイン
債務整理
過払い
新宿 マッサージ
タイ古式マッサージ
広島 不動産
婚活
お見合いパーティー
マカ
格安航空券 国内
バイク便
税理士 東京
青梅市 不動産
電話工事
性病検査 女性
東京 賃貸
メッセンジャーバッグ
賃貸 東京
ボディーセラピー
レコメンド
新宿 まつげエクステ
ダイビング 東京
結婚式 二次会
天然石 アクセサリー
幼稚園教諭
リフォーム 神奈川
賃貸伊丹市
折込チラシ
お見合いパーティー
国民生活金融公庫
文京区 賃貸
新規ビジネス
エステ 池袋
駐車場防水
コンパニオン派遣
株式会社Karigo
Very good!I like the blog , Thanks .
polo hoodies, spyder jacket, cheap spyder jacket, the north face jackets, polo shirts, ed hardy hoodies, polo long sleeves shirts, norther face jacket, POLO jacket, ed hardy boots, ed hardy shoes, ed hardy jacket, ed hardy ugg boots, Babolat Tennis Racquets, Tennis Racquets, nike shoes, puma shoes, nike air max, nike shox nz,
spyder jackets,
discount spyder jacket,
Your article is very good.I like it very much.
Once upon a time, there was a mouse father.He wanted to marry his daughter to the greatest person in the world.But, who was the greatest person in the world?Oh!
puma ferrari shoes
cheap nike shoesThe sun! He must be the greatest person in the world.The mouse father went to talk to the sun."Hello! Mr. Sun.
puma shoes
ferrari shoes
I know you are the greatest person in the world.Would you marry my daughter?""What? I'm not the greatest person in the world. The greatest person is the cloud.If he comes out, I’ll be covered."
nike shox nz
Ugg Boots
The mouse father went to talk to the cloud. “Hello! Mr. Cloud. I know you are the greatest person in the world. Would you marry my daughter?”
nike 360 air max
nike shox shoes
“What? I’m not the greatest person in the world. The greatest person is the wind.If he comes out, I’ll be blown away.”
cheap puma shoes
puma drift cat
The mouse father went to talk to the wind. “Hello! Mr. Wind. I know you are the greatest person in the world.Would you marry my daughter?” “What? I’m not the greatest person in the world. The greatest person is the wall. If he comes out, I’ll be stopped.”
cheap nike shox
nike air max 360
The mouse father went to talk to the wall. “Hello! Mr. Wall. I know you are the greatest person in the world. Would you marry my daughter?” “What? I’m not the greatest person in the world. The greatest person is YOU, the mouse.” “The greatest person in the world is … mouse?” “Yes, the greatest person in the world is mouse. See? If mouse comes out, I’ll be bit!”
nike air max
pumas shoes
The mouse father was very happy. He finally knew mouse was the greatest person in the world. He would marry his daughter to the handsome mouse next door.
cheap jeans
cheap levis jeans
ed hardy jeans
Very good!I like the blog , Thanks .
polo hoodies, spyder jacket, cheap spyder jacket, the north face jackets, polo shirts, ed hardy hoodies, polo long sleeves shirts, norther face jacket, POLO jacket, ed hardy boots, ed hardy shoes, ed hardy jacket, ed hardy ugg boots, Babolat Tennis Racquets, Tennis Racquets, nike shoes, puma shoes, nike air max, nike shox nz,
spyder jackets,
discount spyder jacket,
ghd hair straighteners,
cheap ghd hair straighteners,
ugg boots,
cheap ugg boots,
Truely a nice blog and thanks for your great work. By the way, welcome to our websites: cheap adidas shoes and ghd hair straightners. Every men like sport, then, it is quite important to have a pair of right sports shoes to make you fully enjoy the sports. We provide nike sport shoes , cheap sport shoes, puma cat shoes, cheap nike shox shoes, cheap nike max shoes, shox shoes, nike shox r4running shoes which are brand new and in perfect condition but on discount.
All of the shoes, including the popularferrari shoespuma running shoes, nike tn dollar,which is the representative shoes of nike air max tnshoes are authentic and original of top quality. For people like running and playing basketball and other field sports, nothing would be more suitable than the puma shoes and nike shox nz basketball shoes. In addition to the shoes mentioned above, you may also be interested in the cheap adidas shoes , JORDAN WOMEN SHOES and nike running shoes, puma shoes , Nike Air Max Tn shoes and so on. The Nike air max series are specially designed and made for runners. It is the professional NIKE WOMEN SHOES for running . Wholesale and retail are both acceptable to us. Welcome to our site and free to look! Thank you and wish you a nice day. Good Luck!Everybody like beauty, which is quite commen, especailly womens. Welcom to our store which is focused on sellingghd hair straighteners mk4and hair straightners. For women, especially the young girls, this pink ghd hair straightenersis the best choice. ghd hair straightnersis famouse for the pretty outlook and the top quality. The price of this cheap ghd hair straightenersis acceptable and rational.
The ghd iv styler hair straightener is the newest product with a nice outlook and top quality.ghd mk4 hair straightener, purple ghd hair straighteners is beautiful, favourite by girls. ghd hair straightnersis necessary for you. It will be not difficult to you to become beautiful.
Truely a nice blog and thanks for your great work. By the way, welcome to our websites: cheap adidas shoes and ghd hair straightners. Every men like sport, then, it is quite important to have a pair of right sports shoes to make you fully enjoy the sports. We provide nike sport shoes , cheap sport shoes, puma cat shoes, cheap nike shox shoes, cheap nike max shoes, shox shoes, nike shox r4running shoes which are brand new and in perfect condition but on discount.
All of the shoes, including the popularferrari shoespuma running shoes, nike tn dollar,which is the representative shoes of nike air max tnshoes are authentic and original of top quality. For people like running and playing basketball and other field sports, nothing would be more suitable than the puma shoes and nike shox nz basketball shoes. In addition to the shoes mentioned above, you may also be interested in the cheap adidas shoes , JORDAN WOMEN SHOES and nike running shoes, puma shoes , Nike Air Max Tn shoes and so on. The Nike air max series are specially designed and made for runners. It is the professional NIKE WOMEN SHOES for running . Wholesale and retail are both acceptable to us. Welcome to our site and free to look! Thank you and wish you a nice day. Good Luck!Everybody like beauty, which is quite commen, especailly womens. Welcom to our store which is focused on sellingghd hair straighteners mk4and hair straightners. For women, especially the young girls, this pink ghd hair straightenersis the best choice. ghd hair straightnersis famouse for the pretty outlook and the top quality. The price of this cheap ghd hair straightenersis acceptable and rational.
The ghd iv styler hair straightener is the newest product with a nice outlook and top quality.ghd mk4 hair straightener, purple ghd hair straighteners is beautiful, favourite by girls. ghd hair straightnersis necessary for you. It will be not difficult to you to become beautiful.
Post a Comment
<< Home