(* Counting things inside lambda expressions *) (* Author: Carsten Schuermann, Adamo Poswolsky *) exp -> exp> exp) -> exp> plus : -> -> = |--> |--> ; (* Count the number of bound variables *) cntvar : -> = {{p:exp}}

|--> <1> | |--> plus (cntvar ) (cntvar ) | |--> {p:exp} case cntvar of ( |--> pop ) ; cntvar'1 = cntvar ; cntvar'2 = cntvar ; cntvar'3 = cntvar ; cntvar'4 = cntvar ; (* Count the number of lambda binders *) cntlam : -> = {{x:exp}} |--> <0> | |--> plus (cntlam ) (cntlam ) | |--> {p:exp} case cntlam of ( |--> pop ) ; cntlam'1 = cntlam ; cntlam'2 = cntlam ; cntlam'3 = cntlam ; cntlam'4 = cntlam ; (* Constructor free programming *) (* A variation on the count example from above. Difference: a and l are dynamically introduced *) cntvar : -> = {{x:exp}} |--> <1> | {{a:exp -> exp -> exp}} |--> plus (cntvar ) (cntvar ) | {{l:(exp -> exp) -> exp}} |--> {p:exp} case cntvar of ( |--> pop ) ; cntvar'1 = {a : exp -> exp -> exp} {l : (exp -> exp) -> exp} case (cntvar ) of ( |--> pop (pop )) ; cntvar'2 = {a : exp -> exp -> exp} {l : (exp -> exp) -> exp} case (cntvar ) of ( |--> pop (pop )) ; cntvar'3 = {a : exp -> exp -> exp} {l : (exp -> exp) -> exp} case (cntvar ) of ( |--> pop (pop )) ; cntvar'4 = {a : exp -> exp -> exp} {l : (exp -> exp) -> exp} case (cntvar ) of ( |--> pop (pop )) ;