#include #include using namespace std; typedef string variable; class term { virtual set freeVariables(); virtual term substitute(variable, term); virtual bool alphaEquivalent(term); virtual string pretty(); }; class var : public term { variable name; public: var(variable name) : name(name) {}; }; class lam : public term { variable binding; term body; public: lam(variable binding, term body) : binding(binding), body(body) {}; }; class app : public term { term function; term argument; public: app(term function, term argument) : function(function), argument(argument) {}; }; int main(int argc, char** argv) { term example1 = lam("x", app(var("x"), var("y"))); term example2 = app(var("f"),lam("f",app(example1,var("f")))); return 0; }