-- list of Padovan numbers using recurrence pRec = map (\(a,_,_) -> a) $ iterate (\(a,b,c) -> (b,c,a+b)) (1,1,1) -- list of Padovan numbers using self-referential lazy lists pSelfRef = 1 : 1 : 1 : zipWith (+) pSelfRef (tail pSelfRef) -- list of Padovan numbers generated from floor function pFloor = map f [0..] where f n = floor $ p**fromInteger (pred n) / s + 0.5 p = 1.324717957244746025960908854 s = 1.0453567932525329623 -- list of L-system strings lSystem = iterate f "A" where f [] = [] f ('A':s) = 'B':f s f ('B':s) = 'C':f s f ('C':s) = 'A':'B':f s -- check if first N elements match checkN n as bs = take n as == take n bs main = do putStr "P_0 .. P_19: " putStrLn $ unwords $ map show $ take 20 pRec putStr "The floor- and recurrence-based functions " putStr $ if checkN 64 pRec pFloor then "match" else "do not match" putStr " from P_0 to P_63.\n" putStr "The self-referential- and recurrence-based functions " putStr $ if checkN 64 pRec pSelfRef then "match" else "do not match" putStr " from P_0 to P_63.\n\n" putStr "The first 10 L-system strings are:\n" putStrLn $ unwords $ take 10 lSystem putStr "\nThe floor- and L-system-based functions " putStr $ if checkN 32 pFloor (map length lSystem) then "match" else "do not match" putStr " from P_0 to P_31.\n"