12 auto callee = c->as<
App>();
13 auto f = callee->arg();
16 if constexpr (
id ==
fold::r) std::swap(acc,
vec);
20 for (
auto op :
tuple->ops())
21 acc = w.app(f, {acc, op});
23 for (
auto op :
tuple->ops() | std::ranges::views::reverse)
24 acc = w.app(f, {op, acc});
28 if (
auto pack =
vec->isa_imm<
Pack>()) w.WLOG(
"packs not yet implemented: {}", pack);
32 return w.app(f, {acc, l});
34 return w.app(f, {
l, acc});
43 auto callee = c->as<
App>();
44 auto p = callee->
arg();
48 for (
auto op :
tuple->ops())
53 if (
auto pack =
vec->isa_imm<
Pack>()) w.WLOG(
"packs not yet implemented: {}", pack);
59 auto& w =
vec->world();
63 for (
auto op :
tuple->ops()) {
64 auto [_, ins] = seen.emplace(op);
65 if (!ins)
return w.lit_ff();
67 return tuple->is_closed() ? w.lit_tt() :
nullptr;
70 if (
auto pack =
vec->isa_imm<
Pack>()) {
71 if (
auto l =
Lit::isa(pack->arity()))
return w.lit_ff();
74 if (
vec->isa<
Lit>())
return w.lit_tt();
80 auto& world = type->world();
81 auto [a, b] = arg->
projs<2>();
82 auto [n, m] = callee->as<
App>()->decurry()->args<2>([](
auto def) {
return Lit::isa(def); });
84 if (n && *n == 0)
return b;
85 if (m && *m == 0)
return a;
89 for (
size_t i = 0, e = *n; i != e; ++i)
90 defs.emplace_back(a->proj(e, i));
91 for (
size_t i = 0, e = *m; i != e; ++i)
92 defs.emplace_back(b->proj(e, i));
93 return world.tuple(defs);
100 if (
auto arr = type->isa<
Arr>()) {
101 if (arr->arity()->isa<
Bot>())
return nullptr;
104 auto& w = type->world();
105 auto callee = c->as<
App>();
106 auto [n, m] = callee->args<2>([](
auto def) {
return Lit::isa(def); });
109 if (!n || !m)
return nullptr;
110 if (n == 1 && m == 1)
return w.tuple();
112 if (
auto tup_vec =
vec->isa<
Tuple>()) {
113 if (
auto tup_is = is->isa<
Tuple>(); tup_is && tup_is->
is_closed()) {
115 auto set = absl::btree_set<nat_t>();
116 for (
auto opi : tup_is->ops())
119 for (
size_t i = 0, e = tup_vec->num_ops(); i != e; ++i)
120 if (!set.contains(i)) defs.emplace_back(tup_vec->op(i));
121 return w.tuple(defs);
126 for (
size_t i = 0, e = tup_vec->num_ops(); i != e; ++i)
127 if (i != lit_is) defs.emplace_back(tup_vec->op(i));
128 return w.tuple(defs);
132 if (
auto tup_pack =
vec->isa_imm<
Pack>())
return w.pack(*n - *m, tup_pack->body());
A (possibly paramterized) Array.
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
bool is_closed() const
Has no free_vars()?
static std::optional< T > isa(const Def *def)
static T as(const Def *def)
A (possibly paramterized) Tuple.
Data constructor for a Sigma.
const Def * normalize_scan(const Def *, const Def *c, const Def *vec)
const Def * normalize_cat(const Def *type, const Def *callee, const Def *arg)
const Def * normalize_is_unique(const Def *, const Def *, const Def *vec)
const Def * normalize_diff(const Def *type, const Def *c, const Def *arg)
const Def * normalize_fold(const Def *, const Def *c, const Def *arg)
Vector< const Def * > DefVec
GIDSet< const Def * > DefSet
#define MIM_vec_NORMALIZER_IMPL