41 |
|
|
42 |
in |
in |
43 |
|
|
44 |
val basis = [ |
(* overloaded operators *) |
45 |
(* operators *) |
val overloads = [ |
|
(N.op_at, all([NK, NK, SK], |
|
|
fn [k, d, dd] => let |
|
|
val k = Ty.NatVar k |
|
|
val d = Ty.NatVar d |
|
|
val dd = Ty.ShapeVar dd |
|
|
in |
|
|
[field(k, d, dd), tensor[d]] --> Ty.T_Tensor dd |
|
|
end)), |
|
46 |
(* |
(* |
47 |
val op_add = Atom.atom "+" |
val op_add = Atom.atom "+" |
48 |
val op_sub = Atom.atom "-" |
val op_sub = Atom.atom "-" |
55 |
val op_gte = Atom.atom ">=" |
val op_gte = Atom.atom ">=" |
56 |
val op_gt = Atom.atom ">" |
val op_gt = Atom.atom ">" |
57 |
*) |
*) |
58 |
|
] |
59 |
|
|
60 |
|
(* non-overloaded operators, etc. *) |
61 |
|
val basis = [ |
62 |
|
(* operators *) |
63 |
|
(N.op_at, all([NK, NK, SK], |
64 |
|
fn [k, d, dd] => let |
65 |
|
val k = Ty.NatVar k |
66 |
|
val d = Ty.NatVar d |
67 |
|
val dd = Ty.ShapeVar dd |
68 |
|
in |
69 |
|
[field(k, d, dd), tensor[d]] --> Ty.T_Tensor dd |
70 |
|
end)), |
71 |
(N.op_at, all([NK, NK, SK], |
(N.op_at, all([NK, NK, SK], |
72 |
fn [k, d, dd] => let |
fn [k, d, dd] => let |
73 |
val k = Ty.NatVar k |
val k = Ty.NatVar k |
77 |
[field(k, d, dd), tensor[d]] |
[field(k, d, dd), tensor[d]] |
78 |
--> field(Ty.NatExp(k, ~1), d, Ty.ShapeExt(dd, d)) |
--> field(Ty.NatExp(k, ~1), d, Ty.ShapeExt(dd, d)) |
79 |
end)), |
end)), |
|
(* |
|
|
val op_orelse = Atom.atom "||" |
|
|
val op_andalso = Atom.atom "&&" |
|
|
*) |
|
80 |
(N.op_norm, all([SK], |
(N.op_norm, all([SK], |
81 |
fn [dd] => [Ty.T_Tensor(Ty.ShapeVar dd)] --> Ty.realTy)), |
fn [dd] => [Ty.T_Tensor(Ty.ShapeVar dd)] --> Ty.realTy)), |
82 |
(* functions *) |
(* functions *) |
93 |
(N.fn_cos, ty([Ty.realTy] --> Ty.realTy)), |
(N.fn_cos, ty([Ty.realTy] --> Ty.realTy)), |
94 |
(N.fn_dot, allNK(fn tv => [tensor[Ty.NatVar tv]] |
(N.fn_dot, allNK(fn tv => [tensor[Ty.NatVar tv]] |
95 |
--> tensor[Ty.NatVar tv])), |
--> tensor[Ty.NatVar tv])), |
96 |
(* |
(N.fn_inside, all([NK, NK, SK], |
97 |
val fn_inside = Atom.atom "inside" |
fn [k, d, dd] => let |
98 |
*) |
val k = Ty.NatVar k |
99 |
|
val d = Ty.NatVar d |
100 |
|
val dd = Ty.ShapeVar dd |
101 |
|
in |
102 |
|
[Ty.T_Tensor(Ty.Shape[d]), field(k, d, dd)] |
103 |
|
--> Ty.T_Bool |
104 |
|
end)), |
105 |
(N.fn_load, all([NK, SK], |
(N.fn_load, all([NK, SK], |
106 |
fn [d, dd] => let |
fn [d, dd] => let |
107 |
val d = Ty.NatVar d |
val d = Ty.NatVar d |