The give
node in here
...
callableBond = when (at intermediateDate) $ and coupon $ give $ or called notCalled
is required because it moves the choice to be made to the issuer (which is the party that can choose to call the bond). By default, the Or
node would provide a choice to the owner / bearer of the asset.
So the Or
subtree essentially models the issuer’s choice to “either give the principal back to the bond holder at the intermediate date, or give it back at maturity”. But you are right in that I think there’s a missing give
for the notCalled
case, which currently would result in the bond holder paying the principal.