We have used OBJ3 in teaching a MSc course on the semantics of imperative programs at Oxford University. Click here for the original Oxford University syllabus. The book for this course, Algebraic Semantics of Imperative Programs, by Joseph Goguen and Grant Malcolm, is published by MIT Press, ISBN 0-262-07172-X.
Specific goals of this course include the following:
Our semantic approach gives an equational specification for a class of abstract machines and specifies programming language features by their effect on these machines. The features treated in the course are assignment, sequential composition, conditional, while-loop, procedure definition, and procedure call; we also give semantics for the array data structure and for programs that manipulate arrays. The equational axioms describing these features are used in proving program correctness.
Thus, this course both presents a rigorous semantics for imperative programs, and uses that semantics to prove properties of programs. Most comparable courses concentrate on one or the other of these aims, either presenting mathematical theories of semantics of programming languages, or presenting a logical calculus (such as Hoare-triples or weakest preconditions) and using this to prove properties of programs. In both cases, the course work is done on paper, since the semantics of programs and proofs of their properties are presented on paper.
By contrast, our Algebraic Semantics of Imperative Programs course uses an executable presentation of program semantics in OBJ3, an implemented specification language that can be used for theorem proving and rapid prototyping, and which itself has a formal semantics based on equational logic. OBJ is not just another functional programming language, although it does have an executable functional sublanguage. OBJ was designed for algebraic semantics; its declarations introduce symbols for sorts and functions, its statements are equations, and its computations are equational proofs. OBJ also has a sublanguage of "theories" for declaring properties. Thus, an OBJ "program" actually is an equational theory, and every OBJ computation actually proves some theorem about such a theory. This means that an OBJ program used for defining the semantics of a program already has a precise mathematical meaning. Moreover, standard techniques for mechanising equational reasoning can be used for verifying programs.
A detailed treatment of our use of OBJ in teching appears in An Executable Course in the Algebraic Semantics of Imperative Programs, by Joseph Goguen and Grant Malcolm, in Teaching and Learning Formal Methods, edited by Michael Hinchey and C. Nevill Dean, Academic Press, 1996, pages 161-179.
An algebraic treatment of non-determinism following the style of the course is given in a PRG technical report, Algebraic Semantics of Non-determinism by Grant Malcolm and Joseph Goguen.