// given a "biarrow" AxB --> C, check we can transpose it via the getExponentialDiagram @Test public void testExponential() { MultiArrow<DOT, ARROW> biArrow = fixtures.arrowFooBarToBaz(); List<ARROW> projections = biArrow.getProductDiagram().getProjections(); assertTrue(projections.size() == 2); DOT a = projections.get(0).getTarget(); DOT b = projections.get(1).getTarget(); DOT c = biArrow.getArrow().getTarget(); ExponentialDiagram<DOT, ARROW> exponential = _topos.getExponentialDiagram(c, b); // Check evaluation maps C^B x B -> C MultiArrow<DOT, ARROW> ev = exponential.getEvaluation(); List<ARROW> expProjections = ev.getProductDiagram().getProjections(); assertTrue(expProjections.size() == 2); assertTrue(expProjections.get(1).getTarget() == b); assertTrue(ev.getArrow().getTarget() == c); // and the universal property of evaluation ARROW transpose = exponential.getTranspose(biArrow); // check this maps A -> B^C assertTrue(transpose.getSource() == a); assertTrue( transpose.getTarget() == expProjections.get(0).getTarget()); // the exponent object itself // Next, construct the arrow: transpose x 1 : A x B -> C^B x B as the productGetDiagram of A x B // -> A -> C^B and A x B -> B -> B ARROW x1 = transpose.compose(projections.get(0)); ARROW x2 = projections.get(1); List<ARROW> multiplicands = new ArrayList<ARROW>(); multiplicands.add(x1); multiplicands.add(x2); ARROW t_x_1 = ev.getProductDiagram() .multiplyArrows(biArrow.getProductDiagram().getProduct(), multiplicands); assertTrue(biArrow.getArrow().equals(ev.getArrow().compose(t_x_1))); }
@Test public void testCanonicalExponentialIso() { DOT dot1 = fixtures.dotFoo(); DOT dot2 = fixtures.dotBar(); ExponentialDiagram<DOT, ARROW> expA = _topos.getExponentialDiagram(dot1, dot2); ExponentialDiagram<DOT, ARROW> expB = _topos.getExponentialDiagram(dot1, dot2); ARROW isoAB = _topos.canonicalIso(expA, expB); ARROW isoBA = _topos.canonicalIso(expB, expA); DOT dotA = exponentialDot(expA); DOT dotB = exponentialDot(expB); assertSame(isoAB.getSource(), dotA); assertSame(isoAB.getTarget(), dotB); assertSame(isoBA.getSource(), dotB); assertSame(isoBA.getTarget(), dotA); assertEquals(dotA.getIdentity(), isoBA.compose(isoAB)); assertEquals(dotB.getIdentity(), isoAB.compose(isoBA)); }