Boa noite povo!

No versículo anterior estávamos na quarta parte da tradução de “A Formal Language for Analyzing Contracts”, hoje veremos a quinta.
Quando o código fica complicado, talvez não seja possível saber facilmente se o then terminate implícito no final na última linha será executado. Portanto, é uma boa ideia dar um terminate no contrato explicitamente quando a opção expirar.
Veremos exemplos em que mais de um tipo de evento e até sequências de eventos (como uma agenda de calendário de datas de pagamento) acionam a execução dos termos contratuais.
Lembre-se de que a linguagem não procede passo a passo por padrão – em vez disso, o leitor (humano ou computador) deve seguir as definições de contrato aninhadas à medida que se expandem e observar os eventos nas instruções when para ver o que elas acionam. Planejamentos explícitos de calendário passo a passo podem ser criados usando for, then, e eventos do calendário.
Aqui está um exemplo que usa essas etapas explícitas. Um bond faz uma sequência de pagamentos fixos, chamados cupons, regularmente, e depois efetua um pagamento final, o principal. Não mostramos aqui os detalhes da programação em si, mas, em geral, uma programação pode ser definida como qualquer tipo de sequência temporal – poderíamos pagar cupons no último dia de cada mês, em todos os feriados japoneses, de acordo com a computação da Páscoa (não ria – agendadores de feiras medievais tiveram que enfrentar esse problema), ou como quisermos. Quando implementados, os eventos de calendário e o iterador de agendamento contém uma implementação muito completa que resolve muitos dos problemas desagradáveis de calendário que geralmente aparecem nos sistemas de processamento de transações.
for itera pelos eventos no planejamento, um por um, com o when aninhado ao manipulá-los. Quando aparece após uma cláusula for, um then avança o iterador mais uma etapa.
bond(coupon, principal, schedule) =
for schedule
when withinPeriod(schedule.next)
to Holder coupon
then
when withinPeriod(schedule.next)
to Holder principal
Em seguida, esboçamos um contrato para vender um carro a crédito. Sendo um esboço e não um projeto completo, este é um exemplo simplificado ou “brinquedo” – deixamos de lado as taxas, quaisquer referências a um contrato de seguro relacionado, garantias, renúncias, etc. Também por simplicidade, temos o banco (aqui o Titular) é igual ao revendedor de automóveis. Finalmente, não mostramos aqui nenhuma garantia sobre o carro para garantir o empréstimo. Faremos uma facada em um mecanismo de penhor no exemplo abaixo.
loanPayments(payment, schedule) =
for schedule
when withinPeriod(schedule.next)
payment
carPurchase(car, downPayment, monthlyPayment, schedule) =
to Counterparty getTitle(car) with to Holder downPayment
then to Holder loanPayment(monthlyPayment, schedule)
Se quisermos permitir o pagamento antecipado, nossa programação conterá horários únicos, em vez de períodos com um horário de início e um término. E nossos pagamentos de empréstimos teriam a seguinte aparência:
loanPayments(payment, schedule) =
for schedule
when beforeTime(schedule.next)
payment
Poderíamos calcular o pagamento acima com outras informações que provavelmente veremos no contrato, mas isso envolve apenas uma programação normal. Podemos usar uma função para executar o cálculo em primeiro lugar:
loanPayments(principal, interest, schedule) =
constant payment.amount = computeInterest(principal, schedule, interest)
# normal computational function goes here
then for schedule
when beforeTime(schedule.next)
payment
“=” define, para todo time (portanto, constant [constante]), o número payment.amount ao valor retornado pela função computeInterest. Também poderíamos fazer coisas mais complicadas – deduzir juros por pré-pagamento ou, ao contrário, adicionar multas por pré-pagamento ou uma grande variedade de outras condições.
Também podemos estruturar o contrato de compra do carro para que o novo proprietário não receba o título até depois que o downPayment [pagamento inicial] for recebido:
carPurchase(car, downPayment, monthlyPayment, schedule) =
to Holder downPayment
then to Counterparty getTitle(car)
then to Holder loanPayments(monthlyPayment, schedule)
A quinta parte foi esta, no versículo seguinte veremos a sexta. Deus os abençoe!
