[5] | 1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
---|
| 2 | <html xmlns="http://www.w3.org/1999/xhtml"> |
---|
| 3 | <head> |
---|
| 4 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
---|
| 5 | <meta http-equiv="Content-Style-Type" content="text/css" /> |
---|
| 6 | <meta name="generator" content="pandoc" /> |
---|
| 7 | <title></title> |
---|
| 8 | </head> |
---|
| 9 | <body> |
---|
| 10 | <h2 id="prerequisites">Prerequisites</h2> |
---|
[13] | 11 | <p>You need at least version 2011.4.0.0 of the Haskell platform, an installed <a href="http://research.microsoft.com/en-us/um/redmond/projects/z3/">Z3</a> and the packages <code>sbv</code> and <code>value-supply</code>. If you have a working Haskell platform installed you can install value-supply by typing</p> |
---|
| 12 | <pre><code>cabal install value-supply sbv</code></pre> |
---|
[5] | 13 | <h2 id="source-files">Source files</h2> |
---|
| 14 | <dl> |
---|
| 15 | <dt>Examples.hs</dt> |
---|
| 16 | <dd>Some examples |
---|
| 17 | </dd> |
---|
| 18 | <dt>SizedExp.hs</dt> |
---|
| 19 | <dd>Embedded language to prove size expressions |
---|
| 20 | </dd> |
---|
| 21 | <dt>Lambda.hs</dt> |
---|
| 22 | <dd>Size expressions |
---|
| 23 | </dd> |
---|
| 24 | <dt>Constraints.hs</dt> |
---|
| 25 | <dd>Constraint solver |
---|
| 26 | </dd> |
---|
| 27 | </dl> |
---|
| 28 | <h2 id="using-the-examples">Using the examples</h2> |
---|
[11] | 29 | <pre><code>$ ghci Examples.hs |
---|
[5] | 30 | GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help |
---|
| 31 | Loading package ghc-prim ... linking ... done. |
---|
| 32 | Loading package integer-gmp ... linking ... done. |
---|
| 33 | Loading package base ... linking ... done. |
---|
| 34 | Loading package ffi-1.0 ... linking ... done. |
---|
| 35 | [1 of 4] Compiling Lambda ( Lambda.hs, interpreted ) |
---|
| 36 | [2 of 4] Compiling Constraints ( Constraints.hs, interpreted ) |
---|
| 37 | [3 of 4] Compiling SizedExp ( SizedExp.hs, interpreted ) |
---|
| 38 | [4 of 4] Compiling Main ( Examples.hs, interpreted ) |
---|
| 39 | Ok, modules loaded: Lambda, SizedExp, Constraints, Main. |
---|
[11] | 40 | *Main></code></pre> |
---|
| 41 | <p>Type "<code>runTests</code>" to run all test cases or type "<code>prove map</code>" to prove the function named map.</p> |
---|
[5] | 42 | <h2 id="under-windows">Under Windows</h2> |
---|
| 43 | <p>It is not perfect, and you will see a box after every special character, but at least it works.</p> |
---|
| 44 | <ul> |
---|
| 45 | <li>Open a console by running the program <code>cmd</code></li> |
---|
| 46 | <li>Issue the command <code>chcp 65001</code></li> |
---|
| 47 | <li>In the console cd to the trunk directory</li> |
---|
| 48 | <li>Now, you can run <code>ghci Examples.hs</code></li> |
---|
| 49 | </ul> |
---|
| 50 | <h2 id="introduction-to-haskell-syntax">Introduction to Haskell syntax</h2> |
---|
| 51 | <p>Haskell syntax is very much like Clean, however there are some expressions you cannot find in Clean.</p> |
---|
| 52 | <h3 id="backtick">Backtick</h3> |
---|
| 53 | <p>Every haskell function can be used as infix operator. For example the following two expressions are the same.</p> |
---|
| 54 | <pre><code>func a b |
---|
| 55 | a `func` b</code></pre> |
---|
| 56 | <h3 id="dollar">Dollar</h3> |
---|
| 57 | <p>Dollar sign is just explicit application (but with different precedence), so it can be used as a backward pipe operator. The following expressions are the same.</p> |
---|
| 58 | <pre><code>func (a b) |
---|
| 59 | func $ a b</code></pre> |
---|
| 60 | <h2 id="the-embedded-language">The Embedded Language</h2> |
---|
| 61 | <p>As an example the function <code>map</code> is examined.</p> |
---|
| 62 | <pre><code>1 smap = Abs 5 $ AAbs 18 6 $ List (Var 18) (Abs 8$ App (Var 5) (App (Var 6) (Var 8))) |
---|
| 63 | 2 map :: (SizedExp se) => Size se ( (a->b) -> [a] -> [b] ) |
---|
| 64 | 3 map = bind smap body |
---|
| 65 | 4 where body f l = match l (nil) |
---|
| 66 | 5 ( \x xs -> cons `app` (f `app` x) `app` (map `app` f `app` xs ))</code></pre> |
---|
[11] | 67 | <p>Here line 3 tells us map is a top-level binding, where the body of the function is defined in line 4--5 and its size expression is in line 1. Unfortunately the size expression language has not yet been embedded, so it is a bit difficult to read. Type <code>smap</code> in the GHC console to get a pretty printed form.</p> |
---|
[5] | 68 | <pre><code>*Main> smap |
---|
| 69 | λf.Îs,g.List s (λi.f (g i))</code></pre> |
---|
| 70 | <p>The type of the function tells us the underlying type, ie. <code>(a->b) -> [a] -> [b]</code>.</p> |
---|
| 71 | <p>The body of map corresponds to the following expression</p> |
---|
| 72 | <pre><code>match l of |
---|
| 73 | nil -> nil |
---|
| 74 | cons x xs -> cons (f x) (map f xs)</code></pre> |
---|
| 75 | <p>In the embedded language <code>bind</code>, <code>match</code> and <code>app</code> are supercombinators.</p> |
---|
| 76 | <dl> |
---|
| 77 | <dt><code>bind sexp exp</code></dt> |
---|
| 78 | <dd><p>combines a size and an expression and creates a top-level binding</p> |
---|
| 79 | </dd> |
---|
| 80 | <dt><code>match list nilexp consexp</code></dt> |
---|
| 81 | <dd><p>embedding of the match operator of our language to haskell</p> |
---|
| 82 | </dd> |
---|
| 83 | <dt><code>app exp1 exp2</code></dt> |
---|
| 84 | <dd><p>embedding of the function application of our language to haskell</p> |
---|
| 85 | </dd> |
---|
| 86 | </dl> |
---|
[13] | 87 | <p>There is also a function called <code>true</code> to denote that we do not want to prove that branch.</p> |
---|
[5] | 88 | </body> |
---|
| 89 | </html> |
---|