use of catdata.fqlpp.TransExp.ToMap in project fql by CategoricalData.
the class PPParser method toTrans.
// : ** notation
private static TransExp toTrans(Object o) {
try {
Tuple5 t = (Tuple5) o;
if (t.a.toString().equals("apply")) {
FunctorExp f = toFtr(t.b);
if (t.d.toString().equals("arrow")) {
TransExp e = toTrans(t.e);
return new TransExp.Apply(f, e);
} else {
Tuple3 t3 = (Tuple3) t.e;
List<String> l = (List<String>) t3.a;
return new ApplyPath(f, l.remove(0), l, toCat(t3.c));
}
}
Tuple5 a = (Tuple5) t.c;
Tuple5 b = (Tuple5) t.e;
if (a.c.toString().equals("Set") && a.e.toString().equals("Set") && b.c.toString().equals("Set") && b.e.toString().equals("Set")) {
Tuple3 z = (Tuple3) ((org.jparsec.functors.Pair) t.a).b;
FunctorExp src = toFtr(a.a);
FunctorExp dst = toFtr(b.a);
String ob = z.a.toString();
FnExp fun = toFn(z.c);
return new SetSet(ob, fun, src, dst);
} else if (a.e.toString().equals("Set") && b.e.toString().equals("Set")) {
FunctorExp src = toFtr(a.a);
FunctorExp dst = toFtr(b.a);
List<Object> ob = (List<Object>) ((org.jparsec.functors.Pair) t.a).b;
Map<String, Chc<FnExp, SetExp>> fun = new HashMap<>();
for (Object ttt : ob) {
if (fun.containsKey(o)) {
throw new RuntimeException("Duplicate arrow: " + ttt + " in " + o);
}
Tuple3 u = (Tuple3) ttt;
String n = (String) u.a;
try {
fun.put(n, Chc.inLeft(toFn(u.c)));
} catch (Exception yyy) {
fun.put(n, Chc.inRight(toSet(u.c)));
}
}
return new ToSet(fun, src, dst);
} else if (a.e.toString().equals("Cat") && b.e.toString().equals("Cat")) {
FunctorExp src = toFtr(a.a);
FunctorExp dst = toFtr(b.a);
List<Object> ob = (List<Object>) ((org.jparsec.functors.Pair) t.a).b;
Map<String, FunctorExp> fun = new HashMap<>();
for (Object ttt : ob) {
if (fun.containsKey(o)) {
throw new RuntimeException("Duplicate arrow: " + ttt + " in " + o);
}
Tuple3 u = (Tuple3) ttt;
String n = (String) u.a;
fun.put(n, toFtr(u.c));
}
return new ToCat(fun, src, dst);
} else {
try {
FunctorExp src = toFtr(a.a);
FunctorExp dst = toFtr(b.a);
List<Object> ob = (List<Object>) ((org.jparsec.functors.Pair) t.a).b;
Map<String, TransExp> fun = new HashMap<>();
for (Object ttt : ob) {
if (fun.containsKey(o)) {
throw new RuntimeException("Duplicate arrow: " + ttt + " in " + o);
}
Tuple3 u = (Tuple3) ttt;
String n = (String) u.a;
fun.put(n, toTrans(u.c));
}
return new ToInst(fun, src, dst);
} catch (Exception ex) {
}
FunctorExp src = toFtr(a.a);
FunctorExp dst = toFtr(b.a);
List<Object> ob = (List<Object>) ((org.jparsec.functors.Pair) t.a).b;
Map<String, Pair<String, List<String>>> fun = new HashMap<>();
for (Object ttt : ob) {
if (fun.containsKey(o)) {
throw new RuntimeException("Duplicate arrow: " + ttt + " in " + o);
}
Tuple3 u = (Tuple3) ttt;
String n = (String) u.a;
List<String> l = (List<String>) u.c;
String ll = l.remove(0);
fun.put(n, new Pair<>(ll, l));
}
return new ToMap(fun, src, dst, toCat(a.c), toCat(a.e));
}
} catch (Exception re) {
}
try {
Tuple4 t = (Tuple4) o;
if (t.a.toString().equals("return") || t.a.toString().equals("coreturn")) {
return new Adj(t.a.toString(), t.b.toString(), t.c.toString(), toFtr(t.d));
} else if (t.a.toString().equals("left")) {
return new Whisker(true, toFtr(t.c), toTrans(t.d));
} else if (t.a.toString().equals("right")) {
return new Whisker(false, toFtr(t.c), toTrans(t.d));
} else if (t.a.toString().equals("APPLY")) {
return new PeterApply(t.d.toString(), toTrans(t.b));
} else {
return new ApplyTrans(toTrans(t.b), toFtr(t.d));
}
} catch (Exception re) {
}
try {
Tuple3 p = (Tuple3) o;
Object p2 = p.b;
Object p3 = p.c;
Object o1 = p.a;
if (p2.toString().equals(";")) {
return new TransExp.Comp(toTrans(o1), toTrans(p3));
} else if (o1.toString().equals("fst")) {
return new Proj(toFtr(p2), toFtr(p3), true);
} else if (o1.toString().equals("snd")) {
return new Proj(toFtr(p2), toFtr(p3), false);
} else if (o1.toString().equals("inl")) {
return new Inj(toFtr(p2), toFtr(p3), true);
} else if (o1.toString().equals("inr")) {
return new Inj(toFtr(p2), toFtr(p3), false);
} else if (o1.toString().equals("eval")) {
return new TransExp.Eval(toFtr(p2), toFtr(p3));
} else if (p2.toString().equals("*")) {
return new TransExp.Prod(toTrans(o1), toTrans(p3));
} else if (p2.toString().equals("+")) {
return new CoProd(toTrans(o1), toTrans(p3));
} else if (o1.toString().equals("iso1")) {
return new TransExp.Iso(true, toFtr(p2), toFtr(p3));
} else if (o1.toString().equals("iso2")) {
return new TransExp.Iso(false, toFtr(p2), toFtr(p3));
}
} catch (RuntimeException re) {
}
try {
org.jparsec.functors.Pair p = (org.jparsec.functors.Pair) o;
String p1 = p.a.toString();
Object p2 = p.b;
switch(p1) {
case "id":
return new TransExp.Id(toFtr(p2));
case "tt":
return new TransExp.One(toFtr(p2));
case "ff":
return new TransExp.Zero(toFtr(p2));
case "curry":
return new TransExp.Curry(toTrans(p2), true);
case "CURRY":
return new TransExp.Curry(toTrans(p2), false);
case "true":
return new Bool(true, toCat(p2));
case "false":
return new Bool(false, toCat(p2));
case "char":
return new Chr(toTrans(p2));
case "kernel":
return new Ker(toTrans(p2));
case "not":
case "and":
case "implies":
case "or":
return new AndOrNotImplies(p1, toCat(p2));
default:
break;
}
} catch (RuntimeException re) {
}
if (o instanceof String) {
return new TransExp.Var(o.toString());
}
throw new RuntimeException("Could not create transform from " + o);
}
use of catdata.fqlpp.TransExp.ToMap in project fql by CategoricalData.
the class CatOps method visit.
@Override
public Transform visit(FQLPPProgram env, ToMap e) {
Functor s = e.src.accept(env, this);
Functor t = e.dst.accept(env, this);
CatExp scat = resolve(env, e.s);
if (!(scat instanceof Const)) {
throw new RuntimeException("Source category of " + e + " is not a constant.");
}
// CatExp.Const scon = (CatExp.Const) scat;
CatExp tcat = resolve(env, e.t);
if (!(tcat instanceof Const)) {
throw new RuntimeException("Target category of " + e + " is not a constant.");
}
Const tcon = (Const) tcat;
// Signature ssig = new Signature(scon.nodes, scon.arrows, scon.eqs);
Signature<String, String> tsig = new Signature<>(tcon.nodes, tcon.arrows, tcon.eqs);
FUNCTION o = x -> {
Node n = (Node) x;
// Set src = (Set) s.applyO(n);
// Set dst = (Set) t.applyO(n);
Pair<String, List<String>> k = e.fun.get(n.name);
Signature<String, String>.Path fun = tsig.path(k.first, k.second);
// new Fn(src, dst, fun);
return fun;
};
return new Transform(s, t, o);
}
use of catdata.fqlpp.TransExp.ToMap in project fql by CategoricalData.
the class CatOps method toInstance.
private Pair<Category, Instance<String, String>> toInstance(FQLPPProgram env, InstConst ic) {
CatExp e = resolve(env, ic.sig);
if (!(e instanceof Const)) {
throw new RuntimeException("Can only create instances for finitely-presented categories.");
}
Const c = (Const) e;
Category src = c.accept(env, this);
Signature<String, String> sig = new Signature<>(c.nodes, c.arrows, c.eqs);
Map<Node, Set> nm = new HashMap<>();
for (String n0 : ic.nm.keySet()) {
Node n = sig.getNode(n0);
SetExp kkk = ic.nm.get(n.name);
if (kkk == null) {
throw new RuntimeException("Missing node mapping from " + n);
}
nm.put(n, kkk.accept(env, new SetOps(ENV)));
}
Map<Edge, Map> em = new HashMap<>();
for (String n0 : ic.em.keySet()) {
Edge n = sig.getEdge(n0);
Chc<FnExp, SetExp> chc = ic.em.get(n.name);
if (chc == null) {
throw new RuntimeException("Missing edge mapping from " + n);
}
if (chc.left) {
FnExp kkk = chc.l;
em.put(n, kkk.accept(env, new SetOps(ENV)).toMap());
} else {
SetExp sss = chc.r;
Set vvv = sss.accept(env, new SetOps(ENV));
Map<Object, Object> uuu = new HashMap<>();
for (Object o : vvv) {
if (!(o instanceof Pair)) {
throw new RuntimeException("Not a pair: " + o);
}
Pair oo = (Pair) o;
if (uuu.containsKey(oo.first)) {
throw new RuntimeException("Duplicate domain entry: " + o + " in " + ic);
}
uuu.put(oo.first, oo.second);
}
FnExp kkk = new FnExp.Const(uuu::get, ic.nm.get(n.source.name), ic.nm.get(n.target.name));
em.put(n, kkk.accept(env, new SetOps(ENV)).toMap());
}
}
return new Pair<>(src, new Instance(nm, em, sig));
}
Aggregations