4. Resolução dos três problemas com o Google Gemini
Iremos apresentar capturas de ecrã das três sessões do Gemini que foram utilizadas para resolver os três problemas colocados. Entraremos em pormenores consideráveis. Uma vez feito isto, não repetiremos o processo para as outras IA testadas. Estas funcionam de forma semelhante. Apenas apresentaremos os pormenores mais notáveis.
4.1. Introdução
Remetemos para a primeira captura de ecrã do Gemini apresentada anteriormente:
![]() |
- Em [1], o URL do Gemini;
- Em [2], a versão do Gemini utilizada;
- Em [3-5], os três problemas apresentados ao Gemini;
O Gemini é um produto do Google disponível no URL [https://gemini.google.com/]. Para visualizar um histórico das suas sessões de perguntas e respostas, como mostrado acima, é necessário criar uma conta. Além disso, tal como todas as outras IAs testadas, o Gemini limita o número de perguntas que pode fazer e o número de ficheiros que pode carregar. Quando este limite é atingido, a sessão termina e é-lhe oferecida a opção de a continuar mais tarde. Uma vez que é bastante frustrante parar a meio de uma sessão, subscrevi uma assinatura. Felizmente, o primeiro mês da assinatura do Gemini é gratuito. Fiz o mesmo com as outras IAs que tinham estes limites, nomeadamente o ChatGPT, o MistralAI e o ClaudeAI. Subscrevi uma assinatura de um mês, mas, nesses casos, o primeiro mês foi pago. Não encontrei quaisquer limites com o Grok. O DeepSeek não anuncia quaisquer limites, mas, por vezes, responde com [Servidor ocupado] e interrompe a sessão. Isso é, essencialmente, estabelecer limites sem o dizer.
A partir daqui, vou referir-me às sessões de perguntas e respostas simplesmente como «sessões». As IAs utilizam mais frequentemente os termos ingleses «chat» ou «conversation».
A interface do Gemini para fazer uma pergunta é a seguinte:
![]() | ![]() |
- Em [1], a sua pergunta;
- Em [2], o ícone que aciona a IA para calcular a resposta;
- Em [3-4], pode anexar ficheiros;
4.2. Problema 1
A sessão para o Problema 1 é a seguinte:
![]() |
- Em [1], a pergunta;
- Em [2], o início da resposta de Gemini;
O resto da resposta é o seguinte:
![]() |
![]() |
![]() |
![]() |
A resposta está correta. As outras cinco IAs também darão a resposta correta de forma semelhante.
4.3. Problema 2
4.3.1. Introdução
Aqui relembramos o problema inicial do curso [python3-flask-2020]. Trata-se de um texto entregue aos alunos numa aula prática.
![]() |
A tabela acima permite-nos calcular o imposto no caso simplificado de um contribuinte que tem apenas o seu salário para declarar. Conforme indicado na nota (1), o imposto calculado desta forma é o imposto antes de três mecanismos:
- O limite máximo do quociente familiar, que se aplica a rendimentos elevados;
- O crédito fiscal e a redução fiscal que se aplicam aos contribuintes com rendimentos baixos;
Assim, o cálculo do imposto envolve os seguintes passos [http://impotsurlerevenu.org/comprendre-le-calcul-de-l-impot/1217-calcul-de-l-impot-2019.php]:
![]() |
Propomos escrever um programa para calcular a obrigação fiscal de um contribuinte para 2019, no caso simplificado de um contribuinte que tenha apenas o seu salário a declarar.
4.3.1.1. Cálculo do imposto bruto
O imposto bruto pode ser calculado da seguinte forma:
Primeiro, calcule o número de quotas do contribuinte:
- Cada progenitor contribui com 1 quota;
- Os dois primeiros filhos contribuem, cada um, com 1/2 quota;
- Os filhos subsequentes contribuem, cada um, com uma quota:
O número de ações é, portanto:
- nbParts=1+nbChildren*0,5+(nbChildren-2)*0,5 se o funcionário for solteiro;
- nbParts=2+nbChildren*0,5+(nbChildren-2)*0,5 se for casado;
- onde nbChildren é o número de filhos;
- Calculamos o rendimento tributável R = 0,9 * S, em que S é o salário anual;
- O quociente familiar QF é calculado como QF = R / nbParts;
- Calculamos o imposto bruto I com base nos seguintes dados (2019):
9964 | 0 | 0 |
27 519 | 0,14 | 1.394,96 |
73.779 | 0,3 | 5.798 |
156 244 | 0,4 | 13 913,69 |
0 | 0,45 | 20163,45 |
Cada linha tem 3 campos: campo1, campo2, campo3. Para calcular o imposto I, procuramos a primeira linha em que QF <= campo1 e retiramos os valores dessa linha. Por exemplo, para um funcionário casado com dois filhos e um salário anual S de 50 000 euros:
Rendimento tributável: R=0,9*S=45 000
Número de quotas: nbParts=2+2*0,5=3
Quociente familiar: QF=45.000/3=15.000
A primeira linha em que QF <= campo1 é a seguinte:
O Imposto I é então igual a 0,14*R – 1394,96*númeroDeAções=[0,14*45000-1394,96*3]=2115. O imposto é arredondado por defeito para o euro mais próximo.
Se a condição QF <= campo1 for verdadeira na primeira linha, então o imposto é zero.
Se QF for tal que a condição QF <= campo1 nunca for satisfeita, então são utilizados os coeficientes da última linha. Aqui:
o que dá o imposto bruto I = 0,45*R – 20163,45*nbParts.
4.3.1.2. Limite do Quociente Familiar
![]() |
Para determinar se o limite do quociente familiar (QF) se aplica, recalculamos o imposto bruto sem os filhos. Mais uma vez, para o trabalhador casado com dois filhos e um salário anual S de 50 000 euros:
Rendimento tributável: R = 0,9 * S = 45 000
Número de quotas: nbParts=2 (os filhos já não são contabilizados)
Quociente familiar: QF = 45 000 / 2 = 22 500
A primeira linha em que QF <= campo1 é a seguinte:
O Imposto I é, então, igual a 0,14*R – 1394,96*número de ações = [0,14*45 000 – 1394,96*2] = 3510.
Benefício máximo relacionado com filhos: 1551 * 2 = 3102 euros
Imposto mínimo: 3.510 – 3.102 = 408 euros
O imposto bruto com 2 ações, já calculado no parágrafo anterior (2.115 euros), é superior ao imposto mínimo (408 euros), pelo que o limite familiar não se aplica neste caso.
Em geral, o imposto bruto é superior a (imposto1, imposto2), em que:
- [imposto1]: é o imposto bruto calculado incluindo os filhos;
- [imposto2]: é o imposto bruto calculado sem filhos e reduzido pelo crédito máximo (aqui 1 551 euros por meia quota) relacionado com os filhos;
4.3.1.3. Cálculo da redução fiscal
![]() |
Ainda no caso do trabalhador casado com dois filhos e um salário anual S de 50 000 euros:
O imposto bruto (2.115 euros) da etapa anterior é inferior a 2.627 euros para um casal (1.595 euros para uma pessoa solteira): a redução fiscal aplica-se, portanto. É calculada da seguinte forma:
crédito fiscal = limiar (casal = 1.970 / solteiro = 1.196) – 0,75 * imposto bruto
desconto = 1.970 – 0,75 * 2.115 = 383,75, arredondado para 384 euros.
Novo imposto bruto = 2.115 – 384 = 1.731 euros
É necessário respeitar duas regras ao calcular o desconto (algumas ferramentas de IA têm tropeçado nesta questão):
- O desconto não pode ser negativo;
- O desconto não pode exceder o imposto já calculado;
4.3.1.4. Cálculo da redução do imposto
![]() |
Abaixo de um determinado limiar, é aplicada uma redução de 20% ao imposto bruto resultante dos cálculos anteriores. Em 2019, os limiares são os seguintes:
- Solteiro: 21 037 euros;
- casal: 42 074 euros; (o valor de 37 968 utilizado no exemplo acima parece estar incorreto);
Este limiar é aumentado pelo valor: 3.797 * (número de meias-partes contribuídas pelos filhos).
Mais uma vez, para o trabalhador casado com dois filhos e um salário anual S de 50 000 euros:
- O seu rendimento tributável (45 000 euros) é inferior ao limiar (42 074 + 2 × 3 797) = 49 668 euros;
- Tem, portanto, direito a uma redução de 20% no seu imposto: 1.731 * 0,2 = 346,2 euros, arredondado para 347 euros;
- O imposto bruto do contribuinte passa a ser: 1.731 – 347 = 1.384 euros;
4.3.1.5. Cálculo do imposto líquido
O nosso cálculo termina aqui: o imposto líquido a pagar será de 1.384 euros. Na realidade, o contribuinte pode ter direito a outras deduções, nomeadamente por doações a organizações de interesse público ou geral.
4.3.1.6. Casos de rendimentos elevados
O nosso exemplo anterior aplica-se à maioria dos trabalhadores. No entanto, o cálculo do imposto difere para quem aufere rendimentos elevados.
4.3.1.6.1. Limite à redução de 10% sobre o rendimento anual
Na maioria dos casos, o rendimento tributável é calculado utilizando a fórmula: R = 0,9 × S, em que S é o salário anual. Isto é conhecido como a redução de 10%. Esta redução está limitada. Em 2019:
- Não pode exceder 12 502 euros;
- Não pode ser inferior a 437 euros;
Consideremos o caso de um trabalhador solteiro, sem filhos e com um salário anual de 200 000 euros:
- A redução de 10 % corresponde a 200 000 euros > 12 502 euros. Por conseguinte, o valor máximo é de 12 502 euros;
4.3.1.6.2. Limite do Quociente Familiar
Consideremos um caso em que se aplica o limite familiar descrito na secção |Limite do Quociente Familiar|. Tomemos o caso de um casal com três filhos e um rendimento anual de 100 000 euros. Repassemos novamente os passos do cálculo:
- A dedução de 10% é de 100 000 euros < 12 502 euros. O rendimento tributável R é, portanto, 100 000 - 10 000 = 90 000 euros;
- O casal tem nbParts = 2 + 0,5 × 2 + 1 = 4 quotas;
- O seu quociente familiar é, portanto, QF = R / nbParts = 90 000 / 4 = 22 500 euros;
- O seu imposto bruto I1 com filhos é I1 = 0,14 × 90 000 – 1 394,96 × 4 = 7 020 euros;
- O seu imposto bruto I2 sem filhos:
- QF = 90 000 / 2 = 45 000 euros;
- I2 = 0,3 × 90.000 – 5.798 × 2 = 15.404 euros;
- A regra do limite do quociente familiar estabelece que o benefício derivado dos filhos não pode exceder (1.551 × 4 meias quotas) = 6.204 euros. No entanto, neste caso, é I2 – I1 = 15.404 – 7.020 = 8.384 euros, o que é superior a 6.204 euros;
- O imposto bruto é, portanto, recalculado como I3 = I2 - 6.204 = 15.404 - 6.204 = 9.200 euros;
- Uma vez que I3 > I1, o imposto I3 será retido;
Este casal não receberá nem crédito fiscal nem redução, e o seu imposto final será de 9.200 euros.
4.3.1.7. Dados oficiais
O cálculo do imposto é complexo. Ao longo deste documento, serão realizados testes utilizando os seguintes exemplos. Os resultados provêm do simulador da administração fiscal |https://www3.impots.gouv.fr/simulateur/calcul_impot/2019/simplifie/index.htm|:
Contribuinte | Resultados oficiais | Resultados do algoritmo do documento |
Casal com 2 filhos e um rendimento anual de 55 555 euros | Imposto = 2.815 euros Taxa de imposto = 14% | Imposto = 2.814 euros Taxa de imposto = 14% |
Casal com 2 filhos e um rendimento anual de 50 000 euros | Imposto = 1 385 euros Crédito fiscal = 384 euros Redução = 346 euros Taxa de imposto = 14% | Imposto = 1.384 euros Desconto = 384 euros Crédito = 347 euros Taxa de imposto = 14% |
Casal com 3 filhos e um rendimento anual de 50 000 euros | Imposto = 0 euros Crédito fiscal = 720 euros Redução = 0 euros Taxa de imposto = 14% | Imposto = 0 euros Desconto = 720 euros Dedução = 0 euros Taxa de imposto = 14% |
Solteiro com 2 filhos e um rendimento anual de 100 000 euros | Imposto = 19 884 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 41% | Imposto = 19 884 euros Sobretaxa = 4.480 euros Desconto = 0 euros Redução = 0 euros Taxa de imposto = 41% |
Solteiro com 3 filhos e um rendimento anual de 100 000 euros | Imposto = 16 782 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 41% | Imposto = 16 782 € Sobretaxa = 7.176 euros Desconto = 0 euros Redução = 0 euros Taxa de imposto = 41% |
Casal com 3 filhos e um rendimento anual de 100 000 euros | Imposto = 9.200 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 30% | Imposto = 9.200 euros Sobretaxa = 2.180 euros Desconto = 0 euros Redução = 0 euros Taxa de imposto = 30% |
Casal com 5 filhos e um rendimento anual de 100 000 euros | Imposto = 4.230 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 14% | Imposto = 4.230 € Desconto = 0 euros Dedução = 0 euros Taxa de imposto = 14% |
Solteiro, sem filhos e rendimento anual de 100 000 euros | Imposto = 22.986 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 41% | Imposto = 22 986 euros Sobretaxa = 0 euros Desconto = 0 euros Dedução = 0 euros Taxa de imposto = 41% |
Casal com 2 filhos e um rendimento anual de 30 000 euros | Imposto = 0 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 0% | Imposto = 0 euros Desconto = 0 euros Redução = 0 euros Taxa de imposto = 0% |
Solteiro, sem filhos e com um rendimento anual de 200 000 euros | Imposto = 64 211 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 45% | Imposto = 64 210 euros Sobretaxa = 7.498 euros Desconto = 0 euros Redução = 0 euros Taxa de imposto = 45% |
Casal com 3 filhos e um rendimento anual de 200 000 euros | Imposto = 42 843 euros Crédito fiscal = 0 euros Dedução = 0 euros Taxa de imposto = 41% | Imposto = 42 842 euros Sobretaxa = 17 283 euros Desconto = 0 euros Redução = 0 euros Taxa de imposto = 41% |
No exemplo acima, a «sobretaxa» refere-se ao montante adicional pago pelos contribuintes com rendimentos elevados devido a dois fatores:
- O limite máximo de 10% de dedução do rendimento anual;
- O limite máximo do abono de família;
Este indicador não pôde ser verificado porque o simulador da autoridade fiscal não o disponibiliza.
Podemos ver que o algoritmo do documento calcula sempre o montante correto do imposto, embora com uma margem de erro de 1 euro. Esta margem de erro resulta do arredondamento. Todos os montantes monetários são arredondados para o euro superior em alguns casos e para o euro inferior noutros. Como não estava familiarizado com as regras oficiais, os montantes monetários no algoritmo do documento foram arredondados:
- Para o euro superior no caso de descontos e reduções;
- Para baixo, para o euro mais próximo, no caso de sobretaxas e do imposto final;
Vamos pedir à IA para realizar este cálculo de impostos.
4.3.2. Configuração da sessão do Gemini
A questão colocada ao Gemini é acompanhada por dois ficheiros:
![]() |
- Em [1], o cálculo acima descrito foi incluído num PDF que foi fornecido à Gemini. A Gemini encontrará nesse documento as regras exatas para o cálculo simplificado do imposto de 2019 sobre os rendimentos de 2018;
- Em [2], as nossas instruções;
- Em [3], o comando para iniciar a IA;
As nossas instruções no ficheiro de texto [instructionsAvecPDF.txt] são as seguintes:
Estas instruções são o resultado de inúmeras perguntas feitas ao Gemini. Torna-se rapidamente claro que a IA precisa de ser orientada de forma muito rigorosa se quisermos obter o que pretendemos. Foi devido a toda esta tentativa e erro que a sessão do Gemini acabou por ser encerrada por exceder os limites. Vamos examinar o resto destas instruções:
- Linha 1: Especificamos que a conversa deve ser em francês. Esta instrução destina-se ao DeepSeek, que tendia a falar inglês;
- Linha 3: o que queremos;
- Linha 5: Dizemos à IA para usar o PDF que fornecemos;
- Linhas 7–14: várias dicas úteis, especialmente para o Problema 3 sem o PDF. Várias IA tiveram dificuldades no cálculo dos impostos;
- Linhas 15–44: os 11 testes unitários que queremos incluir no script gerado. Assim que o script for gerado, vamos executá-lo no PyCharm e verificar se todos os 11 testes são aprovados;
- Linhas 46–53: sem estas instruções, as IAs gerariam testes unitários à procura de resultados exatos que falhariam;
- Linhas 55–56: digo à IA para não ir à Internet. A solução mais simples é usar o PDF;
- Linhas 58–59: A IA não seguiu esta instrução. Tive de a escrever explicitamente num prompt quando reparei que um teste tinha falhado;
- Linhas 61–65: Especifico que tipo de script Python pretendo;
- Linhas 67–69: Teria preferido um link para recuperar o script gerado, porque exibir o código no ecrã demora tempo. Acabou por se verificar que a maioria das IAs não consegue fazer isto. Os links fornecidos não funcionaram;
- Linhas 71–72: Gostaria de saber o tempo que a IA demorou a responder à pergunta. Apenas o Gemini foi capaz de fornecer esta informação. As outras IAs ou não responderam a esta instrução ou forneceram números arbitrários, indicando que não a compreenderam;
4.3.3. Resposta do Gemini
A primeira resposta do Gemini é a seguinte:
![]() |
- Em [1-4], o Gemini fornece links para a parte do ficheiro PDF ou de texto que contém as instruções que está a utilizar num determinado momento;
O resto é o seguinte:
![]() |
- Em [1], o Gemini afirma que executou com sucesso todos os 11 testes unitários. A maioria das IAs fez esta afirmação tanto para o Problema 2 como para o Problema 3 e, frequentemente, quando o script gerado era carregado, este não funcionava. Esta afirmação deve, portanto, ser encarada com alguma cautela. No caso do Gemini, porém, isto revelar-se-á verdadeiro;
- Em [2], um link que acaba por não funcionar;
- Em [3], apenas o Gemini forneceu um tempo de execução realista;
Portanto, o link [2] não funciona. Dizemos ao Gemini:
![]() |
Resposta do Gemini:
![]() |
- Em [1], o script Python gerado pelo Gemini;
Carregamos este script no PyCharm e executamo-lo:
![]() |
- Em [1], [gemini1] é o script gerado pelo Gemini;
Quando o script é executado, surgem os seguintes erros de compilação:
"C:\Program Files\Python313\python.exe" "C:/Program Files/JetBrains/PyCharm 2025.2.0.1/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py" --path "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\chatGPT\chatGPT1.py"
Testing started at 17:12 ...
Launching unittests with arguments python -m unittest C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\chatGPT\chatGPT1.py in C:\Data\st-2025\dev\python\code\python-flask-2025-cours
Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm 2025.2.0.1\plugins\python-ce\helpers\pycharm\_jb_unittest_runner.py", line 38, in <module>
sys.exit(main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner,
~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
buffer=not JB_DISABLE_BUFFERING))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python313\Lib\unittest\main.py", line 103, in __init__
self.parseArgs(argv)
~~~~~~~~~~~~~~^^^^^^
File "C:\Program Files\Python313\Lib\unittest\main.py", line 142, in parseArgs
self.createTests()
~~~~~~~~~~~~~~~~^^
File "C:\Program Files\Python313\Lib\unittest\main.py", line 153, in createTests
self.test = self.testLoader.loadTestsFromNames(self.testNames,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
self.module)
^^^^^^^^^^^^
File "C:\Program Files\Python313\Lib\unittest\loader.py", line 207, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names]
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "C:\Program Files\Python313\Lib\unittest\loader.py", line 137, in loadTestsFromName
module = __import__(module_name)
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\chatGPT\chatGPT1.py", line 28, in <module>
[cite_start]
^^^^^^^^^^
NameError: name 'cite_start' is not defined
Process finished with exit code 1
Empty suite
- Linha 30, o erro de compilação. [cite_start] é um marcador utilizado para gerar um tipo específico de texto;
Colocamos os registos acima num ficheiro [logs gemini1.txt] e entregamo-lo ao Gemini:
![]() |
A resposta do Gemini é então a seguinte:
![]() |
Quando carregado no PyCharm, a execução do novo script gera exatamente o mesmo erro. Informamos isso ao Gemini, fornecendo novamente os registos de execução:
![]() |
A resposta do Gemini é a seguinte:
![]() |
Desta vez funciona. Todos os 11 testes unitários são aprovados. Dizemos ao Gemini:
Ao que ele responde:
![]() |
O script gerado pelo Gemini seguiu as instruções fornecidas no ficheiro de texto [instructionsWithPDF.txt]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 | |
Não verifiquei este código. Uma vez que os 11 testes unitários foram aprovados, considero-o «provavelmente correto». Não fiz mais nada ao meu próprio código além de verificar estes 11 testes.
4.4. Problema 3
O Problema 3 é idêntico ao Problema 2, exceto que já não fornecemos à IA o PDF contendo as regras de cálculo a seguir.
A pergunta inicial ao Gemini é a seguinte:
![]() |
O ficheiro de instruções em [1] é quase idêntico ao do Problema 2, com as seguintes diferenças:
1 - Exprime-toi en français.
2 - Peux-tu générer un script Python permettant de calculer l'impôt payé par les familles en 2019 sur leurs revenus de 2018.
3 - Tu t'aideras des sources que tu trouveras sur internet. Dans ta réponse indique-moi ces sources.
4 - Tu dois faire attention aux points suivants :
…
- No [3], pede-se ao aluno que descubra online as regras para calcular o imposto de 2019 sobre o rendimento de 2018. Este é um exercício mais difícil do que o anterior;
Abaixo, apresento apenas partes da primeira resposta do Gemini:
![]() |
![]() |
O tempo estimado parece plausível. Esperamos há muito tempo pela resposta da Gemini.
Tal como antes, o Gemini forneceu um link para descarregar o script gerado, mas o link não funciona. Dizemos-lhe:
![]() |
Resposta da Gemini:
![]() |
Carregamos o script no PyCharm com o nome [gemini2]:
![]() |
Executamo-lo e… não funciona. Os registos de execução são os seguintes:
"C:\Program Files\Python313\python.exe" "C:/Program Files/JetBrains/PyCharm 2025.2.0.1/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py" --path "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py"
Testing started at 17:23 ...
Launching unittests with arguments python -m unittest C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py in C:\Data\st-2025\dev\python\code\python-flask-2025-cours
Failure
Traceback (most recent call last):
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 278, in test_cas_2
self.assertAlmostEqual(impot, 1385, delta=1)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1691 != 1385 within 1 delta (306 difference)
Error
Traceback (most recent call last):
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 291, in test_cas_3
impot, _, _ = calculer_impot_final(2, 3, 50000)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 187, in calculer_impot_final
decote, impot_apres_decote = calculer_decote(impot_apres_plafonnement, adultes)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 134, in calculer_decote
decote = seuil_decote - (impot_avant_decote * COFFICIENT_DECOTE)
^^^^^^^^^^^^^^^^^
NameError: name 'COFFICIENT_DECOTE' is not defined. Did you mean: 'COEFFICIENT_DECOTE'?
Error
Traceback (most recent call last):
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 316, in test_cas_9
self._verifier_cas(2, 2, 30000, (0, 0, 0))
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 216, in _verifier_cas
impot_calcule, decote_calculee, reduction_calculee = calculer_impot_final(adultes, enfants, revenus)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 187, in calculer_impot_final
decote, impot_apres_decote = calculer_decote(impot_apres_plafonnement, adultes)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 134, in calculer_decote
decote = seuil_decote - (impot_avant_decote * COFFICIENT_DECOTE)
^^^^^^^^^^^^^^^^^
NameError: name 'COFFICIENT_DECOTE' is not defined. Did you mean: 'COEFFICIENT_DECOTE'?
Ran 11 tests in 0.038s
FAILED (failures=1, errors=2)
Process finished with exit code 1
- Linha 11, um teste falhou;
- Linhas 25 e 42: o mesmo erro de compilação;
Colocamos estes registos num ficheiro de texto que enviamos à Gemini:
![]() |
Resposta do Gemini:
![]() |
![]() |
Carregamos o script no PyCharm e executamo-lo. Mais erros. Informamos o Gemini, anexando novamente os registos de execução:
![]() |
Resposta do Gemini:
![]() |
![]() |
![]() |
Carregamos este novo script no PyCharm e executamo-lo. Desta vez, todos os 11 testes unitários são aprovados:
O código gerado pelo Gemini é o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | |
Mais uma vez, não verifiquei este código. Apenas verifiquei que passou com sucesso nos 11 testes.
Mas pode ser que alguém tenha curiosidade em saber o seu raciocínio, especialmente para casos específicos no cálculo de impostos. Vamos perguntar-lhe:
![]() |
Este é um caso de rendimento elevado, com um possível limite de dedução de 10% e um possível limite do quociente familiar.
A resposta da Gemini é a seguinte:
![]() |
![]() |
![]() |
![]() |
![]() |
Estas duas últimas capturas de ecrã são interessantes. O Gemini utiliza um método de cálculo diferente do explicado no PDF. Este método de cálculo pode, de facto, ser encontrado online. Os dois métodos são equivalentes.
![]() |
![]() |
A explicação é extremamente clara. Pode ser apresentada tal como está aos alunos para explicar o método de cálculo dos impostos.
Vamos agora ver outro exemplo, desta vez com rendimentos baixos. Neste caso, poderá haver um crédito fiscal e uma redução:
![]() |
A resposta da Gemini é a seguinte:
![]() |
![]() |
![]() |
![]() |
![]() |
Aqui, vemos que o Gemini aplica uma regra que não consta no PDF. Provavelmente encontrou-a online, mas será que a fonte é fiável?
![]() |
Aqui, o Gemini continua a aplicar uma regra desconhecida (a regra especial mencionada acima).
![]() |
![]() |
![]() |
Portanto, os resultados do Gemini correspondem aos do simulador fiscal oficial. Mas utilizou uma regra que não consta no PDF. Onde está o erro? Perguntamos ao Gemini, anexando o PDF:
![]() |
Resposta da Gemini:
![]() |
![]() |
![]() |
![]() |
Acho que o Gemini tem razão e que o meu PDF está errado. Para verificar isto, peço-lhe que faça um teste:
- Em que o seu raciocínio produziria os mesmos resultados que o simulador fiscal oficial;
- Onde o raciocínio apresentado no PDF daria resultados diferentes dos do simulador;
![]() |
A resposta da Gemini é a seguinte:
![]() |
Aqui, o Gemini está errado. Executei o simulador neste exemplo e obtive o seguinte resultado:
![]() |
No entanto, veremos que o raciocínio do Gemini realmente conduz aos resultados acima. Vamos continuar:
![]() |
![]() |
![]() |
![]() |
Muito bem. Tomado nota. Vamos continuar:
![]() |
![]() |
![]() |
![]() |
Assim, o Gemini encontrou (imposto, desconto, redução) = (431, 325, 1296), enquanto o simulador que utilizei apresenta (431, 324, 1297). Portanto, o Gemini encontrou os resultados corretos com uma diferença de apenas 1 euro, mas não sabe disso. Nós dizemos-lhe:
![]() |
O Gemini responde:
![]() |
![]() |
Agora, perguntamo-nos se o Gemini poderia gerar um PDF corrigido:
![]() |
Resposta do Gemini:
![]() |
Então, o Gemini não me forneceu um link para um PDF, mas gerou texto para que eu próprio pudesse criar o PDF. Embora seja complicado incluir capturas de ecrã do PDF aqui, estou a fazê-lo para mostrar aos leitores o aspeto generativo da IA:
![]() |













