You're reading the public-facing archive of the Category Theory Zulip server.
To join the server you need an invite. Anybody can get an invite by contacting Matteo Capucci at name dot surname at gmail dot com.
For all things related to this archive refer to the same person.
By which I mean a program running on a remote computer, usually communicating via web protocols, which you can ask for category-theoretic calculations, and which will return the results as data structures for the requesting computer to use, rather than for a human to read. I put a script onto my online category-theory demonstrator which makes it do this. It can be seen working at www.j-paine.org/lds/sheaves1/test_catserver.html . (Don't let your browser put an https:// in the URL, or it will fail.)
On this page, the final form requests a pullback and renders it locally; other forms request sets and functions to check that these features work. This is a proof of concept, but surely would be useful as a resource for examples for stuff like teaching and diagram generation.
Cool idea. Do you use an existing symbolic algebra engine on the back end?
Morgan Rogers (he/him) said:
Cool idea. Do you use an existing symbolic algebra engine on the back end?
No. I coded the algorithms in SWI-Prolog, based on Rydeheard and Burstall's Computational Category Theory. I originally used them in an experimental compiler for Joseph Goguen's sheaf semantics of concurrent interacting objects, and then repurposed them for the online demonstrator at http://www.j-paine.org/cgi-bin/webcats/webcats.php .
That's quite a big program, as you can see from the list of modules at the end. These include: a compiler that translates functional notation into predicates; sets and maps; objects and arrows; functors; code for randomly generating example sets and maps (vital to any good Truth Mine); error-checking for sets and maps as inputs; fundamental categorical constructions; another compiler for translating English text with embedded examples in into predicates that serve the text over the web; formatting for numbers, pairs, maplets, Unicode maths symbols, HTML elements and so on; colours, for colouring different components of compositions to be more intelligible; file naming for scratch files to hold GraphViz representations of diagrams, and also the images thereby generated; code for calling GraphViz itself; assorted stuff for translating URLs to filenames within the document root and back; the explanatory pages themselves, as predicates; some experimental stuff for demonstrating analogy and semiotics; more experimental stuff, unfinished, for Yoneda; a demo page I once posted to nLab; and a built-in SWI-Prolog library for converting to and from JSON. Outside Prolog, there are also some PHP scripts, the guestbook which I've still not had time to fix, a Ubuntu batch file for clearing up old images, and a .htaccess file for rewriting URLs to overcome the hosting company's server's odd ideas about MIME types.
The server I started this thread with uses most of the above except for the GraphViz stuff, server-side images, and explanatory pages, as those are rendered in the browser using HTML, CSS and JavaScript. I've got a slowly-growing collection of JavaScript files which draw images client-side in SVG for that. That's where the pullback diagram comes from.
And here's the full list of server-side SWI-Prolog modules. "Grips2" is the compiler from functional notation to predicates; wc_random generates the random sets and maps; set_arrows builds on a general object-and-arrow module to implement arrows in FiniteSet; set_specs and function_specs check sets and functions sent by the user; output and pet_runtime deal with formatting; most of the rest is categorical and obvious from its name. If I were calling a symbolic algebra engine, I'd need to implement a lot of this anyway, but I'd be interested to hear from anyone who has tried it.
:- use_module( functional(grips2) ).
:- use_module( general(errors) ).:- use_module( general(sets) ).
:- use_module( general(maps) ).:- use_module( webcats(set_arrows) ).
:- use_module( general(random) ).
:- use_module( webcats(wc_random) ).:- use_module( webcats(set_specs) ).
:- use_module( webcats(function_specs) ).:- use_module( webcats(set_prodcone) ).
:- use_module( webcats(set_coprodcone) ).
:- use_module( webcats(set_eqcone) ).
:- use_module( webcats(set_coeqcone) ).
:- use_module( webcats(set_iobj) ).
:- use_module( webcats(set_tobj) ).:- use_module( webcats(constant_map) ).
:- use_module( general(output) ).
:- use_module( pet(pet_runtime) ).
:- use_module( webcats(colours) ).
:- use_module( general(gen_timestamp) ).
:- use_module( webcats(page_bits) ).:- use_module( webcats(set_iobj_is_initial_and_universal_page) ).
:- use_module( webcats(set_tobj_is_terminal_and_universal_page) ).
:- use_module( webcats(set_prod_is_universal_page) ).
:- use_module( webcats(set_prod_is_nonunique_page) ).
:- use_module( webcats(set_prod_is_terminal_page) ).
:- use_module( webcats(set_prod_nlab_page) ).
:- use_module( webcats(set_coprod_is_universal_page) ).
:- use_module( webcats(set_eq_page) ).
:- use_module( webcats(set_coeq_page) ).
:- use_module( webcats(set_ternary_product_page) ).
:- use_module( webcats(set_ternary_coproduct_page) ).
:- use_module( webcats(set_pullback_page) ).
:- use_module( webcats(set_pushout_page) ).
:- use_module( webcats(set_limit_page) ).
:- use_module( webcats(set_colimit_page) ).
:- use_module( webcats(set_exp_is_universal_page) ).:- use_module(library(http/json)).
Wow! That is a big program!
My best suggestion is to encourage some students to play with it to see if it helps them find and understand examples.