hermit: Haskell Equational Reasoning Model-to-Implementation Tunnel

[ bsd3, formal-methods, language, library, optimization, program, refactoring, reflection, transformation ] [ Propose Tags ]

HERMIT uses Haskell to express semi-formal models, efficient implementations, and provide a bridging DSL to describe via stepwise refinement the connection between these models and implementations. The key transformation in the bridging DSL is the worker/wrapper transformation.

This is a pre-alpha `please give feedback' release. Shortcomings/gotchas include:

  • Command line completion is ad hoc at the moment.

  • Parser needs to be reimplemented with a parsing library.

  • log command prints linearly, even if command history is a tree.

  • The fold rewrite can only fold syntactically alpha-equivalent (up to parameters of the function you are folding) expressions.

  • RULES have issues with forall types.

  • Different core comes out depending on whether you ascribe explicit type signatures.

  • A number of rewrites don't enforce preconditions. ex: cast elimination always works, even if the cast is necessary

Examples can be found in the examples sub-directory.

$ cd examples/reverse

Example of running a script.

$ hermit Reverse.hs Reverse.hss resume
[starting HERMIT v0.1.6.0 on Reverse.hs]
% ghc Reverse.hs -fforce-recomp -O2 -dcore-lint -fsimple-list-literals -fplugin=HERMIT -fplugin-opt=HERMIT:main:Main: -fplugin-opt=HERMIT:main:Main:resume
[1 of 2] Compiling HList            ( HList.hs, HList.o )
Loading package ghc-prim ... linking ... done.
...
Loading package hermit-0.1.6.0 ... linking ... done.
[2 of 2] Compiling Main             ( Reverse.hs, Reverse.o )
Linking Reverse ...
$ ./Reverse
....

Example of interactive use.

$ hermit Reverse.hs
[starting HERMIT v0.1.6.0 on Reverse.hs]
% ghc Reverse.hs -fforce-recomp -O2 -dcore-lint -fsimple-list-literals -fplugin=HERMIT -fplugin-opt=HERMIT:main:Main:
[1 of 2] Compiling HList            ( HList.hs, HList.o )
Loading package ghc-prim ... linking ... done.
...
Loading package hermit-0.1.6.0 ... linking ... done.
[2 of 2] Compiling Main             ( Reverse.hs, Reverse.o )
module main:Main where
  rev ∷ ∀ a . [] a -> [] a
  unwrap ∷ ∀ a . ([] a -> [] a) -> [] a -> H a
  wrap ∷ ∀ a . ([] a -> H a) -> [] a -> [] a
  main ∷ IO ()
  main ∷ IO ()
hermit<0>
...

To resume compile, use resume.

...
hermit<0> resume
hermit<0> Linking Reverse ...
$

Modules

[Last Documentation]

  • HERMIT
  • Language
    • HERMIT
      • Language.HERMIT.Context
      • Language.HERMIT.Core
      • Language.HERMIT.Dictionary
      • Language.HERMIT.Expr
      • Language.HERMIT.External
      • Language.HERMIT.Interp
      • Language.HERMIT.Kernel
        • Language.HERMIT.Kernel.Scoped
      • Language.HERMIT.Kure
      • Language.HERMIT.Monad
      • Language.HERMIT.Plugin
      • Language.HERMIT.PrettyPrinter
        • Language.HERMIT.PrettyPrinter.AST
        • Language.HERMIT.PrettyPrinter.Clean
        • Language.HERMIT.PrettyPrinter.GHC
        • Language.HERMIT.PrettyPrinter.JSON
      • Primitive
        • Language.HERMIT.Primitive.AlphaConversion
        • Language.HERMIT.Primitive.Debug
        • Language.HERMIT.Primitive.FixPoint
        • Language.HERMIT.Primitive.Fold
        • Language.HERMIT.Primitive.GHC
        • Language.HERMIT.Primitive.Inline
        • Language.HERMIT.Primitive.Kure
        • Language.HERMIT.Primitive.Local
          • Language.HERMIT.Primitive.Local.Case
          • Language.HERMIT.Primitive.Local.Let
        • Language.HERMIT.Primitive.Navigation
        • Language.HERMIT.Primitive.New
        • Language.HERMIT.Primitive.Unfold
      • Shell
        • Language.HERMIT.Shell.Command

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.0, 0.1.1.0, 0.1.1.1, 0.1.2.0, 0.1.4.0, 0.1.6.0, 0.1.8.0, 0.2.0.0, 0.3.0.0, 0.3.1.0, 0.3.2.0, 0.4.0.0, 0.5.0.0, 0.6.0.0, 0.7.0.0, 0.7.1.0, 1.0.0.0, 1.0.1
Dependencies aeson (>=0.6.0.2), ansi-terminal (>=0.5.5), base (>=4 && <5), containers (>=0.5.0.0), data-default (>=0.5.0), directory (>=1.2.0.0), ghc (>=7.6 && <7.7), haskeline (>=0.7.0.3), kure (>=2.6.14 && <3.0), marked-pretty (>=0.1), mtl (>=2.1.2), process, stm (>=2.4), template-haskell (>=2.8.0.0), text (>=0.11.2.3) [details]
License BSD-3-Clause
Author Andrew Farmer, Andy Gill, Ed Komp, Neil Sculthorpe
Maintainer Andy Gill <andygill@ku.edu>
Revised Revision 1 made by AndrewFarmer at 2015-09-19T23:02:53Z
Category Language, Formal Methods, Optimization, Transformation, Refactoring, Reflection
Uploaded by AndrewFarmer at 2013-01-11T18:58:52Z
Distributions
Reverse Dependencies 2 direct, 0 indirect [details]
Executables hermit
Downloads 16829 total (30 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
All reported builds failed as of 2016-12-01 [all 7 reports]