<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2844521419334459144</id><updated>2011-09-15T09:34:30.966-07:00</updated><category term='Infinity'/><category term='Strictly Positive Family'/><category term='Extraction'/><category term='Data.Dynamic'/><category term='lazy evalution'/><category term='model theory'/><category term='syntax-rules'/><category term='syntax coloring'/><category term='C'/><category term='Type inference'/><category term='solving'/><category term='RLE'/><category term='puzzle'/><category term='Parsing'/><category term='Prolog'/><category term='Diagonalization'/><category term='Embedded'/><category term='Cardinality'/><category term='prime'/><category term='Permutation'/><category term='NbE'/><category term='Countable'/><category term='Deprogramming'/><category term='correctness proof'/><category term='lights out'/><category term='semantics'/><category term='CIC'/><category term='Cantor'/><category term='dependently typed programming'/><category term='prime seive'/><category term='tail call optimization'/><category term='Pattern Matching'/><category term='XOR'/><category term='let-syntax'/><category term='heap'/><category term='java'/><category term='CHR'/><category term='Coq'/><category term='BNF'/><category term='Monads'/><category term='Ackermann'/><category term='Generate and Test'/><category term='Well Founded Relation'/><category term='badger'/><category term='pigeonhole principle'/><category term='constraint logic programming'/><category term='constraint programming'/><category term='dependent destruct'/><category term='zipper'/><category term='beta'/><category term='tauto'/><category term='Haskell'/><category term='DCG'/><category term='interpreter'/><category term='algebra'/><category term='irritated'/><category term='Magic Square'/><category term='Quest for Chunks'/><category term='Specification'/><category term='Hoare Logic'/><category term='Curry-Howard'/><category term='single constructor inductives'/><category term='Gödel'/><category term='Parser combinators'/><category term='Shift/Reset'/><category term='compiler'/><category term='lazy evaluation'/><category term='recursion'/><category term='correctness'/><category term='Subexpression elimination'/><category term='Fin'/><category term='Variadic'/><category term='Inducitive Families'/><category term='Universes'/><category term='inhabitants'/><category term='differentation'/><category term='EDSL'/><category term='Delimeted Continuations'/><category term='ALGOL'/><category term='metatheory'/><category term='run length encoding'/><category term='Lisp'/><category term='Programming'/><category term='Type Theory'/><category term='STLC'/><category term='foldl'/><category term='type checking'/><category term='EBNF'/><category term='GADT'/><category term='Group'/><category term='Semigroup'/><category term='decidable equality'/><category term='show instance'/><category term='Agda 2'/><category term='Lambda Calculus'/><category term='SET'/><category term='eta'/><category term='Scheme'/><category term='foldr'/><category term='declarative'/><category term='Chunks'/><category term='zeta'/><category term='ltac'/><category term='counting'/><category term='HOAS'/><category term='type checker'/><category term='Induction'/><category term='Induction-Recursion'/><category term='PTS'/><category term='mutation'/><category term='SK'/><category term='stack'/><category term='NoConfusion'/><category term='Huffman'/><category term='Dependent Types'/><category term='GADT nonsense'/><category term='CPS'/><category term='pure type systems'/><category term='Beta Function'/><title type='text'>Muad`Dib</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>65</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-1268917011399416729</id><published>2010-03-29T10:36:00.000-07:00</published><updated>2010-03-29T10:49:27.064-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zeta'/><title type='text'>Some sums</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/1_%E2%88%92_1_%2B_1_%E2%88%92_1_%2B_%C2%B7_%C2%B7_%C2%B7"&gt;1 − 1 + 1 − 1 + ...&lt;/a&gt; = 1/2&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/1_%2B_1_%2B_1_%2B_1_%2B_%C2%B7_%C2%B7_%C2%B7"&gt;1 + 1 + 1 + 1 + ..&lt;/a&gt;. = -1/2&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%C2%B7_%C2%B7_%C2%B7"&gt;1 + 2 + 3 + 4 + ...&lt;/a&gt; = -1/12&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/1_%2B_2_%2B_4_%2B_8_%2B_%C2%B7_%C2%B7_%C2%B7"&gt;1 + 2 + 4 + 8 + ...&lt;/a&gt; = -1&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/1_%E2%88%92_2_%2B_4_%E2%88%92_8_%2B_%C2%B7_%C2%B7_%C2%B7"&gt;1 − 2 + 4 − 8 + ...&lt;/a&gt; = 1/3&lt;br /&gt;&lt;br /&gt;1 * 2 * 3 * 4 * ... = sqrt(2*pi)&lt;br /&gt;&lt;br /&gt;2 * 3 * 5 * 7 * ... = 4*pi^2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-1268917011399416729?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/1268917011399416729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=1268917011399416729' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/1268917011399416729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/1268917011399416729'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2010/03/some-sums.html' title='Some sums'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-6886078177644541800</id><published>2010-03-16T12:52:00.000-07:00</published><updated>2010-03-16T12:58:57.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zipper'/><category scheme='http://www.blogger.com/atom/ns#' term='differentation'/><category scheme='http://www.blogger.com/atom/ns#' term='counting'/><title type='text'>Why is the derivative of a type a zipper</title><content type='html'>Why is &lt;a href="www.cs.nott.ac.uk/~ctm/diff.pdf"&gt;the derivative of a regular type its type of one-hole contexts&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Let us define a function that counts the elements of a type, |()| = 1, |Void| = 0, |Either x y| = |x|+|y|, |(x,y)|=|x|*|y|, |List A| = 0 + |A| + |A|^2 + |A|^3 + ... (because lists can be [], [a], [a,b], and so on)&lt;br /&gt;&lt;br /&gt;In general the 'size' of any type can be written as a power series (like an infinite polynomial), now for the type |k|*|x|^3, if we punch a hole in it, we get |k|*|x|^2 but we could have picked one of 3 different places to put it so we need to say which one, this gives 3*|k|*|x|^2, and this should be done to every term of a power series.&lt;br /&gt;&lt;br /&gt;Since the derivative of a type = the derivative of its powerseries* this explains why we can 'differentiate' a type and get a zipper. (At least it sort of makes sense).&lt;br /&gt;&lt;br /&gt;(* why is this true?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-6886078177644541800?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/6886078177644541800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=6886078177644541800' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6886078177644541800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6886078177644541800'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2010/03/why-is-derivative-of-type-zipper.html' title='Why is the derivative of a type a zipper'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5288380546361747839</id><published>2010-03-07T16:33:00.000-08:00</published><updated>2010-03-10T06:55:12.991-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algebra'/><title type='text'>Algebra System</title><content type='html'>I have made a start on this already, &lt;a href="http://github.com/odge/al-jabr"&gt;al-jabr&lt;/a&gt;. Really what I am doing here is just getting my toes wet - What I want to do is:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Algebra hierarchy -- build up monoids, groups, fields etc and develop the basic theory of these structures also give concrete implementations of things like integers, reals (isomorphisms with efficient representations would be nice too!)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Algebraic algorithms -- produce algorithms that can be used to help me do mathematics (e.g. factoring, transformations, solving classes of equations)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Wiki -- Dependently typed programming in the large has already been done, they came up with FTA and FTC -- this is a constructive proof that it works!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;There are some projects already working on this kind of thing, &lt;a href="http://c-corn.cs.ru.nl/"&gt;http://c-corn.cs.ru.nl/&lt;/a&gt;, &lt;a href="http://github.com/Eelis/new-alg-hierarchy"&gt;http://github.com/Eelis/new-alg-hierarchy&lt;/a&gt;, &lt;a href="http://www.lix.polytechnique.fr/coq/contribs/Algebra.html"&gt;http://www.lix.polytechnique.fr/coq/contribs/Algebra.html&lt;/a&gt;, &lt;a href="http://hlombardi.free.fr/liens/constr.html"&gt;http://hlombardi.free.fr/liens/constr.html&lt;/a&gt;, &lt;a href="http://www.lix.polytechnique.fr/~assia/rech-eng.html"&gt;http://www.lix.polytechnique.fr/~assia/rech-eng.html&lt;/a&gt;, &lt;span style="font-weight:bold;"&gt;help make this list bigger!&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ignoring these would be so dammed stupid I am not even going to think about it, but I want to point out that unless we make the most use of these projects as is possible then anything we create will be an anti-social library that nobody can use except me -- that is not desirable.&lt;br /&gt;&lt;br /&gt;I think the only way to get this done is by collaborating with other people in a formally checked wiki (&lt;a href="http://www.vdash.org/"&gt;http://www.vdash.org/&lt;/a&gt;, &lt;a href="http://code.google.com/p/hol-online/"&gt;http://code.google.com/p/hol-online/&lt;/a&gt;, &lt;a href="http://prover.cs.ru.nl/login.php"&gt;http://prover.cs.ru.nl/login.php&lt;/a&gt;, &lt;a href="http://www.cs.ru.nl/~herman/afstud.html"&gt;http://www.cs.ru.nl/~herman/afstud.html&lt;/a&gt;, &lt;span style="font-weight:bold;"&gt;more?&lt;/span&gt;). These projects are all 'beta' that don't let everyone get involved so that's not very useful. Lets write it in &lt;a href="http://www.impredicative.com/ur/"&gt;Ur&lt;/a&gt; perhaps, using Coq as a subprocess. The directory structure of the Coq libraries would reflect that of the wiki. Edits will be accepted if they are checked and correct. I think once you have a spinal chord implemented, people will be able to add on parts quite easily.&lt;br /&gt;&lt;br /&gt;I see no reason why someone with a bit of time wouldn't pick up Disquisitiones Arithmeticae or whatever and fold it into the wiki. With a bit of work getting everything set up correctly I think we could make a useful (basic) algebra system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5288380546361747839?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5288380546361747839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5288380546361747839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5288380546361747839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5288380546361747839'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2010/03/algebra-system.html' title='Algebra System'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-7970909688394210090</id><published>2010-02-08T09:04:00.000-08:00</published><updated>2010-02-08T09:08:08.339-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='constraint programming'/><category scheme='http://www.blogger.com/atom/ns#' term='declarative'/><category scheme='http://www.blogger.com/atom/ns#' term='Prolog'/><title type='text'>LU Decomposition in Prolog</title><content type='html'>&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;:- use_module(library(clpr)).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;// various obvious bits of matrix machinary.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;lu_decompose(M, L*U) :-&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;dimensions(M,N*N),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;dimensions(L,N*N),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;dimensions(U,N*N),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;lower(L),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;upper(U),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;matrix_multiply(L,U,M).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-7970909688394210090?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/7970909688394210090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=7970909688394210090' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/7970909688394210090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/7970909688394210090'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2010/02/lu-decomposition-in-prolog.html' title='LU Decomposition in Prolog'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-1708012132571297287</id><published>2009-12-24T16:47:00.000-08:00</published><updated>2009-12-24T17:51:56.814-08:00</updated><title type='text'>ZFC's probably inconsistent</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bAHr4ffKZu8/SzQapDFnCCI/AAAAAAAAABQ/zTa7SH6hQjs/s1600-h/busatheist.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 235px;" src="http://2.bp.blogspot.com/_bAHr4ffKZu8/SzQapDFnCCI/AAAAAAAAABQ/zTa7SH6hQjs/s320/busatheist.jpg" alt="" id="BLOGGER_PHOTO_ID_5418985544139343906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now stop worrying and enjoy your life.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-1708012132571297287?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/1708012132571297287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=1708012132571297287' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/1708012132571297287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/1708012132571297287'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/12/zfcs-probably-inconsistent.html' title='ZFC&apos;s probably inconsistent'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_bAHr4ffKZu8/SzQapDFnCCI/AAAAAAAAABQ/zTa7SH6hQjs/s72-c/busatheist.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-8646285162691816321</id><published>2009-11-29T18:44:00.000-08:00</published><updated>2009-11-29T18:45:13.488-08:00</updated><title type='text'>Nice books</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bAHr4ffKZu8/SxMxkvHEGuI/AAAAAAAAAAU/lcyWNAR3mik/s1600/DSCF1481.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_bAHr4ffKZu8/SxMxkvHEGuI/AAAAAAAAAAU/lcyWNAR3mik/s320/DSCF1481.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5409722084593244898" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-8646285162691816321?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/8646285162691816321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=8646285162691816321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8646285162691816321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8646285162691816321'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/11/nice-books.html' title='Nice books'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bAHr4ffKZu8/SxMxkvHEGuI/AAAAAAAAAAU/lcyWNAR3mik/s72-c/DSCF1481.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-4575988935105571029</id><published>2009-10-27T11:42:00.000-07:00</published><updated>2009-10-27T11:43:09.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cantor'/><category scheme='http://www.blogger.com/atom/ns#' term='Diagonalization'/><category scheme='http://www.blogger.com/atom/ns#' term='Cardinality'/><title type='text'>Cantors Diagonalization Proof in Coq</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;b&lt;/span&gt; : (nat -&amp;gt; nat) -&amp;gt; nat.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;b'&lt;/span&gt; : nat -&amp;gt; (nat -&amp;gt; nat).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;bijection&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;f&lt;/span&gt;, b' (b f) = f.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;bijection'&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt;, b (b' x) = x.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;Stream&lt;/span&gt; A := nat -&amp;gt; A.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;Map&lt;/span&gt; {A B} (&lt;span class="coq-variable-name"&gt;f&lt;/span&gt; : A -&amp;gt; B) : Stream A -&amp;gt; Stream B :=&lt;br /&gt;  &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;sa&lt;/span&gt; =&amp;gt;&lt;br /&gt;    &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;i&lt;/span&gt; =&amp;gt;&lt;br /&gt;      f (sa i).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;l&lt;/span&gt; : Stream (nat -&amp;gt; nat) -&amp;gt; Stream nat :=&lt;br /&gt;  Map b.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;l'&lt;/span&gt; : Stream nat -&amp;gt; Stream (nat -&amp;gt; nat) :=&lt;br /&gt;  Map b'.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;isnt&lt;/span&gt; x :=&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; x &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;    | O =&amp;gt; S O&lt;br /&gt;    | S _ =&amp;gt; O&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;isn't_isnt&lt;/span&gt; {x} : isnt x &amp;lt;&amp;gt; x.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; x; &lt;span class="coq-coq-solve-tactics"&gt;discriminate&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;Diagonal&lt;/span&gt; {A} (&lt;span class="coq-variable-name"&gt;s&lt;/span&gt; : Stream (Stream A)) : Stream A:=&lt;br /&gt;  &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;i&lt;/span&gt; =&amp;gt; s i i.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;Diagonalization&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;sequences&lt;/span&gt; : Stream (nat -&amp;gt; nat)) : Stream nat :=&lt;br /&gt;  Map isnt (Diagonal sequences).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;isn't_in&lt;/span&gt; {sequences} : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;i&lt;/span&gt;, Diagonalization sequences &amp;lt;&amp;gt; sequences i.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;pose&lt;/span&gt; (f_equal (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;f&lt;/span&gt; =&amp;gt; f i) H) &lt;span class="coq-type"&gt;as&lt;/span&gt; H'.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; Diagonalization &lt;span class="coq-type"&gt;in&lt;/span&gt; H'.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; Diagonal &lt;span class="coq-type"&gt;in&lt;/span&gt; H'.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; Map &lt;span class="coq-type"&gt;in&lt;/span&gt; H'.&lt;br /&gt;revert H'.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; isn't_isnt.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;pink_elephant&lt;/span&gt; : Stream nat := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;i&lt;/span&gt; =&amp;gt; i.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;sequence_enumeration&lt;/span&gt; : Stream (nat -&amp;gt; nat) := l' pink_elephant.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;every_sequence&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;s&lt;/span&gt;, &lt;span class="coq-proof-tactics-name"&gt;exists&lt;/span&gt; i, s = sequence_enumeration i.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; s; &lt;span class="coq-proof-tactics-name"&gt;exists&lt;/span&gt; (b s).&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; sequence_enumeration.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; pink_elephant.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; l'.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; Map.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; bijection.&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;Cantor&lt;/span&gt; : &lt;span class="coq-type"&gt;False&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (every_sequence (Diagonalization sequence_enumeration)) &lt;span class="coq-type"&gt;as&lt;/span&gt; [i iPrf].&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;pose&lt;/span&gt; (@isn't_in sequence_enumeration i).&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;contradiction&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-4575988935105571029?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/4575988935105571029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=4575988935105571029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/4575988935105571029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/4575988935105571029'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/10/cantors-diagonalization-proof-in-coq.html' title='Cantors Diagonalization Proof in Coq'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5292914651105073815</id><published>2009-10-24T19:04:00.000-07:00</published><updated>2009-10-24T19:21:18.115-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metatheory'/><category scheme='http://www.blogger.com/atom/ns#' term='semantics'/><category scheme='http://www.blogger.com/atom/ns#' term='CIC'/><category scheme='http://www.blogger.com/atom/ns#' term='SK'/><category scheme='http://www.blogger.com/atom/ns#' term='model theory'/><category scheme='http://www.blogger.com/atom/ns#' term='Coq'/><title type='text'>Short Note on Semantics</title><content type='html'>&lt;p&gt;With all curious derivations that come from the forests of To Mock a Mockingbird, and in the intrests of deepening understanding of type theory (in particular CIC) we considered axiomatizing the SK calculus in Coq.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="coq-keyword"&gt;Module Type&lt;/span&gt; &lt;span class="coq-function-name"&gt;SK&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; axiomatization of the theory &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Parameter&lt;/span&gt; &lt;span class="coq-variable-name"&gt;SK&lt;/span&gt; : &lt;span class="coq-type"&gt;Set&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Parameter&lt;/span&gt; &lt;span class="coq-variable-name"&gt;app&lt;/span&gt; : SK -&amp;gt; SK -&amp;gt; SK.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Infix&lt;/span&gt; &lt;span class="coq-string"&gt;"*"&lt;/span&gt; := app.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Parameter&lt;/span&gt; &lt;span class="coq-variable-name"&gt;S&lt;/span&gt; : SK.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Parameter&lt;/span&gt; &lt;span class="coq-variable-name"&gt;K&lt;/span&gt; : SK.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;S_prop&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;a b c&lt;/span&gt;, S * a * b * c = (a * c) * (b * c).&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;K_prop&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;a b&lt;/span&gt;, K * a * b = a.&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; SK.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;It is not defined as an inductive type (as you might usually do) because there is no normal form for SK that we can compute terms into inside Coq (we would have to equate diverging terms with an "omega" symbol for a start, which is well known to be a partial operation). It would be possible to use a non-normal forma and quotient it out with a special (undecidable) equivalence relation, but we do not this.. Instead the axioms of the theory are given, One immediately notices that there is a trivial model of these axioms:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="coq-keyword"&gt;Module&lt;/span&gt; &lt;span class="coq-function-name"&gt;SK_trivial_model&lt;/span&gt; : SK.&lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; one model (giving non-contradiction of the theory) &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;SK&lt;/span&gt; := unit.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;app&lt;/span&gt; := &lt;span class="coq-type"&gt;fun&lt;/span&gt; (_ _ : unit) =&amp;gt; tt.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Infix&lt;/span&gt; &lt;span class="coq-string"&gt;"*"&lt;/span&gt; := app.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;S&lt;/span&gt; := tt.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;K&lt;/span&gt; := tt.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;S_prop&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;a b c&lt;/span&gt;, S * a * b * c = (a * c) * (b * c).&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;K_prop&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;a b&lt;/span&gt;, K * a * b = a.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; a; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; SK_trivial_model.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;(This implementation mostly serves to show the syntax and so on of how to construct a model of a theory inside Coq).&lt;br /&gt;&lt;br /&gt;Anyway, we eliminate trivial models by saying that S &lt;&gt; K.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  &lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;SK_prop&lt;/span&gt; : S &amp;lt;&amp;gt; K.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;We could now develop the theory of combinator calculus, prove things like S &lt;&gt; I and so forth.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="coq-keyword"&gt;Module&lt;/span&gt; &lt;span class="coq-function-name"&gt;SK_theory&lt;/span&gt; &amp;lt;: SK.&lt;br /&gt;  Include &lt;span class="coq-type"&gt;Type&lt;/span&gt; SK.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; Development of the theory of SK calculus, valid for all models &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;sk&lt;/span&gt; := &lt;span class="coq-proof-tacticals-name"&gt;repeat&lt;/span&gt; (&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; S_prop || &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; K_prop).&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;I&lt;/span&gt; := S * K * S.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;I_prop&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt;, I * x = x.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; I; sk; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;ski&lt;/span&gt; := &lt;span class="coq-proof-tacticals-name"&gt;repeat&lt;/span&gt; (sk || &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; I_prop).&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;IK&lt;/span&gt; : I &amp;lt;&amp;gt; K.&lt;br /&gt;    &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;F&lt;/span&gt; x y b := b * K * I * x * y.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; Eq; &lt;span class="coq-proof-tactics-name"&gt;generalize&lt;/span&gt; (f_equal (F K S) Eq); &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; F; ski.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; SK_prop.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;U&lt;/span&gt; := S * I * I.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;U_prop&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt;, U * x = x * x.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; U; ski; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;skiu&lt;/span&gt; := &lt;span class="coq-proof-tacticals-name"&gt;repeat&lt;/span&gt; (ski; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; U_prop).&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; SK_theory.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As fun as that would be, I don't believe you could ever reach a contradiction by assuming the SK theory. Yet no model exists inside Coq!&lt;br /&gt;&lt;br /&gt;This is a rather confusing and troubling state, but &lt;a href="http://r6.ca/"&gt;Russell O'Connor&lt;/a&gt; mentioned to me the possibility of giving an interpretation of CIC into a theory that has a Halting-Oracle and that solves it! This is surely a valid interpretation of CIC, it's just got this SK theory added in with the usual stuff - the halting oracle would be used to normalize SK terms and prove satisfy our theory. So despite the non-existence of a model of SK inside Coq: It appears we can reason about &lt;b&gt;the&lt;/b&gt; SK calculus directly. (Rather than a halting oracle you might have considered a special equivalence relation being interpreted for the congruence of SK objects but lets pretend Coq has Axiom K so that need not be considered).&lt;br /&gt;&lt;br /&gt;This is all very interesting to me because it seems to suggest mathematics existing outside of the formal theory we work in or study. Something I never believed in - It's not completely clear if this is profound or if I am just going soft.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5292914651105073815?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5292914651105073815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5292914651105073815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5292914651105073815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5292914651105073815'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/10/short-note-on-semantics.html' title='Short Note on Semantics'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5035767921890020752</id><published>2009-08-25T13:07:00.000-07:00</published><updated>2009-08-25T13:08:29.585-07:00</updated><title type='text'>Do you live in UK?</title><content type='html'>&lt;a href="http://www.pirateparty.org.uk/"&gt;http://www.pirateparty.org.uk/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5035767921890020752?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5035767921890020752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5035767921890020752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5035767921890020752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5035767921890020752'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/08/do-you-like-in-uk.html' title='Do you live in UK?'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-2642761624901752167</id><published>2009-04-26T10:11:00.000-07:00</published><updated>2009-04-26T10:59:31.773-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monads'/><category scheme='http://www.blogger.com/atom/ns#' term='dependently typed programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Hoare Logic'/><category scheme='http://www.blogger.com/atom/ns#' term='constraint logic programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Parsing'/><category scheme='http://www.blogger.com/atom/ns#' term='Parser combinators'/><category scheme='http://www.blogger.com/atom/ns#' term='Coq'/><title type='text'>Strongly Specified Parser Combinators</title><content type='html'>Following the approach Wouter Swierstra used for &lt;a href="http://www.cse.chalmers.se/~wouter/Publications/HoareStateMonad.pdf"&gt;Hoare State Monad&lt;/a&gt;, we define a Parser monad with pre and post conditions that express soundness (but not completeness) of the parser.&lt;br /&gt;&lt;br /&gt;The computational aspect of it is the same old parser monad, type Parser s a = [s] -&gt; [(s, [a])], which takes a list of tokens [s] to a (possibly empty) list (here is where backtracking/nondeterminism comes into it) of parses paired with the rest of the text. It's a monad and also a monad plus.&lt;br /&gt;&lt;br /&gt;On the specification end, we can put a precondition on the input string (for example, you might say the input length is &lt;= some value, for ensuring termination of a recursive parser) and also a post condition comparing the input with the parsed value and the remaining output.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Definition Pre := list s -&gt; Prop.&lt;br /&gt;  Definition Post (t : Set) := list s -&gt; t -&gt; list s -&gt; Prop.&lt;br /&gt;  &lt;br /&gt;  Program Definition Parser (pre : Pre) (t : Set) (post : Post t) : Set :=&lt;br /&gt;      forall i : { t : list s | pre t }, list ({ (x, r) : t * list s | post i x r }).&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;in Haskell we might define:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;m &gt;&gt;= f = \i -&gt; concatMap (uncurry f) (m i)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And in Coq, using Program we have roughly the same thing. Except that one has to apply a 'noncomputational_map' to fudge the proofs paired up with the list elements.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Program Definition Bind (a b : Set) P1 P2 Q1 Q2&lt;br /&gt;    (m : Parser P1 a Q1)&lt;br /&gt;    (f : (forall x : a, Parser (P2 x) b (Q2 x))) :&lt;br /&gt;    Parser (fun i =&gt; P1 i /\ forall x o, Q1 i x o -&gt; P2 x o)&lt;br /&gt;           b&lt;br /&gt;           (fun i x' o' =&gt; exists x o, Q1 i x o /\ Q2 x o x' o') :=&lt;br /&gt;    fun i =&gt; @flat_map ({ (x, o) : a * list s | Q1 i x o }) _&lt;br /&gt;      (fun xo =&gt; match xo with (x,o) =&gt; noncomputational_map _ _ _ _ (f x o) end)&lt;br /&gt;      (m i).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Seeing as noncomputational map doesn't do anything, we prove a theorem expressing that as justification for extracting it out as the identity function (rather it being equivalent to map id traversing the whole list).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Theorem noncomputational_map_identity :&lt;br /&gt;    forall l,&lt;br /&gt;      map (@proj1_sig _ _) l = map (@proj1_sig _ _) (noncomputational_map l).&lt;br /&gt;  &lt;br /&gt;  Extract Inlined Constant noncomputational_map =&gt; "id".&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Another nice parser combinator is the fixed point of a parser:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Program Definition Fix t {P Q} :&lt;br /&gt;    (forall i : { t : list s | P t },&lt;br /&gt;      Parser (fun i' =&gt; length i' &lt; length i /\ P i') t Q -&gt;&lt;br /&gt;      list ({ (x, o) : t * list s | Q i x o })) -&gt;&lt;br /&gt;    Parser P t Q :=&lt;br /&gt;    fun Rec =&gt;&lt;br /&gt;      well_founded_induction&lt;br /&gt;        (well_founded_ltof ({ i : list s | P i }) (fun i =&gt; length i))&lt;br /&gt;        (fun i =&gt; list ({ (x, o) : t * list s | Q i x o }))&lt;br /&gt;        (fun x Rec' =&gt; Rec x (fun i =&gt; Rec' i _)).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It packages up well founded recursion on the size of the input string, so that any non-left recursive parsers should be easily defined.&lt;br /&gt;&lt;br /&gt;Enough of the heavy machinary! A simple example of putting thing into work now:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &amp;lt;par&amp;gt; ::= &amp;lt;epsilon&amp;gt; | '(' &amp;lt;par&amp;gt; ')' &amp;lt;par&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To parse this we define a type of tokens and abstract syntax of parsing derivations - then relate them with a function:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Inductive token := open | close.&lt;br /&gt;  Inductive par := epsilon : par | wrappend : par -&gt; par -&gt; par.&lt;br /&gt;&lt;br /&gt;  Fixpoint print (p : par) : list token :=&lt;br /&gt;    match p with&lt;br /&gt;      | epsilon =&gt; nil&lt;br /&gt;      | wrappend m n =&gt; (open::nil) ++ print m ++ (close::nil) ++ print n&lt;br /&gt;    end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now Program lets us define the par parser as the fixed point of the sum of epsilon and wrapped recursions:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Program Definition par_parser : Parser token (fun _ =&gt; True) par (fun x p y =&gt; x = print p ++ y /\ length y &lt;= length x) :=&lt;br /&gt;    Fix token par (fun i parRec =&gt;&lt;br /&gt;      Plus _ _ (fun i' =&gt; i = i') _&lt;br /&gt;        (fudge_pre_and_post_conditions _ _ _&lt;br /&gt;          (Return epsilon))&lt;br /&gt;        (fudge_pre_and_post_conditions _ _ _&lt;br /&gt;          (Symbol token eq_token_dec open &gt;&gt;= fun _ =&gt;&lt;br /&gt;           parRec &gt;&gt;= fun m =&gt;&lt;br /&gt;           Symbol token eq_token_dec close &gt;&gt;= fun _ =&gt;&lt;br /&gt;           parRec &gt;&gt;= fun n =&gt;&lt;br /&gt;           Return (wrappend m n)))&lt;br /&gt;      i).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here are the actual scripts &lt;a href="http://github.com/odge/parseq/tree/master"&gt;http://github.com/odge/parseq/tree/master&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-2642761624901752167?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/2642761624901752167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=2642761624901752167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2642761624901752167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2642761624901752167'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/04/strongly-specified-parser-combinators.html' title='Strongly Specified Parser Combinators'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-3868001917375936390</id><published>2009-03-27T06:23:00.000-07:00</published><updated>2009-03-27T06:24:44.981-07:00</updated><title type='text'>Type Checker</title><content type='html'>prototype&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Control.Monad&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Control.Monad.Error&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Control.Monad.Identity&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Data.Maybe&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Data.Char&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Text.ParserCombinators.ReadP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Proof irrelevance is implemented by:&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;erase(Gamma) |- phi : P&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;----------------------- Prf&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;Gamma |- []phi : Prf(P)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;[]phi =def []psi : Prf(_)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Allow eliminations like P(x) -&amp;gt; Prf(x = y) -&amp;gt; P(y)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;along the same schema as Coqs Prop sort, this gives us Axiom K.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;* I am not a number: I am a free variable&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;* Verifying a Semantic beta-eta-Conversion Test for Martin-L&amp;#246;f Type Theory&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;* Intensionality, extensionality, and proof irrelevance in modal type theory&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Syntax&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;type&lt;/span&gt; &lt;span class="haskelltype"&gt;Ref&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Int&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;newtype&lt;/span&gt; &lt;span class="haskelltype"&gt;Scope&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Scope&lt;/span&gt; a&lt;br /&gt; &lt;span class="haskellkeyword"&gt;deriving&lt;/span&gt; &lt;span class="haskelltype"&gt;Show&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;Name&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Local&lt;/span&gt; &lt;span class="haskelltype"&gt;Ref&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskelltype"&gt;String&lt;/span&gt;&lt;br /&gt;   &lt;span class="haskellkeyword"&gt;deriving&lt;/span&gt; (&lt;span class="haskelltype"&gt;Eq&lt;/span&gt;, &lt;span class="haskelltype"&gt;Show&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Type&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Pi&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt; (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt;)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Prf&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Lam&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt; (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt;)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Square&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;App&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Def&lt;/span&gt; &lt;span class="haskelltype"&gt;String&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Bound&lt;/span&gt; &lt;span class="haskelltype"&gt;Ref&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Free&lt;/span&gt; &lt;span class="haskelltype"&gt;Name&lt;/span&gt;&lt;br /&gt;   &lt;span class="haskellkeyword"&gt;deriving&lt;/span&gt; &lt;span class="haskelltype"&gt;Show&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstract&lt;/span&gt; x expr &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Scope&lt;/span&gt; (rip 0 expr) &lt;span class="haskellkeyword"&gt;where&lt;/span&gt;&lt;br /&gt; rip i &lt;span class="haskelltype"&gt;Type&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Type&lt;/span&gt;&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; tau (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; sigma)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Pi&lt;/span&gt; (rip i tau) (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; (rip (i&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) sigma))&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;Prf&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Prf&lt;/span&gt; (rip i p)&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;Lam&lt;/span&gt; tau (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; sigma)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Lam&lt;/span&gt; (rip i tau) (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; (rip (i&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) sigma))&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;Square&lt;/span&gt; s) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Square&lt;/span&gt; (rip i s)&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;App&lt;/span&gt; m n) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;App&lt;/span&gt; (rip i m) (rip i n)&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;Def&lt;/span&gt; d) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Def&lt;/span&gt; d&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;Bound&lt;/span&gt; j) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Bound&lt;/span&gt; j&lt;br /&gt; rip i (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; j)&lt;br /&gt;  &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;==&lt;/span&gt; j &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Bound&lt;/span&gt; i&lt;br /&gt;  &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; otherwise &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Free&lt;/span&gt; j&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;instantiate&lt;/span&gt; y (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; expr) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; shove 0 expr &lt;span class="haskellkeyword"&gt;where&lt;/span&gt;&lt;br /&gt; shove i &lt;span class="haskelltype"&gt;Type&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Type&lt;/span&gt;&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; tau (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; sigma)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Pi&lt;/span&gt; (shove i tau) (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; (shove (i&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) sigma))&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;Prf&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Prf&lt;/span&gt; (shove i p)&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;Lam&lt;/span&gt; tau (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; sigma)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Lam&lt;/span&gt; (shove i tau) (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; (shove (i&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) sigma))&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;Square&lt;/span&gt; s) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Square&lt;/span&gt; (shove i s)&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;App&lt;/span&gt; m n) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;App&lt;/span&gt; (shove i m) (shove i n)&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;Def&lt;/span&gt; d) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Def&lt;/span&gt; d&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;Bound&lt;/span&gt; j)&lt;br /&gt;  &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; i &lt;span class="haskellvariable-name"&gt;==&lt;/span&gt; j &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; y&lt;br /&gt;  &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; otherwise &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Bound&lt;/span&gt; j&lt;br /&gt; shove i (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; j) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Free&lt;/span&gt; j&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Parsing&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;/\(x:T),x&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Prf(P)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;\(x:T),x&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;[]P&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;T T&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;x&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;parseTerm&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; readP_to_S pTerm&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pTerm&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; pPi &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pLam &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; skipSpaces &lt;span class="haskellvariable-name"&gt;&amp;gt;&amp;gt;&lt;/span&gt; pSimpleUnit ; as &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; many (skipSpaces &lt;span class="haskellvariable-name"&gt;&amp;gt;&amp;gt;&lt;/span&gt; pUnit) ; skipSpaces ; return (foldl1 &lt;span class="haskelltype"&gt;App&lt;/span&gt; (a&lt;span class="haskelltype"&gt;:&lt;/span&gt;as))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pUnit&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; pType &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pPi &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pPrf &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pLam &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pSquare &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pFree &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; parens pTerm&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pSimpleUnit&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; pType &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pPrf &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pSquare &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; pFree &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; parens pTerm&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; string &lt;span class="haskellstring"&gt;"*"&lt;/span&gt; ; return &lt;span class="haskelltype"&gt;Type&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pPi&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; string &lt;span class="haskellstring"&gt;"/\\"&lt;/span&gt; ; (x, t) &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; binder ; string &lt;span class="haskellstring"&gt;","&lt;/span&gt; ; b &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; pTerm ; return (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; t (abstract x b))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pPrf&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; string &lt;span class="haskellstring"&gt;"Prf"&lt;/span&gt; ; m &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; parens pTerm ; return (&lt;span class="haskelltype"&gt;Prf&lt;/span&gt; m)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pLam&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; string &lt;span class="haskellstring"&gt;"\\"&lt;/span&gt; ; (x, t) &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; binder ; string &lt;span class="haskellstring"&gt;","&lt;/span&gt; ; b &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; pTerm ; return (&lt;span class="haskelltype"&gt;Lam&lt;/span&gt; t (abstract x b))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pSquare&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; string &lt;span class="haskellstring"&gt;"[]"&lt;/span&gt; ; m &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; pTerm ; return (&lt;span class="haskelltype"&gt;Square&lt;/span&gt; m)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;pFree&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; name ; guard (a &lt;span class="haskellvariable-name"&gt;/=&lt;/span&gt; &lt;span class="haskellstring"&gt;"Prf"&lt;/span&gt;) ; return (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; a))&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;name&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; munch1 isAlpha&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;binder&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; b &lt;span class="haskellvariable-name"&gt;+++&lt;/span&gt; parens b &lt;span class="haskellkeyword"&gt;where&lt;/span&gt;&lt;br /&gt; b &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; name ; string &lt;span class="haskellstring"&gt;":"&lt;/span&gt; ; x &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; pTerm ; return (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; a,x)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;parens&lt;/span&gt; p &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; string &lt;span class="haskellstring"&gt;"("&lt;/span&gt; ; r &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; p ; string &lt;span class="haskellstring"&gt;")"&lt;/span&gt; ; return r&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;bug 1:       (\x:*,\y:*,x y)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;parses as: (\x:*,(\y:*,(x y)))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--          &lt;/span&gt;&lt;span class="haskellcomment"&gt;or: (\x:*,(\y:*,x) y)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--          &lt;/span&gt;&lt;span class="haskellcomment"&gt;or: ((\x:*,\y:*,x) y)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;fix: introduced 'simple' units and changed pTerm&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--      &lt;/span&gt;&lt;span class="haskellcomment"&gt;from being applications of [unit unit ...] to [simpleUnit unit ...]&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Typing&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt; (&lt;span class="haskelltype"&gt;V&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskelltype"&gt;V&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;VSquare&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; &lt;span class="haskelltype"&gt;N&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;N&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;NApp&lt;/span&gt; &lt;span class="haskelltype"&gt;N&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;NFree&lt;/span&gt; &lt;span class="haskelltype"&gt;Name&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskelltype"&gt;VLam&lt;/span&gt; f &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; f x&lt;br /&gt;&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; n &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NApp&lt;/span&gt; n x)&lt;br /&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellfunction-name"&gt;%&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; error &lt;span class="haskellstring"&gt;"Malformed application"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi &lt;span class="haskelltype"&gt;Type&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; tau (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; sigma)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (eval delta xi tau) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; eval (x&lt;span class="haskelltype"&gt;:&lt;/span&gt;delta) xi sigma)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;Prf&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; (eval delta xi p)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;Lam&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; f)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; eval (x&lt;span class="haskelltype"&gt;:&lt;/span&gt;delta) xi f)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;Square&lt;/span&gt; s) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VSquare&lt;/span&gt; (eval delta xi s)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;App&lt;/span&gt; m n) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; eval delta xi m &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; eval delta xi n&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;Def&lt;/span&gt; d) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; fromJust (lookup d xi)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;Bound&lt;/span&gt; i) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; delta &lt;span class="haskellvariable-name"&gt;!!&lt;/span&gt; i&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eval&lt;/span&gt; delta xi (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; j) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; j)&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;quote&lt;/span&gt; q &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Type&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;quote&lt;/span&gt; q (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; tau sigmaF) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Pi&lt;/span&gt; (quote q tau) (abstract (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q) (quote (q&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) (sigmaF (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q))))))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;quote&lt;/span&gt; q (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Prf&lt;/span&gt; (quote q p)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;quote&lt;/span&gt; q (&lt;span class="haskelltype"&gt;VLam&lt;/span&gt; f) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Lam&lt;/span&gt; &lt;span class="haskelltype"&gt;Type&lt;/span&gt; (abstract (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q) (quote (q&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) (f (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q))))))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;quote&lt;/span&gt; q (&lt;span class="haskelltype"&gt;VSquare&lt;/span&gt; s) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Square&lt;/span&gt; (quote q s)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;quote&lt;/span&gt; q (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; n) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; nquote q n&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;nquote&lt;/span&gt; q (&lt;span class="haskelltype"&gt;NApp&lt;/span&gt; n v) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;App&lt;/span&gt; (nquote q n) (quote q v)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;nquote&lt;/span&gt; q (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; j) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Free&lt;/span&gt; j&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractV&lt;/span&gt; i &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractV&lt;/span&gt; i (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; tau sigmaF) o &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (abstractV i tau o) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;e &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; abstractV i (sigmaF e) o)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractV&lt;/span&gt; i (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p) x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; (abstractV i p x)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractV&lt;/span&gt; i (&lt;span class="haskelltype"&gt;VLam&lt;/span&gt; sigmaF) o &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;e &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; abstractV i (sigmaF e) o)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractV&lt;/span&gt; i (&lt;span class="haskelltype"&gt;VSquare&lt;/span&gt; s) x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VSquare&lt;/span&gt; (abstractV i s x)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractV&lt;/span&gt; i (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; n) x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; abstractN i n x&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractN&lt;/span&gt; i (&lt;span class="haskelltype"&gt;NApp&lt;/span&gt; n m) x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; abstractN i n x &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; abstractV i m x&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;abstractN&lt;/span&gt; i (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; j) x&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; i &lt;span class="haskellvariable-name"&gt;==&lt;/span&gt; j &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; x&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; otherwise &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; j)&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;type&lt;/span&gt; &lt;span class="haskelltype"&gt;Infer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;ErrorT&lt;/span&gt; &lt;span class="haskelltype"&gt;String&lt;/span&gt; &lt;span class="haskelltype"&gt;Identity&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;runInfer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;Infer&lt;/span&gt; o &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Either&lt;/span&gt; &lt;span class="haskelltype"&gt;String&lt;/span&gt; o&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;runInfer&lt;/span&gt; m &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; runIdentity (runErrorT m)&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;conv&lt;/span&gt; q gamma &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;conv&lt;/span&gt; q gamma (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; tau sigmaF) (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; tau' sigmaF') &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; conv q gamma tau tau' &lt;span class="haskellvariable-name"&gt;&amp;amp;&amp;amp;&lt;/span&gt; conv (q&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) ((&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q, tau)&lt;span class="haskelltype"&gt;:&lt;/span&gt;gamma) (sigmaF x) (sigmaF' x) &lt;span class="haskellkeyword"&gt;where&lt;/span&gt;&lt;br /&gt;  x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;conv&lt;/span&gt; q gamma (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p) (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p') &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; conv q gamma p p'&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;conv&lt;/span&gt; q gamma (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; n) (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; m) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; maybe &lt;span class="haskelltype"&gt;False&lt;/span&gt; (const &lt;span class="haskelltype"&gt;True&lt;/span&gt;) (convN q gamma n m)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;conv&lt;/span&gt; q gamma &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;False&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;convV&lt;/span&gt; q gamma f g (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; tau sigmaF) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; convV (q&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) ((&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q, tau)&lt;span class="haskelltype"&gt;:&lt;/span&gt;gamma) (f &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x) (g &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x) (sigmaF x)&lt;br /&gt; &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;convV&lt;/span&gt; q gamma &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;convV&lt;/span&gt; q gamma (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; n) (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; m) &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; maybe &lt;span class="haskelltype"&gt;False&lt;/span&gt; (const &lt;span class="haskelltype"&gt;True&lt;/span&gt;) (convN q gamma n m)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;convV&lt;/span&gt; q gamma t s &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; conv q gamma t s&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;convN&lt;/span&gt; q gamma (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; i) (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; j)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; i &lt;span class="haskellvariable-name"&gt;==&lt;/span&gt; j &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; lookup i gamma&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;convN&lt;/span&gt; q gamma (&lt;span class="haskelltype"&gt;NApp&lt;/span&gt; f x) (&lt;span class="haskelltype"&gt;NApp&lt;/span&gt; g y) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; tau sigmaF &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; convN q gamma f g&lt;br /&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; convV q gamma x y tau &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;  &lt;span class="haskelltype"&gt;True&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Just&lt;/span&gt; (sigmaF x)&lt;br /&gt;  &lt;span class="haskelltype"&gt;False&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;convN&lt;/span&gt; q gamma n m &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; (convN q gamma n n, convN q gamma m m) &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;  (&lt;span class="haskelltype"&gt;Just&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p), &lt;span class="haskelltype"&gt;Just&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p')) &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; conv q gamma (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p) (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p') &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Just&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p)&lt;br /&gt;  &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;erase&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; map (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;(q,tau) &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; (q,eraseV tau))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eraseV&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; eraseV p&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eraseV&lt;/span&gt; sigma &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; sigma&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;Ref&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; [(&lt;span class="haskelltype"&gt;Name&lt;/span&gt;, &lt;span class="haskelltype"&gt;V&lt;/span&gt;)] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; [(&lt;span class="haskelltype"&gt;String&lt;/span&gt;, &lt;span class="haskelltype"&gt;V&lt;/span&gt;)] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;T&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Infer&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi &lt;span class="haskelltype"&gt;Type&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; return &lt;span class="haskelltype"&gt;VType&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; tau scopeSigma) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer q gamma xi tau&lt;br /&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer (q&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) ((&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q, &lt;span class="haskelltype"&gt;VType&lt;/span&gt;)&lt;span class="haskelltype"&gt;:&lt;/span&gt;gamma) xi (instantiate (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q)) scopeSigma)&lt;br /&gt; return &lt;span class="haskelltype"&gt;VType&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;Prf&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer q gamma xi p&lt;br /&gt; return &lt;span class="haskelltype"&gt;VType&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;Lam&lt;/span&gt; tau scopeM) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer q gamma xi tau&lt;br /&gt; tau' &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; return &lt;span class="haskellvariable-name"&gt;$&lt;/span&gt; eval &lt;span class="haskelltype"&gt;[]&lt;/span&gt; xi tau&lt;br /&gt; sigmaF &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer (q&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) ((&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q, tau')&lt;span class="haskelltype"&gt;:&lt;/span&gt;gamma) xi (instantiate (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q)) scopeM)&lt;br /&gt; pi &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; return &lt;span class="haskellvariable-name"&gt;$&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; tau' (abstractV (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; q) sigmaF)&lt;br /&gt; return pi&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;Square&lt;/span&gt; s) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; p &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer q (erase gamma) xi s &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;How do local definitions relate to erasure?&lt;br /&gt;&lt;/span&gt; return (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; p)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;App&lt;/span&gt; m n) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; pi &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer q gamma xi m&lt;br /&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; pi &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;  &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; sigma tauF &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt;   sigma' &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; infer q gamma xi n&lt;br /&gt;   &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; conv q gamma sigma sigma' &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;    &lt;span class="haskelltype"&gt;True&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; return (tauF (eval &lt;span class="haskelltype"&gt;[]&lt;/span&gt; xi n))&lt;br /&gt;    &lt;span class="haskelltype"&gt;False&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; throwError (unlines [ &lt;span class="haskellstring"&gt;"Type error in application: "&lt;/span&gt;&lt;br /&gt;                                 , &lt;span class="haskellstring"&gt;" expected: "&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;++&lt;/span&gt; show (quote q sigma)&lt;br /&gt;                                 , &lt;span class="haskellstring"&gt;" received: "&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;++&lt;/span&gt; show (quote q sigma')&lt;br /&gt;                                 ])&lt;br /&gt;  &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; throwError &lt;span class="haskellstring"&gt;"Nonfunctional application"&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;Def&lt;/span&gt; d) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; infer q gamma xi (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; d))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;Bound&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; throwError &lt;span class="haskellstring"&gt;"Encountered a bound variable"&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;infer&lt;/span&gt; q gamma xi (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; j) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; lookup j gamma &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;  &lt;span class="haskelltype"&gt;Just&lt;/span&gt; tau &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; return tau&lt;br /&gt;  &lt;span class="haskelltype"&gt;Nothing&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; j &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;   &lt;span class="haskelltype"&gt;Local&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; throwError &lt;span class="haskellstring"&gt;"Free local variable"&lt;/span&gt;&lt;br /&gt;   &lt;span class="haskelltype"&gt;Global&lt;/span&gt; j &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; throwError (&lt;span class="haskellstring"&gt;"Free global variable: "&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;++&lt;/span&gt; j)&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;inferType&lt;/span&gt; gamma xi t &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; runInfer (infer q gamma xi t) &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;  &lt;span class="haskelltype"&gt;Left&lt;/span&gt; err &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Left&lt;/span&gt; err&lt;br /&gt;  &lt;span class="haskelltype"&gt;Right&lt;/span&gt; tau &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Right&lt;/span&gt; (quote q tau)&lt;br /&gt; &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; q &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; length gamma &lt;span class="haskellvariable-name"&gt;+&lt;/span&gt; 1&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;checkType&lt;/span&gt; gamma xi t tau &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; runInfer (infer q gamma xi t) &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;  &lt;span class="haskelltype"&gt;Left&lt;/span&gt; err &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Left&lt;/span&gt; err&lt;br /&gt;  &lt;span class="haskelltype"&gt;Right&lt;/span&gt; tau' &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Right&lt;/span&gt; (conv q gamma tau tau')&lt;br /&gt; &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; q &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; length gamma &lt;span class="haskellvariable-name"&gt;+&lt;/span&gt; 1&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi &lt;span class="haskelltype"&gt;Type&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Type&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; t (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; b)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Pi&lt;/span&gt; (unstickDefinitions xi t) (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; (unstickDefinitions xi b))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Prf&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Prf&lt;/span&gt; (unstickDefinitions xi p)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Lam&lt;/span&gt; t (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; b)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Lam&lt;/span&gt; (unstickDefinitions xi t) (&lt;span class="haskelltype"&gt;Scope&lt;/span&gt; (unstickDefinitions xi b))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Square&lt;/span&gt; p) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Square&lt;/span&gt; (unstickDefinitions xi p)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;App&lt;/span&gt; m n) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;App&lt;/span&gt; (unstickDefinitions xi m) (unstickDefinitions xi n)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Def&lt;/span&gt; d) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Def&lt;/span&gt; d&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Bound&lt;/span&gt; j) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Bound&lt;/span&gt; j&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; j)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Local&lt;/span&gt; j)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unstickDefinitions&lt;/span&gt; xi (&lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; g)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; lookup g xi &lt;span class="haskellkeyword"&gt;of&lt;/span&gt; &lt;br /&gt;  &lt;span class="haskelltype"&gt;Nothing&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Free&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; g)&lt;br /&gt;  &lt;span class="haskelltype"&gt;Just&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Def&lt;/span&gt; g&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;TODO: that was silly, find a sensible fold for T&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;User interfacing&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;repl&lt;/span&gt; gamma xi &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; putStr &lt;span class="haskellstring"&gt;"&amp;gt; "&lt;/span&gt;&lt;br /&gt; line &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; getLine&lt;br /&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; parseTerm line &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;  &lt;span class="haskelltype"&gt;[]&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; putStrLn &lt;span class="haskellstring"&gt;"No parse"&lt;/span&gt;&lt;br /&gt;  [(t,&lt;span class="haskellstring"&gt;""&lt;/span&gt;)] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellkeyword"&gt;case&lt;/span&gt; inferType gamma xi (unstickDefinitions xi t) &lt;span class="haskellkeyword"&gt;of&lt;/span&gt;&lt;br /&gt;                &lt;span class="haskelltype"&gt;Left&lt;/span&gt; err &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; putStrLn err&lt;br /&gt;                &lt;span class="haskelltype"&gt;Right&lt;/span&gt; ty &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; print ty&lt;br /&gt;  [(&lt;span class="haskellkeyword"&gt;_&lt;/span&gt;,stuff)] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; putStrLn (&lt;span class="haskellstring"&gt;"extra stuff at end of line: "&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;++&lt;/span&gt; stuff)&lt;br /&gt;  ambiguous &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; putStrLn (&lt;span class="haskellstring"&gt;"ambiguous parse: "&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;++&lt;/span&gt; show (length ambiguous) &lt;span class="haskellvariable-name"&gt;++&lt;/span&gt; &lt;span class="haskellstring"&gt;" alternatives"&lt;/span&gt;)&lt;br /&gt; repl gamma xi&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Examples/Toys&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;nat : *; Z : nat; S : nat -&amp;gt; nat&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellfunction-name"&gt;nat&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; [ (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;, &lt;span class="haskelltype"&gt;VType&lt;/span&gt;)&lt;br /&gt; , (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"Z"&lt;/span&gt;, zType)&lt;br /&gt; , (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"S"&lt;/span&gt;, sType)&lt;br /&gt; , (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"natElim"&lt;/span&gt;, natElimType)&lt;br /&gt; ]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;natDefs&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; [ (&lt;span class="haskellstring"&gt;"natElim"&lt;/span&gt;, natElimV)&lt;br /&gt; ]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;zType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;sType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;))) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;)))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;natElimType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (nfree &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;)) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt;)) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;p &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt;               &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;forall P : nat -&amp;gt; Type,&lt;br /&gt;&lt;/span&gt;               &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (nfree &lt;span class="haskellstring"&gt;"Z"&lt;/span&gt;))) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt;                               &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;P 0 -&amp;gt;&lt;br /&gt;&lt;/span&gt;                &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (nfree &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;)) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;n &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt;                              &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;(forall n : nat,&lt;br /&gt;&lt;/span&gt;                         &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; n) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; (p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (nfree &lt;span class="haskellstring"&gt;"S"&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; n))))) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;P n -&amp;gt; P (S n)) -&amp;gt;&lt;br /&gt;&lt;/span&gt;                 &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (nfree &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;)) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;n &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; n))))                          &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;forall n : nat, P n&lt;br /&gt;&lt;/span&gt; &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; nfree &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;NFree&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;.&lt;/span&gt; &lt;span class="haskelltype"&gt;Global&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;natElimV&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;motive &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;zero &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;succ &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;n &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; natElim motive zero succ n))))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;natElim&lt;/span&gt; motive zero succ (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"Z"&lt;/span&gt;))) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; zero&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;natElim&lt;/span&gt; motive zero succ (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NApp&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"S"&lt;/span&gt;)) m)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; succ &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; m &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; natElim motive zero succ m&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;natElim&lt;/span&gt; motive zero succ stuck &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"natElim"&lt;/span&gt;)) &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; motive &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; zero &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; succ &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; stuck&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;add : Pi (Free (Global "nat")) (Scope (Pi (Free (Global "nat")) (Scope (Free (Global "nat")))))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--  &lt;/span&gt;&lt;span class="haskellcomment"&gt;:= (\(x:nat),\(y:nat),natElim (\(n:nat),nat) x (\(T:nat),S) y)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellfunction-name"&gt;add&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; [ (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"add"&lt;/span&gt;, addType)&lt;br /&gt; ]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;addDefs&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; [ (&lt;span class="haskellstring"&gt;"add"&lt;/span&gt;, addValue)&lt;br /&gt; ]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;addType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;))) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;br /&gt;           &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;))) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;br /&gt;            &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;))))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;addValue&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;y &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;  natElimV &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; (&lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"nat"&lt;/span&gt;)))) &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; y &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; (&lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"S"&lt;/span&gt;)))) &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x))&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;eq : /\T:*, T -&amp;gt; T -&amp;gt; *; refl : /\T:*,/\t:T, eq T t t&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellfunction-name"&gt;eq&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; [ (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"eq"&lt;/span&gt;, &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; t (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; t (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt;))))&lt;br /&gt; , (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"refl"&lt;/span&gt;, reflType)&lt;br /&gt; , (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"eqElim"&lt;/span&gt;, eqElimType)&lt;br /&gt; , (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"eqPrfElim"&lt;/span&gt;, eqPrfElimType) &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;eq has only one constructor so allow Proof eliminations&lt;br /&gt;&lt;/span&gt; ]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqDefs&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt;&lt;br /&gt; [ (&lt;span class="haskellstring"&gt;"eqElim"&lt;/span&gt;, eqElimV)&lt;br /&gt; , (&lt;span class="haskellstring"&gt;"eqPrfElim"&lt;/span&gt;, eqElimV)&lt;br /&gt; ]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;reflType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; t (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;t' &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"eq"&lt;/span&gt;)) &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; t &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; t' &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; t'))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqElimType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; a (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; a (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt;)) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;p &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;forall (A : Type) (x : A) (P : A -&amp;gt; Type),&lt;br /&gt;&lt;/span&gt;              &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; a (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;y &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;P x -&amp;gt; forall y : A,&lt;br /&gt;&lt;/span&gt;               &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"eq"&lt;/span&gt;)) &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; y) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; y)))))) &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;x = y -&amp;gt; P y&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellfunction-name"&gt;eqPrfElimType&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; a (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPi&lt;/span&gt; a (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VType&lt;/span&gt;)) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;p &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;forall (A : Type) (x : A) (P : A -&amp;gt; Type),&lt;br /&gt;&lt;/span&gt;                 &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; a (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;y &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;P x -&amp;gt; forall y : A,&lt;br /&gt;&lt;/span&gt;                  &lt;span class="haskelltype"&gt;VPi&lt;/span&gt; (&lt;span class="haskelltype"&gt;VPrf&lt;/span&gt; (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"eq"&lt;/span&gt;)) &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; y)) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; p &lt;span class="haskellvariable-name"&gt;%&lt;/span&gt; y)))))) &lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Prf(x = y) -&amp;gt; P y&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellfunction-name"&gt;eqElimV&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;motive &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;pX &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;y &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;VLam&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;eqPrf &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; eqElim pX eqPrf))))))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqElim&lt;/span&gt; pX (&lt;span class="haskelltype"&gt;VNeutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;NApp&lt;/span&gt; (&lt;span class="haskelltype"&gt;NFree&lt;/span&gt; (&lt;span class="haskelltype"&gt;Global&lt;/span&gt; &lt;span class="haskellstring"&gt;"refl"&lt;/span&gt;)) &lt;span class="haskellkeyword"&gt;_&lt;/span&gt;)) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; pX&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqElim&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; error &lt;span class="haskellstring"&gt;"not implemented"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Example session:&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Main&amp;gt; repl (nat ++ add ++ eq) (natDefs ++ addDefs ++ eqDefs)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;-- join for the Prf monad:&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; \P:*,\phi:Prf(Prf(P)),[]phi&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Pi Type (Scope (Pi (Prf (Prf (Bound 0))) (Scope (Prf (Bound 1)))))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;-- proof of eq symmetry:&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; (\T:*,\a:T,\b:T,\e:eq T a b,eqElim T a (\x:T,eq T x a) (refl T a) b e)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Pi Type (Scope (Pi (Bound 0) (Scope (Pi (Bound 1) (Scope (Pi (App (App (App (Free (Global "eq")) (Bound 2)) (Bound 1)) (Bound 0)) (Scope (App (App (App (Free (Global "eq")) (Bound 3)) (Bound 1)) (Bound 2)))))))))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;-- that is: /\T:*,/\a:T,/\b:T,/\(a = b),b = a&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;proof of f_equal, x = y -&amp;gt; f x = f y&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; (\x:nat,\y:nat,\f:(/\n:nat,nat),\e:eq nat x y,eqElim nat x (\y:nat,eq nat (f x) (f y)) (refl nat (f x)) y e)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Pi (Free (Global "nat")) (Scope (&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--  &lt;/span&gt;&lt;span class="haskellcomment"&gt;Pi (Free (Global "nat")) (Scope (&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;Pi (Pi (Free (Global "nat")) (Scope (Free (Global "nat")))) (Scope (&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--    &lt;/span&gt;&lt;span class="haskellcomment"&gt;Pi (App (App (App (Free (Global "eq")) (Free (Global "nat"))) (Bound 2)) (Bound 1)) (Scope (&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--     &lt;/span&gt;&lt;span class="haskellcomment"&gt;App (App (App (Free (Global "eq")) (Free (Global "nat"))) (App (Bound 1) (Bound 3))) (App (Bound 1) (Bound 2))))))))))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Induction proof that: n + 0 = n&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; (natElim (\n:nat,eq nat (add n Z) n) (refl nat Z) (\n:nat,\e:eq nat (add n Z) n,(\x:nat,\y:nat,\f:(/\n:nat,nat),\e:eq nat x y,eqElim nat x (\y:nat,eq nat (f x) (f y)) (refl nat (f x)) y e) (add n Z) n S e))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Pi (Free (Global "nat")) (Scope (&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--  &lt;/span&gt;&lt;span class="haskellcomment"&gt;App (App (App (Free (Global "eq")) (Free (Global "nat")))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--      &lt;/span&gt;&lt;span class="haskellcomment"&gt;(App (App (App (App (Free (Global "natElim"))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--        &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Lam Type (Scope (Free (Global "nat")))))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--        &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Free (Global "Z")))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--        &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Lam Type (Scope (Free (Global "S")))))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--        &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Bound 0)))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--      &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Bound 0)))&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-3868001917375936390?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/3868001917375936390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=3868001917375936390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3868001917375936390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3868001917375936390'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/03/type-checker.html' title='Type Checker'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5153222080417608159</id><published>2009-03-01T05:00:00.000-08:00</published><updated>2009-03-01T05:01:25.112-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Specification'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Type Theory'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern Matching'/><category scheme='http://www.blogger.com/atom/ns#' term='Coq'/><title type='text'>How to halve a number</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt; * How to halve a number&lt;br /&gt; * ---------------------&lt;br /&gt; &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; (* just so we start on the same page, what is a number? *)&lt;br /&gt; *&lt;br /&gt; * Inductive nat : Set :=&lt;br /&gt; * | O : nat&lt;br /&gt; * | S : nat -&amp;gt; nat.&lt;br /&gt; &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Module Type&lt;/span&gt; &lt;span class="coq-function-name"&gt;Halver&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Parameter&lt;/span&gt; &lt;span class="coq-variable-name"&gt;half&lt;/span&gt; : nat -&amp;gt; nat.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;e1&lt;/span&gt; : half 0 = 0.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;e2&lt;/span&gt; : half 1 = 0.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Axiom&lt;/span&gt; &lt;span class="coq-variable-name"&gt;e3&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n&lt;/span&gt;, half (S (S n)) = S (half n).&lt;br /&gt;&lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; An equational specification is given as a module&lt;br /&gt;   * so now it is possible it give various implementations&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; Halver.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Module&lt;/span&gt; &lt;span class="coq-function-name"&gt;By_Default&lt;/span&gt; : Halver.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;half&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat) : nat :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | O =&amp;gt; O&lt;br /&gt;      | S O =&amp;gt; O&lt;br /&gt;      | S (S n) =&amp;gt; S (half n)&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e1&lt;/span&gt; : half 0 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e2&lt;/span&gt; : half 1 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e3&lt;/span&gt; n : half (S (S n)) = S (half n) := refl_equal _.&lt;br /&gt;&lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; This is the sort of thing one would normally start with,&lt;br /&gt;   * pattern match on a term and use recursive calls on a&lt;br /&gt;   * structurally smaller term, the idea of 'structurally smaller'&lt;br /&gt;   * is part of the type rules actually and it is the transitive&lt;br /&gt;   * closure of   (1) p_i &amp;lt; C p_1 p_2 ... p_n&lt;br /&gt;   *        and   (2) f x &amp;lt; f&lt;br /&gt;   * rule (1) and (2) say that a term in smaller than any&lt;br /&gt;   * construction built from it, a construction being something&lt;br /&gt;   * literally built from constructor or a function&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; By_Default.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Module&lt;/span&gt; &lt;span class="coq-function-name"&gt;By_Divine_Inspiration&lt;/span&gt; : Halver.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; Definition half n :=&lt;br /&gt;   *    fst (nat_rect (fun _ =&amp;gt; (nat * nat)%type)&lt;br /&gt;   *      (O, O)&lt;br /&gt;   *      (fun n Pn =&amp;gt; let (p,q) := Pn in (q, S p))&lt;br /&gt;   *      n).&lt;br /&gt;   * (* it seems impossible to prove this one correct *)&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;half&lt;/span&gt; n :=&lt;br /&gt;    fst (nat_rect (&lt;span class="coq-type"&gt;fun&lt;/span&gt; _ =&amp;gt; (nat * nat)%type)&lt;br /&gt;      (O, O)&lt;br /&gt;      (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n Pn&lt;/span&gt; =&amp;gt; (snd Pn, S (fst Pn)))&lt;br /&gt;      n).&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e1&lt;/span&gt; : half 0 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e2&lt;/span&gt; : half 1 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e3&lt;/span&gt; n : half (S (S n)) = S (half n) := refl_equal _.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; By_Divine_Inspiration.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Module&lt;/span&gt; &lt;span class="coq-function-name"&gt;By_Devising_Data&lt;/span&gt; : Halver.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; This way seems like a 'view' in the sense of Wadler,&lt;br /&gt;   * The structure of the data make the program definition&lt;br /&gt;   * straight-forward.&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;nat'&lt;/span&gt; : &lt;span class="coq-type"&gt;Set&lt;/span&gt; :=&lt;br /&gt;  | Zero : nat'&lt;br /&gt;  | One : nat'&lt;br /&gt;  | SuccSucc : nat' -&amp;gt; nat'.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;zero&lt;/span&gt; := Zero.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;succ&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat') :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | Zero =&amp;gt; One&lt;br /&gt;      | One =&amp;gt; SuccSucc Zero&lt;br /&gt;      | SuccSucc n =&amp;gt; SuccSucc (succ n)&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;nat_to_nat'&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat) : nat' :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | O =&amp;gt; zero&lt;br /&gt;      | S n =&amp;gt; succ (nat_to_nat' n)&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;half'&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat') : nat :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | Zero =&amp;gt; O&lt;br /&gt;      | One =&amp;gt; O&lt;br /&gt;      | SuccSucc n =&amp;gt; S (half' n)&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;half&lt;/span&gt; n := half' (nat_to_nat' n).&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e1&lt;/span&gt; : half 0 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e2&lt;/span&gt; : half 1 = 0 := refl_equal _.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;succ_succs&lt;/span&gt; n : succ (succ n) = SuccSucc n.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;induction&lt;/span&gt; n; &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; IHn; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;e3&lt;/span&gt; n : half (S (S n)) = S (half n).&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; n.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; half.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; succ_succs.&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; By_Devising_Data.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Module&lt;/span&gt; &lt;span class="coq-function-name"&gt;By_Mutual_Induction&lt;/span&gt; : Halver.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;Even&lt;/span&gt; : nat -&amp;gt; &lt;span class="coq-type"&gt;Set&lt;/span&gt; :=&lt;br /&gt;  | EvenO : Even O&lt;br /&gt;  | EvenS n : Odd n -&amp;gt; Even (S n)&lt;br /&gt;  &lt;span class="coq-type"&gt;with&lt;/span&gt;      &lt;span class="coq-function-name"&gt;Odd&lt;/span&gt; : nat -&amp;gt; &lt;span class="coq-type"&gt;Set&lt;/span&gt; :=&lt;br /&gt;  | OddS n : Even n -&amp;gt; Odd (S n).&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;even_or_odd&lt;/span&gt; n : Even n + Odd n :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; n &lt;span class="coq-type"&gt;as&lt;/span&gt; n &lt;span class="coq-type"&gt;return&lt;/span&gt; Even n + Odd n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | O =&amp;gt; inl _ EvenO&lt;br /&gt;      | S n =&amp;gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;match&lt;/span&gt; even_or_odd n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;          | inl even =&amp;gt; inr _ (OddS _ even)&lt;br /&gt;          | inr odd =&amp;gt; inl _ (EvenS _ odd)&lt;br /&gt;        &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;halfE&lt;/span&gt; n (&lt;span class="coq-variable-name"&gt;e&lt;/span&gt; : Even n) : nat :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; e &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | EvenO =&amp;gt; O&lt;br /&gt;      | EvenS n odd =&amp;gt; S (halfO n odd)&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class="coq-type"&gt;with&lt;/span&gt;     &lt;span class="coq-function-name"&gt;halfO&lt;/span&gt; n (&lt;span class="coq-variable-name"&gt;o&lt;/span&gt; : Odd n) : nat :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; o &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | OddS n even =&amp;gt; halfE n even&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;half&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat) : nat :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; even_or_odd n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | inl even =&amp;gt; halfE n even&lt;br /&gt;      | inr odd =&amp;gt; halfO n odd&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; Proving this program correct is quite a lot&lt;br /&gt;   * of work compared to the previous implementations,&lt;br /&gt;   * these tricky inversion lemmas which would be trivial&lt;br /&gt;   * to prove using pattern matching at least show some&lt;br /&gt;   * techniques.&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;unique_lemma_1&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;e&lt;/span&gt; : Even 0) : e = EvenO.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; e.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt; (&lt;br /&gt;      &lt;span class="coq-type"&gt;match&lt;/span&gt; e &lt;span class="coq-type"&gt;as&lt;/span&gt; e' &lt;span class="coq-type"&gt;in&lt;/span&gt; Even Zero &lt;span class="coq-type"&gt;return&lt;/span&gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;match&lt;/span&gt; Zero &lt;span class="coq-type"&gt;return&lt;/span&gt; Even Zero -&amp;gt; &lt;span class="coq-type"&gt;Prop&lt;/span&gt; &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;          | O =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;e''&lt;/span&gt; : Even 0 =&amp;gt; e'' = EvenO&lt;br /&gt;          | S _ =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; _ =&amp;gt; &lt;span class="coq-type"&gt;True&lt;/span&gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;end&lt;/span&gt; e'&lt;br /&gt;        &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;        | EvenO =&amp;gt; refl_equal _&lt;br /&gt;        | EvenS _ _ =&amp;gt; I&lt;br /&gt;      &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;    ).&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;unique_lemma_2&lt;/span&gt; n (&lt;span class="coq-variable-name"&gt;e&lt;/span&gt; : Even (S n)) : { o' : _ | e = EvenS n o' }.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; n e.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt; (&lt;br /&gt;      &lt;span class="coq-type"&gt;match&lt;/span&gt; e &lt;span class="coq-type"&gt;as&lt;/span&gt; e' &lt;span class="coq-type"&gt;in&lt;/span&gt; Even SuccN &lt;span class="coq-type"&gt;return&lt;/span&gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;match&lt;/span&gt; SuccN &lt;span class="coq-type"&gt;return&lt;/span&gt; Even SuccN -&amp;gt; &lt;span class="coq-type"&gt;Set&lt;/span&gt; &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;          | O =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; _ =&amp;gt; &lt;span class="coq-type"&gt;True&lt;/span&gt;&lt;br /&gt;          | S n =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;e'&lt;/span&gt; : Even (S n) =&amp;gt;&lt;br /&gt;            { o' : _ | e' = EvenS n o' }&lt;br /&gt;        &lt;span class="coq-type"&gt;end&lt;/span&gt; e'&lt;br /&gt;        &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;        | EvenO =&amp;gt; I&lt;br /&gt;        | EvenS n' o' =&amp;gt; exist _ o' (refl_equal _)&lt;br /&gt;      &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;    ).&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;unique_lemma_3&lt;/span&gt; n (&lt;span class="coq-variable-name"&gt;o&lt;/span&gt; : Odd (S n)) : { e' : _ | o = OddS n e' }.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; n o.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt; (&lt;br /&gt;      &lt;span class="coq-type"&gt;match&lt;/span&gt; o &lt;span class="coq-type"&gt;as&lt;/span&gt; o' &lt;span class="coq-type"&gt;in&lt;/span&gt; Odd SuccN &lt;span class="coq-type"&gt;return&lt;/span&gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;match&lt;/span&gt; SuccN &lt;span class="coq-type"&gt;return&lt;/span&gt; Odd SuccN -&amp;gt; &lt;span class="coq-type"&gt;Set&lt;/span&gt; &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;          | O =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; _ =&amp;gt; &lt;span class="coq-type"&gt;True&lt;/span&gt;&lt;br /&gt;          | S n =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;o'&lt;/span&gt; : Odd (S n) =&amp;gt;&lt;br /&gt;            { e' : _ | o' = OddS n e' }&lt;br /&gt;        &lt;span class="coq-type"&gt;end&lt;/span&gt; o'&lt;br /&gt;        &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;        | OddS n' e' =&amp;gt; exist _ e' (refl_equal _)&lt;br /&gt;      &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;    ).&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; There is only one way to prove a number is Even&lt;br /&gt;   * and similarly to prove it's Odd&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;unique_classificationE&lt;/span&gt; n (&lt;span class="coq-variable-name"&gt;e e'&lt;/span&gt; : Even n) : e = e'&lt;br /&gt;  &lt;span class="coq-type"&gt;with&lt;/span&gt;    unique_classificationO n (&lt;span class="coq-variable-name"&gt;o o'&lt;/span&gt; : Odd n) : o = o'.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;induction&lt;/span&gt; n; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; unique_lemma_1 &lt;span class="coq-type"&gt;with&lt;/span&gt; e.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; unique_lemma_1 &lt;span class="coq-type"&gt;with&lt;/span&gt; e'.&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_2 _ e) &lt;span class="coq-type"&gt;as&lt;/span&gt; [o eq].&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_2 _ e') &lt;span class="coq-type"&gt;as&lt;/span&gt; [o' eq'].&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; eq; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; eq'.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (unique_classificationO n o o').&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; n.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; H; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; H.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_3 _ o) &lt;span class="coq-type"&gt;as&lt;/span&gt; [e eq].&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_3 _ o') &lt;span class="coq-type"&gt;as&lt;/span&gt; [e' eq'].&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; eq; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; eq'.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (unique_classificationE n e e').&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;halfE_SS&lt;/span&gt; n e e' : halfE (S (S n)) e' = S (halfE n e)&lt;br /&gt;  &lt;span class="coq-type"&gt;with&lt;/span&gt;  &lt;span class="coq-function-name"&gt;halfO_SS&lt;/span&gt; n o o' : halfO (S (S n)) o' = S (halfO n o).&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_2 _ e') &lt;span class="coq-type"&gt;as&lt;/span&gt; [o eq].&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_3 _ o) &lt;span class="coq-type"&gt;as&lt;/span&gt; [e'' eq'].&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;assert&lt;/span&gt; (e = e'') &lt;span class="coq-type"&gt;as&lt;/span&gt; E &lt;span class="coq-coq-solve-tactics"&gt;by&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; unique_classificationE.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; E; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_3 _ o') &lt;span class="coq-type"&gt;as&lt;/span&gt; [e eq].&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (unique_lemma_2 _ e) &lt;span class="coq-type"&gt;as&lt;/span&gt; [o'' eq'].&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;assert&lt;/span&gt; (o = o'') &lt;span class="coq-type"&gt;as&lt;/span&gt; O &lt;span class="coq-coq-solve-tactics"&gt;by&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; unique_classificationO.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; O; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;which&lt;/span&gt; P Q : P + Q -&amp;gt; bool :=&lt;br /&gt;    &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;choice&lt;/span&gt; =&amp;gt;&lt;br /&gt;      &lt;span class="coq-type"&gt;match&lt;/span&gt; choice &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;        | inl _ =&amp;gt; true&lt;br /&gt;        | inr _ =&amp;gt; false&lt;br /&gt;      &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;even_or_odd_SS&lt;/span&gt; n : which _ _ (even_or_odd (S (S n))) = which _ _ (even_or_odd n).&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;induction&lt;/span&gt; n.&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt; &lt;span class="coq-type"&gt;in&lt;/span&gt; *.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (even_or_odd n).&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e1&lt;/span&gt; : half 0 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e2&lt;/span&gt; : half 1 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;e3&lt;/span&gt; n : half (S (S n)) = S (half n).&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; n.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; half.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;generalize&lt;/span&gt; (even_or_odd_SS n).&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (even_or_odd n); &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (even_or_odd (S (S n)));&lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; hyp; &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-coq-solve-tactics"&gt;discriminate&lt;/span&gt; hyp.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; halfE_SS.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; halfO_SS.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; By_Mutual_Induction.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Module&lt;/span&gt; &lt;span class="coq-function-name"&gt;By_Well_Founded_Induction&lt;/span&gt; : Halver.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Section&lt;/span&gt; &lt;span class="coq-function-name"&gt;Well_Founded_Relations&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;A&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;R&lt;/span&gt; : A -&amp;gt; A -&amp;gt; &lt;span class="coq-type"&gt;Prop&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;Acc&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;x&lt;/span&gt; : A) : &lt;span class="coq-type"&gt;Prop&lt;/span&gt; :=&lt;br /&gt;    | below : (&lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;y&lt;/span&gt; : A, R y x -&amp;gt; Acc y) -&amp;gt; Acc x.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; x must be a parameter (instead of Acc : A -&amp;gt; Prop) for&lt;br /&gt;     * Set/Type elimination, but why?&lt;br /&gt;     &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;Well_Founded&lt;/span&gt; := &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt; : A, Acc x.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;Transitive_Closure&lt;/span&gt; : A -&amp;gt; A -&amp;gt; &lt;span class="coq-type"&gt;Prop&lt;/span&gt; :=&lt;br /&gt;    | step x y : R x y -&amp;gt; Transitive_Closure x y&lt;br /&gt;    | &lt;span class="coq-proof-tactics-name"&gt;transitivity&lt;/span&gt; x y z : R x y -&amp;gt; Transitive_Closure y z -&amp;gt; Transitive_Closure x z.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;Well_Founded_Induction&lt;/span&gt;&lt;br /&gt;      (&lt;span class="coq-variable-name"&gt;W&lt;/span&gt; : Well_Founded)&lt;br /&gt;      (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : A -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt;)&lt;br /&gt;      (&lt;span class="coq-variable-name"&gt;rec&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt;, (&lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;y&lt;/span&gt;, R y x -&amp;gt; P y) -&amp;gt; P x)&lt;br /&gt;      : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;a&lt;/span&gt;, P a :=&lt;br /&gt;        &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;a&lt;/span&gt; =&amp;gt; Acc_rect P (&lt;span class="coq-type"&gt;fun&lt;/span&gt; x _ hyp =&amp;gt; rec x hyp) a (W a).&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;End&lt;/span&gt; Well_Founded_Relations.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Section&lt;/span&gt; &lt;span class="coq-function-name"&gt;Transitive_Relation&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;A&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;R&lt;/span&gt; : A -&amp;gt; A -&amp;gt; &lt;span class="coq-type"&gt;Prop&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;Transitive_Closure_Well_Founded&lt;/span&gt; :&lt;br /&gt;      Well_Founded A R -&amp;gt; Well_Founded A (Transitive_Closure A R).&lt;br /&gt;    &lt;span class="coq-keyword"&gt;Proof&lt;/span&gt;.&lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; Well_Founded; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; R_Acc x.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;induction&lt;/span&gt; (R_Acc x) &lt;span class="coq-type"&gt;as&lt;/span&gt; [x R_ind T_ind].&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; below; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; y Trans.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;induction&lt;/span&gt; Trans.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; T_ind; &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;pose&lt;/span&gt; (IHTrans R_ind T_ind) &lt;span class="coq-type"&gt;as&lt;/span&gt; IH; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; IH &lt;span class="coq-type"&gt;as&lt;/span&gt; [H']; &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;.&lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; H'.&lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; step.&lt;br /&gt;      &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;End&lt;/span&gt; Transitive_Relation.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Section&lt;/span&gt; &lt;span class="coq-function-name"&gt;Nat_Structural_Measure&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; Looking at the definition of nat: &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt;     * Inductive nat : Set :=&lt;br /&gt;     * | O : nat&lt;br /&gt;     * | S : nat -&amp;gt; nat.&lt;br /&gt;     &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; shows there is one (simple) recursive field &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;nat_step&lt;/span&gt; : nat -&amp;gt; nat -&amp;gt; &lt;span class="coq-type"&gt;Prop&lt;/span&gt; :=&lt;br /&gt;    | nat_step_a : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt;, nat_step x (S x).&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; the nat_step relation expresses this recursion&lt;br /&gt;     * every inductive type admits a step relation&lt;br /&gt;     * (indexed inductives define indexed relations,&lt;br /&gt;     * but maybe wrappig them in sigT would be better?)&lt;br /&gt;     &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;nat_step_Well_Founded&lt;/span&gt; : Well_Founded nat nat_step.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; Well_Founded.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;induction&lt;/span&gt; x;&lt;br /&gt;        &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; below; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; y Ry.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Ry.&lt;br /&gt;      &lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Ry.&lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;.&lt;br /&gt;      &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; Could one generically define all &amp;#934;_step relations,&lt;br /&gt;     * and give a generic proof that they are all Well_Founded?&lt;br /&gt;     &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; The transitive closure of the step relation corresponds to&lt;br /&gt;     * the usual idea of lt/(&amp;lt;) on nat:&lt;br /&gt;     &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;nat_struct&lt;/span&gt; := Transitive_Closure nat nat_step.&lt;br /&gt;    &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;nat_struct_Well_Founded&lt;/span&gt; :=&lt;br /&gt;      Transitive_Closure_Well_Founded nat nat_step nat_step_Well_Founded.&lt;br /&gt;    &lt;br /&gt;    &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; In general terms it is a typed version of the 'structurally smaller'&lt;br /&gt;     * relation in the metatheory which lets definitions like the one in&lt;br /&gt;     * By_Default be accepted&lt;br /&gt;     &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;End&lt;/span&gt; Nat_Structural_Measure.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; Now the equations we want to satisy are: &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt;   * half O := O&lt;br /&gt;   * half (S O) := O&lt;br /&gt;   * half (S (S n)) := S (half n)&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; so in terms of (toned down) eliminators that is:&lt;br /&gt;   * &lt;br /&gt;   * half n := nat_case n&lt;br /&gt;   *            O&lt;br /&gt;   *            (fun n' Pn' =&amp;gt;&lt;br /&gt;   *              nat_case n'&lt;br /&gt;   *               O&lt;br /&gt;   *               (fun n'' Pn'' =&amp;gt;&lt;br /&gt;   *                 S (half n''))).&lt;br /&gt;   * &lt;br /&gt;   * clearly that definition is not acceptable with&lt;br /&gt;   *  no termination argument what-so-ever! so to&lt;br /&gt;   *  rectify that, we can let P express that this&lt;br /&gt;   *  number is smaller than n, and use well founded&lt;br /&gt;   *  induction on the size measure.&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;SSsmaller&lt;/span&gt; m : nat_struct m (S (S m)).&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; m.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;transitivity&lt;/span&gt; &lt;span class="coq-type"&gt;with&lt;/span&gt; (S m).&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;constructor&lt;/span&gt;.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; step.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;constructor&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;half&lt;/span&gt; := Well_Founded_Induction nat nat_struct nat_struct_Well_Founded&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; _ =&amp;gt; nat)&lt;br /&gt;    (nat_rec (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt; =&amp;gt; (&lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;y&lt;/span&gt; : nat, nat_struct y x -&amp;gt; nat) -&amp;gt; nat)&lt;br /&gt;      (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;rec&lt;/span&gt; =&amp;gt; O)&lt;br /&gt;      (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n Pn rec&lt;/span&gt; =&amp;gt;&lt;br /&gt;        nat_rec (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt; =&amp;gt; (&lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;y&lt;/span&gt; : nat, nat_struct y (S x) -&amp;gt; nat) -&amp;gt; nat)&lt;br /&gt;        (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;rec&lt;/span&gt; =&amp;gt; O)&lt;br /&gt;        (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;m Pm rec&lt;/span&gt; =&amp;gt; S (rec m (SSsmaller m)))&lt;br /&gt;        n&lt;br /&gt;        rec)).&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt;   * The definition may look a bit complicated but I think this could&lt;br /&gt;   *  be computed automatically from the equational specification,&lt;br /&gt;   *  the method seems like a good way to compile dependent pattern matching&lt;br /&gt;   *  into a basic type theory though, so that we don't have to use something&lt;br /&gt;   *  like a 'match' construct.&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e1&lt;/span&gt; : half 0 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e2&lt;/span&gt; : half 1 = 0 := refl_equal _.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;e3&lt;/span&gt; n : half (S (S n)) = S (half n) := refl_equal _.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt;   * It's not luck (at least I think it's not, and I really hope so)&lt;br /&gt;   *  that the recursive equality is provable by reflexivity, but it&lt;br /&gt;   *  does require the SSsmaller proof term to be canonical (made up&lt;br /&gt;   *  of constructors), since every proof that a term is structurally &lt;br /&gt;   *  smaller than another can be a canonical proof that poses no&lt;br /&gt;   *  problem. I don't yet know how it will interact with dependent&lt;br /&gt;   *  pattern match specialization though. (I can't think of any&lt;br /&gt;   *  functions over inductive families that aren't 'step' recursive&lt;br /&gt;   *  though, does anyone know of some examples?)&lt;br /&gt;   &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; By_Well_Founded_Induction.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5153222080417608159?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5153222080417608159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5153222080417608159' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5153222080417608159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5153222080417608159'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/03/how-to-halve-number.html' title='How to halve a number'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-6391429445223990337</id><published>2009-02-18T15:37:00.001-08:00</published><updated>2009-02-18T15:38:03.433-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Universes'/><category scheme='http://www.blogger.com/atom/ns#' term='Induction-Recursion'/><category scheme='http://www.blogger.com/atom/ns#' term='Agda 2'/><title type='text'>Universes for discrimination proofs</title><content type='html'>I can't decide if this is trivial or not. What does this construction mean/say?&lt;br /&gt;&lt;br /&gt;    &lt;pre&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;module&lt;/span&gt; &lt;span class="agda2-highlight-module"&gt;Universe&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;N0&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Bool&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;True&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Bool&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;False&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Bool&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Direction&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;Left&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Direction&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;Right&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Direction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Eq&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;refl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;t&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Eq&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;t&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;t&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-comment"&gt;-- Eq Set Bool Direction -&amp;gt; N0&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-comment"&gt;--  is not provable&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-comment"&gt;--  (techincally I would have to define Eq in Set1 but we can pretend universe polymorphism)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;mutual&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;n0&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;bool&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;direction&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;eq&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;pi&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;N0&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;bool&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Bool&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;direction&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Direction&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;eq&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Eq&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;pi&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;mutual&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;n0'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;bool'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;direction'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;eq'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;pi'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;u'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-inductive-constructor"&gt;lift&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;N0&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;bool'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Bool&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;direction'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Direction&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;eq'&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Eq&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;pi'&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;u'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;lift&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;bool&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;bool&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;direction&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;eq&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;pi&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;rew&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;forall&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Eq&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;B&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;rew&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;refl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;_)&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;prf&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;prf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;discr&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Eq&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;U&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;bool&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;direction&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;N0&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;discr&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;prf&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;rew&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;prf&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;corr&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;T1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;pi'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-inductive-constructor"&gt;eq'&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;u'&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;bool&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;direction&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;\&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;_&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;n0'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;corr&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;discr&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-6391429445223990337?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/6391429445223990337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=6391429445223990337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6391429445223990337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6391429445223990337'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/02/universes-for-discrimination-proofs.html' title='Universes for discrimination proofs'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5361568061623962019</id><published>2009-02-15T07:23:00.000-08:00</published><updated>2009-02-15T07:24:56.389-08:00</updated><title type='text'>Agda Supports Eta - Cont is a monad</title><content type='html'>Since Agda 2 now supports eta in the definitional equality, here is a celebratory proof that Cont is a monad!&lt;br /&gt;   &lt;pre&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;module&lt;/span&gt; &lt;span class="agda2-highlight-module"&gt;eta&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;_==_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;refl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;==&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;return&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;forall&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;return&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;_&amp;gt;&amp;gt;=_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;forall&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-bound-variable"&gt;m&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;k&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;\&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;c&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;m&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(\&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;k&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;c&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont-left-identity&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;forall&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;o&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;return&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;o&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;==&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;o&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont-left-identity&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;o&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;refl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;o&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont-right-identity&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;forall&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;return&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;==&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont-right-identity&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;refl&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont-associativity&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;forall&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;c&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;a&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;g&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;b&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;cont&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;c&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-symbol"&gt;((&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;g&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;==&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(\&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;g&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;cont-associativity&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;g&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-inductive-constructor"&gt;refl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;((&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-function"&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;g&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5361568061623962019?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5361568061623962019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5361568061623962019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5361568061623962019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5361568061623962019'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/02/agda-supports-eta-cont-is-monad.html' title='Agda Supports Eta - Cont is a monad'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-6890768807747877796</id><published>2009-02-07T10:31:00.000-08:00</published><updated>2009-02-07T10:51:02.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='syntax coloring'/><category scheme='http://www.blogger.com/atom/ns#' term='badger'/><category scheme='http://www.blogger.com/atom/ns#' term='single constructor inductives'/><title type='text'>Inventing a concrete syntax</title><content type='html'>&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;F&lt;/span&gt; : &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;T&lt;/span&gt; : &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;I&lt;/span&gt; : &lt;span class=tycon&gt;T&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;Bool&lt;/span&gt; : &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;true&lt;/span&gt; : &lt;span class=tycon&gt;Bool&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;false&lt;/span&gt; : &lt;span class=tycon&gt;Bool&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;N&lt;/span&gt; : &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;O&lt;/span&gt; : &lt;span class=tycon&gt;N&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;S&lt;/span&gt; : &lt;span class=tycon&gt;N&lt;/span&gt; &amp;rarr; &lt;span class=tycon&gt;N&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;Ord&lt;/span&gt; : &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;&lt;br /&gt;&lt;span class=data&gt;OO&lt;/span&gt; : &lt;span class=tycon&gt;Ord&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;OS&lt;/span&gt; : &lt;span class=tycon&gt;Ord&lt;/span&gt; &amp;rarr; &lt;span class=tycon&gt;Ord&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;OL&lt;/span&gt; : (&lt;span class=tycon&gt;N&lt;/span&gt; &amp;rarr; &lt;span class=tycon&gt;Ord&lt;/span&gt;) &amp;rarr; &lt;span class=tycon&gt;Ord&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;Fin&lt;/span&gt; : &lt;span class=tycon&gt;N&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;fz&lt;/span&gt; : (&lt;span class=var&gt;n&lt;/span&gt;:&lt;span class=tycon&gt;N&lt;/span&gt;)&lt;span class=tycon&gt;Fin&lt;/span&gt; (&lt;span class=data&gt;S&lt;/span&gt; &lt;span class=var&gt;n&lt;/span&gt;);&lt;br /&gt;&lt;span class=data&gt;fs&lt;/span&gt; : (&lt;span class=var&gt;n&lt;/span&gt;:&lt;span class=tycon&gt;N&lt;/span&gt;)&lt;span class=tycon&gt;Fin&lt;/span&gt; &lt;span class=var&gt;n&lt;/span&gt; &amp;rarr; &lt;span class=tycon&gt;Fin&lt;/span&gt; (&lt;span class=data&gt;S&lt;/span&gt; &lt;span class=var&gt;n&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;Eq&lt;/span&gt; (&lt;span class=var&gt;A&lt;/span&gt;:&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;)(&lt;span class=var&gt;x&lt;/span&gt;:&lt;span class=var&gt;A&lt;/span&gt;):&lt;span class=var&gt;A&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;refl&lt;/span&gt; : &lt;span class=tycon&gt;Eq&lt;/span&gt; &lt;span class=var&gt;A x x&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;JMEq&lt;/span&gt; (&lt;span class=var&gt;A&lt;/span&gt;:&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;)(&lt;span class=var&gt;x&lt;/span&gt;:&lt;span class=var&gt;A&lt;/span&gt;):(&lt;span class=var&gt;B&lt;/span&gt;:&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;)&lt;span class=var&gt;B&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;JMrefl&lt;/span&gt; : &lt;span class=tycon&gt;JMEq&lt;/span&gt; &lt;span class=var&gt;A x A x&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;So&lt;/span&gt; : &lt;span class=tycon&gt;Bool&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;oh&lt;/span&gt; : &lt;span class=tycon&gt;So&lt;/span&gt; &lt;span class=data&gt;true&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;Ex&lt;/span&gt; (&lt;span class=var&gt;T&lt;/span&gt;:&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;)(&lt;span class=var&gt;P&lt;/span&gt;:&lt;span class=var&gt;T&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;):&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;witness&lt;/span&gt; : (&lt;span class=var&gt;t&lt;/span&gt; : &lt;span class=var&gt;T&lt;/span&gt;)&lt;span class=tycon&gt;Prf&lt;/span&gt;(&lt;span class=var&gt;P t&lt;/span&gt;) &amp;rarr; &lt;span class=tycon&gt;Ex&lt;/span&gt; &lt;span class=var&gt;T P&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;Acc&lt;/span&gt; (&lt;span class=var&gt;A&lt;/span&gt;:&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;)(&lt;span class=var&gt;R&lt;/span&gt;:&lt;span class=var&gt;A&lt;/span&gt; &amp;rarr; &lt;span class=var&gt;A&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;):&lt;span class=var&gt;A&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;below&lt;/span&gt; : ((&lt;span class=var&gt;y&lt;/span&gt;:&lt;span class=var&gt;A&lt;/span&gt;)&lt;span class=var&gt;R y x&lt;/span&gt; &amp;rarr; &lt;span class=tycon&gt;Acc&lt;/span&gt; &lt;span class=var&gt;A R y&lt;/span&gt;) &amp;rarr; &lt;span class=tycon&gt;Acc&lt;/span&gt; &lt;span class=var&gt;A R x&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class=key&gt;ind&lt;/span&gt; &lt;span class=tycon&gt;W&lt;/span&gt; (&lt;span class=var&gt;A&lt;/span&gt;:&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;)(&lt;span class=var&gt;B&lt;/span&gt;:&lt;span class=var&gt;A&lt;/span&gt; &amp;rarr; &lt;span class=star&gt;&amp;#9733;&lt;/span&gt;):&lt;span class=star&gt;&amp;#9733;&lt;/span&gt;;&lt;br /&gt;&lt;span class=data&gt;sup&lt;/span&gt; : (&lt;span class=var&gt;a&lt;/span&gt;:&lt;span class=var&gt;A&lt;/span&gt;)(&lt;span class=var&gt;f&lt;/span&gt;:&lt;span class=var&gt;B a&lt;/span&gt; &amp;rarr; &lt;span class=tycon&gt;W&lt;/span&gt; &lt;span class=var&gt;A B&lt;/span&gt;)&lt;span class=tycon&gt;W&lt;/span&gt; &lt;span class=var&gt;A B&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-6890768807747877796?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/6890768807747877796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=6890768807747877796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6890768807747877796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6890768807747877796'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/02/inventing-concrete-syntax.html' title='Inventing a concrete syntax'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5217788919276707669</id><published>2009-02-01T01:05:00.001-08:00</published><updated>2009-02-01T01:06:51.277-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shift/Reset'/><category scheme='http://www.blogger.com/atom/ns#' term='CPS'/><category scheme='http://www.blogger.com/atom/ns#' term='Delimeted Continuations'/><title type='text'>CPS transformation using delimited continuations</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;Idea: Use reified continuations to implement a CPS converter&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;&lt;/span&gt;&lt;span class="scheme-comment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;in the expression: (+ (* x x) (* y y))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;the continuation of (* x x) is (lambda (x-squared) (+ x-squared (* y y)))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;&lt;/span&gt;&lt;span class="scheme-comment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;similiarly,&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;&lt;/span&gt;&lt;span class="scheme-comment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;in the expression: (list '+ (list '* 'x 'x) (list '* 'y 'y))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;the continuation of (list '* 'x 'x) is (lambda (x-squared) (list '+ x-squared (list '* 'y 'y)))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(require scheme/control) &lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;shift/reset delimited continuations&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (reset (list '+ (shift k (list '* 'x 'x))     (list '* 'y 'y)))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(* x x)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (reset (list '+ (shift k (k '?))              (list '* 'y 'y)))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(+ ? (* y y))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (reset (list '+ (shift k (k (list '* 'x 'x))) (list '* 'y 'y)))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(+ (* x x) (* y y))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (reset (list '+ (shift k `(let ((x-squared ,(list '* 'x 'x))) ,(k 'x-squared))) (list '* 'y 'y)))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(let ((x-squared (* x x))) (+ x-squared (* y y)))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;CPS applications should throw the result value into a continuation&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;so (f x y z) turns into (f x y z (lambda (result) (continuation result)))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;apply#&lt;/span&gt; f . args) (shift k (&lt;span class="scheme-keyword"&gt;let&lt;/span&gt; ((g (gensym &lt;span class="scheme-string"&gt;"g"&lt;/span&gt;))) (reset `(,f ,@args (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (,g) ,(k g)))))))&lt;br /&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;Some examples of apply# in action:&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;&lt;/span&gt;&lt;span class="scheme-comment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; `(k ,(apply# 'f--&amp;gt; 'x 'y 'z))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(f--&amp;gt; x y z (lambda (g349) (k g349)))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (apply# 'f--&amp;gt; (apply# '+--&amp;gt; 2 3) 'y 'z)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(+--&amp;gt; 2 3 (lambda (g345) (f--&amp;gt; g345 y z (lambda (g346) g346))))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (apply# 'f--&amp;gt; (apply# '+--&amp;gt; 2 3) (apply# '*--&amp;gt; 'x 'y) 'z)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(+--&amp;gt; 2 3 (lambda (g415) (*--&amp;gt; x y (lambda (g416) (f--&amp;gt; g415 g416 z (lambda (g417) g417))))))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;What about syntax like IF? clearly apply# would be wrong (due to evaluation order) so define new syntax!&lt;br /&gt;&lt;/span&gt;(&lt;span class="scheme-keyword"&gt;define-syntax&lt;/span&gt; &lt;span class="scheme-variable-name"&gt;if#&lt;/span&gt;&lt;br /&gt;  (&lt;span class="scheme-keyword"&gt;syntax-rules&lt;/span&gt; ()&lt;br /&gt;    ((if# &lt;span class="scheme-type"&gt;&amp;lt;cond&amp;gt;&lt;/span&gt; &lt;span class="scheme-type"&gt;&amp;lt;then&amp;gt;&lt;/span&gt; &lt;span class="scheme-type"&gt;&amp;lt;else&amp;gt;&lt;/span&gt;) (shift k `(&lt;span class="scheme-keyword"&gt;if&lt;/span&gt; ,&lt;span class="scheme-type"&gt;&amp;lt;cond&amp;gt;&lt;/span&gt; ,(reset (k &lt;span class="scheme-type"&gt;&amp;lt;then&amp;gt;&lt;/span&gt;)) ,(reset (k &lt;span class="scheme-type"&gt;&amp;lt;else&amp;gt;&lt;/span&gt;)))))))&lt;br /&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;Examples:&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;&lt;/span&gt;&lt;span class="scheme-comment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (if# (apply# 'zero?--&amp;gt; 'n) ''yes ''no)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(zero?--&amp;gt; n (lambda (g374) (if g374 'yes 'no)))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; `(display ,(if# (apply# 'zero?--&amp;gt; 'n) ''yes ''no))&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;(zero?--&amp;gt; n (lambda (g850) (if g850 (display 'yes) (display 'no))))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span class="scheme-keyword"&gt;define-syntax&lt;/span&gt; &lt;span class="scheme-variable-name"&gt;define#&lt;/span&gt;&lt;br /&gt;  (&lt;span class="scheme-keyword"&gt;syntax-rules&lt;/span&gt; ()&lt;br /&gt;    ((define# (name/args ...) body) `(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;name/args&lt;/span&gt; ... k--&amp;gt;) ,(reset `(k--&amp;gt; ,body))))))&lt;br /&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;That's enough now to CPS convert entire procedures:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (define# (fact-iter--&amp;gt; n acc)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;     &lt;/span&gt;&lt;span class="scheme-comment"&gt;(if# (apply# 'zero?--&amp;gt; 'n)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;          &lt;/span&gt;&lt;span class="scheme-comment"&gt;'acc&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;;          &lt;/span&gt;&lt;span class="scheme-comment"&gt;(apply# 'fact-iter--&amp;gt; (apply# '---&amp;gt; 'n 1) (apply# '*--&amp;gt; 'acc 'n))))&lt;br /&gt;&lt;/span&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;fact-iter--&amp;gt;&lt;/span&gt; n acc k--&amp;gt;)&lt;br /&gt;  (zero?--&amp;gt; n (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g875)&lt;br /&gt;   (&lt;span class="scheme-keyword"&gt;if&lt;/span&gt; g875&lt;br /&gt;       (k--&amp;gt; acc)&lt;br /&gt;       (---&amp;gt; n 1 (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g876)&lt;br /&gt;        (*--&amp;gt; acc n (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g877)&lt;br /&gt;         (fact-iter--&amp;gt; g876 g877 (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g878) (k--&amp;gt; g878)))))))))))&lt;br /&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;Test it! (this CPS format is a subset of Scheme)&lt;br /&gt;&lt;/span&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;zero?--&amp;gt;&lt;/span&gt; n k) (k (zero? n)))&lt;br /&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;*--&amp;gt;&lt;/span&gt; x y k) (k (* x y)))&lt;br /&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;---&amp;gt;&lt;/span&gt; x y k) (k (- x y)))&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (fact-iter--&amp;gt; 7 1 display)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;5040&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;Now a function to CPS convert based on all this is trivial, it's just a fold&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;that replaces if with if#, define with define# and applications with apply#!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;if#-thunked&lt;/span&gt; cond then-thunk else-thunk) (if# cond (then-thunk) (else-thunk)))&lt;br /&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;define#-thunked&lt;/span&gt; name/args body-thunk)&lt;br /&gt;  (&lt;span class="scheme-keyword"&gt;let&lt;/span&gt; ((k--&amp;gt; (gensym &lt;span class="scheme-string"&gt;"k--&amp;gt;"&lt;/span&gt;))) `(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (,@name/args ,k--&amp;gt;) ,(reset `(,k--&amp;gt; ,(body-thunk))))))&lt;br /&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;cps&lt;/span&gt; term)&lt;br /&gt;  (&lt;span class="scheme-keyword"&gt;if&lt;/span&gt; (pair? term)&lt;br /&gt;      (&lt;span class="scheme-keyword"&gt;case&lt;/span&gt; (car term)&lt;br /&gt;        ((quote) `',term)&lt;br /&gt;        ((&lt;span class="scheme-keyword"&gt;if&lt;/span&gt;) (if#-thunked (cps (cadr term)) (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; () (cps (caddr term))) (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; () (cps (cadddr term)))))&lt;br /&gt;        ((&lt;span class="scheme-keyword"&gt;define&lt;/span&gt;) (define#-thunked (cadr term) (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; () (cps (caddr term)))))&lt;br /&gt;        (&lt;span class="scheme-keyword"&gt;else&lt;/span&gt; (apply apply# (&lt;span class="scheme-keyword"&gt;map&lt;/span&gt; cps term))))&lt;br /&gt;      term))&lt;br /&gt;&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (cps '(define (fact-iter-2 n acc) (if (zero? n) acc (fact-iter-2 (- n 1) (* n acc)))))&lt;br /&gt;&lt;/span&gt;(&lt;span class="scheme-keyword"&gt;define&lt;/span&gt; (&lt;span class="scheme-function-name"&gt;fact-iter-2--&amp;gt;&lt;/span&gt; n acc k--&amp;gt;)&lt;br /&gt;  (zero?--&amp;gt; n (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g443)&lt;br /&gt;   (&lt;span class="scheme-keyword"&gt;if&lt;/span&gt; g443&lt;br /&gt;       (k--&amp;gt; acc)&lt;br /&gt;       (---&amp;gt; n 1 (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g444)&lt;br /&gt;        (*--&amp;gt; n acc (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g445)&lt;br /&gt;         (fact-iter-2--&amp;gt; g444 g445 (&lt;span class="scheme-keyword"&gt;lambda&lt;/span&gt; (g446)&lt;br /&gt;          (k--&amp;gt; g446)))))))))))&lt;br /&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;&amp;gt; (fact-iter-2--&amp;gt; 8 1 display)&lt;br /&gt;&lt;/span&gt;&lt;span class="scheme-comment-delimiter"&gt;;; &lt;/span&gt;&lt;span class="scheme-comment"&gt;40320&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5217788919276707669?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5217788919276707669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5217788919276707669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5217788919276707669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5217788919276707669'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/02/cps-transformation-using-delimited.html' title='CPS transformation using delimited continuations'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-8943274203372825680</id><published>2009-01-21T05:22:00.000-08:00</published><updated>2009-01-22T09:11:03.541-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eta'/><category scheme='http://www.blogger.com/atom/ns#' term='Dependent Types'/><category scheme='http://www.blogger.com/atom/ns#' term='beta'/><category scheme='http://www.blogger.com/atom/ns#' term='NbE'/><title type='text'>alternative beta-eta equality test</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Prelude&lt;/span&gt; &lt;span class="haskellkeyword"&gt;hiding&lt;/span&gt; (lookup,(&lt;span class="haskellvariable-name"&gt;$&lt;/span&gt;))&lt;br /&gt;&lt;span class="haskellkeyword"&gt;import&lt;/span&gt; &lt;span class="haskelltype"&gt;Control.Monad&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;type&lt;/span&gt; &lt;span class="haskelltype"&gt;Ref&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Integer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Neutral&lt;/span&gt; &lt;span class="haskelltype"&gt;N&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Lam&lt;/span&gt; (&lt;span class="haskelltype"&gt;V&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Pi&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt; (&lt;span class="haskelltype"&gt;V&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Set&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Type&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;N&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;App&lt;/span&gt; &lt;span class="haskelltype"&gt;N&lt;/span&gt; &lt;span class="haskelltype"&gt;V&lt;/span&gt;&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Var&lt;/span&gt; &lt;span class="haskelltype"&gt;Ref&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskelltype"&gt;Neutral&lt;/span&gt; n &lt;span class="haskellvariable-name"&gt;$&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Neutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;App&lt;/span&gt; n x)&lt;br /&gt;&lt;span class="haskelltype"&gt;Lam&lt;/span&gt; f &lt;span class="haskellvariable-name"&gt;$&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; f x&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;lookup&lt;/span&gt; ((i, tau) &lt;span class="haskelltype"&gt;:&lt;/span&gt; gamma) j&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; i &lt;span class="haskellvariable-name"&gt;==&lt;/span&gt; j &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Just&lt;/span&gt; tau&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; otherwise &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; lookup gamma j&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;lookup&lt;/span&gt; &lt;span class="haskelltype"&gt;[]&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eq&lt;/span&gt; gamma i f g (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; tau sigmaF) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; eq ((i, tau) &lt;span class="haskelltype"&gt;:&lt;/span&gt; gamma) (i&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) (f &lt;span class="haskellvariable-name"&gt;$&lt;/span&gt; x) (g &lt;span class="haskellvariable-name"&gt;$&lt;/span&gt; x) (sigmaF x) &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Neutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;Var&lt;/span&gt; i)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eq&lt;/span&gt; gamma i (&lt;span class="haskelltype"&gt;Neutral&lt;/span&gt; n) (&lt;span class="haskelltype"&gt;Neutral&lt;/span&gt; m) &lt;span class="haskelltype"&gt;Set&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; maybe &lt;span class="haskelltype"&gt;False&lt;/span&gt; (const &lt;span class="haskelltype"&gt;True&lt;/span&gt;) (eqN gamma i n m)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eq&lt;/span&gt; gamma i s t &lt;span class="haskelltype"&gt;Type&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; eqT gamma i s t&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqT&lt;/span&gt; gamma i (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; s tF) (&lt;span class="haskelltype"&gt;Pi&lt;/span&gt; u vF) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; eqT gamma i s u &lt;span class="haskellvariable-name"&gt;&amp;amp;&amp;amp;&lt;/span&gt; eqT ((i, s) &lt;span class="haskelltype"&gt;:&lt;/span&gt; gamma) (i&lt;span class="haskellvariable-name"&gt;+&lt;/span&gt;1) (tF x) (vF x) &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Neutral&lt;/span&gt; (&lt;span class="haskelltype"&gt;Var&lt;/span&gt; i)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqT&lt;/span&gt; gamma i &lt;span class="haskelltype"&gt;Set&lt;/span&gt; &lt;span class="haskelltype"&gt;Set&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqN&lt;/span&gt; gamma i (&lt;span class="haskelltype"&gt;App&lt;/span&gt; n x) (&lt;span class="haskelltype"&gt;App&lt;/span&gt; m y) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;Pi&lt;/span&gt; tau sigmaF &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; eqN gamma i n m&lt;br /&gt; guard (eq gamma i x y tau)&lt;br /&gt; return (sigmaF x)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;eqN&lt;/span&gt; gamma &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; (&lt;span class="haskelltype"&gt;Var&lt;/span&gt; i) (&lt;span class="haskelltype"&gt;Var&lt;/span&gt; j)&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; i &lt;span class="haskellvariable-name"&gt;==&lt;/span&gt; j &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; lookup gamma i&lt;br /&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; otherwise &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;test = eq [] 0&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Lam (\x -&amp;gt; x))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Lam (\f -&amp;gt; Lam (\x -&amp;gt; f $ x)))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--   &lt;/span&gt;&lt;span class="haskellcomment"&gt;(Pi (Pi Set (\_ -&amp;gt; Set)) (\_ -&amp;gt; (Pi Set (\_ -&amp;gt; Set))))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; test&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;True&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-8943274203372825680?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/8943274203372825680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=8943274203372825680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8943274203372825680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8943274203372825680'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/01/alternative-beta-eta-equality-test.html' title='alternative beta-eta equality test'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-9068874843119586934</id><published>2009-01-12T01:08:00.000-08:00</published><updated>2009-01-12T01:09:35.421-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GADT nonsense'/><category scheme='http://www.blogger.com/atom/ns#' term='Data.Dynamic'/><title type='text'>Data.Dynamic without typeclasses or unsafeCoerce</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;{-&lt;/span&gt;&lt;span class="haskellcomment"&gt;# LANGUAGE RankNTypes, GADTs #-}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; t &lt;span class="haskellkeyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;BOOL&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; &lt;span class="haskelltype"&gt;Bool&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;INT&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; &lt;span class="haskelltype"&gt;Integer&lt;/span&gt;&lt;br /&gt; (&lt;span class="haskelltype"&gt;:-&amp;gt;:&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; b &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; (a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; b)&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;DYNAMIC&lt;/span&gt; &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; &lt;span class="haskelltype"&gt;UnDYNAMIC&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;DYNAMIC&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;Equal&lt;/span&gt; a b &lt;span class="haskellkeyword"&gt;where&lt;/span&gt; &lt;span class="haskelltype"&gt;REFL&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;Equal&lt;/span&gt; x x&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;mkDyn&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;DYNAMIC&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;mkDyn&lt;/span&gt; code obj &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;UnDYNAMIC&lt;/span&gt; code obj&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;decide&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; u &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Maybe&lt;/span&gt; (&lt;span class="haskelltype"&gt;Equal&lt;/span&gt; t u)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;decide&lt;/span&gt; &lt;span class="haskelltype"&gt;BOOL&lt;/span&gt; &lt;span class="haskelltype"&gt;BOOL&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Just&lt;/span&gt; &lt;span class="haskelltype"&gt;REFL&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;decide&lt;/span&gt; &lt;span class="haskelltype"&gt;INT&lt;/span&gt; &lt;span class="haskelltype"&gt;INT&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Just&lt;/span&gt; &lt;span class="haskelltype"&gt;REFL&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;decide&lt;/span&gt; (u &lt;span class="haskelltype"&gt;:-&amp;gt;:&lt;/span&gt; v) (p &lt;span class="haskelltype"&gt;:-&amp;gt;:&lt;/span&gt; q) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; &lt;span class="haskelltype"&gt;REFL&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; decide u p; &lt;span class="haskelltype"&gt;REFL&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; decide v q; return &lt;span class="haskelltype"&gt;REFL&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;decide&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unbox&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;DYNAMIC&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;DYN&lt;/span&gt; t &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Maybe&lt;/span&gt; t&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;unbox&lt;/span&gt; (&lt;span class="haskelltype"&gt;UnDYNAMIC&lt;/span&gt; t e) u &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellkeyword"&gt;do&lt;/span&gt; &lt;span class="haskelltype"&gt;REFL&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;&amp;lt;-&lt;/span&gt; decide t u; return e&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;list&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; [ mkDyn &lt;span class="haskelltype"&gt;BOOL&lt;/span&gt; &lt;span class="haskelltype"&gt;True&lt;/span&gt;, mkDyn &lt;span class="haskelltype"&gt;INT&lt;/span&gt; 34, mkDyn (&lt;span class="haskelltype"&gt;BOOL&lt;/span&gt; &lt;span class="haskelltype"&gt;:-&amp;gt;:&lt;/span&gt; &lt;span class="haskelltype"&gt;INT&lt;/span&gt;) (&lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskellkeyword"&gt;if&lt;/span&gt; x &lt;span class="haskellkeyword"&gt;then&lt;/span&gt; 32 &lt;span class="haskellkeyword"&gt;else&lt;/span&gt; 56) ]&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; unbox (list !! 0) BOOL&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Just True&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; unbox (list !! 1) BOOL&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Nothing&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; unbox (list !! 2) BOOL&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Nothing&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; unbox (list !! 0) INT&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Nothing&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; unbox (list !! 1) INT&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Just 34&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; unbox (list !! 2) INT&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Nothing&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;--&lt;/span&gt;&lt;span class="haskellcomment"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; fmap ($ True) (unbox (list !! 2) (BOOL:-&amp;gt;:INT))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Just 32&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; fmap ($ False) (unbox (list !! 2) (BOOL:-&amp;gt;:INT))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Just 56&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; fmap ($ True) (unbox (list !! 1) (BOOL:-&amp;gt;:INT))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;Nothing&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-9068874843119586934?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/9068874843119586934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=9068874843119586934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/9068874843119586934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/9068874843119586934'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/01/datadynamic-without-typeclasses-or.html' title='Data.Dynamic without typeclasses or unsafeCoerce'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-1864244126761097212</id><published>2009-01-06T03:14:00.001-08:00</published><updated>2009-01-06T10:31:41.983-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GADT'/><title type='text'>More GADT nonsense</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;{-&lt;/span&gt;&lt;span class="haskellcomment"&gt;# LANGUAGE GADTs #-}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a fa k z &lt;span class="haskellkeyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;CTR&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; c &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a c z z&lt;br /&gt; &lt;span class="haskelltype"&gt;VAR&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a (a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; r) k z &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a r (a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; k) z&lt;br /&gt; &lt;span class="haskelltype"&gt;REC&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a (f a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; r) k z &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a r (f a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; k) z&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;infixr&lt;/span&gt; &lt;span class="haskellfunction-name"&gt;:+:&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a ka z &lt;span class="haskellkeyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="haskelltype"&gt;ZRO&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a (f a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; z) z&lt;br /&gt; (&lt;span class="haskelltype"&gt;:+:&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a (f a) k z &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a ka z &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a (k &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; ka) z&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;size&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; kase &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a kase &lt;span class="haskelltype"&gt;Integer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; f a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Integer&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;size&lt;/span&gt; kase code &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; size' kase code kase code&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;size'&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; kase &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a kase &lt;span class="haskelltype"&gt;Integer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; ka &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a ka &lt;span class="haskelltype"&gt;Integer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; f a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Integer&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;size'&lt;/span&gt; kase code ka &lt;span class="haskelltype"&gt;ZRO&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; ka&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;size'&lt;/span&gt; kase code ka (t &lt;span class="haskelltype"&gt;:+:&lt;/span&gt; ts) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; size' kase code (ka (sizeCON kase code 0 t)) ts&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;sizeCON&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; kase &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a kase &lt;span class="haskelltype"&gt;Integer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;Integer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a i0 k &lt;span class="haskelltype"&gt;Integer&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; k&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;sizeCON&lt;/span&gt; kase code k (&lt;span class="haskelltype"&gt;CTR&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; 0 &lt;span class="haskellvariable-name"&gt;+&lt;/span&gt; k&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;sizeCON&lt;/span&gt; kase code k (&lt;span class="haskelltype"&gt;VAR&lt;/span&gt; r) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;&lt;span class="haskellkeyword"&gt;_&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; sizeCON kase code (1 &lt;span class="haskellvariable-name"&gt;+&lt;/span&gt; k) r&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;sizeCON&lt;/span&gt; kase code k (&lt;span class="haskelltype"&gt;REC&lt;/span&gt; r) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; sizeCON kase code (size kase code x &lt;span class="haskellvariable-name"&gt;+&lt;/span&gt; k) r&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfs&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; kase &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a kase [a] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; f a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; [a]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfs&lt;/span&gt; kase code &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; dfs' kase code kase code&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfs'&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; kase &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a kase [a] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; ka &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a ka [a] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; f a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; [a]&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfs'&lt;/span&gt; kase code ka &lt;span class="haskelltype"&gt;ZRO&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; ka&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfs'&lt;/span&gt; kase code ka (t &lt;span class="haskelltype"&gt;:+:&lt;/span&gt; ts) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; dfs' kase code (ka (dfsCON kase code &lt;span class="haskelltype"&gt;[]&lt;/span&gt; t)) ts&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfsCON&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;::&lt;/span&gt; kase &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;SUM&lt;/span&gt; f a kase [a] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; [a] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="haskelltype"&gt;CON&lt;/span&gt; f a i0 k [a] &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; k&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfsCON&lt;/span&gt; kase code k (&lt;span class="haskelltype"&gt;CTR&lt;/span&gt; &lt;span class="haskellkeyword"&gt;_&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; k&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfsCON&lt;/span&gt; kase code k (&lt;span class="haskelltype"&gt;VAR&lt;/span&gt; r) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;a &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; dfsCON kase code (a &lt;span class="haskelltype"&gt;:&lt;/span&gt; k) r&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;dfsCON&lt;/span&gt; kase code k (&lt;span class="haskelltype"&gt;REC&lt;/span&gt; r) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;\&lt;/span&gt;x &lt;span class="haskellvariable-name"&gt;-&amp;gt;&lt;/span&gt; dfsCON kase code (dfs kase code x &lt;span class="haskellvariable-name"&gt;++&lt;/span&gt; k) r&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;Both&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; a &lt;span class="haskelltype"&gt;:&amp;amp;:&lt;/span&gt; a&lt;br /&gt;(&lt;span class="haskellfunction-name"&gt;&amp;amp;&lt;/span&gt;) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VAR&lt;/span&gt; (&lt;span class="haskelltype"&gt;VAR&lt;/span&gt; (&lt;span class="haskelltype"&gt;CTR&lt;/span&gt; (&lt;span class="haskelltype"&gt;:&amp;amp;:&lt;/span&gt;)))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;both&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;&amp;amp;&lt;/span&gt;) &lt;span class="haskelltype"&gt;:+:&lt;/span&gt; &lt;span class="haskelltype"&gt;ZRO&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;bothCase&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;&amp;amp;&lt;/span&gt;) (x &lt;span class="haskelltype"&gt;:&amp;amp;:&lt;/span&gt; y) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; x &lt;span class="haskellvariable-name"&gt;&amp;amp;&lt;/span&gt; y&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;bothCaseR&lt;/span&gt; (&lt;span class="haskellvariable-name"&gt;&amp;amp;&lt;/span&gt;) (x &lt;span class="haskelltype"&gt;:&amp;amp;:&lt;/span&gt; y) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; y &lt;span class="haskellvariable-name"&gt;&amp;amp;&lt;/span&gt; x&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;List&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Nil&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Cons&lt;/span&gt; a (&lt;span class="haskelltype"&gt;List&lt;/span&gt; a)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;nil&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;CTR&lt;/span&gt; (&lt;span class="haskelltype"&gt;Nil&lt;/span&gt;)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;cons&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;REC&lt;/span&gt; (&lt;span class="haskelltype"&gt;VAR&lt;/span&gt; (&lt;span class="haskelltype"&gt;CTR&lt;/span&gt; (&lt;span class="haskelltype"&gt;Cons&lt;/span&gt;)))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;list&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; nil &lt;span class="haskelltype"&gt;:+:&lt;/span&gt; cons &lt;span class="haskelltype"&gt;:+:&lt;/span&gt; &lt;span class="haskelltype"&gt;ZRO&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;listCase&lt;/span&gt; nil cons &lt;span class="haskelltype"&gt;Nil&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; nil&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;listCase&lt;/span&gt; nil cons (&lt;span class="haskelltype"&gt;Cons&lt;/span&gt; x xs) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; cons x xs&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;listCaseR&lt;/span&gt; nil cons &lt;span class="haskelltype"&gt;Nil&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; nil&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;listCaseR&lt;/span&gt; nil cons (&lt;span class="haskelltype"&gt;Cons&lt;/span&gt; x xs) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; cons xs x&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellkeyword"&gt;data&lt;/span&gt; &lt;span class="haskelltype"&gt;Tree&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;Leaf&lt;/span&gt; a &lt;span class="haskellvariable-name"&gt;|&lt;/span&gt; &lt;span class="haskelltype"&gt;Branch&lt;/span&gt; (&lt;span class="haskelltype"&gt;Tree&lt;/span&gt; a) (&lt;span class="haskelltype"&gt;Tree&lt;/span&gt; a)&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;leaf&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;VAR&lt;/span&gt; (&lt;span class="haskelltype"&gt;CTR&lt;/span&gt; (&lt;span class="haskelltype"&gt;Leaf&lt;/span&gt;))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;branch&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; &lt;span class="haskelltype"&gt;REC&lt;/span&gt; (&lt;span class="haskelltype"&gt;REC&lt;/span&gt; (&lt;span class="haskelltype"&gt;CTR&lt;/span&gt; &lt;span class="haskelltype"&gt;Branch&lt;/span&gt;))&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;tree&lt;/span&gt; &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; leaf &lt;span class="haskelltype"&gt;:+:&lt;/span&gt; branch &lt;span class="haskelltype"&gt;:+:&lt;/span&gt; &lt;span class="haskelltype"&gt;ZRO&lt;/span&gt;&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;treeCase&lt;/span&gt; leaf branch (&lt;span class="haskelltype"&gt;Leaf&lt;/span&gt; a) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; leaf a&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;treeCase&lt;/span&gt; leaf branch (&lt;span class="haskelltype"&gt;Branch&lt;/span&gt; l r) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; branch l r&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;treeCaseR&lt;/span&gt; leaf branch (&lt;span class="haskelltype"&gt;Leaf&lt;/span&gt; a) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; leaf a&lt;br /&gt;&lt;span class="haskellfunction-name"&gt;treeCaseR&lt;/span&gt; leaf branch (&lt;span class="haskelltype"&gt;Branch&lt;/span&gt; l r) &lt;span class="haskellvariable-name"&gt;=&lt;/span&gt; branch r l&lt;br /&gt;&lt;br /&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; size bothCaseR both (True :&amp;amp;: False)&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;2&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; size listCaseR list (Cons 'x' (Cons 'y' (Cons 'z' Nil)))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;3&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; size treeCaseR tree (Branch (Leaf ()) (Branch (Branch (Leaf ()) (Leaf ())) (Leaf ())))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;4&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; dfs listCaseR list (Cons 'x' (Cons 'y' (Cons 'z' Nil)))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;"xyz"&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;&amp;gt; dfs treeCaseR tree (Branch (Leaf 4) (Branch (Branch (Leaf 3) (Leaf 5)) (Leaf 7)))&lt;br /&gt;&lt;/span&gt;&lt;span class="haskellcomment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="haskellcomment"&gt;[4,3,5,7]&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-1864244126761097212?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/1864244126761097212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=1864244126761097212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/1864244126761097212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/1864244126761097212'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/01/more-gadt-nonsense.html' title='More GADT nonsense'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-7759499820608240561</id><published>2009-01-04T07:00:00.000-08:00</published><updated>2009-01-11T04:51:18.536-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='STLC'/><category scheme='http://www.blogger.com/atom/ns#' term='eta'/><category scheme='http://www.blogger.com/atom/ns#' term='beta'/><category scheme='http://www.blogger.com/atom/ns#' term='NbE'/><title type='text'>beta eta equality for STLC by NbE</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="comment-delimiter"&gt;{-&lt;/span&gt;&lt;span class="comment"&gt;# LANGUAGE NoMonomorphismRestriction #-}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; &lt;span class="type"&gt;Prelude&lt;/span&gt; &lt;span class="keyword"&gt;hiding&lt;/span&gt; ((&lt;span class="variable-name"&gt;$&lt;/span&gt;))&lt;br /&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; &lt;span class="type"&gt;Control.Monad&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;type&lt;/span&gt; &lt;span class="type"&gt;Ref&lt;/span&gt; &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Int&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;newtype&lt;/span&gt; &lt;span class="type"&gt;Scope&lt;/span&gt; a &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Scope&lt;/span&gt; a &lt;span class="keyword"&gt;deriving&lt;/span&gt; (&lt;span class="type"&gt;Eq&lt;/span&gt;, &lt;span class="type"&gt;Show&lt;/span&gt;)&lt;br /&gt;&lt;span class="keyword"&gt;data&lt;/span&gt; &lt;span class="type"&gt;T&lt;/span&gt; &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;O&lt;/span&gt; &lt;span class="variable-name"&gt;|&lt;/span&gt; &lt;span class="type"&gt;T&lt;/span&gt; &lt;span class="type"&gt;:-&amp;gt;:&lt;/span&gt; &lt;span class="type"&gt;T&lt;/span&gt; &lt;span class="keyword"&gt;deriving&lt;/span&gt; (&lt;span class="type"&gt;Eq&lt;/span&gt;, &lt;span class="type"&gt;Show&lt;/span&gt;)&lt;br /&gt;&lt;span class="keyword"&gt;data&lt;/span&gt; &lt;span class="type"&gt;S&lt;/span&gt; &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Var&lt;/span&gt; &lt;span class="type"&gt;Ref&lt;/span&gt; &lt;span class="variable-name"&gt;|&lt;/span&gt; &lt;span class="type"&gt;Lam&lt;/span&gt; &lt;span class="type"&gt;T&lt;/span&gt; (&lt;span class="type"&gt;Scope&lt;/span&gt; &lt;span class="type"&gt;S&lt;/span&gt;) &lt;span class="variable-name"&gt;|&lt;/span&gt; &lt;span class="type"&gt;App&lt;/span&gt; &lt;span class="type"&gt;S&lt;/span&gt; &lt;span class="type"&gt;S&lt;/span&gt;&lt;br /&gt;       &lt;span class="variable-name"&gt;|&lt;/span&gt; &lt;span class="type"&gt;Quote&lt;/span&gt; &lt;span class="type"&gt;Ref&lt;/span&gt; &lt;span class="keyword"&gt;deriving&lt;/span&gt; (&lt;span class="type"&gt;Eq&lt;/span&gt;, &lt;span class="type"&gt;Show&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;abstract&lt;/span&gt; i t &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Scope&lt;/span&gt; (extract 0 t) &lt;span class="keyword"&gt;where&lt;/span&gt;&lt;br /&gt; extract r (&lt;span class="type"&gt;Var&lt;/span&gt; j) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Var&lt;/span&gt; j&lt;br /&gt; extract r (&lt;span class="type"&gt;Lam&lt;/span&gt; t (&lt;span class="type"&gt;Scope&lt;/span&gt; b)) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Lam&lt;/span&gt; t (&lt;span class="type"&gt;Scope&lt;/span&gt; (extract (r&lt;span class="variable-name"&gt;+&lt;/span&gt;1) b))&lt;br /&gt; extract r (&lt;span class="type"&gt;App&lt;/span&gt; m n) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;App&lt;/span&gt; (extract r m) (extract r n)&lt;br /&gt; extract r (&lt;span class="type"&gt;Quote&lt;/span&gt; j)&lt;br /&gt;  &lt;span class="variable-name"&gt;|&lt;/span&gt; j &lt;span class="variable-name"&gt;==&lt;/span&gt; i &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Var&lt;/span&gt; r&lt;br /&gt;  &lt;span class="variable-name"&gt;|&lt;/span&gt; otherwise &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Quote&lt;/span&gt; j&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;gamma&lt;/span&gt; &lt;span class="function-name"&gt;|-&lt;/span&gt; &lt;span class="type"&gt;Var&lt;/span&gt; i &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Just&lt;/span&gt; (gamma &lt;span class="variable-name"&gt;!!&lt;/span&gt; i)&lt;br /&gt;&lt;span class="function-name"&gt;gamma&lt;/span&gt; &lt;span class="function-name"&gt;|-&lt;/span&gt; &lt;span class="type"&gt;Lam&lt;/span&gt; u (&lt;span class="type"&gt;Scope&lt;/span&gt; b) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; v &lt;span class="variable-name"&gt;&amp;lt;-&lt;/span&gt; (u&lt;span class="type"&gt;:&lt;/span&gt;gamma) &lt;span class="variable-name"&gt;|-&lt;/span&gt; b ; return (u &lt;span class="type"&gt;:-&amp;gt;:&lt;/span&gt; v)&lt;br /&gt;&lt;span class="function-name"&gt;gamma&lt;/span&gt; &lt;span class="function-name"&gt;|-&lt;/span&gt; &lt;span class="type"&gt;App&lt;/span&gt; m n &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; u &lt;span class="type"&gt;:-&amp;gt;:&lt;/span&gt; v &lt;span class="variable-name"&gt;&amp;lt;-&lt;/span&gt; gamma &lt;span class="variable-name"&gt;|-&lt;/span&gt; m ; u' &lt;span class="variable-name"&gt;&amp;lt;-&lt;/span&gt; gamma &lt;span class="variable-name"&gt;|-&lt;/span&gt; n ; guard (u &lt;span class="variable-name"&gt;==&lt;/span&gt; u') ; return v&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;data&lt;/span&gt; &lt;span class="type"&gt;V&lt;/span&gt; &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;VLam&lt;/span&gt; (&lt;span class="type"&gt;V&lt;/span&gt; &lt;span class="variable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="type"&gt;V&lt;/span&gt;)&lt;br /&gt;       &lt;span class="variable-name"&gt;|&lt;/span&gt; &lt;span class="type"&gt;VNeutral&lt;/span&gt; &lt;span class="type"&gt;N&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;data&lt;/span&gt; &lt;span class="type"&gt;N&lt;/span&gt; &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;NApp&lt;/span&gt; &lt;span class="type"&gt;N&lt;/span&gt; &lt;span class="type"&gt;V&lt;/span&gt;&lt;br /&gt;       &lt;span class="variable-name"&gt;|&lt;/span&gt; &lt;span class="type"&gt;NQuote&lt;/span&gt; &lt;span class="type"&gt;Ref&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;VLam&lt;/span&gt; f &lt;span class="variable-name"&gt;$&lt;/span&gt; x &lt;span class="variable-name"&gt;=&lt;/span&gt; f x&lt;br /&gt;&lt;span class="type"&gt;VNeutral&lt;/span&gt; n &lt;span class="variable-name"&gt;$&lt;/span&gt; x &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;VNeutral&lt;/span&gt; (&lt;span class="type"&gt;NApp&lt;/span&gt; n x)&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;eval&lt;/span&gt; delta (&lt;span class="type"&gt;Var&lt;/span&gt; j) &lt;span class="variable-name"&gt;=&lt;/span&gt; delta &lt;span class="variable-name"&gt;!!&lt;/span&gt; j&lt;br /&gt;&lt;span class="function-name"&gt;eval&lt;/span&gt; delta (&lt;span class="type"&gt;Lam&lt;/span&gt; &lt;span class="keyword"&gt;_&lt;/span&gt; (&lt;span class="type"&gt;Scope&lt;/span&gt; b)) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;VLam&lt;/span&gt; (&lt;span class="variable-name"&gt;\&lt;/span&gt;x &lt;span class="variable-name"&gt;-&amp;gt;&lt;/span&gt; eval (x&lt;span class="type"&gt;:&lt;/span&gt;delta) b)&lt;br /&gt;&lt;span class="function-name"&gt;eval&lt;/span&gt; delta (&lt;span class="type"&gt;App&lt;/span&gt; m n) &lt;span class="variable-name"&gt;=&lt;/span&gt; eval delta m &lt;span class="variable-name"&gt;$&lt;/span&gt; eval delta n&lt;br /&gt;&lt;br /&gt;&lt;span class="comment-delimiter"&gt;--&lt;/span&gt;&lt;span class="comment"&gt;----------------- OLD&lt;br /&gt;&lt;/span&gt;&lt;span class="comment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="comment"&gt;r :: T -&amp;gt; V -&amp;gt; V&lt;br /&gt;&lt;/span&gt;&lt;span class="comment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="comment"&gt;r O e = e&lt;br /&gt;&lt;/span&gt;&lt;span class="comment-delimiter"&gt;-- &lt;/span&gt;&lt;span class="comment"&gt;r (tau :-&amp;gt;: sigma) f = VLam (\x -&amp;gt; r sigma (f $ (r tau x)))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment-delimiter"&gt;--&lt;/span&gt;&lt;span class="comment"&gt;----------------- NEW&lt;br /&gt;&lt;/span&gt;&lt;span class="function-name"&gt;r&lt;/span&gt; &lt;span class="variable-name"&gt;::&lt;/span&gt; &lt;span class="type"&gt;T&lt;/span&gt; &lt;span class="variable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="type"&gt;V&lt;/span&gt; &lt;span class="variable-name"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="type"&gt;V&lt;/span&gt;&lt;br /&gt;&lt;span class="function-name"&gt;r&lt;/span&gt; &lt;span class="type"&gt;O&lt;/span&gt; e &lt;span class="variable-name"&gt;=&lt;/span&gt; e&lt;br /&gt;&lt;span class="function-name"&gt;r&lt;/span&gt; (tau &lt;span class="type"&gt;:-&amp;gt;:&lt;/span&gt; sigma) f &lt;span class="variable-name"&gt;=&lt;/span&gt; f &lt;span class="variable-name"&gt;$&lt;/span&gt; &lt;span class="type"&gt;VLam&lt;/span&gt; (&lt;span class="variable-name"&gt;\&lt;/span&gt;f &lt;span class="variable-name"&gt;-&amp;gt;&lt;/span&gt; r sigma (&lt;span class="type"&gt;VLam&lt;/span&gt; (&lt;span class="variable-name"&gt;\&lt;/span&gt;x &lt;span class="variable-name"&gt;-&amp;gt;&lt;/span&gt; f &lt;span class="variable-name"&gt;$&lt;/span&gt; (r tau x))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;q&lt;/span&gt; i (&lt;span class="type"&gt;VLam&lt;/span&gt; f) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Lam&lt;/span&gt; &lt;span class="type"&gt;O&lt;/span&gt; (abstract i (q (i&lt;span class="variable-name"&gt;+&lt;/span&gt;1) (f (&lt;span class="type"&gt;VNeutral&lt;/span&gt; (&lt;span class="type"&gt;NQuote&lt;/span&gt; i)))))&lt;br /&gt;&lt;span class="function-name"&gt;q&lt;/span&gt; i (&lt;span class="type"&gt;VNeutral&lt;/span&gt; n) &lt;span class="variable-name"&gt;=&lt;/span&gt; nq i n&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;nq&lt;/span&gt; i (&lt;span class="type"&gt;NApp&lt;/span&gt; m n) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;App&lt;/span&gt; (nq i m) (q i n)&lt;br /&gt;&lt;span class="function-name"&gt;nq&lt;/span&gt; i (&lt;span class="type"&gt;NQuote&lt;/span&gt; j) &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Quote&lt;/span&gt; j&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;nf&lt;/span&gt; tm &lt;span class="variable-name"&gt;=&lt;/span&gt; fmap (q 0 &lt;span class="variable-name"&gt;.&lt;/span&gt; flip r (eval &lt;span class="type"&gt;[]&lt;/span&gt; tm)) (&lt;span class="type"&gt;[]&lt;/span&gt; &lt;span class="variable-name"&gt;|-&lt;/span&gt; tm)&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;identity&lt;/span&gt; &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Lam&lt;/span&gt; (&lt;span class="type"&gt;O&lt;/span&gt; &lt;span class="type"&gt;:-&amp;gt;:&lt;/span&gt; &lt;span class="type"&gt;O&lt;/span&gt;) (&lt;span class="type"&gt;Scope&lt;/span&gt; (&lt;span class="type"&gt;Var&lt;/span&gt; 0))&lt;br /&gt;&lt;span class="function-name"&gt;dollar&lt;/span&gt; &lt;span class="variable-name"&gt;=&lt;/span&gt; &lt;span class="type"&gt;Lam&lt;/span&gt; (&lt;span class="type"&gt;O&lt;/span&gt; &lt;span class="type"&gt;:-&amp;gt;:&lt;/span&gt; &lt;span class="type"&gt;O&lt;/span&gt;) (&lt;span class="type"&gt;Scope&lt;/span&gt; (&lt;span class="type"&gt;Lam&lt;/span&gt; &lt;span class="type"&gt;O&lt;/span&gt; (&lt;span class="type"&gt;Scope&lt;/span&gt; (&lt;span class="type"&gt;App&lt;/span&gt; (&lt;span class="type"&gt;Var&lt;/span&gt; 1) (&lt;span class="type"&gt;Var&lt;/span&gt; 0)))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment-delimiter"&gt;{- &lt;/span&gt;&lt;span class="comment"&gt;OLDER&lt;br /&gt;{-# LANGUAGE NoMonomorphismRestriction #-}&lt;br /&gt;&lt;br /&gt;import Control.Monad&lt;br /&gt;&lt;br /&gt;type Ref = Int&lt;br /&gt;newtype Scope a = Scope a deriving (Eq, Show)&lt;br /&gt;data T = O | T :-&amp;gt;: T deriving (Eq, Show)&lt;br /&gt;data S = Var Ref | Lam T (Scope S) | App S S&lt;br /&gt;       | Quote Ref deriving (Eq, Show)&lt;br /&gt;&lt;br /&gt;gamma |- Var i = Just (gamma !! i)&lt;br /&gt;gamma |- Lam u (Scope b) = do v &amp;lt;- (u:gamma) |- b ; return (u :-&amp;gt;: v)&lt;br /&gt;gamma |- App m n = do u :-&amp;gt;: v &amp;lt;- gamma |- m ; u' &amp;lt;- gamma |- n ; guard (u == u') ; return v&lt;br /&gt;&lt;br /&gt;data V = VLam T (V -&amp;gt; V) | VNeutral N&lt;br /&gt;       | VQuote Ref&lt;br /&gt;data N = NVar V | NApp N V&lt;br /&gt;       | NQuote Ref&lt;br /&gt;&lt;br /&gt;lift i (Var j)&lt;br /&gt; | j &amp;lt; i = Var j&lt;br /&gt; | otherwise = Var (j+1)&lt;br /&gt;lift i (Lam t (Scope b)) = Lam t (Scope (lift (i+1) b))&lt;br /&gt;lift i (App m n) = App (lift i m) (lift i n)&lt;br /&gt;&lt;br /&gt;abstract i t = Scope (extract 0 t) where&lt;br /&gt; extract r (Var j) = Var j&lt;br /&gt; extract r (Lam t (Scope b)) = Lam t (Scope (extract (r+1) b))&lt;br /&gt; extract r (App m n) = App (extract r m) (extract r n)&lt;br /&gt; extract r (Quote j)&lt;br /&gt;  | j == i = Var r&lt;br /&gt;  | otherwise = Quote j&lt;br /&gt;&lt;br /&gt;eta u t = Lam u (Scope (App (lift 0 t) (Var 0)))&lt;br /&gt;&lt;br /&gt;etaReify (u :-&amp;gt;: v) (Lam t (Scope b)) delta gamma = VLam u (\x -&amp;gt; etaReify v b (x:delta) (u:gamma))&lt;br /&gt;etaReify (u :-&amp;gt;: v) t delta gamma = etaReify (u :-&amp;gt;: v) (eta u t) delta gamma&lt;br /&gt;etaReify O t delta gamma = betaEtaReify O t delta gamma&lt;br /&gt;&lt;br /&gt;betaEtaReify _   (Var i) delta gamma = delta !! i&lt;br /&gt;betaEtaReify tau (Lam t (Scope b)) delta gamma = etaReify tau (Lam t (Scope b)) delta gamma&lt;br /&gt;betaEtaReify tau (App m n) delta gamma = app (betaEtaReify (sigma :-&amp;gt;: tau) m delta gamma) (etaReify sigma n delta gamma)&lt;br /&gt; where sigma = case gamma |- n of Nothing -&amp;gt; error "Type error" ; Just sigma -&amp;gt; sigma&lt;br /&gt;       app (VLam _ f) x = f x&lt;br /&gt;       app (VNeutral n) x = VNeutral (NApp n x)&lt;br /&gt;       app (VQuote j) x = VNeutral (NApp (NQuote j) x)&lt;br /&gt;&lt;br /&gt;quote i (VLam t f) = Lam t (abstract i (quote (i+1) (f (VQuote i))))&lt;br /&gt;quote i (VNeutral n) = nquote i n&lt;br /&gt;quote i (VQuote j) = Quote j&lt;br /&gt;&lt;br /&gt;nquote i (NVar v) = quote i v&lt;br /&gt;nquote i (NApp n v) = App (nquote i n) (quote i v)&lt;br /&gt;nquote i (NQuote j) = Quote j&lt;br /&gt;&lt;br /&gt;betaEtaNF p = do&lt;br /&gt; t &amp;lt;- [] |- p&lt;br /&gt; return (quote 0 (etaReify t p [] []))&lt;br /&gt;&lt;br /&gt;betaEtaEqual p q = do&lt;br /&gt; t &amp;lt;- [] |- p ; t' &amp;lt;- [] |- q ; guard (t == t')&lt;br /&gt; return (quote 0 (etaReify t p [] []) == quote 0 (etaReify t q [] []))&lt;br /&gt;&lt;br /&gt;identity = Lam (O :-&amp;gt;: O) (Scope (Var 0))&lt;br /&gt;dollar = Lam (O :-&amp;gt;: O) (Scope (Lam O (Scope (App (Var 1) (Var 0)))))&lt;br /&gt;&lt;br /&gt;-- &amp;gt; betaEtaEqual identity dollar&lt;br /&gt;-- Just True&lt;br /&gt;-}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-7759499820608240561?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/7759499820608240561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=7759499820608240561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/7759499820608240561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/7759499820608240561'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2009/01/beta-eta-equality-for-stlc-by-nbe.html' title='beta eta equality for STLC by NbE'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-2019802531514826473</id><published>2008-12-26T14:40:00.000-08:00</published><updated>2008-12-27T04:13:46.024-08:00</updated><title type='text'>Other Peoples Thoughts</title><content type='html'>"i kinda like haskell and erlang but i don't think they make it any easier to do anything. by the time you learn how to do the one liners, time has passed and you've become a professor of computer science, and your applications no longer matter."&lt;br /&gt;&lt;br /&gt;"wow lisp occured in 1958"&lt;br /&gt;&lt;br /&gt;"Yeah, but Haskell does such nice things for you. Like pattern matching? Very mathematical feel"&lt;br /&gt;&lt;br /&gt;regarding C: "damn it.I m doing something so simple and its takes time.its like traveling from the UK to France via China"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-2019802531514826473?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/2019802531514826473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=2019802531514826473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2019802531514826473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2019802531514826473'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/12/other-peoples-thoughts.html' title='Other Peoples Thoughts'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-3412650975581638232</id><published>2008-12-21T10:07:00.001-08:00</published><updated>2008-12-21T10:09:52.085-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mutation'/><category scheme='http://www.blogger.com/atom/ns#' term='Subexpression elimination'/><category scheme='http://www.blogger.com/atom/ns#' term='Scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='SET'/><title type='text'>Common Subexpression Elimination</title><content type='html'>&lt;pre&gt;&lt;br /&gt;;; My example of when mutation is a useful tool that simplifies things.&lt;br /&gt;&lt;br /&gt;(define (identity i) i)&lt;br /&gt;(define (concat xs) (apply append xs))&lt;br /&gt;(define (concat-map f x) (concat (map f x)))&lt;br /&gt;(define (sort by xs)&lt;br /&gt;  (define (insert by x xs)&lt;br /&gt;    (if (null? xs)&lt;br /&gt;        (list x)&lt;br /&gt;        (if (&lt; (by x) (by (car xs)))&lt;br /&gt;            (cons x xs)&lt;br /&gt;            (cons (car xs) (insert by x (cdr xs))))))&lt;br /&gt;  (if (null? xs) '()&lt;br /&gt;      (insert by (car xs) (sort by (cdr xs)))))&lt;br /&gt;&lt;br /&gt;;; &amp;lt;variadic-tree&amp;gt; ::= &amp;lt;leaf&amp;gt; | (&amp;lt;variadic-tree&amp;gt; ...)&lt;br /&gt;;; &amp;lt;leaf&amp;gt; is any non-list datum&lt;br /&gt;&lt;br /&gt;(define (leaf? datum) (not (list? datum)))&lt;br /&gt;&lt;br /&gt;(define (variadic-tree leaf nodes)&lt;br /&gt;  (lambda (tree)&lt;br /&gt;    (if (leaf? tree)&lt;br /&gt;        (leaf tree)&lt;br /&gt;        (apply nodes (map (variadic-tree leaf nodes) tree)))))&lt;br /&gt;&lt;br /&gt;(define copy-tree (variadic-tree identity list))&lt;br /&gt;&lt;br /&gt;(define exp-1&lt;br /&gt;  (copy-tree&lt;br /&gt;   '(+ (* (- x-1 x-2) (- x-1 x-2))&lt;br /&gt;       (* (- y-1 y-2) (- y-1 y-2))&lt;br /&gt;       (* (- z-1 z-2) (- z-1 z-2)))))&lt;br /&gt;&lt;br /&gt;(define (splat tree)&lt;br /&gt;  (if (leaf? tree)&lt;br /&gt;      '()&lt;br /&gt;      (cons tree (concat-map splat tree))))&lt;br /&gt;&lt;br /&gt;(define (subexpressions tree) (sort length (cdr (splat tree))))&lt;br /&gt;&lt;br /&gt;(define (eliminate exp sub sym)&lt;br /&gt;  (cond ((null? exp) exp)&lt;br /&gt;        ((leaf? exp) exp)&lt;br /&gt;        ((cond ((equal? sub (car exp)) (set-car! exp sym))&lt;br /&gt;               (else (eliminate (car exp) sub sym)))&lt;br /&gt;         (eliminate (cdr exp) sub sym)&lt;br /&gt;         exp)))&lt;br /&gt;&lt;br /&gt;(define gensym&lt;br /&gt;  (let ((n 0))&lt;br /&gt;    (lambda ()&lt;br /&gt;      (set! n (+ n 1))&lt;br /&gt;      (string-&gt;symbol (string-append "g" (number-&gt;string n))))))&lt;br /&gt;&lt;br /&gt;(define (eliminate-subexpressions env exp subs)&lt;br /&gt;  (cond ((null? subs) `(let ,(reverse env) ,exp))&lt;br /&gt;        (else&lt;br /&gt;         (let* ((g (gensym))&lt;br /&gt;                (sub (car subs))&lt;br /&gt;                (exp-2 (eliminate exp sub g)))&lt;br /&gt;           (eliminate-subexpressions (cons (list g sub) env) exp-2 (subexpressions exp-2))))))&lt;br /&gt;&lt;br /&gt;;; (eliminate-subexpressions '() exp-1 (subexpressions exp-1))&lt;br /&gt;;; =&gt;&lt;br /&gt;;; (let ((g1 (- z-1 z-2))&lt;br /&gt;;;       (g2 (* g1 g1))&lt;br /&gt;;;       (g3 (- y-1 y-2))&lt;br /&gt;;;       (g4 (* g3 g3))&lt;br /&gt;;;       (g5 (- x-1 x-2))&lt;br /&gt;;;       (g6 (* g5 g5)))&lt;br /&gt;;;   (+ g6 g4 g2))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-3412650975581638232?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/3412650975581638232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=3412650975581638232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3412650975581638232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3412650975581638232'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/12/common-subexpression-elimination.html' title='Common Subexpression Elimination'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5917608659714876540</id><published>2008-12-08T04:08:00.000-08:00</published><updated>2008-12-09T10:06:06.830-08:00</updated><title type='text'>Virgin Killer</title><content type='html'>http://www.theregister.co.uk/2008/12/07/brit_isps_censor_wikipedia/&lt;br /&gt;&lt;br /&gt;http://iwfwebfilter.thus.net/error/blocked.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You are currently unable to edit pages on Wikipedia.&lt;br /&gt;&lt;br /&gt;You can still read pages, but cannot edit, change, or create them.&lt;br /&gt;&lt;br /&gt;Editing from 193.195.3.41 (your account, IP address, or IP address range) has been disabled by Lucasbfr for the following reason(s):&lt;br /&gt;&lt;br /&gt;193.195.3.41 &lt;-- This is the IP of the filter which I view wikipedia through.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I am not able to edit wikipedia because one of the million people viewing it through the same ip filter as me vandalised as article and was banned. I found out this censorship was the reason. Maybe if you want to help abused children you could find a way that doesn't mean sitting in a comfy chair fiddling with 1's and 0's and patting yourself on the back.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Statement by "IWF":&lt;br /&gt;&lt;br /&gt;"IWF statement regarding Wikipedia URL&lt;br /&gt;IWF is the UK’s internet ‘Hotline’ for the public and IT professionals to report potentially illegal online content within our remit. We work in partnership with the online industry, law enforcement, government, the education sector, charities, international partners and the public to minimise the availability of this content, specifically, child sexual abuse content hosted anywhere in the world and criminally obscene and incitement to racial hatred content hosted in the UK. We are an independent self-regulatory body, funded by the EU and the wider online industry, including internet service providers, mobile operators and manufacturers, content service providers, filtering companies, search providers, trade associations and the financial sector as well as other organisations that support us for corporate social responsibility reasons.&lt;br /&gt; &lt;br /&gt;We help internet service providers and hosting companies to combat abuse of their networks through our national ‘notice and take-down’ service which alerts them to potentially illegal content within our remit on their systems and we provide unique data to law enforcement partners in the UK and abroad to assist investigations into the distributers of potentially illegal online content. As sexually abusive images of children are primarily hosted abroad, we facilitate the industry-led initiative to protect users from inadvertent exposure to this content by blocking access to it through our provision of a dynamic list of child sexual abuse URLs.&lt;br /&gt; &lt;br /&gt;A Wikipedia web page, was reported through the IWF’s online reporting mechanism in December 2008. As with all child sexual abuse reports received by our Hotline analysts, the image was assessed according to the UK Sentencing Guidelines Council (page 109). The content was considered to be a potentially illegal indecent image of a child under the age of 18, but hosted outside the UK. The IWF does not issue takedown notices to ISPs or hosting companies outside the UK, but we did advise one of our partner Hotlines abroad and our law enforcement partner agency of our assessment. The specific URL (individual webpage) was then added to the list provided to ISPs and other companies in the online sector to protect their customers from inadvertent exposure to a potentially illegal indecent image of a child."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I had not realized that wikipedia (The free encylcopedia) is a hive of child sexual abuse and a den for pedophiles.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;to IWF: Wikipedia is a website for people that are like to read and learn things, studying, or writing. You are not helping the world or sexually abused children by censoring it. Realize you have become robots and by following your protocols you're actually worsening the planet for everyone.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is how all Authoritarian/Stalinist governments work.&lt;br /&gt; First they choose to censor something that most people would find reasonable to censor, such as the image of a naked child.&lt;br /&gt; Before you know it, all wikipedia pages relating to opposition politicians and opposition parties will also be unavailable.&lt;br /&gt; I see IWF are 'supported' by both the Home Office and the Dept of Business, Enterprise and Regulatory Reform, enough said !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For people like Berlusconi the world will always be open and free. He can get on a jet and talk to his friends in Australia in person. For the rest of us, the internet will be what Berlusconi and his ilk allow us to have and see. And yes this is a small step, but there have been hundreds of little steps that add up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5917608659714876540?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5917608659714876540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5917608659714876540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5917608659714876540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5917608659714876540'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/12/virgin-killer.html' title='Virgin Killer'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-3792734771839467952</id><published>2008-12-02T04:00:00.000-08:00</published><updated>2008-12-03T11:32:20.113-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NoConfusion'/><category scheme='http://www.blogger.com/atom/ns#' term='Inducitive Families'/><category scheme='http://www.blogger.com/atom/ns#' term='decidable equality'/><title type='text'>Axiom Free NoConfusion in Coq</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; Cast.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; Fin.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;prove_noConfusion&lt;/span&gt; :=&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;;&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; goal &lt;span class="coq-type"&gt;with&lt;/span&gt; &lt;span class="coq-function-name"&gt;Eql&lt;/span&gt; : ?x = _ |- _ =&amp;gt;&lt;br /&gt;      &lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; Eql; &lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; x; &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt; &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt;Inductive nat : Set :=&lt;br /&gt;| O : nat&lt;br /&gt;| S : nat -&amp;gt; nat.&lt;br /&gt;&lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;NoConfusion_nat&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : nat) : &lt;span class="coq-type"&gt;Type&lt;/span&gt; :=&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; x, y &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;    | O, O =&amp;gt; P -&amp;gt; P&lt;br /&gt;    | O, S y =&amp;gt; P&lt;br /&gt;    | S x, O =&amp;gt; P&lt;br /&gt;    | S x, S y =&amp;gt; (x = y -&amp;gt; P) -&amp;gt; P&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;noConfusion_nat&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : nat) :&lt;br /&gt;  x = y -&amp;gt; NoConfusion_nat P x y.&lt;br /&gt;prove_noConfusion.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;eq_nat_dec&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : nat, {x = y} + {x &amp;lt;&amp;gt; y}.&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;decide equality&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;eq_nat_dec'&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : nat, x = y \/ x &amp;lt;&amp;gt; y.&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;decide equality&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt;Inductive Fin : nat -&amp;gt; Set :=&lt;br /&gt;| fz : forall n, Fin (S n)&lt;br /&gt;| fs : forall n, Fin n -&amp;gt; Fin (S n).&lt;br /&gt;&lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Notation&lt;/span&gt; FinINeq f g := (INeq nat Fin _ f _ g).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;NoConfusion_Fin&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : Fin i) : &lt;span class="coq-type"&gt;Type&lt;/span&gt; :=&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; x, y &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;    | fz _, fz _ =&amp;gt; P -&amp;gt; P&lt;br /&gt;    | fz _, fs _ _ =&amp;gt; P&lt;br /&gt;    | fs _ _, fz _=&amp;gt; P&lt;br /&gt;    | fs x_i x, fs y_i y =&amp;gt; (FinINeq x y -&amp;gt; P) -&amp;gt; P&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;noConfusion_Fin&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : Fin i) :&lt;br /&gt;  x = y -&amp;gt; NoConfusion_Fin P i x y.&lt;br /&gt;prove_noConfusion.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;fz_fs_clash&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;f&lt;/span&gt; : Fin n)&lt;br /&gt;  : fz = fs f -&amp;gt; P&lt;br /&gt;  := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Eq&lt;/span&gt; =&amp;gt;&lt;br /&gt;    noConfusion_Fin P (S n) (fz) (fs f) Eq.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;fs_inj&lt;/span&gt; {n} {f f' : Fin n}&lt;br /&gt;  : fs f = fs f' -&amp;gt; f = f'&lt;br /&gt;  := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Eq&lt;/span&gt; =&amp;gt;&lt;br /&gt;    noConfusion_Fin (f = f') _ _ _ Eq (INeq_eq nat Fin eq_nat_dec _ _ _).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;type&lt;/span&gt; : &lt;span class="coq-type"&gt;Set&lt;/span&gt; :=&lt;br /&gt;| Nat : type&lt;br /&gt;| Arrow : type -&amp;gt; type -&amp;gt; type.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;eq_type_dec&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;s t&lt;/span&gt; : type) : { s = t } + { s &amp;lt;&amp;gt; t }.&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;decide equality&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Section&lt;/span&gt; &lt;span class="coq-function-name"&gt;equand&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;vars&lt;/span&gt; : nat.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;equand&lt;/span&gt; : type -&amp;gt; &lt;span class="coq-type"&gt;Set&lt;/span&gt; :=&lt;br /&gt;| Zero : equand Nat&lt;br /&gt;| Succ : equand (Arrow Nat Nat)&lt;br /&gt;| VAR (&lt;span class="coq-variable-name"&gt;V&lt;/span&gt; : Fin vars) : equand Nat&lt;br /&gt;| APP {A B} : equand (Arrow A B) -&amp;gt; equand A -&amp;gt; equand B.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Notation&lt;/span&gt; equandINeq f g := (INeq type equand _ f _ g).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;NoConfusion_equand&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : type) (&lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : equand i) : &lt;span class="coq-type"&gt;Type&lt;/span&gt; :=&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; x, y &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;    | Zero, Zero =&amp;gt; P -&amp;gt; P&lt;br /&gt;    | Succ, Succ =&amp;gt; P -&amp;gt; P&lt;br /&gt;    | VAR f, VAR f' =&amp;gt; (f = f' -&amp;gt; P) -&amp;gt; P&lt;br /&gt;    | APP xi xj xf xo, APP yi yj yf yo =&amp;gt;&lt;br /&gt;      (equandINeq xf yf -&amp;gt; equandINeq xo yo -&amp;gt; P) -&amp;gt; P&lt;br /&gt;    | _, _ =&amp;gt; P&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;noConfusion_equand&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : type) (&lt;span class="coq-variable-name"&gt;x y&lt;/span&gt; : equand i) : x = y -&amp;gt; NoConfusion_equand P i x y.&lt;br /&gt;prove_noConfusion.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;Zero_One_clash&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : type)&lt;br /&gt;  : Zero = APP Succ Zero -&amp;gt; P&lt;br /&gt;  := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Eq&lt;/span&gt; =&amp;gt;&lt;br /&gt;    noConfusion_equand P Nat Zero (APP Succ Zero) Eq.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;APP_f_inj&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : type) (&lt;span class="coq-variable-name"&gt;F F'&lt;/span&gt; : equand (Arrow u v)) (&lt;span class="coq-variable-name"&gt;O O'&lt;/span&gt; : equand u)&lt;br /&gt;  : @APP u v F O = @APP u v F' O' -&amp;gt; F = F'&lt;br /&gt;  := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Eq&lt;/span&gt; =&amp;gt;&lt;br /&gt;    noConfusion_equand (F = F') _ _ _ Eq&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;FEq OEq&lt;/span&gt; =&amp;gt; INeq_eq _ _ eq_type_dec _ _ _ FEq).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;APP_o_inj&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : type) (&lt;span class="coq-variable-name"&gt;F F'&lt;/span&gt; : equand (Arrow u v)) (&lt;span class="coq-variable-name"&gt;O O'&lt;/span&gt; : equand u)&lt;br /&gt;  : @APP u v F O = @APP u v F' O' -&amp;gt; O = O'&lt;br /&gt;  := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Eq&lt;/span&gt; =&amp;gt;&lt;br /&gt;    noConfusion_equand (O = O') _ _ _ Eq&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;FEq OEq&lt;/span&gt; =&amp;gt; INeq_eq _ _ eq_type_dec _ _ _ OEq).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;eq_equand_dec&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;t&lt;/span&gt; : type)(&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : equand t), {u = v} + {u &amp;lt;&amp;gt; v}.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; INeq_dec_dec.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; eq_type_dec.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt; (&lt;span class="coq-type"&gt;fix&lt;/span&gt; eq_equand_dec (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : type) (&lt;span class="coq-variable-name"&gt;I&lt;/span&gt; : equand i)&lt;br /&gt;                          (&lt;span class="coq-variable-name"&gt;i'&lt;/span&gt; : type) (&lt;span class="coq-variable-name"&gt;I'&lt;/span&gt; : equand i') {&lt;span class="coq-type"&gt;struct&lt;/span&gt; I} :&lt;br /&gt;                          {@INeq _ _ i I i' I'} + {~ @INeq _ _ i I i' I'} := _).&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt; (&lt;span class="coq-type"&gt;match&lt;/span&gt; I &lt;span class="coq-type"&gt;as&lt;/span&gt; I &lt;span class="coq-type"&gt;in&lt;/span&gt; equand i, I' &lt;span class="coq-type"&gt;as&lt;/span&gt; I' &lt;span class="coq-type"&gt;in&lt;/span&gt; equand i'&lt;br /&gt;        &lt;span class="coq-type"&gt;return&lt;/span&gt; {@INeq _ _ i I i' I'} + {~ @INeq _ _ i I i' I'}&lt;br /&gt;        &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;          | Zero, Zero =&amp;gt; _&lt;br /&gt;          | Zero, Succ =&amp;gt; _&lt;br /&gt;          | Zero, VAR _ =&amp;gt; _&lt;br /&gt;          | Zero, APP _ _ _ _ =&amp;gt; _&lt;br /&gt;          | Succ, Zero =&amp;gt; _&lt;br /&gt;          | Succ, Succ =&amp;gt; _&lt;br /&gt;          | Succ, VAR _ =&amp;gt; _&lt;br /&gt;          | Succ, APP _ _ _ _ =&amp;gt; _&lt;br /&gt;          | VAR _, Zero =&amp;gt; _&lt;br /&gt;          | VAR _, Succ =&amp;gt; _&lt;br /&gt;          | VAR _, VAR _ =&amp;gt; _&lt;br /&gt;          | VAR _, APP _ _ _ _ =&amp;gt; _&lt;br /&gt;          | APP _ _ _ _, Zero =&amp;gt; _&lt;br /&gt;          | APP _ _ _ _, Succ =&amp;gt; _&lt;br /&gt;          | APP _ _ _ _, VAR _ =&amp;gt; _&lt;br /&gt;          | APP _ _ _ _, APP _ _ _ _ =&amp;gt; _&lt;br /&gt;        &lt;span class="coq-type"&gt;end&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-coq-solve-tactics"&gt;solve&lt;/span&gt; [ &lt;span class="coq-coq-solve-tactics"&gt;discriminate&lt;/span&gt;&lt;br /&gt;          | &lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;&lt;br /&gt;          | &lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; Q; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Q&lt;br /&gt;          | &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; B; &lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; Q; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Q; &lt;span class="coq-coq-solve-tactics"&gt;discriminate&lt;/span&gt;&lt;br /&gt;          ].&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (fin_eq_dec V V0); &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; Q; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Q; &lt;span class="coq-coq-solve-tactics"&gt;contradiction&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (eq_type_dec B B0);&lt;br /&gt;(&lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (eq_equand_dec _ e0 _ e2) &lt;span class="coq-type"&gt;as&lt;/span&gt; [Q|N];[&lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Q|&lt;span class="coq-proof-tactics-name"&gt;idtac&lt;/span&gt;]);&lt;br /&gt;(&lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (eq_equand_dec _ e _ e1) &lt;span class="coq-type"&gt;as&lt;/span&gt; [Q'|N'];[&lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Q'|&lt;span class="coq-proof-tactics-name"&gt;idtac&lt;/span&gt;]);&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-coq-solve-tactics"&gt;solve&lt;/span&gt; [ &lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt;;&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; Q; &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; eq_type_dec;&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; Q'; &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; eq_type_dec;&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt; ];&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; NQ;&lt;br /&gt;  &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; NQ;&lt;br /&gt;  &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Q;&lt;br /&gt;  &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;inversion&lt;/span&gt; Q';&lt;br /&gt;  &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-coq-solve-tactics"&gt;contradiction&lt;/span&gt;;&lt;br /&gt;  &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;;&lt;br /&gt;  &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;pose&lt;/span&gt; (APP_f_inj _ _ _ _ _ _ (INeq_eq _ _ eq_type_dec _ _ _ NQ));&lt;br /&gt;  &lt;span class="coq-proof-tacticals-name"&gt;try&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;pose&lt;/span&gt; (APP_o_inj _ _ _ _ _ _ (INeq_eq _ _ eq_type_dec _ _ _ NQ)).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; N'; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; e3; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; N; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; e4; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; N; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; e4; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Eval&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;compute&lt;/span&gt; &lt;span class="coq-type"&gt;in&lt;/span&gt; (eq_equand_dec _&lt;br /&gt;  (APP Succ (APP Succ Zero))&lt;br /&gt;  (APP Succ (APP Succ Zero))&lt;br /&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; equand.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Print&lt;/span&gt; Assumptions eq_equand_dec.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt; *  = left (APP Succ (APP Succ Zero) = APP Succ (APP Succ Zero) -&amp;gt; False)&lt;br /&gt; *      (refl_equal (APP Succ (APP Succ Zero)))&lt;br /&gt; *  : {APP Succ (APP Succ Zero) = APP Succ (APP Succ Zero)} +&lt;br /&gt; *    {APP Succ (APP Succ Zero) &amp;lt;&amp;gt; APP Succ (APP Succ Zero)}&lt;br /&gt; *&lt;br /&gt; * Computed fully, no JMeq_eq axiom stopping reduction&lt;br /&gt; *&lt;br /&gt; &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; Coven.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; Arith.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; Omega.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Print&lt;/span&gt; le.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;le_irrelevent&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; n m (&lt;span class="coq-variable-name"&gt;H1 H2&lt;/span&gt;:le n m), H1=H2.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt; (&lt;span class="coq-type"&gt;fix&lt;/span&gt; le_irrelevent n m (&lt;span class="coq-variable-name"&gt;H1 H2&lt;/span&gt;:le n m) {&lt;span class="coq-type"&gt;struct&lt;/span&gt; H1} : H1=H2 := _).&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; INeq_eq; &lt;span class="coq-proof-tactics-name"&gt;auto&lt;/span&gt; &lt;span class="coq-type"&gt;with&lt;/span&gt; arith.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt; (&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; H1 &lt;span class="coq-type"&gt;as&lt;/span&gt; H1' &lt;span class="coq-type"&gt;in&lt;/span&gt; _ &amp;lt;= m', H2 &lt;span class="coq-type"&gt;as&lt;/span&gt; H2' &lt;span class="coq-type"&gt;in&lt;/span&gt; _ &amp;lt;= m''&lt;br /&gt;  &lt;span class="coq-type"&gt;return&lt;/span&gt; m = m' -&amp;gt;&lt;br /&gt;         m = m'' -&amp;gt;&lt;br /&gt;         INeq nat (le n) m H1 m' H1' -&amp;gt;&lt;br /&gt;         INeq nat (le n) m H2 m'' H2' -&amp;gt;&lt;br /&gt;         INeq nat (le n) m H1 m H2&lt;br /&gt;  &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;    | le_n, le_n =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;m'eq m''eq H1eq H2eq&lt;/span&gt; =&amp;gt; _&lt;br /&gt;    | le_n, le_S p_m p_le =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;m'eq m''eq H1eq H2eq&lt;/span&gt; =&amp;gt; !&lt;br /&gt;    | le_S p_m p_le, le_n =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;m'eq m''eq H1eq H2eq&lt;/span&gt; =&amp;gt; !&lt;br /&gt;    | le_S p_m p_le, le_S p_m' p_le' =&amp;gt; &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;m'eq m''eq H1eq H2eq&lt;/span&gt; =&amp;gt; _&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;  (refl_equal _)&lt;br /&gt;  (refl_equal _)&lt;br /&gt;  (INeq_refl _ _ _ _)&lt;br /&gt;  (INeq_refl _ _ _ _)&lt;br /&gt;); &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (INeq_eq _ _ eq_nat_dec _ _ _ H1eq).&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (INeq_eq _ _ eq_nat_dec _ _ _ H2eq).&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;omega&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;omega&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;injection&lt;/span&gt; m''eq; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (INeq_eq _ _ eq_nat_dec _ _ _ H1eq).&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (INeq_eq _ _ eq_nat_dec _ _ _ H2eq).&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (le_irrelevent _ _ p_le p_le').&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Print&lt;/span&gt; Assumptions le_irrelevent.&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(**&lt;/span&gt;&lt;span class="coq-comment"&gt; Closed under the global context *&lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-3792734771839467952?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/3792734771839467952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=3792734771839467952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3792734771839467952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3792734771839467952'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/12/axiom-free-noconfusion-in-coq.html' title='Axiom Free NoConfusion in Coq'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-2798096523206005091</id><published>2008-12-02T03:58:00.001-08:00</published><updated>2008-12-03T11:30:26.489-08:00</updated><title type='text'>Dependently typed Data.Dynamic</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; Eqdep_dec_defined.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Section&lt;/span&gt; &lt;span class="coq-function-name"&gt;Cast&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;U&lt;/span&gt;:&lt;span class="coq-type"&gt;Type&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;F&lt;/span&gt; : U -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;eq_dec&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x y&lt;/span&gt;:U, {x = y} + {x &amp;lt;&amp;gt; y}.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;eq_decide&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x y&lt;/span&gt;:U, x = y \/ x &amp;lt;&amp;gt; y.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; x y; &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (eq_dec x y); [ &lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt; | &lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt; ]; &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;cast&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i j&lt;/span&gt; : U) : F j -&amp;gt; option (F i) :=&lt;br /&gt;    &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;J&lt;/span&gt; =&amp;gt;&lt;br /&gt;      &lt;span class="coq-type"&gt;match&lt;/span&gt; eq_dec j i &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;        | &lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt; Eql =&amp;gt; &lt;span class="coq-type"&gt;match&lt;/span&gt; Eql &lt;span class="coq-type"&gt;in&lt;/span&gt; _ = i &lt;span class="coq-type"&gt;return&lt;/span&gt; option (F i) &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;                        | refl_equal =&amp;gt; Some J&lt;br /&gt;                      &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;        | &lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt; _ =&amp;gt; None&lt;br /&gt;      &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;cast_reflexivity&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : U) (&lt;span class="coq-variable-name"&gt;I&lt;/span&gt; : F i) : cast i i I = Some I.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; cast; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; i; &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (eq_dec i i);&lt;br /&gt;      [ &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt; | &lt;span class="coq-proof-tactics-name"&gt;absurd&lt;/span&gt; (i = i); &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt; ].&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (eq_proofs_unicity eq_decide e (refl_equal i)).&lt;br /&gt;    &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;cast_injective&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : U) (&lt;span class="coq-variable-name"&gt;I I'&lt;/span&gt; : F i) :&lt;br /&gt;    cast i i I = cast i i I' -&amp;gt; I = I'.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; i I I'; &lt;span class="coq-proof-tacticals-name"&gt;repeat&lt;/span&gt; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; cast_reflexivity.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; SomeEq; &lt;span class="coq-proof-tactics-name"&gt;injection&lt;/span&gt; SomeEq; &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;INeq&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : U)(&lt;span class="coq-variable-name"&gt;I&lt;/span&gt; : F i) : &lt;span class="coq-type"&gt;forall&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;j&lt;/span&gt; : U)(&lt;span class="coq-variable-name"&gt;J&lt;/span&gt; : F j), &lt;span class="coq-type"&gt;Prop&lt;/span&gt; :=&lt;br /&gt;  | INeq_refl : INeq i I i I.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Implicit Arguments&lt;/span&gt; INeq [i j].&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Hint Resolve&lt;/span&gt; INeq_refl.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;INeq_eq&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : U)(&lt;span class="coq-variable-name"&gt;I I'&lt;/span&gt; : F i) : INeq I I' -&amp;gt; I = I'.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; i I I' inEq; &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; cast_injective.&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;change&lt;/span&gt; ((&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;i' I'&lt;/span&gt; =&amp;gt; cast i i I = cast i i' I') i I').&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; inEq; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Implicit Arguments&lt;/span&gt; INeq_eq [i I I'].&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;INeq_ind_r&lt;/span&gt; :&lt;br /&gt;    &lt;span class="coq-type"&gt;forall&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt;:U) (&lt;span class="coq-variable-name"&gt;I J&lt;/span&gt;:F i) (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt;:F i -&amp;gt; &lt;span class="coq-type"&gt;Prop&lt;/span&gt;), P J -&amp;gt; INeq I J -&amp;gt; P I.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; i I J P H Eql; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (INeq_eq Eql); &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;INeq_rec_r&lt;/span&gt; :&lt;br /&gt;    &lt;span class="coq-type"&gt;forall&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt;:U) (&lt;span class="coq-variable-name"&gt;I J&lt;/span&gt;:F i) (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt;:F i -&amp;gt; &lt;span class="coq-type"&gt;Set&lt;/span&gt;), P J -&amp;gt; INeq I J -&amp;gt; P I.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; i I J P H Eql; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (INeq_eq Eql); &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Lemma&lt;/span&gt; &lt;span class="coq-function-name"&gt;INeq_rect_r&lt;/span&gt; :&lt;br /&gt;    &lt;span class="coq-type"&gt;forall&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt;:U) (&lt;span class="coq-variable-name"&gt;I J&lt;/span&gt;:F i) (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt;:F i -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt;), P J -&amp;gt; INeq I J -&amp;gt; P I.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; i I J P H Eql; &lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; (INeq_eq Eql); &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;INeq_dec_dec&lt;/span&gt; :&lt;br /&gt;    (&lt;span class="coq-type"&gt;forall&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt;:U)(&lt;span class="coq-variable-name"&gt;I&lt;/span&gt;:F i) (&lt;span class="coq-variable-name"&gt;j&lt;/span&gt;:U)(&lt;span class="coq-variable-name"&gt;J&lt;/span&gt;:F j), {INeq I J} + {~INeq I J}) -&amp;gt;&lt;br /&gt;    (&lt;span class="coq-type"&gt;forall&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt;:U)(&lt;span class="coq-variable-name"&gt;I J&lt;/span&gt;:F i), {I = J} + {I &amp;lt;&amp;gt; J}).&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; ineq_dec i I J; &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (ineq_dec i I i J); [ &lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt; | &lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt; ].&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; INeq_eq; &lt;span class="coq-coq-solve-tactics"&gt;assumption&lt;/span&gt;.&lt;br /&gt;  contradict n; &lt;span class="coq-proof-tactics-name"&gt;subst&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;reflexivity&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; Cast.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-2798096523206005091?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/2798096523206005091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=2798096523206005091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2798096523206005091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2798096523206005091'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/12/dependently-typed-datadynamic.html' title='Dependently typed Data.Dynamic'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-2082409248040359680</id><published>2008-11-30T05:16:00.001-08:00</published><updated>2008-11-30T05:17:21.898-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dependent destruct'/><category scheme='http://www.blogger.com/atom/ns#' term='decidable equality'/><title type='text'>Decidable Equality and Type Equality</title><content type='html'>&lt;pre&gt;&lt;br /&gt;Require Import Eqdep_dec_defined.&lt;br /&gt;(** Same as Eqdep_dec but s/Qed/Defined/ **)&lt;br /&gt;&lt;br /&gt;Theorem dep_destruct :&lt;br /&gt;  forall (T : Type) (T' : T -&gt; Type) x (v : T' x) (P : T' x -&gt; Type),&lt;br /&gt;    (forall x' (v' : T' x') (Heq : x' = x),&lt;br /&gt;      P (match Heq in (_ = x) return (T' x) with&lt;br /&gt;           | refl_equal =&gt; v'&lt;br /&gt;         end)) -&gt;&lt;br /&gt;      P v.&lt;br /&gt;  intros T T' x v P I; apply (I _ v (refl_equal _)).&lt;br /&gt;Defined.&lt;br /&gt;(** Stolen from http://www.cs.harvard.edu/~adamc/cpdt/ **)&lt;br /&gt;&lt;br /&gt;Inductive type : Set :=&lt;br /&gt;| Nat : type&lt;br /&gt;| Arrow : type -&gt; type -&gt; type.&lt;br /&gt;&lt;br /&gt;Definition eq_type_dec' (s t : type) : s = t \/ s &lt;&gt; t.&lt;br /&gt;decide equality.&lt;br /&gt;Defined.&lt;br /&gt;&lt;br /&gt;Inductive equand : type -&gt; Set :=&lt;br /&gt;| Zero : equand Nat&lt;br /&gt;| Succ : equand (Arrow Nat Nat).&lt;br /&gt;&lt;br /&gt;Definition eq_equand_dec {T} (x y : equand T) : {x = y} + {x &lt;&gt; y}.&lt;br /&gt;intro.&lt;br /&gt;destruct x;&lt;br /&gt;  intro y; apply (dep_destruct type equand _ y);&lt;br /&gt;    intros T y' Teq; destruct y';&lt;br /&gt;      discriminate ||&lt;br /&gt;        rewrite &lt;- (eq_proofs_unicity eq_type_dec' (refl_equal _) Teq).&lt;br /&gt;left; reflexivity.&lt;br /&gt;left; reflexivity.&lt;br /&gt;Defined.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-2082409248040359680?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/2082409248040359680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=2082409248040359680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2082409248040359680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2082409248040359680'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/11/decidable-equality-and-type-equality.html' title='Decidable Equality and Type Equality'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5048737009647638932</id><published>2008-11-30T00:13:00.000-08:00</published><updated>2008-11-30T00:14:42.483-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recursion'/><title type='text'>Calculating Journeys</title><content type='html'>&lt;pre&gt;-- WARNING: contains recursive programming&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- For example data, pick some imaginary flight network:&lt;br /&gt;&lt;br /&gt;data Node = Paris | London | Shanghai | NewYork | Tokyo deriving (Eq, Show)&lt;br /&gt;&lt;br /&gt;flights Paris = [London]&lt;br /&gt;flights London = [Paris,Shanghai,NewYork]&lt;br /&gt;flights Shanghai = [Tokyo,NewYork]&lt;br /&gt;flights NewYork = [London]&lt;br /&gt;flights Tokyo = [Paris,London,Shanghai]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- and a convenient data representation of the transitive closure&lt;br /&gt;&lt;br /&gt;data Graph a = {- DeadEnd | -} a :--&gt;: [Graph a] deriving Show&lt;br /&gt;&lt;br /&gt;transitiveClosure location = location :--&gt;: map transitiveClosure (flights location)&lt;br /&gt;&lt;br /&gt;{-- define the truncation of any cyclical journeys&lt;br /&gt;&lt;br /&gt;finite visited DeadEnd = DeadEnd&lt;br /&gt;finite visited (location :--&gt;: destinations)&lt;br /&gt; | already visited location = DeadEnd&lt;br /&gt; |         otherwise        = location :--&gt;: map (finite (location : visited)) destinations&lt;br /&gt;&lt;br /&gt;already = flip elem&lt;br /&gt;-}&lt;br /&gt;&lt;br /&gt;{-- remove any 'DeadEnd's left over&lt;br /&gt;&lt;br /&gt;simplify DeadEnd = DeadEnd&lt;br /&gt;simplify (location :--&gt;: destinations) = location :--&gt;: purge (map simplify destinations)&lt;br /&gt;&lt;br /&gt;purge = foldr cons []&lt;br /&gt; where cons DeadEnd ys = ys&lt;br /&gt;       cons x       ys = x : ys&lt;br /&gt;-}&lt;br /&gt;&lt;br /&gt;-- holidays = simplify . finite [] . transitiveClosure&lt;br /&gt;&lt;br /&gt;-- but fusing the truncation and simplification into one allows the 'DeadEnd' construtor to be erased!&lt;br /&gt;&lt;br /&gt;simplifyFinite visited (location :--&gt;: destinations) =&lt;br /&gt; location :--&gt;: filter (not . already visited) (map (simplifyFinite (location : visited)) destinations)&lt;br /&gt;&lt;br /&gt;already visited (location :--&gt;: _) = elem location visited&lt;br /&gt;&lt;br /&gt;holidays = simplifyFinite [] . transitiveClosure&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- &gt; holidays Paris&lt;br /&gt;-- Paris :--&gt;: [London :--&gt;: [Shanghai :--&gt;: [Tokyo :--&gt;: [],&lt;br /&gt;--                                            NewYork :--&gt;: []],&lt;br /&gt;--                            NewYork :--&gt;: []]]&lt;br /&gt;-- &gt; holidays London &lt;br /&gt;-- London :--&gt;: [Paris :--&gt;: [],&lt;br /&gt;--               Shanghai :--&gt;: [Tokyo :--&gt;: [Paris :--&gt;: []],&lt;br /&gt;--                               NewYork :--&gt;: []],&lt;br /&gt;--               NewYork :--&gt;: []]&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5048737009647638932?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5048737009647638932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5048737009647638932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5048737009647638932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5048737009647638932'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/11/calculating-journeys.html' title='Calculating Journeys'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-2614845727334494114</id><published>2008-11-22T13:49:00.000-08:00</published><updated>2008-11-22T13:57:48.820-08:00</updated><title type='text'>my thought process for breadth first numbering</title><content type='html'>&lt;pre&gt;&lt;br /&gt;data Tree a = Leaf a | Branch a (Tree a) (Tree a) deriving Show&lt;br /&gt;&lt;br /&gt;i 0 = Leaf 0&lt;br /&gt;i n = Branch 0 (i (n-1)) (i (n-1))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;identity (Leaf i) = Leaf i&lt;br /&gt;identity (Branch i left right) = Branch i (identity left) (identity right)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;depth current (Leaf _) = Leaf current&lt;br /&gt;depth current (Branch _ left right) = Branch current (depth (current + 1) left) (depth (current + 1) right)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;depth' current (Leaf i) = Leaf i&lt;br /&gt;depth' current (Branch i left right) = Branch i left' right'&lt;br /&gt; where left' = depth' (current + 1) left&lt;br /&gt;       right' = depth' (current + 1) right&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;depth'' current target (Leaf i) = Leaf (if current == target then i+1 else i)&lt;br /&gt;depth'' current target (Branch i left right) = Branch (if current == target then i+1 else i) left' right'&lt;br /&gt; where left' = depth'' (current + 1) target left&lt;br /&gt;       right' = depth'' (current + 1) target right&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;depth''' current target delta (Leaf i) = Leaf (if current == target then i+delta else i) `with` (if current == target then delta+1 else delta)&lt;br /&gt;depth''' current target delta (Branch i left right) = Branch (if current == target then i+delta else i) left' right' `with` delta''&lt;br /&gt; where (left',delta') = depth''' (current + 1) target (if current == target then delta+1 else delta) left&lt;br /&gt;       (right',delta'') = depth''' (current + 1) target delta' right&lt;br /&gt;&lt;br /&gt;with = (,)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;unfold step current = case step current of Nothing -&gt; current ; Just next -&gt; unfold step next&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;breadth tree = case unfold step (0,0,tree) of (_,_,tree) -&gt; tree&lt;br /&gt; where step (depth, delta, tree) = case depth''' 0 depth delta tree of&lt;br /&gt;         (tree, delta') -&gt; if delta == delta' then Nothing else Just (depth + 1, delta', tree)&lt;br /&gt;&lt;br /&gt;-- &gt; breadth (i 3)&lt;br /&gt;-- Branch 0 (Branch 1 (Branch 3 (Leaf 7)&lt;br /&gt;--                              (Leaf 8))&lt;br /&gt;--                    (Branch 4 (Leaf 9)&lt;br /&gt;--                              (Leaf 10)))&lt;br /&gt;--          (Branch 2 (Branch 5 (Leaf 11)&lt;br /&gt;--                              (Leaf 12))&lt;br /&gt;--                    (Branch 6 (Leaf 13)&lt;br /&gt;--                              (Leaf 14)))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-2614845727334494114?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/2614845727334494114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=2614845727334494114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2614845727334494114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2614845727334494114'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/11/my-thought-process-for-breadth-first.html' title='my thought process for breadth first numbering'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-3581439592212666521</id><published>2008-11-20T12:41:00.001-08:00</published><updated>2008-11-20T12:41:38.738-08:00</updated><title type='text'>Type Error</title><content type='html'>&lt;pre&gt;Error:&lt;br /&gt;In environment&lt;br /&gt;ty : type&lt;br /&gt;m : term ty&lt;br /&gt;eq_term_dec :&lt;br /&gt;forall (m' : {m' : term ty | size m' &lt; size m}) (n : term ty),&lt;br /&gt;{`m' = n} + {`m' &lt;&gt; n}&lt;br /&gt;n : term ty&lt;br /&gt;eq_term_dec0 :&lt;br /&gt;forall (ty : type) (m n : term ty),&lt;br /&gt;{[m : (term ty)]= [n : (term ty)]} + {m =/= n}&lt;br /&gt;ty0 : type&lt;br /&gt;m0 : term ty0&lt;br /&gt;n0 : term ty0&lt;br /&gt;uTy : type&lt;br /&gt;vTy : type&lt;br /&gt;u : term (uTy --&gt; vTy)&lt;br /&gt;v : term uTy&lt;br /&gt;uTy' : type&lt;br /&gt;vTy' : type&lt;br /&gt;u' : term (uTy' --&gt; vTy')&lt;br /&gt;v' : term uTy'&lt;br /&gt;vTyEq : vTy = vTy'&lt;br /&gt;filtered_var := eq_type_dec uTy uTy' : {uTy = uTy'} + {uTy &lt;&gt; uTy'}&lt;br /&gt;uTyEq : uTy = uTy'&lt;br /&gt;Heq_anonymous : in_left = filtered_var&lt;br /&gt;u0 : term (uTy --&gt; vTy)&lt;br /&gt;v0 : term uTy&lt;br /&gt;u'0 : term (uTy --&gt; vTy)&lt;br /&gt;v'0 : term uTy&lt;br /&gt;filtered_var0 := eq_term_dec0 (uTy --&gt; vTy) u0 u'0 :&lt;br /&gt;{[u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))]} + {u0 =/= u'0}&lt;br /&gt;filtered_var1 := eq_term_dec0 uTy v0 v'0 :&lt;br /&gt;{[v0 : (term uTy)]= [v'0 : (term uTy)]} + {v0 =/= v'0}&lt;br /&gt;branch_0 :=&lt;br /&gt;fun (wildcard' : [u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))])&lt;br /&gt;  (wildcard'0 : [u'0 : (term vTy)]= [filtered_var0 : (term vTy)])&lt;br /&gt;  (Heq_anonymous0 : in_left = filtered_var0)&lt;br /&gt;  (Heq_anonymous1 : in_left = filtered_var1) =&gt; in_left :&lt;br /&gt;forall&lt;br /&gt;  (wildcard' : [u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))])&lt;br /&gt;  (wildcard'0 : [u'0 : (term vTy)]= [filtered_var0 : (term vTy)]),&lt;br /&gt;in_left = filtered_var0 -&gt;&lt;br /&gt;in_left = filtered_var1 -&gt;&lt;br /&gt;{[app u0 v0 : (term vTy)]= [app u'0 v'0 : (term vTy)]} +&lt;br /&gt;{app u0 v0 =/= app u'0 v'0}&lt;br /&gt;branch_1 :=&lt;br /&gt;fun&lt;br /&gt;  (wildcard' : {[u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))]} +&lt;br /&gt;               {u0 =/= u'0})&lt;br /&gt;  (wildcard'0 : {[u'0 : (term vTy)]= [filtered_var0 : (term vTy)]} +&lt;br /&gt;                {u'0 =/= filtered_var0})&lt;br /&gt;  (H : forall&lt;br /&gt;         (wildcard'1 : [u0 : (term (uTy --&gt; vTy))]= [u'0&lt;br /&gt;                       : (term (uTy --&gt; vTy))])&lt;br /&gt;         (wildcard'2 : [u'0 : (term vTy)]= [filtered_var0 : (term vTy)]),&lt;br /&gt;       ~ (in_left = wildcard' /\ in_left = wildcard'0))&lt;br /&gt;  (Heq_anonymous0 : wildcard' = filtered_var0)&lt;br /&gt;  (Heq_anonymous1 : wildcard'0 = filtered_var1) =&gt; in_right :&lt;br /&gt;forall&lt;br /&gt;  (wildcard' : {[u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))]} +&lt;br /&gt;               {u0 =/= u'0})&lt;br /&gt;  (wildcard'0 : {[u'0 : (term vTy)]= [filtered_var0 : (term vTy)]} +&lt;br /&gt;                {u'0 =/= filtered_var0}),&lt;br /&gt;(forall&lt;br /&gt;   (wildcard'1 : [u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))])&lt;br /&gt;   (wildcard'2 : [u'0 : (term vTy)]= [filtered_var0 : (term vTy)]),&lt;br /&gt; ~ (in_left = wildcard' /\ in_left = wildcard'0)) -&gt;&lt;br /&gt;wildcard' = filtered_var0 -&gt;&lt;br /&gt;wildcard'0 = filtered_var1 -&gt;&lt;br /&gt;{[app u0 v0 : (term vTy)]= [app u'0 v'0 : (term vTy)]} +&lt;br /&gt;{app u0 v0 =/= app u'0 v'0}&lt;br /&gt;Anonymous : [u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))]&lt;br /&gt;wildcard' := in_left :&lt;br /&gt;{[u0 : (term (uTy --&gt; vTy))]= [u'0 : (term (uTy --&gt; vTy))]} + {u0 =/= u'0}&lt;br /&gt;Anonymous0 : u'0 =/= wildcard'&lt;br /&gt;wildcard'0 := in_right :&lt;br /&gt;{[u'0 : (term vTy)]= [wildcard' : (term vTy)]} + {u'0 =/= wildcard'}&lt;br /&gt;The term "wildcard'0" has type&lt;br /&gt; "{[u'0 : (term vTy)]= [wildcard' : (term vTy)]} + {u'0 =/= wildcard'}"&lt;br /&gt; while it is expected to have type&lt;br /&gt; "{[u'0 : (term vTy)]= [filtered_var0 : (term vTy)]} +&lt;br /&gt;  {u'0 =/= filtered_var0}".&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-3581439592212666521?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/3581439592212666521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=3581439592212666521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3581439592212666521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/3581439592212666521'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/11/type-error.html' title='Type Error'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-5446759724215587775</id><published>2008-11-15T08:00:00.001-08:00</published><updated>2008-11-15T08:01:03.958-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Variadic'/><category scheme='http://www.blogger.com/atom/ns#' term='GADT'/><title type='text'>Variadic via GADT</title><content type='html'>&lt;pre&gt;&lt;br /&gt;data Pill a where&lt;br /&gt; Stop :: Pill Integer&lt;br /&gt; O :: Pill (Pill a -&gt; a)&lt;br /&gt;&lt;br /&gt;collect :: Integer -&gt; Pill a -&gt; a&lt;br /&gt;collect i Stop = i&lt;br /&gt;collect i O = collect (i+1)&lt;br /&gt;&lt;br /&gt;start = collect 0&lt;br /&gt;&lt;br /&gt;-- &gt; start Stop&lt;br /&gt;-- 0&lt;br /&gt;-- &gt; start O Stop&lt;br /&gt;-- 1&lt;br /&gt;-- &gt; start O O Stop&lt;br /&gt;-- 2&lt;br /&gt;-- &gt; start O O O Stop&lt;br /&gt;-- 3&lt;br /&gt;-- &gt; start O O O O Stop&lt;br /&gt;-- 4&lt;br /&gt;-- &gt; start O O O O O Stop&lt;br /&gt;-- 5&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-5446759724215587775?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/5446759724215587775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=5446759724215587775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5446759724215587775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/5446759724215587775'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/11/variadic-via-gadt.html' title='Variadic via GADT'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-4566443591465848336</id><published>2008-11-09T05:18:00.000-08:00</published><updated>2008-11-09T05:32:02.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Huffman'/><title type='text'>Somewhat Pointfree Haskell Huffman Tree</title><content type='html'>&lt;pre&gt;&lt;span class='hpaste-comment'&gt;{-# LANGUAGE NoMonomorphismRestriction #-}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;import&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Prelude&lt;/span&gt; &lt;span class='hpaste-varid'&gt;hiding&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Either&lt;/span&gt;&lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-keyglyph'&gt;..&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;import&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Data&lt;/span&gt;&lt;span class='hpaste-varop'&gt;.&lt;/span&gt;&lt;span class='hpaste-conid'&gt;List&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;import&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Data&lt;/span&gt;&lt;span class='hpaste-varop'&gt;.&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Maybe&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;import&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Data&lt;/span&gt;&lt;span class='hpaste-varop'&gt;.&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Ord&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;import&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Control&lt;/span&gt;&lt;span class='hpaste-varop'&gt;.&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Monad&lt;/span&gt;&lt;span class='hpaste-varop'&gt;.&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Reader&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;lookdown&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;::&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Eq&lt;/span&gt; &lt;span class='hpaste-varid'&gt;b&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;[&lt;/span&gt;&lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;a&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt; &lt;span class='hpaste-varid'&gt;b&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-keyglyph'&gt;]&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='hpaste-varid'&gt;b&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Maybe&lt;/span&gt; &lt;span class='hpaste-varid'&gt;a&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;lookdown&lt;/span&gt; &lt;span class='hpaste-varid'&gt;pairs&lt;/span&gt; &lt;span class='hpaste-varid'&gt;i&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;lookup&lt;/span&gt; &lt;span class='hpaste-varid'&gt;i&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;map&lt;/span&gt; &lt;span class='hpaste-varid'&gt;swap&lt;/span&gt; &lt;span class='hpaste-varid'&gt;pairs&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;onFst&lt;/span&gt; &lt;span class='hpaste-varid'&gt;f&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;x&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt;&lt;span class='hpaste-varid'&gt;y&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;f&lt;/span&gt; &lt;span class='hpaste-varid'&gt;x&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt; &lt;span class='hpaste-varid'&gt;y&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;swap&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;x&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt;&lt;span class='hpaste-varid'&gt;y&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;y&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt;&lt;span class='hpaste-varid'&gt;x&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;f&lt;/span&gt; &lt;span class='hpaste-varop'&gt;&amp;amp;&lt;/span&gt; &lt;span class='hpaste-varid'&gt;g&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;\&lt;/span&gt;&lt;span class='hpaste-varid'&gt;x&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;f&lt;/span&gt; &lt;span class='hpaste-varid'&gt;x&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt; &lt;span class='hpaste-varid'&gt;g&lt;/span&gt; &lt;span class='hpaste-varid'&gt;x&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;infix&lt;/span&gt; &lt;span class='hpaste-num'&gt;4&lt;/span&gt; &lt;span class='hpaste-varop'&gt;&amp;amp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;data&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Huff&lt;/span&gt; &lt;span class='hpaste-varid'&gt;a&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Leaf&lt;/span&gt; &lt;span class='hpaste-varid'&gt;a&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;|&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Branch&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Huff&lt;/span&gt; &lt;span class='hpaste-varid'&gt;a&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Huff&lt;/span&gt; &lt;span class='hpaste-varid'&gt;a&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyword'&gt;deriving&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Show&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- -- Example tree:&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- let t =&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--   (Branch (Leaf T)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--           (Branch (Leaf F)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--                   (Leaf T)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;foldHuff&lt;/span&gt; &lt;span class='hpaste-varid'&gt;leaf&lt;/span&gt; &lt;span class='hpaste-varid'&gt;branch&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt;&lt;br /&gt; &lt;span class='hpaste-keyword'&gt;where&lt;/span&gt; &lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Leaf&lt;/span&gt; &lt;span class='hpaste-varid'&gt;o&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;leaf&lt;/span&gt; &lt;span class='hpaste-varid'&gt;o&lt;/span&gt;&lt;br /&gt;       &lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Branch&lt;/span&gt; &lt;span class='hpaste-varid'&gt;left&lt;/span&gt; &lt;span class='hpaste-varid'&gt;right&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;branch&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt; &lt;span class='hpaste-varid'&gt;left&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt; &lt;span class='hpaste-varid'&gt;right&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- foldHuff (!) (*) t =&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--   (* (! T)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--      (* (! F)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--         (! T)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;instance&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Functor&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Huff&lt;/span&gt; &lt;span class='hpaste-keyword'&gt;where&lt;/span&gt; &lt;span class='hpaste-varid'&gt;fmap&lt;/span&gt; &lt;span class='hpaste-varid'&gt;f&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;foldHuff&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Leaf&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;f&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Branch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;depthFirstTraversal&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;foldHuff&lt;/span&gt; &lt;span class='hpaste-varid'&gt;return&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varop'&gt;++&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- foldHuff (!) (*) t =&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--   (return T) ++&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--       (return F) ++&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;--       (return T)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- = [T,F,T]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;member&lt;/span&gt; &lt;span class='hpaste-varid'&gt;e&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;foldHuff&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varop'&gt;==&lt;/span&gt; &lt;span class='hpaste-varid'&gt;e&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varop'&gt;||&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;data&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Direction&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Left&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;|&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Right&lt;/span&gt; &lt;span class='hpaste-keyword'&gt;deriving&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Show&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;type&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Path&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;[&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Direction&lt;/span&gt;&lt;span class='hpaste-keyglyph'&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;branch&lt;/span&gt; &lt;span class='hpaste-varid'&gt;join&lt;/span&gt; &lt;span class='hpaste-varid'&gt;left&lt;/span&gt; &lt;span class='hpaste-varid'&gt;right&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;\&lt;/span&gt;&lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt;&lt;span class='hpaste-varid'&gt;left&lt;/span&gt; &lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt;&lt;span class='hpaste-varid'&gt;right&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='hpaste-varid'&gt;join&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;left&lt;/span&gt; &lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt;&lt;span class='hpaste-varid'&gt;left&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;right&lt;/span&gt; &lt;span class='hpaste-sel'&gt;&amp;phi;&lt;/span&gt;&lt;span class='hpaste-varid'&gt;right&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;label&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;foldHuff&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Leaf&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-conid'&gt;(,)&lt;/span&gt; &lt;span class='hpaste-conid'&gt;[]&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-comment'&gt;-- you are here&lt;/span&gt;&lt;br /&gt;                 &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;branch&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Branch&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;fmap&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;onFst&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Left&lt;/span&gt;&lt;span class='hpaste-conop'&gt;:&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-comment'&gt;-- first on your left&lt;/span&gt;&lt;br /&gt;                                &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;fmap&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;onFst&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Right&lt;/span&gt;&lt;span class='hpaste-conop'&gt;:&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-keyword'&gt;type&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Freq&lt;/span&gt; &lt;span class='hpaste-varid'&gt;a&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Integer&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Huff&lt;/span&gt; &lt;span class='hpaste-varid'&gt;a&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;frequencies&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;map&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;length&lt;/span&gt; &lt;span class='hpaste-varop'&gt;&amp;amp;&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Leaf&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;head&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;sortBy&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;comparing&lt;/span&gt; &lt;span class='hpaste-varid'&gt;length&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;group&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;sort&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;joinTrees&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;p1&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt;&lt;span class='hpaste-varid'&gt;t1&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-conop'&gt;:&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;p2&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt;&lt;span class='hpaste-varid'&gt;t2&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-conop'&gt;:&lt;/span&gt; &lt;span class='hpaste-varid'&gt;freqs&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;joinTrees&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;insertBy&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;comparing&lt;/span&gt; &lt;span class='hpaste-varid'&gt;fst&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;p1&lt;/span&gt; &lt;span class='hpaste-varop'&gt;+&lt;/span&gt; &lt;span class='hpaste-varid'&gt;p2&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Branch&lt;/span&gt; &lt;span class='hpaste-varid'&gt;t1&lt;/span&gt; &lt;span class='hpaste-varid'&gt;t2&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-varid'&gt;freqs&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;joinTrees&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;[&lt;/span&gt;&lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-keyword'&gt;_&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt;&lt;span class='hpaste-varid'&gt;tree&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;span class='hpaste-keyglyph'&gt;]&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;tree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;huffmanTree&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;joinTrees&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;frequencies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;codeTable&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;depthFirstTraversal&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;label&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;huffmanTree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;encode&lt;/span&gt; &lt;span class='hpaste-varid'&gt;codeTable&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;catMaybes&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;map&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;lookdown&lt;/span&gt; &lt;span class='hpaste-varid'&gt;codeTable&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;huffmanCode&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;concat&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;join&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;encode&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;codeTable&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;traverse&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Leaf&lt;/span&gt; &lt;span class='hpaste-varid'&gt;o&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-varid'&gt;path&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Just&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;o&lt;/span&gt;&lt;span class='hpaste-layout'&gt;,&lt;/span&gt; &lt;span class='hpaste-varid'&gt;path&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;traverse&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Branch&lt;/span&gt; &lt;span class='hpaste-varid'&gt;l&lt;/span&gt; &lt;span class='hpaste-varid'&gt;r&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Left&lt;/span&gt;&lt;span class='hpaste-conop'&gt;:&lt;/span&gt;&lt;span class='hpaste-varid'&gt;path&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;traverse&lt;/span&gt; &lt;span class='hpaste-varid'&gt;l&lt;/span&gt; &lt;span class='hpaste-varid'&gt;path&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;traverse&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Branch&lt;/span&gt; &lt;span class='hpaste-varid'&gt;l&lt;/span&gt; &lt;span class='hpaste-varid'&gt;r&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-conid'&gt;Right&lt;/span&gt;&lt;span class='hpaste-conop'&gt;:&lt;/span&gt;&lt;span class='hpaste-varid'&gt;path&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;traverse&lt;/span&gt; &lt;span class='hpaste-varid'&gt;r&lt;/span&gt; &lt;span class='hpaste-varid'&gt;path&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;traverse&lt;/span&gt; &lt;span class='hpaste-keyword'&gt;_&lt;/span&gt; &lt;span class='hpaste-conid'&gt;[]&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-conid'&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;huffmanDecode&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;unfoldr&lt;/span&gt; &lt;span class='hpaste-varop'&gt;.&lt;/span&gt; &lt;span class='hpaste-varid'&gt;traverse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- forall text, length text &amp;gt; 1 -&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;correct&lt;/span&gt; &lt;span class='hpaste-varid'&gt;text&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;huffmanDecode&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;huffmanTree&lt;/span&gt; &lt;span class='hpaste-varid'&gt;text&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;huffmanCode&lt;/span&gt; &lt;span class='hpaste-varid'&gt;text&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt; &lt;span class='hpaste-varop'&gt;==&lt;/span&gt; &lt;span class='hpaste-varid'&gt;text&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- checking how many bits saved on an 8 bit encoded string&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-varid'&gt;savings&lt;/span&gt; &lt;span class='hpaste-varid'&gt;text&lt;/span&gt; &lt;span class='hpaste-keyglyph'&gt;=&lt;/span&gt; &lt;span class='hpaste-varid'&gt;length&lt;/span&gt; &lt;span class='hpaste-varid'&gt;text&lt;/span&gt; &lt;span class='hpaste-varop'&gt;*&lt;/span&gt; &lt;span class='hpaste-num'&gt;8&lt;/span&gt; &lt;span class='hpaste-comment'&gt;-&lt;/span&gt; &lt;span class='hpaste-varid'&gt;length&lt;/span&gt; &lt;span class='hpaste-layout'&gt;(&lt;/span&gt;&lt;span class='hpaste-varid'&gt;huffmanCode&lt;/span&gt; &lt;span class='hpaste-varid'&gt;text&lt;/span&gt;&lt;span class='hpaste-layout'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- &amp;gt; huffmanTree "quick brown fox jumped over the lazy dog"&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- Branch (Branch (Branch (Branch (Branch (Leaf 'i') (Leaf 'j')) (Branch (Leaf 'g') (Leaf 'h'))) (Branch (Branch (Leaf 'm') (Leaf 'n')) (Branch (Leaf 'k') (Leaf 'l')))) (Branch (Branch (Leaf 'd') (Leaf 'r')) (Branch (Branch (Leaf 'c') (Leaf 'f')) (Branch (Leaf 'a') (Leaf 'b'))))) (Branch (Branch (Leaf 'o') (Branch (Leaf 'u') (Leaf 'e'))) (Branch (Leaf ' ') (Branch (Branch (Branch (Leaf 't') (Leaf 'v')) (Branch (Leaf 'p') (Leaf 'q'))) (Branch (Branch (Leaf 'y') (Leaf 'z')) (Branch (Leaf 'w') (Leaf 'x'))))))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- &amp;gt; correct "quick brown fox jumped over the lazy dog"&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- True&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- &amp;gt; savings  "quick brown fox jumped over the lazy dog"&lt;/span&gt;&lt;br /&gt;&lt;span class='hpaste-comment'&gt;-- 143&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-4566443591465848336?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/4566443591465848336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=4566443591465848336' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/4566443591465848336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/4566443591465848336'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/11/somewhat-pointfree-haskell-huffman-tree.html' title='Somewhat Pointfree Haskell Huffman Tree'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-4719820674892146824</id><published>2008-10-31T11:24:00.000-07:00</published><updated>2008-10-31T11:25:39.195-07:00</updated><title type='text'>Coq Extension</title><content type='html'>&lt;pre&gt;&lt;br /&gt;(*&lt;br /&gt;NoConfusion_Foo (P : Type) [indices] (u v : Foo [indices]) :=&lt;br /&gt; match u, v with&lt;br /&gt; | Foo x y z, Foo x y z =&gt; (x == x' -&gt; y == y' -&gt; z == z' -&gt; P) -&gt; P&lt;br /&gt; | ...&lt;br /&gt; | Chalk*, Cheese* =&gt; P&lt;br /&gt; end&lt;br /&gt;*)&lt;br /&gt;&lt;br /&gt;(*&lt;br /&gt;noConfusion_Foo (P : Type) [indices] (u v : Foo [indices]) : u == v -&gt; NoConfusion_foo P [indices] u v.&lt;br /&gt;*)&lt;br /&gt;&lt;br /&gt;open Univ&lt;br /&gt;open Inductive&lt;br /&gt;open Util&lt;br /&gt;open Coqlib&lt;br /&gt;&lt;br /&gt;let ith_univ i = make_univ (make_dirpath [id_of_string"implicit"], i)&lt;br /&gt;let implicit_type i = mkSort (Type (ith_univ i))&lt;br /&gt;let raw_type i = RSort (dummy_loc, RType (Some (ith_univ i)))&lt;br /&gt;&lt;br /&gt;let coq_heq_ref = lazy (Coqlib.coq_reference "mkHEq" ["Logic";"JMeq"] "JMeq")&lt;br /&gt;&lt;br /&gt;let construct_no_conf_body env ind mind =&lt;br /&gt;  let ctr_types = arities_of_constructors ind mind in&lt;br /&gt;  let n_ctr_types = Array.length ctr_types in&lt;br /&gt;  let n_indices = length (snd mind).mind_arity_ctxt in&lt;br /&gt;  let indices =&lt;br /&gt;    let rec names i = if i &gt; n_indices then [] else RVar (dummy_loc, id_of_string ("e"^string_of_int i)) :: names (i+1) in names 1 in&lt;br /&gt;  let abstract_indices x =&lt;br /&gt;    let rec abs i =&lt;br /&gt;      if i &gt; n_indices&lt;br /&gt;       then x&lt;br /&gt;       else RLambda (dummy_loc, Name (id_of_string ("e"^string_of_int i)), Explicit, RHole (dummy_loc, BinderType Anonymous), abs (i+1)) in&lt;br /&gt;    abs 1 in&lt;br /&gt;  Pretyping.Default.understand Evd.empty env&lt;br /&gt;   (RLambda (dummy_loc, Name (id_of_string "P"), Explicit, raw_type 1,&lt;br /&gt;   abstract_indices&lt;br /&gt;   (RLambda (dummy_loc, Name (id_of_string "u"), Explicit, RApp (dummy_loc, RRef (dummy_loc, IndRef ind), indices),&lt;br /&gt;   (RLambda (dummy_loc, Name (id_of_string "v"), Explicit, RApp (dummy_loc, RRef (dummy_loc, IndRef ind), indices),&lt;br /&gt;     RCases (dummy_loc, MatchStyle, None,&lt;br /&gt;       [(RVar (dummy_loc, (id_of_string "u")), (Anonymous, None));(RVar (dummy_loc, (id_of_string "v")), (Anonymous, None))],&lt;br /&gt;       (Array.to_list (Array.mapi (fun i ty_i -&gt;&lt;br /&gt;         let ctr = (ind, i+1) in&lt;br /&gt;         let ctr_args = constructor_nrealhyps env ctr in&lt;br /&gt;         let rec spread n i = if i = 0 then [] else (PatVar (dummy_loc, Name (id_of_string (n^string_of_int i)))) :: spread n (i-1) in&lt;br /&gt;         let left_patterns = List.rev (spread "i" ctr_args) in&lt;br /&gt;         let right_patterns = List.rev (spread "j" ctr_args) in&lt;br /&gt;         let rec assume_eqs n x = if n &gt; ctr_args&lt;br /&gt;                                   then x&lt;br /&gt;                                   else RProd (dummy_loc, Anonymous, Explicit,&lt;br /&gt;                                        RApp (dummy_loc, RRef (dummy_loc, Lazy.force coq_heq_ref),&lt;br /&gt;                                          [RHole (dummy_loc, BinderType Anonymous); RVar (dummy_loc, id_of_string ("i"^string_of_int n));&lt;br /&gt;                                           RHole (dummy_loc, BinderType Anonymous); RVar (dummy_loc, id_of_string ("j"^string_of_int n))]),&lt;br /&gt;                                        assume_eqs (n+1) x) in&lt;br /&gt;         (dummy_loc, [id_of_string "foo";id_of_string "bar"],&lt;br /&gt;                     [PatCstr (dummy_loc, ctr, left_patterns, Anonymous);PatCstr (dummy_loc, ctr, right_patterns, Anonymous)],&lt;br /&gt;                     RProd (dummy_loc, Anonymous, Explicit,&lt;br /&gt;                       assume_eqs 1 (RVar (dummy_loc, id_of_string "P")), RVar (dummy_loc, id_of_string "P")))) ctr_types) @&lt;br /&gt;        if n_ctr_types = 1&lt;br /&gt;         then []&lt;br /&gt;         else [(dummy_loc, [id_of_string "foo";id_of_string "bar"],&lt;br /&gt;                           [PatVar (dummy_loc, Anonymous);PatVar (dummy_loc, Anonymous)],&lt;br /&gt;                           RVar (dummy_loc, id_of_string "P"))]))))))))&lt;br /&gt;&lt;br /&gt;let construct_no_conf_declaration env ind mind =&lt;br /&gt; DefinitionEntry&lt;br /&gt;  { const_entry_body = construct_no_conf_body env ind mind;&lt;br /&gt;    const_entry_type = None;&lt;br /&gt;    const_entry_opaque = false;&lt;br /&gt;    const_entry_boxed = false }, IsDefinition Definition&lt;br /&gt;&lt;br /&gt;let construct_little_no_conf env ind mind little_no_conf no_conf =&lt;br /&gt;  let n_indices = length (snd mind).mind_arity_ctxt in&lt;br /&gt;  let indices =&lt;br /&gt;    let rec names i = if i &gt; n_indices then [] else RVar (dummy_loc, id_of_string ("e"^string_of_int i)) :: names (i+1) in names 1 in&lt;br /&gt;  let abstract_indices x =&lt;br /&gt;    let rec abs i =&lt;br /&gt;      if i &gt; n_indices&lt;br /&gt;       then x&lt;br /&gt;       else RProd (dummy_loc, Name (id_of_string ("e"^string_of_int i)), Explicit, RHole (dummy_loc, BinderType Anonymous), abs (i+1)) in&lt;br /&gt;    abs 1 in&lt;br /&gt;  let little_no_conf_type = Pretyping.Default.understand Evd.empty env &lt;br /&gt;     (RProd (dummy_loc, Name (id_of_string "P"), Explicit, raw_type 1,&lt;br /&gt;      abstract_indices&lt;br /&gt;     (RProd (dummy_loc, Name (id_of_string "u"), Explicit, RApp (dummy_loc, RRef (dummy_loc, IndRef ind), indices),&lt;br /&gt;     (RProd (dummy_loc, Name (id_of_string "v"), Explicit, RApp (dummy_loc, RRef (dummy_loc, IndRef ind), indices),&lt;br /&gt;     (RProd (dummy_loc, Name (id_of_string "eql"), Explicit,&lt;br /&gt;                          RApp (dummy_loc, RRef (dummy_loc, Lazy.force coq_heq_ref),&lt;br /&gt;                           [RHole (dummy_loc, BinderType Anonymous); RVar (dummy_loc, id_of_string "u");&lt;br /&gt;                            RHole (dummy_loc, BinderType Anonymous); RVar (dummy_loc, id_of_string "v")]),&lt;br /&gt;       RApp (dummy_loc, RRef (dummy_loc, no_conf),&lt;br /&gt;        ([RVar (dummy_loc, id_of_string "P")] @&lt;br /&gt;         indices @&lt;br /&gt;         [RVar (dummy_loc, id_of_string "u");&lt;br /&gt;          RVar (dummy_loc, id_of_string "v")])))))))))) in&lt;br /&gt;  try&lt;br /&gt;    let _ =&lt;br /&gt;    Pfedit.start_proof little_no_conf (Global, DefinitionBody Definition)&lt;br /&gt;      (named_context_val env)&lt;br /&gt;      little_no_conf_type&lt;br /&gt;      (fun _ _ -&gt; ());&lt;br /&gt;    Pfedit.by (tclTHENSEQ&lt;br /&gt;      [intros;&lt;br /&gt;       simplest_elim (mkVar (id_of_string "eql"));&lt;br /&gt;       simplest_elim (mkVar (id_of_string "u"));&lt;br /&gt;       simpl_in_concl;&lt;br /&gt;       Tauto.tauto]) in&lt;br /&gt;    let _,(const,_,_) = Pfedit.cook_proof (fun _ -&gt; ()) in&lt;br /&gt;     Pfedit.delete_current_proof ();&lt;br /&gt;     DefinitionEntry const, IsDefinition Definition&lt;br /&gt;  with e -&gt;&lt;br /&gt;    Pfedit.delete_current_proof ();&lt;br /&gt;    msg (str "Could not prove noConfusion, this is a serious (unexpected) problem!");&lt;br /&gt;    raise e&lt;br /&gt;&lt;br /&gt;let no_confusion i =&lt;br /&gt;  check_required_library ["Coq";"Logic";"JMeq"];&lt;br /&gt;  let env = Global.env () in&lt;br /&gt;  let istr = string_of_id i in&lt;br /&gt;  try&lt;br /&gt;    match Nametab.locate (qualid_of_string istr) with&lt;br /&gt;    | IndRef ind -&gt;&lt;br /&gt;       let mind = lookup_mind_specif env ind in&lt;br /&gt;            let no_conf = add_prefix "NoConfusion_" i in&lt;br /&gt;            let little_no_conf = add_prefix "noConfusion_" i in&lt;br /&gt;            (* msg (print_constr (construct_no_conf_body env ind mind)); TODO: Print a better message *)&lt;br /&gt;            let _ = Declare.declare_constant no_conf (construct_no_conf_declaration env ind mind) in&lt;br /&gt;            let no_conf_ty = Nametab.locate (qualid_of_string ("NoConfusion_"^istr)) in&lt;br /&gt;            let env = Global.env () in&lt;br /&gt;            Declare.declare_constant little_no_conf (construct_little_no_conf env ind mind little_no_conf no_conf_ty);&lt;br /&gt;            ()&lt;br /&gt;    | _ -&gt; msg (str (istr^" is not an inductive."))&lt;br /&gt;  with Not_found -&gt; msg (str ("Inductive "^istr^" not found in global environment."))&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;VERNAC COMMAND EXTEND Derive_NoConfusion&lt;br /&gt;| [ "Derive" "NoConfusion" ident(i) ] -&gt; [ no_confusion i ]&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-4719820674892146824?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/4719820674892146824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=4719820674892146824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/4719820674892146824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/4719820674892146824'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/10/coq-extension.html' title='Coq Extension'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-8251590065565749624</id><published>2008-10-27T15:16:00.001-07:00</published><updated>2008-10-27T15:16:54.936-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Permutation'/><category scheme='http://www.blogger.com/atom/ns#' term='Prolog'/><category scheme='http://www.blogger.com/atom/ns#' term='Deprogramming'/><category scheme='http://www.blogger.com/atom/ns#' term='stack'/><title type='text'></title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="ciao-face-comment"&gt;% Unprogramming a permutation machine&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ciao-face-clauseheadname"&gt;stack&lt;/span&gt;([],[],[]) &lt;span class="ciao-face-prompt"&gt;--&amp;gt;&lt;/span&gt; [].&lt;br /&gt;&lt;span class="ciao-face-clauseheadname"&gt;stack&lt;/span&gt;([push|&lt;span class="ciao-face-variable"&gt;Instrs&lt;/span&gt;],[&lt;span class="ciao-face-variable"&gt;I&lt;/span&gt;|&lt;span class="ciao-face-variable"&gt;IS&lt;/span&gt;],&lt;span class="ciao-face-variable"&gt;SS&lt;/span&gt;) &lt;span class="ciao-face-prompt"&gt;--&amp;gt;&lt;/span&gt; stack(&lt;span class="ciao-face-variable"&gt;Instrs&lt;/span&gt;,&lt;span class="ciao-face-variable"&gt;IS&lt;/span&gt;,[&lt;span class="ciao-face-variable"&gt;I&lt;/span&gt;|&lt;span class="ciao-face-variable"&gt;SS&lt;/span&gt;]).&lt;br /&gt;&lt;span class="ciao-face-clauseheadname"&gt;stack&lt;/span&gt;([pop|&lt;span class="ciao-face-variable"&gt;Instrs&lt;/span&gt;],&lt;span class="ciao-face-variable"&gt;IS&lt;/span&gt;,[&lt;span class="ciao-face-variable"&gt;S&lt;/span&gt;|&lt;span class="ciao-face-variable"&gt;SS&lt;/span&gt;]) &lt;span class="ciao-face-prompt"&gt;--&amp;gt;&lt;/span&gt; [&lt;span class="ciao-face-variable"&gt;S&lt;/span&gt;], stack(&lt;span class="ciao-face-variable"&gt;Instrs&lt;/span&gt;,&lt;span class="ciao-face-variable"&gt;IS&lt;/span&gt;,&lt;span class="ciao-face-variable"&gt;SS&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span class="ciao-face-comment"&gt;% ?- phrase(stack(Instructions, [1,2,3,4,5], []), [1,2,4,3,5], []).&lt;/span&gt;&lt;br /&gt;&lt;span class="ciao-face-comment"&gt;% Instructions = [push, pop, push, pop, push, push, pop, pop, push, pop] .&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-8251590065565749624?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/8251590065565749624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=8251590065565749624' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8251590065565749624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8251590065565749624'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/10/unprogramming-permutation-machine-stack.html' title=''/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-2392630433405134742</id><published>2008-10-12T14:47:00.000-07:00</published><updated>2008-10-15T15:48:02.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tauto'/><category scheme='http://www.blogger.com/atom/ns#' term='Coq'/><title type='text'>Implementing tactics in Coq</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; List.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Section&lt;/span&gt; &lt;span class="coq-function-name"&gt;propr&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Sym&lt;/span&gt; : &lt;span class="coq-type"&gt;Set&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;lookup&lt;/span&gt; : Sym -&amp;gt; &lt;span class="coq-type"&gt;Prop&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Variable&lt;/span&gt; &lt;span class="coq-variable-name"&gt;eq_Sym_dec&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;s s'&lt;/span&gt; : Sym, {s = s'} + {s &amp;lt;&amp;gt; s'}.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;prop&lt;/span&gt; : &lt;span class="coq-type"&gt;Set&lt;/span&gt; :=&lt;br /&gt;  | var : Sym -&amp;gt; prop&lt;br /&gt;  | imp : prop -&amp;gt; prop -&amp;gt; prop.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;interpret&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;p&lt;/span&gt; : prop) : &lt;span class="coq-type"&gt;Prop&lt;/span&gt; :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; p &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | var i =&amp;gt; lookup i&lt;br /&gt;      | imp p q =&amp;gt; interpret p -&amp;gt; interpret q&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;assume&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;context&lt;/span&gt; : list Sym) :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; context &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | nil =&amp;gt; &lt;span class="coq-type"&gt;True&lt;/span&gt;&lt;br /&gt;      | i :: is =&amp;gt; lookup i /\ assume is&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;contextLookup&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;i&lt;/span&gt; : Sym) (&lt;span class="coq-variable-name"&gt;context&lt;/span&gt; : list Sym) :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; context &lt;span class="coq-type"&gt;as&lt;/span&gt; context' &lt;span class="coq-type"&gt;return&lt;/span&gt; option (assume context' -&amp;gt; interpret (var i)) &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | nil =&amp;gt; None&lt;br /&gt;      | j::js =&amp;gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;match&lt;/span&gt; eq_Sym_dec i j &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;          | &lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt; eql =&amp;gt;&lt;br /&gt;            &lt;span class="coq-type"&gt;match&lt;/span&gt; eql &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;              | refl_equal =&amp;gt;&lt;br /&gt;                Some (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;hypotheses&lt;/span&gt; =&amp;gt;&lt;br /&gt;                  &lt;span class="coq-type"&gt;match&lt;/span&gt; hypotheses &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;                    | conj J _ =&amp;gt; J&lt;br /&gt;                  &lt;span class="coq-type"&gt;end&lt;/span&gt;)&lt;br /&gt;            &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;          | &lt;span class="coq-proof-tactics-name"&gt;right&lt;/span&gt; _ =&amp;gt;&lt;br /&gt;            &lt;span class="coq-type"&gt;match&lt;/span&gt; contextLookup i js &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;              | Some Prf =&amp;gt;&lt;br /&gt;                Some (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;hypotheses&lt;/span&gt; =&amp;gt;&lt;br /&gt;                  &lt;span class="coq-type"&gt;match&lt;/span&gt; hypotheses &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;                    | conj _ Js =&amp;gt; Prf Js&lt;br /&gt;                  &lt;span class="coq-type"&gt;end&lt;/span&gt;)&lt;br /&gt;              | None =&amp;gt; None&lt;br /&gt;            &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;proveable'&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;p&lt;/span&gt; : prop) (&lt;span class="coq-variable-name"&gt;context&lt;/span&gt; : list Sym) : option (assume context -&amp;gt; interpret p) :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; p &lt;span class="coq-type"&gt;as&lt;/span&gt; p' &lt;span class="coq-type"&gt;return&lt;/span&gt; option (assume context -&amp;gt; interpret p') &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | var i =&amp;gt; contextLookup i context&lt;br /&gt;      | imp (var i) q =&amp;gt;&lt;br /&gt;        &lt;span class="coq-type"&gt;match&lt;/span&gt; proveable' q (i :: context) &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;          | Some Hypo'X =&amp;gt; Some (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Hyp o&lt;/span&gt; =&amp;gt; Hypo'X (conj o Hyp))&lt;br /&gt;          | None =&amp;gt; None&lt;br /&gt;        &lt;span class="coq-type"&gt;end&lt;/span&gt;&lt;br /&gt;      | imp _ x =&amp;gt; None&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;some&lt;/span&gt; X (&lt;span class="coq-variable-name"&gt;x&lt;/span&gt; : option X) :=&lt;br /&gt;    &lt;span class="coq-type"&gt;match&lt;/span&gt; x &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;      | Some _ =&amp;gt; &lt;span class="coq-type"&gt;True&lt;/span&gt;&lt;br /&gt;      | None =&amp;gt; &lt;span class="coq-type"&gt;False&lt;/span&gt;&lt;br /&gt;    &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Implicit Arguments&lt;/span&gt; some [X].&lt;br /&gt;  &lt;br /&gt;  &lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;proveable'_proveable&lt;/span&gt; p : some (proveable' p nil) -&amp;gt; interpret p.&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; p; &lt;span class="coq-proof-tactics-name"&gt;destruct&lt;/span&gt; (proveable' p nil); [ &lt;span class="coq-coq-solve-tactics"&gt;exact&lt;/span&gt; i | &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt; ].&lt;br /&gt;  &lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;End&lt;/span&gt; propr.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; Arith.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Theorem&lt;/span&gt; &lt;span class="coq-function-name"&gt;test&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;X Y Z W&lt;/span&gt; : &lt;span class="coq-type"&gt;Prop&lt;/span&gt;) : X -&amp;gt; Y -&amp;gt; Z -&amp;gt; X -&amp;gt; Y -&amp;gt; Z.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; X Y Z W.&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;exact&lt;/span&gt;&lt;br /&gt;  (proveable'_proveable&lt;br /&gt;    nat&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;i&lt;/span&gt; =&amp;gt;&lt;br /&gt;      &lt;span class="coq-type"&gt;match&lt;/span&gt; i &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;        | 0 =&amp;gt; X&lt;br /&gt;        | 1 =&amp;gt; Y&lt;br /&gt;        | 2 =&amp;gt; Z&lt;br /&gt;        | 3 =&amp;gt; W&lt;br /&gt;        | _ =&amp;gt; &lt;span class="coq-type"&gt;False&lt;/span&gt;&lt;br /&gt;      &lt;span class="coq-type"&gt;end&lt;/span&gt;)&lt;br /&gt;    eq_nat_dec&lt;br /&gt;    (imp _ (var _ 0)&lt;br /&gt;      (imp _ (var _ 1)&lt;br /&gt;        (imp _ (var _ 2)&lt;br /&gt;          (imp _ (var _ 0)&lt;br /&gt;            (imp _ (var _ 1) (var _ 2))))))&lt;br /&gt;  I).&lt;br /&gt;&lt;span class="coq-keyword"&gt;Qed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Print&lt;/span&gt; test.&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(**************&lt;/span&gt;&lt;span class="coq-comment"&gt;&lt;br /&gt;&lt;br /&gt;test = &lt;br /&gt;fun X Y Z W : Prop =&amp;gt;&lt;br /&gt;proveable'_proveable nat&lt;br /&gt;  (fun i : nat =&amp;gt;&lt;br /&gt;   match i with&lt;br /&gt;   | 0 =&amp;gt; X&lt;br /&gt;   | 1 =&amp;gt; Y&lt;br /&gt;   | 2 =&amp;gt; Z&lt;br /&gt;   | 3 =&amp;gt; W&lt;br /&gt;   | S (S (S (S _))) =&amp;gt; False&lt;br /&gt;   end) eq_nat_dec&lt;br /&gt;  (imp nat (var nat 0)&lt;br /&gt;     (imp nat (var nat 1)&lt;br /&gt;        (imp nat (var nat 2)&lt;br /&gt;           (imp nat (var nat 0) (imp nat (var nat 1) (var nat 2)))))) I&lt;br /&gt;     : forall X Y Z : Prop, Prop -&amp;gt; X -&amp;gt; Y -&amp;gt; Z -&amp;gt; X -&amp;gt; Y -&amp;gt; Z&lt;br /&gt;&lt;br /&gt; **************&lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-2392630433405134742?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/2392630433405134742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=2392630433405134742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2392630433405134742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/2392630433405134742'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/10/implementing-tactics-in-coq.html' title='Implementing tactics in Coq'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-8505238398478985348</id><published>2008-10-11T11:57:00.000-07:00</published><updated>2008-10-11T11:58:16.217-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fin'/><category scheme='http://www.blogger.com/atom/ns#' term='NoConfusion'/><title type='text'>eq_fin_dec via NoConfusion</title><content type='html'>&lt;pre&gt;&lt;br /&gt;Require Import JMeq.&lt;br /&gt;Infix "==" := JMeq (at level 30).&lt;br /&gt;Notation "X =/= Y" := (X == Y -&gt; False) (at level 30).&lt;br /&gt;&lt;br /&gt;Inductive Fin : nat -&gt; Set :=&lt;br /&gt;| fz n : Fin (S n)&lt;br /&gt;| fs n : Fin n -&gt; Fin (S n).&lt;br /&gt;&lt;br /&gt;Fixpoint Fin_NoConfusion (P : Type) (n : nat) (f f' : Fin n) {struct f} :=&lt;br /&gt;  match f, f' with&lt;br /&gt;    | fz _, fz _ =&gt; P -&gt; P&lt;br /&gt;    | fs _ f, fs _ f' =&gt; (f == f' -&gt; P) -&gt; P&lt;br /&gt;    | _, _ =&gt; P&lt;br /&gt;  end.&lt;br /&gt;&lt;br /&gt;Definition Fin_noConfusion P n (f f' : Fin n) : f == f' -&gt; Fin_NoConfusion P n f f'.&lt;br /&gt;intros P n f f' Eq.&lt;br /&gt;elim Eq.&lt;br /&gt;elim f;&lt;br /&gt;  simpl; intros; tauto.&lt;br /&gt;Defined.&lt;br /&gt;&lt;br /&gt;Definition fs_injective (P : Type) (n : nat) (f f' : Fin n)&lt;br /&gt;  : (f == f' -&gt; P) -&gt; (fs n f == fs n f' -&gt; P)&lt;br /&gt;  := fun m Eq =&gt;&lt;br /&gt;    Fin_noConfusion P (S n) (fs n f) (fs n f') Eq m.&lt;br /&gt;&lt;br /&gt;Definition fz_fs_clash (P : Type) (n : nat) (f : Fin n)&lt;br /&gt;  : fz n == fs n f -&gt; P&lt;br /&gt;  := fun Eq =&gt;&lt;br /&gt;    Fin_noConfusion P (S n) (fz n) (fs n f) Eq.&lt;br /&gt;&lt;br /&gt;Definition eq_fin_dec n : forall f f' : Fin n, {f == f'} + {f =/= f'}.&lt;br /&gt;refine (fix eq_fin_dec n (f f' : Fin n) {struct f'} : {f == f'} + {f =/= f'} :=&lt;br /&gt;  match f in Fin n, f' in Fin n' return n = n' -&gt; {f == f'} + {f =/= f'} with&lt;br /&gt;    | fz _, fz _ =&gt; _&lt;br /&gt;    | fs _ _, fz _ =&gt; _&lt;br /&gt;    | fz _, fs _ _ =&gt; _&lt;br /&gt;    | fs _ _, fs _ _ =&gt; _&lt;br /&gt;  end (refl_equal _));&lt;br /&gt;intro Eq; injection Eq; clear Eq; intro Eq.&lt;br /&gt;&lt;br /&gt;left; rewrite Eq; reflexivity.&lt;br /&gt;&lt;br /&gt;right; rewrite Eq; intro; exact (fz_fs_clash False _ _ H).&lt;br /&gt;&lt;br /&gt;right; rewrite &lt;- Eq; intro; exact (fz_fs_clash False _ _ (sym_JMeq H)).&lt;br /&gt;&lt;br /&gt;clear f f' n; subst n0.&lt;br /&gt;destruct (eq_fin_dec n1 f0 f1).&lt;br /&gt;left; elim j; reflexivity.&lt;br /&gt;right; intro; apply f; exact (fs_injective _ _ _ _ (fun Eq =&gt; Eq) H).&lt;br /&gt;Defined.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-8505238398478985348?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/8505238398478985348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=8505238398478985348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8505238398478985348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/8505238398478985348'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/10/eqfindec-via-noconfusion.html' title='eq_fin_dec via NoConfusion'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-490232706746098634</id><published>2008-10-10T15:08:00.001-07:00</published><updated>2008-10-20T13:44:03.050-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Universes'/><category scheme='http://www.blogger.com/atom/ns#' term='Agda 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Strictly Positive Family'/><title type='text'>A different approach</title><content type='html'>Just typing out stuff from http://www.cs.nott.ac.uk/~pwm/ .&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;module&lt;/span&gt; &lt;span class="agda2-highlight-module"&gt;Universe&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;open&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;import&lt;/span&gt; &lt;span class="agda2-highlight-module"&gt;Data&lt;/span&gt;.&lt;span class="agda2-highlight-module"&gt;Nat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set1&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;suc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;vs&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;suc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;_[_]&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;suc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;0&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;_&amp;#8220;+&amp;#8221;_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;_&amp;#8220;&amp;#215;&amp;#8221;_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;_&amp;#8220;-&amp;gt;&amp;#8221;_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;K&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#956;&amp;#8221;_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;suc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set1&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set2&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;&amp;#949;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set1&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;zero&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;_^_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set1&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;suc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;_&amp;#10215;_&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set2&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;top&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;pop&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vs&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;def&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;suc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt;  &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;[&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;A&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;]&lt;/span&gt;&lt;/span&gt;  &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;void&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;inl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;+&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;inr&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;+&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;pair&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;S&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#215;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;funk&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;K&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;f&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;K&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;K&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;-&amp;gt;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;suc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;((&lt;/span&gt;&lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#956;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#956;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;F&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#956;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;+&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;zero&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;zero&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;void&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inr&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;top&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-keyword"&gt;data&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8220;Nat&amp;#8221;-View&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-primitive-type"&gt;Set2&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;isZero&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8220;Nat&amp;#8221;-View&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;zero&amp;#8221;&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-constructor"&gt;isSucc&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8220;Nat&amp;#8221;-View&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;viewNat&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8220;Nat&amp;#8221;-View&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;viewNat&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;Q&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;aux1&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;Q&lt;/span&gt;&lt;br /&gt; &lt;span class="agda2-highlight-keyword"&gt;where&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;aux3&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;((&lt;/span&gt;&lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#956;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;+&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8220;Nat&amp;#8221;-View&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inr&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;r&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt;&lt;br /&gt;       &lt;span class="agda2-highlight-function"&gt;aux3&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;top&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;isSucc&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;br /&gt;       &lt;span class="agda2-highlight-function"&gt;aux2&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;l&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;((&lt;/span&gt;&lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#956;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;+&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8220;Nat&amp;#8221;-View&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inl&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;l&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt;&lt;br /&gt;       &lt;span class="agda2-highlight-function"&gt;aux2&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;void&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;isZero&lt;/span&gt;&lt;br /&gt;       &lt;span class="agda2-highlight-function"&gt;aux1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;u&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;+&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;((&lt;/span&gt;&lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;&amp;#956;&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;1&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#8220;+&amp;#8221;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;vz&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-constructor"&gt;^&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8220;Nat&amp;#8221;-View&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;u&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;       &lt;span class="agda2-highlight-function"&gt;aux1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inl&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;U&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;aux2&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;U&lt;/span&gt;&lt;br /&gt;       &lt;span class="agda2-highlight-function"&gt;aux1&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inr&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;V&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;aux3&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;V&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;add&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;&amp;#8469;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;:&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;Tel&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;n&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10214;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;Nat&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-operator"&gt;&lt;span class="agda2-highlight-datatype"&gt;&amp;#10215;&lt;/span&gt;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;T'&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;add&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt; &lt;span class="agda2-highlight-keyword"&gt;with&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;viewNat&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;add&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inl&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;void&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)))&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;|&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;isZero&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;add&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;miso&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;inr&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;top&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)))&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;|&lt;/span&gt; &lt;span class="agda2-highlight-constructor"&gt;isSucc&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;.&lt;/span&gt;&lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;add&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;x&lt;/span&gt; &lt;span class="agda2-highlight-bound-variable"&gt;y&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-function"&gt;test&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;=&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;add&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;zero&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;{&lt;/span&gt;&lt;span class="agda2-highlight-constructor"&gt;&amp;#949;&lt;/span&gt; &lt;span class="agda2-highlight-datatype"&gt;SPT&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;}&lt;/span&gt;&lt;br /&gt;         &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;zero&amp;#8221;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;)))&lt;/span&gt;&lt;br /&gt;         &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-symbol"&gt;(&lt;/span&gt;&lt;span class="agda2-highlight-function"&gt;&amp;#8220;succ&amp;#8221;&lt;/span&gt; &lt;span class="agda2-highlight-function"&gt;&amp;#8220;zero&amp;#8221;&lt;/span&gt;&lt;span class="agda2-highlight-symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="agda2-highlight-comment"&gt;{- =&lt;br /&gt;miso&lt;br /&gt;(inr&lt;br /&gt; (top&lt;br /&gt;  (miso&lt;br /&gt;   (inr&lt;br /&gt;    (top&lt;br /&gt;     (miso&lt;br /&gt;      (inr&lt;br /&gt;       (top&lt;br /&gt;        (miso (inr (top (miso (inr (top (miso (inl void)))))))))))))))) -}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Emulate Agda style pattern matching in Coq using ideas frow Eliminating Dependent Pattern Matching..&lt;br /&gt;&lt;br /&gt;    &lt;pre&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Require Import&lt;/span&gt; JMeq.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Infix&lt;/span&gt; &lt;span class="coq-string"&gt;"=="&lt;/span&gt; := JMeq (&lt;span class="coq-type"&gt;at&lt;/span&gt; level 31).&lt;br /&gt;&lt;span class="coq-keyword"&gt;Notation&lt;/span&gt; &lt;span class="coq-string"&gt;"[ x : X ]  == [ y : Y ]"&lt;/span&gt; := (@JMeq X x Y y) (&lt;span class="coq-type"&gt;at&lt;/span&gt; level 30).&lt;br /&gt;&lt;span class="coq-keyword"&gt;Notation&lt;/span&gt; &lt;span class="coq-string"&gt;"X =/= Y"&lt;/span&gt; := (JMeq _ X _ Y -&amp;gt; &lt;span class="coq-type"&gt;False&lt;/span&gt;) (&lt;span class="coq-type"&gt;at&lt;/span&gt; level 30).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Derive NoConfusion nat.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;noConfusion_nat&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : nat) : JMeq u v -&amp;gt; NoConfusion_nat P u v.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; H.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; u;&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;SPT&lt;/span&gt; : nat -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt; :=&lt;br /&gt;| vz {n} : SPT (S n)&lt;br /&gt;| vs {n} : SPT n -&amp;gt; SPT (S n)&lt;br /&gt;| of {n} : SPT (S n) -&amp;gt; SPT n -&amp;gt; SPT n&lt;br /&gt;| q_zero_q {n} : SPT n&lt;br /&gt;| q_one_q {n} : SPT n&lt;br /&gt;| q_sum_q {n} : SPT n -&amp;gt; SPT n -&amp;gt; SPT n&lt;br /&gt;| q_mul_q {n} : SPT n -&amp;gt; SPT n -&amp;gt; SPT n&lt;br /&gt;| q_arrow_q {n} : &lt;span class="coq-type"&gt;Type&lt;/span&gt; -&amp;gt; SPT n -&amp;gt; SPT n&lt;br /&gt;| q_mu_q {n} : SPT (S n) -&amp;gt; SPT n.&lt;br /&gt;Derive NoConfusion SPT.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;noConfusion_SPT&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;e1&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : SPT e1) : JMeq u v -&amp;gt; NoConfusion_SPT P e1 u v.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; H.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; u;&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;Tel&lt;/span&gt; : nat -&amp;gt; (nat -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt;) -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt; :=&lt;br /&gt;| eps : &lt;span class="coq-type"&gt;forall&lt;/span&gt; {F}, Tel 0 F&lt;br /&gt;| telCons : &lt;span class="coq-type"&gt;forall&lt;/span&gt; {F} {n}, Tel n F -&amp;gt; F n -&amp;gt; Tel (S n) F.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Infix&lt;/span&gt; &lt;span class="coq-string"&gt;";"&lt;/span&gt; := telCons (&lt;span class="coq-type"&gt;at&lt;/span&gt; level 27, &lt;span class="coq-proof-tactics-name"&gt;left&lt;/span&gt; associativity).&lt;br /&gt;Derive NoConfusion Tel.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;noConfusion_Tel&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;e1&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;e2&lt;/span&gt; : nat -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : Tel e1 e2) : JMeq u v -&amp;gt; NoConfusion_Tel P e1 e2 u v.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; H.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; u;&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Reserved Notation&lt;/span&gt; &lt;span class="coq-string"&gt;"&amp;#10214;  type &amp;#10215; scope"&lt;/span&gt; (&lt;span class="coq-type"&gt;at&lt;/span&gt; level 30, no associativity).&lt;br /&gt;&lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;Interpretation&lt;/span&gt; : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n&lt;/span&gt;, SPT n -&amp;gt; Tel n SPT -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt; :=&lt;br /&gt;| top {n} {T' : Tel n SPT} {T : SPT n}&lt;br /&gt;  : &amp;#10214; T &amp;#10215; T' -&amp;gt; &amp;#10214; vz &amp;#10215; (T';T)&lt;br /&gt;| pop {n} {T' : Tel n SPT} {S T : SPT n}&lt;br /&gt;  : &amp;#10214; T &amp;#10215; T' -&amp;gt; &amp;#10214; vs T &amp;#10215; (T';S)&lt;br /&gt;| def {n} {T' : Tel n SPT} {A : SPT n} {F : SPT (S n)}&lt;br /&gt;  : &amp;#10214; F &amp;#10215; (T'; A) -&amp;gt; &amp;#10214; of F A &amp;#10215; T'&lt;br /&gt;| void {n} {T' : Tel n SPT}&lt;br /&gt;  : &amp;#10214; q_one_q &amp;#10215; T'&lt;br /&gt;| inl {n} {T' : Tel n SPT} {S T : SPT n}&lt;br /&gt;  : &amp;#10214; S &amp;#10215; T' -&amp;gt; &amp;#10214; q_sum_q S T &amp;#10215; T'&lt;br /&gt;| inr {n} {T' : Tel n SPT} {S T : SPT n}&lt;br /&gt;  : &amp;#10214; T &amp;#10215; T' -&amp;gt; &amp;#10214; q_sum_q S T &amp;#10215; T'&lt;br /&gt;| pair {n} {T' : Tel n SPT} {S T : SPT n}&lt;br /&gt;  : &amp;#10214; S &amp;#10215; T' -&amp;gt; &amp;#10214; T &amp;#10215; T' -&amp;gt; &amp;#10214; q_mul_q S T &amp;#10215; T'&lt;br /&gt;| funk {n} {T' : Tel n SPT} {K : &lt;span class="coq-type"&gt;Type&lt;/span&gt;} {T : SPT n}&lt;br /&gt;  : (K -&amp;gt; &amp;#10214; T &amp;#10215; T') -&amp;gt; &amp;#10214; q_arrow_q K T &amp;#10215; T'&lt;br /&gt;| miso {n} {T' : Tel n SPT} {F : SPT (S n)}&lt;br /&gt;  : &amp;#10214; F &amp;#10215; (T';q_mu_q F) -&amp;gt; &amp;#10214; q_mu_q F &amp;#10215; T'&lt;br /&gt;where &lt;span class="coq-string"&gt;"&amp;#10214;  type &amp;#10215; scope"&lt;/span&gt; := (Interpretation _ type scope).&lt;br /&gt;Derive NoConfusion Interpretation.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;noConfusion_Interpretation&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;e1&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;e2&lt;/span&gt; : SPT e1) (&lt;span class="coq-variable-name"&gt;e3&lt;/span&gt; : Tel e1 SPT) (&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : &amp;#10214;e2 &amp;#10215; e3) : JMeq u v -&amp;gt; NoConfusion_Interpretation P e1 e2 e3 u v.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; H.&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;elim&lt;/span&gt; u;&lt;br /&gt;  &lt;span class="coq-proof-tactics-name"&gt;simpl&lt;/span&gt;; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;; &lt;span class="coq-coq-solve-tactics"&gt;tauto&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;mu_injective&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;e1&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;u v&lt;/span&gt; : SPT (S e1))&lt;br /&gt;  : (e1 == e1 -&amp;gt; u == v -&amp;gt; P) -&amp;gt; (q_mu_q u == q_mu_q v -&amp;gt; P)&lt;br /&gt;  := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;m Eq&lt;/span&gt; =&amp;gt;&lt;br /&gt;    noConfusion_SPT P _ (q_mu_q u) (q_mu_q v) Eq m.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;mu_vz_clash&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;P&lt;/span&gt; : &lt;span class="coq-type"&gt;Type&lt;/span&gt;) (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;F&lt;/span&gt; : SPT (S (S n)))&lt;br /&gt;  : q_mu_q F == vz -&amp;gt; P&lt;br /&gt;  := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;Eq&lt;/span&gt; =&amp;gt;&lt;br /&gt;    noConfusion_SPT P (S n) (q_mu_q F) vz Eq.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;q_Nat_q&lt;/span&gt; {n} : SPT n := q_mu_q (q_sum_q q_one_q vz).&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;q_O_q&lt;/span&gt; {n} {T' : Tel n SPT} : &amp;#10214; q_Nat_q &amp;#10215; T' := miso (inl void).&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;q_S_q&lt;/span&gt; {n} {T' : Tel n SPT} : &amp;#10214; q_Nat_q &amp;#10215; T' -&amp;gt; &amp;#10214; q_Nat_q &amp;#10215; T' := &lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt; =&amp;gt; miso (inr (top x)).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Inductive&lt;/span&gt; &lt;span class="coq-function-name"&gt;q_Nat_q'View&lt;/span&gt; {n} {T' : Tel n SPT} : &amp;#10214; q_Nat_q &amp;#10215; T' -&amp;gt; &lt;span class="coq-type"&gt;Type&lt;/span&gt; :=&lt;br /&gt;| isO : q_Nat_q'View q_O_q&lt;br /&gt;| isS : &lt;span class="coq-type"&gt;forall&lt;/span&gt; &lt;span class="coq-variable-name"&gt;x&lt;/span&gt; : &amp;#10214; q_Nat_q &amp;#10215; T', q_Nat_q'View (q_S_q x).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;dpm_lift&lt;/span&gt; := &lt;span class="coq-proof-tacticals-name"&gt;repeat&lt;/span&gt; &lt;span class="coq-type"&gt;match&lt;/span&gt; goal &lt;span class="coq-type"&gt;with&lt;/span&gt; &lt;span class="coq-function-name"&gt;H&lt;/span&gt; : _ |- _ =&amp;gt; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; Eq; revert H; revert Eq &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;dpm_prepare&lt;/span&gt; :=&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; goal &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;    | |- @JMeq _ ?x _ ?x -&amp;gt; _ =&amp;gt; &lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; _; dpm_prepare&lt;br /&gt;    | |- @JMeq _ _ _ _ -&amp;gt; _ =&amp;gt; dpm_lift&lt;br /&gt;    | _ =&amp;gt; &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt;; dpm_prepare&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;dpm_subst&lt;/span&gt; := &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; Eql;&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; type of Eql &lt;span class="coq-type"&gt;with&lt;/span&gt; @JMeq _ ?x _ ?y =&amp;gt;&lt;br /&gt;    (&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; Eql; &lt;span class="coq-proof-tactics-name"&gt;clear&lt;/span&gt; x Eql) || (&lt;span class="coq-proof-tactics-name"&gt;rewrite&lt;/span&gt; &amp;lt;- Eql; &lt;span class="coq-proof-tactics-name"&gt;clear&lt;/span&gt; y Eql)&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;dpm_confusion&lt;/span&gt; := &lt;span class="coq-proof-tactics-name"&gt;intro&lt;/span&gt; Eql;&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; goal &lt;span class="coq-type"&gt;with&lt;/span&gt; |- ?P =&amp;gt;&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; (noConfusion_nat P _ _ Eql)||&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; (noConfusion_SPT P _ _ _ Eql)||&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; (noConfusion_Tel P _ _ _ _ Eql)||&lt;br /&gt;    &lt;span class="coq-proof-tactics-name"&gt;apply&lt;/span&gt; (noConfusion_Interpretation P _ _ _ _ _ Eql)&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Ltac&lt;/span&gt; &lt;span class="coq-function-name"&gt;dpm_specialize&lt;/span&gt; := &lt;span class="coq-proof-tacticals-name"&gt;repeat&lt;/span&gt; (dpm_prepare; (dpm_subst||dpm_confusion)).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definition&lt;/span&gt; &lt;span class="coq-function-name"&gt;view'q_Nat_q&lt;/span&gt;&lt;br /&gt;  (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat) (&lt;span class="coq-variable-name"&gt;Ts&lt;/span&gt; : Tel n SPT) (&lt;span class="coq-variable-name"&gt;x&lt;/span&gt; : &amp;#10214; q_Nat_q &amp;#10215; Ts) : (@q_Nat_q'View n Ts x).&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt;&lt;br /&gt;  (Interpretation_rect&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n' S' Ts' x'&lt;/span&gt; =&amp;gt;&lt;br /&gt;      n == n' -&amp;gt; @q_Nat_q n == S' -&amp;gt; Ts == Ts' -&amp;gt; x == x' -&amp;gt;&lt;br /&gt;      q_Nat_q'View x)&lt;br /&gt;    _ _ _ _ _ _ _ _ _&lt;br /&gt;               n               q_Nat_q                Ts             x&lt;br /&gt;    (JMeq_refl n) (JMeq_refl (@q_Nat_q n)) (JMeq_refl Ts) (JMeq_refl x));&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;unfold&lt;/span&gt; q_Nat_q &lt;span class="coq-type"&gt;in&lt;/span&gt; *;&lt;br /&gt;dpm_specialize;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; _.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt;&lt;br /&gt;  (Interpretation_rect&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n0' S' Ts' i'&lt;/span&gt; =&amp;gt;&lt;br /&gt;      S n0 == n0' -&amp;gt; q_sum_q q_one_q vz == S' -&amp;gt; T'; q_mu_q (q_sum_q q_one_q vz) == Ts' -&amp;gt; i == i' -&amp;gt;&lt;br /&gt;      q_Nat_q'View (miso i))&lt;br /&gt;    _ _ _ _ _ _ _ _ _&lt;br /&gt;    (S n0) (q_sum_q q_one_q vz) (T'; q_mu_q (q_sum_q q_one_q vz)) i&lt;br /&gt;    (JMeq_refl (S n0)) (JMeq_refl (q_sum_q q_one_q vz)) (JMeq_refl (T'; q_mu_q (q_sum_q q_one_q vz))) (JMeq_refl i));&lt;br /&gt;dpm_specialize;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; _.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt;&lt;br /&gt;  (Interpretation_rect&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n0' S' Ts' i0'&lt;/span&gt; =&amp;gt;&lt;br /&gt;      S n0 == n0' -&amp;gt; q_one_q == S' -&amp;gt; (T'; q_mu_q (q_sum_q q_one_q vz)) == Ts' -&amp;gt; i0 == i0' -&amp;gt;&lt;br /&gt;      q_Nat_q'View (miso (inl i0)))&lt;br /&gt;    _ _ _ _ _ _ _ _ _&lt;br /&gt;    (S n0) q_one_q (T'; q_mu_q (q_sum_q q_one_q vz)) i0&lt;br /&gt;    (JMeq_refl (S n0)) (JMeq_refl (q_one_q)) (JMeq_refl (T'; q_mu_q (q_sum_q q_one_q vz))) (JMeq_refl i0));&lt;br /&gt;dpm_specialize.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;exact&lt;/span&gt; isO.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;refine&lt;/span&gt;&lt;br /&gt;  (Interpretation_rect&lt;br /&gt;    (&lt;span class="coq-type"&gt;fun&lt;/span&gt; &lt;span class="coq-variable-name"&gt;n0' S' Ts' i0'&lt;/span&gt; =&amp;gt;&lt;br /&gt;      S n0 == n0' -&amp;gt; vz == S' -&amp;gt; (T'; q_mu_q (q_sum_q q_one_q vz)) == Ts' -&amp;gt; i0 == i0' -&amp;gt;&lt;br /&gt;      q_Nat_q'View (miso (inr i0)))&lt;br /&gt;    _ _ _ _ _ _ _ _ _&lt;br /&gt;    (S n0) vz (T'; q_mu_q (q_sum_q q_one_q vz)) i0&lt;br /&gt;    (JMeq_refl (S n0)) (JMeq_refl vz) (JMeq_refl (T'; q_mu_q (q_sum_q q_one_q vz))) (JMeq_refl i0));&lt;br /&gt;dpm_specialize;&lt;br /&gt;&lt;span class="coq-proof-tactics-name"&gt;intros&lt;/span&gt; _.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-coq-solve-tactics"&gt;exact&lt;/span&gt; (isS i).&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Defined&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-490232706746098634?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/490232706746098634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=490232706746098634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/490232706746098634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/490232706746098634'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/10/i-suppose-i-better-take-different.html' title='A different approach'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-6673776346290177055</id><published>2008-10-06T11:05:00.001-07:00</published><updated>2008-10-06T11:05:34.230-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Group'/><category scheme='http://www.blogger.com/atom/ns#' term='Semigroup'/><category scheme='http://www.blogger.com/atom/ns#' term='Coq'/><title type='text'>Semigroup/Group proof</title><content type='html'>&lt;pre&gt;&lt;br /&gt;Definition associativity (T : Set) (o : T -&gt; T -&gt; T) :=&lt;br /&gt;  forall x y z, (o (o x y) z) = (o x (o y z)).&lt;br /&gt;&lt;br /&gt;Record Semigroup : Type := makeSemigroup {&lt;br /&gt;  T : Set;&lt;br /&gt;  o : T -&gt; T -&gt; T;&lt;br /&gt;  assoc : associativity T o&lt;br /&gt;}.&lt;br /&gt;&lt;br /&gt;Record Group : Type := makeGroup {&lt;br /&gt;  T' : Set;&lt;br /&gt;  o' : T' -&gt; T' -&gt; T';&lt;br /&gt;  assoc' : associativity T' o';&lt;br /&gt;  I : T';&lt;br /&gt;  unit' : forall u : T', exists v, o' u v = I&lt;br /&gt;}.&lt;br /&gt;&lt;br /&gt;(* Any semigroup S with a right unit, and right inverse forall a in&lt;br /&gt;   S is a group *)&lt;br /&gt;&lt;br /&gt;Theorem ex10&lt;br /&gt;  (S : Semigroup)&lt;br /&gt;  (right_unit : T S)&lt;br /&gt;  (right_unit_meaning : forall a, (o S) a right_unit = a)&lt;br /&gt;  (right_inverse : forall a, exists b, (o S) a b = right_unit)&lt;br /&gt;: (* --------------------------------------------------------- *)&lt;br /&gt;  exists I : T S,&lt;br /&gt;    forall u : T S, exists v, (o S) u v = I.&lt;br /&gt;&lt;br /&gt;intros.&lt;br /&gt;exists right_unit.&lt;br /&gt;&lt;br /&gt;intro.&lt;br /&gt;&lt;br /&gt;destruct (right_inverse u).&lt;br /&gt;exists x.&lt;br /&gt;&lt;br /&gt;assumption.&lt;br /&gt;Qed.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2844521419334459144-6673776346290177055?l=muaddibspace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://muaddibspace.blogspot.com/feeds/6673776346290177055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2844521419334459144&amp;postID=6673776346290177055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6673776346290177055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2844521419334459144/posts/default/6673776346290177055'/><link rel='alternate' type='text/html' href='http://muaddibspace.blogspot.com/2008/10/semigroupgroup-proof.html' title='Semigroup/Group proof'/><author><name>Muad`Dib</name><uri>http://www.blogger.com/profile/01896828471974774438</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2844521419334459144.post-7087696899485715827</id><published>2008-09-20T12:28:00.001-07:00</published><updated>2008-09-20T12:29:55.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extraction'/><category scheme='http://www.blogger.com/atom/ns#' term='Ackermann'/><category scheme='http://www.blogger.com/atom/ns#' term='Induction'/><category scheme='http://www.blogger.com/atom/ns#' term='Well Founded Relation'/><category scheme='http://www.blogger.com/atom/ns#' term='Coq'/><title type='text'>Accessing Ackermann</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; The Ackermann function is defined by the equations:&lt;br /&gt; *&lt;br /&gt; *          n+1             m=0&lt;br /&gt; * A(m,n) = A(m-1,1)        m&amp;gt;0 n=0&lt;br /&gt; *          A(m-1,A(m,n-1)) m&amp;gt;0 n&amp;gt;0&lt;br /&gt; &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; It's an example of something not structurally recursive,&lt;br /&gt; * that means it's going to be a lot of fun to try and define&lt;br /&gt; * in type theory.&lt;br /&gt; &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; A simple example to look at first is double: &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Fixpoint&lt;/span&gt; &lt;span class="coq-function-name"&gt;double&lt;/span&gt; (&lt;span class="coq-variable-name"&gt;n&lt;/span&gt; : nat) : nat :=&lt;br /&gt;  &lt;span class="coq-type"&gt;match&lt;/span&gt; n &lt;span class="coq-type"&gt;with&lt;/span&gt;&lt;br /&gt;    | O =&amp;gt; O&lt;br /&gt;    | S m =&amp;gt; S (S (double m))&lt;br /&gt;  &lt;span class="coq-type"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-comment-delimiter"&gt;(*&lt;/span&gt;&lt;span class="coq-comment"&gt; From the definition you can see that every application of double&lt;br /&gt; * is done with m = S n&lt;br /&gt; &lt;/span&gt;&lt;span class="coq-comment-delimiter"&gt;*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="coq-keyword"&gt;Definit
