applications.collages.collageAlgebra:
{
  height = const(sqrt(3)/2),
  
  background = { filledPolygon((0,#height), (.5,0), (-.5,0)) },
  
  id = translate(0,0),
  
  mir = scale(-1,1),
  mir = <mir>,
  
  rot = rotate(120) . translate(.25, #height / 2),
  rot = <rot>,
  
  flip = rotate(180) . translate(0,#height),
  flip = <flip>,
  
  right = translate(.5,0),
  right = <id, right>,
  
  left = translate(-.5,0),
  left = <id, left>,
  
  up2 = use(left),
  up3 = use(right),
  up4 = translate(0,#height),
  up = <id, up2, up3, up4>,
  
  g2 = rotate(180),
  g3 = translate(-.5, -#height),
  g4 = translate(.5, -#height),
  lr = <id,g2,g3,g4>,
  l = <id,g2,g3>,
  r = <id,g2,g4>,
  
  rot180 = rotate(180),
  rot180 = <id, rot180>,
  
  p1 = {
        curve((-.37,0) right (0,.095),
                    (-.37 / sqrt(2), .37 / sqrt(2)) left (- .095 / sqrt(2), - .095 / sqrt(2))) width .095,
        curve((-.37,0) right (0,.095),
                    (-.37 / sqrt(2), .37 / sqrt(2)) left (-.095 / sqrt(2), - .095 / sqrt(2)))[1] width .05,
        curve((.37 / sqrt(2), .37 / sqrt(2)) right (-.095 / sqrt(2), .095 / sqrt(2)),
                    (0, .37) left (.095, 0)) width .095,
        curve((.37 / sqrt(2), .37 / sqrt(2)) right (-.095 / sqrt(2), .095 / sqrt(2)),
                    (0, .37) left (.095, 0))[1] width .05
       },
       
       p2 = {
        curve((.37 / sqrt(2), .37 / sqrt(2)) right (-.095 / sqrt(2), .095 / sqrt(2)),
                    (0, .37) left (.095, 0)) width .095,
        curve((.37 / sqrt(2), .37 / sqrt(2)) right (-.095 / sqrt(2), .095 / sqrt(2)),
                    (0, .37) left (.095, 0))[1] width .05,
         filledcurve((-.414,.05) left (0,0) right (0,.075),
                    (-.4175 / sqrt(2), .4175 / sqrt(2)) left (-.1 / sqrt(2), -.1 / sqrt(2)) right (0,0),
                    ((-.4175 + .095) / sqrt(2), (.4175 - .095) / sqrt(2))
                        left (0,0) right (-.095 / sqrt(2), -.095 / sqrt(2)),
                    (-.414 + .125 * cos(30), .05 + .125 / 2)
                    ),
         filledcurve((-.414 + .03 * cos(30),.05 + .03/2) left (0,0) right (0,.05),
                    ((-.4175 + .0225) / sqrt(2), (.4175 - .0225) / sqrt(2))
                        left (-.1 / sqrt(2), -.1 / sqrt(2)) right (0,0),
                    ((-.4175 + .095 - .0225) / sqrt(2), (.4175 - .095 + .0225) / sqrt(2))
                        left (0,0) right (-.105 / sqrt(2), -.105 / sqrt(2)),
                    (-.414 + (.125 - .03) * cos(30), .05 + (.125 - .03) / 2) left (0, .01)
                    )[1]
       },
  
  c2 = rotate(120) . translate(.25, #height / 2),
  c3 = rotate(240) . translate(-.25, #height / 2),
  c4 = scale(-1,1),
  c5 = scale(-1,1) . rotate(120) . translate(.25, #height / 2),
  c6 = scale(-1,1) . rotate(240) . translate(-.25, #height / 2),
  
  tile = #background +
    #p1 +
    #p1 transformed by c2 +
    #p1 transformed by c3 +
    #p1 transformed by c4 +
    #p1 transformed by c5 +
    #p1 transformed by c6,
  single = #background +
    #p1 +
    #p1 transformed by c2 +
    #p2 transformed by c3 +
    #p1 transformed by c4 +
    #p2 transformed by c5 +
    #p1 transformed by c6,
  double = #background +
    #p2 +
    #p2 transformed by c2 +
    #p1 transformed by c3 +
    #p2 transformed by c4 +
    #p1 transformed by c5 +
    #p2 transformed by c6,
  trinity = #background +
    #p2 +
    #p2 transformed by c2 +
    #p2 transformed by c3 +
    #p2 transformed by c4 +
    #p2 transformed by c5 +
    #p2 transformed by c6,
    
  nonterminal1 = {
    filledPolygon((0,0), (.5,#height), (-.5,#height))[.7,1,.7],
    polygon((0,0), (.5,#height), (-.5,#height))
  },
  nonterminal2 = {
    filledPolygon((0,#height), (.5,0), (-.5,0))[.7,.7,1],
    polygon((0,#height), (.5,0), (-.5,0))
  },
  S = #nonterminal2,
  S1 = #nonterminal1,
  S2 = #nonterminal2,
  A-L1 = #nonterminal1,
  A-L2 = #nonterminal2,
  A-R1 = #nonterminal1,
  A-R2 = #nonterminal2,
  AH-L2 = #nonterminal2,
  AH-R2 = #nonterminal2,
  BOT-L1 = #nonterminal1,
  BOT-L2 = #nonterminal2,
  BOT-R1 = #nonterminal1,
  BOT-R2 = #nonterminal2,
  L-WAIT1 = #nonterminal1,
  R-WAIT1 = #nonterminal1,
  L-WAIT2 = #nonterminal2,
  R-WAIT2 = #nonterminal2,
  L-WAIT-BOT0 = #nonterminal2,
  R-WAIT-BOT0 = #nonterminal2,
  L-WAIT-BOT1 = #nonterminal1,
  R-WAIT-BOT1 = #nonterminal1,
  L-WAIT-BOT2 = #nonterminal2,
  R-WAIT-BOT2 = #nonterminal2,
  H1 = #nonterminal1,
  H2 = #nonterminal2
}
