The Design of a Practical Proof Checker for a Lazy Functional Language

  • Adam Procter
  • William L. Harrison
  • Aaron Stump
Part of the Lecture Notes in Computer Science book series (LNCS, volume 7829)


Pure, lazy functional languages like Haskell provide a sound basis for formal reasoning about programs in an equational style. In practice, however, equational reasoning about correctness proofs is underutilized. In the context of Haskell, we suggest that part of the reason for this is the lack of accessible tools for machine-checked equational reasoning. This paper outlines the design of MProver, a proof checker which fills just that niche. MProver features first-class support for reasoning about potentially undefined computations (particularly important in a lazy setting), and an extended notion of Haskell-like type classes, enabling a highly modular style of program verification that closely follows familiar functional programming idioms.


Type Class Proof Obligation Programming Fragment Proof Checker Reduction Semantic 
These keywords were added by machine and not by the authors. This process is experimental and the keywords may be updated as the learning algorithm improves.


Unable to display preview. Download preview PDF.

Unable to display preview. Download preview PDF.


  1. 1.
    The Coq development team: The Coq Proof Assistant Reference Manual. LogiCal Project, Version 8.3 (2010)Google Scholar
  2. 2.
    de Mol, M., van Eekelen, M., Plasmeijer, R.: Theorem Proving for Functional Programmers. In: Arts, T., Mohnen, M. (eds.) IFL 2002. LNCS, vol. 2312, pp. 55–71. Springer, Heidelberg (2002)CrossRefGoogle Scholar
  3. 3.
    Gibbons, J., Hinze, R.: Just do it: Simple monadic equational reasoning. In: ICFP (September 2011)Google Scholar
  4. 4.
    Peyton Jones, S. (ed.): Haskell 98 Language and Libraries, the Revised Report. Cambridge University Press (2003)Google Scholar
  5. 5.
    Giménez, C.E.: Un calcul de constructions infinies et son application a la verification de systemes communicants, Ph.D. thesis (1996)Google Scholar
  6. 6.
    Yorgey, B.: Typeclassopedia, (accessed May 31, 2012)
  7. 7.
    Stump, A., Deters, M., Petcher, A., Schiller, T., Simpson, T.: Verified Programming in Guru. In: PLPV 2008 (2008)Google Scholar
  8. 8.
    Benton, N., Kennedy, A., Varming, C.: Some Domain Theory and Denotational Semantics in Coq. In: Berghofer, S., Nipkow, T., Urban, C., Wenzel, M. (eds.) TPHOLs 2009. LNCS, vol. 5674, pp. 115–130. Springer, Heidelberg (2009)CrossRefGoogle Scholar
  9. 9.
    Nanevski, A., Morrisett, G., Shinnar, A., Govereau, P., Birkedal, L.: Ynot: Reasoning with the awkward squad. In: ICFP 2008 (2008)Google Scholar
  10. 10.
    Nanevski, A., Morrisett, G., Birkedal, L.: Hoare Type Theory, Polymorphism and Separation. J. Funct. Program. 18(5-6), 865–911 (2008)MathSciNetzbMATHCrossRefGoogle Scholar
  11. 11.
    van Kesteren, R., van Eekelen, M., de Mol, M.: Proof support for general type classes. In: TFP 2004, pp. 1–16 (2004)Google Scholar
  12. 12.
    van Eekelen, M., de Mol, M.: Proof tool support for explicit strictness. In: Butterfield, A., Grelck, C., Huch, F. (eds.) IFL 2005. LNCS, vol. 4015, pp. 37–54. Springer, Heidelberg (2006)CrossRefGoogle Scholar
  13. 13.
    Wadler, P., Blott, S.: How to make ad-hoc polymorphism less ad hoc. In: POPL 1989, pp. 60–76 (1989)Google Scholar
  14. 14.
    Sozeau, M., Oury, N.: First-class type classes. In: Mohamed, O.A., Muñoz, C., Tahar, S. (eds.) TPHOLs 2008. LNCS, vol. 5170, pp. 278–293. Springer, Heidelberg (2008)CrossRefGoogle Scholar
  15. 15.
    Huffman, B., Matthews, J., White, P.: Axiomatic constructor classes in Isabelle/HOLCF. In: Hurd, J., Melham, T. (eds.) TPHOLs 2005. LNCS, vol. 3603, pp. 147–162. Springer, Heidelberg (2005)CrossRefGoogle Scholar
  16. 16.
    Hallgren, T.: Haskell Tools from the Programatica Project. In: Haskell 2003, pp. 103–106 (2003)Google Scholar
  17. 17.
    Xu, D.N.: Extended static checking for Haskell. In: Haskell 2006, pp. 48–59 (2006)Google Scholar
  18. 18.
    Xu, D.N., Peyton Jones, S., Claessen, K.: Static contract checking for Haskell. In: POPL 2009, pp. 41–52 (2009)Google Scholar
  19. 19.
    Runciman, C., Naylor, M., Lindblad, F.: SmallCheck and Lazy SmallCheck: Automatic Exhaustive Testing for Small Values. In: Haskell 2008, pp. 37–48 (2008)Google Scholar
  20. 20.
    Claessen, K., Hughes, J.: QuickCheck: A Lightweight Tool for Random Testing of Haskell Programs. In: ICFP 2000, pp. 268–279 (2000)Google Scholar
  21. 21.
    Gill, A.: Introducing the Haskell Equational Reasoning Assistant. In: Haskell 2006, pp. 108–109 (2006)Google Scholar
  22. 22.
    Schröder, L., Mossakowski, T.: HasCasl: Integrated higher-order specification and program development. Theor. Comput. Sci. 410, 1217–1260 (2009)zbMATHCrossRefGoogle Scholar
  23. 23.
    Kieburtz, R.B.: P-logic: property verification for Haskell programs (2002)Google Scholar
  24. 24.
    Harrison, W.L., Kieburtz, R.B.: The Logic of Demand in Haskell. J. Funct. Program. 15, 837–891 (2005)MathSciNetzbMATHCrossRefGoogle Scholar
  25. 25.
    Howard, B.T.: Inductive, coinductive, and pointed types. In: ICFP 1996: Proceedings of the First ACM SIGPLAN International Conference on Functional Programming, pp. 102–109. ACM, New York (1996)CrossRefGoogle Scholar
  26. 26.
    Casinghino III, C., Eades, H.D., Kimmell, G., Sjoberg, V., Sheard, T., Stump, A., Weirich, S.: The preliminary design of the Trellys core language Talk and discussion session at PLPV 2011 (2011)Google Scholar
  27. 27.
    Norell, U.: Towards a practical programming language based on dependent type theory. Department of Computer Science and Engineering, Chalmers University of Technology (September 2007)Google Scholar

Copyright information

© Springer-Verlag Berlin Heidelberg 2013

Authors and Affiliations

  • Adam Procter
    • 1
  • William L. Harrison
    • 1
  • Aaron Stump
    • 2
  1. 1.Dept. of Computer ScienceUniversity of MissouriColumbiaUSA
  2. 2.Dept. of Computer ScienceUniversity of IowaIowa CityUSA

Personalised recommendations