https://courses.grainger.illinois.edu/cs576/fa2021/maude-tapas.pdf