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 ( n = <=n>h m) 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 (i, j), o elemento na linha i e coluna j deve ser igual ao elemento na linha j e coluna i. Basta fazer essa verificação só para i < j, já que i = j é trivial.

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 (i, j) com i in [0n-1] e j in [i+1n-1] e testamos (m !! i !! j) == (m !! j !! i).
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]
]

Exercícios relacionados