Para ser sincero, não verifiquei se tudo o que está neste PDF é verdade. Seja como for, é um documento perfeito para um tutorial, gerado em apenas alguns segundos.
No entanto, podemos pedir ao próprio Gemini para verificar se o seu PDF está correto. Iniciamos uma nova conversa:
![]() |
- em [1], incluímos o PDF gerado pelo Gemini [The Problem According to Gemini.pdf];
- em [2], o ficheiro [instructionsWithPDF2.txt] é idêntico às instruções em [instructionsWithPDF.txt], exceto que adicionámos um décimo segundo teste de unidade — precisamente aquele que revelou que o PDF inicial estava incorreto:
Curiosamente, foram necessárias várias iterações de idas e vindas até que o Gemini gerasse o script correto:
Pergunta 2
![]() |
Pergunta 3
![]() |
Tal como já foi feito várias vezes, quando o script gerado e carregado no PyCharm falha, fornecemos ao Gemini o ficheiro de texto que contém os registos de execução. O Gemini compreende-os muito bem.
Pergunta 4
![]() |
Pergunta 5
![]() |
Pergunta 6 e conclusão
![]() | ![]() |
Estamos agora confiantes na validade do PDF gerado pelo Gemini. As regras de cálculo nele apresentadas estão corretas.
Vamos agora fazer o mesmo com as outras cinco IAs, mas manteremos as nossas explicações muito breves, exceto no caso do ChatGPT, o atual líder em IA. O que nos interessa é saber se a IA resolve ou não os três problemas que lhe apresentamos. Na verdade, as interfaces de todas estas IAs são muito semelhantes, e procedi com elas da mesma forma que com o Gemini. Encorajamos os leitores a reproduzirem as conversas do Gemini com a IA da sua escolha.


















































































