MimIR
0.4-dev
MimIR is my Intermediate Representation
Toggle main menu visibility
Loading...
Searching...
No Matches
normalizers.cpp
Go to the documentation of this file.
1
#include <
mim/tuple.h
>
2
#include <
mim/world.h
>
3
4
#include "
mim/plug/tuple/tuple.h
"
5
6
namespace
mim::plug::tuple
{
7
8
const
Def
*
normalize_cat
(
const
Def
*,
const
Def
* callee,
const
Def
* arg) {
9
auto
[a, b] = arg->
projs
<2>();
10
auto
[n, m] = callee->as<
App
>()->decurry()->args<2>([](
auto
def) {
return
Lit::isa
(def); });
11
if
(n && *n == 0)
return
b;
12
if
(m && *m == 0)
return
a;
13
if
(n && m)
return
mim::cat_tuple
(*n, *m, a, b);
14
return
nullptr
;
15
}
16
17
const
Def
*
normalize_contains
(
const
Def
* type,
const
Def
*,
const
Def
* arg) {
18
auto
& w = type->world();
19
auto
[xs, x] = arg->
projs
<2>();
20
21
if
(
auto
mut_pack = xs->isa_mut<
Pack
>()) {
22
if
(
auto
imm = mut_pack->immutabilize())
23
xs = imm;
24
else
25
return
nullptr
;
26
}
27
28
if
(
auto
tuple
= xs->isa<
Tuple
>()) {
29
for
(
auto
op :
tuple
->ops())
30
if
(op == x)
return
w.lit_tt();
31
32
return
tuple
->is_closed() ? w.lit_ff() :
nullptr
;
33
}
34
35
if
(
auto
pack = xs->isa<
Pack
>()) {
36
if
(pack->body() == x)
return
w.lit_tt();
37
return
pack->is_closed() ? w.lit_ff() :
nullptr
;
38
}
39
40
return
nullptr
;
41
}
42
43
const
Def
*
normalize_zip
(
const
Def
* type,
const
Def
* c,
const
Def
* arg) {
44
auto
& w = type->world();
45
auto
callee = c->as<
App
>();
46
auto
is_os = callee->
arg
();
47
auto
[n_i, Is, n_o, Os, f] = is_os->
projs
<5>();
48
auto
[r, s] = callee->decurry()->args<2>();
49
auto
lr =
Lit::isa
(r);
50
auto
ls =
Lit::isa
(s);
51
52
// TODO commute
53
// TODO reassociate
54
// TODO more than one Os
55
// TODO select which Is/Os to zip
56
57
if
(lr && ls && *lr == 1 && *ls == 1)
return
w.app(f, arg);
58
59
if
(
auto
l_in =
Lit::isa
(n_i)) {
60
auto
args = arg->
projs
(*l_in);
61
62
if
(lr && std::ranges::all_of(args, [](
const
Def
* arg) {
return
arg->isa<
Prod
>(); })) {
63
auto
shapes = s->projs(*lr);
64
auto
s_n =
Lit::isa
(shapes.front());
65
66
if
(s_n) {
67
auto
elems =
DefVec
(*s_n, [&, f = f](
size_t
s_i) {
68
auto
inner_args =
DefVec
(args.size(), [&](
size_t
i) { return args[i]->proj(*s_n, s_i); });
69
if
(*lr == 1) {
70
return
w.app(f, inner_args);
71
}
else
{
72
auto
app_zip = w.app(w.annex<
zip
>(), {w.lit_nat(*lr - 1), w.tuple(shapes.view().subspan(1))});
73
return
w.app(w.app(app_zip, is_os), inner_args);
74
}
75
});
76
return
w.tuple(elems);
77
}
78
}
79
}
80
81
return
{};
82
}
83
84
MIM_tuple_NORMALIZER_IMPL
85
86
}
// namespace mim::plug::tuple
mim::App
Definition
lam.h:224
mim::App::arg
const Def * arg() const
Definition
lam.h:284
mim::Def
Base class for all Defs.
Definition
def.h:273
mim::Def::projs
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
Definition
def.h:440
mim::Lit::isa
static std::optional< T > isa(const Def *def)
Definition
def.h:937
mim::Pack
A (possibly paramterized) Tuple.
Definition
tuple.h:137
mim::Prod
Base class for Sigma and Tuple.
Definition
tuple.h:10
mim::Tuple
Data constructor for a Sigma.
Definition
tuple.h:61
mim::plug::tuple
The tuple Plugin
Definition
normalizers.cpp:6
mim::plug::tuple::zip
zip
Definition
autogen.h:65
mim::plug::tuple::normalize_cat
const Def * normalize_cat(const Def *, const Def *callee, const Def *arg)
Definition
normalizers.cpp:8
mim::plug::tuple::normalize_zip
const Def * normalize_zip(const Def *type, const Def *c, const Def *arg)
Definition
normalizers.cpp:43
mim::plug::tuple::normalize_contains
const Def * normalize_contains(const Def *type, const Def *, const Def *arg)
Definition
normalizers.cpp:17
mim::cat_tuple
const Def * cat_tuple(nat_t n, nat_t m, const Def *a, const Def *b)
Definition
tuple.cpp:92
mim::DefVec
fe::Vector< const Def * > DefVec
Definition
def.h:93
tuple.h
MIM_tuple_NORMALIZER_IMPL
#define MIM_tuple_NORMALIZER_IMPL
Definition
autogen.h:73
tuple.h
world.h
src
mim
plug
tuple
normalizers.cpp
Generated by
1.18.0