Questão 2: Escreva uma função em Haskell que receba uma matriz (representada como lista de listas) e retorne True se a matriz for simétrica, e False caso contrário. Atenção: para fazer essa questão, não é permitido obter a matriz transposta.
Passo 1
Resumo do enunciado: precisamos escrever em Haskell uma função que recebe uma matriz, representada como lista de listas, e retorna True se for simétrica, sem usar transpose. O conteúdo envolve tratamento de listas, índices e verificações de igualdade.
Passo 2
Primeiro, garantir que a matriz seja quadrada: no Haskell, isso significa que o número de linhas (
) deve ser igual ao número de colunas em cada linha. Podemos verificar isso com all (\r -> length r == n) m.
Depois, entender definição de matriz simétrica: para todo par de índices , o elemento na linha
e coluna
deve ser igual ao elemento na linha
e coluna
. Basta fazer essa verificação só para
, já que
é trivial.
Depois, entender definição de matriz simétrica: para todo par de índices
Passo 3
Para implementar a verificação de simetria sem usar transpose, usamos compreensão de listas e indexação com (!!). Geramos todos os pares
com
e
e testamos
.
Finalmente, combinamos as duas condições — matriz quadrada e simetria — usando (&&), retornando False caso alguma delas falhe e True caso todas passem.
Finalmente, combinamos as duas condições — matriz quadrada e simetria — usando (&&), retornando False caso alguma delas falhe e True caso todas passem.
Resposta
isSymmetric :: Eq a => [[a]] -> Bool
isSymmetric m =
let n = length m
in all (\r -> length r == n) m
&& and [ (m !! i !! j) == (m !! j !! i)
| i <- [0…n-1]
, j <- [i+1…n-1]
]
isSymmetric m =
let n = length m
in all (\r -> length r == n) m
&& and [ (m !! i !! j) == (m !! j !! i)
| i <- [0…n-1]
, j <- [i+1…n-1]
]