Praticando Cálculo Lambda: Exercícios e Soluções 2

por Frank de Alcantara em 01/11/2025

Praticando Cálculo Lambda: Exercícios e Soluções 2

Antes de Começar

Para facilitar a compreensão dos conceitos principais, estes exercícios utilizam uma notação que permite operações aritméticas básicas diretamente no cálculo lambda, como adição, subtração, multiplicação, exponenciação e comparações. Em um cálculo lambda puramente teórico, estas operações seriam implementadas usando codificação de Church, mas para os propósitos pedagógicos desta aula, assumiremos que operações como x + y , x × y , x − y , x y e comparações como ( n = 0 ) estão disponíveis como primitivas.

Estes dez exercícios exploraram as três principais estratégias de avaliação no cálculo lambda e suas implicações práticas:

call-by-value: Avalia argumentos antes de passá-los às funções. Simples e previsível, mas pode fazer trabalho desnecessário e pode não terminar mesmo quando um resultado existe.

Call-by-Name: Substitui argumentos sem avaliá-los, adiando a computação até que seja necessária. Mais poderosa em termos de terminação, mas pode reavaliar a mesma expressão múltiplas vezes.

call-by-need: Combina_call-by-name_ com compartilhamento, avaliando cada expressão no máximo uma vez. Oferece o melhor dos dois mundos: evita trabalho desnecessário e não recomputa expressões.

PARTE 1: ENUNCIADOS

Exercício 1: Diferença Básica entre call-by-value e_call-by-name_

Considere a seguinte função e aplicação:

f = λ x . ( λ y . x )

e x p r e s s a o = f   ( 3 + 4 )   ( 5 × 2 )

a) Realize a redução completa usando estratégia call-by-value, mostrando quando cada operação aritmética é avaliada

b) Realize a redução completa usando estratégia_call-by-name_, mostrando quando cada operação aritmética é avaliada

c) Compare os resultados e explique qual estratégia realizou menos operações

Exercício 2: Função que Ignora Argumentos

Dada a função:

c o n s t a n t e = λ x . ( λ y . x )

Aplique esta função a dois argumentos:

r e s u l t a d o = c o n s t a n t e   5   ( ( λ z . z   z )   ( λ z . z   z ) )

Observe que o segundo argumento ( λ z . z   z )   ( λ z . z   z ) é um combinador que não termina quando avaliado.

a) Tente reduzir usando call-by-value. O que acontece?

b) Reduza usando_call-by-name_. O processo termina?

c) Explique por que as duas estratégias levam a resultados diferentes

Conteúdo Exclusivo
Quer continuar lendo?

Este artigo completo contém estratégias práticas e dados exclusivos reservados para nossos membros cadastrados.

Continuar com Google Acesso gratuito e instantâneo com sua conta Google

(Updated: )