def z_combinator_fun(ftype): # does not check types... left_type = ftype.left g_type = types.FunType(types.type_e, left_type) body = meta.term("f", ftype)(meta.term("g", g_type)(meta.term("x", types.type_e)))(meta.term("x", types.type_e)) comb = meta.LFun(ftype, meta.LFun(g_type, meta.LFun(types.type_e, body, varname="x"),varname="g"),varname="f") return comb
def build_geach_combinator(gtype, ftype): body = meta.term("g", gtype)(meta.term("f", ftype)(meta.term("x", ftype.left))) combinator = meta.LFun(gtype, meta.LFun(ftype, meta.LFun(ftype.left, body, varname="x"), varname="f"), varname="g") return combinator
def lift(arg, ltype): larg_type = types.FunType(arg.type, ltype) combinator = meta.LFun( arg.type, meta.LFun(larg_type, meta.term("g", larg_type)(meta.term("f", arg.type)), "g"), "f") result = combinator(arg).reduce_all() return result
def z_combinator_fun(ftype): # does not check types... left_type = ftype.left g_type = types.FunType(types.type_e, left_type) body = meta.term("f", ftype)(meta.term("g", g_type)(meta.term( "x", types.type_e)))(meta.term("x", types.type_e)) comb = meta.LFun(ftype, meta.LFun(g_type, meta.LFun(types.type_e, body, varname="x"), varname="g"), varname="f") return comb
def lift(arg, ltype): larg_type = types.FunType(arg.type, ltype) combinator = meta.LFun(arg.type, meta.LFun(larg_type, meta.term("g", larg_type)(meta.term("f", arg.type)), "g"), "f") result = combinator(arg).reduce_all() return result