Questão 3: Escreva uma função em Haskell que receba uma matriz (representada como lista de listas) e retorne True se a matriz for triangular superior, e False caso contrário.

Passo 1

A questão pede uma função em Haskell que receba uma matriz (lista de listas) e verifique se ela é triangular superior, isto é, se todo elemento abaixo da diagonal principal é zero.

Passo 2

Para aplicar essa definição, primeiro precisamos garantir que a matriz seja quadrada. Definimos uma função auxiliar isSquare que checa se o número de linhas (n) é igual ao comprimento de cada linha.
Depois, para cada linha com índice i (onde i começa em 0), pegamos os i primeiros elementos dessa linha (essas posições estão abaixo da diagonal) e verificamos se todos são zero.

Passo 3

Combinamos então essas duas condições usando all: a matriz deve ser quadrada e cada uma de suas linhas deve satisfazer a condição de zeros abaixo da diagonal.

Passo 4

Por fim, unimos tudo em uma única função isUpperTriangular que usa isSquare e um teste de cada linha via zip de índices e take para extrair e checar os valores. Isso resolve o problema de forma genérica e elegante.

Resposta

isUpperTriangular :: (Eq a, Num a) => [[a]] -> Bool
isUpperTriangular m = isSquare m && all checkRow (zip [0…] m)
where
n = length m
isSquare x = all ((== n) . length) x
checkRow (i, row) = all (== 0) (take i row)

Exercícios relacionados