Producto cartesiano de una familia de conjuntos
Definir la función
producto :: [[a]] -> [[a]]
tal que (producto xss) es el producto cartesiano de los conjuntos xss. Por ejemplo,
λ> producto [[1,3],[2,5]] [[1,2],[1,5],[3,2],[3,5]] λ> producto [[1,3],[2,5],[6,4]] [[1,2,6],[1,2,4],[1,5,6],[1,5,4],[3,2,6],[3,2,4],[3,5,6],[3,5,4]] λ> producto [[1,3,5],[2,4]] [[1,2],[1,4],[3,2],[3,4],[5,2],[5,4]] λ> producto [] [[]]
Comprobar con QuickCheck que para toda lista de listas de números enteros, xss, se verifica que el número de elementos de (producto xss) es igual al producto de los números de elementos de cada una de las listas de xss.
Nota. Al hacer la comprobación limitar el tamaño de las pruebas como se indica a continuación
quickCheckWith (stdArgs {maxSize=9}) prop_producto
Soluciones
import Test.QuickCheck producto :: [[a]] -> [[a]] producto [] = [[]] producto (xs:xss) = [x:ys | x <- xs, ys <- producto xss] -- La propiedad es prop_producto :: [[Int]] -> Bool prop_producto xss = length (producto xss) == product (map length xss) -- La comprobación es -- λ> quickCheckWith (stdArgs {maxSize=9}) prop_producto -- +++ OK, passed 100 tests.