/** * A transformation from boolean expressions to the * lambda calculus. * * @author Jacob Andersen */ let lambda = "lambda.l" in let logic = "logic.l" in let extendedLogic = { Exp.not : "!" Exp ; Exp.or : Exp "|" Exp ; Exp.and : Exp "&" Exp ; } in idx(logic \ extendedLogic) + (| extendedLogic -> (logic \ extendedLogic) [ Exp -> Exp ] Exp.not = '$1 ? #f : #t' ; Exp.or = '$1 ? #t : $2' ; Exp.and = '$1 ? $2 : #f' ; |) | (| (logic \ extendedLogic) -> lambda [ Exp -> Exp ] Exp.true = '\xy.x' ; Exp.false = '\xy.y' ; Exp.xor = '(\xy.(x(y(\xy.y)(\xy.x))y)) ($1) ($2)' ; Exp.if = '($1) ($2) ($3)' ; Exp.paren = '($1)' ; |)