-- |
-- Module      : Regiones
-- Description : Regiones en el plano.
-- Copyright   : Exercitium (19-05-14)
-- License     : GPL-3
-- Maintainer  : JoseA.Alonso@gmail.com
-- 
-- En los siguientes dibujos se observa que el número máximo de regiones
-- en el plano generadas con 1, 2 ó 3 líneas son 2, 4 ó 7,
-- respectivamente.
--
-- >
-- >                      \  |
-- >                       \5|
-- >                        \|
-- >                         \
-- >                         |\
-- >                         | \
-- >               |         |  \ 
-- >    1        1 | 3     1 | 3 \  6
-- >   ------   ---|---   ---|----\---
-- >    2        2 | 4     2 | 4   \ 7
-- >               |         |      \
-- 
-- Definir la función
-- 
-- > regiones :: Integer -> Integer  
-- tal que __(regiones n)__ es el número máximo de regiones en el plano
-- generadas con n líneas. Por ejemplo,
--
-- >>> regiones 3
-- 7  
-- >>> regiones 100
-- 5051

module Regiones where

import Test.QuickCheck

-- | 1ª definición (por recursión).
regiones :: Integer -> Integer  
regiones 0 = 1
regiones n = regiones (n-1) + n  

-- | 2ª definición (por la fórmula).
regiones2 :: Integer -> Integer
regiones2 n = n*(n+1) `div` 2 + 1

-- | __(prop_regiones n)__ se verifica si las definiciones de regiones
-- son equivalentes sobre n. Por ejemplo,
--
-- >>> all prop_regiones [Positive 2, Positive 100]
-- True
-- >>> quickCheck prop_regiones
-- +++ OK, passed 100 tests.
prop_regiones :: (Positive Integer) -> Bool
prop_regiones (Positive n) =
  regiones n == regiones2 n