5using namespace std::string_literals;
42 auto lam = d->isa_mut<Lam>();
43 if (!lam || !lam->is_set())
return nullptr;
50 if (
auto app =
body()->isa<App>())
58 auto eta = w.mut_lam(f->type()->as<
Pi>());
59 eta->set(f->dbg_key())->debug_prefix(
"eta_"s);
60 return eta->app(
filter, f, eta->var());
68 auto& world = f->world();
69 auto F = f->type()->as<
Pi>();
70 auto G = g->type()->as<
Pi>();
75 auto A = G->
dom(2, 0);
77 auto C = F->ret_dom();
80 world.log().d(
"compose f: {}: {}, g: {}: {}", f, F, g, G);
81 world.log().d(
" A = {}, B = {}, C = {}", A, B, C);
83 auto name =
"comp_"s + f->sym().str() +
"_" + g->sym().str();
84 auto h = world.mut_fun(A, C)->set(name);
85 auto hcont = world.mut_con(B)->set(name +
"_cont");
87 h->app(
true, g, {h->var((
nat_t)0), hcont});
89 auto hcont_var = hcont->var();
90 hcont->app(
true, f, {hcont_var, h->var(1) });
Def * set(size_t i, const Def *)
Successively set from left to right.
World & world() const noexcept
const Def * var(nat_t a, nat_t i) noexcept
bool has_free_var(const Var *) const
Same as free_vars().contains(var).
constexpr auto reduce(const Def *arg) const
const Var * has_var()
Only returns not nullptr, if Var of this mutable has ever been created.
std::variant< bool, const Def * > Filter
const Def * filter() const
Lam * set(Filter filter, const Def *body)
static Lam * eta_expand(Filter, const Def *f)
Lam * set_filter(Filter)
Set filter first.
const Def * eta_reduce() const
Yields body(), if eta-convertible and nullptr otherwise.
Lam * branch(Filter filter, const Def *cond, const Def *t, const Def *f, const Def *arg=nullptr)
Set body to an App of (f, t)#cond mem or (f, t)#cond () if mem is nullptr.
Lam * app(Filter filter, const Def *callee, const Def *arg)
Set body to an App of callee and arg.
static const Def * isa_ret_arg(const Def *d)
Yields the y of lm (x, ret) = ret y - the argument d's body hands to its Lam::ret_var.
const Def * ret_var()
Yields the Lam::var of the Lam::ret_pi.
A dependent function type.
const Def * ret_dom() const
Pi::domain of Pi::ret_pi.
Pi(const Def *type, const Def *dom, const Def *codom, bool implicit)
Constructor for an immutable Pi.
static const Pi * isa_basicblock(const Def *d)
Is this a continuation (Pi::isa_cn) that is not Pi::isa_returning?
const Pi * ret_pi() const
Yields the last Pi::dom, if Pi::isa_basicblock.
Pi * set_dom(const Def *dom)
static const Pi * isa_returning(const Def *d)
Is this a continuation (Pi::isa_cn) which has a Pi::ret_pi?
const Def * filter(Lam::Filter filter)
const Def * app(const Def *callee, const Def *arg)
fe::View< const Def * > Defs
const Def * compose_cn(const Def *f, const Def *g)
The high level view is: