identity = Abstraction(x, x) absuz = Abstraction(u, z) absyx = Abstraction(y, x) print("------------------------- abstraction as body of an abstraction") # the following implements the lambda term: (((λx.(λy.x) z) u) abs1 = Abstraction(y, x) abs2 = Abstraction(x, abs1) app1 = Application(abs2, z) app2 = Application(app1, u) print(app1) print("Reduce method on application: ", app1.reduce()) print("Call method on abstraction: ", abs2(z)) # this implements ((λx.x) u) print("------------------------- identity function") appliopid = Application(identity, u) print(appliopid) print(appliopid.reduce()) # this implements ((λx.x) (λu.z)) print("------------------------- two lambda abstractions in an application") appliopconst = Application(identity, absuz)