A regra de redução que você solicita é a regra usual para declarações IF. Consiste em duas regras de computação e uma regra de contexto:
IF TRUE a b → a
IF FALSE a b → b
a→a′IF a b c→IF a′ b c
Em ambos os call-by-value (estrito) e configurações (preguiçoso) chamada-a-necessidade, tanto e podem ser expressões arbitrárias. Eles não precisam ser valores.ab
Regras desse tipo, que reduzem funções específicas (aqui IF
), geralmente são chamadas de regras delta.
Agora, o motivo (2) acima é necessário para que as regras de redução para possam ser aplicadas. requer 3 argumentos, mas no termo original ele possui apenas dois, portanto não pode ser reduzido. ( está sendo parcialmente aplicado, como qualquer função do Haskell. Isso significa que apenas parte de seus argumentos precisa ser fornecida.) O uso de -expansion fornece o argumento adicional, sem alterar a semântica.IFIFIFη
IF a b c -> IF a' b c with a-> a'