Welcome to Forge! Forge is a tool and language built for teaching introductory formal methods and modeling.
Forge is heavily adapted from the excellent Alloy, a more widely used and somewhat more scalable tool. Forge and Alloy even use the same engines! Forge adds a number of features designed to support teaching and learning, including:
- language levels, including froglet (
#lang froglet, previously
#lang forge/bsl) for starting out without using relational operators;
- partial instance bounds (
inst) for optimization and testing;
- ease of scriptability (Forge is a Racket library as well as a language, and has a REPL); and
- interaction modes designed for use in the classroom and on assignments.
Forge also uses Sterling, an expanded and scriptable visualizer.
The official Forge documentation can be found on the Wiki in this repo. Note that the documentation is a living document and work in progress; we will be updating it live as students and other users ask questions.
For broader historical context on Forge, the Alloy documentation or an Alloy demo may be useful. We don't suggest using these as reference for Forge itself, however.
To contribute, fork the repository (or open a new branch if a core contributor) and make your changes. When making a pull request back into main, please prepend the pull request title with one of
[major] so that the corresponding version number is updated. If no version update is specified, the minor version will be updated automatically.
Installation from source
To install from source, use the following commands. Make sure that you have Racket installed (any version should work, although we suggest the latest: 8.3), and the
raco package manager is in your path. You will also need Java installed (we suggest version 11 or later).
git clone https://github.com/tnelson/Forge cd Forge/forge raco pkg install
git pull the repo and run
raco setup forge.
Running on the development branch,
dev, requires only
checkout dev before installing; this may be unstable, however.