I recently finished working my way through “Logical Foundations” by Pierce et al. and found myself wishing I had been exposed to a dependently-typed language like Coq much earlier. Logical Foundations covers a good chunk of what students might see in an intro discrete-math course, and would provide an excellent opportunity for students to gain hands-on experience with Curry-Howard, decidability, and stratified type systems.
There’s even a really nice jscoq version of Software Foundations so students wouldn’t need to worry about wrangling ugly Coq Makefiles.
There are many ways to embed sets in a type theory. For example, in a type theory such as Coq, one typically models sets as functions ‘T -> Prop’. This makes sets intensional too. For extensional sets, i.e. for which ‘forall S T, (forall x, S x = T x) -> S = T’, one needs additional axioms.
For an introduction to discrete mathematics it also makes sense to understand when a type is ‘discrete’: it must have a decidable equality. Intuitively, this means one can recognize whether any two elements of the type are identical. Often one also works with countable types for which one assumes it is possible to enumerate all its elements. The inductive data types one typically needs are all discrete and countable.
Interesting work in this direction: https://www.ps.uni-saarland.de/Publications/documents/ForsterEtAl_2019_VerifiedTMs.pdf