Elemento común en la menor posición
Definir la función
elemento :: Eq a => [a] -> [a] -> [a]
tal que (elemento xs ys) es la lista formada por el elemento común a xs e ys con la menor posición. Por ejemplo.
elemento [3,7,6,9,8,0] [5,4,2,7,8,6,9] == [7] elemento [3,7,6,9] [9,5,6] == [9] elemento [5,3,6] [7,6,3] == [3] elemento [3,7,6,3,8,0] [5,4,9,1,4,2,1] == []
Nota: Como se observa en el 3ª ejemplo, en el caso de que un elemento x de xs pertenezca a ys y el elemento de ys en la misma posición que x pertenezca a xs, se elige como el de menor posición el de xs.
Soluciones
import Test.QuickCheck -- 1ª definición: elemento1 :: Eq a => [a] -> [a] -> [a] elemento1 p@(x:xs) q@(y:ys) | x `elem` q = [x] | y `elem` xs = [y] | otherwise = elemento1 xs ys elemento1 _ _ = [] -- 2ª definición: elemento2 :: Eq a => [a] -> [a] -> [a] elemento2 [] _ = [] elemento2 (x:xs) ys | x `elem` ys = [x] | otherwise = elemento2 ys xs -- Propiedad de equivalencia de las definiciones prop_elemento :: [Int] -> [Int] -> Bool prop_elemento xs ys = elemento1 xs ys == elemento2 xs ys -- La comprobación es -- λ> quickCheck prop_elemento -- +++ OK, passed 100 tests. ...