Los puntos se puede representar mediante pares de números
type Punto = (Int,Int) |
y las regiones rectangulares mediante el siguiente tipo de dato
data Region = Rectangulo Punto Punto | Union Region Region | Diferencia Region Region deriving (Eq, Show) |
donde
(Rectangulo p1 p2)
es la región formada por un rectángulo cuyo vértice superior izquierdo esp1
y su vértice inferior derecho esp2
.(Union r1 r2)
es la región cuyos puntos pertenecen a alguna de las regionesr1
yr2
.(Diferencia r1 r2)
es la región cuyos puntos pertenecen a la regiónr1
pero no pertenecen a lar2
.
Definir la función
enRegion :: Punto -> Region -> Bool |
tal que (enRegion p r)
se verifica si el punto p
pertenece a la región r
. Por ejemplo, usando las regiones definidas por
r0021, r3051, r4162 :: Region r0021 = Rectangulo (0,0) (2,1) r3051 = Rectangulo (3,0) (5,1) r4162 = Rectangulo (4,1) (6,2) |
se tiene
enRegion (1,0) r0021 == True enRegion (3,0) r0021 == False enRegion (1,1) (Union r0021 r3051) == True enRegion (4,0) (Union r0021 r3051) == True enRegion (4,2) (Union r0021 r3051) == False enRegion (3,1) (Diferencia r3051 r4162) == True enRegion (4,1) (Diferencia r3051 r4162) == False enRegion (4,2) (Diferencia r3051 r4162) == False enRegion (4,2) (Union (Diferencia r3051 r4162) r4162) == True |
Comprobar con QuickCheck que si el punto p
está en la región r1
, entonces, para cualquier región r2
, p
está en (Union r1 r2)
y en (Union r2 r1)
, pero no está en (Diferencia r2 r1)
.