on master help sign in
1330 files changed+49194−19734
since splitsnapshots
unifiedsplit
.github/ISSUE_TEMPLATE.md+9 .gitignore+1 .hlint.yaml+61 .stylish-haskell.yaml+154 .travis.yml+69−42 CHANGELOG.md+324−5 CITATION.md+1−1 CONTRIBUTING.md+21−6 CONTRIBUTORS+214−41 HLint.hs−33 INSTALL.md+55−6 Makefile+15−12 README.md+9−7 RELEASE-CHECKS.md+2 Setup.hs+83−79 appveyor.yml+9−8 azure-pipelines.yml+143 benchmarks/build.pl+3−2 benchmarks/fasta/fasta.idr+9−4 benchmarks/pidigits/pidigits.idr+1−1 codegen/idris-codegen-c/Main.hs+5−5 codegen/idris-codegen-javascript/Main.hs+2−3 codegen/idris-codegen-node/Main.hs+13−8 config.mk+4−2 docs/LICENSE+1−1 docs/Makefile+1−1 docs/README.md+3−3 docs/_static/theme_overrides.css+13 docs/conf.py+81−12 docs/effects/conclusions.rst+1−1 docs/effects/depeff.rst+18−9 docs/effects/impleff.rst+1−1 docs/effects/index.rst+13−1 docs/effects/introduction.rst+5−4 docs/effects/simpleeff.rst+6−5 docs/effects/state.rst+1−1 docs/effects/summary.rst+23−23 docs/elaboratorReflection/elabReflection.rst+60 docs/reference/elaborator-reflection.rst → docs/elaboratorReflection/elaborator-reflection.rst+19−7 docs/elaboratorReflection/example1.rst+192 docs/elaboratorReflection/generatingData.rst+385 docs/elaboratorReflection/holes.rst+196 docs/elaboratorReflection/index.rst+27 docs/elaboratorReflection/primitive.rst+518 docs/elaboratorReflection/tactics.rst+430 docs/faq/faq.rst+50−12 docs/guides/index.rst+1−1 docs/guides/theorem-prover.rst+1−1 docs/guides/type-providers-ffi.rst+6−4 docs/image/README.md+16 docs/image/attack.png docs/image/attack.svg+199 docs/image/binders.png docs/image/binders.svg+326 docs/image/compareToProofAssist.png docs/image/compareToProofAssist.svg+260 docs/image/elab.png docs/image/elab.svg+139 docs/image/elabLogicEx1_1.png docs/image/elabLogicEx1_1.svg+99 docs/image/elabLogicEx1_2.png docs/image/elabLogicEx1_2.svg+112 docs/image/elabLogicEx1_3.png docs/image/elabLogicEx1_3.svg+112 docs/image/elabLogicEx1_4.png docs/image/elabLogicEx1_4.svg+80 docs/image/elabOverview.png docs/image/elabOverview.svg+585 docs/image/elabProofState.png docs/image/elabProofState.svg+356 docs/image/elabProofStateEx1_1.png docs/image/elabProofStateEx1_1.svg+312 docs/image/elabProofStateEx1_2.png docs/image/elabProofStateEx1_2.svg+281 docs/image/elabProofStateEx1_3.png docs/image/elabProofStateEx1_3.svg+244 docs/image/fill.png docs/image/fill.svg+163 docs/image/generateDatatype.png docs/image/generateDatatype.svg+540 docs/image/generateFunction.png docs/image/generateFunction.svg+588 docs/image/generateFunction2.png docs/image/generateFunction2.svg+430 docs/image/idrisTopLevel.png docs/image/idrisTopLevel.svg+524 docs/image/login.png docs/image/netstate.png docs/image/parserModules.png docs/image/parserModules.svg+1251 docs/image/parserTopLevel.png docs/image/parserTopLevel.svg+294 docs/image/plusReducesProof.png docs/image/plusReducesProof.svg+339 docs/image/recogniser.png docs/image/recogniser.svg+477 docs/image/solve.png docs/image/solve.svg+163 docs/image/tokenise.png docs/image/tokenise.svg+740 docs/image/tree.png docs/image/tree.svg+212 docs/index.rst+4−1 docs/listing/idris-prompt-helloworld.txt+2−2 docs/listing/idris-prompt-interp.txt+2−2 docs/listing/idris-prompt-start.txt+2−2 docs/make.bat+1−1 docs/faq/index.rst → docs/parserLibrary/index.rst+11−6 docs/parserLibrary/introduction.rst+76 docs/parserLibrary/lexer.rst+288 docs/parserLibrary/parser.rst+700 docs/parserLibrary/whitespace.rst+250 docs/proofs/definitional.rst+235 docs/proofs/index.rst+5−2 docs/proofs/inductive.rst+2 docs/proofs/interactive.rst+224−97 docs/proofs/interactiveOld.rst+169 docs/proofs/pluscomm.rst+1−1 docs/proofs/propositional.rst+133 docs/reference/codegen.rst+147 docs/reference/compilation.rst+59−35 docs/reference/documenting.rst+8−1 docs/reference/erasure.rst+5−5 docs/reference/ffi.rst+178−8 docs/reference/ide-protocol.rst+21−11 docs/reference/index.rst+6−2 docs/reference/internals.rst+179 docs/reference/language-extensions.rst+8−3 docs/reference/misc.rst+10−117 docs/reference/packages.rst+16−4 docs/reference/partial-evaluation.rst+305 docs/reference/syntax-guide.rst+83−2 docs/reference/syntax-reference.rst+422 docs/reference/tactics.rst−13 docs/reference/type-directed-search.rst+336 docs/reference/uniqueness-types.rst+3−3 docs/st/composing.rst+774 docs/st/examples.rst+439 docs/st/index.rst+27 docs/st/introduction.rst+93 docs/st/machines.rst+536 docs/st/state.rst+654 docs/tutorial/conclusions.rst+6−6 docs/tutorial/index.rst+5−3 docs/tutorial/interactive.rst+5−6 docs/tutorial/interfaces.rst+73−19 docs/tutorial/interp.rst+3−3 docs/tutorial/introduction.rst+7−2 docs/tutorial/miscellany.rst+51−17 docs/tutorial/modules.rst+25−52 docs/tutorial/packages.rst+141−23 docs/tutorial/starting.rst+2−1 docs/tutorial/syntax.rst+11−11 docs/tutorial/testing.rst−85 docs/tutorial/theorems.rst+145−6 docs/tutorial/typesfuns.rst+149−150 docs/tutorial/views.rst+77−19 idris-tutorial.pdf idris.cabal+155−93 jsrts/Runtime-browser.js−17 jsrts/Runtime-common.js+20−115 jsrts/Runtime-javascript.js+15 jsrts/Runtime-node.js+34−36 jsrts/jsbn/jsbn-browser.js+1353 jsrts/jsbn/jsbn-node.js+1 jsrts/jsbn/jsbn.js−1238 libs/Makefile−1 libs/base/Control/Catchable.idr+24−1 libs/base/Control/Category.idr+1−1 libs/base/Control/Isomorphism.idr+37−29 libs/base/Control/Monad/Identity.idr+23−4 libs/base/Control/Monad/RWS.idr+7−1 libs/base/Control/Monad/State.idr+4 libs/base/Control/Monad/Writer.idr+3 libs/base/Data/Bits.idr+69−6 libs/base/Data/Buffer.idr+170 libs/base/Data/Complex.idr+14−16 libs/base/Data/Fin.idr+10−1 libs/base/Data/HVect.idr+4−4 libs/base/Data/IORef.idr+61 libs/base/Data/List.idr+24−9 libs/base/Data/List/Quantifiers.idr+5 libs/base/Data/List/Views.idr+18−24 libs/base/Data/Morphisms.idr+53−25 libs/base/Data/Nat/Views.idr+10−14 libs/base/Data/Primitives/Views.idr+19−15 libs/base/Data/So.idr+11−1 libs/base/Data/SortedSet.idr−28 libs/base/Data/String.idr+3−1 libs/base/Data/String/Views.idr+2 libs/base/Data/Vect.idr+513−114 libs/base/Data/Vect/Views.idr+10−10 libs/base/Debug/Error.idr+3−6 libs/base/Language/Reflection/Utils.idr+20−4 libs/base/Makefile+4−3 libs/base/System.idr+52−6 libs/base/System/Concurrency/Channels.idr+9−2 libs/base/System/Concurrency/Raw.idr+13−8 libs/base/base.ipkg+51−33 libs/contrib/CFFI/Memory.idr+3−2 libs/contrib/CFFI/Types.idr+10−8 libs/contrib/Control/Algebra.idr+14 libs/contrib/Control/Algebra/Lattice.idr+16 libs/contrib/Control/Algebra/Laws.idr+153 libs/contrib/Control/Algebra/NumericImplementations.idr+26−6 libs/contrib/Control/Delayed.idr+26 libs/contrib/Control/Isomorphism/Extra.idr+42 libs/contrib/Control/Isomorphism/Fin.idr+54 libs/contrib/Control/Isomorphism/Vect.idr+155 libs/contrib/Control/Monad/Syntax.idr+18 libs/contrib/Control/Pipeline.idr+26 libs/contrib/Control/ST.idr+660 libs/contrib/Control/ST/Exception.idr+38 libs/contrib/Control/ST/File.idr+247 libs/contrib/Control/ST/ImplicitCall.idr+13 libs/contrib/Control/ST/Random.idr+42 libs/contrib/Data/Bool/Extra.idr+82 libs/contrib/Data/BoundedList.idr+29 libs/contrib/Data/Chain.idr+46 libs/contrib/Data/CoList.idr+1−1 libs/contrib/Data/Combinators.idr+38 libs/contrib/Data/Combinators/Applicative.idr+27 libs/contrib/Data/Combinators/Arrow.idr+15 libs/contrib/Data/Fin/Extra.idr+86 libs/contrib/Data/Fuel.idr+18 libs/contrib/Data/Heap.idr−4 libs/contrib/Data/IOArray.idr+47 libs/contrib/Data/List/Group.idr+27 libs/contrib/Data/List/Permutations.idr+12 libs/contrib/Data/List/Reverse.idr+99 libs/contrib/Data/List/Zipper.idr+160 libs/contrib/Data/Logic/Propositional.idr+161 libs/contrib/Data/Matrix/Numeric.idr+3−1 libs/contrib/Data/Monoid.idr+33 libs/contrib/Data/Nat.idr+25 libs/contrib/Data/Nat/Ack.idr+60 libs/contrib/Data/Nat/Fact.idr+56 libs/contrib/Data/Nat/Fib.idr+50 libs/contrib/Data/Nat/Parity.idr+217 libs/contrib/Data/Pairs/Implicit.idr+13 libs/contrib/Data/PosNat.idr+57 libs/contrib/Data/Sign.idr+29 libs/contrib/Data/SortedBag.idr+127 libs/contrib/Data/SortedMap.idr+66−2 libs/contrib/Data/SortedSet.idr+34−3 libs/contrib/Data/Stream/Extra.idr+10 libs/contrib/Data/String.idr−31 libs/contrib/Data/String/Extra.idr+88 libs/contrib/Data/ZZ.idr+206−8 libs/contrib/Interfaces/Correlative.idr+63 libs/contrib/Interfaces/Proposition.idr+32 libs/contrib/Interfaces/Verified.idr+285−49 libs/contrib/Language/JSON.idr+14 libs/contrib/Language/JSON/Data.idr+98 libs/contrib/Language/JSON/Lexer.idr+40 libs/contrib/Language/JSON/Parser.idr+71 libs/contrib/Language/JSON/String.idr+16 libs/contrib/Language/JSON/String/Lexer.idr+38 libs/contrib/Language/JSON/String/Parser.idr+25 libs/contrib/Language/JSON/String/Tokens.idr+60 libs/contrib/Language/JSON/Tokens.idr+72 libs/contrib/Makefile+4−3 libs/contrib/Network/Cgi.idr+3 libs/contrib/Network/Socket.idr+31−396 libs/contrib/Network/Socket/Data.idr+172 libs/contrib/Network/Socket/Raw.idr+199 libs/contrib/Test/Unit.idr+14 libs/contrib/Test/Unit/Assertions.idr+37 libs/contrib/Test/Unit/Display.idr+27 libs/contrib/Test/Unit/Generic.idr+43 libs/contrib/Test/Unit/Runners.idr+36 libs/contrib/Text/Lexer.idr+324 libs/contrib/Text/Lexer/Core.idr+193 libs/contrib/Text/Literate.idr+155 libs/contrib/Text/Parser.idr+226 libs/contrib/Text/Parser/Core.idr+265 libs/contrib/Text/PrettyPrint/WL.idr+18 libs/contrib/Text/PrettyPrint/WL/Characters.idr+103 libs/contrib/Text/PrettyPrint/WL/Combinators.idr+259 libs/contrib/Text/PrettyPrint/WL/Core.idr+226 libs/contrib/Text/Quantity.idr+38 libs/contrib/Text/Token.idr+38 libs/contrib/contrib.ipkg+105−20 libs/effects/Effect/Exception.idr+1−2 libs/effects/Effect/File.idr+4−4 libs/effects/Effect/Logging/Category.idr+2−2 libs/effects/Effect/Logging/Level.idr+9−9 libs/effects/Effect/Perf.idr+1−1 libs/effects/Effect/Random.idr+21−4 libs/effects/Effect/System.idr+7 libs/effects/Effects.idr+6−7 libs/effects/Makefile+2−1 libs/effects/effects.ipkg+12−10 libs/oldeffects/Effect/Default.idr−44 libs/oldeffects/Effect/Exception.idr−41 libs/oldeffects/Effect/File.idr−128 libs/oldeffects/Effect/Memory.idr−175 libs/oldeffects/Effect/Monad.idr−21 libs/oldeffects/Effect/Random.idr−47 libs/oldeffects/Effect/Select.idr−23 libs/oldeffects/Effect/State.idr−40 libs/oldeffects/Effect/StdIO.idr−60 libs/oldeffects/Effect/System.idr−43 libs/oldeffects/Effects.idr−333 libs/oldeffects/Makefile−22 libs/oldeffects/effects.ipkg−9 libs/prelude/Builtins.idr+21−24 libs/prelude/Decidable/Equality.idr+31−16 libs/prelude/IO.idr+8−3 libs/prelude/Language/Reflection.idr+38−87 libs/prelude/Language/Reflection/Elab.idr+9−6 libs/prelude/Language/Reflection/Errors.idr−1 libs/prelude/Makefile+3−2 libs/prelude/Prelude.idr+26−10 libs/prelude/Prelude/Algebra.idr−2 libs/prelude/Prelude/Applicative.idr+4−4 libs/prelude/Prelude/Basics.idr+1−2 libs/prelude/Prelude/Bits.idr+85−28 libs/prelude/Prelude/Bool.idr+13−3 libs/prelude/Prelude/Cast.idr+1−1 libs/prelude/Prelude/Chars.idr+12−2 libs/prelude/Prelude/Doubles.idr+4−1 libs/prelude/Prelude/Either.idr+5−1 libs/prelude/Prelude/File.idr+160−56 libs/prelude/Prelude/Functor.idr+10−3 libs/prelude/Prelude/Interactive.idr+19−7 libs/prelude/Prelude/Interfaces.idr+22−10 libs/prelude/Prelude/List.idr+88−34 libs/prelude/Prelude/Maybe.idr+22−1 libs/prelude/Prelude/Monad.idr+8−8 libs/prelude/Prelude/Nat.idr+94−79 libs/prelude/Prelude/Pairs.idr−8 libs/prelude/Prelude/Show.idr+6−6 libs/prelude/Prelude/Strings.idr+65−19 libs/prelude/Prelude/WellFounded.idr+47−24 libs/prelude/prelude.ipkg+37−12 libs/pruviloj/Makefile+2−1 libs/pruviloj/Pruviloj/Core.idr+71−10 libs/pruviloj/Pruviloj/Derive/DecEq.idr+4−4 libs/pruviloj/Pruviloj/Derive/Eliminators.idr+5−5 libs/pruviloj/Pruviloj/Disjoint.idr+66−26 libs/pruviloj/Pruviloj/Induction.idr+3−1 libs/pruviloj/Pruviloj/Injective.idr+1−1 libs/pruviloj/Pruviloj/Internals.idr+3−13 libs/pruviloj/Pruviloj/Internals/TyConInfo.idr+1−1 libs/pruviloj/pruviloj.ipkg+7−1 main/Main.hs+20−11 man/idris.1+22−7 mkpkg.sh+48−7 rts/Makefile+12−17 rts/idris_bitstring.c+255−523 rts/idris_bitstring.h−5 rts/idris_buffer.c+146 rts/idris_buffer.h+29 rts/idris_gc.c+57−57 rts/idris_gmp.c+92−223 rts/idris_gmp.h+10−3 rts/idris_heap.c+21−14 rts/idris_heap.h+1−1 rts/idris_main.c+42−6 rts/idris_net.c+42−8 rts/idris_net.h+14 rts/idris_opts.c+1−1 rts/idris_opts.h+1−1 rts/idris_rts.c+412−325 rts/idris_rts.h+235−103 rts/idris_stdfgn.c+184−16 rts/idris_stdfgn.h+30−2 rts/idris_utf8.c+12−2 rts/idris_utf8.h+2 rts/mini-gmp.c+459−167 rts/mini-gmp.h+47−8 rts/seL4/CMakeLists.txt+43 rts/seL4/README.md+5 rts/seL4/idris_main.c+31 rts/windows/idris_net.c−195 rts/windows/win_utils.c+49−3 rts/windows/win_utils.h+9 samples/ST/Composite.idr+8 samples/ST/Graphics/Draw.idr+88 samples/ST/Graphics/Turtle.idr+116 samples/ST/Intro.idr+75 samples/ST/Login.idr+55 samples/ST/LoginCount.idr+77 samples/ST/Net/EchoSimple.idr+24 samples/ST/Net/Network.idr+106 samples/ST/Net/RandServer.idr+156 samples/ST/Net/Threads.idr+23 samples/ST/TreeTag.idr+29 samples/effects/TreeTag.idr+2−2 samples/misc/interp.idr+23−14 samples/tutorial/bmain.idr → samples/tutorial/BMain.idr+2−2 samples/tutorial/btree.idr → samples/tutorial/BTree.idr+4 samples/tutorial/btreemod.idr → samples/tutorial/BTreeMod.idr+5−5 samples/tutorial/foo.idr → samples/tutorial/Foo.idr samples/tutorial/hello.idr → samples/tutorial/Hello.idr samples/tutorial/idiom.idr → samples/tutorial/Idiom.idr samples/tutorial/classes.idr → samples/tutorial/Interfaces.idr+1−1 samples/tutorial/interp.idr → samples/tutorial/Interp.idr+2−2 samples/tutorial/letbind.idr → samples/tutorial/LetBind.idr+1−1 samples/tutorial/prims.idr → samples/tutorial/Prims.idr+1−1 samples/tutorial/Record.idr+21 samples/tutorial/theorems.idr → samples/tutorial/Theorems.idr−20 samples/tutorial/universe.idr → samples/tutorial/Universe.idr samples/tutorial/usefultypes.idr → samples/tutorial/UsefulTypes.idr+1 samples/tutorial/vbroken.idr → samples/tutorial/VBroken.idr samples/tutorial/views.idr → samples/tutorial/Views.idr+8−20 samples/tutorial/viewsbroken.idr → samples/tutorial/ViewsBroken.idr samples/tutorial/wheres.idr → samples/tutorial/Wheres.idr+1−1 samples/tutorial/binary.idr−61 scripts/runidris+25 scripts/runidris-node+25 src/IRTS/BCImp.hs−23 src/IRTS/Bytecode.hs+7−6 src/IRTS/CodegenC.hs+179−157 src/IRTS/CodegenCommon.hs+6−4 src/IRTS/CodegenJavaScript.hs+53−1299 src/IRTS/Compiler.hs+209−78 src/IRTS/Defunctionalise.hs+28−80 src/IRTS/DumpBC.hs+4−4 src/IRTS/Exports.hs+2−2 src/IRTS/Inliner.hs+1−2 src/IRTS/JavaScript/AST.hs+276−402 src/IRTS/JavaScript/Codegen.hs+636 src/IRTS/JavaScript/LangTransforms.hs+99 src/IRTS/JavaScript/Name.hs+57 src/IRTS/JavaScript/PrimOp.hs+246 src/IRTS/JavaScript/Specialize.hs+109 src/IRTS/Lang.hs+148−59 src/IRTS/LangOpts.hs+299−59 src/IRTS/Portable.hs+97−17 src/IRTS/Simplified.hs+52−61 src/IRTS/System.hs+65−26 src/Idris/ASTUtils.hs+15−10 src/Idris/AbsSyntax.hs+246−285 src/Idris/AbsSyntaxTree.hs+216−273 src/Idris/Apropos.hs+10−15 src/Idris/CaseSplit.hs+33−45 src/Idris/Chaser.hs+78−41 src/Idris/CmdOptions.hs+80−51 src/Idris/Colours.hs+1−1 src/Idris/Completion.hs+21−21 src/Idris/Core/Binary.hs+25−330 src/Idris/Core/CaseTree.hs+156−106 src/Idris/Core/Constraints.hs+5−6 src/Idris/Core/DeepSeq.hs+7−3 src/Idris/Core/Elaborate.hs+52−73 src/Idris/Core/Evaluate.hs+267−183 src/Idris/Core/Execute.hs+129−74 src/Idris/Core/ProofState.hs+116−199 src/Idris/Core/ProofTerm.hs+43−48 src/Idris/Core/TT.hs+215−171 src/Idris/Core/Typecheck.hs+155−142 src/Idris/Core/Unify.hs+84−155 src/Idris/Core/WHNF.hs+73−31 src/Idris/Coverage.hs+414−855 src/Idris/DSL.hs+26−31 src/Idris/DataOpts.hs+5−11 src/Idris/DeepSeq.hs+10−23 src/Idris/Delaborate.hs+129−114 src/Idris/Directives.hs+9−9 src/Idris/Docs.hs+43−23 src/Idris/Docstrings.hs+14−13 src/Idris/Elab/AsPat.hs+23−13 src/Idris/Elab/Clause.hs+256−157 src/Idris/Elab/Data.hs+78−308 src/Idris/Elab/Implementation.hs+45−58 src/Idris/Elab/Interface.hs+201−120 src/Idris/Elab/Provider.hs+11−41 src/Idris/Elab/Quasiquote.hs+8−8 src/Idris/Elab/Record.hs+20−62 src/Idris/Elab/Rewrite.hs+20−23 src/Idris/Elab/RunElab.hs+6−11 src/Idris/Elab/Term.hs+277−392 src/Idris/Elab/Transform.hs+10−43 src/Idris/Elab/Type.hs+15−59 src/Idris/Elab/Utils.hs+337−61 src/Idris/Elab/Value.hs+14−42 src/Idris/ElabDecls.hs+66−64 src/Idris/Erasure.hs+154−41 src/Idris/ErrReverse.hs+12−16 src/Idris/Error.hs+21−19 src/Idris/Help.hs+3−1 src/Idris/IBC.hs+250−1651 src/Idris/IdeMode.hs+36−32 src/Idris/IdrisDoc.hs+54−71 src/Idris/Imports.hs+54−16 src/Idris/Info.hs+26−9 src/Idris/Info/Show.hs+49−1 src/Idris/Inliner.hs+3−3 src/Idris/Interactive.hs+54−62 src/Idris/Main.hs+79−65 src/Idris/ModeCommon.hs+34−37 src/Idris/Options.hs+291 src/Idris/Output.hs+187−36 src/Idris/Package.hs+163−90 src/Idris/Package/Common.hs+5−5 src/Idris/Package/Parser.hs+89−183 src/Idris/Parser.hs+614−639 src/Idris/Parser/Data.hs+79−129 src/Idris/Parser/Expr.hs+341−403 src/Idris/Parser/Helpers.hs+240−402 src/Idris/Parser/Ops.hs+141−94 src/Idris/Parser/Stack.hs+161 src/Idris/PartialEval.hs+98−55 src/Idris/Primitives.hs+30−62 src/Idris/ProofSearch.hs+19−36 src/Idris/Prover.hs+62−67 src/Idris/Providers.hs+3−5 src/Idris/REPL.hs+190−147 src/Idris/REPL/Browse.hs+7−8 src/Idris/REPL/Commands.hs+9−4 src/Idris/REPL/Parser.hs+192−190 src/Idris/Reflection.hs+51−47 src/Idris/Termination.hs+639 src/Idris/Transforms.hs+3−6 src/Idris/TypeSearch.hs+57−42 src/Idris/Unlit.hs+6−4 src/Idris/WhoCalls.hs+3−5 src/Util/DynamicLinker.hs+20−13 src/Util/Net.hs+10−13 src/Util/Pretty.hs+4−1 src/Util/ScreenSize.hs+1−1 src/Util/System.hs+44−15 stack-11.22.yaml+21 stack-12.26.yaml+20 stack-15.3.yaml+17 stack-15.4.yaml+17 stack-shell.nix+13−20 stack.yaml+1−17 stylize.sh+40 test/README.md+7−12 test/TestData.hs+96−38 test/TestRun.hs+36−22 test/base001/Makefile+2−2 test/base001/exit1.c+4 test/base001/expected → test/base001/expected.out test/base001/run → test/base001/run.sh+1−1 test/base001/sys.c+4 test/basic001/expected → test/basic001/expected.out test/basic001/run → test/basic001/run.sh test/basic002/expected → test/basic002/expected.out+10−2 test/basic002/run → test/basic002/run.sh test/basic003/expected → test/basic003/expected.out test/basic003/run → test/basic003/run.sh test/basic004/expected → test/basic004/expected.out test/basic004/run → test/basic004/run.sh test/basic005/expected → test/basic005/expected.out test/basic005/run → test/basic005/run.sh test/basic006/expected → test/basic006/expected.out+6−1 test/basic006/run → test/basic006/run.sh test/basic007/expected → test/basic007/expected.out test/basic007/run → test/basic007/run.sh test/basic008/expected → test/basic008/expected.out test/basic008/run → test/basic008/run.sh test/basic009/expected−17 test/basic009/expected.out+32 test/basic009/run → test/basic009/run.sh test/basic010/expected → test/basic010/expected.out test/basic010/run → test/basic010/run.sh+2−2 test/basic011/expected → test/basic011/expected.out test/basic011/run → test/basic011/run.sh test/basic012/expected → test/basic012/expected.out test/basic012/run → test/basic012/run.sh test/basic013/basic013.idr+37−2 test/basic013/expected → test/basic013/expected.out+37−1 test/basic013/run → test/basic013/run.sh test/basic014/expected → test/basic014/expected.out test/basic014/run → test/basic014/run.sh test/basic015/expected → test/basic015/expected.out test/basic015/run → test/basic015/run.sh test/basic016/expected−1 test/basic016/expected.out+1 test/basic016/run → test/basic016/run.sh test/basic017/expected−3 test/basic017/expected.out+8 test/basic017/run → test/basic017/run.sh test/basic018/expected−17 test/basic018/expected.out+32 test/basic018/run → test/basic018/run.sh test/basic019/basic019.idr+10 test/basic019/expected.out+12 test/basic019/run.sh+4 test/basic020/basic020.idr+42 test/bignum001/expected → test/basic020/expected.out test/basic020/run.sh+4 test/basic021/basic021.idr+13 test/basic021/basic021_2.idr+13 test/basic021/expected.out+2 test/basic021/run.sh+6 test/basic022/basic022.idr+13 test/basic022/expected.out+1 test/basic022/run.sh+4 test/prelude001/expected → test/basic023/expected.out test/basic023/run.sh+4 test/basic023/sections.idr+34 test/basic024/basic024.idr+51 test/basic024/expected.out+76 test/basic024/input.in+46 test/basic024/run.sh+8 test/basic025/basic025.idr+28 test/basic025/expected.out+12 test/basic025/input.in+7 test/basic025/run.sh+7 test/basic026/basic026.idr+12 test/basic026/expected.out+2 test/basic026/run.sh+4 test/bignum001/expected.out+1 test/bignum001/run → test/bignum001/run.sh test/bignum002/bignum002.idr+10−1 test/bignum002/expected−1 test/bignum002/expected.out+8 test/bignum002/run → test/bignum002/run.sh test/bignum003/bignum003.idr+23 test/bignum003/expected.out+2 test/bignum003/run.sh+4 test/bounded001/expected → test/bounded001/expected.out test/bounded001/run → test/bounded001/run.sh test/buffer001/buffer001.idr+33 test/buffer001/expected.out+7 test/buffer001/run.sh+4 test/buffer002/buffer002.idr+34 test/buffer002/expected.out+11 test/buffer002/run.sh+4 test/contrib001/contrib001.idr+14 test/contrib001/expected.out+12 test/contrib001/run.sh+4 test/corecords001/expected → test/corecords001/expected.out test/corecords001/run → test/corecords001/run.sh test/corecords002/expected → test/corecords002/expected.out test/corecords002/run → test/corecords002/run.sh test/delab001/expected → test/delab001/expected.out test/delab001/input → test/delab001/input.in test/delab001/run−3 test/delab001/run.sh+3 test/directives001/expected−12 test/directives001/expected.out+42 test/directives001/run → test/directives001/run.sh test/directives002/expected−2 test/directives002/expected.out+6 test/directives002/run → test/directives002/run.sh test/directives003/directives003.idr+11 test/directives003/expected.out+6 test/directives003/run.sh+13 test/disambig002/disambig002.idr+2−7 test/disambig002/expected → test/disambig002/expected.out test/disambig002/run → test/disambig002/run.sh test/docs001/expected → test/docs001/expected.out+1−1 test/docs001/input → test/docs001/input.in test/docs001/run−3 test/docs001/run.sh+3 test/docs002/expected−12 test/docs002/expected.out+12 test/docs002/input → test/docs002/input.in test/docs002/run−3 test/docs002/run.sh+3 test/docs003/expected → test/docs003/expected.out+4−1 test/docs003/input → test/docs003/input.in test/docs003/run−3 test/docs003/run.sh+3 test/docs004/expected → test/docs004/expected.out+3−3 test/docs004/input → test/docs004/input.in test/docs004/run−3 test/docs004/run.sh+3 test/docs005/expected → test/docs005/expected.out+3−1 test/docs005/input → test/docs005/input.in test/docs005/run−3 test/docs005/run.sh+3 test/docs006/docs006.idr+7 test/docs006/expected.out+16 test/docs006/input.in+1 test/docs006/run.sh+3 test/dsl001/expected → test/dsl001/expected.out+9−9 test/dsl001/input−2 test/dsl001/input.in+2 test/dsl001/run−5 test/dsl001/run.sh+5 test/dsl001/test001.idr+2−1 test/dsl002/Resimp.idr+2−1 test/dsl002/expected → test/dsl002/expected.out test/dsl002/run → test/dsl002/run.sh test/dsl002/test → test/dsl002/test.in test/dsl002/test014.idr+1−1 test/dsl003/DSLPi.idr+2 test/dsl003/expected → test/dsl003/expected.out test/dsl003/run → test/dsl003/run.sh test/dsl004/Door0.idr+3−1 test/dsl004/Door1.idr+2 test/dsl004/Door2.idr+2 test/dsl004/Door3.idr+2 test/dsl004/IOu.idr+2 test/dsl004/expected → test/dsl004/expected.out test/dsl004/run → test/dsl004/run.sh test/effects001/expected → test/effects001/expected.out+2−2 test/effects001/run → test/effects001/run.sh test/effects001/test021.idr+1−1 test/effects001/testFile → test/effects001/testFile.in test/effects002/expected → test/effects002/expected.out test/effects002/run → test/effects002/run.sh test/effects003/expected−43 test/effects003/expected.out+31 test/effects003/input−10 test/effects003/input.in+6 test/effects003/run → test/effects003/run.sh+1−1 test/effects004/expected → test/effects004/expected.out test/effects004/input → test/effects004/input.in test/effects004/run → test/effects004/run.sh+1−1 test/effects005/expected → test/effects005/expected.out test/effects005/run → test/effects005/run.sh test/error001/expected → test/error001/expected.out+6−1 test/error001/run → test/error001/run.sh test/error002/expected → test/error002/expected.out test/error002/run → test/error002/run.sh test/error003/expected−4 test/error003/expected.out+9 test/error003/run → test/error003/run.sh test/error004/expected → test/error004/expected.out+10−2 test/error004/run → test/error004/run.sh test/error005/expected → test/error005/expected.out+30−5 test/error005/run → test/error005/run.sh test/error006/WithPatsNoWith.idr+11 test/error006/expected−2 test/error006/expected.out+21 test/error006/run → test/error006/run.sh test/error007/expected → test/error007/expected.out+5−1 test/error007/run → test/error007/run.sh test/error008/expected−4 test/error008/expected.out+14 test/error008/run → test/error008/run.sh test/error009/expected → test/error009/expected.out test/error009/run → test/error009/run.sh test/ffi001/expected → test/ffi001/expected.out test/ffi001/run−3 test/ffi001/run.sh+3 test/ffi002/expected−1 test/ffi002/expected.out+6 test/ffi002/run−3 test/ffi002/run.sh+3 test/ffi003/expected → test/ffi003/expected.out test/ffi003/input → test/ffi003/input.in test/ffi003/run−3 test/ffi003/run.sh+3 test/ffi004/expected → test/ffi004/expected.out test/ffi004/run−3 test/ffi004/run.sh+3 test/ffi005/expected → test/ffi005/expected.out test/ffi005/run → test/ffi005/run.sh test/ffi006/expected → test/ffi006/expected.out test/ffi006/run → test/ffi006/run.sh test/ffi007/expected → test/ffi007/expected.out+1 test/ffi007/ffi007.h+2 test/ffi007/ffi007.idr+6−1 test/ffi007/run → test/ffi007/run.sh test/ffi008/expected → test/ffi008/expected.out test/ffi008/ffi008.c+12−1 test/ffi008/ffi008.h+2 test/ffi008/ffi008.idr+10 test/ffi008/run → test/ffi008/run.sh test/ffi009/Bad.idr+36 test/ffi009/Good.idr+37 test/ffi009/expected.out+1 test/ffi009/ffi009.c+44 test/ffi009/ffi009.h+20 test/ffi009/run.sh+5 test/ffi010/expected.out+3 test/ffi010/ffi010.idr+43 test/ffi010/run.sh+4 test/ffi011/expected.out+2 test/ffi011/ffi011.idr+27 test/ffi011/ffi011.js+7 test/ffi011/run.sh+4 test/ffi012/expected.out+1 test/ffi012/ffi012.idr+14 test/ffi012/ffi012.js+3 test/ffi012/run.sh+4 test/ffi013/expected.out+4 test/ffi013/ffi013.idr+5 test/ffi013/run.sh+17 test/folding001/expected → test/folding001/expected.out test/folding001/run → test/folding001/run.sh test/idrisdoc001/expected → test/idrisdoc001/expected.out test/idrisdoc001/run → test/idrisdoc001/run.sh test/idrisdoc002/expected → test/idrisdoc002/expected.out test/idrisdoc002/run → test/idrisdoc002/run.sh test/idrisdoc003/expected → test/idrisdoc003/expected.out test/idrisdoc003/run → test/idrisdoc003/run.sh test/idrisdoc004/expected → test/idrisdoc004/expected.out test/idrisdoc004/run → test/idrisdoc004/run.sh test/idrisdoc005/expected → test/idrisdoc005/expected.out test/idrisdoc005/run → test/idrisdoc005/run.sh test/idrisdoc006/expected → test/idrisdoc006/expected.out test/idrisdoc006/run → test/idrisdoc006/run.sh test/idrisdoc007/expected → test/idrisdoc007/expected.out test/idrisdoc007/run → test/idrisdoc007/run.sh test/idrisdoc008/expected → test/idrisdoc008/expected.out test/idrisdoc008/run → test/idrisdoc008/run.sh test/idrisdoc009/expected → test/idrisdoc009/expected.out+2 test/idrisdoc009/input → test/idrisdoc009/input.in test/idrisdoc009/run−3 test/idrisdoc009/run.sh+3 test/interactive001/expected → test/interactive001/expected.out+1−1 test/interactive001/input−8 test/interactive001/input.in+8 test/interactive001/test032.idr → test/interactive001/interactive001.idr test/interactive001/run−3 test/interactive001/run.sh+5 test/interactive002/expected → test/interactive002/expected.out test/interactive002/input → test/interactive002/input.in test/interactive002/run−3 test/interactive002/run.sh+3 test/interactive003/expected → test/interactive003/expected.out test/interactive003/input → test/interactive003/input.in test/interactive003/run−3 test/interactive003/run.sh+3 test/interactive004/expected → test/interactive004/expected.out test/interactive004/input → test/interactive004/input.in test/interactive004/run−3 test/interactive004/run.sh+3 test/interactive005/expected → test/interactive005/expected.out+3−3 test/interactive005/input → test/interactive005/input.in test/interactive005/run−6 test/interactive005/run.sh+6 test/interactive006/expected → test/interactive006/expected.out test/interactive006/input → test/interactive006/input.in test/interactive006/run−3 test/interactive006/run.sh+3 test/interactive007/expected → test/interactive007/expected.out test/interactive007/input → test/interactive007/input.in test/interactive007/run−2 test/interactive007/run.sh+2 test/interactive008/expected → test/interactive008/expected.out test/interactive008/input → test/interactive008/input.in test/interactive008/run−2 test/interactive008/run.sh+2 test/interactive009/expected → test/interactive009/expected.out test/interactive009/input → test/interactive009/input.in test/interactive009/run−3 test/interactive009/run.sh+3 test/interactive010/expected−20 test/interactive010/expected.out+24 test/interactive010/input → test/interactive010/input.in test/interactive010/run−2 test/interactive010/run.sh+2 test/interactive011/.gitignore+1 test/interactive011/expected → test/interactive011/expected.out test/interactive011/input−2 test/interactive011/input.in+2 test/interactive011/interactive011.ipkg+8 test/interactive011/run−3 test/interactive011/run.sh+6 test/interactive011/src/Foo.idr+5 test/interactive011/interactive011.idr → test/interactive011/src/Main.idr+5−2 test/interactive012/expected → test/interactive012/expected.out test/interactive012/input → test/interactive012/input.in test/interactive012/run−3 test/interactive012/run.sh+3 test/interactive013/expected → test/interactive013/expected.out test/interactive013/input → test/interactive013/input.in test/interactive013/run−3 test/interactive013/run.sh+3 test/interactive014/expected.out+7 test/interactive014/input.in+5 test/interactive014/interactive014.idr+10 test/interactive014/run.sh+3 test/interactive015/expected.out+6 test/interactive015/input.in+2 test/interactive015/run.sh+8 test/interactive015/src/interactive015.idr+4 test/interactive016/expected.out+7 test/interactive016/input.in+2 test/interactive016/run.sh+8 test/interactive016/src/interactive016.idr+7 test/interactive017/TestMod.idr+5 test/interactive017/expected.out+7 test/interactive017/run.sh+9 test/interactive017/shebang-args.idr+6 test/interactive017/shebang-import.idr+6 test/interactive017/shebang-node.idr+4 test/interactive017/shebang.idr+4 test/interactive018/Imported1.idr+10 test/interactive018/Imported2.idr+8 test/interactive018/Public1.idr+10 test/interactive018/Public2.idr+8 test/interactive018/Top.idr+11 test/interactive018/expected.out+20 test/interactive018/input.in+20 test/interactive018/run.sh+3 test/interfaces001/expected → test/interfaces001/expected.out+3−2 test/interfaces001/input → test/interfaces001/input.in test/interfaces001/run−3 test/interfaces001/run.sh+3 test/interfaces002/expected → test/interfaces002/expected.out test/interfaces002/interfaces002.idr+2−3 test/interfaces002/run → test/interfaces002/run.sh test/interfaces003/expected → test/interfaces003/expected.out test/interfaces003/run → test/interfaces003/run.sh test/interfaces004/expected → test/interfaces004/expected.out test/interfaces004/run → test/interfaces004/run.sh test/interfaces005/expected → test/interfaces005/expected.out test/interfaces005/interfaces005.idr+8−8 test/interfaces005/run → test/interfaces005/run.sh test/interfaces006/expected → test/interfaces006/expected.out test/interfaces006/run → test/interfaces006/run.sh test/interfaces007/expected.out+1 test/interfaces007/interfaces007.idr+52 test/interfaces007/run.sh+4 test/interfaces008/expected.out+6 test/interfaces008/interfaces008.idr+20 test/interfaces008/run.sh+3 test/meta001/expected → test/interfaces009/expected.out test/interfaces009/interfaces009.idr+24 test/interfaces009/run.sh+3 test/pkg002/expected → test/interfaces010/expected.out test/interfaces010/interfaces010.idr+12 test/interfaces010/run.sh+3 test/interpret001/double-echo.idr+6 test/interpret001/expected.out+2 test/interpret001/input.in+2 test/interpret001/run.sh+3 test/interpret002/expected.out+4 test/interpret002/file-error.idr+6 test/interpret002/input.in+2 test/interpret002/readable.txt+1 test/interpret002/run.sh+3 test/interpret003/expected.out+1 test/interpret003/input.in+1 test/interpret003/interpret003.idr+4 test/interpret003/run.sh+3 test/interpret003/test test/io001/expected → test/io001/expected.out test/io001/run → test/io001/run.sh test/io002/expected → test/io002/expected.out test/io002/run → test/io002/run.sh test/io003/expected → test/io003/expected.out test/io003/run → test/io003/run.sh test/layout001/expected−76 test/layout001/expected.out+82 test/layout001/run → test/layout001/run.sh+1−1 test/literate001/expected−7 test/literate001/expected.out+12 test/literate001/run → test/literate001/run.sh test/meta001/Finite.idr+2 test/pkg003/expected → test/meta001/expected.out test/meta001/run → test/meta001/run.sh test/meta002/AgdaStyleReflection.idr+1−1 test/meta002/DataDef.idr+2 test/meta002/Deriving.idr+2 test/meta002/Tacs.idr+1 test/meta002/expected → test/meta002/expected.out+15−3 test/meta002/run → test/meta002/run.sh test/meta003/BadDef.idr+2 test/meta003/Catch.idr+17 test/meta003/expected → test/meta003/expected.out+7−1 test/meta003/run−3 test/meta003/run.sh+5 test/meta004/expected → test/meta004/expected.out+5−1 test/meta004/meta004.idr+2 test/meta004/run → test/meta004/run.sh test/pkg001/expected−19 test/pkg001/expected.out+23 test/pkg001/run → test/pkg001/run.sh+3 test/pkg001/test-pkg.ipkg+4−4 test/proof004/expected → test/pkg002/expected.out test/pkg002/run → test/pkg002/run.sh test/proof005/expected → test/pkg003/expected.out test/pkg003/run → test/pkg003/run.sh test/pkg004/expected−5 test/pkg004/expected.out+6 test/pkg004/run → test/pkg004/run.sh test/pkg004/test.ipkg+1−1 test/pkg005/expected → test/pkg005/expected.out test/pkg005/run → test/pkg005/run.sh test/pkg006/expected → test/pkg006/expected.out test/pkg006/run → test/pkg006/run.sh test/pkg007/expected → test/pkg007/expected.out test/pkg007/input → test/pkg007/input.in test/pkg007/run → test/pkg007/run.sh+1−1 test/pkg008/expected.out+13 test/pkg008/maths.ipkg+10 test/pkg008/run.sh+11 test/pkg008/src/NumOps.idr+9 test/pkg008/src/Test.idr+21 test/pkg009/datatype.ipkg+6 test/pkg009/expected.out+9 test/pkg009/run.sh+7 test/pkg009/src/Data/Type.idr+3 test/pkg010/expected.out+29 test/pkg010/run.sh+2 test/pkg010/wrongopts.ipkg+3 test/prelude001/expected.out+10 test/prelude001/run → test/prelude001/run.sh test/primitives001/expected → test/primitives001/expected.out test/primitives001/input → test/primitives001/input.in test/primitives001/run → test/primitives001/run.sh+1−1 test/primitives002/expected → test/primitives002/expected.out test/primitives002/run → test/primitives002/run.sh+1−1 test/primitives003/expected → test/primitives003/expected.out+4 test/primitives003/run → test/primitives003/run.sh test/primitives003/test038.idr+14−10 test/primitives004-disabled/expected → test/primitives004-disabled/expected.out test/primitives004-disabled/run → test/primitives004-disabled/run.sh test/primitives005/expected → test/primitives005/expected.out test/primitives005/run → test/primitives005/run.sh test/primitives006/expected → test/primitives006/expected.out test/primitives006/run → test/primitives006/run.sh test/proof001/expected−4 test/proof001/expected.out+12 test/proof001/run → test/proof001/run.sh test/proof001/test029.idr+4−5 test/proof002/Reflect.idr+47−46 test/proof002/expected → test/proof002/expected.out+20−4 test/proof002/run → test/proof002/run.sh test/proof003/expected−15 test/proof003/expected.out+39 test/proof003/run → test/proof003/run.sh test/proof006/expected → test/proof004/expected.out test/proof004/run → test/proof004/run.sh test/proofsearch001/expected → test/proof005/expected.out test/proof005/run → test/proof005/run.sh test/proofsearch002/expected → test/proof006/expected.out test/proof006/run → test/proof006/run.sh test/proof007/expected → test/proof007/expected.out+5−1 test/proof007/run → test/proof007/run.sh test/proof008/expected−2 test/proof008/expected.out+6 test/proof008/run → test/proof008/run.sh test/proof009/expected → test/proof009/expected.out+5−5 test/proof009/input → test/proof009/input.in test/proof009/run−3 test/proof009/run.sh+3 test/proof010/expected → test/proof010/expected.out test/proof010/run → test/proof010/run.sh test/proof011/expected → test/proof011/expected.out+12−2 test/proof011/run → test/proof011/run.sh test/proofsearch003/expected → test/proofsearch001/expected.out test/proofsearch001/run → test/proofsearch001/run.sh test/pruviloj001/expected → test/proofsearch002/expected.out test/proofsearch002/run → test/proofsearch002/run.sh test/quasiquote005/expected → test/proofsearch003/expected.out test/proofsearch003/run → test/proofsearch003/run.sh test/reg048/expected → test/pruviloj001/expected.out test/pruviloj001/pruviloj001.idr+14 test/pruviloj001/run → test/pruviloj001/run.sh test/quasiquote001/expected → test/quasiquote001/expected.out+2−2 test/quasiquote001/run → test/quasiquote001/run.sh test/quasiquote002/expected → test/quasiquote002/expected.out test/quasiquote002/run → test/quasiquote002/run.sh test/quasiquote003/expected−4 test/quasiquote003/expected.out+9 test/quasiquote003/run → test/quasiquote003/run.sh test/quasiquote004/expected−11 test/quasiquote004/expected.out+27 test/quasiquote004/run → test/quasiquote004/run.sh test/reg051-disabled/expected → test/quasiquote005/expected.out test/quasiquote005/run → test/quasiquote005/run.sh test/quasiquote006/expected → test/quasiquote006/expected.out+16−4 test/quasiquote006/run−3 test/quasiquote006/run.sh+3 test/records001/expected → test/records001/expected.out test/records001/run → test/records001/run.sh test/records002/expected → test/records002/expected.out test/records002/run → test/records002/run.sh test/records003/expected → test/records003/expected.out test/records003/run → test/records003/run.sh test/records004/expected → test/records004/expected.out test/records004/run → test/records004/run.sh test/records005/expected → test/records005/expected.out test/records005/run → test/records005/run.sh test/reg001/Area.idr+12 test/reg001/TestEx.idr+31 test/reg001/expected.out+3 test/reg001/run.sh+4 test/reg002/expected → test/reg002/expected.out test/reg002/run → test/reg002/run.sh test/reg004/expected → test/reg004/expected.out test/reg004/run → test/reg004/run.sh test/reg005/expected → test/reg005/expected.out test/reg005/run → test/reg005/run.sh test/reg007/expected → test/reg007/expected.out test/reg007/run → test/reg007/run.sh test/reg013/expected → test/reg013/expected.out test/reg013/run → test/reg013/run.sh test/reg016/expected → test/reg016/expected.out test/reg016/run → test/reg016/run.sh test/reg017/expected−5 test/reg017/expected.out+13 test/reg017/run → test/reg017/run.sh test/reg020/expected → test/reg020/expected.out test/reg020/run → test/reg020/run.sh test/reg024/expected → test/reg024/expected.out test/reg024/run → test/reg024/run.sh test/reg025/expected → test/reg025/expected.out test/reg025/run → test/reg025/run.sh test/reg027/expected−3 test/reg027/expected.out+7 test/reg027/reg027.idr+1−16 test/reg027/run → test/reg027/run.sh test/reg029/expected → test/reg029/expected.out test/reg029/run → test/reg029/run.sh test/reg031/expected → test/reg031/expected.out test/reg031/run → test/reg031/run.sh test/reg032/expected → test/reg032/expected.out test/reg032/run → test/reg032/run.sh test/reg039/expected → test/reg039/expected.out test/reg039/run → test/reg039/run.sh test/reg040/expected → test/reg040/expected.out test/reg040/run → test/reg040/run.sh test/reg041/expected → test/reg041/expected.out test/reg041/run → test/reg041/run.sh+1−1 test/reg042/expected → test/reg042/expected.out test/reg042/run → test/reg042/run.sh test/reg045/expected → test/reg045/expected.out test/reg045/run → test/reg045/run.sh test/regression001/expected → test/reg048/expected.out test/reg048/run → test/reg048/run.sh test/tactics001/expected → test/reg051-disabled/expected.out test/reg051-disabled/run → test/reg051-disabled/run.sh test/reg052/expected → test/reg052/expected.out test/reg052/run → test/reg052/run.sh test/reg067/expected → test/reg067/expected.out test/reg067/run → test/reg067/run.sh test/reg075/expected → test/reg075/expected.out test/reg075/input → test/reg075/input.in test/reg075/run−3 test/reg075/run.sh+3 test/reg076/expected.out+1 test/tutorial001/expected → test/reg076/input.in test/reg076/reg076.idr+11 test/reg076/run.sh+4 test/tutorial003/expected → test/reg077/expected.out test/reg077/reg077.idr+17 test/reg077/run.sh+3 test/regression001/coverage001.idr+79 test/regression001/eff001.idr+39 test/tutorial005/expected → test/regression001/expected.out test/regression001/reg001.idr+1−1 test/regression001/reg002.idr+8 test/regression001/reg003.idr+11 test/regression001/reg004.lidr+43 test/regression001/reg005.idr+8 test/regression001/reg006.idr+14 test/regression001/reg007.idr+69 test/regression001/reg036.idr+2−2 test/regression001/reg046.idr+4−4 test/regression001/reg047.idr+2−2 test/regression001/reg047a.idr+1−1 test/regression001/reg062.lidr−41 test/regression001/reg064.idr+1−1 test/regression001/run−13 test/regression001/run.sh+18 test/regression002/Canonicity.idr+13 test/regression002/Negation.idr+2 test/regression002/expected−147 test/regression002/expected.out+368 test/regression002/reg001.idr+2 test/regression002/reg002.idr+3 test/regression002/run → test/regression002/run.sh+5−1 test/regression003/expected.out+1 test/regression003/regression003.idr+56 test/regression003/run.sh+4 test/sourceLocation001/SourceLoc.idr+1 test/sourceLocation001/expected−19 test/sourceLocation001/expected.out+35 test/sourceLocation001/run → test/sourceLocation001/run.sh test/st001/expected.out+8 test/st001/run.sh+6 test/st001/test001.idr+66 test/st001/testFile.in+2 test/st002/expected.out+8 test/st002/run.sh+6 test/st002/test002.idr+66 test/st002/testFile.in+2 test/st003/expected.out+8 test/st003/run.sh+6 test/st003/test003.idr+25 test/st003/testFile.in+2 test/st004/expected.out+6 test/st004/run.sh+6 test/st004/test004.idr+24 test/st005/expected.out+6 test/st005/run.sh+7 test/st005/test005.idr+33 test/st006/expected.out+5 test/st006/run.sh+6 test/st006/test006.idr+37 test/st007/expected.out+6 test/st007/run.sh+6 test/st007/test007.idr+24 test/sugar001/expected → test/sugar001/expected.out test/sugar001/run → test/sugar001/run.sh test/sugar002/expected → test/sugar002/expected.out test/sugar002/run → test/sugar002/run.sh test/sugar003/expected → test/sugar003/expected.out test/sugar003/run → test/sugar003/run.sh test/sugar004/expected → test/sugar004/expected.out+1 test/sugar004/run → test/sugar004/run.sh+1 test/sugar004/sugar004.idr+12−1 test/sugar005/As.idr+1−1 test/sugar005/expected → test/sugar005/expected.out test/sugar005/run → test/sugar005/run.sh test/syntax001/expected → test/syntax001/expected.out+12−2 test/syntax001/run → test/syntax001/run.sh test/syntax002/expected → test/syntax002/expected.out test/syntax002/run → test/syntax002/run.sh test/tactics001/Tactics.idr+5−3 test/tactics001/expected.out test/tactics001/run → test/tactics001/run.sh test/totality001/expected−3 test/totality001/expected.out+18 test/totality001/run → test/totality001/run.sh test/totality002/expected−5 test/totality002/expected.out+18 test/totality002/run → test/totality002/run.sh test/totality003/expected → test/totality003/expected.out+5−1 test/totality003/run → test/totality003/run.sh test/totality004/expected−4 test/totality004/expected.out+13 test/totality004/run → test/totality004/run.sh test/totality005/expected → test/totality005/expected.out test/totality005/run → test/totality005/run.sh test/totality006/expected−4 test/totality006/expected.out+18 test/totality006/run → test/totality006/run.sh test/totality007/expected−5 test/totality007/expected.out+9 test/totality007/run → test/totality007/run.sh test/totality008/expected−1 test/totality008/expected.out+6 test/totality008/run → test/totality008/run.sh test/totality009/expected−10 test/totality009/expected.out+60 test/totality009/run → test/totality009/run.sh test/totality010/expected−2 test/totality010/expected.out+12 test/totality010/run → test/totality010/run.sh test/totality011/expected−2 test/totality011/expected.out+6 test/totality011/run → test/totality011/run.sh test/totality011/totality011.lidr+2−2 test/totality012/expected−4 test/totality012/expected.out+12 test/totality012/run → test/totality012/run.sh test/totality013/expected−4 test/totality013/expected.out+12 test/totality013/run → test/totality013/run.sh test/totality014/expected → test/totality014/expected.out+9−4 test/totality014/run → test/totality014/run.sh test/totality015/expected−4 test/totality015/expected.out+18 test/totality015/run → test/totality015/run.sh test/totality015/totality015.idr+1−1 test/totality016/expected−9 test/totality016/expected.out+54 test/totality016/run → test/totality016/run.sh test/totality017/expected−6 test/totality017/expected.out+36 test/totality017/run → test/totality017/run.sh test/totality018/expected.out+6 test/totality018/run.sh+3 test/totality018/totality018.idr+15 test/totality019/expected.out+12 test/totality019/run.sh+4 test/totality019/totality019.idr+14 test/totality019/totality019a.idr+81 test/totality020/expected.out+12 test/totality020/run.sh+3 test/totality020/totality020.idr+11 test/totality021/expected.out+30 test/totality021/run.sh+4 test/totality021/totality021.idr+18 test/totality021/totality021a.idr+12 test/totality022/expected.out+6 test/totality022/run.sh+3 test/totality022/totality022.idr+11 test/totality023/expected.out+6 test/totality023/run.sh+3 test/totality023/totality023.idr+11 test/totality024/expected.out+1 test/totality024/run.sh+3 test/totality024/totality023.idr+7 test/totality025/expected.out+18 test/totality025/run.sh+3 test/totality025/totality025.idr+17 test/totality026/expected.out+6 test/totality026/run.sh+3 test/totality026/totality026.idr+7 test/tutorial001/expected.out test/tutorial001/run → test/tutorial001/run.sh test/tutorial002/expected−6 test/tutorial002/expected.out+18 test/tutorial002/run → test/tutorial002/run.sh test/tutorial003/expected.out test/tutorial003/run → test/tutorial003/run.sh test/tutorial004/expected−4 test/tutorial004/expected.out+12 test/tutorial004/run → test/tutorial004/run.sh test/tutorial005/expected.out test/tutorial005/run → test/tutorial005/run.sh test/tutorial006/expected → test/tutorial006/expected.out+15−7 test/tutorial006/run → test/tutorial006/run.sh test/tutorial007/expected → test/tutorial007/expected.out test/tutorial007/run → test/tutorial007/run.sh test/unique001/expected → test/unique001/expected.out test/unique001/run → test/unique001/run.sh test/unique001/unique001.idr+2 test/unique004/expected−26 test/unique004/expected.out+75 test/unique004/run → test/unique004/run.sh+1−1 test/unique004/unique001a.idr+2 test/unique004/unique001b.idr+2 test/unique004/unique001c.idr+1 test/unique004/unique001d.idr+1 test/unique004/unique001e.idr+1 test/unique004/unique002.idr+2 test/unique004/unique002a.idr+2 test/unique004/unique003.idr+2 test/universes001/expected → test/universes001/expected.out+10−5 test/universes001/run → test/universes001/run.sh test/universes002/expected−9 test/universes002/expected.out+14 test/universes002/run → test/universes002/run.sh test/views001/expected → test/views001/expected.out test/views001/run → test/views001/run.sh test/views001/views001.idr+1−1 test/views001/views001a.idr+1−1 test/views002/expected → test/views002/expected.out test/views002/run → test/views002/run.sh test/views002/views002.idr+1−1 test/views003/expected → test/views003/expected.out test/views003/run → test/views003/run.sh
.github/ISSUE_TEMPLATE.mdnew file+9
@@ -0,0 +1,9 @@
1+Please attach complete source files that exhibit the issue in addition
2+to quoting from them here.
3+
4+# Steps to Reproduce
5+
6+# Expected Behavior
7+
8+# Observed Behavior
9+
.gitignore+1
@@ -1,5 +1,6 @@
11# Build artefacts
22dist
3+dist-newstyle
34*.ibc
45*.o
56*.a
.hlint.yamlnew file+61
@@ -0,0 +1,61 @@
1+# HLint configuration file
2+# https://github.com/ndmitchell/hlint
3+##########################
4+
5+# This file contains a template configuration file, which is typically
6+# placed as .hlint.yaml in the root of your project
7+
8+
9+# Specify additional command line arguments
10+#
11+# - arguments: [--color, --cpp-simple, -XQuasiQuotes]
12+
13+
14+# Control which extensions/flags/modules/functions can be used
15+#
16+# - extensions:
17+# - default: false # all extension are banned by default
18+# - name: [PatternGuards, ViewPatterns] # only these listed extensions can be used
19+# - {name: CPP, within: CrossPlatform} # CPP can only be used in a given module
20+#
21+# - flags:
22+# - {name: -w, within: []} # -w is allowed nowhere
23+#
24+# - modules:
25+# - {name: [Data.Set, Data.HashSet], as: Set} # if you import Data.Set qualified, it must be as 'Set'
26+# - {name: Control.Arrow, within: []} # Certain modules are banned entirely
27+#
28+# - functions:
29+# - {name: unsafePerformIO, within: []} # unsafePerformIO can only appear in no modules
30+
31+
32+# Add custom hints for this project
33+#
34+# Will suggest replacing "wibbleMany [myvar]" with "wibbleOne myvar"
35+# - error: {lhs: "wibbleMany [x]", rhs: wibbleOne x}
36+
37+
38+# Turn on hints that are off by default
39+#
40+# Ban "module X(module X) where", to require a real export list
41+# - warn: {name: Use explicit module export list}
42+#
43+# Replace a $ b $ c with a . b $ c
44+# - group: {name: dollar, enabled: true}
45+#
46+# Generalise map to fmap, ++ to <>
47+# - group: {name: generalise, enabled: true}
48+
49+
50+# Ignore some builtin hints
51+# - ignore: {name: Use let}
52+# - ignore: {name: Use const, within: SpecialModule} # Only within certain modules
53+- ignore: {name: Use camelCase}
54+- ignore: {name: Reduce duplication}
55+
56+# Define some custom infix operators
57+# - fixity: infixr 3 ~^#^~
58+
59+
60+# To generate a suitable file for HLint do:
61+# $ hlint --default > .hlint.yaml
.stylish-haskell.yamlnew file+154
@@ -0,0 +1,154 @@
1+# stylish-haskell configuration file
2+# ==================================
3+
4+# The stylish-haskell tool is mainly configured by specifying steps. These steps
5+# are a list, so they have an order, and one specific step may appear more than
6+# once (if needed). Each file is processed by these steps in the given order.
7+steps:
8+ # Convert some ASCII sequences to their Unicode equivalents. This is disabled
9+ # by default.
10+ # - unicode_syntax:
11+ # # In order to make this work, we also need to insert the UnicodeSyntax
12+ # # language pragma. If this flag is set to true, we insert it when it's
13+ # # not already present. You may want to disable it if you configure
14+ # # language extensions using some other method than pragmas. Default:
15+ # # true.
16+ # add_language_pragma: true
17+
18+ # Import cleanup
19+ - imports:
20+ # There are different ways we can align names and lists.
21+ #
22+ # - global: Align the import names and import list throughout the entire
23+ # file.
24+ #
25+ # - file: Like global, but don't add padding when there are no qualified
26+ # imports in the file.
27+ #
28+ # - group: Only align the imports per group (a group is formed by adjacent
29+ # import lines).
30+ #
31+ # - none: Do not perform any alignment.
32+ #
33+ # Default: global.
34+ align: none
35+
36+ # Folowing options affect only import list alignment.
37+ #
38+ # List align has following options:
39+ #
40+ # - after_alias: Import list is aligned with end of import including
41+ # 'as' and 'hiding' keywords.
42+ #
43+ # > import qualified Data.List as List (concat, foldl, foldr, head,
44+ # > init, last, length)
45+ #
46+ # - with_alias: Import list is aligned with start of alias or hiding.
47+ #
48+ # > import qualified Data.List as List (concat, foldl, foldr, head,
49+ # > init, last, length)
50+ #
51+ # - new_line: Import list starts always on new line.
52+ #
53+ # > import qualified Data.List as List
54+ # > (concat, foldl, foldr, head, init, last, length)
55+ #
56+ # Default: after_alias
57+ list_align: after_alias
58+
59+ # Long list align style takes effect when import is too long. This is
60+ # determined by 'columns' setting.
61+ #
62+ # - inline: This option will put as much specs on same line as possible.
63+ #
64+ # - new_line: Import list will start on new line.
65+ #
66+ # - new_line_multiline: Import list will start on new line when it's
67+ # short enough to fit to single line. Otherwise it'll be multiline.
68+ #
69+ # - multiline: One line per import list entry.
70+ # Type with contructor list acts like single import.
71+ #
72+ # > import qualified Data.Map as M
73+ # > ( empty
74+ # > , singleton
75+ # > , ...
76+ # > , delete
77+ # > )
78+ #
79+ # Default: inline
80+ long_list_align: inline
81+
82+ # List padding determines indentation of import list on lines after import.
83+ # This option affects 'list_align' and 'long_list_align'.
84+ list_padding: 4
85+
86+ # Separate lists option affects formating of import list for type
87+ # or class. The only difference is single space between type and list
88+ # of constructors, selectors and class functions.
89+ #
90+ # - true: There is single space between Foldable type and list of it's
91+ # functions.
92+ #
93+ # > import Data.Foldable (Foldable (fold, foldl, foldMap))
94+ #
95+ # - false: There is no space between Foldable type and list of it's
96+ # functions.
97+ #
98+ # > import Data.Foldable (Foldable(fold, foldl, foldMap))
99+ #
100+ # Default: true
101+ separate_lists: false
102+
103+ # Language pragmas
104+ - language_pragmas:
105+ # We can generate different styles of language pragma lists.
106+ #
107+ # - vertical: Vertical-spaced language pragmas, one per line.
108+ #
109+ # - compact: A more compact style.
110+ #
111+ # - compact_line: Similar to compact, but wrap each line with
112+ # `{-#LANGUAGE #-}'.
113+ #
114+ # Default: vertical.
115+ style: compact
116+
117+ # Align affects alignment of closing pragma brackets.
118+ #
119+ # - true: Brackets are aligned in same collumn.
120+ #
121+ # - false: Brackets are not aligned together. There is only one space
122+ # between actual import and closing bracket.
123+ #
124+ # Default: true
125+ align: true
126+
127+ # stylish-haskell can detect redundancy of some language pragmas. If this
128+ # is set to true, it will remove those redundant pragmas. Default: true.
129+ remove_redundant: true
130+
131+ # Align the types in record declarations
132+ # - records: {}
133+
134+ # Replace tabs by spaces. This is disabled by default.
135+ - tabs:
136+ # # Number of spaces to use for each tab. Default: 8, as specified by the
137+ # # Haskell report.
138+ spaces: 8
139+
140+ # Remove trailing whitespace
141+ - trailing_whitespace: {}
142+
143+# A common setting is the number of columns (parts of) code will be wrapped
144+# to. Different steps take this into account. Default: 80.
145+columns: 80
146+
147+# Sometimes, language extensions are specified in a cabal file or from the
148+# command line instead of using language pragmas in the file. stylish-haskell
149+# needs to be aware of these, so it can parse the file correctly.
150+#
151+# No language extensions are enabled by default.
152+# language_extensions:
153+ # - TemplateHaskell
154+ # - QuasiQuotes
.travis.yml+69−42
@@ -1,4 +1,4 @@
1−sudo: false
1+dist: xenial
22
33language: c
44
@@ -8,66 +8,89 @@ env:
88
99matrix:
1010 include:
11− - os: osx
12− env: CABALVER="1.24" GHCVER="8.0.1" TESTS="test_c"
13− compiler: ": #GHC 8.0.1"
14− - env: CABALVER="1.20" GHCVER="7.6.3" TESTS="test_c"
15− # separate caches for different compiler versions
16− # until https://github.com/travis-ci/travis-ci/issues/4393 is resolved
17− compiler: ": #GHC 7.6.3"
18− addons: {apt: {packages: [cabal-install-1.20,ghc-7.6.3,cppcheck,hscolour], sources: [hvr-ghc]}}
19− - env: CABALVER="1.20" GHCVER="7.8.4" TESTS="test_c"
20− compiler: ": #GHC 7.8.4"
21− addons: {apt: {packages: [cabal-install-1.20,ghc-7.8.4,cppcheck,hscolour], sources: [hvr-ghc]}}
22− - env: CABALVER="1.22" GHCVER="7.10.3" TESTS="lib_doc doc"
23− compiler: ": #GHC 7.10.3"
24− addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,cppcheck,hscolour], sources: [hvr-ghc]}}
25− - env: CABALVER="1.22" GHCVER="7.10.3" TESTS="test_js"
26− compiler: ": #GHC 7.10.3"
27− addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,cppcheck,hscolour], sources: [hvr-ghc]}}
28− - env: CABALVER="1.22" GHCVER="7.10.3" TESTS="test_c"
29− compiler: ": #GHC 7.10.3"
30− addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,cppcheck,hscolour], sources: [hvr-ghc]}}
31− - env: CABALVER="1.24" GHCVER="8.0.1" TESTS="lib_doc doc"
32− compiler: ": #GHC 8.0.1"
33− addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1,cppcheck,hscolour], sources: [hvr-ghc]}}
34− - env: CABALVER="1.24" GHCVER="8.0.1" TESTS="test_js"
35− compiler: ": #GHC 8.0.1"
36− addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1,cppcheck,hscolour], sources: [hvr-ghc]}}
37− - env: CABALVER="1.24" GHCVER="8.0.1" TESTS="test_c"
38− compiler: ": #GHC 8.0.1"
39− addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1,cppcheck,hscolour], sources: [hvr-ghc]}}
11+ - env: CABALVER="2.4" GHCVER="8.6.5" STACKVER="15.4" STYLISH=YES
12+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.6.5,hscolour], sources: [hvr-ghc]}}
13+ - env: CABALVER="2.4" GHCVER="8.2.2" TESTS="lib_doc doc"
14+ compiler: ": #GHC 8.2.2"
15+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.2.2,cppcheck,hscolour], sources: [hvr-ghc]}}
16+ - env: CABALVER="2.4" GHCVER="8.2.2" TESTS="test_js"
17+ compiler: ": #GHC 8.2.2"
18+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.2.2,cppcheck,hscolour], sources: [hvr-ghc]}}
19+ - env: CABALVER="2.4" GHCVER="8.2.2" TESTS="test_c"
20+ compiler: ": #GHC 8.2.2"
21+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.2.2,cppcheck,hscolour], sources: [hvr-ghc]}}
22+ - env: CABALVER="2.4" GHCVER="8.4.4" TESTS="lib_doc doc"
23+ compiler: ": #GHC 8.4.4"
24+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.4.4,cppcheck,hscolour], sources: [hvr-ghc]}}
25+ - env: CABALVER="2.4" GHCVER="8.4.4" TESTS="test_js"
26+ compiler: ": #GHC 8.4.4"
27+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.4.4,cppcheck,hscolour], sources: [hvr-ghc]}}
28+ - env: CABALVER="2.4" GHCVER="8.4.4" TESTS="test_c"
29+ compiler: ": #GHC 8.4.4"
30+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.4.4,cppcheck,hscolour], sources: [hvr-ghc]}}
31+ - env: CABALVER="3.0" GHCVER="8.8.3" TESTS="lib_doc doc"
32+ compiler: ": #GHC 8.8.3"
33+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3,cppcheck,hscolour], sources: [hvr-ghc]}}
34+ - env: CABALVER="3.0" GHCVER="8.8.3" TESTS="test_js"
35+ compiler: ": #GHC 8.8.3"
36+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3,cppcheck,hscolour], sources: [hvr-ghc]}}
37+ - env: CABALVER="3.0" GHCVER="8.8.3" TESTS="test_c"
38+ compiler: ": #GHC 8.8.3"
39+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3,cppcheck,hscolour], sources: [hvr-ghc]}}
40+ - env: CABALVER="3.0" GHCVER="8.8.3" IDRIS2=YES
41+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3], sources: [hvr-ghc]}}
42+ fast-finish: true
4043
4144cache:
4245 directories:
4346 - $HOME/.cabsnap
4447 - $HOME/.cabal/packages
48+ - $HOME/.stack
4549
4650before_cache:
4751 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
4852 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.tar
4953
5054before_install:
55+ - nvm install 6
56+ - nvm use 6
5157 - unset CC
5258 - if [[ $TRAVIS_OS_NAME == 'linux' ]];
5359 then
54− export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$HOME/.cabal/bin:$PATH;
60+ export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$HOME/.cabal/bin:$HOME/opt/scheme/bin/:$PATH;
5561 export SED=sed;
5662 export ZCAT=zcat;
5763 fi
5864 - env
5965 - if [[ $TRAVIS_OS_NAME == 'osx' ]];
6066 then
61− brew update; brew install ghc; brew install cabal-install;
62− brew install libffi; brew install pkg-config; brew install cppcheck;
63− brew install gnu-sed;
67+ brew outdated pkgconfig || brew install pkgconfig;
68+ brew install ghc cabal-install libffi cppcheck gnu-sed;
6469 export PATH=$HOME/.cabal/bin:$PATH;
6570 export SED=gsed;
6671 export ZCAT=gzcat;
6772 export PKG_CONFIG_PATH=/usr/local/opt/libffi/lib/pkgconfig:$PKG_CONFIG_PATH;
6873 fi
74+ - if [ -n "$STYLISH" ]; then ./stylize.sh; exit $?; fi
75+ - if [ -n "$IDRIS2" ];
76+ then
77+ git clone https://github.com/edwinb/Idris2 &&
78+ wget https://github.com/cisco/ChezScheme/archive/v9.5.2.tar.gz &&
79+ tar xvzf v9.5.2.tar.gz &&
80+ cd ChezScheme-9.5.2 &&
81+ ./configure --threads --installprefix=$HOME/opt/scheme &&
82+ make -j install &&
83+ cd .. &&
84+ cabal v1-update &&
85+ travis_wait cabal v1-install &&
86+ cd Idris2 &&
87+ make idris2 && make base && make contrib;
88+ exit $?;
89+ fi
6990
7091install:
92+ - which cabal
93+ - which ghc
7194 - cabal --version
7295 - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
7396 - if [ -f $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz ];
@@ -81,7 +104,7 @@ install:
81104 # causing cabal's default configuration (jobs: $ncpus)
82105 # to run into the GHC #9221 bug which can result in longer build-times.
83106 - $SED -i -r 's/(^jobs:).*/\1 2/' $HOME/.cabal/config
84− - cabal install -f FFI --only-dependencies --enable-tests --dry -v > installplan.txt
107+ - cabal v1-install -f FFI --only-dependencies --enable-tests --dry -v > installplan.txt
85108 - $SED -i -e '1,/^Resolving /d' installplan.txt; cat installplan.txt
86109 # check whether current requested install-plan matches cached package-db snapshot
87110 - if diff -u installplan.txt $HOME/.cabsnap/installplan.txt;
@@ -94,7 +117,7 @@ install:
94117 echo "cabal build-cache MISS";
95118 rm -rf $HOME/.cabsnap;
96119 mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin;
97− cabal install -f FFI --only-dependencies --enable-tests;
120+ cabal v1-install -f FFI --only-dependencies --enable-tests;
98121 fi
99122 # snapshot package-db on cache miss
100123 - if [ ! -d $HOME/.cabsnap ];
@@ -105,28 +128,30 @@ install:
105128 cp -a $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin installplan.txt $HOME/.cabsnap/;
106129 fi
107130
131+
108132before_script:
109133 - ORIGINAL_DIR=$(pwd)
110− - cabal sdist
134+ - cabal v1-sdist
111135 - cd ..
112136 - tar -xf ${ORIGINAL_DIR}/dist/${PKGNAME}*.tar.gz
113137 - cd ${PKGNAME}*
114138script:
139+ - export LD_PRELOAD=/opt/ghc/${GHCVER}/lib/ghc-${GHCVER}/rts/libffi.so.7
115140###
116141 - echo 'Configure...' && echo -en 'travis_fold:start:script.configure\\r'
117− - cabal configure -f FFI -f CI --enable-tests
142+ - cabal v1-configure -f FFI -f CI --enable-tests
118143 - echo -en 'travis_fold:end:script.configure\\r'
119144###
120145 - echo 'Build...' && echo -en 'travis_fold:start:script.build\\r'
121− - cabal build
146+ - cabal v1-build
122147 - echo -en 'travis_fold:end:script.build\\r'
123148###
124149 - echo 'Copy...' && echo -en 'travis_fold:start:script.copy\\r'
125− - cabal copy
150+ - cabal v1-copy
126151 - echo -en 'travis_fold:end:script.copy\\r'
127152###
128153 - echo 'Register...' && echo -en 'travis_fold:start:script.register\\r'
129− - cabal register
154+ - cabal v1-register
130155 - echo -en 'travis_fold:end:script.register\\r'
131156###
132157 - echo 'Cppcheck...' && echo -en 'travis_fold:start:script.cppcheck\\r'
@@ -143,7 +168,9 @@ script:
143168 - echo -en 'travis_fold:end:script.tests\\r'
144169###
145170 - echo 'Benchmarks...' && echo -en 'travis_fold:start:script.benchmarks\\r'
146− - cd benchmarks && ./build.pl && ./run.pl && cd ..
171+ - if [[ "$TESTS" == "test_c" ]]; then
172+ cd benchmarks && ./build.pl && ./run.pl && cd ..;
173+ fi
147174 - echo -en 'travis_fold:end:script.benchmarks\\r'
148175###
149176# EOF
CHANGELOG.md+324−5
@@ -1,11 +1,313 @@
1−# New in 0.13:
1+# New since last release
2++ Updated to work with GHC 8.8 and cabal 3.0
3+
4+# New in 1.3.2
5++ Documentation added to proof section
6+
7+## Library updates
8++ `openFile` opens the file in binary mode on Windows.
9++ Added library functions `clockTime` and `fRemove`
10+
11+## Tool updates
12++ Modules no longer require building if imports have changed but all
13+ interfaces (i.e. types for names declared `export` and definitions of names
14+ declared `public export`) are unchanged.
15++ The result of calling `:doc` now details the accessbility of items as well as their totality.
16+
17+## Miscellaneous updates
18++ Compiler flag `--optimise-nat-like-types` enables compilation
19+ of `Nat`-like type families to big integers. A type family
20+ is `Nat`-like if, after erasure, it has two constructors,
21+ one nullary, the other one with exactly one recursive field.
22+
23+# New in 1.3.1
24+
25+## Tool updates
26++ Fixes for building with GHC 8.6
27++ Fix for megaparsec update
28++ Some fixes for memory allocation issues in the C back end
29+
30+# New in 1.3.0
31+
32+## Language updates
33++ Old 'induction' tactics and eliminator generation functionality ('%elim', '%case', 'elim_for') is no longer supported.
34+ Please, rely on the ones provided by Pruviloj and elaborator reflection instead.
35+
36+## Library updates
37+
38++ Changed rndInt in Effect.Random so that it does not alternate between odd
39+ and even.
40++ Additions to `contrib`:
41+ * `Data.SortedBag`: Bag (or Multiset) implemention based on `Data.SortedMap`.
42+ * `Data.PosNat`: A `Nat` paired with a proof that it is positive.
43+ * `Data.Chain`: A function with an arbitrary number of arguments, plus
44+ combinators for working with them.
45+
46+## Tool updates
47++ Added a switch `--allow-capitalized-pattern-variables` to optionally allow capitalized pattern variables after they were prohibited in 1.2.0.
48++ REPL now prints an error message if program compiled by `:exec` terminates
49+ abnormally.
50++ Idris now builds with GHC 8.4.
51++ In the C backend, the representation of Idris values at runtime has been reworked.
52+
53+# New in 1.2.0
54+
55+## Language updates
56+
57++ In `@`-patterns such as `x@p`, `x` is now in scope on the right-hand side
58+ of any definitions in `where` clauses, provided the left-hand side of the
59+ definition does not shadow it.
60++ The `LinearTypes` language extension has been revised. It implements the
61+ rules from Bob Atkey's draft "The Syntax and Semantics of Quantitative
62+ Type Theory" and now works with holes and case expressions.
63++ Backticked operators can appear in sections, e.g. ``(`LTE` 42)`` or
64+ ``(1 `plus`)``.
65++ Backticked operators can have their precendence and associativity set like
66+ other operators, e.g. ``infixr 8 `cons` ``. Backticked operators with
67+ undeclared fixity are treated as non-associative with precedence lower
68+ than all declared operators.
69++ Allow non-injective implementations if explicitly named, e.g.,
70+ ```idris
71+ LTB : Nat -> Type
72+ LTB b = DPair Nat (\ n => LT n b)
73+
74+ implementation [uninhabltb] Uninhabited (LTB Z) where
75+ uninhabited (MkDPair n prf) = absurd prf
76+ ```
77+ It is possible to use `using implementation uninhabltb` to add the
78+ implementation to the automated resolution, but if it fails to find the
79+ instance due to non-injectivity, one must pass it explicitly to target
80+ function, i.e. `absurd @{uninhabltb}`.
81++ Verbatim strings now support trailing quote characters. All quote characters
82+ until the final three are considered part of the string. Now a string such as
83+ `""""hello""""` will parse, and is equivalent to `"\"hello\""`.
84++ C FFI now supports pasting in any expression by prefixing it with '#', e.g.
85+ ```idris
86+ intMax : IO Int
87+ intMax = foreign FFI_C "#INT_MAX" (IO Int)
88+ ```
89++ The deprecated keywords `%assert_total`, `abstract`, and `[static]` have
90+ been removed as well as the use of "public" instead of "public export" to
91+ expose a symbol.
92++ The syntax for pattern-match alternatives now works for `let` statements in
93+ `do` blocks in addition to `let` expressions and `<-` statements, e.g.
94+ ```idris
95+ do …
96+ let Just x = expr | Nothing => empty
97+ …
98+ ```
99+ This means that a `with`-application (using `|`) cannot be used in that
100+ position anymore.
101+
102+## Library Updates
103+
104++ Removed `oldeffects` library from `libs` folder, use `effects` or `Control.ST` instead.
105++ Added `Text.Literate`, a module for working with literate source files.
106++ Added `Data.IORef`, for working with mutable references in `IO` and `JS_IO`.
107++ Added `discriminate` and `construct` tactics to Pruviloj.
108++ Added `IsSucc` type to `Prelude`, which proves that a `Nat` is a successor.
109++ Added `Data.IOArray`, containing primitives for mutable arrays.
110++ Added `Language.JSON`, for total serialization/deserialization of JSON data.
111++ Reworked operator fixity for many operators.
112+ * Changed `&&` and `||` to be right-associative. Increased precedence of `&&`
113+ to be higher than that of `||`.
114+ * Removed associativity from Boolean comparison operators `==`, `/=`, `<`, `<=`,
115+ `>`, and `>=`. Increased precedence of `/=` and `==` to match the others.
116+ * Made `<|>`, `<$>`, and `.` right-associative.
117+ * Swapped precedence of `<|>` and `<*>` (and its related operators, `<*` and
118+ `*>`). Now `<|>` has a lower precedence.
119+ * Lowered the precedence of `>>=` to be below that of `<|>`.
120++ Added some useful string manipulation functions to `Data.String.Extra`.
121++ Added `Control.Delayed`, a module for conditionally making a type `Inf` or `Lazy`.
122++ Added `Data.Fuel`, which implements the `Fuel` data type and the partial `forever` function.
123++ Added `Data.Bool.Extra`, a module with properties of boolean operations.
124++ Moved core of `Text.Lexer` to `Text.Lexer.Core`. Added several new combinators
125+ and lexers to `Text.Lexer`.
126++ Moved core of `Text.Parser` to `Text.Parser.Core`. Added several new combinators
127+ to `Text.Parser`. Made the following changes.
128+ * Flipped argument order of `parse`.
129+ * Renamed `optional` to `option` and flip argument order.
130+ * Renamed `maybe` to `optional`.
131+ * Generalised many combinators to use an unknown `commit` flag where possible.
132++ `Prelude.Doubles.atan2` is now implemented as a primitive instead of
133+ being coded in Idris.
134++ Added `Test.Unit` to `contrib` for simple unit testing.
135++ Removed several deprecated items from the libraries shipped with Idris.
136++ Moved `abs` from the `Neg` interface into its own `Abs` interface. `Nat`
137+ implements `Abs` with `abs = id`.
138++ Added `Control.ST.File`, an ST based implementation of the same behaviour
139+ implemented by `Effect.File` in the effects package.
140+
141+## Tool Updates
142+
143++ Private functions are no longer visible in the REPL except for modules
144+ that are explicitly loaded.
145++ The --interface option now creates CommonJS modules on the node backend.
146++ The C backend now pass arguments to the C compiler in the same order
147+ as they were given in the source files.
148++ Backslash, braces and percent symbols are now correctly pretty printed
149+ in LaTeX.
150++ Errors and warnings now consistently have the following format:
151+ ```idris
152+ reg068.idr:1:6-8:
153+ |
154+ 1 | data nat : Type where --error
155+ | ~~~
156+ Main.nat has a name which may be implicitly bound.
157+ This is likely to lead to problems!
158+ ```
159+ The code is highlighted when highlighting information is available. How
160+ much highlighting information is available depends on where the error
161+ occurred.
162++ The parser provider has been switched from Trifecta to Megaparsec. This
163+ could possibly cause some subtle deviations in parsing from previous
164+ versions of Idris.
165++ Many more errors now report beginning *and* ending position (which may be
166+ on different lines), instead of just a single point. The format is
167+ `Foo.idr:9:7-15:` if ending column is on the same line or
168+ `Foo.idr:9:7-10:15:` if the ending column is on a different line.
169++ Error messages were changed so that the last column is inclusive, e.g.
170+ `Foo.idr:9:7-15:` includes column 15. Previously the error would have read
171+ `Foo.idr:9:7-16:`.
172+
173+## Packaging Updates
174+
175++ Package names now only accept a restrictive charset of letters, numbers and the `-_` characters.
176+ Package names are also case insensitive.
177++ When building makefiles for the FFI, the environment variables
178+ `IDRIS_INCLUDES` and `IDRIS_LDFLAGS` are now set with the correct C
179+ flags.
180+
181+# New in 1.1.1
182+
183++ Erasure analysis is now faster thanks to a bit smarter constraint solving.
184++ Fixed installation issue
185++ Fixed a potential segfault when concatenating strings
186+
187+# New in 1.1.0
188+
189+## Library Updates
190+
191++ Added `Text.PrettyPrint.WL` an implementation of the Wadler-Leijen
192+ Pretty-Print algorithm. Useful for those wishing to pretty print
193+ things.
194++ Added `Text.Lexer` and `Text.Parser` to `contrib`. These are small libraries
195+ for implementing total lexical analysers and parsers.
196++ New instances:
197+ + Added `Catchable` for `ReaderT`, `WriterT`, and `RWST`.
198+ + Added `MonadTrans` for `RWST`.
199++ Added utility functions to `Data.SortedMap` and `Data.SortedSet` (`contrib`),
200+ most notably `merge`, merging two maps by their `Semigroup` op (`<+>`)
201++ `Prelude.WellFounded` now contains an interface `Sized a` that defines a size
202+ mapping from `a` to `Nat`. For example, there is an implementation for lists,
203+ where `size = length`.
204+
205+ The function `sizeAccessible` then proves well-foundedness of the relation
206+ `Smaller x y = LT (size x) (size y)`, which allows us to use strong
207+ induction conveniently with any type that implements `Sized`.
208+
209+ In practice, this allows us to write functions that recurse not only on
210+ direct subterms of their arguments but on any value
211+ with a (strictly) smaller `size`.
212+
213+ A good example of this idiom at work is `Data.List.Views.splitRec` from `base`.
214++ Added utility lemma `decEqSelfIsYes : decEq x x = Yes Refl` to
215+ `Decidable.Equality`. This is primarily useful for proving properties of
216+ functions defined with the help of `decEq`.
217+
218+## Tool Updates
219+
220++ New JavaScript code generator that uses an higher level intermediate
221+ representation.
222+
223++ Various optimizations of the new JavaScript code generator.
224+
225++ Names are now annotated with their representations over the IDE
226+ protocol, which allows IDEs to provide commands that work on special
227+ names that don't have syntax, such as case block names.
228+
229+
230+# New in 1.0
231+
232++ It's about time
233+
234+# New in 0.99.2
235+
236+## Library Updates
237+
238++ Added `Data.Buffer` to `base`. This allows basic manipulation of mutable
239+ buffers of `Bits8`, including reading from and writing to files.
240+
241+## Tool Updates
242+
243++ Idris now checks the list of packages specified at the command line
244+ against those installed. If there is a mismatch Idris will complain.
245+
246+## Miscellaneous Updates
247+
248++ Documentation updates for the new `Control.ST` library
249++ Various stability/efficiency fixes
250+
251+# New in 0.99.1:
252+
253+## Language updates
254+
255+* Language pragmas now required for the less stable existing features, in
256+ addition to the existing `TypeProviders` and `ErrorReflection`:
257+ + `ElabReflection`, which must be enabled to use `%runElab`
258+ + `UniquenessTypes`, which must be enabled to use `UniqueType`
259+ + `DSLNotation`, which must be enabled to define a `dsl` block
260+ + `FirstClassReflection`, which must be enabled to define a `%reflection`
261+ function
262+
263+* New language extension `LinearTypes`:
264+ + This allows adding a /multiplicity/ to a binder which says how often it
265+ is allowed to be used; either 0 or 1 (if unstated, multiplicity is "many")
266+ + The typing rules follow Conor McBride's paper "I Got Plenty o' Nuttin'"
267+ + This is highly experimental, unfinished, not at all polished. and there
268+ are still lots of details to sort out. Some features don't quite work
269+ properly yet. But it is there to play with for the brave!
270+
271+## Tool Updates
272+
273++ Idris' output has been updated to more accurately reflect its
274+ progress through the compiler i.e. Type Checking; Totality Checking;
275+ IBC Generation; Compiling; and Code Generation. To control the
276+ loudness of the reporting three verbosity levels are introduced:
277+ `--V0`, `--V1`, and `--V2`. The old aliases of `-V` and `--verbose`
278+ persist.
279+
280++ New REPL command `:!` that runs an external shell command.
281+
282++ The REPL now colourises output on MinTTY consoles (e.g., Cygwin and MSYS)
283+ on Windows, which previously did not occur due to a bug.
284+
285++ Idris now runs in a UTF-8-compatible codepage on Windows. This fixes many
286+ Unicode-rendering issues on Windows (e.g., error messages stating
287+ `commitBuffer: invalid argument (invalid character)`).
288+
289++ Idris now has a `--warnipkg` flag to enable auditing of Idris
290+ packages during build time. Currently auditing check's the list of
291+ modules specified in the `iPKG` file with those presented in the
292+ package directory.
293+
294+## Library Updates
295+
296++ Terminating programs has been improved with more appropriate
297+ functions (`exitWith`, `exitFailure`, and `exitSuccess`) and a data
298+ structure (`ExitCode`) to capture a program's return code.
299++ Casting a `String` to an `Int`, `Integer` or a `Double` now ignores leading
300+ and trailing whitespace. Previously only leading whitespace was ignored.
301++ RTS functions `openFile`, `do_popen`, and `ARGV` are now properly encoded using UTF-8 on Windows.
302+
303+# New in 0.99:
2304
3305## Language updates
4306
5307* `record` syntax now allows updating fields, including nested fields,
6308 by applying a function using the `$=` operator. For example:
7309
8− ```
310+ ```idris
9311 record Score where
10312 constructor MkScore
11313 correct : Nat
@@ -21,6 +323,16 @@
21323 score->attempted $= (+1) } st
22324 ```
23325
326+* Implicit parameter to interfaces are now allowed. For example:
327+
328+ ```idris
329+ interface Shows (ts : Vect k Type) where
330+ shows : HVect ts -> Vect k String
331+ ```
332+ In this interface, `k` is an implicit parameter, but previously needed to
333+ be explicit
334+
335+
24336## Library updates
25337
26338* The File Effect has been updated to take into account changes in
@@ -40,18 +352,25 @@
40352
41353* Idris' documentation system now displays the documentation for auto
42354 implicits in the output of `:doc`. This is tested for in `docs005`.
43−
44355* New command line flag `--info` that displays information about the installation.
45−
46356* New command line flag `--sourcepath <dir>` that allows adding directories to the source search path.
357+* Allow 'installation' of a package's IdrisDoc documentation into a central location. The default location is the subdirectory `docs` of Idris' data directory.
358+ * New flag `--installdoc <ipkg>` provided to install documentation
359+ * New flag `--docdir` provided to show default documentation installation location.
360+ * New environment variable `IDRIS_DOC_PATH` to allow specification of an alternative installation path for documentation.
361+* Semantic meaning behind several environment variables has been clarified in documentation and code. See compilation section of the reference manual for more details.
362+* Interface parameter constraints are now printed in the output of `:doc`. This
363+ is tested for in `docs006`.
364+
47365## Miscellaneous updates
48366
367+* New, faster, better, implementation of the coverage checker
49368* The test suite now uses [tasty-golden](https://hackage.haskell.org/package/tasty-golden). New tests must be registered in `test/TestData.hs`, as explained in the relevant `README.md`.
50369* Added OSX and Windows continous integration with Travis and Appveyor.
51370
52371## UI Changes
53372
54−* The :e command can now handle an $EDITOR with arguments in it, like "emacs -nw"
373+* The :e command can now handle an $EDITOR with arguments in it, like "emacs -nw"
55374
56375
57376# New in 0.12:
CITATION.md+1−1
@@ -17,7 +17,7 @@ If you use `Idris` in your work we would prefer it if you would use the followin
1717 pages = {552--593},
1818 numpages = {42},
1919 doi = {10.1017/S095679681300018X},
20− URL = {http://journals.cambridge.org/article_S095679681300018X},
20+ URL = {https://journals.cambridge.org/article_S095679681300018X},
2121}
2222```
2323
CONTRIBUTING.md+21−6
@@ -6,9 +6,9 @@ Here are a few guidelines that we would like contributors to follow so that we c
66
77## Getting Started
88
9−1. Make sure you are familiar with [Git](http://git-scm.com/book).
9+1. Make sure you are familiar with [Git](https://git-scm.com/book).
10101. Make sure you have a [GitHub account](https://github.com/signup/free).
11−1. Make sure you are familiar with: [Idris](http://eb.host.cs.st-andrews.ac.uk/writings/idris-tutorial.pdf).
11+1. Make sure you are familiar with: [Idris](https://eb.host.cs.st-andrews.ac.uk/writings/idris-tutorial.pdf).
12121. Make sure you can install Idris:
1313 * [Mac OS X](https://github.com/idris-lang/Idris-dev/wiki/Idris-on-OS-X-using-Homebrew)
1414 * [Ubuntu](https://github.com/idris-lang/Idris-dev/wiki/Idris-on-Ubuntu)
@@ -20,6 +20,21 @@ Here are a few guidelines that we would like contributors to follow so that we c
2020Before you report an issue, or wish to add cool functionality please try and check to see if there are existing [issues](https://github.com/idris-lang/Idris-dev/issues) and [pull requests](https://github.com/idris-lang/Idris-dev/pulls).
2121We do not want you wasting your time, duplicating somebody's work!
2222
23+### Template
24+Try as closely as possible to describe the issue, ensuring that it has sections that match the following headings:
25+> \# Steps to Reproduce
26+>
27+> \# Expected Behavior
28+>
29+> \# Observed Behavior
30+>
31+>
32+
33+In addition, please attach complete source files that exhibit the issue to quoting from them in the issue.
34+
35+### Feature Requests
36+We would be delighted to receive feature requests only if they are feasible to implement and the author is willing to implement the suggested features themself. The current Idris developer team consists mostly of volunteers, and so it is unfortunately hard to accommodate implementing nice-to-have ideas that are not essential for core language development.
37+
2338## The Campsite Rule
2439
2540We try to follow the **campsite rule**: leave the code base in better condition than you found it.
@@ -57,7 +72,7 @@ We do not want you wasting your time nor duplicating somebody's work!
5772
5873## Making Changes
5974
60−Idris developers and hackers try to adhere to something similar to the [successful git branching model](http://nvie.com/posts/a-successful-git-branching-model/).
75+Idris developers and hackers try to adhere to something similar to the [successful git branching model](https://nvie.com/posts/a-successful-git-branching-model/).
6176The steps are described below.
6277
6378### New contributors
@@ -68,7 +83,7 @@ For those new to the project:
68832. Clone your fork to your local machine:
6984
7085```
71−$ git clone git@github.com/<your github user name>/Idris-dev.git
86+$ git clone git@github.com:<your github user name>/Idris-dev.git
7287```
7388
74893. Add `idris-lang/Idris-dev` as a remote upstream
@@ -160,8 +175,8 @@ To help increase the chance of your pull request being accepted:
160175* Idris FAQs: [Official](https://idris.readthedocs.io/en/latest/faq/faq.html); [Unofficial](https://github.com/idris-lang/Idris-dev/wiki/Unofficial-FAQ);
161176* [Idris Manual](https://github.com/idris-lang/Idris-dev/wiki/Manual);
162177* [Idris Tutorial](https://idris.readthedocs.io/en/latest/tutorial/index.html);
163−* [Idris News](http://www.idris-lang.org/news/);
164−* [other Idris docs](http://www.idris-lang.org/documentation/).
178+* [Idris News](https://www.idris-lang.org/news/);
179+* [other Idris docs](https://www.idris-lang.org/documentation/).
165180* [Using Pull Requests](https://help.github.com/articles/using-pull-requests)
166181* [General GitHub Documentation](https://help.github.com/).
167182
CONTRIBUTORS+214−41
@@ -1,56 +1,229 @@
11Thanks to the following for their help and contributions:
22
3−Ozgur Akgun
3+a3gis
4+Aaron Craelius
5+Adam Sandberg Eriksson
6+Adam Schønemann
7+Adolfo Ochagavía
48Ahmad Salim Al-Sibahi
5−Edward Chadwick Amsden
6−Michael R. Bernstein
7−Jan Bessai
8−Nicola Botta
9−Edwin Brady
10−Vitaly Bragilevsky
11−Jakob Brünker
9+Aistis Raulinaitis
10+Alex Feldman-Crough
11+Alex S. Queiroz e Silva
12+Alexander Berntsen
13+Alexander Shabalin
1214Alyssa Carter
15+Andreas Bogk
16+Andreas Reuleaux
17+Andrei Dziahel
18+Andrew Cann
19+Andrew Stewart Gibson
20+Andy Morris
21+Anthony Cantor
22+Anthony---faineance
23+Apostolis Xekoukoulotakis
24+Athan Clark
25+Bartosz Przygoda
26+Ben Gamari
27+Ben Sherman
28+ben-schulz
29+Benjamin Hodgson
30+Benjamin Saunders
31+Björn Aili
32+bmastenbrook
33+Brent Yorgey
34+Brian Koropoff
35+Brian McKenna
36+Bryn Keller
37+Caleb Case
38+Calvin Beck
39+Carsten König
1340Carter Charbonneau
41+Casper M. H. Holmgreen
42+cchantep
43+Cezar Ionescu
44+Chao-Hong Chen
45+Chetan Taralekar
46+Chris Allen
47+Chris Gibbs
48+Christopher Schwaab
49+Cliff Harvey
50+Cliff L. Biffle
51+Colin Adams
52+comco
53+Craig McLaughlin
54+cswords
55+Daniel Waterworth
56+Daniël Heres
57+Darin Morrison
58+David Feuer
59+David Kraeutmann
1460David Raymond Christiansen
15−Aaron Craelius
16−Jason Dagit
17−Adam Sandberg Eriksson
18−Guglielmo Fachini
19−Simon Fowler
61+defanor
62+Dennis Griffith
63+Dirk Ullrich
64+Dmitry Bushev
65+Dmitry Tsygankov
66+Dominic Mulligan
67+Dominik Peteler
68+Echo Nolan
69+Eduard Nicodei
70+Edward Amsden
71+Edward O'Callaghan
72+Edwin Brady
73+Eric Casteleijn
74+Eric Mertens
75+Eric Walkingshaw
76+Eric Weinstein
77+Erkin Batu Altunbaş
78+Ertugrul Söylemez
79+EvanR
80+Fabian Thorand
81+fiendfan1
82+Franklin Chen
83+Frederic Koehler
84+Friedrich von Never
85+Gabe McArthur
86+Gabor Greif
87+Gabriel Garcia
88+George Leontiev
89+Gleb Alexeyev
2090Google
21−Zack Grannan
22−Sean Hunt
23−Cezar Ionescu
91+Greg Anderson
92+Greg Pfeil
93+Guglielmo Fachini
94+Hannes Mehnert
2495Heath Johns
96+Heather
97+Hector A. Escobedo IV
98+identical snowflake
99+Ignas Vyšniauskas
100+Ilan Godik
101+Imuli
25102Irene Knapp
26−Paul Koerbitz
27−Niklas Larsson
28−Shea Levy
103+Jack Henahan
104+Jacob Mitchell
105+Jakob Brünker
106+Jan Bessai
107+Jan de Muijnck-Hughes
108+Jan Doms
109+Jan Stolarek
110+Jason Dagit
111+Jason Felice
112+Jason Gross
113+Jean-Remi Desjardins
114+Jeff Hemphill
115+Jefferson Carpenter
116+Jens Petersen
117+Jeremy W. Sherman
118+jhegedus42
119+joe9
120+Johannes Griebler
121+John Connor
122+John Dobronszki
123+John Wiegley
124+Jon Atack
125+Jonas De Vuyst
126+Jonas Westerlund
127+Jonathan Sterling
128+Joomy Korkut
129+Jorge Acereda
130+Joseph Huang
131+Josh Vera
132+JP Smith
133+Juliusz Chroboczek
134+Jurriën Stutterheim
135+Jürgen Peters
136+Karlos Kaeeikaas
137+Kester Tong
138+lambdadomain
139+Langston Barrett
140+Leif Warner
141+Leon Schoorl
142+Luke Palmer
143+Mark Farrell
144+Markus Klink
145+Markus Pfeiffer
146+Martin Baker
29147Mathnerd314
30−Hannes Mehnert
148+Mattias Lundell
149+Matvey B. Aksenov
150+Matúš Tejiščák
151+Maxim Ivanov
31152Mekeor Melire
32153Melissa Mozifian
33−Jan de Muijnck-Hughes
34−Dominic Mulligan
35−Echo Nolan
36−Tom Prince
37−raichoo
154+Melvar Chen
155+Michael A. Smith
156+Michael Bernstein
157+Michael Gilliland
158+Michael Hensler
159+Michael Maloney
160+Michael McGirr
161+Michael Morgan
162+Michael Thompson
163+Michael Weiss
164+Miikka Koskinen
165+Mitchell Rosen
166+Miëtek Bak
167+Mort Yao
168+Nathan Dinsmore
169+Nicola Botta
170+Niklas Larsson
171+Norbert Melzer
172+Oskar Wickström
173+Ozgur Akgun
174+Patrick Hilhorst
175+Patrik Jansson
176+Paul Koerbitz
177+Per Fredelius
178+Peter Minten
38179Philip Rasmussen
39−Aistis Raulinaitis
40−Reynir Reynisson
180+PoroCYon
181+raichoo
182+Reynir Björnsson
183+Ricky Elrod
184+Robert Clipsham
185+Robert Edström
186+Ross Meikleham
187+Rui Barreiro
188+Ryan Scott
189+Sam Elliott
190+Sam T
191+Saurabh Rawat
192+Sean Hunt
193+Sebastian de Bellefon
194+Sebastian Dröge
41195Seo Sanghyeon
42−Benjamin Saunders
43−Alexander Shabalin
44−Jeremy W. Sherman
45−Timo Petteri Sinnemäki
46−JP Smith
196+Sergei Trofimovich
197+Shane Pearman
198+Shea Levy
199+Simon Fowler
47200startling
48−Chetan T
49−Matúš Tejiščák
50−Dirk Ullrich
51−Leif Warner
52−Daniel Waterworth
53−Eric Weinstein
54−Jonas Westerlund
55−Björn Aili
56−Zheng Jihui
201+Stefan Bleibinhaus
202+stepcut
203+Stephen Drodge
204+Steven Shaw
205+Stuart Gale
206+suhorng
207+Sune Alkærsig
208+Sven Koschnicke
209+Taran Lynn
210+tdidriksen
211+Tenor Biel
212+Thomas Cooper
213+Thomas Scholtes
214+Tim Dysinger
215+Tim McGilchrist
216+Timo Petteri Sinnemäki
217+Tom Prince
218+TorosFanny
219+Trevor Elliott
220+uwap
221+Vitaly Bragilevsky
222+Vyacheslav Shebanov
223+xged
224+XIE Yuheng
225+Yacine Hmito
226+Zack Grannan
227+Zheng Jihui
228+zjhmale
229+Сухарик
HLint.hsdeleted−33
@@ -1,33 +0,0 @@
1−-- --------------------------------------------------------------- [ HLint.hs ]
2−-- HLint suggestions we like.
3−--
4−-- This is a work in progress and the list of
5−-- suggestions/warnings/errors will vary.
6−--
7−-- -------------------------------------------------------------------- [ EOH ]
8−
9−-- import "hint" HLint.HLint -- In case we want to use all of them.
10−
11−-- ------------------------------------------------------------ [ Suggestions ]
12−-- Styling that are good Suggestions but are okay if found.
13−
14−suggest "Use exitSuccess"
15−suggest "Use concatMap"
16−suggest "Use unwords"
17−suggest "Use null"
18−suggest "Redundant $"
19−suggest "Use list literal pattern"
20−suggest "Use list literal"
21−
22−-- ------------------------------------------------------------------- [ Warn ]
23−-- Styling that we think a programmer should be warned about using.
24−
25−
26−-- ------------------------------------------------------------------ [ Error ]
27−-- Styling that we think a programmer should not use at all.
28−
29−
30−-- ----------------------------------------------------------------- [ Ignore ]
31−-- Suggestions we want to ignore.
32−
33−-- -------------------------------------------------------------------- [ EOF ]
INSTALL.md+55−6
@@ -64,24 +64,48 @@ contribute.
6464cross-platform program for developing Haskell projects, that enhances
6565the functionality provided by Cabal. There is experimental support for
6666building Idris from source with stack.
67+
6768This installation has been tested on Ubuntu 16.04.1 LTS, and the current
6869NixOS unstable.
6970
70−To build Idris with stack the following commands are recommended:
71+*Important* Stack will not install any external dependencies required
72+to build Idris. Before you try stack please ensure you have the
73+correct dependencies.
74+
75+To build Idris with stack use the following command:
7176
7277* `stack build`
7378
74−This will install Idris (and related executables) into `./local/bin/`
75−on Unix based systems and an appropriate place on Windows. If you
76−haven't used stack before this will also setup the related
77−infrastructure. For more information about Stack please visit the
78−[Stack website](https://github.com/commercialhaskell/stack).
79+To install Idris:
80+
81+* `stack install`
82+
83+Stack will install Idris (and related executables) into `$HOME/.local/bin/`
84+on Unix based systems and an appropriate place on Windows. The libraries that
85+are included with Idris (e.g. Builtins, Prelude) will 'install' into `<source
86+dir>/.stack_work/install/...` so you'll need to keep your source directory
87+around after you've installed Idris using Stack.
88+
89+Of note: If you haven't used stack before commands will also setup the
90+related infrastructure. For more information about Stack please visit
91+the [Stack website](https://github.com/commercialhaskell/stack).
7992
8093On NixOS, please use the following command instead, to make sure
8194the required libraries and header files are available:
8295
8396* `stack build --nix`
8497
98+### before rebuilding new pulls
99+the default build will currently just reuse `.ibc` files which can result
100+in build-failures in the `Building libraries...` phase.
101+
102+A safer way to do this is therefore to recursively delete all the `*.ibc`
103+files from the `libs/` folder.
104+
105+On Linux(or similar) you can do this with
106+
107+ find . -name "*.ibc" -exec rm -rf {} \;
108+
85109### System GHC
86110
87111The flag `--system-ghc` can be added to enforce use of your system's
@@ -102,3 +126,28 @@ encounter this then the fix is to augment the `PKG_CONFIG_PATH` for
102126```
103127PKG_CONFIG_PATH=/usr/local/opt/libffi/lib/pkgconfig stack build
104128```
129+
130+## Issue with GHC on Ubuntu/Fedora
131+
132+There is an upstream issue with GHC on some Ubuntu and Fedora machines.
133+The issue is that for GHC versions greater than 8.4.X linking to libFFI uses the version of libFFI shipped with GHC, instead of the system version.
134+
135+See the following GHC issue page for more information:
136+
137+ <https://gitlab.haskell.org/ghc/ghc/issues/15397>
138+
139+This means that an Idris built with `libFFI` support will fail at runtime as the executable would not be able to find the correct `libffi` shared object.
140+This will cause the build to fail.
141+Specifically, one will see an error message along the lines of:
142+
143+> error while loading shared libraries: libffi.so.7: cannot open shared object file: No such file or directory
144+
145+A workround for this bug is to override the used libffi version (this is what we use on CI):
146+
147+```bash
148+export LD_PRELOAD=/opt/ghc/${GHCVER}/lib/ghc-${GHCVER}/rts/libffi.so.7
149+```
150+
151+## GHC 8.6
152+
153+For reasons that haven't been investigated building the Idris compiler with GHC 8.6 leads to a compiler which doesn't pass test.
Makefile+15−12
@@ -1,4 +1,4 @@
1−.PHONY: build configure doc install linecount nodefault pinstall lib_clean relib fast test_js test_c test test_clean lib_doc lib_doc_clean user_doc_html user_doc_pdf user_docs
1+.PHONY: build configure doc install linecount nodefault pinstall lib_clean relib fast test_js test_c stylize test test_clean lib_doc lib_doc_clean user_doc_html user_doc_pdf user_docs
22
33ARGS=
44TEST-JOBS=
@@ -15,27 +15,30 @@ endif
1515endif
1616
1717install:
18− $(CABAL) install $(CABALFLAGS)
18+ $(CABAL) v1-install $(CABALFLAGS)
1919
2020pinstall: CABALFLAGS += --enable-executable-profiling
2121pinstall: dist/setup-config
22− $(CABAL) install $(CABALFLAGS)
22+ $(CABAL) v1-install $(CABALFLAGS)
2323
2424build: dist/setup-config
25− $(CABAL) build $(CABALFLAGS)
25+ $(CABAL) v1-build $(CABALFLAGS)
2626
27−test: doc test_c
27+test: doc test_c stylize
28+
29+stylize:
30+ ./stylize.sh
2831
2932test_c:
30− $(CABAL) test $(ARGS) --test-options \
33+ $(CABAL) v1-test $(ARGS) --test-options \
3134 "$(TEST-ARGS) --rerun-update +RTS -N$(TEST-JOBS) -RTS"
3235
3336test_js:
34− $(CABAL) test $(ARGS) --test-options \
37+ $(CABAL) v1-test $(ARGS) --test-options \
3538 "$(TEST-ARGS) --node --rerun-update +RTS -N$(TEST-JOBS) -RTS"
3639
3740test_update:
38− $(CABAL) test $(ARGS) --test-options \
41+ $(CABAL) v1-test $(ARGS) --test-options \
3942 "$(TEST-ARGS) --accept +RTS -N$(TEST-JOBS) -RTS"
4043
4144test_clean:
@@ -46,14 +49,14 @@ lib_clean:
4649 $(MAKE) -C libs IDRIS=../../dist/build/idris/idris RTS=../../dist/build/rts/libidris_rts clean
4750
4851relib: lib_clean
49− $(CABAL) install $(CABALFLAGS)
52+ $(CABAL) v1-install $(CABALFLAGS)
5053
5154linecount:
5255 wc -l src/Idris/*.hs src/Idris/Elab/*.hs src/Idris/Core/*.hs src/IRTS/*.hs src/Pkg/*.hs src/Util/*.hs
5356
5457#Note: this doesn't yet link to Hackage properly
5558doc: dist/setup-config
56− $(CABAL) haddock --hyperlink-source --html --hoogle --html-location="http://hackage.haskell.org/packages/archive/\$$pkg/latest/doc/html" --haddock-options="--title Idris"
59+ $(CABAL) v1-haddock --hyperlink-source --html --hoogle --html-location="https://hackage.haskell.org/packages/archive/\$$pkg/latest/doc/html" --haddock-options="--title Idris"
5760
5861lib_doc:
5962 $(MAKE) -C libs IDRIS=../../dist/build/idris/idris doc
@@ -73,7 +76,7 @@ user_doc_pdf:
7376 $(MAKE) -C docs latexpdf
7477
7578fast:
76− $(CABAL) install $(CABALFLAGS) --ghc-option=-O0
79+ $(CABAL) v1-install $(CABALFLAGS) --ghc-option=-O0
7780
7881dist/setup-config:
79− $(CABAL) configure $(CABALFLAGS)
82+ $(CABAL) v1-configure $(CABALFLAGS)
README.md+9−7
@@ -3,11 +3,12 @@
33[![Build Status](https://travis-ci.org/idris-lang/Idris-dev.svg?branch=master)](https://travis-ci.org/idris-lang/Idris-dev)
44[![Appveyor build](https://ci.appveyor.com/api/projects/status/xi8yu81oy1134g7o/branch/master?svg=true)](https://ci.appveyor.com/project/idrislang/idris-dev)
55[![Documentation Status](https://readthedocs.org/projects/idris/badge/?version=latest)](https://readthedocs.org/projects/idris/?badge=latest)
6−[![Hackage](https://budueba.com/hackage/idris)](https://hackage.haskell.org/package/idris)
7−[![Stackage LTS](http://stackage.org/package/idris/badge/lts)](http://stackage.org/lts/package/idris)
8−[![Stackage Nightly](http://stackage.org/package/idris/badge/nightly)](http://stackage.org/nightly/package/idris)
6+[![Hackage](https://img.shields.io/hackage/v/idris.svg)](https://hackage.haskell.org/package/idris)
7+[![Stackage LTS](https://stackage.org/package/idris/badge/lts)](https://stackage.org/lts/package/idris)
8+[![Stackage Nightly](https://stackage.org/package/idris/badge/nightly)](https://stackage.org/nightly/package/idris)
9+[![IRC](https://img.shields.io/badge/IRC-%23idris-1e72ff.svg?style=flat)](https://www.irccloud.com/invite?channel=%23idris&hostname=irc.freenode.net&port=6697&ssl=1)
910
10−Idris (http://idris-lang.org/) is a general-purpose functional programming
11+Idris (https://idris-lang.org/) is a general-purpose functional programming
1112language with dependent types.
1213
1314## Installation Guides.
@@ -27,9 +28,7 @@ Idris has support for external code generators. Supplied with the distribution
2728is a C code generator to compile executables, and a JavaScript code generator
2829with support for node.js and browser JavaScript.
2930
30−At this moment in time there are two external repositories with a
31−[Java code generator](https://github.com/idris-hackers/idris-java) and an
32−[LLVM-based code generator](https://github.com/idris-hackers/idris-llvm).
31+More information about [code generators can be found on the wiki](https://idris.readthedocs.io/en/latest/reference/codegen.html).
3332
3433## More Information
3534
@@ -45,3 +44,6 @@ where some interesting projects are being hosted.
4544
4645For those interested in contributing to Idris directly we kindly ask that
4746prospective developers please consult the [Contributing Guide](CONTRIBUTING.md) first.
47+
48+[Idris 2](https://github.com/edwinb/Idris2) is an early preview of the next generation
49+of Idris, implemented in Idris.
RELEASE-CHECKS.md+2
@@ -26,6 +26,7 @@ Things to be checked, or done before a release is made.
2626
2727+ [ ] Push to GITHUB.
2828+ [ ] Upload to Hackage.
29++ [ ] Upload package documentation to web site
2930
3031## Binaries
3132
@@ -37,6 +38,7 @@ Things to be checked, or done before a release is made.
3738## Announcements
3839
3940+ [ ] Update website.
41+ + [ ] Update web site with SHA256 hash of binary
4042+ [ ] Email Mailing list.
4143+ [ ] Make REDDIT post.
4244+ [ ] Tweet
Setup.hs+83−79
@@ -1,19 +1,24 @@
11{-# LANGUAGE CPP #-}
22
3+#if !defined(MIN_VERSION_Cabal)
4+# define MIN_VERSION_Cabal(x,y,z) 0
5+#endif
6+
37import Control.Monad
48import Data.IORef
59import Control.Exception (SomeException, catch)
610
711import Distribution.Simple
8−import Distribution.Simple.BuildPaths (autogenModulesDir)
12+import Distribution.Simple.BuildPaths
913import Distribution.Simple.InstallDirs as I
1014import Distribution.Simple.LocalBuildInfo as L
1115import qualified Distribution.Simple.Setup as S
1216import qualified Distribution.Simple.Program as P
13−import Distribution.Simple.Utils (createDirectoryIfMissingVerbose, rewriteFile, notice, installOrdinaryFiles)
17+import Distribution.Simple.Utils
1418import Distribution.Compiler
1519import Distribution.PackageDescription
1620import Distribution.Text
21+import Distribution.Verbosity
1722
1823import System.Environment
1924import System.Exit
@@ -22,6 +27,11 @@ import System.Directory
2227import qualified System.FilePath.Posix as Px
2328import System.Process
2429
30+#if (MIN_VERSION_Cabal(2,0,0))
31+import Distribution.Types.UnqualComponentName
32+#endif
33+
34+
2535-- After Idris is built, we need to check and install the prelude and other libs
2636
2737-- -----------------------------------------------------------------------------
@@ -56,32 +66,42 @@ windres verbosity = P.runProgramInvocation verbosity . P.simpleProgramInvocation
5666
5767usesGMP :: S.ConfigFlags -> Bool
5868usesGMP flags =
59− case lookup (FlagName "gmp") (S.configConfigurationsFlags flags) of
69+ case lookupFlagAssignment (mkFlagName "gmp") (S.configConfigurationsFlags flags) of
6070 Just True -> True
6171 Just False -> False
6272 Nothing -> False
6373
6474execOnly :: S.ConfigFlags -> Bool
6575execOnly flags =
66− case lookup (FlagName "execonly") (S.configConfigurationsFlags flags) of
76+ case lookupFlagAssignment (mkFlagName "execonly") (S.configConfigurationsFlags flags) of
6777 Just True -> True
6878 Just False -> False
6979 Nothing -> False
7080
7181isRelease :: S.ConfigFlags -> Bool
7282isRelease flags =
73− case lookup (FlagName "release") (S.configConfigurationsFlags flags) of
83+ case lookupFlagAssignment (mkFlagName "release") (S.configConfigurationsFlags flags) of
7484 Just True -> True
7585 Just False -> False
7686 Nothing -> False
7787
7888isFreestanding :: S.ConfigFlags -> Bool
7989isFreestanding flags =
80− case lookup (FlagName "freestanding") (S.configConfigurationsFlags flags) of
90+ case lookupFlagAssignment (mkFlagName "freestanding") (S.configConfigurationsFlags flags) of
8191 Just True -> True
8292 Just False -> False
8393 Nothing -> False
8494
95+#if !(MIN_VERSION_Cabal(2,0,0))
96+mkFlagName :: String -> FlagName
97+mkFlagName = FlagName
98+#endif
99+
100+#if !(MIN_VERSION_Cabal(2,2,0))
101+lookupFlagAssignment :: FlagName -> FlagAssignment -> Maybe Bool
102+lookupFlagAssignment = lookup
103+#endif
104+
85105-- -----------------------------------------------------------------------------
86106-- Clean
87107
@@ -101,6 +121,18 @@ gitHash = do h <- Control.Exception.catch (readProcess "git" ["rev-parse", "--sh
101121 (\e -> let e' = (e :: SomeException) in return "PRE")
102122 return $ takeWhile (/= '\n') h
103123
124+-- Generate a module that contains extra library directories passed
125+-- via command-line to cabal
126+generateBuildFlagsModule :: Verbosity -> FilePath -> [String] -> IO ()
127+generateBuildFlagsModule verbosity dir libdirs = do
128+ let buildFlagsModulePath = dir </> "BuildFlags_idris" Px.<.> "hs"
129+ putStrLn $ "Generating " ++ buildFlagsModulePath
130+ createDirectoryIfMissingVerbose verbosity True dir
131+ rewriteFileEx verbosity buildFlagsModulePath contents
132+ where contents = "module BuildFlags_idris where \n\n" ++
133+ "extraLibDirs :: [String]\n" ++
134+ "extraLibDirs = " ++ show libdirs
135+
104136-- Put the Git hash into a module for use in the program
105137-- For release builds, just put the empty string in the module
106138generateVersionModule verbosity dir release = do
@@ -109,7 +141,7 @@ generateVersionModule verbosity dir release = do
109141 putStrLn $ "Generating " ++ versionModulePath ++
110142 if release then " for release" else " for prerelease " ++ hash
111143 createDirectoryIfMissingVerbose verbosity True dir
112− rewriteFile versionModulePath (versionModuleContents hash)
144+ rewriteFileEx verbosity versionModulePath (versionModuleContents hash)
113145
114146 where versionModuleContents h = "module Version_idris where\n\n" ++
115147 "gitHash :: String\n" ++
@@ -123,7 +155,7 @@ generateTargetModule verbosity dir targetDir = do
123155 let targetModulePath = dir </> "Target_idris" Px.<.> "hs"
124156 putStrLn $ "Generating " ++ targetModulePath
125157 createDirectoryIfMissingVerbose verbosity True dir
126− rewriteFile targetModulePath (versionModuleContents absPath targetDir)
158+ rewriteFileEx verbosity targetModulePath (versionModuleContents absPath targetDir)
127159 where versionModuleContents absolute td = "module Target_idris where\n\n" ++
128160 "import System.FilePath\n" ++
129161 "import System.Environment\n" ++
@@ -149,22 +181,26 @@ generateToolchainModule verbosity srcDir toolDir = do
149181 "getToolchainDir = \"\""
150182 let toolPath = srcDir </> "Tools_idris" Px.<.> "hs"
151183 createDirectoryIfMissingVerbose verbosity True srcDir
152− rewriteFile toolPath (commonContent ++ toolContent)
184+ rewriteFileEx verbosity toolPath (commonContent ++ toolContent)
153185
154−idrisConfigure _ flags _ local = do
186+idrisConfigure _ flags pkgdesc local = do
155187 configureRTS
156− generateVersionModule verbosity (autogenModulesDir local) (isRelease (configFlags local))
157− if isFreestanding $ configFlags local
158− then do
159− toolDir <- lookupEnv "IDRIS_TOOLCHAIN_DIR"
160− generateToolchainModule verbosity (autogenModulesDir local) toolDir
161− targetDir <- lookupEnv "IDRIS_LIB_DIR"
162− case targetDir of
163− Just d -> generateTargetModule verbosity (autogenModulesDir local) d
164− Nothing -> error $ "Trying to build freestanding without a target directory."
165− ++ " Set it by defining IDRIS_LIB_DIR."
166− else
167− generateToolchainModule verbosity (autogenModulesDir local) Nothing
188+ withLibLBI pkgdesc local $ \lib libcfg -> do
189+ let libAutogenDir = autogenComponentModulesDir local libcfg
190+ let libDirs = extraLibDirs $ libBuildInfo lib
191+ generateBuildFlagsModule verbosity libAutogenDir libDirs
192+ generateVersionModule verbosity libAutogenDir (isRelease (configFlags local))
193+ if isFreestanding $ configFlags local
194+ then do
195+ toolDir <- lookupEnv "IDRIS_TOOLCHAIN_DIR"
196+ generateToolchainModule verbosity libAutogenDir toolDir
197+ targetDir <- lookupEnv "IDRIS_LIB_DIR"
198+ case targetDir of
199+ Just d -> generateTargetModule verbosity libAutogenDir d
200+ Nothing -> error $ "Trying to build freestanding without a target directory."
201+ ++ " Set it by defining IDRIS_LIB_DIR."
202+ else
203+ generateToolchainModule verbosity libAutogenDir Nothing
168204 where
169205 verbosity = S.fromFlag $ S.configVerbosity flags
170206 version = pkgVersion . package $ localPkgDescr local
@@ -175,34 +211,14 @@ idrisConfigure _ flags _ local = do
175211 -- the file after configure.
176212 configureRTS = make verbosity ["-C", "rts", "clean"]
177213
178−idrisPreSDist args flags = do
179− let dir = S.fromFlag (S.sDistDirectory flags)
180− let verb = S.fromFlag (S.sDistVerbosity flags)
181− generateVersionModule verb "src" True
182− generateTargetModule verb "src" "./libs"
183− generateToolchainModule verb "src" Nothing
184− preSDist simpleUserHooks args flags
185−
186−idrisSDist sdist pkgDesc bi hooks flags = do
187− pkgDesc' <- addGitFiles pkgDesc
188− sdist pkgDesc' bi hooks flags
189− where
190− addGitFiles :: PackageDescription -> IO PackageDescription
191− addGitFiles pkgDesc = do
192− files <- gitFiles
193− return $ pkgDesc { extraSrcFiles = extraSrcFiles pkgDesc ++ files}
194− gitFiles :: IO [FilePath]
195− gitFiles = liftM lines (readProcess "git" ["ls-files"] "")
196−
197−idrisPostSDist args flags desc lbi = do
198− Control.Exception.catch (do let file = "src" </> "Version_idris" Px.<.> "hs"
199− let targetFile = "src" </> "Target_idris" Px.<.> "hs"
200− putStrLn $ "Removing generated modules:\n "
201− ++ file ++ "\n" ++ targetFile
202− removeFile file
203− removeFile targetFile)
204− (\e -> let e' = (e :: SomeException) in return ())
205− postSDist simpleUserHooks args flags desc lbi
214+#if !(MIN_VERSION_Cabal(2,0,0))
215+ autogenComponentModulesDir lbi _ = autogenModulesDir lbi
216+#endif
217+
218+#if !(MIN_VERSION_Cabal(2,0,0))
219+rewriteFileEx :: Verbosity -> FilePath -> String -> IO ()
220+rewriteFileEx _ = rewriteFile
221+#endif
206222
207223-- -----------------------------------------------------------------------------
208224-- Build
@@ -213,11 +229,16 @@ getVersion args flags = do
213229 let buildinfo = (emptyBuildInfo { cppOptions = ["-DVERSION="++hash] }) :: BuildInfo
214230 return (Just buildinfo, [])
215231
232+
233+#if !(MIN_VERSION_Cabal(2,0,0))
234+mkUnqualComponentName = id
235+#endif
236+
216237idrisPreBuild args flags = do
217238#ifdef mingw32_HOST_OS
218239 createDirectoryIfMissingVerbose verbosity True dir
219240 windres verbosity ["icons/idris_icon.rc","-o", dir++"/idris_icon.o"]
220− return (Nothing, [("idris", emptyBuildInfo { ldOptions = [dir ++ "/idris_icon.o"] })])
241+ return (Nothing, [(mkUnqualComponentName "idris", emptyBuildInfo { ldOptions = [dir ++ "/idris_icon.o"] })])
221242 where
222243 verbosity = S.fromFlag $ S.buildVerbosity flags
223244 dir = S.fromFlagOrDefault "dist" $ S.buildDistPref flags
@@ -225,9 +246,10 @@ idrisPreBuild args flags = do
225246 return (Nothing, [])
226247#endif
227248
228−idrisBuild _ flags _ local = unless (execOnly (configFlags local)) $ do
229− buildStdLib
230− buildRTS
249+idrisBuild _ flags _ local
250+ = if (execOnly (configFlags local)) then buildRTS
251+ else do buildStdLib
252+ buildRTS
231253 where
232254 verbosity = S.fromFlag $ S.buildVerbosity flags
233255
@@ -246,15 +268,16 @@ idrisBuild _ flags _ local = unless (execOnly (configFlags local)) $ do
246268-- -----------------------------------------------------------------------------
247269-- Copy/Install
248270
249−idrisInstall verbosity copy pkg local = unless (execOnly (configFlags local)) $ do
250− installStdLib
251− installRTS
252− installManPage
271+idrisInstall verbosity copy pkg local
272+ = if (execOnly (configFlags local)) then installRTS
273+ else do installStdLib
274+ installRTS
275+ installManPage
253276 where
254277 target = datadir $ L.absoluteInstallDirs pkg local copy
255278
256279 installStdLib = do
257− let target' = target </> "libs"
280+ let target' = target -- </> "libs"
258281 putStrLn $ "Installing libraries in " ++ target'
259282 makeInstall "libs" target'
260283
@@ -268,33 +291,21 @@ idrisInstall verbosity copy pkg local = unless (execOnly (configFlags local)) $
268291 notice verbosity $ unwords ["Copying man page to", mandest]
269292 installOrdinaryFiles verbosity mandest [("man", "idris.1")]
270293
271−
272294 makeInstall src target =
273295 make verbosity [ "-C", src, "install" , "TARGET=" ++ target, "IDRIS=" ++ idrisCmd local]
274296
275297-- -----------------------------------------------------------------------------
276298-- Test
277299
278−-- FIXME: We use the __GLASGOW_HASKELL__ macro because MIN_VERSION_cabal seems
279−-- to be broken !
280−
281300-- There are two "dataDir" in cabal, and they don't relate to each other.
282301-- When fetching modules, idris uses the second path (in the pkg record),
283302-- which by default is the root folder of the project.
284303-- We want it to be the install directory where we put the idris libraries.
285304fixPkg pkg target = pkg { dataDir = target }
286305
287−-- The "Args" argument of the testHooks has been added in cabal 1.22.0,
288−-- and should therefore be ignored for prior versions.
289−#if __GLASGOW_HASKELL__ < 710
290−originalTestHook _ = testHook simpleUserHooks
291−#else
292−originalTestHook = testHook simpleUserHooks
293−#endif
294−
295306idrisTestHook args pkg local hooks flags = do
296307 let target = datadir $ L.absoluteInstallDirs pkg local NoCopyDest
297− originalTestHook args (fixPkg pkg target) local hooks flags
308+ testHook simpleUserHooks args (fixPkg pkg target) local hooks flags
298309
299310-- -----------------------------------------------------------------------------
300311-- Main
@@ -312,12 +323,5 @@ main = defaultMainWithHooks $ simpleUserHooks
312323 , postInst = \_ flags pkg local ->
313324 idrisInstall (S.fromFlag $ S.installVerbosity flags)
314325 NoCopyDest pkg local
315− , preSDist = idrisPreSDist
316− , sDistHook = idrisSDist (sDistHook simpleUserHooks)
317− , postSDist = idrisPostSDist
318−#if __GLASGOW_HASKELL__ < 710
319− , testHook = idrisTestHook ()
320−#else
321326 , testHook = idrisTestHook
322−#endif
323327 }
appveyor.yml+9−8
@@ -1,19 +1,19 @@
11version: 1.0.{build}
22init:
33- ps: >-
4− choco install cabal
4+ choco install cabal --no-progress
55
66 mkdir C:\ghc
77
8− Invoke-WebRequest "http://downloads.haskell.org/~ghc/7.10.3/ghc-7.10.3-x86_64-unknown-mingw32.tar.xz" -OutFile C:\ghc\ghc.tar.xz -UserAgent "Curl"
9−
8+ Invoke-WebRequest "https://downloads.haskell.org/~ghc/8.8.2/ghc-8.8.2-x86_64-unknown-mingw32.tar.xz" -OutFile C:\ghc\ghc.tar.xz -UserAgent "Curl"
9+
1010 7z x C:\ghc\ghc.tar.xz -oC:\ghc
11−
11+
1212 7z x C:\ghc\ghc.tar -oC:\ghc
1313
14− $env:PATH="$env:PATH;c:\ghc\ghc-7.10.3\bin;$HOME\AppData\Roaming\cabal\bin"
14+ $env:PATH="$env:PATH;c:\ghc\ghc-8.8.2\bin;$HOME\AppData\Roaming\cabal\bin"
1515
16− cabal update
16+ cabal v1-update
1717
1818 $env:current_posix=c:\msys64\usr\bin\cygpath -u $(pwd)
1919
@@ -21,6 +21,7 @@ environment:
2121 MSYSTEM: MINGW64
2222 MSYS2_PATH_TYPE: inherit
2323build_script:
24−- ps: c:\msys64\usr\bin\bash -l -c "cd $env:current_posix && cabal install -fffi -j4 --enable-tests"
24+- ps: >-
25+ c:\msys64\usr\bin\bash -l -c "cd $env:current_posix && cabal v1-install -fffi --enable-tests 2>&1"
2526test_script:
26−- ps: c:\msys64\usr\bin\bash -l -c "cd $env:current_posix && make test_c"
27+- ps: c:\msys64\usr\bin\bash -l -c "cd $env:current_posix && make test_c 2>&1"
azure-pipelines.ymlnew file+143
@@ -0,0 +1,143 @@
1+# Starter pipeline
2+# Start with a minimal pipeline that you can customize to build and deploy your code.
3+# Add steps that build, run tests, deploy, and more:
4+# https://aka.ms/yaml
5+jobs:
6+ # Test a configuration with the oldest supported GHC
7+ - job: Linux_GHC_710
8+ pool:
9+ vmImage: 'Ubuntu 16.04'
10+ steps:
11+ - script: |
12+ sudo add-apt-repository ppa:hvr/ghc
13+ sudo apt-get update
14+ sudo apt-get install ghc-7.10.3 cabal-install-2.2
15+ sudo update-alternatives --config opt-ghc
16+ sudo update-alternatives --config opt-cabal
17+ displayName: 'Prepare system'
18+ - script: |
19+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
20+ cabal update
21+ CABALFLAGS="-fffi -fci" make
22+ displayName: 'Build Idris'
23+ - script: |
24+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
25+ make test_c
26+ displayName: 'Run tests'
27+ # Test on Linux
28+ - job: Linux
29+ pool:
30+ vmImage: 'Ubuntu 16.04'
31+ steps:
32+ - script: |
33+ sudo add-apt-repository ppa:hvr/ghc
34+ sudo apt-get update
35+ sudo apt-get install ghc-8.2.2 cabal-install-2.2
36+ sudo update-alternatives --config opt-ghc
37+ sudo update-alternatives --config opt-cabal
38+ displayName: 'Prepare system'
39+ - script: |
40+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
41+ cabal update
42+ CABALFLAGS="-fffi -fci" make
43+ displayName: 'Build Idris'
44+ - script: |
45+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
46+ make test_c
47+ displayName: 'Run tests'
48+ # Test on MacOS
49+ - job: macOS
50+ pool:
51+ vmImage: 'xcode9-macos10.13'
52+ steps:
53+ - script: |
54+ brew install ghc cabal-install libffi pkgconfig
55+ export PKG_CONFIG_PATH=/usr/local/opt/libffi/lib/pkgconfig:$PKG_CONFIG_PATH
56+ export PATH=$HOME/.cabal/bin:$PATH
57+ cabal update
58+ CABALFLAGS="-fffi -fci" make
59+ make test_c
60+ displayName: 'Build idris and run tests'
61+ # Test on Windows
62+ - job: Windows
63+ pool:
64+ vmImage: 'vs2017-win2016'
65+ steps:
66+ - powershell: |
67+ choco install cabal -y --no-progress
68+ choco install 7zip.portable -y --no-progress
69+ choco install msys2 -y --no-progress --params "/InstallDir=C:/msys64/"
70+ mkdir C:\ghc
71+ Invoke-WebRequest "https://downloads.haskell.org/~ghc/8.4.3/ghc-8.4.3-x86_64-unknown-mingw32.tar.xz" -OutFile C:\ghc\ghc.tar.xz -UserAgent "Curl"
72+ 7z x C:\ghc\ghc.tar.xz -oC:\ghc
73+ 7z x C:\ghc\ghc.tar -oC:\ghc
74+ displayName: "Setting up environment"
75+ - powershell: |
76+ cabal update
77+ $env:PATH="$env:PATH;$HOME\AppData\Roaming\cabal\bin;c:\ghc\ghc-8.4.3\bin"
78+ $env:current_posix=c:\msys64\usr\bin\cygpath -u $(pwd)
79+ c:\msys64\usr\bin\bash -l -c "echo `$MSYSTEM && echo `$PATH"
80+ c:\msys64\usr\bin\bash -l -c "pacman -S make mingw-w64-x86_64-gcc mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libffi --noconfirm 2>&1"
81+ c:\msys64\usr\bin\bash -l -c "cd $env:current_posix && cabal install -fffi --enable-test 2>&1"
82+ c:\msys64\usr\bin\bash -l -c "cd $env:current_posix && make test_c 2>&1"
83+ env:
84+ MSYSTEM: MINGW64
85+ MSYS2_PATH_TYPE: inherit
86+ displayName: "Build and test Idris"
87+ # Check styling
88+ - job: Stylize
89+ pool:
90+ vmImage: 'Ubuntu 16.04'
91+ steps:
92+ - script: |
93+ sudo add-apt-repository ppa:hvr/ghc
94+ sudo apt-get update
95+ sudo apt-get install ghc-8.2.2 cabal-install-2.2
96+ sudo update-alternatives --config opt-ghc
97+ sudo update-alternatives --config opt-cabal
98+ displayName: 'Prepare system'
99+ - script: |
100+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
101+ cabal update
102+ cabal install stylish-haskell
103+ ./stylize.sh
104+ displayName: 'Run stylish'
105+ # Run tests on the node backend
106+ - job: JS
107+ pool:
108+ vmImage: 'Ubuntu 16.04'
109+ steps:
110+ - script: |
111+ sudo add-apt-repository ppa:hvr/ghc
112+ sudo apt-get update
113+ sudo apt-get install ghc-8.2.2 cabal-install-2.2
114+ sudo update-alternatives --config opt-ghc
115+ sudo update-alternatives --config opt-cabal
116+ displayName: 'Prepare system'
117+ - script: |
118+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
119+ cabal update
120+ CABALFLAGS="-fffi -fci" make
121+ displayName: 'Build Idris'
122+ - script: |
123+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
124+ make test_js
125+ displayName: 'Run tests'
126+ # Build docs
127+ - job: Docs
128+ pool:
129+ vmImage: 'Ubuntu 16.04'
130+ steps:
131+ - script: |
132+ sudo add-apt-repository ppa:hvr/ghc
133+ sudo apt-get update
134+ sudo apt-get install ghc-8.2.2 cabal-install-2.2
135+ sudo update-alternatives --config opt-ghc
136+ sudo update-alternatives --config opt-cabal
137+ displayName: 'Prepare system'
138+ - script: |
139+ export PATH=/opt/ghc/bin:$HOME/.cabal/bin:$PATH
140+ cabal update
141+ CABALFLAGS="-fffi -fci" make
142+ make lib_doc doc
143+ displayName: 'Build Docs'
benchmarks/build.pl+3−2
@@ -2,13 +2,14 @@
22
33$bmarks = `cat ALL`;
44@bm = split(/\n/, $bmarks);
5+$idris = $ENV{'IDRIS'} || "idris";
56
67foreach $b (@bm) {
78 if ($b =~ /([a-zA-Z0-9]+)\/([a-zA-Z0-9]+)\s+(.*)/) {
89 print "Building $1 / $2\n";
910 chdir $1;
10− system("idris --clean $2.ipkg");
11− system("idris --build $2.ipkg");
11+ system("$idris --clean $2.ipkg");
12+ system("$idris --build $2.ipkg") == 0 or die "Unable to build $2: $?";
1213 chdir "..";
1314 }
1415}
benchmarks/fasta/fasta.idr+9−4
@@ -3,11 +3,20 @@ module Main
33import System
44
55alu : String
6+alu = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG"
7+ ++ "TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG"
8+ ++ "CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC"
9+ ++ "GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
10+
11+{- The following string literal syntax doesn't work anymore. Until fixed we shall concat the strings.
612alu = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG\
713 \TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG\
814 \CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC\
915 \GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
1016
17+-}
18+
19+
1120iub : List (Char, Double)
1221iub = [('a',0.27),('c',0.12),('g',0.12),('t',0.27),('B',0.02)
1322 ,('D',0.02),('H',0.02),('K',0.02),('M',0.02),('N',0.02)
@@ -38,10 +47,6 @@ replicate : Int -> Char -> String
3847replicate 0 c = ""
3948replicate n c = singleton c <+> replicate (n-1) c
4049
41−scanl : (f : acc -> a -> acc) -> acc -> List a -> List acc
42−scanl f q ls = q :: (case ls of
43− [] => []
44− x::xs => scanl f (f q x) xs)
4550
4651accum : (Char,Double) -> (Char,Double) -> (Char,Double)
4752accum (_,p) (c,q) = (c,p+q)
benchmarks/pidigits/pidigits.idr+1−1
@@ -3,7 +3,7 @@ import Data.Vect
33
44{- Toy program that outputs the n first digits of Pi.
55
6− Inspired from http://www.haskell.org/haskellwiki/Shootout/Pidigits.
6+ Inspired from https://www.haskell.org/haskellwiki/Shootout/Pidigits.
77 The original ns and str lazy lists have been replaced by strict functions.
88
99 Memory usage seems to be excessive. One of the branches of str is tail recursive, and
codegen/idris-codegen-c/Main.hs+5−5
@@ -1,19 +1,19 @@
11module Main where
22
3−import Idris.Core.TT
43import Idris.AbsSyntax
54import Idris.ElabDecls
65import Idris.Main
7−import IRTS.Compiler
6+import Idris.Options
87import IRTS.CodegenC
8+import IRTS.Compiler
9+
10+import Util.System
911
12+import Control.Monad
1013import System.Environment
1114import System.Exit
12−import Control.Monad
1315
14−import Paths_idris
1516
16−import Util.System
1717
1818data Opts = Opts { inputs :: [FilePath],
1919 interface :: Bool,
codegen/idris-codegen-javascript/Main.hs+2−3
@@ -1,16 +1,15 @@
11module Main where
22
3−import Idris.Core.TT
43import Idris.AbsSyntax
54import Idris.ElabDecls
65import Idris.Main
7−import IRTS.Compiler
6+import Idris.Options
87import IRTS.CodegenJavaScript
8+import IRTS.Compiler
99
1010import System.Environment
1111import System.Exit
1212
13−import Paths_idris
1413
1514data Opts = Opts {
1615 inputs :: [FilePath]
codegen/idris-codegen-node/Main.hs+13−8
@@ -1,19 +1,21 @@
11module Main where
22
3−import Idris.Core.TT
43import Idris.AbsSyntax
54import Idris.ElabDecls
65import Idris.Main
7−
8−import IRTS.Compiler
6+import Idris.Options
97import IRTS.CodegenJavaScript
8+import IRTS.Compiler
9+
10+import Paths_idris
11+
12+import Control.Monad
1013
1114import System.Environment
1215import System.Exit
1316
14−import Paths_idris
15−
1617data Opts = Opts { inputs :: [FilePath]
18+ , interface :: Bool
1719 , output :: FilePath
1820 }
1921
@@ -23,17 +25,20 @@ showUsage = do putStrLn "A code generator which is intended to be called by the
2325
2426getOpts :: IO Opts
2527getOpts = do xs <- getArgs
26− return $ process (Opts [] "main.js") xs
28+ return $ process (Opts [] False "main.js") xs
2729 where
2830 process opts ("-o":o:xs) = process (opts { output = o }) xs
31+ process opts ("--interface":xs) = process (opts { interface = True }) xs
2932 process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs
3033 process opts [] = opts
3134
3235jsMain :: Opts -> Idris ()
3336jsMain opts = do elabPrims
3437 loadInputs (inputs opts) Nothing
35− mainProg <- elabMain
36− ir <- compile (Via IBCFormat "node") (output opts) (Just mainProg)
38+ mainProg <- if interface opts
39+ then return Nothing
40+ else liftM Just elabMain
41+ ir <- compile (Via IBCFormat "node") (output opts) mainProg
3742 runIO $ codegenNode ir
3843
3944main :: IO ()
config.mk+4−2
@@ -1,4 +1,6 @@
1−ifneq (, $(findstring MSYS, $(shell uname -a)))
1+UNAME_INFO := $(shell uname -a)
2+
3+ifeq ($(filter , $(findstring MSYS, $(UNAME_INFO)) $(findstring MINGW, $(UNAME_INFO))),)
24 ifeq (cc,$(CC))
35 # In MSYS2, when using the mingw version of gcc, there is no cc -> gcc
46 # symlink. We can't use ?= here because CC is set implicitly to cc.
@@ -12,7 +14,7 @@ RANLIB ?=ranlib
1214CABAL :=cabal
1315# IDRIS_ENABLE_STATS should not be set in final release
1416# Any flags defined here which alter the RTS API must also be added to src/IRTS/CodegenC.hs
15−CFLAGS :=-O2 -Wall -DHAS_PTHREAD -DIDRIS_ENABLE_STATS $(CFLAGS)
17+CFLAGS :=-O2 -Wall -std=c99 -pipe -fdata-sections -ffunction-sections -D_POSIX_C_SOURCE=200809L -DHAS_PTHREAD -DIDRIS_ENABLE_STATS $(CFLAGS)
1618
1719# CABALFLAGS :=
1820CABALFLAGS += --enable-tests
docs/LICENSE+1−1
@@ -7,4 +7,4 @@ rights to Documentation for Idris.
77
88More information concerning the CC0 can be found online at:
99
10− http://creativecommons.org/publicdomain/zero/1.0/
10+ https://creativecommons.org/publicdomain/zero/1.0/
docs/Makefile+1−1
@@ -9,7 +9,7 @@ BUILDDIR = _build
99
1010# User-friendly check for sphinx-build
1111ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
12−$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
12+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from https://www.sphinx-doc.org/)
1313endif
1414
1515# Internal variables.
docs/README.md+3−3
@@ -1,7 +1,7 @@
11# Documentation for the Idris Language.
22
33
4−This manual has been prepared using ReStructured Text and the [Sphinx Documentation Generator](http://sphinx-doc.org) for future inclusion on [Read The Docs](http://www.readthedocs.org).
4+This manual has been prepared using ReStructured Text and the [Sphinx Documentation Generator](https://www.sphinx-doc.org) for future inclusion on [Read The Docs](https://www.readthedocs.org).
55
66## Dependencies
77
@@ -12,7 +12,7 @@ To build the manual the following dependencies must be met. We assume that you h
1212Python should be installed by default on most systems.
1313Sphinx can be installed either through your hosts package manager or using pip/easy_install.
1414
15−*Note* [ReadTheDocs](http://www.readthedocs.org) works with Sphinx
15+*Note* [ReadTheDocs](https://www.readthedocs.org) works with Sphinx
1616 `v1.2.2`. If you install a more recent version of sphinx then
1717 'incorrectly' marked up documentation may get passed the build system
1818 of readthedocs and be ignored. In the past we had several code-blocks
@@ -45,7 +45,7 @@ rights to Documentation for Idris.
4545
4646More information concerning the CC0 can be found online at:
4747
48− http://creativecommons.org/publicdomain/zero/1.0/
48+ https://creativecommons.org/publicdomain/zero/1.0/
4949
5050
5151When contributing material to the manual please bear in mind that the work will be licensed as above.
docs/_static/theme_overrides.cssnew file+13
@@ -0,0 +1,13 @@
1+/* override table width restrictions */
2+@media screen and (min-width: 767px) {
3+
4+ .wy-table-responsive table td {
5+ /* !important prevents the common CSS stylesheets from overriding
6+ this as on RTD they are loaded after this stylesheet */
7+ white-space: normal !important;
8+ }
9+
10+ .wy-table-responsive {
11+ overflow: visible !important;
12+ }
13+}
docs/conf.py+81−12
@@ -33,7 +33,7 @@ on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
3333# ones.
3434extensions = [
3535 'sphinx.ext.todo',
36− 'sphinx.ext.pngmath',
36+# 'sphinx.ext.pngmath', # imgmath is not supported on readthedocs.
3737 'sphinx.ext.ifconfig',
3838]
3939
@@ -51,7 +51,7 @@ master_doc = 'index'
5151
5252# General information about the project.
5353project = u'Idris'
54−copyright = u'2015, The Idris Community'
54+copyright = u'2017-2020, The Idris Community'
5555author = u'The Idris Community'
5656
5757# The version info for the project you're documenting, acts as replacement for
@@ -59,9 +59,9 @@ author = u'The Idris Community'
5959# built documents.
6060#
6161# The short X.Y version.
62−version = '0.12.2'
62+version = '1.3'
6363# The full version, including alpha/beta/rc tags.
64−release = '0.12.2'
64+release = '1.3.2'
6565
6666# The language for content autogenerated by Sphinx. Refer to documentation
6767# for a list of supported languages.
@@ -151,6 +151,12 @@ if not on_rtd: # only import and set the theme if we're building docs locally
151151# so a file named "default.css" will overwrite the builtin "default.css".
152152html_static_path = ['_static']
153153
154+html_context = {
155+ 'css_files': [
156+ '_static/theme_overrides.css', # override wide tables in RTD theme
157+ ],
158+ }
159+
154160# Add any extra paths that contain custom files (such as robots.txt or
155161# .htaccess) here, relative to this directory. These files are copied
156162# directly to the root of the documentation.
@@ -216,16 +222,77 @@ htmlhelp_basename = 'IdrisManualdoc'
216222
217223# -- Options for LaTeX output ---------------------------------------------
218224
225+latex_title_page = r'''
226+\begin{titlepage}
227+ \vspace*{\fill}
228+ \begin{center}
229+ \includegraphics[width=0.25\textwidth]{idris-512x512.png}\par
230+ \vspace{1cm}
231+ {\huge\sffamily\bfseries \makeatletter\@title\makeatother\par}
232+ \vspace{1cm}
233+ {\Large Version \version\par}
234+ \end{center}
235+ \vspace*{\fill}
236+\end{titlepage}
237+'''
238+
219239latex_elements = {
220240# The paper size ('letterpaper' or 'a4paper').
221241'papersize': 'a4paper',
222242
243+'fontpkg': '',
244+'inputenc': '',
245+'utf8extra': '',
246+'releasename': 'Version',
247+
223248# The font size ('10pt', '11pt' or '12pt').
224249'pointsize': '10pt',
225250
226251# Additional stuff for the LaTeX preamble.
227−#'preamble': '',
228−
252+'preamble': r'''
253+\usepackage{lmodern}
254+\usepackage{textalpha}
255+\usepackage[T1]{fontenc}
256+\usepackage[utf8x]{inputenc}
257+\usepackage{titlesec}
258+%
259+\usepackage{fancyhdr}
260+\fancypagestyle{plain}{%
261+ \renewcommand{\headrulewidth}{0pt}%
262+ \fancyhf{}%
263+ \fancyfoot[C]{\textsf{\thepage}}
264+}
265+\pagestyle{fancy}
266+\fancyhf{}
267+\fancyhead[LE,RO]{\textsf{\bfseries{v\version}}}
268+\fancyhead[LO,RE]{\textsf{\bfseries\leftmark}}
269+%\fancyhead[LO]{\textsf{\bfseries{\leftmark}}}
270+%\fancyhead[RO]{\textsf{\bfseries{v\version}}}
271+%\fancyhead[RE]{\textsf{\bfseries{\leftmark}}}
272+%\fancyhead[LE]{\textsf{\bfseries{v\version}}}
273+\fancyfoot[C]{\textsf{\thepage}}
274+\renewcommand{\footrulewidth}{0pt}
275+\renewcommand{\headrulewidth}{0pt}
276+%
277+\usepackage[font={small,it}]{caption}
278+\titleformat{\section}
279+ {\normalfont\sffamily\Large\bfseries\color{black}}
280+ {\thesection}{1em}{}
281+\titleformat{\subsection}
282+ {\sffamily\large\bfseries\color{black}}
283+ {\thesubsection}{1em}{}
284+\titleformat{\subsubsection}
285+ {\sffamily\normalsize\bfseries\color{black}}
286+ {\thesubsubsection}{1em}{}
287+\titleformat{\paragraph}{\normalfont\normalsize\slshape}{\theparagraph}{1em}{}
288+\setlength{\parskip}{1em}
289+%
290+\hypersetup{colorlinks = false}
291+\definecolor{VerbatimBorderColor}{rgb}{1,1,1}
292+''',
293+
294+'maketitle': latex_title_page,
295+'tableofcontents': "\\tableofcontents"
229296# Latex figure (float) alignment
230297#'figure_align': 'htbp',
231298}
@@ -234,15 +301,17 @@ latex_elements = {
234301# (source start file, target name, title,
235302# author, documentclass [howto, manual, or own class]).
236303latex_documents = [
237− ('tutorial/index', 'idris-tutorial.tex', u'The Idris Tutorial', u'The Idris Community', 'manual'),
238− ('guides/index', 'idris-guides.tex', u'Idris Tutorial Series', u'The Idris Community', 'manual'),
239−# ('reference/index', 'idris-reference.tex', u'The Idris Reference', u'The Idris Community', 'manual'),
240− ('effects/index', 'eff-tutorial.tex', u'The Effects Tutorial', u'The Idris Community', 'manual')
241− ]
304+ # (master_doc, 'idris.tex', u'Documentation for the Idris Language', u'The Idris Community', 'report')
305+ ('tutorial/index', 'idris-tutorial.tex', u'The Idris Tutorial', u'The Idris Community', 'howto'),
306+]
307+
308+
309+latex_show_pagerefs = True
310+latex_show_url = 'footnote'
242311
243312# The name of an image file (relative to this directory) to place at the top of
244313# the title page.
245−#latex_logo = None
314+latex_logo = '../icons/idris-512x512.png'
246315
247316# For "manual" documents, if this is true, then toplevel headings are parts,
248317# not chapters.
docs/effects/conclusions.rst+1−1
@@ -51,7 +51,7 @@ foundations are also well-studied see [5]_, [6]_, [7]_, [8]_.
5151 Programming Languages and Systems (APLAS '09), Zhenjiang Hu
5252 (Ed.). Springer-Verlag, Berlin, Heidelberg,
5353 95-110. DOI=10.1007/978-3-642-10672-9_9
54− http://link.springer.com/chapter/10.1007%2F978-3-642-10672-9_9
54+ https://link.springer.com/chapter/10.1007%2F978-3-642-10672-9_9
5555
5656
5757.. [4] Ohad Kammar, Sam Lindley, and Nicolas Oury. 2013. Handlers in
docs/effects/depeff.rst+18−9
@@ -43,8 +43,8 @@ express this as follows:
4343
4444.. code-block:: idris
4545
46− readInt : Eff ()[STATE (Vect n Int), STDIO]
47− [STATE (Vect (S n) Int), STDIO]
46+ readInt : Eff () [STATE (Vect n Int), STDIO]
47+ [STATE (Vect (S n) Int), STDIO]
4848 readInt = do let x = trim !getStr
4949 putM (cast x :: !get)
5050
@@ -153,12 +153,21 @@ file management follows a resource usage protocol with the following
153153
154154- When a file is closed, its handle should no longer be used
155155
156−These requirements can be expressed formally in , by creating a
156+These requirements can be expressed formally by creating a
157157``FILE_IO`` effect parameterised over a file handle state, which is
158158either empty, open for reading, or open for writing. The ``FILE_IO``
159−effect’s definition is given below. Note that this
160−effect is mainly for illustrative purposes—typically we would also like
161−to support random access files and better reporting of error conditions.
159+effect’s definition is given below.
160+
161+.. note::
162+ This effect is mainly for illustrative purposes.
163+ Typically we would also like to support random access files and
164+ better reporting of error conditions.
165+
166+ Moreover, the ``FILE`` effect in the ``Effect.File`` module of
167+ the ``effects`` library uses slightly more complicated types to
168+ support erroneous behaviour of each function and to support more
169+ compilcated modes of opening, like for reading **and** writing,
170+ appending or truncating.
162171
163172.. code-block:: idris
164173
@@ -173,7 +182,7 @@ to support random access files and better reporting of error conditions.
173182
174183 open : (fname : String)
175184 -> (m : Mode)
176− -> Eff Bool [FILE_IO ()]
185+ -> Eff Bool [FILE_IO ()]
177186 (\res => [FILE_IO (case res of
178187 True => OpenFile m
179188 False => ())])
@@ -191,7 +200,7 @@ In particular, consider the type of ``open``:
191200
192201 open : (fname : String)
193202 -> (m : Mode)
194− -> Eff Bool [FILE_IO ()]
203+ -> Eff Bool [FILE_IO ()]
195204 (\res => [FILE_IO (case res of
196205 True => OpenFile m
197206 False => ())])
@@ -207,7 +216,7 @@ we continue the protocol accordingly.
207216
208217 readFile : Eff (List String) [FILE_IO (OpenFile Read)]
209218 readFile = readAcc [] where
210− readAcc : List String -> Eff (List String) [FILE_IO (OpenFile Read)]
219+ readAcc : List String -> Eff (List String) [FILE_IO (OpenFile Read)]
211220 readAcc acc = if (not !eof)
212221 then readAcc (!readLine :: acc)
213222 else pure (reverse acc)
docs/effects/impleff.rst+1−1
@@ -144,7 +144,7 @@ functions in ``Eff``, as follows:
144144
145145**An implementation detail (aside):** The ``call`` function converts
146146an ``Effect`` to a function in ``Eff``, given a proof that the effect
147−is available. This proof can be constructed automatically by , since
147+is available. This proof can be constructed automatically, since
148148it is essentially an index into a statically known list of effects:
149149
150150.. code-block:: idris
docs/effects/index.rst+13−1
@@ -6,6 +6,18 @@ The Effects Tutorial
66
77A tutorial on the `Effects` package in `Idris`.
88
9+.. topic:: Effects and the ``Control.ST`` module
10+
11+ There is a new module in the ``contrib`` package, ``Control.ST``, which
12+ provides the resource tracking facilities of `Effects` but with
13+ better support for creating and deleting resources, and implementing
14+ resources in terms of other resources.
15+
16+ Unless you have a particular reason to use `Effects` you are strongly
17+ recommended to use ``Control.ST`` instead. There is a tutorial available
18+ on this site for ``Control.ST`` with several examples
19+ (:ref:`st-tutorial-index`).
20+
921.. note::
1022
1123 The documentation for Idris has been published under the Creative
@@ -13,7 +25,7 @@ A tutorial on the `Effects` package in `Idris`.
1325 Idris Community* has waived all copyright and related or neighbouring
1426 rights to Documentation for Idris.
1527
16− More information concerning the CC0 can be found online at: http://creativecommons.org/publicdomain/zero/1.0/
28+ More information concerning the CC0 can be found online at: https://creativecommons.org/publicdomain/zero/1.0/
1729
1830.. toctree::
1931 :maxdepth: 1
docs/effects/introduction.rst+5−4
@@ -3,7 +3,7 @@ Introduction
33************
44
55Pure functional languages with dependent types such as `Idris
6−<http://www.idris-lang.org/>`_ support reasoning about programs directly
6+<https://www.idris-lang.org/>`_ support reasoning about programs directly
77in the type system, promising that we can *know* a program will run
88correctly (i.e. according to the specification in its type) simply
99because it compiles. Realistically, though, things are not so simple:
@@ -17,7 +17,8 @@ exceptions, and verified resource management.
1717This tutorial assumes familiarity with pure programming in Idris,
1818as described in Sections 1–6 of the main tutorial [1]_. The examples
1919presented are tested with Idris and can be found in the
20−examples directory of the Idris repository.
20+examples directory of the Idris repository. The ``-p effects`` flag
21+is needed when starting Idris.
2122
2223Consider, for example, the following introductory function which
2324illustrates the kind of properties which can be expressed in the type
@@ -53,7 +54,7 @@ this specific example later.
5354Hello world
5455===========
5556
56−To give an idea of how programs with effects look in , here is the
57+To give an idea of how programs with effects look, here is the
5758ubiquitous “Hello world” program, written using the ``Effects``
5859library:
5960
@@ -65,7 +66,7 @@ library:
6566 import Effect.StdIO
6667
6768 hello : Eff () [STDIO]
68− hello = putStrLn “Hello world!”
69+ hello = putStrLn "Hello world!"
6970
7071 main : IO ()
7172 main = run hello
docs/effects/simpleeff.rst+6−5
@@ -212,7 +212,8 @@ from the result of a dynamic check:
212212
213213.. code-block:: idris
214214
215− data So : Bool -> Type = Oh : So True
215+ data So : Bool -> Type where
216+ Oh : So True
216217
217218 choose : (b : Bool) -> Either (So b) (So (not b))
218219
@@ -495,8 +496,8 @@ values:
495496 Env = List (String, Integer)
496497
497498 eval : Expr -> Eff Integer [EXCEPTION String, STATE Env]
498− eval (Val x) = return x
499− eval (Add l r) = return $ !(eval l) + !(eval r)
499+ eval (Val x) = pure x
500+ eval (Add l r) = pure $ !(eval l) + !(eval r)
500501
501502Note that we are using ``!``-notation to avoid having to bind
502503subexpressions in a ``do`` block. Next, we add a case for evaluating
@@ -506,7 +507,7 @@ subexpressions in a ``do`` block. Next, we add a case for evaluating
506507
507508 eval (Var x) = case lookup x !get of
508509 Nothing => raise $ "No such variable " ++ x
509− Just val => return val
510+ Just val => pure val
510511
511512This retrieves the state (with ``get``, supported by the ``STATE Env``
512513effect) and raises an exception if the variable is not in the
@@ -559,7 +560,7 @@ has been generated:
559560
560561 eval (Random upper) = do val <- rndInt 0 upper
561562 putStrLn (show val)
562− return val
563+ pure val
563564
564565If we try this without extending the effects list, we would see an
565566error something like the following:
docs/effects/state.rst+1−1
@@ -452,7 +452,7 @@ There are the following three versions:
452452 TransEff.Eff : (t : Type) -> (input_effs : List EFFECT) ->
453453 (output_effs : List EFFECT) -> Type
454454 DepEff.Eff : (t : Type) -> (input_effs : List EFFECT) ->
455− (output_effs_fn : x -> List EFFECT) -> Type
455+ (output_effs_fn : t -> List EFFECT) -> Type
456456
457457So far, we have used only the first version, ``SimpleEff.Eff``, which
458458is defined as follows:
docs/effects/summary.rst+23−23
@@ -43,16 +43,16 @@ FILE\_IO
4343 data OpenFile : Mode -> Type
4444
4545 open : (fname : String)
46− -> (m : Mode)
47− -> Eff Bool [FILE_IO ()]
48− (\res => [FILE_IO (case res of
49− True => OpenFile m
50− False => ())])
46+ -> (m : Mode)
47+ -> Eff Bool [FILE_IO ()]
48+ (\res => [FILE_IO (case res of
49+ True => OpenFile m
50+ False => ())])
5151 close : Eff () [FILE_IO (OpenFile m)] [FILE_IO ()]
5252
53− readLine : Eff String [FILE_IO (OpenFile Read)]
53+ readLine : Eff String [FILE_IO (OpenFile Read)]
5454 writeLine : String -> Eff () [FILE_IO (OpenFile Write)]
55− eof : Eff Bool [FILE_IO (OpenFile Read)]
55+ eof : Eff Bool [FILE_IO (OpenFile Read)]
5656
5757 Handler FileIO IO where { ... }
5858
@@ -69,9 +69,9 @@ RND
6969
7070 RND : EFFECT
7171
72− srand : Integer -> Eff m () [RND]
73− rndInt : Integer -> Integer -> Eff m Integer [RND]
74− rndFin : (k : Nat) -> Eff m (Fin (S k)) [RND]
72+ srand : Integer -> Eff () [RND]
73+ rndInt : Integer -> Integer -> Eff Integer [RND]
74+ rndFin : (k : Nat) -> Eff (Fin (S k)) [RND]
7575
7676 Handler Random m where { ... }
7777
@@ -86,7 +86,7 @@ SELECT
8686
8787 SELECT : EFFECT
8888
89− select : List a -> Eff m a [SELECT]
89+ select : List a -> Eff a [SELECT]
9090
9191 Handler Selection Maybe where { ... }
9292 Handler Selection List where { ... }
@@ -102,10 +102,10 @@ STATE
102102
103103 STATE : Type -> EFFECT
104104
105− get : Eff m x [STATE x]
106− put : x -> Eff m () [STATE x]
107− putM : y -> Eff m () [STATE x] [STATE y]
108− update : (x -> x) -> Eff m () [STATE x]
105+ get : Eff x [STATE x]
106+ put : x -> Eff () [STATE x]
107+ putM : y -> Eff () [STATE x] [STATE y]
108+ update : (x -> x) -> Eff () [STATE x]
109109
110110 Handler State m where { ... }
111111
@@ -121,12 +121,12 @@ STDIO
121121
122122 STDIO : EFFECT
123123
124− putChar : Handler StdIO m => Char -> Eff m () [STDIO]
125− putStr : Handler StdIO m => String -> Eff m () [STDIO]
126− putStrLn : Handler StdIO m => String -> Eff m () [STDIO]
124+ putChar : Char -> Eff () [STDIO]
125+ putStr : String -> Eff () [STDIO]
126+ putStrLn : String -> Eff () [STDIO]
127127
128− getStr : Handler StdIO m => Eff m String [STDIO]
129− getChar : Handler StdIO m => Eff m Char [STDIO]
128+ getStr : Eff String [STDIO]
129+ getChar : Eff Char [STDIO]
130130
131131 Handler StdIO IO where { ... }
132132 Handler StdIO (IOExcept a) where { ... }
@@ -144,9 +144,9 @@ SYSTEM
144144
145145 SYSTEM : EFFECT
146146
147− getArgs : Handler System e => Eff e (List String) [SYSTEM]
148− time : Handler System e => Eff e Int [SYSTEM]
149− getEnv : Handler System e => String -> Eff e (Maybe String) [SYSTEM]
147+ getArgs : Eff (List String) [SYSTEM]
148+ time : Eff Int [SYSTEM]
149+ getEnv : String -> Eff (Maybe String) [SYSTEM]
150150
151151 Handler System IO where { ... }
152152 Handler System (IOExcept a) where { ... }
docs/elaboratorReflection/elabReflection.rstnew file+60
@@ -0,0 +1,60 @@
1+Extending Idris using Elaborator Reflection
2+===========================================
3+
4+Idris provides a mechanism to modify the language without having to recompile Idris itself. We can think of this in terms of metaprogramming or domain specific languages or just building in new capabilities.
5+
6+In order to extend the language we need to know something about how Idris is compiled. This page explains only what is needed to customise the elaboration. For more information about the compiler's implementation see `Edwin Brady's 2013 paper`_ and for customising the elaboration process see `Elaborator reflection: extending Idris in Idris`_ and `David Christiansen's PhD thesis`_.
7+
8+Compilation of Idris proceeds through a number of stages.
9+
10+- First, Idris is desugared by inserting placeholders for terms to be guessed by the compiler and replacing certain syntactic forms, such as do-notation, with the functions that implement them.
11+- Then, this desugared Idris is translated into a much simpler core language, called TT. This translation process is called elaboration.
12+- Finally, TT is type checked a second time to rule out errors, and then compiled into the target language.
13+
14+.. image:: ../image/idrisTopLevel.png
15+ :width: 484px
16+ :height: 147px
17+ :alt: diagram illustrating these stages of Idris compilation
18+
19+TT is a core language which is syntactically very simple. This makes it easy for computers to process but very verbose and hard for humans to read. The Idris elaborator is written in Haskell using an elaboration library that was inspired by the tactics in interactive proof assistants such as Coq.
20+
21+.. list-table::
22+
23+ * - There are some similarities with a proof assistant but in Idris the elaborator is an interpreter of Idris source in the elaboration monad, where each syntactic construct of Idris is interpreted as a sequence of tactics.
24+ - .. image:: ../image/compareToProofAssist.png
25+ :width: 206px
26+ :height: 112px
27+ :alt: diagram comparing elaboration with proof assistant
28+
29+The primitives in the elaboration library are not just useful for the implementors of Idris itself. They can also be used by authors of extensions to the compiler, using a mechanism known as elaborator reflection.
30+During elaboration TT (Raw) structure contains:
31+
32+- holes - placeholders for terms that have not yet been filled in.
33+- guesses - similar to let bindings, except with no reduction rule, so that elaboration programs can control the precise shape of terms that are under construction.
34+
35+For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs by McBride 1999`_.
36+
37+The following diagram is intended to illustrate a high level view of the tactics and how this eventually results in the TT language being generated. It is not necessary to understand the details at this stage. The intention is to help build up some intuition so that, when we get into the details, we can recognise how this fits into the big picture.
38+
39+.. image:: ../image/elabOverview.png
40+ :width: 410px
41+ :height: 282px
42+ :alt: diagram illustrating overview of TT language being generated from tactics.
43+
44+As already mentioned the TT core language is kept syntactically very simple, for instance, here are the binders in TT with corresponding code and logic type validity rules:
45+
46+.. list-table::
47+
48+ * - This diagram illustrates the basis of the compilation process in logic (in this case for binders). It is not necessary to be an expert logician to understand elaborator reflection. However, when learning about tactics, they may appear arbitrary without knowing some theory. For more information about this see `Edwin Brady's 2013 paper`_.
49+ - .. image:: ../image/binders.png
50+ :width: 310px
51+ :height: 203px
52+ :alt: diagram illustrating basis of code in logic
53+
54+.. target-notes::
55+.. _`Edwin Brady's 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf
56+.. _`Elaborator reflection: extending Idris in Idris`: https://dl.acm.org/citation.cfm?doid=2951913.2951932
57+.. _`David Christiansen's PhD thesis`: https://davidchristiansen.dk/david-christiansen-phd.pdf
58+.. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374
59+
60+
docs/reference/elaborator-reflection.rst → docs/elaboratorReflection/elaborator-reflection.rstrenamed+19−7
@@ -1,12 +1,13 @@
11.. _elaborator-reflection:
22
3−*********************
4−Elaborator Reflection
5−*********************
3+**********************************
4+Elaborator Reflection Introduction
5+**********************************
66
77The Idris elaborator is responsible for converting high-level Idris code into the core language.
88It is implemented as a kind of embedded tactic language in Haskell, where tactic scripts are written in an *elaboration monad* that provides error handling and a proof state.
9−For details, see Edwin Brady's 2013 paper in the Journal of Functional Programming.
9+For details, see `Edwin Brady's 2013 paper in the Journal of Functional
10+Programming <https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf>`_.
1011
1112Elaborator reflection makes the elaboration type as well as a selection of its tactics available to Idris code.
1213This means that metaprograms written in Idris can have complete control over the elaboration process, generating arbitrary code, and they have access to all of the facilities available in the elaborator, such as higher-order unification, type checking, and emitting auxiliary definitions.
@@ -32,6 +33,9 @@ Running Elaborator Scripts
3233
3334On their own, tactics have no effect.
3435The meta-operation ``%runElab script`` runs ``script`` in the current elaboration context.
36+Before you can use ``%runElab``, you will have to enable the language extension by adding
37+``%language ElabReflection`` in your file (or by passing ``-X ElabReflection`` to the
38+``idris`` executable from your command line).
3539For example, the following script constructs the identity function at type ``Nat``:
3640
3741.. code-block:: idris
@@ -88,7 +92,9 @@ that fills the hole.
8892
8993The interactive elaboration shell accepts a limited number of commands,
9094including a subset of the commands understood by the normal Idris REPL
91−as well as some elaboration-specific commands.
95+as well as some elaboration-specific commands. It also supports the
96+``do``-syntax, meaning you can write ``res <- command`` to bind the result of
97+``command`` to variable ``res``.
9298
9399General-purpose commands:
94100
@@ -192,6 +198,12 @@ This is primarily useful for code generation, particularly for generating patter
192198
193199Learn More
194200==========
195−While this documentation is still incomplete, elaboration reflection works in Idris today.
196−As you wait for the completion of the documentation, the list of built-in tactics can be obtained using the ``:browse`` command in an Idris REPL or the corresponding feature in one of the graphical IDE clients to explore the ``Language.Reflection.Elab.Tactics`` namespace.
201+
202+Some tactics are introduced in the :ref:`proofs-index` section with further details, of those most relevant to elaborator reflection, on the following pages.
203+
204+The list of built-in tactics can be obtained using the ``:browse`` command in an Idris REPL or the corresponding feature in one of the graphical IDE clients to explore the ``Language.Reflection.Elab.Tactics`` namespace.
197205All of the built-in tactics contain documentation strings.
206+
207+For alternative ways to extend the Idris language see the :ref:`reference-index` section.
208+
209+The following pages explain more about the theory and practice of elaborator reflection.
docs/elaboratorReflection/example1.rstnew file+192
@@ -0,0 +1,192 @@
1+Elaborator Reflection - Identity Example
2+========================================
3+
4+.. list-table::
5+
6+ * - This example of elaborator reflection steps through this metaprogram that generates the identity function:
7+ - .. code-block:: idris
8+
9+ %language ElabReflection
10+
11+ idNat : Nat -> Nat
12+ idNat = %runElab (do intro `{{x}}
13+ fill (Var `{{x}})
14+ solve)
15+
16+.. list-table::
17+ :widths: 200 100
18+
19+ * - At the beginning of executing the elaboration script, the initial state consists of a single hole of type Nat -> Nat.
20+
21+ As a first approximation, the state consists of a term with holes in it, an indicator of which hole is focused, a queue of the next holes to focus on, and miscellaneous information like a source of fresh names. The intro tactic modifies this state, replacing the focused hole with a lambda and focusing on the lambda's body.
22+ - .. image:: ../image/tree.png
23+ :width: 119px
24+ :height: 109px
25+
26+The following is a walkthough looking at the state after each tactic:
27+
28+.. list-table::
29+
30+ * - Start with the type signature like this:
31+ - .. code-block:: idris
32+
33+ %language ElabReflection
34+
35+ idNat : Nat -> Nat
36+ idNat = %runElab (do
37+
38+ * - In order to investigate how the program works this table shows the proof state at each stage as the tactics are applied. So here is the proof state at the start:
39+ - .. image:: ../image/elabProofStateEx1_1.png
40+ :width: 310px
41+ :height: 115px
42+
43+ * - This table shows the hole types and what they depend on. The aim is to illustrate the types by analogy with proofs, as a line with the premises above it and the conclusion below it.
44+ - .. image:: ../image/elabLogicEx1_1.png
45+ :width: 277px
46+ :height: 15px
47+
48+ * - The term is:
49+ - ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0}
50+
51+ * - It is possible to read the state from the script by calling getEnv, getGoal and getHoles.
52+
53+ - The output of these calls contain structures with TT code. To show the results I hacked this: `my code`_. TT code is not really designed to be readable by humans, all the names are fully expanded, everything has a type down to universes (type of types). This is shown here to illustrate the information available.
54+
55+ .. code-block:: idris
56+
57+ getEnv=[]
58+
59+ getGoal=(hole_2, __pi_arg:(Nat.["Nat", "Prelude"]:{
60+ type constructor tag=8 number=0}.Type:U=(20:./Prelude/Nat.idr)->.
61+ {name ref{type constructor tag=8 number=0}Nat.["Nat","Prelude"]:
62+ Type:U=(20:./Prelude/Nat.idr)
63+ })
64+ })
65+
66+ getHoles=[{hole_2},{hole_0}]
67+
68+ * - getGuess
69+ - error no guess
70+
71+ * - Introduce a lambda binding around the current hole and focus on the body.
72+ - intro \`{{x}}
73+
74+ * - The state now looks like this:
75+ - .. image:: ../image/elabProofStateEx1_2.png
76+ :width: 312px
77+ :height: 84px
78+
79+ * - The hole types now looks like this:
80+ - .. image:: ../image/elabLogicEx1_2.png
81+ :width: 279px
82+ :height: 26px
83+
84+ * - The term now looks like this:
85+ - ?{hole_0} ≈ λ x . ? {hole_2} . {hole_2} . {hole_0}
86+
87+ * - Again we can check the state by calling getEnv, getGoal and getHoles: see `my code`_
88+
89+ - .. code-block:: idris
90+
91+ getEnv=[(x, {λ (Nat.["Nat", "Prelude"]:{
92+ type constructor tag=8 number=0}).
93+ Type:U=(20:./Prelude/Nat.idr)
94+ })]
95+
96+ getGoal=(hole_2, {name ref{type constructor tag=8 number=0}
97+ Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr)
98+ })
99+
100+ getHoles=[{hole_2},{hole_0}]
101+
102+ * - getGuess
103+ - error no guess
104+
105+ * - Place a term into a hole, unifying its type
106+ - fill (Var \`{{x}})
107+
108+ * - The state still looks like this:
109+ - .. image:: ../image/elabProofStateEx1_3.png
110+ :width: 312px
111+ :height: 57px
112+
113+ * - The hole types now looks like this:
114+ - .. image:: ../image/elabLogicEx1_3.png
115+ :width: 290px
116+ :height: 26px
117+
118+ * - The term now looks like this:
119+ - ?{hole_0} ≈ λ x . ?{hole_2} ≈ x . {hole_2} . {hole_0}
120+
121+ * - Again we can check the state by calling getEnv, getGoal and getHoles: see `my code`_
122+
123+ - .. code-block:: idris
124+
125+ getEnv=[(x, {λ (Nat.["Nat", "Prelude"]:
126+ {type constructor tag=8 number=0}).
127+ Type:U=(20:./Prelude/Nat.idr)
128+ })]
129+
130+ getGoal=(hole_2, {name ref{type constructor tag=8 number=0}
131+ Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr)
132+ })
133+
134+ getHoles=[{hole_2}, {hole_0}]
135+
136+ * - getGuess
137+ - .. code-block:: idris
138+
139+ {name ref bound x:
140+ {name ref{type constructor tag=8 number=0}
141+ Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr)
142+ }
143+ }
144+
145+ * - Substitute a guess into a hole.
146+ - solve
147+
148+ * - The hole types now looks like this:
149+ - .. image:: ../image/elabLogicEx1_4.png
150+ :width: 131px
151+ :height: 14px
152+
153+ * - The term now looks like this:
154+ - ?{hole_0} ≈ λ x . x . {hole_0}
155+
156+ * - getEnv
157+
158+ getGoal
159+
160+ getHoles
161+
162+ - .. code-block:: idris
163+
164+ getEnv=[]
165+
166+ getGoal=(hole_0, __pi_arg:(Nat.["Nat", "Prelude"]:{
167+ type constructor tag=8 number=0}.
168+ Type:U=(20:./Prelude/Nat.idr)
169+ ->.{name ref
170+ {type constructor tag=8 number=0}
171+ Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr)
172+ })
173+ })
174+
175+ getHoles=[{hole_0}]
176+
177+ * - getGuess
178+ - .. code-block:: idris
179+
180+ x:({λ (Nat.["Nat", "Prelude"]:{
181+ type constructor tag=8 number=0}).
182+ Type:U=(20:./Prelude/Nat.idr)
183+ }.{
184+ name ref bound
185+ x:{name ref {type constructor tag=8 number=0}
186+ Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr)
187+ }
188+ })
189+ }
190+
191+.. target-notes::
192+.. _`my code`: https://github.com/martinbaker/Idris-dev/blob/uglyTTPrinter/libs/prelude/Language/Reflection/TTPrinter.idr
docs/elaboratorReflection/generatingData.rstnew file+385
@@ -0,0 +1,385 @@
1+Generating Datatypes and Functions at Compile Time
2+==================================================
3+
4+Program elements, such as datatypes and functions can be constructed at compile-time in the Elab monad.
5+This can allow proofs to be generated for user defined types or it could allow types to be automatically generated to support user defined types.
6+An example is the code, from `Elaborator reflection: extending Idris in Idris`_, that automatically generates accessibility predicates using the Bove-Capretta method.
7+
8+Generating Datatypes
9+--------------------
10+
11+There are two main 'tactics' associated with generating datatypes:
12+
13+- declareDatatype
14+- defineDatatype
15+
16+Which declare and define the datatype as the names suggest.
17+
18+.. list-table::
19+
20+ * - These 'tactics' and the data structures associated with them are listed in the tables later on this page, for now, here is a summary:
21+ - .. image:: ../image/generateDatatype.png
22+ :width: 332px
23+ :height: 246px
24+ :alt: diagram illustrating data structures associated with declareDatatype defineDatatype.
25+
26+.. list-table::
27+
28+ * - As a first example, the following boolean-like type can be constructed. When the compiler has run it will be available to us as if we had compiled it in the usual way:
29+ - .. code-block:: idris
30+
31+ λΠ> :printdef Two
32+ data Two : Type where
33+ F : Two
34+ T : Two
35+
36+This was generated by the following code:
37+
38+.. code-block:: idris
39+
40+ module TwoDef
41+ %language ElabReflection
42+
43+ addTwo : Elab ()
44+ addTwo = do let twoname : TTName = `{{TwoDef.Two}}
45+ let F2 = `{{TwoDef.F}}
46+ let T2 = `{{TwoDef.T}}
47+ declareDatatype $ Declare twoname [] `(Type)
48+ defineDatatype $ DefineDatatype twoname [
49+ Constructor `{{F}} [] (Var `{{TwoDef.Two}}),
50+ Constructor `{{T}} [] (Var `{{TwoDef.Two}})
51+ ]
52+
53+ %runElab addTwo
54+
55+.. list-table::
56+
57+ * - The constructors T and F can be called as would be expected:
58+ - .. code-block:: idris
59+
60+ λΠ> F
61+ F : Two
62+ λΠ> T
63+ T : Two
64+
65+Generating Functions
66+--------------------
67+
68+There are two main 'tactics' associated with generating functions:
69+
70+- declareType
71+- defineFunction
72+
73+Which declare and define the function as the names suggest.
74+
75+.. list-table::
76+
77+ * - These 'tactics' and the data structures associated with them are listed in the tables later on this page, for now, here is a summary:
78+ - .. image:: ../image/generateFunction.png
79+ :width: 332px
80+ :height: 246px
81+ :alt: diagram illustrating data structures associated with function declare and define.
82+
83+Note: The left hand side (lhs) and right hand side (rhs) of FunClause typically is of type 'Raw'.
84+
85+.. list-table::
86+
87+ * - Bound pattern variables are represented by 'PVar' binders:
88+ This diagram shows an example of a possible Raw structure that might be used in a function definition.
89+ - .. image:: ../image/generateFunction2.png
90+ :width: 264px
91+ :height: 239px
92+ :alt: diagram illustrating data structures associated with functions.
93+
94+.. list-table::
95+
96+ * - Some function definitions can now be added to the above datatype. This is what they will look like:
97+ - .. code-block:: idris
98+
99+ λΠ> :printdef perm1
100+ perm1 : Two -> Two
101+ perm1 F = F
102+ perm1 T = T
103+ λΠ> :printdef perm2
104+ perm2 : Two -> Two
105+ perm1 F = T
106+ perm1 T = F
107+
108+This was generated with the following code:
109+
110+.. code-block:: idris
111+
112+ let perm1 = `{{TwoDef.perm1}}
113+ declareType (Declare perm1 [MkFunArg `{{code}} (Var twoname) Explicit NotErased] (Var twoname))
114+ defineFunction $ DefineFun perm1 [
115+ MkFunClause (RApp (Var perm1) (Var `{{TwoDef.F}})) (Var F2),
116+ MkFunClause (RApp (Var perm1) (Var `{{TwoDef.T}})) (Var T2)
117+ ]
118+
119+ let perm2 = `{{TwoDef.perm2}}
120+ declareType (Declare perm2 [MkFunArg `{{code}} (Var twoname) Explicit NotErased] (Var twoname))
121+ defineFunction $ DefineFun perm2 [
122+ MkFunClause (RApp (Var perm1) (Var `{{TwoDef.F}})) (Var T2),
123+ MkFunClause (RApp (Var perm1) (Var `{{TwoDef.T}})) (Var F2)
124+ ]
125+
126+.. list-table::
127+
128+ * - This is what happens when we call the functions:
129+ - .. code-block:: idris
130+
131+ λΠ> perm1 F
132+ F : Two
133+ λΠ> perm1 T
134+ T : Two
135+ λΠ> perm2 F
136+ T : Two
137+ λΠ> perm2 T
138+ F : Two
139+
140+So far these datatypes and functions could have been written, statically, in the usual way. However, it is possible to imagine situations where we may need a lot of functions to be generated automatically at compile time. For example, if we extend this Boolean datatype to a datatype with more simple constructors (a finite set), we could generate a function for every possible permutation of that datatype back to itself.
141+
142+A Different Example which has Type Parameters
143+---------------------------------------------
144+
145+.. list-table::
146+
147+ * - Here is an example of a datatype with type parameters:
148+ - .. code-block:: idris
149+
150+ data N : Nat -> Type where
151+ MkN : N x
152+ MkN' : (x : Nat) -> N (S x)
153+
154+This was produced by the following code:
155+
156+.. code-block:: idris
157+
158+ module DataDef
159+ %language ElabReflection
160+
161+ addData : Elab ()
162+ addData = do
163+ let dataname : TTName = `{{DataDef.N}}
164+ declareDatatype $ Declare dataname [MkFunArg `{{n}} `(Nat) Explicit NotErased] `(Type)
165+ defineDatatype $ DefineDatatype dataname [
166+ Constructor `{{MkN}} [MkFunArg `{{x}} `(Nat) Implicit NotErased]
167+ (RApp (Var dataname) (Var `{{x}})),
168+ Constructor `{{MkN'}} [MkFunArg `{{x}} `(Nat) Explicit NotErased]
169+ (RApp (Var dataname) (RApp (Var `{S}) (Var `{{x}})))
170+ ]
171+
172+ %runElab addData
173+
174+So this declares and defines the following data structure 'N' with a constructor 'MkN' which can have an implicit or an explicit Nat argument. Which can be used like this:
175+
176+.. code-block:: idris
177+
178+ λΠ> :t N
179+ N : Nat -> Type
180+ λΠ> N 2
181+ N 2 : Type
182+ λΠ> N 0
183+ N 0 : Type
184+ λΠ> :t MkN
185+ MkN : N x
186+
187+Table of 'tactics' for Generating Data and Functions
188+----------------------------------------------------
189+
190+These are the functions that we can use to create data and functions in the Elab monad:
191+
192+.. list-table::
193+ :widths: 10 30
194+ :stub-columns: 1
195+
196+ * - declareType
197+ - Add a type declaration to the global context.
198+
199+ Signature:
200+
201+ declareType : TyDecl -> Elab ()
202+ * - defineFunction
203+ - Define a function in the global context. The function must have already been declared, either in ordinary Idris code or using `declareType`.
204+
205+ Signature:
206+
207+ defineFunction : FunDefn Raw -> Elab ()
208+
209+ * - declareDatatype
210+ - Declare a datatype in the global context. This step only establishes the type constructor; use `defineDatatype` to give it constructors.
211+
212+ Signature:
213+
214+ declareDatatype : TyDecl -> Elab ()
215+
216+ * - defineDatatype
217+ - Signature:
218+
219+ defineDatatype : DataDefn -> Elab ()
220+
221+ * - addImplementation
222+ - Register a new implementation for interface resolution.
223+
224+ Arguments:
225+
226+ - ifaceName the name of the interface for which an implementation is being registered
227+ - implName the name of the definition to use in implementation search
228+
229+ Signature:
230+
231+ addImplementation : (ifaceName, implName : TTName) -> Elab ()
232+
233+ * - isTCName
234+ - Determine whether a name denotes an interface.
235+
236+ Arguments:
237+
238+ - name - a name that might denote an interface.
239+
240+ Signature:
241+
242+ isTCName : (name : TTName) -> Elab Bool
243+
244+Table of Datatypes Associated with Generating Data and Functions
245+----------------------------------------------------------------
246+
247+The above functions use the following data/records:
248+
249+.. list-table::
250+ :widths: 10 30
251+ :stub-columns: 1
252+
253+ * - Plicity
254+ - How an argument is provided in high-level Idris
255+
256+ .. code-block:: idris
257+
258+ data Plicity=
259+ ||| The argument is directly provided at the application site
260+ Explicit |
261+ ||| The argument is found by Idris at the application site
262+ Implicit |
263+ ||| The argument is solved using interface resolution
264+ Constraint
265+
266+ * - FunArg
267+ - Function arguments
268+
269+ These are the simplest representation of argument lists, and are used for functions. Additionally, because a FunArg provides enough
270+ information to build an application, a generic type lookup of a top-level identifier will return its FunArgs, if applicable.
271+
272+ .. code-block:: idris
273+
274+ record FunArg where
275+ constructor MkFunArg
276+ name : TTName
277+ type : Raw
278+ plicity : Plicity
279+ erasure : Erasure
280+
281+ * - TyConArg
282+ - Type constructor arguments
283+
284+ Each argument is identified as being either a parameter that is
285+
286+ consistent in all constructors, or an index that varies based on
287+
288+ which constructor is selected.
289+
290+ .. code-block:: idris
291+
292+ data TyConArg =
293+ ||| Parameters are uniform across the constructors
294+ TyConParameter FunArg |
295+ ||| Indices are not uniform
296+ TyConIndex FunArg
297+
298+ * - TyDecl
299+ - A type declaration for a function or datatype
300+
301+ .. code-block:: idris
302+
303+ record TyDecl where
304+ constructor Declare
305+ ||| The fully-qualified name of the function or datatype being declared.
306+ name : TTName
307+ ||| Each argument is in the scope of the names of previous arguments.
308+ arguments : List FunArg
309+ ||| The return type is in the scope of all the argument names.
310+ returnType : Raw
311+
312+ * - FunClause
313+ - A single pattern-matching clause
314+
315+ .. code-block:: idris
316+
317+ data FunClause : Type -> Type where
318+ MkFunClause : (lhs, rhs : a) -> FunClause a
319+ MkImpossibleClause : (lhs : a) -> FunClause a
320+
321+ * - FunDefn
322+ - A reflected function definition.
323+
324+ .. code-block:: idris
325+
326+ record FunDefn a where
327+ constructor DefineFun
328+ name : TTName
329+ clauses : List (FunClause a)
330+
331+ * - ConstructorDefn
332+ - A constructor to be associated with a new datatype.
333+
334+ .. code-block:: idris
335+
336+ record ConstructorDefn where
337+ constructor Constructor
338+ ||| The name of the constructor. The name must _not_ be qualified -
339+ ||| that is, it should begin with the `UN` or `MN` constructors.
340+ name : TTName
341+ ||| The constructor arguments. Idris will infer which arguments are
342+ ||| datatype parameters.
343+ arguments : List FunArg
344+ ||| The specific type constructed by the constructor.
345+ returnType : Raw
346+
347+ * - DataDefn
348+ - A definition of a datatype to be added during an elaboration script.
349+
350+ .. code-block:: idris
351+
352+ record DataDefn where
353+ constructor DefineDatatype
354+ ||| The name of the datatype being defined. It must be
355+ ||| fully-qualified, and it must have been previously declared as a
356+ ||| datatype.
357+ name : TTName
358+ ||| A list of constructors for the datatype.
359+ constructors : List ConstructorDefn
360+
361+ * - CtorArg
362+ - CtorParameter
363+
364+ .. code-block:: idris
365+
366+ data CtorArg = CtorParameter FunArg | CtorField FunArg
367+
368+ * - Datatype
369+ - A reflected datatype definition
370+
371+ .. code-block:: idris
372+
373+ record Datatype where
374+ constructor MkDatatype
375+ ||| The name of the type constructor
376+ name : TTName
377+ ||| The arguments to the type constructor
378+ tyConArgs : List TyConArg
379+ ||| The result of the type constructor
380+ tyConRes : Raw
381+ ||| The constructors for the family
382+ constructors : List (TTName, List CtorArg, Raw)</td>
383+
384+.. target-notes::
385+.. _`Elaborator reflection: extending Idris in Idris`: https://dl.acm.org/citation.cfm?doid=2951913.2951932
docs/elaboratorReflection/holes.rstnew file+196
@@ -0,0 +1,196 @@
1+Elaborator Reflection - Holes
2+=============================
3+
4+The process of doing proofs and elaborator reflection tends to involve stating with a desired conclusion and working back to known premises. This often needs intermediate sub-goals which may only be partially solved, these are encoded using 'holes' and 'guesses'.
5+
6+* A hole is a term (an expression - a chunk of code) which is yet to be determined. We do have information about its type (this process tends to be type driven).
7+* A guess is like a hole that is not yet bound.
8+
9+The theory around this was developed in `Dependently Typed Functional Programs and their Proofs by McBride 1999`_.
10+
11+Notation for Holes and Guesses
12+------------------------------
13+
14+There is a notation used in the McBride 1999 thesis which is adapted for the TT language. When working on elaborator reflection it is useful to know this notation, for instance when reading the output of the 'debug' tactic.
15+
16+* A focused hole is notated like this ?x:t . t
17+* A guess is notated like this ?x ≈ t:t . t
18+
19+The following example shows how this is used:
20+
21+Simple Example
22+--------------
23+
24+Start with a code file that just contains:
25+
26+.. code-block:: idris
27+
28+ %language ElabReflection
29+
30+ testFn : Nat
31+ testFn = %runElab (do debug {a = ()})
32+
33+when this is loaded the following is displayed:
34+
35+.. code-block:: idris
36+
37+ Holes:
38+ ----------------------------------
39+ {hole_2} : Prelude.Nat.Nat
40+
41+ ----------------------------------
42+ {hole_0} : Prelude.Nat.Nat
43+
44+ Term:
45+ ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0}
46+
47+This shows information about the state when debug is encountered, during tactic execution, which allows us to investigate what is happening at each stage.
48+
49+* The "Holes" part shows the types of the holes and the local context of each
50+* The "Term" part shows where these holes are in the expression being constructed.
51+
52+So starting with the "Term" part we have.
53+
54+.. code-block:: idris
55+
56+ ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0}
57+
58+.. sidebar:: attack tactic
59+
60+ This kind of thing tends to arise from "attack", which helps keep binding forms in order.
61+
62+The meaning of this is not immediately apparent so it helps to add some parentheses to make the structure clearer:
63+
64+.. code-block:: idris
65+
66+ (?{hole_0} ≈ (? {hole_2} . {hole_2}) . {hole_0})
67+
68+First lets look at the inner part:
69+
70+.. code-block:: idris
71+
72+ ? {hole_2} . {hole_2}
73+
74+We can substitute in the type from the "Holes" part:
75+
76+.. code-block:: idris
77+
78+ ? {hole_2}:Nat . {hole_2}:Nat
79+
80+So we are looking for a hole of type Nat and all we know is it has type Nat.
81+
82+Going back to the full term, the above is wrapped in a guess, so it means: 'a guess that is itself a hole'.
83+
84+Since the elaborator does not have any further information it has to be given a value:
85+
86+.. code-block:: idris
87+
88+ %language ElabReflection
89+
90+ testFn : Nat
91+ testFn = %runElab (do fill `(Z)
92+ debug {a = ()}
93+ solve)
94+
95+Now we have a guess for hole_2 which is itself a guess for hole_0:
96+
97+.. code-block:: idris
98+
99+ ?{hole_0} ≈ ?{hole_2} ≈ Prelude.Nat.Z . {hole_2} . {hole_0}
100+
101+The guesses can be accepted by calling the 'solve' tactic.
102+
103+Example Showing Patterns
104+------------------------
105+
106+In this next example a parameter 'n' has been added to the function. This allows us to see how patterns are used. Starting with this file:
107+
108+.. code-block:: idris
109+
110+ %language ElabReflection
111+
112+ testFn : Nat -> Nat
113+ testFn n = %runElab (do debug {a = ()})
114+
115+when loaded gives:
116+
117+.. code-block:: idris
118+
119+ Holes:
120+ n : Prelude.Nat.Nat
121+ ----------------------------------
122+ {hole_3} : Prelude.Nat.Nat
123+
124+ n : Prelude.Nat.Nat
125+ ----------------------------------
126+ {hole_1} : Prelude.Nat.Nat
127+
128+ ----------------------------------
129+ {hole_0} : patTy n : Prelude.Nat.Nat . Prelude.Nat.Nat
130+
131+ Term:
132+ ?{hole_0} ≈ pat n : Prelude.Nat.Nat .
133+ ?{hole_1} ≈ ? {hole_3} . {hole_3} . {hole_1} .
134+ {hole_0}
135+
136+The ns above the lines show the context of the holes on the right hand side - they include the variable n that is an argument!
137+
138+patTy is a binding form in Idris's core language that introduces a pattern variable. The idea is that the left-hand side and right-hand side of each pattern should have the same type. Because pattern variables may occur multiple times on either side of the equation, we can achieve this by documenting their types with a binding form that wraps each side. This new binding form is why an "attack" was necessary prior to elaborating the RHS.
139+
140+patTy is a type former, and pat is the corresponding introduction form. So you can think of patTy as being a bit like a dependent function type, and pat as being a bit like lambda, except they don't introduce functions (they instead are used for pattern-matching definitions).
141+
142+More Complicated Example
143+------------------------
144+
145+This example does not introduce any new notation but the extra complexity gives a more realistic idea of how it is used. Here we start with this file:
146+
147+.. code-block:: idris
148+
149+ %language ElabReflection
150+
151+ testFn : (n : Nat) -> (n = plus n Z) -> (S n = S (plus n Z))
152+ testFn k ih = %runElab (do debug {a = ()})
153+
154+when loaded gives:
155+
156+.. code-block:: idris
157+
158+ Holes:
159+ k : Prelude.Nat.Nat
160+ ih : = Prelude.Nat.Nat Prelude.Nat.Nat k
161+ (Prelude.Nat.plus k Prelude.Nat.Z)
162+ ----------------------------------
163+ {hole_4} : = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k)
164+ (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z))
165+
166+ k : Prelude.Nat.Nat
167+ ih : = Prelude.Nat.Nat Prelude.Nat.Nat k
168+ (Prelude.Nat.plus k Prelude.Nat.Z)
169+ ----------------------------------
170+ {hole_2} : = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k)
171+ (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z))
172+
173+ k : Prelude.Nat.Nat
174+ ----------------------------------
175+ {hole_1} : patTy ih : = Prelude.Nat.Nat Prelude.Nat.Nat k
176+ (Prelude.Nat.plus k Prelude.Nat.Z) .
177+ = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k)
178+ (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z))
179+
180+ ----------------------------------
181+ {hole_0} : patTy k : Prelude.Nat.Nat .
182+ patTy ih : = Prelude.Nat.Nat Prelude.Nat.Nat k
183+ (Prelude.Nat.plus k Prelude.Nat.Z) .
184+ = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k)
185+ (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z))
186+
187+ Term:
188+ ?{hole_0} ≈ pat k : Prelude.Nat.Nat .
189+ ?{hole_1} ≈ pat ih : = Prelude.Nat.Nat Prelude.Nat.Nat k
190+ (Prelude.Nat.plus k Prelude.Nat.Z) .
191+ ?{hole_2} ≈ ? {hole_4} . {hole_4} . {hole_2} .
192+ {hole_1} .
193+ {hole_0}
194+
195+.. target-notes::
196+.. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374
docs/elaboratorReflection/index.rstnew file+27
@@ -0,0 +1,27 @@
1+.. _elaborator-index:
2+
3+#####################
4+Elaborator Reflection
5+#####################
6+
7+A tutorial on theorem proving in Idris.
8+
9+.. note::
10+
11+ The documentation for Idris has been published under the Creative
12+ Commons CC0 License. As such to the extent possible under law, *The
13+ Idris Community* has waived all copyright and related or neighboring
14+ rights to Documentation for Idris.
15+
16+ More information concerning the CC0 can be found online at: http://creativecommons.org/publicdomain/zero/1.0/
17+
18+.. toctree::
19+ :maxdepth: 1
20+
21+ elaborator-reflection
22+ elabReflection
23+ tactics
24+ holes
25+ example1
26+ primitive
27+ generatingData
docs/elaboratorReflection/primitive.rstnew file+518
@@ -0,0 +1,518 @@
1+Primitive Operators
2+===================
3+
4+.. list-table::
5+ :widths: 10 30
6+ :stub-columns: 1
7+
8+ * - gensym
9+ - Generate a unique name based on some hint.
10+
11+ Useful when establishing a new binder.
12+
13+ **NB**: the generated name is unique **for this run of the elaborator**.
14+
15+ Do not assume that they are globally unique.
16+
17+ Signature:
18+
19+ gensym : (hint : String) -> Elab TTName
20+
21+ * - solve
22+ - Substitute a guess into a hole.
23+
24+
25+ .. image:: ../image/solve.png
26+ :width: 141px
27+ :height: 74px
28+ :alt: diagram illustrating solve tactic
29+
30+
31+ Substitute the focused guess throughout its scope, eliminating it and moving focus to the next element of the hole queue. Fail if the focus is not a guess.
32+
33+ Signature:
34+
35+ solve : Elab ()
36+
37+ Example:
38+
39+ .. code-block:: idris
40+
41+ %language ElabReflection
42+
43+ testFn : Nat
44+ testFn = %runElab (do fill `(Z)
45+ solve)
46+
47+ * - fill
48+ - Place a term into a hole, unifying its type. Fails if the focus is not a hole.
49+
50+
51+ .. image:: ../image/fill.png
52+ :width: 140px
53+ :height: 74px
54+ :alt: diagram illustrating fill tactic
55+
56+
57+ Signature:
58+
59+ fill : (e : Raw) -> Elab ()
60+
61+ Place a term e with type tc into the focused hole:
62+
63+ ?h : th.e'
64+
65+ and convert it to a guess:
66+
67+ ?h ≈ e:t.e'
68+
69+ and fail if the current focus is not a hole. The type t of the guess is constructed by unifying tc and th, which may instantiate holes that they refer to. Fail if the current focus is not a hole or if unification fails.
70+
71+ This unification can result in the solution of further holes or the establishment of additional unsolved unification constraints.
72+
73+ Example:
74+
75+ .. code-block:: idris
76+
77+ %language ElabReflection
78+
79+ testFn : Nat
80+ testFn = %runElab (do fill `(Z)
81+ solve)
82+
83+ * - apply
84+ - Attempt to apply an operator to fill the current hole, potentially solving arguments by unification.
85+
86+ A hole is established for each argument.
87+
88+ The return value is the list of holes established for the arguments to the function.
89+
90+ Note that not all of the returned hole names still exist, as they may have been solved.
91+
92+ - @ op the term to apply
93+ - @ argSpec - A list of booleans, one for each argument that the operator will be applied to. If true then attempt to solve the argument by unification.
94+
95+ Signature:
96+
97+ apply : (op : Raw) -> (argSpec : List Bool) -> Elab (List TTName)
98+
99+ Example: elaborating an application of a function f that takes one implicit and two explicit arguments might invoke:
100+
101+ apply \`(f) [False, True, True]
102+
103+ Here is an example of an elab script that uses apply to insert the term plus Z (S Z) into a goal of type Nat.
104+
105+ .. code-block:: idris
106+
107+ do [x,y] <- apply `(plus) [False, False]
108+ solve
109+ focus x; fill `(Z); solve
110+ focus y; fill `(S Z); solve
111+
112+ The names of the established holes are returned.
113+
114+ Note: This was added to the original tactic language to allow elaborator reflection.
115+
116+ * - matchApply
117+ - Attempt to apply an operator to fill the current hole, potentially solving arguments by matching.
118+
119+ The return value is the list of holes established for the arguments to the function.
120+
121+ Note that not all of the returned hole names still exist, as they may have been solved.
122+
123+ - @ op the term to apply
124+ - @ argSpec instructions for finding the arguments to the term, where the Boolean states whether or not to attempt to solve the argument by matching.
125+
126+ Signature:
127+
128+ matchApply : (op : Raw) -> (argSpec : List Bool) -> Elab (List TTName)
129+
130+ * - focus
131+ - Move the focus to the specified hole, bringing it to the front of the hole queue. Fails if the hole does not exist.
132+
133+ @ hole the hole to focus on
134+
135+ Signature:
136+
137+ focus : (hole : TTName) -> Elab ()
138+
139+ * - unfocus
140+ - Send the currently-focused hole to the end of the hole queue and focus on the next hole.
141+
142+ Signature:
143+
144+ unfocus : TTName -> Elab ()
145+
146+ * - attack
147+ - Convert a hole to make it suitable for bindings.
148+
149+
150+ .. image:: ../image/attack.png
151+ :width: 152px
152+ :height: 70px
153+ :alt: diagram illustrating attack tactic
154+
155+
156+ The binding tactics require that a hole be directly under its binding, or else the scopes of the generated terms won't make sense. This tactic creates a new hole of the proper form, and points the old hole at it.
157+
158+ Signature:
159+
160+ attack : Elab ()
161+
162+ * - claim
163+ - Establish a new hole binding named n with type t, surrounding the current focus.
164+
165+ Introduce a new hole with a specified name and type.
166+
167+ The new hole will be focused, and the previously-focused hole will be immediately after it in the hole queue. Because this tactic introduces a new binding, you may need to 'attack' first.
168+
169+ Signature:
170+
171+ claim : TTName -> Raw -> Elab ()
172+
173+ * - patvar
174+ - Convert a hole into a pattern variable.
175+
176+ Signature:
177+
178+ patvar : TTName -> Elab ()
179+
180+ * - compute
181+ - Normalise the goal.
182+
183+ Often this is not necessary because normanisation is applied during other tactics.
184+
185+ Signature:
186+
187+ compute : Elab ()
188+
189+ * - normalise
190+ - Normalise a term in some lexical environment
191+
192+ - @ env the environment in which to compute (get one of these from `getEnv`)
193+ - @ term the term to normalise
194+
195+ Signature:
196+
197+ normalise : (env : List (TTName, Binder TT)) -> (term : TT) -> Elab TT
198+
199+ * - whnf
200+ - Reduce a closed term to weak-head normal form
201+
202+ @ term the term to reduce
203+
204+ Signature:
205+
206+ whnf : (term : TT) -> Elab TT
207+
208+ * - convertsInEnv
209+ - Check that two terms are convertible in the current context and in some environment.
210+
211+ - @ env a lexical environment to compare the terms in (see `getEnv`)
212+ - @ term1 the first term to convert
213+ - @ term2 the second term to convert
214+
215+ Signature:
216+
217+ convertsInEnv : (env : List (TTName, Binder TT)) -> (term1, term2 : TT) -> Elab ()
218+
219+ * - converts
220+ - Check that two terms are convertable in the current context and environment
221+
222+ - @ term1 the first term to convert
223+ - @ term2 the second term to convertconverts : (term1, term2 : TT) -> Elab ()
224+
225+ converts term1 term2 = convertsInEnv !getEnv term1 term2
226+
227+ * - getSourceLocation
228+ - Find the source context for the elaboration script
229+
230+ Signature:
231+
232+ getSourceLocation : Elab SourceLocation
233+
234+ * - sourceLocation
235+ - Attempt to solve the current goal with the source code
236+
237+ locationsourceLocation : Elab ()
238+
239+ .. code-block:: idris
240+
241+ sourceLocation = do loc <- getSourceLocation
242+ fill (quote loc)
243+ solve
244+
245+ * - currentNamespace
246+ - Get the current namespace at the point of tactic execution. This allows scripts to define top-level names conveniently.
247+
248+ The namespace is represented as a reverse-order list of strings, just as in the representation of names.
249+
250+ Signature:
251+
252+ currentNamespace : Elab (List String)
253+
254+ * - rewriteWith
255+ - Attempt to rewrite the goal using an equality.
256+
257+ The tactic searches the goal for applicable subterms, and constructs a context for `replace` using them. In some cases, this is not possible, and `replace` must be called manually with an appropriate context.
258+
259+ Because this tactic internally introduces a `let` binding, it requires that the hole be immediately under its binder (use 'attack' if it might not be).
260+
261+ Signature:
262+
263+ rewriteWith : Raw -> Elab ()
264+
265+ * - resolveTC
266+ - Attempt to solve the current goal with an interface dictionary
267+
268+ @ fn the name of the definition being elaborated (to prevent Idris from looping)
269+
270+ Signature:
271+
272+ resolveTC : (fn : TTName) -> Elab ()
273+
274+ * - search
275+ - Use Idris's internal proof search.
276+
277+ Signature:
278+
279+ search : Elab ()
280+
281+ * - search'
282+ - Use Idris's internal proof search, with more control.
283+
284+ - @ depth the search depth
285+ - @ hints additional names to try
286+
287+ Signature:
288+
289+ search' : (depth : Int) -> (hints : List TTName) -> Elab ()
290+
291+ * - operatorFixity
292+ - Look up the declared fixity for an operator.
293+
294+ The lookup fails if the operator does not yet have a fixity or if the string is not a valid operator.
295+
296+ @ operator the operator string to look up
297+
298+ Signature:
299+
300+ operatorFixity : (operator : String) -> Elab Fixity
301+
302+ * - debug
303+ - Halt elaboration, dumping the internal state for inspection.
304+
305+ This is intended for elaboration script developers, not for end-users. Use `fail` for final scripts.
306+
307+ Signature:
308+
309+ debug : Elab a
310+
311+ If 'debug' is not the last tactic then make sure its type is sufficiently constrained. In particular, its type is Elab a, but there's no way for Idris to find out which type was meant for a. This can be fixed by either writing an explicit type (e.g. debug {a = ()}) or by using a helper that constrains the type (such as simple in Pruviloj, e.g. simple debug as a line).
312+
313+ .. code-block:: idris
314+
315+ %language ElabReflection
316+
317+ idNat : Nat -> Nat
318+ idNat = %runElab (do intro `{{x}}
319+ debug {a = ()}
320+ fill (Var `{{x}})
321+ solve)
322+
323+ * - debugMessage
324+ - Halt elaboration, dumping the internal state and displaying a message.
325+
326+ This is intended for elaboration script developers, not for end-users. Use `fail` for final scripts.
327+
328+ @ msg the message to display
329+
330+ Signature:
331+
332+ debugMessage : (msg : List ErrorReportPart) -> Elab a
333+
334+ If 'debugMessage' is not the last tactic then make sure its type is sufficiently constrained. In particular, its type is Elab a, but there's no way for Idris to find out which type was meant for a. This can be fixed by either writing an explicit type (e.g. debugMessage [TextPart "message"] {a = ()}) or by using a helper that constrains the type (such as simple in Pruviloj, e.g. simple debug as a line).
335+
336+ .. code-block:: idris
337+
338+ %language ElabReflection
339+ idNat : Nat -> Nat
340+ idNat = %runElab (do intro `{{x}}
341+ debugMessage [TextPart "error message"] {a = ()}
342+ fill (Var `{{x}})
343+ solve)
344+
345+ * - metavar
346+ - Create a new top-level metavariable to solve the current hole.
347+
348+ @ name the name for the top-level variable
349+
350+ Signature:
351+
352+ metavar : (name : TTName) -> Elab ()
353+
354+ * - runElab
355+ - Recursively invoke the reflected elaborator with some goal.
356+
357+ The result is the final term and its type.
358+
359+ Signature:
360+
361+ runElab : Raw -> Elab () -> Elab (TT, TT)
362+
363+
364+Read and Write State
365+--------------------
366+
367+.. list-table::
368+ :widths: 10 30
369+ :stub-columns: 1
370+
371+ * - getEnv
372+ - Look up the lexical binding at the focused hole. Fails if no holes are present.
373+
374+ Signature:
375+
376+ getEnv : Elab (List (TTName, Binder TT))
377+
378+ * - getGoal
379+ - Get the name and type of the focused hole. Fails if not holes are present.
380+
381+ Signature:
382+
383+ getGoal : Elab (TTName, TT)
384+
385+ * - getHoles
386+ - Get the hole queue, in order.
387+
388+ Signature:
389+
390+ getHoles : Elab (List TTName)
391+
392+ * - getGuess
393+ - If the current hole contains a guess, return it. Otherwise, fail.
394+
395+ Signature:
396+
397+ getGuess : Elab TT
398+
399+ * - lookupTy
400+ - Look up the types of every overloading of a name.
401+
402+ Signature:
403+
404+ lookupTy : TTName -> Elab (List (TTName, NameType, TT))
405+
406+ * - lookupTyExact
407+ - Get the type of a fully-qualified name. Fail if it doesn't resolve uniquely.
408+
409+ Signature:
410+
411+ lookupTyExact : TTName -> Elab (TTName, NameType, TT)
412+
413+ * - lookupDatatype
414+ - Find the reflected representation of all datatypes whose names are overloadings of some name.
415+
416+ Signature:
417+
418+ lookupDatatype : TTName -> Elab (List Datatype)
419+
420+ * - lookupDatatypeExact
421+ - Find the reflected representation of a datatype, given its fully-qualified name. Fail if the name does not uniquely resolve to a datatype.
422+
423+ Signature:
424+
425+ lookupDatatypeExact : TTName -> Elab Datatype
426+
427+ * - lookupFunDefn
428+ - Find the reflected function definition of all functions whose names are overloadings of some name.
429+
430+ Signature:
431+
432+ lookupFunDefn : TTName -> Elab (List (FunDefn TT))
433+
434+ * - lookupFunDefnExact
435+ - Find the reflected function definition of a function, given its fully-qualified name. Fail if the name does not uniquely resolve to a function.
436+
437+ Signature:
438+
439+ lookupFunDefnExact : TTName -> Elab (FunDefn TT)
440+
441+ * - lookupArgs
442+ - Get the argument specification for each overloading of a name.
443+
444+ Signature:
445+
446+ lookupArgs : TTName -> Elab (List (TTName, List FunArg, Raw))
447+
448+ * - lookupArgsExact
449+ - Get the argument specification for a name. Fail if the name does not uniquely resolve.
450+
451+ Signature:
452+
453+ lookupArgsExact : TTName -> Elab (TTName, List FunArg, Raw)
454+
455+ * - check
456+ - Attempt to type-check a term, getting back itself and its type.
457+
458+ - @ env the environment within which to check the type
459+ - @ tm the term to check
460+
461+ Signature:
462+
463+ check : (env : List (TTName, Binder TT)) -> (tm : Raw) -> Elab (TT, TT)
464+
465+Error Handling
466+--------------
467+
468+.. list-table::
469+ :widths: 10 30
470+ :stub-columns: 1
471+
472+ * - tryCatch
473+ - `tryCatch t (\err => t')` will run `t`, and if it fails, roll back the elaboration state and run `t'`,
474+ but with access to the knowledge of why `t` failed.
475+
476+ Signature:
477+
478+ tryCatch : Elab a -> (Err -> Elab a) -> Elab a
479+
480+ .. code-block:: idris
481+
482+ %language ElabReflection
483+
484+ f : Err -> Elab ()
485+ f (Msg _) = fill `("message error")
486+ f (CantUnify _ _ _ _ _ _) = fill `("unification error")
487+ f _ = fill `("other")
488+
489+ s2 : String
490+ s2 = %runElab (do tryCatch (fill `(True)) f ; solve)
491+
492+ * - fail
493+ - Halt elaboration with an error
494+
495+ Signature:
496+
497+ fail : List ErrorReportPart -> Elab a
498+
499+ Note: we may need to make sure the return type 'a' is sufficiently constrained. If required add an explicit type {a = ()}.
500+
501+ Below is some code which includes 'fail'. This will always fail but we could replace 'True' with some more useful condition.
502+
503+ .. code-block:: idris
504+
505+ %language ElabReflection
506+
507+ id1 : Elab ()
508+ id1 = do
509+ intro `{{x}}
510+ fill (Var `{{x}})
511+ if True
512+ then
513+ fail [TextPart "put error message here"]
514+ else
515+ solve
516+
517+ idNat : Nat -> Nat
518+ idNat = %runElab id1
docs/elaboratorReflection/tactics.rstnew file+430
@@ -0,0 +1,430 @@
1+Elaborator Reflection - Tactics
2+===============================
3+
4+The Idris part of the code for elaborator reflection is in
5+Elab.idr `<https://github.com/idris-lang/Idris-dev/blob/master/libs/prelude/Language/Reflection/Elab.idr>`_
6+Before looking at the Elab monad we need to know how to construct terms.
7+
8+
9+Proof State
10+-----------
11+
12+The terminology 'Proof State' is used by analogy to proof assistants but, as used here, it's really more of a metaprogramming state.
13+
14+Tactics operate on the proof state. The proof state contains various pieces of information, at this stage, the important ones for us are:
15+
16+- A hole queue - This contains a list of the names of the holes used in the proof term. The solution to each hole may depend on the other holes. For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs by McBride 1999`_.
17+- A goal type - The type of the term that is under construction for the current goal.
18+- A possibly incomplete proof term, which is being calculated and should be the goal type at the end of elaboration.
19+- Context - A collection of open unification problems, representing recoverable failures of unification that may yet unify once more variables are solved.
20+
21+There are many other pieces of information in the proof state such as the names used , such as the bodies of case blocks that need to be elaborated.but, for now, we will leave the system to handle these.
22+
23+.. image:: ../image/elabProofState.png
24+ :width: 283px
25+ :height: 232px
26+
27+Names TTName
28+------------
29+
30+Names in an Idris program are evaluated at runtime but sometimes a 'variable name' is needed, which can be referred to as an unevaluated symbol.
31+The names used in terms have different constructors depending on their type:
32+
33++---------------------------+-----------------------------------------------+
34+| UN String | A user-provided name |
35++---------------------------+-----------------------------------------------+
36+| NS (UN "foo") ["B", "A"]) | A name in some namespace |
37++---------------------------+-----------------------------------------------+
38+| MN Int String | Machine-chosen names |
39++---------------------------+-----------------------------------------------+
40+| SN SpecialName | Special names, to make conflicts impossible |
41+| | and language features predictable |
42++---------------------------+-----------------------------------------------+
43+
44+
45+A user defined name can be constructed like this:
46+
47+.. code-block:: idris
48+
49+ Idris> UN "x"
50+ UN "x" : TTName
51+
52+.. code-block:: idris
53+
54+ Idris> NS (UN "x") ["b","a"]
55+ NS (UN "x") ["b", "a"] : TTName
56+
57+.. list-table:: machine-chosen names
58+
59+ * - A machine-chosen name needs to be generated within an Elab monad (see below for details) and is unique within that monad. This produced: {abc_140}{abc_141} so although gensym "abc" was called twice each one had a different integer:
60+ - example of unique names:
61+
62+ .. code-block:: idris
63+
64+ implementation Show TTName where
65+ show (UN s) = "`{{"++s++"}}"
66+ show (NS t a) = "{"++(show t)++
67+ "."++(show a)++"}"
68+ show (MN i s) = "{"++s++"_"++(show i)++"}"
69+ show (SN sn) = "TTName special name"
70+
71+ showGensym : String
72+ showGensym = %runElab (do
73+ debugMessage [TextPart (
74+ show !(gensym "abc") ++
75+ show !(gensym "abc")
76+ )]
77+ )
78+
79+Quasiquotation
80+--------------
81+
82+Since names are used frequently in elaborator reflection there is a shortcut for constructing them:
83+
84+.. list-table::
85+
86+ * - An unresolved variable "x" is wrapped in backtick and double braces:
87+ - .. code-block:: idris
88+
89+ Idris> `{{x}}
90+ UN "x" : TTName
91+
92+
93+ * - Single braces are used for existing variables:
94+ - .. code-block:: idris
95+
96+ Idris> `{x}
97+ No such variable x
98+ Idris> :let x=2
99+ Idris> `{x}
100+ UN "x" : TTName
101+
102+
103+ * - brackets are used for an expression:
104+
105+ here type is inferable
106+ - .. code-block:: idris
107+
108+ Idris> :let a=2
109+ Idris> `(a)
110+ P Ref (UN "a") (TConst (AType (ATInt ITBig))) : TT
111+
112+
113+ * - Expression with explicit type:
114+ - .. code-block:: idris
115+
116+ Idris> `(a:Integer)
117+ P Ref (UN "a") (TConst (AType (ATInt ITBig))) : TT
118+
119+
120+ * - If we want the value we can escape from quasiquotation by using anti-quotation (tilde)
121+ - .. code-block:: idris
122+
123+ Idris> `(~a)
124+ 2 : Integer
125+
126+quasiquotation summary:
127+
128++------------+-----------+----------------------------------------------------------+
129+| |Reification| |
130++============+===========+==========================================================+
131+| \`{{n}} | TTName | Use for new names. Unresolved quotation of the name n. |
132++------------+-----------+----------------------------------------------------------+
133+| \`{n} | TTName | Use for existing names. Resolved quotation of the name |
134+| | | n. n is a reference to a unique name in scope. |
135++------------+-----------+----------------------------------------------------------+
136+| \`(e) | | expression e for which a type is inferable. |
137++------------+-----------+----------------------------------------------------------+
138+| \`(e:t) | | expression e with a given type e. |
139++------------+-----------+----------------------------------------------------------+
140+| ~a | | anti-quotation - sub region which can be evaluated rather|
141+| | | than quoted. |
142++------------+-----------+----------------------------------------------------------+
143+|(Var\`{{x}})| Raw | |
144++------------+-----------+----------------------------------------------------------+
145+
146+TT
147+--
148+
149+There is a notation for a term in TT as it is being constructed (based on a BNF-like grammar), this is used for example in the debug output, it is a compact way to see the state of the term so it is used here.
150+So internally the program is stored as a tree structure using the following syntax:
151+
152++------------+-------+-------------+---------------------------------------------+
153+| | | Syntax | More Information |
154++============+=======+=============+=============================================+
155+| term | | t | |
156++------------+-------+-------------+---------------------------------------------+
157+| binding | | b | |
158++------------+-------+-------------+---------------------------------------------+
159+| constant | t ::= | c | |
160++------------+-------+-------------+---------------------------------------------+
161+| variable | t ::= | x | |
162++------------+-------+-------------+---------------------------------------------+
163+| variable | t ::= | b.t | so a dot '.' tells us this is some sort of |
164+| binding | | | binding. |
165++------------+-------+-------------+---------------------------------------------+
166+| application| t ::= | t t | As with Idris, juxtaposition indicates |
167+| | | | function application. Note: the same symbol |
168+| | | | 't' is used for both terms, this does not |
169+| | | | imply they are the same term. |
170++------------+-------+-------------+---------------------------------------------+
171+| Type | t ::= | T | |
172+| constructor| | | |
173++------------+-------+-------------+---------------------------------------------+
174+| Data | t ::= | C | |
175+| constructor| | | |
176++------------+-------+-------------+---------------------------------------------+
177+| function | b::= | λ c:t | colon ':' separates parameters from body of |
178+| | | | binding. |
179++------------+-------+-------------+---------------------------------------------+
180+| let binding| b::= | let\|-> t:t | |
181++------------+-------+-------------+---------------------------------------------+
182+| function | b::= | ∀ x:t | |
183++------------+-------+-------------+---------------------------------------------+
184+| Type | c::= | \*i | The universe hierarchy is usually handled |
185+| universe | | | automatically so we can just use\* for the |
186+| | | | type of types. |
187++------------+-------+-------------+---------------------------------------------+
188+| integer | c:== | i | |
189+| literal | | | |
190++------------+-------+-------------+---------------------------------------------+
191+|integer type| c:== | Integer | |
192++------------+-------+-------------+---------------------------------------------+
193+| string | c:== | s | |
194+| literal | | | |
195++------------+-------+-------------+---------------------------------------------+
196+| string type| c:== | String | |
197++------------+-------+-------------+---------------------------------------------+
198+|focused hole| | ?x : t | Conor McBride 1999 thesis. |
199++------------+-------+-------------+---------------------------------------------+
200+| guess | | ?x ≈ t : t | Conor McBride 1999 thesis. |
201++------------+-------+-------------+---------------------------------------------+
202+
203+Sometimes the part of the term in focus is underlined.
204+
205+Reflection of the well typed core language
206+
207+.. code-block:: idris
208+
209+ data TT =
210+ ||| A reference to some name (P for Parameter)
211+ P NameType TTName TT |
212+ ||| de Bruijn variables
213+ V Int |
214+ ||| Bind a variable
215+ Bind TTName (Binder TT) TT |
216+ ||| Apply one term to another
217+ App TT TT |
218+ ||| Embed a constant
219+ TConst Const |
220+ ||| Erased terms
221+ Erased |
222+ ||| The type of types along (with universe constraints)
223+ TType TTUExp |
224+ ||| Alternative universes for dealing with uniqueness
225+ UType Universe |
226+
227+TT stores local bound variables using De Bruijn index, when working in Idris this does not concern the user because string names are used for variables. Converting bound variables internally to index values means that the same variable name can be used, in different lambda terms, without ambiguity and without the need for α-substitution.
228+De Bruijn index which is a integer where:
229+
230+- 0=inside current (inner) lambda term
231+- 1= next outer lambda term
232+- 2= next outer and so on
233+
234+Raw
235+---
236+
237+Raw is similar to TT except it is used before types are known. The types should be resolved by the type checker.
238+
239+.. code-block:: idris
240+
241+ data Raw =
242+ ||| Variables, global or local
243+ Var TTName |
244+ ||| Bind a variable
245+ RBind TTName (Binder Raw) Raw |
246+ ||| Application
247+ RApp Raw Raw |
248+ ||| The type of types
249+ RType |
250+ ||| Alternative universes for dealing with uniqueness
251+ RUType Universe |
252+ ||| Embed a constant
253+ RConstant Const |
254+
255+Expression Syntax
256+-----------------
257+
258+There is a way of notating expressions such as those used in the proof state (example: goal type and proof terms) which is reasonably standard in the papers written about this subject.
259+
260+This notation is not entered directly by metaprogrammers but it is seen, for example in debug output. So this notation is explained here because it is useful to be familiar with it.
261+
262+The notation assumes right-associativity, in the absence of brackets, the term to the right binds more tightly than the one on the left.
263+So, for nested lambda terms:
264+
265++---------------+--------+-------------------+
266+| λ a . λ b . f | means | λ a .( λ b . f) |
267++---------------+--------+-------------------+
268+
269+and the same for function application:
270+
271++---------------+--------+-------------------+
272+| f g x | means | f (g x) |
273++---------------+--------+-------------------+
274+
275+In contrast, in lambda calculus, function application is usually regarded as left-associative,
276+Here are some typical examples of the notation used for expressions:
277+
278++-----------------------+
279+| ? {hole_0} . {hole_0} |
280++-----------------------+
281+
282+The term, to be derived, may start off in this state following something like this:
283+
284+.. code-block:: idris
285+
286+ myScript : Elab ()
287+ myScript= do
288+
289+The dot '.' tells us this is some sort of binding.
290+
291++----------------------------------------------+
292+| ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} |
293++----------------------------------------------+
294+
295+This is a slightly more complicated example arising from:
296+
297+.. code-block:: idris
298+
299+ idNat : Nat -> Nat
300+ idNat = %runElab (do
301+
302+This introduces a guess that hole_0 = hole_2 .
303+
304++----------------------------------------------------+
305+| ?{hole_0} ≈ λ x . ? {hole_2} . {hole_2} . {hole_0} |
306++----------------------------------------------------+
307+
308+Following on from the previous example a lambda function is introduced like this:
309+
310+.. code-block:: idris
311+
312+ intro `{{x}}
313+
314+So now the expression is wrapped in a lambda binding.
315+
316++-------------------------------------------------------+
317+| ?{hole_0} ≈ λ x . ?{hole_2} ≈ x . {hole_2} . {hole_0} |
318++-------------------------------------------------------+
319+
320+Following on, we can use the fill tactic like this:
321+
322+.. code-block:: idris
323+
324+ fill (Var `{{x}})
325+
326+which introduces another guess.
327+
328++--------------------------------+
329+| ?{hole_0} ≈ λ x . x . {hole_0} |
330++--------------------------------+
331+
332+The solve tactic completes the proof
333+
334+Binders
335+-------
336+
337+Here we look at each tactic in turn to see how they affect the proof state.
338+
339+Introduction tactics for binders. The binder types are:
340+
341+- lambda function (intro)
342+- dependent function (forall)
343+- let (letBind)
344+- pattern (patbind)
345+
346+A precondition of these tactics is that the focused hole is of the form:
347+
348++-----------+
349+| ?h : t.h |
350++-----------+
351+
352+that is, that the body of its scope consists directly of a reference to the hole-bound variable. If a hole binder were of the form:
353+
354++--------------------+
355+| ?h : t1 -> t2.f h |
356++--------------------+
357+
358+and a tactic such as
359+
360++------------------+
361+| intro \`{{x}} |
362++------------------+
363+
364+were applied, the result would be the term
365+
366++---------------------------+
367+| ?h : t2 . λ x:t1. f h |
368++---------------------------+
369+
370+However this would cause the application of f to be ill-typed, as it expects an argument of type t1->t2, not an argument of type t2. Additionally, some binding tactics require that t, the type of the hole h, have a specific form, because the binder to be established may have a typing rule associated with it.
371+
372+.. list-table:: Binders
373+ :widths: 10 30
374+ :stub-columns: 1
375+
376+ * - intro
377+ - Introduce a lambda binding around the current hole and focus on the body.
378+
379+ Requires that the hole be in binding form (use 'attack' if it might not be).
380+
381+ @ n the name to use for the argument.
382+
383+ Signature:
384+
385+ intro : (n : TTName) -> Elab ()
386+
387+ Result
388+
389+ λn:t1.?h:[n/x]t2.h
390+
391+ * - intro'
392+ - Introduce a lambda binding around the current hole and focus on the body, using the name provided by the type of the hole.
393+
394+ Requires that the hole be immediately under its binder (use 'attack' if it might not be).
395+
396+ Signature:
397+
398+ intro' : Elab ()
399+
400+ * - forall
401+ - Introduce a dependent function type binding into the current hole, and focus on the body. Requires that the hole be immediately under its binder
402+
403+ (use 'attack' if it might not be).
404+
405+ Signature:
406+
407+ forall : TTName -> Raw -> Elab ()
408+
409+ * - patbind
410+ - Introduce a new pattern binding. Requires that the hole be immediately under its binder (use 'attack' if it might not be).
411+
412+ Signature:
413+
414+ patbind : TTName -> Elab ()
415+
416+ * - letbind
417+ - Introduce a new let binding.
418+
419+ Requires that the hole be immediately under its binder (use 'attack' if it might not be).
420+
421+ - @ n the name to let bind
422+ - @ ty the type of the term to be let-bound
423+ - @ tm the term to be bound
424+
425+ Signature:
426+
427+ letbind : (n : TTName) -> (ty, tm : Raw) -> Elab ()
428+
429+.. target-notes::
430+.. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374
docs/faq/faq.rst+50−12
@@ -33,6 +33,30 @@ for use in production would be very welcome - this includes (but is not
3333limited to) extra library support, polishing the run-time system (and ensuring
3434it is robust), providing and maintaining a JVM back end, etc.
3535
36+Is there some documentation for the standard lib? List of functions?
37+=====================================================================
38+
39+API documentation for the shipped packages is listed on `the
40+documentation page <https://www.idris-lang.org/documentation/>`_.
41+
42+Unfortunately, the default prelude and shipped packages for `Idris`
43+are not necessarily complete with regards to documentation. Other
44+ways to find functions include:
45+
46++ REPL commands:
47+
48+ + Use `:apropos` to search for text in documentation and function names.
49+ + Use `:search` to search for functions of a given type.
50+ + Use `:browse` to list the contents of a given namespace.
51+
52++ Use the REPL's auto-complete functionality.
53++ Grep through the source code in `libs/`
54+
55+If you find that the shipped packages are lacking in documentation,
56+please feel free to write some. Or bug someone to do so. `Idris` has
57+syntax for providing rich documentation, which is then viewable using
58+the `:doc` command and listed in generated HTML API documentation.
59+
3660
3761Why does Idris use eager evaluation rather than lazy?
3862=====================================================
@@ -137,7 +161,7 @@ of ``append``, rather than making the type of ``append`` equivalent to...
137161
138162...which is probably not what was intended! The reason for this rule is so
139163that it is clear just from looking at the type of ``append``, and no other
140−context, what the implicitly bound names are.
164+context, what the implicitly bound names are.
141165
142166If you want to use an unapplied name in a type, you have two options. You
143167can either explicitly qualify it, for example, if ``ty`` is defined in the
@@ -149,7 +173,7 @@ namespace ``Main`` you can do the following:
149173
150174Alternatively, you can use a name which does not begin with a lower case
151175letter, which will never be implicitly bound:
152−
176+
153177.. code-block:: idris
154178
155179 Ty : Type
@@ -173,8 +197,10 @@ function back to itself. On such a path, there must be at least one
173197argument which converges to a base case.
174198
175199- Mutually recursive functions are supported
200+
176201- However, all functions on the path must be fully applied. In particular,
177202 higher order applications are not supported
203+
178204- Idris identifies arguments which converge to a base case by looking for
179205 recursive calls to syntactically smaller arguments of inputs. e.g.
180206 ``k`` is syntactically smaller than ``S (S k)`` because ``k`` is a
@@ -189,10 +215,10 @@ function.
189215When will Idris be self-hosting?
190216================================
191217
192−It’s not a priority, though not a bad idea in the long run. It would be a
193−worthwhile effort in the short term to implement libraries to support
194−self-hosting, such as a good parsing library.
195−
218+It’s not a priority, though not a bad idea in the long run. It would
219+be a worthwhile effort in the short term to implement libraries in
220+Idris to support self-hosting, such as argument parsing and a
221+POSIX-compliant library for system interaction.
196222
197223Does Idris have universe polymorphism? What is the type of ``Type``?
198224====================================================================
@@ -233,14 +259,17 @@ where the install directory is unknown at build time. When passing this
233259flag, the IDRIS_LIB_DIR environment variable needs to be set to the path
234260where the Idris libs reside relative to the idris executable. The
235261IDRIS_TOOLCHAIN_DIR environment variable is optional, if that is set,
236−Idris will use that path to find the C compiler.
262+Idris will use that path to find the C compiler. For example:
237263
238−Example::
264+::
239265
240− IDRIS_LIB_DIR="./libs" IDRIS_TOOLCHAIN_DIR="./mingw/bin" CABALFLAGS="-fffi -ffreestanding -frelease" make
266+ IDRIS_LIB_DIR="./libs" \
267+ IDRIS_TOOLCHAIN_DIR="./mingw/bin" \
268+ CABALFLAGS="-fffi -ffreestanding -frelease" \
269+ make
241270
242271
243−What does the name ‘Idris’ mean?
272+What does the name “Idris” mean?
244273================================
245274
246275British people of a certain age may be familiar with this
@@ -256,16 +285,20 @@ There are several reasons why we should not support Unicode operators:
256285- It's hard to type (this is important if you're using someone else's code, for
257286 example). Various editors have their own input methods, but you have to know
258287 what they are.
288+
259289- Not every piece of software easily supports it. Rendering issues have been
260290 noted on some mobile email clients, terminal-based IRC clients, web browsers,
261291 etc. There are ways to resolve these rendering issues but they provide a
262292 barrier to entry to using Idris.
293+
263294- Even if we leave it out of the standard library (which we will in any case!)
264295 as soon as people start using it in their library code, others have to deal
265296 with it.
297+
266298- Too many characters look too similar. We had enough trouble with confusion
267299 between 0 and O without worrying about all the different kinds of colons and
268300 brackets.
301+
269302- There seems to be a tendency to go over the top with use of Unicode. For
270303 example, using sharp and flat for delay and force (or is it the other way
271304 around?) in Agda seems gratuitous. We don't want to encourage this sort of
@@ -277,11 +310,16 @@ better and it will make sense to revisit this. For now, however, Idris will not
277310be offering arbitrary Unicode symbols in operators.
278311
279312This seems like an instance of `Wadler's
280−Law <http://www.haskell.org/haskellwiki/Wadler%27s_Law>`__ in action.
313+Law <https://www.haskell.org/haskellwiki/Wadler%27s_Law>`__ in action.
281314
282315This answer is based on Edwin Brady's response in the following
283−`pull request <https://github.com/idris-lang/Idris-dev/pull/694#issuecomment-29559291>`__.
316+`pull request <https://github.com/idris-lang/Idris-dev/pull/694#issuecomment-29559291>`_.
317+
318+Where can I find the community standards for the Idris community?
319+==================================================================
284320
321+The Idris Community Standards are stated `here
322+<https://www.idris-lang.org/documentation/community-standards/>`_ .
285323
286324Where can I find more answers?
287325==============================
docs/guides/index.rst+1−1
@@ -12,7 +12,7 @@ Tutorials submitted by community members.
1212 Idris Community* has waived all copyright and related or neighboring
1313 rights to Documentation for Idris.
1414
15− More information concerning the CC0 can be found online at: http://creativecommons.org/publicdomain/zero/1.0/
15+ More information concerning the CC0 can be found online at: https://creativecommons.org/publicdomain/zero/1.0/
1616
1717
1818.. toctree::
docs/guides/theorem-prover.rst+1−1
@@ -22,7 +22,7 @@ We will be given the following prompt, in future releases the version string wil
2222 ____ __ _
2323 / _/___/ /____(_)____
2424 / // __ / ___/ / ___/ Version 0.9.18.1
25− _/ // /_/ / / / (__ ) http://www.idris-lang.org/
25+ _/ // /_/ / / / (__ ) https://www.idris-lang.org/
2626 /___/\__,_/_/ /_/____/ Type :? for help
2727
2828 Idris is free software with ABSOLUTELY NO WARRANTY.
docs/guides/type-providers-ffi.rst+6−4
@@ -3,7 +3,7 @@ Type Providers in Idris
33***********************
44
55`Type providers in Idris
6−<http://www.itu.dk/people/drc/pubs/dependent-type-providers.pdf>`__
6+<https://www.davidchristiansen.dk/pubs/dependent-type-providers.pdf>`__
77are simple enough, but there are a few caveats to using them that it
88would be worthwhile to go through the basic steps. We also go over
99foreign functions, because these will often be used with type
@@ -53,8 +53,8 @@ actions. Let's write a simple one now:
5353 putStrLn "I'm sorry, I don't know how big size_t is. Can you tell me, in bytes?"
5454 resp <- getLine
5555 case readInt resp of
56− Just sizeTSize => return (Provide sizeTSize)
57− Nothing => return (Error "I'm sorry, I don't understand.")
56+ Just sizeTSize => pure (Provide sizeTSize)
57+ Nothing => pure (Error "I'm sorry, I don't understand.")
5858 -- the readInt function is left as an exercise
5959
6060We assume that whoever's compiling the library knows the size of
@@ -200,6 +200,7 @@ Next, an Idris file to define our providers:
200200 module Providers
201201
202202 %dynamic "./stattypes.so"
203+ %access export
203204
204205 sizeOfDevT : IO Int
205206 sizeOfDevT = foreign FFI_C "sizeof_dev_t" (IO Int)
@@ -207,9 +208,10 @@ Next, an Idris file to define our providers:
207208
208209 -- Indicates how many bits are used to represent various system
209210 -- stat types.
211+ public export
210212 data BitWidth = B8 | B16 | B32 | B64
211213
212− implementation Show BitWidth where
214+ Show BitWidth where
213215 show B8 = "8 bits"
214216 show B16 = "16 bits"
215217 show B32 = "32 bits"
docs/image/README.mdnew file+16
@@ -0,0 +1,16 @@
1+Many of the images in this directory have two files with the same name but a different extension:
2+
3+* The SVG file, being vector graphics, is best for drawing and modifying.
4+* The PNG file, being raster graphics, gives more consistent rendering.
5+
6+The image has therefore been generated as an SVG file and then exported to the PNG file.
7+
8+So, if you need to modify an image, I suggest the following sequence:
9+
10+* Edit the SVG file using a suitable editor (I use Inkscape).
11+* Export the changes to the PNG file, overwriting the old version.
12+* upload both files.
13+
14+Note, when exporting in Inkscape:
15+* Select everything first, this stops an enormous boundary being exported.
16+* After selecting the file to export to and clicking OK, don't forget to click on export button as well.
docs/image/attack.pngnew file

Binary file not shown.

docs/image/attack.svgnew file+199
@@ -0,0 +1,199 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 210 297"
15+ version="1.1"
16+ id="svg8"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="attack.svg">
19+ <defs
20+ id="defs2">
21+ <marker
22+ inkscape:stockid="Arrow1Mend"
23+ orient="auto"
24+ refY="0.0"
25+ refX="0.0"
26+ id="marker890"
27+ style="overflow:visible;"
28+ inkscape:isstock="true">
29+ <path
30+ id="path888"
31+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
32+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
33+ transform="scale(0.4) rotate(180) translate(10,0)" />
34+ </marker>
35+ <marker
36+ inkscape:isstock="true"
37+ style="overflow:visible;"
38+ id="marker838"
39+ refX="0.0"
40+ refY="0.0"
41+ orient="auto"
42+ inkscape:stockid="Arrow1Mend"
43+ inkscape:collect="always">
44+ <path
45+ transform="scale(0.4) rotate(180) translate(10,0)"
46+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
47+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
48+ id="path836" />
49+ </marker>
50+ <marker
51+ inkscape:stockid="Arrow1Mend"
52+ orient="auto"
53+ refY="0.0"
54+ refX="0.0"
55+ id="Arrow1Mend"
56+ style="overflow:visible;"
57+ inkscape:isstock="true"
58+ inkscape:collect="always">
59+ <path
60+ id="path4529"
61+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
62+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
63+ transform="scale(0.4) rotate(180) translate(10,0)" />
64+ </marker>
65+ </defs>
66+ <sodipodi:namedview
67+ id="base"
68+ pagecolor="#ffffff"
69+ bordercolor="#666666"
70+ borderopacity="1.0"
71+ inkscape:pageopacity="0.0"
72+ inkscape:pageshadow="2"
73+ inkscape:zoom="1"
74+ inkscape:cx="313.5"
75+ inkscape:cy="696.5"
76+ inkscape:document-units="mm"
77+ inkscape:current-layer="layer1"
78+ showgrid="false"
79+ inkscape:window-width="1920"
80+ inkscape:window-height="1015"
81+ inkscape:window-x="0"
82+ inkscape:window-y="0"
83+ inkscape:window-maximized="1" />
84+ <metadata
85+ id="metadata5">
86+ <rdf:RDF>
87+ <cc:Work
88+ rdf:about="">
89+ <dc:format>image/svg+xml</dc:format>
90+ <dc:type
91+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
92+ <dc:title />
93+ </cc:Work>
94+ </rdf:RDF>
95+ </metadata>
96+ <g
97+ inkscape:label="Layer 1"
98+ inkscape:groupmode="layer"
99+ id="layer1">
100+ <rect
101+ style="fill:#ffff00;fill-opacity:1;stroke-width:0.26458332"
102+ id="rect22"
103+ width="28.839582"
104+ height="6.0854182"
105+ x="66.67498"
106+ y="114.4375"
107+ inkscape:export-xdpi="61.120499"
108+ inkscape:export-ydpi="61.120499" />
109+ <text
110+ xml:space="preserve"
111+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
112+ x="65.352081"
113+ y="105.17709"
114+ id="text12"
115+ inkscape:export-xdpi="61.120499"
116+ inkscape:export-ydpi="61.120499"><tspan
117+ sodipodi:role="line"
118+ x="65.352081"
119+ y="105.17709"
120+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
121+ id="tspan847">?h ∶ t1→t2 . f h</tspan></text>
122+ <text
123+ id="text16"
124+ y="118.67083"
125+ x="56.356247"
126+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
127+ xml:space="preserve"
128+ inkscape:export-xdpi="61.120499"
129+ inkscape:export-ydpi="61.120499"><tspan
130+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
131+ y="118.67083"
132+ x="56.356247"
133+ id="tspan14"
134+ sodipodi:role="line">?h ≈ (?h' ∶ t1→t2 . h')∶ t1→t2 . f h</tspan></text>
135+ <text
136+ id="text20"
137+ y="110.99791"
138+ x="82.814583"
139+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
140+ xml:space="preserve"
141+ inkscape:export-xdpi="61.120499"
142+ inkscape:export-ydpi="61.120499"><tspan
143+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
144+ y="110.99791"
145+ x="82.814583"
146+ id="tspan18"
147+ sodipodi:role="line">attack</tspan></text>
148+ <path
149+ style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
150+ d="m 80.668481,106.30075 -0.0032,7.57492"
151+ id="path4518"
152+ inkscape:connector-curvature="0"
153+ sodipodi:nodetypes="cc"
154+ inkscape:export-xdpi="61.120499"
155+ inkscape:export-ydpi="61.120499" />
156+ <text
157+ inkscape:export-ydpi="61.120499"
158+ inkscape:export-xdpi="61.120499"
159+ xml:space="preserve"
160+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
161+ x="63.235413"
162+ y="94.85833"
163+ id="text832"><tspan
164+ sodipodi:role="line"
165+ id="tspan830"
166+ x="63.235413"
167+ y="94.85833"
168+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">focus</tspan></text>
169+ <path
170+ inkscape:export-ydpi="61.120499"
171+ inkscape:export-xdpi="61.120499"
172+ sodipodi:nodetypes="cc"
173+ inkscape:connector-curvature="0"
174+ id="path834"
175+ d="m 66.645564,94.659084 -0.0032,5.458256"
176+ style="fill:none;stroke:#0000ff;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker838)" />
177+ <text
178+ id="text884"
179+ y="110.23682"
180+ x="61.94511"
181+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
182+ xml:space="preserve"
183+ inkscape:export-xdpi="61.120499"
184+ inkscape:export-ydpi="61.120499"><tspan
185+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332"
186+ y="110.23682"
187+ x="61.94511"
188+ id="tspan882"
189+ sodipodi:role="line">focus</tspan></text>
190+ <path
191+ style="fill:none;stroke:#0000ff;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker890)"
192+ d="m 66.67818,108.97924 -0.0032,5.45826"
193+ id="path886"
194+ inkscape:connector-curvature="0"
195+ sodipodi:nodetypes="cc"
196+ inkscape:export-xdpi="61.120499"
197+ inkscape:export-ydpi="61.120499" />
198+ </g>
199+</svg>
docs/image/binders.pngnew file

Binary file not shown.

docs/image/binders.svgnew file+326
@@ -0,0 +1,326 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="binders.svg">
19+ <defs
20+ id="defs4" />
21+ <sodipodi:namedview
22+ id="base"
23+ pagecolor="#ffffff"
24+ bordercolor="#666666"
25+ borderopacity="1.0"
26+ inkscape:pageopacity="0.0"
27+ inkscape:pageshadow="2"
28+ inkscape:zoom="1"
29+ inkscape:cx="255.00889"
30+ inkscape:cy="520"
31+ inkscape:document-units="px"
32+ inkscape:current-layer="layer1"
33+ showgrid="false"
34+ inkscape:window-width="1163"
35+ inkscape:window-height="1011"
36+ inkscape:window-x="-4"
37+ inkscape:window-y="0"
38+ inkscape:window-maximized="0" />
39+ <metadata
40+ id="metadata7">
41+ <rdf:RDF>
42+ <cc:Work
43+ rdf:about="">
44+ <dc:format>image/svg+xml</dc:format>
45+ <dc:type
46+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
47+ <dc:title></dc:title>
48+ </cc:Work>
49+ </rdf:RDF>
50+ </metadata>
51+ <g
52+ inkscape:label="Layer 1"
53+ inkscape:groupmode="layer"
54+ id="layer1">
55+ <text
56+ xml:space="preserve"
57+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
58+ x="157"
59+ y="177.3622"
60+ id="text4136"
61+ sodipodi:linespacing="125%"
62+ inkscape:export-xdpi="61.120499"
63+ inkscape:export-ydpi="61.120499"><tspan
64+ sodipodi:role="line"
65+ id="tspan4138"
66+ x="157"
67+ y="177.3622"
68+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;">Code</tspan></text>
69+ <text
70+ sodipodi:linespacing="125%"
71+ id="text4140"
72+ y="177.3622"
73+ x="287"
74+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
75+ xml:space="preserve"
76+ inkscape:export-xdpi="61.120499"
77+ inkscape:export-ydpi="61.120499"><tspan
78+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;"
79+ y="177.3622"
80+ x="287"
81+ id="tspan4142"
82+ sodipodi:role="line">Logic</tspan></text>
83+ <path
84+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
85+ d="m 229,161.3622 1,298"
86+ id="path4144"
87+ inkscape:connector-curvature="0"
88+ sodipodi:nodetypes="cc"
89+ inkscape:export-xdpi="61.120499"
90+ inkscape:export-ydpi="61.120499" />
91+ <path
92+ inkscape:connector-curvature="0"
93+ id="path4146"
94+ d="m 473.5,184.8622 -364,1"
95+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
96+ sodipodi:nodetypes="cc"
97+ inkscape:export-xdpi="61.120499"
98+ inkscape:export-ydpi="61.120499" />
99+ <path
100+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
101+ d="m 473.5,270.8622 -364,1"
102+ id="path4148"
103+ inkscape:connector-curvature="0"
104+ sodipodi:nodetypes="cc"
105+ inkscape:export-xdpi="61.120499"
106+ inkscape:export-ydpi="61.120499" />
107+ <path
108+ inkscape:connector-curvature="0"
109+ id="path4150"
110+ d="m 475.5,362.8622 -366,1"
111+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
112+ sodipodi:nodetypes="cc"
113+ inkscape:export-xdpi="61.120499"
114+ inkscape:export-ydpi="61.120499" />
115+ <path
116+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
117+ d="m 475.5,458.8622 -366,1"
118+ id="path4152"
119+ inkscape:connector-curvature="0"
120+ sodipodi:nodetypes="cc"
121+ inkscape:export-xdpi="61.120499"
122+ inkscape:export-ydpi="61.120499" />
123+ <text
124+ sodipodi:linespacing="125%"
125+ id="text4154"
126+ y="235.3622"
127+ x="19"
128+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
129+ xml:space="preserve"
130+ inkscape:export-xdpi="61.120499"
131+ inkscape:export-ydpi="61.120499"><tspan
132+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
133+ y="235.3622"
134+ x="19"
135+ id="tspan4156"
136+ sodipodi:role="line">Abstraction</tspan></text>
137+ <text
138+ xml:space="preserve"
139+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
140+ x="19"
141+ y="399.36218"
142+ id="text4158"
143+ sodipodi:linespacing="125%"
144+ inkscape:export-xdpi="61.120499"
145+ inkscape:export-ydpi="61.120499"><tspan
146+ sodipodi:role="line"
147+ id="tspan4160"
148+ x="19"
149+ y="399.36218"
150+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">let</tspan><tspan
151+ sodipodi:role="line"
152+ x="19"
153+ y="424.36218"
154+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
155+ id="tspan4184">binding</tspan></text>
156+ <text
157+ sodipodi:linespacing="125%"
158+ id="text4162"
159+ y="307.36218"
160+ x="19"
161+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
162+ xml:space="preserve"
163+ inkscape:export-xdpi="61.120499"
164+ inkscape:export-ydpi="61.120499"><tspan
165+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
166+ y="307.36218"
167+ x="19"
168+ id="tspan4164"
169+ sodipodi:role="line">function</tspan><tspan
170+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
171+ y="332.36218"
172+ x="19"
173+ sodipodi:role="line"
174+ id="tspan4166">space</tspan></text>
175+ <text
176+ xml:space="preserve"
177+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
178+ x="167"
179+ y="235.3622"
180+ id="text4168"
181+ sodipodi:linespacing="125%"
182+ inkscape:export-xdpi="61.120499"
183+ inkscape:export-ydpi="61.120499"><tspan
184+ sodipodi:role="line"
185+ id="tspan4170"
186+ x="167"
187+ y="235.3622"
188+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;">λ x:t</tspan></text>
189+ <text
190+ sodipodi:linespacing="125%"
191+ id="text4172"
192+ y="222.3622"
193+ x="259"
194+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
195+ xml:space="preserve"
196+ inkscape:export-xdpi="61.120499"
197+ inkscape:export-ydpi="61.120499"><tspan
198+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;"
199+ y="222.3622"
200+ x="259"
201+ id="tspan4174"
202+ sodipodi:role="line">Γ ⊢ S : Type</tspan></text>
203+ <text
204+ sodipodi:linespacing="125%"
205+ id="text4180"
206+ y="417.36218"
207+ x="124"
208+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
209+ xml:space="preserve"
210+ inkscape:export-xdpi="61.120499"
211+ inkscape:export-ydpi="61.120499"><tspan
212+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;"
213+ y="417.36218"
214+ x="124"
215+ id="tspan4182"
216+ sodipodi:role="line">let x ↦ t : t</tspan></text>
217+ <path
218+ inkscape:connector-curvature="0"
219+ id="path4186"
220+ d="m 383.5,227.8622 -136,1"
221+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
222+ sodipodi:nodetypes="cc"
223+ inkscape:export-xdpi="61.120499"
224+ inkscape:export-ydpi="61.120499" />
225+ <text
226+ xml:space="preserve"
227+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
228+ x="246"
229+ y="248.3622"
230+ id="text4188"
231+ sodipodi:linespacing="125%"
232+ inkscape:export-xdpi="61.120499"
233+ inkscape:export-ydpi="61.120499"><tspan
234+ sodipodi:role="line"
235+ id="tspan4190"
236+ x="246"
237+ y="248.3622"
238+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;">Γ ; λ x:S ⊢ valid</tspan></text>
239+ <text
240+ xml:space="preserve"
241+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
242+ x="257"
243+ y="308.36218"
244+ id="text4192"
245+ sodipodi:linespacing="125%"
246+ inkscape:export-xdpi="61.120499"
247+ inkscape:export-ydpi="61.120499"><tspan
248+ sodipodi:role="line"
249+ id="tspan4194"
250+ x="257"
251+ y="308.36218"
252+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;">Γ ⊢ S : Type</tspan></text>
253+ <path
254+ sodipodi:nodetypes="cc"
255+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
256+ d="m 381.5,313.8622 -136,1"
257+ id="path4196"
258+ inkscape:connector-curvature="0"
259+ inkscape:export-xdpi="61.120499"
260+ inkscape:export-ydpi="61.120499" />
261+ <text
262+ sodipodi:linespacing="125%"
263+ id="text4198"
264+ y="334.36218"
265+ x="244"
266+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
267+ xml:space="preserve"
268+ inkscape:export-xdpi="61.120499"
269+ inkscape:export-ydpi="61.120499"><tspan
270+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;"
271+ y="334.36218"
272+ x="244"
273+ id="tspan4200"
274+ sodipodi:role="line">Γ ; ∀ x:S ⊢ valid</tspan></text>
275+ <text
276+ xml:space="preserve"
277+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
278+ x="167"
279+ y="323.36218"
280+ id="text4202"
281+ sodipodi:linespacing="125%"
282+ inkscape:export-xdpi="61.120499"
283+ inkscape:export-ydpi="61.120499"><tspan
284+ sodipodi:role="line"
285+ id="tspan4204"
286+ x="167"
287+ y="323.36218"
288+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;">∀ x:t</tspan></text>
289+ <text
290+ sodipodi:linespacing="125%"
291+ id="text4206"
292+ y="402.36218"
293+ x="255"
294+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
295+ xml:space="preserve"
296+ inkscape:export-xdpi="61.120499"
297+ inkscape:export-ydpi="61.120499"><tspan
298+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;"
299+ y="402.36218"
300+ x="255"
301+ id="tspan4208"
302+ sodipodi:role="line">Γ ⊢ S : Type Γ ⊢ s:S </tspan></text>
303+ <path
304+ inkscape:connector-curvature="0"
305+ id="path4210"
306+ d="m 453.5,407.8622 -210,1"
307+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
308+ sodipodi:nodetypes="cc"
309+ inkscape:export-xdpi="61.120499"
310+ inkscape:export-ydpi="61.120499" />
311+ <text
312+ xml:space="preserve"
313+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
314+ x="242"
315+ y="428.36218"
316+ id="text4212"
317+ sodipodi:linespacing="125%"
318+ inkscape:export-xdpi="61.120499"
319+ inkscape:export-ydpi="61.120499"><tspan
320+ sodipodi:role="line"
321+ id="tspan4214"
322+ x="242"
323+ y="428.36218"
324+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;">Γ ; let x ↦ s : S ⊢ valid</tspan></text>
325+ </g>
326+</svg>
docs/image/compareToProofAssist.pngnew file

Binary file not shown.

docs/image/compareToProofAssist.svgnew file+260
@@ -0,0 +1,260 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="compareToProofAssist.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker4251"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow1Mend">
29+ <path
30+ transform="scale(0.4) rotate(180) translate(10,0)"
31+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
32+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
33+ id="path4253" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow1Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="marker5018"
41+ style="overflow:visible;"
42+ inkscape:isstock="true">
43+ <path
44+ id="path5020"
45+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
46+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
47+ transform="scale(0.4) rotate(180) translate(10,0)" />
48+ </marker>
49+ <marker
50+ inkscape:isstock="true"
51+ style="overflow:visible;"
52+ id="marker4436"
53+ refX="0.0"
54+ refY="0.0"
55+ orient="auto"
56+ inkscape:stockid="Arrow1Mend"
57+ inkscape:collect="always">
58+ <path
59+ transform="scale(0.4) rotate(180) translate(10,0)"
60+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
61+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
62+ id="path4438" />
63+ </marker>
64+ <marker
65+ inkscape:stockid="Arrow1Mend"
66+ orient="auto"
67+ refY="0.0"
68+ refX="0.0"
69+ id="Arrow1Mend"
70+ style="overflow:visible;"
71+ inkscape:isstock="true"
72+ inkscape:collect="always">
73+ <path
74+ id="path4167"
75+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
76+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
77+ transform="scale(0.4) rotate(180) translate(10,0)" />
78+ </marker>
79+ </defs>
80+ <sodipodi:namedview
81+ id="base"
82+ pagecolor="#ffffff"
83+ bordercolor="#666666"
84+ borderopacity="1.0"
85+ inkscape:pageopacity="0.0"
86+ inkscape:pageshadow="2"
87+ inkscape:zoom="1"
88+ inkscape:cx="377.89372"
89+ inkscape:cy="520"
90+ inkscape:document-units="px"
91+ inkscape:current-layer="layer1"
92+ showgrid="false"
93+ inkscape:window-width="1920"
94+ inkscape:window-height="1015"
95+ inkscape:window-x="0"
96+ inkscape:window-y="0"
97+ inkscape:window-maximized="1" />
98+ <metadata
99+ id="metadata7">
100+ <rdf:RDF>
101+ <cc:Work
102+ rdf:about="">
103+ <dc:format>image/svg+xml</dc:format>
104+ <dc:type
105+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
106+ <dc:title />
107+ </cc:Work>
108+ </rdf:RDF>
109+ </metadata>
110+ <g
111+ inkscape:label="Layer 1"
112+ inkscape:groupmode="layer"
113+ id="layer1">
114+ <text
115+ xml:space="preserve"
116+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
117+ x="162"
118+ y="326.36221"
119+ id="text4136"
120+ sodipodi:linespacing="125%"
121+ inkscape:export-xdpi="61.120499"
122+ inkscape:export-ydpi="61.120499"><tspan
123+ sodipodi:role="line"
124+ id="tspan4138"
125+ x="162"
126+ y="326.36221"
127+ style="font-size:15px;-inkscape-font-specification:'sans-serif Bold';font-family:sans-serif;font-weight:bold;font-style:normal;font-stretch:normal;font-variant:normal">Human</tspan></text>
128+ <text
129+ sodipodi:linespacing="125%"
130+ id="text4140"
131+ y="368.36221"
132+ x="162"
133+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
134+ xml:space="preserve"
135+ inkscape:export-xdpi="61.120499"
136+ inkscape:export-ydpi="61.120499"><tspan
137+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
138+ y="368.36221"
139+ x="162"
140+ id="tspan4142"
141+ sodipodi:role="line">Tactics</tspan></text>
142+ <text
143+ xml:space="preserve"
144+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
145+ x="161"
146+ y="415.36221"
147+ id="text4144"
148+ sodipodi:linespacing="125%"
149+ inkscape:export-xdpi="61.120499"
150+ inkscape:export-ydpi="61.120499"><tspan
151+ sodipodi:role="line"
152+ id="tspan4146"
153+ x="161"
154+ y="415.36221"
155+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">fill holes</tspan></text>
156+ <text
157+ sodipodi:linespacing="125%"
158+ id="text4148"
159+ y="282.36221"
160+ x="130"
161+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
162+ xml:space="preserve"
163+ inkscape:export-xdpi="61.120499"
164+ inkscape:export-ydpi="61.120499"><tspan
165+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;"
166+ y="282.36221"
167+ x="130"
168+ id="tspan4150"
169+ sodipodi:role="line">Proof assistant</tspan></text>
170+ <path
171+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
172+ d="m 188,329.3622 0,22"
173+ id="path4152"
174+ inkscape:connector-curvature="0"
175+ inkscape:export-xdpi="61.120499"
176+ inkscape:export-ydpi="61.120499" />
177+ <path
178+ inkscape:connector-curvature="0"
179+ id="path4434"
180+ d="m 187,373.3622 0,22"
181+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4436)"
182+ inkscape:export-xdpi="61.120499"
183+ inkscape:export-ydpi="61.120499" />
184+ <text
185+ xml:space="preserve"
186+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
187+ x="314"
188+ y="326.36221"
189+ id="text5002"
190+ sodipodi:linespacing="125%"
191+ inkscape:export-xdpi="61.120499"
192+ inkscape:export-ydpi="61.120499"><tspan
193+ sodipodi:role="line"
194+ id="tspan5004"
195+ x="314"
196+ y="326.36221"
197+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">Idris source</tspan></text>
198+ <text
199+ sodipodi:linespacing="125%"
200+ id="text5006"
201+ y="413.36221"
202+ x="281"
203+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
204+ xml:space="preserve"
205+ inkscape:export-xdpi="61.120499"
206+ inkscape:export-ydpi="61.120499"><tspan
207+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
208+ y="413.36221"
209+ x="281"
210+ id="tspan5008"
211+ sodipodi:role="line">fill holes</tspan><tspan
212+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
213+ y="432.11221"
214+ x="281"
215+ sodipodi:role="line"
216+ id="tspan5060">(implicit variables, etc)</tspan></text>
217+ <text
218+ xml:space="preserve"
219+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
220+ x="294"
221+ y="282.36221"
222+ id="text5010"
223+ sodipodi:linespacing="125%"
224+ inkscape:export-xdpi="61.120499"
225+ inkscape:export-ydpi="61.120499"><tspan
226+ sodipodi:role="line"
227+ id="tspan5012"
228+ x="294"
229+ y="282.36221"
230+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000">Idris Elaborator</tspan></text>
231+ <path
232+ inkscape:connector-curvature="0"
233+ id="path5014"
234+ d="m 342,330.3622 0,22"
235+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4251)"
236+ inkscape:export-xdpi="61.120499"
237+ inkscape:export-ydpi="61.120499" />
238+ <path
239+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5018)"
240+ d="m 341,374.3622 0,22"
241+ id="path5016"
242+ inkscape:connector-curvature="0"
243+ inkscape:export-xdpi="61.120499"
244+ inkscape:export-ydpi="61.120499" />
245+ <text
246+ inkscape:export-ydpi="61.120499"
247+ inkscape:export-xdpi="61.120499"
248+ sodipodi:linespacing="125%"
249+ id="text4247"
250+ y="369.36221"
251+ x="317"
252+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
253+ xml:space="preserve"><tspan
254+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
255+ y="369.36221"
256+ x="317"
257+ id="tspan4249"
258+ sodipodi:role="line">Tactics</tspan></text>
259+ </g>
260+</svg>
docs/image/elab.pngnew file

Binary file not shown.

docs/image/elab.svgnew file+139
@@ -0,0 +1,139 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="elab.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:stockid="Arrow1Mend"
23+ orient="auto"
24+ refY="0.0"
25+ refX="0.0"
26+ id="Arrow1Mend"
27+ style="overflow:visible;"
28+ inkscape:isstock="true">
29+ <path
30+ id="path4155"
31+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
32+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
33+ transform="scale(0.4) rotate(180) translate(10,0)" />
34+ </marker>
35+ </defs>
36+ <sodipodi:namedview
37+ id="base"
38+ pagecolor="#ffffff"
39+ bordercolor="#666666"
40+ borderopacity="1.0"
41+ inkscape:pageopacity="0.0"
42+ inkscape:pageshadow="2"
43+ inkscape:zoom="1"
44+ inkscape:cx="381.03373"
45+ inkscape:cy="520"
46+ inkscape:document-units="px"
47+ inkscape:current-layer="layer1"
48+ showgrid="false"
49+ inkscape:window-width="1072"
50+ inkscape:window-height="1011"
51+ inkscape:window-x="-4"
52+ inkscape:window-y="0"
53+ inkscape:window-maximized="0" />
54+ <metadata
55+ id="metadata7">
56+ <rdf:RDF>
57+ <cc:Work
58+ rdf:about="">
59+ <dc:format>image/svg+xml</dc:format>
60+ <dc:type
61+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
62+ <dc:title></dc:title>
63+ </cc:Work>
64+ </rdf:RDF>
65+ </metadata>
66+ <g
67+ inkscape:label="Layer 1"
68+ inkscape:groupmode="layer"
69+ id="layer1">
70+ <rect
71+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
72+ id="rect4136"
73+ width="206"
74+ height="77"
75+ x="236"
76+ y="254.3622"
77+ inkscape:export-xdpi="61.120499"
78+ inkscape:export-ydpi="61.120499" />
79+ <rect
80+ y="388.36218"
81+ x="236"
82+ height="77"
83+ width="206"
84+ id="rect4138"
85+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
86+ inkscape:export-xdpi="61.120499"
87+ inkscape:export-ydpi="61.120499" />
88+ <path
89+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
90+ d="m 328,331.3622 19,55"
91+ id="path4140"
92+ inkscape:connector-curvature="0"
93+ sodipodi:nodetypes="cc"
94+ inkscape:export-xdpi="61.120499"
95+ inkscape:export-ydpi="61.120499" />
96+ <text
97+ xml:space="preserve"
98+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
99+ x="242"
100+ y="271.36221"
101+ id="text5334"
102+ sodipodi:linespacing="125%"
103+ inkscape:export-xdpi="61.120499"
104+ inkscape:export-ydpi="61.120499"><tspan
105+ sodipodi:role="line"
106+ id="tspan5336"
107+ x="242"
108+ y="271.36221"
109+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">Definition Elaborator</tspan></text>
110+ <text
111+ sodipodi:linespacing="125%"
112+ id="text5338"
113+ y="308.36221"
114+ x="253"
115+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
116+ xml:space="preserve"
117+ inkscape:export-xdpi="61.120499"
118+ inkscape:export-ydpi="61.120499"><tspan
119+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
120+ y="308.36221"
121+ x="253"
122+ id="tspan5340"
123+ sodipodi:role="line">definition context</tspan></text>
124+ <text
125+ xml:space="preserve"
126+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
127+ x="243"
128+ y="409.36221"
129+ id="text5342"
130+ sodipodi:linespacing="125%"
131+ inkscape:export-xdpi="61.120499"
132+ inkscape:export-ydpi="61.120499"><tspan
133+ sodipodi:role="line"
134+ id="tspan5344"
135+ x="243"
136+ y="409.36221"
137+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">Term Elaborator</tspan></text>
138+ </g>
139+</svg>
docs/image/elabLogicEx1_1.pngnew file

Binary file not shown.

docs/image/elabLogicEx1_1.svgnew file+99
@@ -0,0 +1,99 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="elabLogicEx1_1.svg"
19+ inkscape:export-filename="/home/mjb/Idris-dev/docs/image/elabLogicEx1_1.png"
20+ inkscape:export-xdpi="61.120499"
21+ inkscape:export-ydpi="61.120499">
22+ <defs
23+ id="defs4" />
24+ <sodipodi:namedview
25+ id="base"
26+ pagecolor="#ffffff"
27+ bordercolor="#666666"
28+ borderopacity="1.0"
29+ inkscape:pageopacity="0.0"
30+ inkscape:pageshadow="2"
31+ inkscape:zoom="1"
32+ inkscape:cx="97.25613"
33+ inkscape:cy="593.17666"
34+ inkscape:document-units="px"
35+ inkscape:current-layer="layer1"
36+ showgrid="false"
37+ inkscape:window-width="1920"
38+ inkscape:window-height="1015"
39+ inkscape:window-x="0"
40+ inkscape:window-y="0"
41+ inkscape:window-maximized="1" />
42+ <metadata
43+ id="metadata7">
44+ <rdf:RDF>
45+ <cc:Work
46+ rdf:about="">
47+ <dc:format>image/svg+xml</dc:format>
48+ <dc:type
49+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
50+ <dc:title />
51+ </cc:Work>
52+ </rdf:RDF>
53+ </metadata>
54+ <g
55+ inkscape:label="Layer 1"
56+ inkscape:groupmode="layer"
57+ id="layer1">
58+ <text
59+ id="text4800"
60+ y="473.36218"
61+ x="205"
62+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
63+ xml:space="preserve"
64+ inkscape:export-xdpi="61.120499"
65+ inkscape:export-ydpi="61.120499"><tspan
66+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
67+ y="473.36218"
68+ x="205"
69+ sodipodi:role="line"
70+ id="tspan4812">hole_2 : pi_arg : Nat -&gt; Nat</tspan></text>
71+ <text
72+ inkscape:export-ydpi="61.120499"
73+ inkscape:export-xdpi="61.120499"
74+ xml:space="preserve"
75+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
76+ x="428.125"
77+ y="472.23718"
78+ id="text4178"><tspan
79+ id="tspan4180"
80+ sodipodi:role="line"
81+ x="428.125"
82+ y="472.23718"
83+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0 : pi_arg : Nat -&gt; Nat</tspan></text>
84+ <path
85+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
86+ d="m 423.125,456.2372 185,-1"
87+ id="path4182"
88+ inkscape:connector-curvature="0"
89+ inkscape:export-xdpi="61.120499"
90+ inkscape:export-ydpi="61.120499" />
91+ <path
92+ inkscape:connector-curvature="0"
93+ id="path4184"
94+ d="m 200,456.3622 185,-1"
95+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
96+ inkscape:export-xdpi="61.120499"
97+ inkscape:export-ydpi="61.120499" />
98+ </g>
99+</svg>
docs/image/elabLogicEx1_2.pngnew file

Binary file not shown.

docs/image/elabLogicEx1_2.svgnew file+112
@@ -0,0 +1,112 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="elabLogicEx1_2.svg"
19+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/elabLogicEx1_1.png"
20+ inkscape:export-xdpi="61.120499"
21+ inkscape:export-ydpi="61.120499">
22+ <defs
23+ id="defs4" />
24+ <sodipodi:namedview
25+ id="base"
26+ pagecolor="#ffffff"
27+ bordercolor="#666666"
28+ borderopacity="1.0"
29+ inkscape:pageopacity="0.0"
30+ inkscape:pageshadow="2"
31+ inkscape:zoom="1"
32+ inkscape:cx="425.25613"
33+ inkscape:cy="593.17666"
34+ inkscape:document-units="px"
35+ inkscape:current-layer="layer1"
36+ showgrid="false"
37+ inkscape:window-width="1920"
38+ inkscape:window-height="1015"
39+ inkscape:window-x="0"
40+ inkscape:window-y="0"
41+ inkscape:window-maximized="1" />
42+ <metadata
43+ id="metadata7">
44+ <rdf:RDF>
45+ <cc:Work
46+ rdf:about="">
47+ <dc:format>image/svg+xml</dc:format>
48+ <dc:type
49+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
50+ <dc:title />
51+ </cc:Work>
52+ </rdf:RDF>
53+ </metadata>
54+ <g
55+ inkscape:label="Layer 1"
56+ inkscape:groupmode="layer"
57+ id="layer1">
58+ <text
59+ id="text4800"
60+ y="473.36218"
61+ x="205"
62+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
63+ xml:space="preserve"
64+ inkscape:export-xdpi="61.120499"
65+ inkscape:export-ydpi="61.120499"><tspan
66+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
67+ y="473.36218"
68+ x="205"
69+ sodipodi:role="line"
70+ id="tspan4812">hole_2 : Nat</tspan></text>
71+ <text
72+ inkscape:export-ydpi="61.120499"
73+ inkscape:export-xdpi="61.120499"
74+ xml:space="preserve"
75+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
76+ x="422.5"
77+ y="472.23718"
78+ id="text4178"><tspan
79+ id="tspan4180"
80+ sodipodi:role="line"
81+ x="422.5"
82+ y="472.23718"
83+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0 : (pi_arg : Nat) -&gt; Nat</tspan></text>
84+ <path
85+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
86+ d="m 417.5,456.2372 185,-1"
87+ id="path4182"
88+ inkscape:connector-curvature="0"
89+ inkscape:export-xdpi="61.120499"
90+ inkscape:export-ydpi="61.120499" />
91+ <path
92+ inkscape:connector-curvature="0"
93+ id="path4184"
94+ d="m 200,456.3622 185,-1"
95+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
96+ inkscape:export-xdpi="61.120499"
97+ inkscape:export-ydpi="61.120499" />
98+ <text
99+ inkscape:export-ydpi="61.120499"
100+ inkscape:export-xdpi="61.120499"
101+ xml:space="preserve"
102+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
103+ x="229"
104+ y="447.36218"
105+ id="text4147"><tspan
106+ id="tspan4149"
107+ sodipodi:role="line"
108+ x="229"
109+ y="447.36218"
110+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">x : Nat</tspan></text>
111+ </g>
112+</svg>
docs/image/elabLogicEx1_3.pngnew file

Binary file not shown.

docs/image/elabLogicEx1_3.svgnew file+112
@@ -0,0 +1,112 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="elabLogicEx1_3.svg"
19+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/elabLogicEx1_1.png"
20+ inkscape:export-xdpi="61.120499"
21+ inkscape:export-ydpi="61.120499">
22+ <defs
23+ id="defs4" />
24+ <sodipodi:namedview
25+ id="base"
26+ pagecolor="#ffffff"
27+ bordercolor="#666666"
28+ borderopacity="1.0"
29+ inkscape:pageopacity="0.0"
30+ inkscape:pageshadow="2"
31+ inkscape:zoom="1"
32+ inkscape:cx="425.25613"
33+ inkscape:cy="593.17666"
34+ inkscape:document-units="px"
35+ inkscape:current-layer="layer1"
36+ showgrid="false"
37+ inkscape:window-width="1920"
38+ inkscape:window-height="1015"
39+ inkscape:window-x="0"
40+ inkscape:window-y="0"
41+ inkscape:window-maximized="1" />
42+ <metadata
43+ id="metadata7">
44+ <rdf:RDF>
45+ <cc:Work
46+ rdf:about="">
47+ <dc:format>image/svg+xml</dc:format>
48+ <dc:type
49+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
50+ <dc:title />
51+ </cc:Work>
52+ </rdf:RDF>
53+ </metadata>
54+ <g
55+ inkscape:label="Layer 1"
56+ inkscape:groupmode="layer"
57+ id="layer1">
58+ <text
59+ id="text4800"
60+ y="473.36218"
61+ x="205"
62+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
63+ xml:space="preserve"
64+ inkscape:export-xdpi="61.120499"
65+ inkscape:export-ydpi="61.120499"><tspan
66+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
67+ y="473.36218"
68+ x="205"
69+ sodipodi:role="line"
70+ id="tspan4812">hole_2 : Nat</tspan></text>
71+ <text
72+ inkscape:export-ydpi="61.120499"
73+ inkscape:export-xdpi="61.120499"
74+ xml:space="preserve"
75+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
76+ x="439.375"
77+ y="472.23718"
78+ id="text4178"><tspan
79+ id="tspan4180"
80+ sodipodi:role="line"
81+ x="439.375"
82+ y="472.23718"
83+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0 : (pi_arg : Nat) -&gt; Nat</tspan></text>
84+ <path
85+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
86+ d="m 434.375,456.2372 185,-1"
87+ id="path4182"
88+ inkscape:connector-curvature="0"
89+ inkscape:export-xdpi="61.120499"
90+ inkscape:export-ydpi="61.120499" />
91+ <path
92+ inkscape:connector-curvature="0"
93+ id="path4184"
94+ d="m 200,456.3622 185,-1"
95+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
96+ inkscape:export-xdpi="61.120499"
97+ inkscape:export-ydpi="61.120499" />
98+ <text
99+ inkscape:export-ydpi="61.120499"
100+ inkscape:export-xdpi="61.120499"
101+ xml:space="preserve"
102+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
103+ x="229"
104+ y="447.36218"
105+ id="text4147"><tspan
106+ id="tspan4149"
107+ sodipodi:role="line"
108+ x="229"
109+ y="447.36218"
110+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">x : Nat</tspan></text>
111+ </g>
112+</svg>
docs/image/elabLogicEx1_4.pngnew file

Binary file not shown.

docs/image/elabLogicEx1_4.svgnew file+80
@@ -0,0 +1,80 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="elabLogicEx1_4.svg"
19+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/elabLogicEx1_1.png"
20+ inkscape:export-xdpi="61.120499"
21+ inkscape:export-ydpi="61.120499">
22+ <defs
23+ id="defs4" />
24+ <sodipodi:namedview
25+ id="base"
26+ pagecolor="#ffffff"
27+ bordercolor="#666666"
28+ borderopacity="1.0"
29+ inkscape:pageopacity="0.0"
30+ inkscape:pageshadow="2"
31+ inkscape:zoom="1"
32+ inkscape:cx="425.25613"
33+ inkscape:cy="593.17666"
34+ inkscape:document-units="px"
35+ inkscape:current-layer="layer1"
36+ showgrid="false"
37+ inkscape:window-width="1157"
38+ inkscape:window-height="1011"
39+ inkscape:window-x="-4"
40+ inkscape:window-y="0"
41+ inkscape:window-maximized="0" />
42+ <metadata
43+ id="metadata7">
44+ <rdf:RDF>
45+ <cc:Work
46+ rdf:about="">
47+ <dc:format>image/svg+xml</dc:format>
48+ <dc:type
49+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
50+ <dc:title />
51+ </cc:Work>
52+ </rdf:RDF>
53+ </metadata>
54+ <g
55+ inkscape:label="Layer 1"
56+ inkscape:groupmode="layer"
57+ id="layer1">
58+ <text
59+ inkscape:export-ydpi="61.120499"
60+ inkscape:export-xdpi="61.120499"
61+ xml:space="preserve"
62+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
63+ x="205"
64+ y="500.36218"
65+ id="text4178"
66+ sodipodi:linespacing="125%"><tspan
67+ id="tspan4180"
68+ sodipodi:role="line"
69+ x="205"
70+ y="500.36218"
71+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0 : (pi_arg : Nat) -&gt; Nat</tspan></text>
72+ <path
73+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
74+ d="m 200,484.3622 185,-1"
75+ id="path4182"
76+ inkscape:connector-curvature="0"
77+ inkscape:export-xdpi="61.120499"
78+ inkscape:export-ydpi="61.120499" />
79+ </g>
80+</svg>
docs/image/elabOverview.pngnew file

Binary file not shown.

docs/image/elabOverview.svgnew file+585
@@ -0,0 +1,585 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="elabOverview.svg"
19+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/data.png"
20+ inkscape:export-xdpi="61.120499"
21+ inkscape:export-ydpi="61.120499">
22+ <defs
23+ id="defs4">
24+ <marker
25+ inkscape:stockid="Arrow1Mend"
26+ orient="auto"
27+ refY="0.0"
28+ refX="0.0"
29+ id="marker4738"
30+ style="overflow:visible;"
31+ inkscape:isstock="true">
32+ <path
33+ id="path4491"
34+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
35+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
36+ transform="scale(0.4) rotate(180) translate(10,0)" />
37+ </marker>
38+ <marker
39+ inkscape:stockid="Arrow1Mend"
40+ orient="auto"
41+ refY="0.0"
42+ refX="0.0"
43+ id="marker4672"
44+ style="overflow:visible;"
45+ inkscape:isstock="true">
46+ <path
47+ id="path4425"
48+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
49+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
50+ transform="scale(0.4) rotate(180) translate(10,0)" />
51+ </marker>
52+ <marker
53+ inkscape:stockid="Arrow1Mend"
54+ orient="auto"
55+ refY="0.0"
56+ refX="0.0"
57+ id="Arrow1Mend"
58+ style="overflow:visible;"
59+ inkscape:isstock="true">
60+ <path
61+ id="path4418"
62+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
63+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
64+ transform="scale(0.4) rotate(180) translate(10,0)" />
65+ </marker>
66+ <marker
67+ inkscape:stockid="Arrow1Mend"
68+ orient="auto"
69+ refY="0"
70+ refX="0"
71+ id="marker5018"
72+ style="overflow:visible"
73+ inkscape:isstock="true">
74+ <path
75+ inkscape:connector-curvature="0"
76+ id="path5020"
77+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
78+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
79+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
80+ </marker>
81+ </defs>
82+ <sodipodi:namedview
83+ id="base"
84+ pagecolor="#ffffff"
85+ bordercolor="#666666"
86+ borderopacity="1.0"
87+ inkscape:pageopacity="0.0"
88+ inkscape:pageshadow="2"
89+ inkscape:zoom="1"
90+ inkscape:cx="258.17464"
91+ inkscape:cy="544.34419"
92+ inkscape:document-units="px"
93+ inkscape:current-layer="layer1"
94+ showgrid="false"
95+ inkscape:window-width="1920"
96+ inkscape:window-height="1015"
97+ inkscape:window-x="0"
98+ inkscape:window-y="0"
99+ inkscape:window-maximized="1" />
100+ <metadata
101+ id="metadata7">
102+ <rdf:RDF>
103+ <cc:Work
104+ rdf:about="">
105+ <dc:format>image/svg+xml</dc:format>
106+ <dc:type
107+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
108+ <dc:title />
109+ </cc:Work>
110+ </rdf:RDF>
111+ </metadata>
112+ <g
113+ inkscape:label="Layer 1"
114+ inkscape:groupmode="layer"
115+ id="layer1">
116+ <text
117+ xml:space="preserve"
118+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
119+ x="268"
120+ y="495.36218"
121+ id="text4136"
122+ sodipodi:linespacing="125%"
123+ inkscape:export-xdpi="61.120499"
124+ inkscape:export-ydpi="61.120499"><tspan
125+ sodipodi:role="line"
126+ id="tspan4138"
127+ x="268"
128+ y="495.36218"
129+ style="font-size:12.5px">data TT : Type where</tspan><tspan
130+ sodipodi:role="line"
131+ x="268"
132+ y="510.98718"
133+ id="tspan4140"
134+ style="font-size:12.5px"> P : NameType -&gt; TTName -&gt; TT -&gt; TT</tspan><tspan
135+ sodipodi:role="line"
136+ x="268"
137+ y="526.61218"
138+ style="font-size:12.5px"
139+ id="tspan4142"> V : Int -&gt; TT</tspan><tspan
140+ sodipodi:role="line"
141+ x="268"
142+ y="542.23718"
143+ style="font-size:12.5px"
144+ id="tspan4144"> Bind : TTName -&gt; Binder TT -&gt; TT -&gt; TT</tspan><tspan
145+ sodipodi:role="line"
146+ x="268"
147+ y="557.86218"
148+ style="font-size:12.5px"
149+ id="tspan4146"> App : TT -&gt; TT -&gt; TT</tspan><tspan
150+ sodipodi:role="line"
151+ x="268"
152+ y="573.48718"
153+ style="font-size:12.5px"
154+ id="tspan4148"> TConst : Const -&gt; TT</tspan><tspan
155+ sodipodi:role="line"
156+ x="268"
157+ y="589.11218"
158+ style="font-size:12.5px"
159+ id="tspan4150"> Erased : TT</tspan><tspan
160+ sodipodi:role="line"
161+ x="268"
162+ y="604.73718"
163+ style="font-size:12.5px"
164+ id="tspan4152"> TType : TTUExp -&gt; TT</tspan><tspan
165+ sodipodi:role="line"
166+ x="268"
167+ y="620.36218"
168+ style="font-size:12.5px"
169+ id="tspan4154"> UType : Universe -&gt; TT</tspan></text>
170+ <text
171+ sodipodi:linespacing="125%"
172+ id="text4156"
173+ y="485.36218"
174+ x="509"
175+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
176+ xml:space="preserve"
177+ inkscape:export-xdpi="61.120499"
178+ inkscape:export-ydpi="61.120499"><tspan
179+ id="tspan4174"
180+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
181+ y="485.36218"
182+ x="509"
183+ sodipodi:role="line">globally defined variable</tspan><tspan
184+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
185+ y="500.98718"
186+ x="509"
187+ sodipodi:role="line"
188+ id="tspan4197"> from name</tspan></text>
189+ <path
190+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
191+ d="m 486,500.3622 19,-14"
192+ id="path4220"
193+ inkscape:connector-curvature="0"
194+ inkscape:export-xdpi="61.120499"
195+ inkscape:export-ydpi="61.120499"
196+ sodipodi:nodetypes="cc" />
197+ <text
198+ xml:space="preserve"
199+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
200+ x="392"
201+ y="526.36218"
202+ id="text4222"
203+ sodipodi:linespacing="125%"
204+ inkscape:export-xdpi="61.120499"
205+ inkscape:export-ydpi="61.120499"><tspan
206+ sodipodi:role="line"
207+ x="392"
208+ y="526.36218"
209+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
210+ id="tspan4224">local (de Bruijn) variable</tspan></text>
211+ <path
212+ inkscape:connector-curvature="0"
213+ id="path4226"
214+ d="m 351,524.3622 34,-4"
215+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
216+ sodipodi:nodetypes="cc"
217+ inkscape:export-xdpi="61.120499"
218+ inkscape:export-ydpi="61.120499" />
219+ <text
220+ xml:space="preserve"
221+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
222+ x="537"
223+ y="533.36218"
224+ id="text4228"
225+ sodipodi:linespacing="125%"
226+ inkscape:export-xdpi="61.120499"
227+ inkscape:export-ydpi="61.120499"><tspan
228+ sodipodi:role="line"
229+ x="537"
230+ y="533.36218"
231+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
232+ id="tspan4230">any kind of binder</tspan><tspan
233+ sodipodi:role="line"
234+ x="537"
235+ y="548.98718"
236+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
237+ id="tspan4234">lambda, let etc.</tspan></text>
238+ <path
239+ inkscape:connector-curvature="0"
240+ id="path4232"
241+ d="m 494,538.3622 39,-8"
242+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
243+ inkscape:export-xdpi="61.120499"
244+ inkscape:export-ydpi="61.120499"
245+ sodipodi:nodetypes="cc" />
246+ <text
247+ xml:space="preserve"
248+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
249+ x="417"
250+ y="555.36218"
251+ id="text4236"
252+ sodipodi:linespacing="125%"
253+ inkscape:export-xdpi="61.120499"
254+ inkscape:export-ydpi="61.120499"><tspan
255+ sodipodi:role="line"
256+ x="417"
257+ y="555.36218"
258+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
259+ id="tspan4238">function application</tspan></text>
260+ <path
261+ inkscape:connector-curvature="0"
262+ id="path4240"
263+ d="m 392,554.3622 22,-2"
264+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
265+ sodipodi:nodetypes="cc"
266+ inkscape:export-xdpi="61.120499"
267+ inkscape:export-ydpi="61.120499" />
268+ <text
269+ sodipodi:linespacing="125%"
270+ id="text4253"
271+ y="569.36218"
272+ x="421"
273+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
274+ xml:space="preserve"
275+ inkscape:export-xdpi="61.120499"
276+ inkscape:export-ydpi="61.120499"><tspan
277+ id="tspan4255"
278+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
279+ y="569.36218"
280+ x="421"
281+ sodipodi:role="line">intager, char, string, etc.</tspan></text>
282+ <path
283+ sodipodi:nodetypes="cc"
284+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
285+ d="m 396,568.3622 22,-2"
286+ id="path4257"
287+ inkscape:connector-curvature="0"
288+ inkscape:export-xdpi="61.120499"
289+ inkscape:export-ydpi="61.120499" />
290+ <text
291+ xml:space="preserve"
292+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
293+ x="374"
294+ y="586.36218"
295+ id="text4270"
296+ sodipodi:linespacing="125%"
297+ inkscape:export-xdpi="61.120499"
298+ inkscape:export-ydpi="61.120499"><tspan
299+ sodipodi:role="line"
300+ x="374"
301+ y="586.36218"
302+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
303+ id="tspan4272">unknown term for erasing types</tspan></text>
304+ <path
305+ inkscape:connector-curvature="0"
306+ id="path4274"
307+ d="m 349,585.3622 22,-2"
308+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
309+ sodipodi:nodetypes="cc"
310+ inkscape:export-xdpi="61.120499"
311+ inkscape:export-ydpi="61.120499" />
312+ <text
313+ sodipodi:linespacing="125%"
314+ id="text4276"
315+ y="603.36218"
316+ x="429"
317+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
318+ xml:space="preserve"
319+ inkscape:export-xdpi="61.120499"
320+ inkscape:export-ydpi="61.120499"><tspan
321+ id="tspan4278"
322+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
323+ y="603.36218"
324+ x="429"
325+ sodipodi:role="line">type of types</tspan></text>
326+ <path
327+ sodipodi:nodetypes="cc"
328+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
329+ d="m 404,602.3622 22,-2"
330+ id="path4280"
331+ inkscape:connector-curvature="0"
332+ inkscape:export-xdpi="61.120499"
333+ inkscape:export-ydpi="61.120499" />
334+ <text
335+ xml:space="preserve"
336+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
337+ x="433"
338+ y="619.36218"
339+ id="text4293"
340+ sodipodi:linespacing="125%"
341+ inkscape:export-xdpi="61.120499"
342+ inkscape:export-ydpi="61.120499"><tspan
343+ sodipodi:role="line"
344+ x="433"
345+ y="619.36218"
346+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
347+ id="tspan4295">unique universe</tspan></text>
348+ <path
349+ inkscape:connector-curvature="0"
350+ id="path4297"
351+ d="m 408,618.3622 22,-2"
352+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
353+ sodipodi:nodetypes="cc"
354+ inkscape:export-xdpi="61.120499"
355+ inkscape:export-ydpi="61.120499" />
356+ <text
357+ sodipodi:linespacing="125%"
358+ id="text4397"
359+ y="463.36218"
360+ x="375"
361+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
362+ xml:space="preserve"
363+ inkscape:export-xdpi="61.120499"
364+ inkscape:export-ydpi="61.120499"><tspan
365+ id="tspan4399"
366+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff"
367+ y="463.36218"
368+ x="375"
369+ sodipodi:role="line">elements of core language</tspan></text>
370+ <rect
371+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
372+ id="rect4400"
373+ width="392"
374+ height="185"
375+ x="262"
376+ y="447.36218"
377+ inkscape:export-xdpi="61.120499"
378+ inkscape:export-ydpi="61.120499" />
379+ <text
380+ xml:space="preserve"
381+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
382+ x="264"
383+ y="466.36218"
384+ id="text4402"
385+ sodipodi:linespacing="125%"
386+ inkscape:export-xdpi="61.120499"
387+ inkscape:export-ydpi="61.120499"><tspan
388+ sodipodi:role="line"
389+ id="tspan4404"
390+ x="264"
391+ y="466.36218"
392+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">TT</tspan></text>
393+ <text
394+ inkscape:export-ydpi="61.120499"
395+ inkscape:export-xdpi="61.120499"
396+ sodipodi:linespacing="125%"
397+ id="text4328"
398+ y="262.36218"
399+ x="96"
400+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
401+ xml:space="preserve"><tspan
402+ id="tspan4346"
403+ style="font-size:12.5px"
404+ y="262.36218"
405+ x="96"
406+ sodipodi:role="line">env</tspan><tspan
407+ style="font-size:12.5px"
408+ y="277.98718"
409+ x="96"
410+ sodipodi:role="line"
411+ id="tspan4454">goal</tspan><tspan
412+ style="font-size:12.5px"
413+ y="293.61218"
414+ x="96"
415+ sodipodi:role="line"
416+ id="tspan4456">holes</tspan><tspan
417+ style="font-size:12.5px"
418+ y="309.23718"
419+ x="96"
420+ sodipodi:role="line"
421+ id="tspan4458">guess</tspan></text>
422+ <text
423+ inkscape:export-ydpi="61.120499"
424+ inkscape:export-xdpi="61.120499"
425+ xml:space="preserve"
426+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
427+ x="163"
428+ y="262.36218"
429+ id="text4348"
430+ sodipodi:linespacing="125%"><tspan
431+ id="tspan4352"
432+ sodipodi:role="line"
433+ x="163"
434+ y="262.36218"
435+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000">Elab (List (TTName, Binder TT)</tspan><tspan
436+ sodipodi:role="line"
437+ x="163"
438+ y="277.98718"
439+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
440+ id="tspan4462">Elab (TTName,TT)</tspan><tspan
441+ sodipodi:role="line"
442+ x="163"
443+ y="293.61218"
444+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
445+ id="tspan4464">Elab (List TTName)</tspan><tspan
446+ sodipodi:role="line"
447+ x="163"
448+ y="309.23718"
449+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
450+ id="tspan4466">Elab (TT)</tspan></text>
451+ <path
452+ inkscape:export-ydpi="61.120499"
453+ inkscape:export-xdpi="61.120499"
454+ sodipodi:nodetypes="cc"
455+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
456+ d="M 124.13676,260.36509 158,260.3622"
457+ id="path4360"
458+ inkscape:connector-curvature="0" />
459+ <text
460+ inkscape:export-ydpi="61.120499"
461+ inkscape:export-xdpi="61.120499"
462+ xml:space="preserve"
463+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
464+ x="64"
465+ y="286.36218"
466+ id="text4400"
467+ sodipodi:linespacing="125%"><tspan
468+ sodipodi:role="line"
469+ x="64"
470+ y="286.36218"
471+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff"
472+ id="tspan4402">state</tspan></text>
473+ <rect
474+ inkscape:export-ydpi="61.120499"
475+ inkscape:export-xdpi="61.120499"
476+ y="219.36218"
477+ x="53"
478+ height="224"
479+ width="289"
480+ id="rect4404"
481+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
482+ <text
483+ inkscape:export-ydpi="61.120499"
484+ inkscape:export-xdpi="61.120499"
485+ sodipodi:linespacing="125%"
486+ id="text4406"
487+ y="238.36218"
488+ x="55"
489+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
490+ xml:space="preserve"><tspan
491+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
492+ y="238.36218"
493+ x="55"
494+ id="tspan4408"
495+ sodipodi:role="line">Elab Monad</tspan></text>
496+ <path
497+ inkscape:connector-curvature="0"
498+ id="path4468"
499+ d="M 124.13676,274.36509 158,274.3622"
500+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
501+ sodipodi:nodetypes="cc"
502+ inkscape:export-xdpi="61.120499"
503+ inkscape:export-ydpi="61.120499" />
504+ <path
505+ inkscape:export-ydpi="61.120499"
506+ inkscape:export-xdpi="61.120499"
507+ sodipodi:nodetypes="cc"
508+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
509+ d="M 128.13676,288.36509 158,288.3622"
510+ id="path4470"
511+ inkscape:connector-curvature="0" />
512+ <path
513+ inkscape:connector-curvature="0"
514+ id="path4472"
515+ d="M 132.13676,304.36509 158,304.3622"
516+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
517+ sodipodi:nodetypes="cc"
518+ inkscape:export-xdpi="61.120499"
519+ inkscape:export-ydpi="61.120499" />
520+ <path
521+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4738)"
522+ d="m 275,272.3622 c 75.17677,4.63671 121.00356,120.13548 126,174"
523+ id="path4476"
524+ inkscape:connector-curvature="0"
525+ sodipodi:nodetypes="cc"
526+ inkscape:export-xdpi="61.120499"
527+ inkscape:export-ydpi="61.120499" />
528+ <path
529+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
530+ d="m 189,320.3622 c 50.81716,51.06633 -107.1143,53.76268 -56,0"
531+ id="path12613"
532+ inkscape:connector-curvature="0"
533+ sodipodi:nodetypes="cc"
534+ inkscape:export-xdpi="61.120499"
535+ inkscape:export-ydpi="61.120499" />
536+ <text
537+ xml:space="preserve"
538+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
539+ x="147"
540+ y="373.36218"
541+ id="text15201"
542+ sodipodi:linespacing="125%"
543+ inkscape:export-xdpi="61.120499"
544+ inkscape:export-ydpi="61.120499"><tspan
545+ id="tspan15209"
546+ sodipodi:role="line"
547+ x="147"
548+ y="373.36218"
549+ style="font-size:12.5px">solve</tspan><tspan
550+ sodipodi:role="line"
551+ x="147"
552+ y="388.98718"
553+ style="font-size:12.5px"
554+ id="tspan15220">fill</tspan><tspan
555+ sodipodi:role="line"
556+ x="147"
557+ y="404.61218"
558+ style="font-size:12.5px"
559+ id="tspan15222">apply</tspan><tspan
560+ sodipodi:role="line"
561+ x="147"
562+ y="420.23718"
563+ style="font-size:12.5px"
564+ id="tspan15224">focus</tspan><tspan
565+ sodipodi:role="line"
566+ x="147"
567+ y="435.86218"
568+ style="font-size:12.5px"
569+ id="tspan15226">...</tspan></text>
570+ <text
571+ sodipodi:linespacing="125%"
572+ id="text18672"
573+ y="396.36218"
574+ x="94"
575+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
576+ xml:space="preserve"
577+ inkscape:export-xdpi="61.120499"
578+ inkscape:export-ydpi="61.120499"><tspan
579+ id="tspan18674"
580+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff"
581+ y="396.36218"
582+ x="94"
583+ sodipodi:role="line">tactics</tspan></text>
584+ </g>
585+</svg>
docs/image/elabProofState.pngnew file

Binary file not shown.

docs/image/elabProofState.svgnew file+356
@@ -0,0 +1,356 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="elabProofState.svg">
19+ <defs
20+ id="defs4" />
21+ <sodipodi:namedview
22+ id="base"
23+ pagecolor="#ffffff"
24+ bordercolor="#666666"
25+ borderopacity="1.0"
26+ inkscape:pageopacity="0.0"
27+ inkscape:pageshadow="2"
28+ inkscape:zoom="1"
29+ inkscape:cx="252.75613"
30+ inkscape:cy="520"
31+ inkscape:document-units="px"
32+ inkscape:current-layer="layer1"
33+ showgrid="false"
34+ inkscape:window-width="1920"
35+ inkscape:window-height="1015"
36+ inkscape:window-x="0"
37+ inkscape:window-y="0"
38+ inkscape:window-maximized="1" />
39+ <metadata
40+ id="metadata7">
41+ <rdf:RDF>
42+ <cc:Work
43+ rdf:about="">
44+ <dc:format>image/svg+xml</dc:format>
45+ <dc:type
46+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
47+ <dc:title />
48+ </cc:Work>
49+ </rdf:RDF>
50+ </metadata>
51+ <g
52+ inkscape:label="Layer 1"
53+ inkscape:groupmode="layer"
54+ id="layer1">
55+ <text
56+ sodipodi:linespacing="125%"
57+ id="text4148"
58+ y="330.36218"
59+ x="219"
60+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
61+ xml:space="preserve"
62+ inkscape:export-xdpi="61.120499"
63+ inkscape:export-ydpi="61.120499"><tspan
64+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
65+ y="330.36218"
66+ x="219"
67+ id="tspan4150"
68+ sodipodi:role="line">current proof</tspan><tspan
69+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
70+ y="349.11218"
71+ x="219"
72+ sodipodi:role="line"
73+ id="tspan4206"> term</tspan></text>
74+ <text
75+ xml:space="preserve"
76+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
77+ x="240"
78+ y="303.36218"
79+ id="text4160"
80+ sodipodi:linespacing="125%"
81+ inkscape:export-xdpi="61.120499"
82+ inkscape:export-ydpi="61.120499"><tspan
83+ sodipodi:role="line"
84+ id="tspan4162"
85+ x="240"
86+ y="303.36218"
87+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">(TTName, TT)</tspan></text>
88+ <text
89+ sodipodi:linespacing="125%"
90+ id="text4202"
91+ y="392.36218"
92+ x="355"
93+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
94+ xml:space="preserve"
95+ inkscape:export-xdpi="61.120499"
96+ inkscape:export-ydpi="61.120499"><tspan
97+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
98+ y="392.36218"
99+ x="355"
100+ id="tspan4204"
101+ sodipodi:role="line">original goal</tspan></text>
102+ <text
103+ xml:space="preserve"
104+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
105+ x="213"
106+ y="377.36218"
107+ id="text4208"
108+ sodipodi:linespacing="125%"
109+ inkscape:export-xdpi="61.120499"
110+ inkscape:export-ydpi="61.120499"><tspan
111+ id="tspan4212"
112+ sodipodi:role="line"
113+ x="213"
114+ y="377.36218"
115+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">path</tspan><tspan
116+ sodipodi:role="line"
117+ x="213"
118+ y="396.11218"
119+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
120+ id="tspan4216">subterm</tspan><tspan
121+ sodipodi:role="line"
122+ x="213"
123+ y="414.86218"
124+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
125+ id="tspan4218">updates</tspan></text>
126+ <text
127+ sodipodi:linespacing="125%"
128+ id="text4230"
129+ y="487.36218"
130+ x="148"
131+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
132+ xml:space="preserve"
133+ inkscape:export-xdpi="61.120499"
134+ inkscape:export-ydpi="61.120499"><tspan
135+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
136+ y="487.36218"
137+ x="148"
138+ sodipodi:role="line"
139+ id="tspan4243">Contexts used for global definitions and for proof state.</tspan><tspan
140+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
141+ y="506.11218"
142+ x="148"
143+ sodipodi:role="line"
144+ id="tspan4190">They contain universe constraints and existing definitions.</tspan><tspan
145+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
146+ y="524.86218"
147+ x="148"
148+ sodipodi:role="line"
149+ id="tspan4253">Also store maximum RigCount of the namel</tspan></text>
150+ <text
151+ inkscape:export-ydpi="61.120499"
152+ inkscape:export-xdpi="61.120499"
153+ sodipodi:linespacing="125%"
154+ id="text4173"
155+ y="198.36218"
156+ x="135"
157+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
158+ xml:space="preserve"><tspan
159+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
160+ y="198.36218"
161+ x="135"
162+ id="tspan4175"
163+ sodipodi:role="line">Environment</tspan></text>
164+ <text
165+ xml:space="preserve"
166+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
167+ x="350"
168+ y="197.36218"
169+ id="text4177"
170+ sodipodi:linespacing="125%"
171+ inkscape:export-xdpi="61.120499"
172+ inkscape:export-ydpi="61.120499"><tspan
173+ sodipodi:role="line"
174+ id="tspan4179"
175+ x="350"
176+ y="197.36218"
177+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1">Holes</tspan></text>
178+ <text
179+ inkscape:export-ydpi="61.120499"
180+ inkscape:export-xdpi="61.120499"
181+ sodipodi:linespacing="125%"
182+ id="text4181"
183+ y="197.36218"
184+ x="460"
185+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
186+ xml:space="preserve"><tspan
187+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
188+ y="197.36218"
189+ x="460"
190+ id="tspan4183"
191+ sodipodi:role="line">Guess</tspan></text>
192+ <text
193+ inkscape:export-ydpi="61.120499"
194+ inkscape:export-xdpi="61.120499"
195+ sodipodi:linespacing="125%"
196+ id="text4185"
197+ y="199.36218"
198+ x="247"
199+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
200+ xml:space="preserve"><tspan
201+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
202+ y="199.36218"
203+ x="247"
204+ id="tspan4187"
205+ sodipodi:role="line">Goal</tspan></text>
206+ <rect
207+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
208+ id="rect4189"
209+ width="95"
210+ height="32"
211+ x="134"
212+ y="205.3622"
213+ inkscape:export-xdpi="61.120499"
214+ inkscape:export-ydpi="61.120499" />
215+ <rect
216+ y="205.3622"
217+ x="241"
218+ height="32"
219+ width="95"
220+ id="rect4191"
221+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
222+ inkscape:export-xdpi="61.120499"
223+ inkscape:export-ydpi="61.120499" />
224+ <rect
225+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
226+ id="rect4195"
227+ width="95"
228+ height="32"
229+ x="454"
230+ y="205.3622"
231+ inkscape:export-xdpi="61.120499"
232+ inkscape:export-ydpi="61.120499" />
233+ <rect
234+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
235+ id="rect4197"
236+ width="95"
237+ height="32"
238+ x="346"
239+ y="237.3622"
240+ inkscape:export-xdpi="61.120499"
241+ inkscape:export-ydpi="61.120499" />
242+ <rect
243+ y="269.36218"
244+ x="346"
245+ height="32"
246+ width="95"
247+ id="rect4199"
248+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
249+ inkscape:export-xdpi="61.120499"
250+ inkscape:export-ydpi="61.120499" />
251+ <rect
252+ y="205.3622"
253+ x="346"
254+ height="32"
255+ width="95"
256+ id="rect4201"
257+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
258+ inkscape:export-xdpi="61.120499"
259+ inkscape:export-ydpi="61.120499" />
260+ <path
261+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
262+ d="m 169,242.3622 -9,184"
263+ id="path4206"
264+ inkscape:connector-curvature="0"
265+ inkscape:export-xdpi="61.120499"
266+ inkscape:export-ydpi="61.120499"
267+ sodipodi:nodetypes="cc" />
268+ <path
269+ inkscape:connector-curvature="0"
270+ id="path4208"
271+ d="m 301,240.3622 -26,46"
272+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
273+ sodipodi:nodetypes="cc"
274+ inkscape:export-xdpi="61.120499"
275+ inkscape:export-ydpi="61.120499" />
276+ <text
277+ inkscape:export-ydpi="61.120499"
278+ inkscape:export-xdpi="61.120499"
279+ xml:space="preserve"
280+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
281+ x="360"
282+ y="366.36218"
283+ id="text4210"
284+ sodipodi:linespacing="125%"><tspan
285+ sodipodi:role="line"
286+ id="tspan4213"
287+ x="360"
288+ y="366.36218"
289+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">focus</tspan></text>
290+ <rect
291+ inkscape:export-ydpi="61.120499"
292+ inkscape:export-xdpi="61.120499"
293+ y="237.3622"
294+ x="134"
295+ height="32"
296+ width="95"
297+ id="rect4747"
298+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
299+ <rect
300+ inkscape:export-ydpi="61.120499"
301+ inkscape:export-xdpi="61.120499"
302+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
303+ id="rect4749"
304+ width="95"
305+ height="32"
306+ x="134"
307+ y="269.36218" />
308+ <text
309+ inkscape:export-ydpi="61.120499"
310+ inkscape:export-xdpi="61.120499"
311+ xml:space="preserve"
312+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
313+ x="148"
314+ y="450.36218"
315+ id="text4751"
316+ sodipodi:linespacing="125%"><tspan
317+ id="tspan4757"
318+ sodipodi:role="line"
319+ x="148"
320+ y="450.36218"
321+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">List (TTName, Binder TT)</tspan><tspan
322+ sodipodi:role="line"
323+ x="148"
324+ y="469.11218"
325+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
326+ id="tspan4182">Open unification constaints.</tspan></text>
327+ <text
328+ inkscape:export-ydpi="61.120499"
329+ inkscape:export-xdpi="61.120499"
330+ xml:space="preserve"
331+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
332+ x="349.25366"
333+ y="319.99084"
334+ id="text4210-3"
335+ sodipodi:linespacing="125%"><tspan
336+ sodipodi:role="line"
337+ id="tspan4213-6"
338+ x="349.25366"
339+ y="319.99084"
340+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">List TTName</tspan></text>
341+ <text
342+ sodipodi:linespacing="125%"
343+ id="text4782"
344+ y="251.99084"
345+ x="495.25366"
346+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
347+ xml:space="preserve"
348+ inkscape:export-xdpi="61.120499"
349+ inkscape:export-ydpi="61.120499"><tspan
350+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
351+ y="251.99084"
352+ x="495.25366"
353+ id="tspan4784"
354+ sodipodi:role="line">TT</tspan></text>
355+ </g>
356+</svg>
docs/image/elabProofStateEx1_1.pngnew file

Binary file not shown.

docs/image/elabProofStateEx1_1.svgnew file+312
@@ -0,0 +1,312 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="elabProofStateEx1_1.svg">
19+ <defs
20+ id="defs4" />
21+ <sodipodi:namedview
22+ id="base"
23+ pagecolor="#ffffff"
24+ bordercolor="#666666"
25+ borderopacity="1.0"
26+ inkscape:pageopacity="0.0"
27+ inkscape:pageshadow="2"
28+ inkscape:zoom="1"
29+ inkscape:cx="298"
30+ inkscape:cy="772.5"
31+ inkscape:document-units="px"
32+ inkscape:current-layer="layer1"
33+ showgrid="false"
34+ inkscape:window-width="1920"
35+ inkscape:window-height="1015"
36+ inkscape:window-x="0"
37+ inkscape:window-y="0"
38+ inkscape:window-maximized="1" />
39+ <metadata
40+ id="metadata7">
41+ <rdf:RDF>
42+ <cc:Work
43+ rdf:about="">
44+ <dc:format>image/svg+xml</dc:format>
45+ <dc:type
46+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
47+ <dc:title />
48+ </cc:Work>
49+ </rdf:RDF>
50+ </metadata>
51+ <g
52+ inkscape:label="Layer 1"
53+ inkscape:groupmode="layer"
54+ id="layer1">
55+ <text
56+ sodipodi:linespacing="125%"
57+ id="text4140"
58+ y="226.36218"
59+ x="401"
60+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
61+ xml:space="preserve"
62+ inkscape:export-xdpi="61.120499"
63+ inkscape:export-ydpi="61.120499"><tspan
64+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
65+ y="226.36218"
66+ x="401"
67+ sodipodi:role="line"
68+ id="tspan4144">hole_2</tspan></text>
69+ <text
70+ inkscape:export-ydpi="61.120499"
71+ inkscape:export-xdpi="61.120499"
72+ sodipodi:linespacing="125%"
73+ id="text4173"
74+ y="198.36218"
75+ x="135"
76+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
77+ xml:space="preserve"><tspan
78+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
79+ y="198.36218"
80+ x="135"
81+ id="tspan4175"
82+ sodipodi:role="line">Environment</tspan></text>
83+ <text
84+ xml:space="preserve"
85+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
86+ x="393"
87+ y="197.36218"
88+ id="text4177"
89+ sodipodi:linespacing="125%"
90+ inkscape:export-xdpi="61.120499"
91+ inkscape:export-ydpi="61.120499"><tspan
92+ sodipodi:role="line"
93+ id="tspan4179"
94+ x="393"
95+ y="197.36218"
96+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1">Holes</tspan></text>
97+ <text
98+ inkscape:export-ydpi="61.120499"
99+ inkscape:export-xdpi="61.120499"
100+ sodipodi:linespacing="125%"
101+ id="text4181"
102+ y="197.36218"
103+ x="503"
104+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
105+ xml:space="preserve"><tspan
106+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
107+ y="197.36218"
108+ x="503"
109+ id="tspan4183"
110+ sodipodi:role="line">Guess</tspan></text>
111+ <text
112+ inkscape:export-ydpi="61.120499"
113+ inkscape:export-xdpi="61.120499"
114+ sodipodi:linespacing="125%"
115+ id="text4185"
116+ y="199.36218"
117+ x="247"
118+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
119+ xml:space="preserve"><tspan
120+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
121+ y="199.36218"
122+ x="247"
123+ id="tspan4187"
124+ sodipodi:role="line">Goal</tspan></text>
125+ <rect
126+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
127+ id="rect4189"
128+ width="39"
129+ height="32"
130+ x="134"
131+ y="205.3622"
132+ inkscape:export-xdpi="61.120499"
133+ inkscape:export-ydpi="61.120499" />
134+ <rect
135+ y="206.3622"
136+ x="182"
137+ height="32"
138+ width="200"
139+ id="rect4191"
140+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
141+ inkscape:export-xdpi="61.120499"
142+ inkscape:export-ydpi="61.120499" />
143+ <rect
144+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
145+ id="rect4195"
146+ width="95"
147+ height="32"
148+ x="494"
149+ y="206.3622"
150+ inkscape:export-xdpi="61.120499"
151+ inkscape:export-ydpi="61.120499" />
152+ <rect
153+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
154+ id="rect4197"
155+ width="95"
156+ height="32"
157+ x="389"
158+ y="237.3622"
159+ inkscape:export-xdpi="61.120499"
160+ inkscape:export-ydpi="61.120499" />
161+ <rect
162+ y="269.36218"
163+ x="389"
164+ height="32"
165+ width="95"
166+ id="rect4199"
167+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
168+ inkscape:export-xdpi="61.120499"
169+ inkscape:export-ydpi="61.120499" />
170+ <rect
171+ y="205.3622"
172+ x="389"
173+ height="32"
174+ width="95"
175+ id="rect4201"
176+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
177+ inkscape:export-xdpi="61.120499"
178+ inkscape:export-ydpi="61.120499" />
179+ <text
180+ inkscape:export-ydpi="61.120499"
181+ inkscape:export-xdpi="61.120499"
182+ xml:space="preserve"
183+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
184+ x="400"
185+ y="257.36218"
186+ id="text4276"
187+ sodipodi:linespacing="125%"><tspan
188+ id="tspan4280"
189+ sodipodi:role="line"
190+ x="400"
191+ y="257.36218"
192+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0</tspan></text>
193+ <text
194+ sodipodi:linespacing="125%"
195+ id="text4159"
196+ y="225.36218"
197+ x="141"
198+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
199+ xml:space="preserve"
200+ inkscape:export-xdpi="61.120499"
201+ inkscape:export-ydpi="61.120499"><tspan
202+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
203+ y="225.36218"
204+ x="141"
205+ sodipodi:role="line"
206+ id="tspan4161">[ ]</tspan></text>
207+ <text
208+ sodipodi:linespacing="125%"
209+ id="text4163"
210+ y="275.36218"
211+ x="135"
212+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
213+ xml:space="preserve"
214+ inkscape:export-xdpi="61.120499"
215+ inkscape:export-ydpi="61.120499"><tspan
216+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
217+ y="275.36218"
218+ x="135"
219+ sodipodi:role="line"
220+ id="tspan4165">starts off empty</tspan></text>
221+ <path
222+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
223+ d="m 154,237.3622 0,25"
224+ id="path4167"
225+ inkscape:connector-curvature="0"
226+ inkscape:export-xdpi="61.120499"
227+ inkscape:export-ydpi="61.120499"
228+ sodipodi:nodetypes="cc" />
229+ <text
230+ inkscape:export-ydpi="61.120499"
231+ inkscape:export-xdpi="61.120499"
232+ xml:space="preserve"
233+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
234+ x="188"
235+ y="227.36218"
236+ id="text4786"
237+ sodipodi:linespacing="125%"><tspan
238+ sodipodi:role="line"
239+ x="188"
240+ y="227.36218"
241+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
242+ id="tspan4790">(hole_2 , pi_arg : Nat-&gt;Nat)</tspan></text>
243+ <text
244+ inkscape:export-ydpi="61.120499"
245+ inkscape:export-xdpi="61.120499"
246+ xml:space="preserve"
247+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
248+ x="233.57927"
249+ y="309.21585"
250+ id="text4794"
251+ sodipodi:linespacing="125%"><tspan
252+ id="tspan4796"
253+ sodipodi:role="line"
254+ x="233.57927"
255+ y="309.21585"
256+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">this is the signature</tspan><tspan
257+ sodipodi:role="line"
258+ x="233.57927"
259+ y="327.96585"
260+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
261+ id="tspan4810">we are looking for</tspan></text>
262+ <path
263+ inkscape:connector-curvature="0"
264+ id="path4798"
265+ d="m 298,236.3622 -0.42683,58.52439"
266+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
267+ sodipodi:nodetypes="cc"
268+ inkscape:export-xdpi="61.120499"
269+ inkscape:export-ydpi="61.120499" />
270+ <text
271+ sodipodi:linespacing="125%"
272+ id="text4800"
273+ y="335.85608"
274+ x="383.54877"
275+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
276+ xml:space="preserve"
277+ inkscape:export-xdpi="61.120499"
278+ inkscape:export-ydpi="61.120499"><tspan
279+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
280+ y="335.85608"
281+ x="383.54877"
282+ sodipodi:role="line"
283+ id="tspan4802">machine chosen</tspan><tspan
284+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
285+ y="354.60608"
286+ x="383.54877"
287+ sodipodi:role="line"
288+ id="tspan4812">names for the holes</tspan></text>
289+ <path
290+ sodipodi:nodetypes="cc"
291+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
292+ d="m 432,265.3622 0.15244,56.82317"
293+ id="path4804"
294+ inkscape:connector-curvature="0"
295+ inkscape:export-xdpi="61.120499"
296+ inkscape:export-ydpi="61.120499" />
297+ <text
298+ inkscape:export-ydpi="61.120499"
299+ inkscape:export-xdpi="61.120499"
300+ xml:space="preserve"
301+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
302+ x="498"
303+ y="227.36218"
304+ id="text4806"
305+ sodipodi:linespacing="125%"><tspan
306+ id="tspan4808"
307+ sodipodi:role="line"
308+ x="498"
309+ y="227.36218"
310+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">no guess yet</tspan></text>
311+ </g>
312+</svg>
docs/image/elabProofStateEx1_2.pngnew file

Binary file not shown.

docs/image/elabProofStateEx1_2.svgnew file+281
@@ -0,0 +1,281 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="elabProofStateEx1_2.svg"
19+ inkscape:export-filename="/home/mjb/Idris-dev/docs/image/elabProofStateEx1_2.png"
20+ inkscape:export-xdpi="61.120499"
21+ inkscape:export-ydpi="61.120499">
22+ <defs
23+ id="defs4">
24+ <marker
25+ inkscape:stockid="Arrow1Mend"
26+ orient="auto"
27+ refY="0.0"
28+ refX="0.0"
29+ id="Arrow1Mend"
30+ style="overflow:visible;"
31+ inkscape:isstock="true">
32+ <path
33+ id="path4252"
34+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
35+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
36+ transform="scale(0.4) rotate(180) translate(10,0)" />
37+ </marker>
38+ </defs>
39+ <sodipodi:namedview
40+ id="base"
41+ pagecolor="#ffffff"
42+ bordercolor="#666666"
43+ borderopacity="1.0"
44+ inkscape:pageopacity="0.0"
45+ inkscape:pageshadow="2"
46+ inkscape:zoom="1"
47+ inkscape:cx="211.75967"
48+ inkscape:cy="688.76752"
49+ inkscape:document-units="px"
50+ inkscape:current-layer="layer1"
51+ showgrid="false"
52+ inkscape:window-width="1920"
53+ inkscape:window-height="1015"
54+ inkscape:window-x="0"
55+ inkscape:window-y="0"
56+ inkscape:window-maximized="1" />
57+ <metadata
58+ id="metadata7">
59+ <rdf:RDF>
60+ <cc:Work
61+ rdf:about="">
62+ <dc:format>image/svg+xml</dc:format>
63+ <dc:type
64+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
65+ <dc:title />
66+ </cc:Work>
67+ </rdf:RDF>
68+ </metadata>
69+ <g
70+ inkscape:label="Layer 1"
71+ inkscape:groupmode="layer"
72+ id="layer1">
73+ <text
74+ sodipodi:linespacing="125%"
75+ id="text4140"
76+ y="226.36218"
77+ x="401"
78+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
79+ xml:space="preserve"
80+ inkscape:export-xdpi="61.120499"
81+ inkscape:export-ydpi="61.120499"><tspan
82+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
83+ y="226.36218"
84+ x="401"
85+ sodipodi:role="line"
86+ id="tspan4144">hole_2</tspan></text>
87+ <text
88+ inkscape:export-ydpi="61.120499"
89+ inkscape:export-xdpi="61.120499"
90+ sodipodi:linespacing="125%"
91+ id="text4173"
92+ y="198.36218"
93+ x="135"
94+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
95+ xml:space="preserve"><tspan
96+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
97+ y="198.36218"
98+ x="135"
99+ id="tspan4175"
100+ sodipodi:role="line">Environment</tspan></text>
101+ <text
102+ xml:space="preserve"
103+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
104+ x="393"
105+ y="197.36218"
106+ id="text4177"
107+ sodipodi:linespacing="125%"
108+ inkscape:export-xdpi="61.120499"
109+ inkscape:export-ydpi="61.120499"><tspan
110+ sodipodi:role="line"
111+ id="tspan4179"
112+ x="393"
113+ y="197.36218"
114+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1">Holes</tspan></text>
115+ <text
116+ inkscape:export-ydpi="61.120499"
117+ inkscape:export-xdpi="61.120499"
118+ sodipodi:linespacing="125%"
119+ id="text4181"
120+ y="197.36218"
121+ x="503"
122+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
123+ xml:space="preserve"><tspan
124+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
125+ y="197.36218"
126+ x="503"
127+ id="tspan4183"
128+ sodipodi:role="line">Guess</tspan></text>
129+ <text
130+ inkscape:export-ydpi="61.120499"
131+ inkscape:export-xdpi="61.120499"
132+ sodipodi:linespacing="125%"
133+ id="text4185"
134+ y="199.36218"
135+ x="247"
136+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
137+ xml:space="preserve"><tspan
138+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
139+ y="199.36218"
140+ x="247"
141+ id="tspan4187"
142+ sodipodi:role="line">Goal</tspan></text>
143+ <rect
144+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
145+ id="rect4189"
146+ width="92"
147+ height="32"
148+ x="134"
149+ y="205.3622"
150+ inkscape:export-xdpi="61.120499"
151+ inkscape:export-ydpi="61.120499" />
152+ <rect
153+ y="206.3622"
154+ x="234"
155+ height="32"
156+ width="148"
157+ id="rect4191"
158+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
159+ inkscape:export-xdpi="61.120499"
160+ inkscape:export-ydpi="61.120499" />
161+ <rect
162+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
163+ id="rect4195"
164+ width="95"
165+ height="32"
166+ x="497"
167+ y="205.3622"
168+ inkscape:export-xdpi="61.120499"
169+ inkscape:export-ydpi="61.120499" />
170+ <rect
171+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
172+ id="rect4197"
173+ width="95"
174+ height="32"
175+ x="389"
176+ y="237.3622"
177+ inkscape:export-xdpi="61.120499"
178+ inkscape:export-ydpi="61.120499" />
179+ <rect
180+ y="269.36218"
181+ x="389"
182+ height="32"
183+ width="95"
184+ id="rect4199"
185+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
186+ inkscape:export-xdpi="61.120499"
187+ inkscape:export-ydpi="61.120499" />
188+ <rect
189+ y="205.3622"
190+ x="389"
191+ height="32"
192+ width="95"
193+ id="rect4201"
194+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
195+ inkscape:export-xdpi="61.120499"
196+ inkscape:export-ydpi="61.120499" />
197+ <text
198+ inkscape:export-ydpi="61.120499"
199+ inkscape:export-xdpi="61.120499"
200+ xml:space="preserve"
201+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
202+ x="400"
203+ y="257.36218"
204+ id="text4276"
205+ sodipodi:linespacing="125%"><tspan
206+ id="tspan4280"
207+ sodipodi:role="line"
208+ x="400"
209+ y="257.36218"
210+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0</tspan></text>
211+ <text
212+ sodipodi:linespacing="125%"
213+ id="text4159"
214+ y="225.36218"
215+ x="140"
216+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
217+ xml:space="preserve"
218+ inkscape:export-xdpi="61.120499"
219+ inkscape:export-ydpi="61.120499"><tspan
220+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
221+ y="225.36218"
222+ x="140"
223+ sodipodi:role="line"
224+ id="tspan4161">(x, λ Nat)</tspan></text>
225+ <text
226+ inkscape:export-ydpi="61.120499"
227+ inkscape:export-xdpi="61.120499"
228+ xml:space="preserve"
229+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
230+ x="266"
231+ y="226.36218"
232+ id="text4786"
233+ sodipodi:linespacing="125%"><tspan
234+ sodipodi:role="line"
235+ x="266"
236+ y="226.36218"
237+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
238+ id="tspan4790">(hole_2 , Nat)</tspan></text>
239+ <text
240+ sodipodi:linespacing="125%"
241+ id="text4800"
242+ y="290.36218"
243+ x="163"
244+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
245+ xml:space="preserve"
246+ inkscape:export-xdpi="61.120499"
247+ inkscape:export-ydpi="61.120499"><tspan
248+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
249+ y="290.36218"
250+ x="163"
251+ sodipodi:role="line"
252+ id="tspan4812">replace the focussed hole</tspan><tspan
253+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
254+ y="309.11218"
255+ x="163"
256+ sodipodi:role="line"
257+ id="tspan6225">with a lambda</tspan></text>
258+ <path
259+ sodipodi:nodetypes="cc"
260+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
261+ d="m 307,242.3622 c -5.24693,34.96318 -108.05981,45.71777 -126,0"
262+ id="path4804"
263+ inkscape:connector-curvature="0"
264+ inkscape:export-xdpi="61.120499"
265+ inkscape:export-ydpi="61.120499" />
266+ <text
267+ inkscape:export-ydpi="61.120499"
268+ inkscape:export-xdpi="61.120499"
269+ xml:space="preserve"
270+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
271+ x="510"
272+ y="226.36218"
273+ id="text4174"
274+ sodipodi:linespacing="125%"><tspan
275+ id="tspan4176"
276+ sodipodi:role="line"
277+ x="510"
278+ y="226.36218"
279+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">x:Nat</tspan></text>
280+ </g>
281+</svg>
docs/image/elabProofStateEx1_3.pngnew file

Binary file not shown.

docs/image/elabProofStateEx1_3.svgnew file+244
@@ -0,0 +1,244 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="elabProofStateEx1_3.svg"
19+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"
20+ inkscape:export-xdpi="61.120499"
21+ inkscape:export-ydpi="61.120499">
22+ <defs
23+ id="defs4" />
24+ <sodipodi:namedview
25+ id="base"
26+ pagecolor="#ffffff"
27+ bordercolor="#666666"
28+ borderopacity="1.0"
29+ inkscape:pageopacity="0.0"
30+ inkscape:pageshadow="2"
31+ inkscape:zoom="1"
32+ inkscape:cx="345.95856"
33+ inkscape:cy="688.76752"
34+ inkscape:document-units="px"
35+ inkscape:current-layer="layer1"
36+ showgrid="false"
37+ inkscape:window-width="1920"
38+ inkscape:window-height="1015"
39+ inkscape:window-x="0"
40+ inkscape:window-y="0"
41+ inkscape:window-maximized="1" />
42+ <metadata
43+ id="metadata7">
44+ <rdf:RDF>
45+ <cc:Work
46+ rdf:about="">
47+ <dc:format>image/svg+xml</dc:format>
48+ <dc:type
49+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
50+ <dc:title />
51+ </cc:Work>
52+ </rdf:RDF>
53+ </metadata>
54+ <g
55+ inkscape:label="Layer 1"
56+ inkscape:groupmode="layer"
57+ id="layer1">
58+ <text
59+ sodipodi:linespacing="125%"
60+ id="text4140"
61+ y="226.36218"
62+ x="401"
63+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
64+ xml:space="preserve"
65+ inkscape:export-xdpi="61.120499"
66+ inkscape:export-ydpi="61.120499"
67+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
68+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
69+ y="226.36218"
70+ x="401"
71+ sodipodi:role="line"
72+ id="tspan4144">hole_2</tspan></text>
73+ <text
74+ inkscape:export-ydpi="61.120499"
75+ inkscape:export-xdpi="61.120499"
76+ sodipodi:linespacing="125%"
77+ id="text4173"
78+ y="198.36218"
79+ x="135"
80+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
81+ xml:space="preserve"
82+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
83+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
84+ y="198.36218"
85+ x="135"
86+ id="tspan4175"
87+ sodipodi:role="line">Environment</tspan></text>
88+ <text
89+ xml:space="preserve"
90+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
91+ x="393"
92+ y="197.36218"
93+ id="text4177"
94+ sodipodi:linespacing="125%"
95+ inkscape:export-xdpi="61.120499"
96+ inkscape:export-ydpi="61.120499"
97+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
98+ sodipodi:role="line"
99+ id="tspan4179"
100+ x="393"
101+ y="197.36218"
102+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1">Holes</tspan></text>
103+ <text
104+ inkscape:export-ydpi="61.120499"
105+ inkscape:export-xdpi="61.120499"
106+ sodipodi:linespacing="125%"
107+ id="text4181"
108+ y="197.36218"
109+ x="503"
110+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
111+ xml:space="preserve"
112+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
113+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
114+ y="197.36218"
115+ x="503"
116+ id="tspan4183"
117+ sodipodi:role="line">Guess</tspan></text>
118+ <text
119+ inkscape:export-ydpi="61.120499"
120+ inkscape:export-xdpi="61.120499"
121+ sodipodi:linespacing="125%"
122+ id="text4185"
123+ y="199.36218"
124+ x="247"
125+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
126+ xml:space="preserve"
127+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
128+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
129+ y="199.36218"
130+ x="247"
131+ id="tspan4187"
132+ sodipodi:role="line">Goal</tspan></text>
133+ <rect
134+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
135+ id="rect4189"
136+ width="92"
137+ height="32"
138+ x="134"
139+ y="205.3622"
140+ inkscape:export-xdpi="61.120499"
141+ inkscape:export-ydpi="61.120499"
142+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" />
143+ <rect
144+ y="206.3622"
145+ x="234"
146+ height="32"
147+ width="148"
148+ id="rect4191"
149+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
150+ inkscape:export-xdpi="61.120499"
151+ inkscape:export-ydpi="61.120499"
152+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" />
153+ <rect
154+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
155+ id="rect4195"
156+ width="95"
157+ height="32"
158+ x="497"
159+ y="205.3622"
160+ inkscape:export-xdpi="61.120499"
161+ inkscape:export-ydpi="61.120499"
162+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" />
163+ <rect
164+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
165+ id="rect4197"
166+ width="95"
167+ height="32"
168+ x="389"
169+ y="237.3622"
170+ inkscape:export-xdpi="61.120499"
171+ inkscape:export-ydpi="61.120499"
172+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" />
173+ <rect
174+ y="205.3622"
175+ x="389"
176+ height="32"
177+ width="95"
178+ id="rect4201"
179+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
180+ inkscape:export-xdpi="61.120499"
181+ inkscape:export-ydpi="61.120499"
182+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" />
183+ <text
184+ inkscape:export-ydpi="61.120499"
185+ inkscape:export-xdpi="61.120499"
186+ xml:space="preserve"
187+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
188+ x="400"
189+ y="257.36218"
190+ id="text4276"
191+ sodipodi:linespacing="125%"
192+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
193+ id="tspan4280"
194+ sodipodi:role="line"
195+ x="400"
196+ y="257.36218"
197+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0</tspan></text>
198+ <text
199+ sodipodi:linespacing="125%"
200+ id="text4159"
201+ y="225.36218"
202+ x="140"
203+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
204+ xml:space="preserve"
205+ inkscape:export-xdpi="61.120499"
206+ inkscape:export-ydpi="61.120499"
207+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
208+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
209+ y="225.36218"
210+ x="140"
211+ sodipodi:role="line"
212+ id="tspan4161">(x, λ Nat)</tspan></text>
213+ <text
214+ inkscape:export-ydpi="61.120499"
215+ inkscape:export-xdpi="61.120499"
216+ xml:space="preserve"
217+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
218+ x="266"
219+ y="226.36218"
220+ id="text4786"
221+ sodipodi:linespacing="125%"
222+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
223+ sodipodi:role="line"
224+ x="266"
225+ y="226.36218"
226+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
227+ id="tspan4790">(hole_2 , Nat)</tspan></text>
228+ <text
229+ inkscape:export-ydpi="61.120499"
230+ inkscape:export-xdpi="61.120499"
231+ xml:space="preserve"
232+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
233+ x="510"
234+ y="226.36218"
235+ id="text4174"
236+ sodipodi:linespacing="125%"
237+ inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png"><tspan
238+ id="tspan4176"
239+ sodipodi:role="line"
240+ x="510"
241+ y="226.36218"
242+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">x:Nat</tspan></text>
243+ </g>
244+</svg>
docs/image/fill.pngnew file

Binary file not shown.

docs/image/fill.svgnew file+163
@@ -0,0 +1,163 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 210 297"
15+ version="1.1"
16+ id="svg8"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="fill.svg">
19+ <defs
20+ id="defs2">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker838"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow1Mend">
29+ <path
30+ transform="scale(0.4) rotate(180) translate(10,0)"
31+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
32+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
33+ id="path836" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow1Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="Arrow1Mend"
41+ style="overflow:visible;"
42+ inkscape:isstock="true"
43+ inkscape:collect="always">
44+ <path
45+ id="path4529"
46+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
47+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
48+ transform="scale(0.4) rotate(180) translate(10,0)" />
49+ </marker>
50+ </defs>
51+ <sodipodi:namedview
52+ id="base"
53+ pagecolor="#ffffff"
54+ bordercolor="#666666"
55+ borderopacity="1.0"
56+ inkscape:pageopacity="0.0"
57+ inkscape:pageshadow="2"
58+ inkscape:zoom="1"
59+ inkscape:cx="313.5"
60+ inkscape:cy="696.5"
61+ inkscape:document-units="mm"
62+ inkscape:current-layer="layer1"
63+ showgrid="false"
64+ inkscape:window-width="1920"
65+ inkscape:window-height="1015"
66+ inkscape:window-x="0"
67+ inkscape:window-y="0"
68+ inkscape:window-maximized="1" />
69+ <metadata
70+ id="metadata5">
71+ <rdf:RDF>
72+ <cc:Work
73+ rdf:about="">
74+ <dc:format>image/svg+xml</dc:format>
75+ <dc:type
76+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
77+ <dc:title />
78+ </cc:Work>
79+ </rdf:RDF>
80+ </metadata>
81+ <g
82+ inkscape:label="Layer 1"
83+ inkscape:groupmode="layer"
84+ id="layer1">
85+ <rect
86+ style="fill:#ffff00;fill-opacity:1;stroke-width:0.26458332"
87+ id="rect22"
88+ width="31.75"
89+ height="5.5562501"
90+ x="70.114571"
91+ y="114.96667"
92+ inkscape:export-xdpi="61.120499"
93+ inkscape:export-ydpi="61.120499" />
94+ <text
95+ xml:space="preserve"
96+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
97+ x="65.352081"
98+ y="105.17709"
99+ id="text12"
100+ inkscape:export-xdpi="61.120499"
101+ inkscape:export-ydpi="61.120499"><tspan
102+ sodipodi:role="line"
103+ id="tspan10"
104+ x="65.352081"
105+ y="105.17709"
106+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332">? {hole} . {hole}</tspan></text>
107+ <text
108+ id="text16"
109+ y="118.67083"
110+ x="56.356247"
111+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
112+ xml:space="preserve"
113+ inkscape:export-xdpi="61.120499"
114+ inkscape:export-ydpi="61.120499"><tspan
115+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
116+ y="118.67083"
117+ x="56.356247"
118+ id="tspan14"
119+ sodipodi:role="line">?{hole} ≈ Prelude.Nat.Z . {hole}</tspan></text>
120+ <text
121+ id="text20"
122+ y="110.99791"
123+ x="82.814583"
124+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
125+ xml:space="preserve"
126+ inkscape:export-xdpi="61.120499"
127+ inkscape:export-ydpi="61.120499"><tspan
128+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
129+ y="110.99791"
130+ x="82.814583"
131+ id="tspan18"
132+ sodipodi:role="line">fill `(Z)</tspan></text>
133+ <path
134+ style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
135+ d="m 80.668481,106.30075 -0.0032,7.57492"
136+ id="path4518"
137+ inkscape:connector-curvature="0"
138+ sodipodi:nodetypes="cc"
139+ inkscape:export-xdpi="61.120499"
140+ inkscape:export-ydpi="61.120499" />
141+ <text
142+ inkscape:export-ydpi="61.120499"
143+ inkscape:export-xdpi="61.120499"
144+ xml:space="preserve"
145+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
146+ x="63.499996"
147+ y="93.006248"
148+ id="text832"><tspan
149+ sodipodi:role="line"
150+ id="tspan830"
151+ x="63.499996"
152+ y="93.006248"
153+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">focus</tspan></text>
154+ <path
155+ inkscape:export-ydpi="61.120499"
156+ inkscape:export-xdpi="61.120499"
157+ sodipodi:nodetypes="cc"
158+ inkscape:connector-curvature="0"
159+ id="path834"
160+ d="m 66.645564,94.659084 -0.0032,5.458256"
161+ style="fill:none;stroke:#0000ff;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker838)" />
162+ </g>
163+</svg>
docs/image/generateDatatype.pngnew file

Binary file not shown.

docs/image/generateDatatype.svgnew file+540
@@ -0,0 +1,540 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="generateDatatype.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker7147"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow2Mend">
29+ <path
30+ transform="scale(0.6) rotate(180) translate(0,0)"
31+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
32+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
33+ id="path7149" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow2Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="marker6819"
41+ style="overflow:visible;"
42+ inkscape:isstock="true">
43+ <path
44+ id="path6821"
45+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
46+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
47+ transform="scale(0.6) rotate(180) translate(0,0)" />
48+ </marker>
49+ <marker
50+ inkscape:isstock="true"
51+ style="overflow:visible;"
52+ id="marker6325"
53+ refX="0.0"
54+ refY="0.0"
55+ orient="auto"
56+ inkscape:stockid="Arrow2Mend">
57+ <path
58+ transform="scale(0.6) rotate(180) translate(0,0)"
59+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
60+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
61+ id="path6327" />
62+ </marker>
63+ <marker
64+ inkscape:stockid="Arrow2Mend"
65+ orient="auto"
66+ refY="0.0"
67+ refX="0.0"
68+ id="marker5163"
69+ style="overflow:visible;"
70+ inkscape:isstock="true">
71+ <path
72+ id="path5165"
73+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
74+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
75+ transform="scale(0.6) rotate(180) translate(0,0)" />
76+ </marker>
77+ <marker
78+ inkscape:isstock="true"
79+ style="overflow:visible;"
80+ id="marker5133"
81+ refX="0.0"
82+ refY="0.0"
83+ orient="auto"
84+ inkscape:stockid="Arrow2Mend"
85+ inkscape:collect="always">
86+ <path
87+ transform="scale(0.6) rotate(180) translate(0,0)"
88+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
89+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
90+ id="path5135" />
91+ </marker>
92+ <marker
93+ inkscape:stockid="Arrow2Mend"
94+ orient="auto"
95+ refY="0.0"
96+ refX="0.0"
97+ id="Arrow2Mend"
98+ style="overflow:visible;"
99+ inkscape:isstock="true"
100+ inkscape:collect="always">
101+ <path
102+ id="path4183"
103+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
104+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
105+ transform="scale(0.6) rotate(180) translate(0,0)" />
106+ </marker>
107+ </defs>
108+ <sodipodi:namedview
109+ id="base"
110+ pagecolor="#ffffff"
111+ bordercolor="#666666"
112+ borderopacity="1.0"
113+ inkscape:pageopacity="0.0"
114+ inkscape:pageshadow="2"
115+ inkscape:zoom="1"
116+ inkscape:cx="380.92935"
117+ inkscape:cy="520"
118+ inkscape:document-units="px"
119+ inkscape:current-layer="layer1"
120+ showgrid="false"
121+ inkscape:window-width="1212"
122+ inkscape:window-height="1011"
123+ inkscape:window-x="-4"
124+ inkscape:window-y="0"
125+ inkscape:window-maximized="0" />
126+ <metadata
127+ id="metadata7">
128+ <rdf:RDF>
129+ <cc:Work
130+ rdf:about="">
131+ <dc:format>image/svg+xml</dc:format>
132+ <dc:type
133+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
134+ <dc:title></dc:title>
135+ </cc:Work>
136+ </rdf:RDF>
137+ </metadata>
138+ <g
139+ inkscape:label="Layer 1"
140+ inkscape:groupmode="layer"
141+ id="layer1">
142+ <rect
143+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
144+ id="rect4136"
145+ width="201"
146+ height="69"
147+ x="116"
148+ y="203.3622"
149+ inkscape:export-xdpi="61.120499"
150+ inkscape:export-ydpi="61.120499" />
151+ <rect
152+ y="322.36218"
153+ x="113"
154+ height="69"
155+ width="201"
156+ id="rect4138"
157+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
158+ inkscape:export-xdpi="61.120499"
159+ inkscape:export-ydpi="61.120499" />
160+ <rect
161+ y="202.3622"
162+ x="381"
163+ height="69"
164+ width="201"
165+ id="rect4140"
166+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
167+ inkscape:export-xdpi="61.120499"
168+ inkscape:export-ydpi="61.120499" />
169+ <text
170+ xml:space="preserve"
171+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
172+ x="125"
173+ y="227.3622"
174+ id="text4142"
175+ sodipodi:linespacing="125%"
176+ inkscape:export-xdpi="61.120499"
177+ inkscape:export-ydpi="61.120499"><tspan
178+ sodipodi:role="line"
179+ id="tspan4144"
180+ x="125"
181+ y="227.3622">declareDatatype</tspan></text>
182+ <text
183+ sodipodi:linespacing="125%"
184+ id="text4146"
185+ y="225.3622"
186+ x="389"
187+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
188+ xml:space="preserve"
189+ inkscape:export-xdpi="61.120499"
190+ inkscape:export-ydpi="61.120499"><tspan
191+ y="225.3622"
192+ x="389"
193+ id="tspan4148"
194+ sodipodi:role="line">defineDatatype</tspan></text>
195+ <path
196+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5133)"
197+ d="m 190,271.3622 0,48"
198+ id="path4150"
199+ inkscape:connector-curvature="0"
200+ inkscape:export-xdpi="61.120499"
201+ inkscape:export-ydpi="61.120499" />
202+ <text
203+ sodipodi:linespacing="125%"
204+ id="text5074"
205+ y="295.36218"
206+ x="201"
207+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
208+ xml:space="preserve"
209+ inkscape:export-xdpi="61.120499"
210+ inkscape:export-ydpi="61.120499"><tspan
211+ y="295.36218"
212+ x="201"
213+ sodipodi:role="line"
214+ id="tspan5080"
215+ style="font-size:15px;fill:#ff0000">Declare</tspan></text>
216+ <text
217+ xml:space="preserve"
218+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
219+ x="117"
220+ y="344.36218"
221+ id="text5082"
222+ sodipodi:linespacing="125%"
223+ inkscape:export-xdpi="61.120499"
224+ inkscape:export-ydpi="61.120499"><tspan
225+ style="font-size:15px;fill:#0000ff"
226+ sodipodi:role="line"
227+ id="tspan5084"
228+ x="117"
229+ y="344.36218">name:TTName</tspan><tspan
230+ style="font-size:15px;fill:#0000ff"
231+ id="tspan5086"
232+ sodipodi:role="line"
233+ x="117"
234+ y="363.11218">arguments:List FunArg</tspan><tspan
235+ style="font-size:15px;fill:#0000ff"
236+ id="tspan5088"
237+ sodipodi:role="line"
238+ x="117"
239+ y="381.86218">returnType:Raw</tspan></text>
240+ <text
241+ xml:space="preserve"
242+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
243+ x="111"
244+ y="313.36218"
245+ id="text5095"
246+ sodipodi:linespacing="125%"
247+ inkscape:export-xdpi="61.120499"
248+ inkscape:export-ydpi="61.120499"><tspan
249+ style="font-size:15px;fill:#0000ff;"
250+ id="tspan5097"
251+ sodipodi:role="line"
252+ x="111"
253+ y="313.36218">TyDecl</tspan></text>
254+ <rect
255+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
256+ id="rect5099"
257+ width="125"
258+ height="88"
259+ x="170"
260+ y="415.36218"
261+ inkscape:export-xdpi="61.120499"
262+ inkscape:export-ydpi="61.120499" />
263+ <path
264+ inkscape:connector-curvature="0"
265+ id="path5101"
266+ d="m 247,364.3622 0,48"
267+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
268+ inkscape:export-xdpi="61.120499"
269+ inkscape:export-ydpi="61.120499" />
270+ <text
271+ xml:space="preserve"
272+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
273+ x="260"
274+ y="408.36218"
275+ id="text5103"
276+ sodipodi:linespacing="125%"
277+ inkscape:export-xdpi="61.120499"
278+ inkscape:export-ydpi="61.120499"><tspan
279+ style="font-size:15px;fill:#ff0000"
280+ id="tspan5105"
281+ sodipodi:role="line"
282+ x="260"
283+ y="408.36218">MkFunArg</tspan></text>
284+ <text
285+ sodipodi:linespacing="125%"
286+ id="text5107"
287+ y="437.36218"
288+ x="174"
289+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
290+ xml:space="preserve"
291+ inkscape:export-xdpi="61.120499"
292+ inkscape:export-ydpi="61.120499"><tspan
293+ y="437.36218"
294+ x="174"
295+ id="tspan5109"
296+ sodipodi:role="line"
297+ style="font-size:15px;fill:#0000ff">name:TTName</tspan><tspan
298+ y="456.11218"
299+ x="174"
300+ sodipodi:role="line"
301+ id="tspan5113"
302+ style="font-size:15px;fill:#0000ff">type:Raw</tspan><tspan
303+ y="474.86218"
304+ x="174"
305+ sodipodi:role="line"
306+ style="font-size:15px;fill:#0000ff"
307+ id="tspan5121">plicity:Plicity</tspan><tspan
308+ y="493.61218"
309+ x="174"
310+ sodipodi:role="line"
311+ style="font-size:15px;fill:#0000ff"
312+ id="tspan5123">erasure:Erasure</tspan></text>
313+ <text
314+ sodipodi:linespacing="125%"
315+ id="text5115"
316+ y="409.36218"
317+ x="170"
318+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
319+ xml:space="preserve"
320+ inkscape:export-xdpi="61.120499"
321+ inkscape:export-ydpi="61.120499"><tspan
322+ y="409.36218"
323+ x="170"
324+ sodipodi:role="line"
325+ id="tspan5117"
326+ style="font-size:15px;fill:#0000ff">FunArg</tspan></text>
327+ <text
328+ sodipodi:linespacing="125%"
329+ id="text5125"
330+ y="526.36218"
331+ x="105"
332+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
333+ xml:space="preserve"
334+ inkscape:export-xdpi="61.120499"
335+ inkscape:export-ydpi="61.120499"><tspan
336+ y="526.36218"
337+ x="105"
338+ sodipodi:role="line"
339+ id="tspan5127"
340+ style="font-size:15px;fill:#ff0000">Explicit</tspan><tspan
341+ y="545.11218"
342+ x="105"
343+ sodipodi:role="line"
344+ style="font-size:15px;fill:#ff0000"
345+ id="tspan5129">Implicit</tspan><tspan
346+ y="563.86218"
347+ x="105"
348+ sodipodi:role="line"
349+ style="font-size:15px;fill:#ff0000"
350+ id="tspan5131">Constraint</tspan></text>
351+ <path
352+ inkscape:connector-curvature="0"
353+ id="path5161"
354+ d="m 169,473.3622 c -30.23945,2.9603 -39.98191,17.10078 -41,36"
355+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5163)"
356+ sodipodi:nodetypes="cc"
357+ inkscape:export-xdpi="61.120499"
358+ inkscape:export-ydpi="61.120499" />
359+ <path
360+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6325)"
361+ d="m 245,499.3622 0,28"
362+ id="path6319"
363+ inkscape:connector-curvature="0"
364+ sodipodi:nodetypes="cc"
365+ inkscape:export-xdpi="61.120499"
366+ inkscape:export-ydpi="61.120499" />
367+ <text
368+ sodipodi:linespacing="125%"
369+ id="text6321"
370+ y="544.36218"
371+ x="221"
372+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
373+ xml:space="preserve"
374+ inkscape:export-xdpi="61.120499"
375+ inkscape:export-ydpi="61.120499"><tspan
376+ y="544.36218"
377+ x="221"
378+ sodipodi:role="line"
379+ id="tspan6323"
380+ style="font-size:15px;fill:#ff0000">Erased</tspan><tspan
381+ y="563.11218"
382+ x="221"
383+ sodipodi:role="line"
384+ style="font-size:15px;fill:#ff0000"
385+ id="tspan6773">NotErased</tspan></text>
386+ <rect
387+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
388+ id="rect6775"
389+ width="247"
390+ height="49"
391+ x="347"
392+ y="322.36218"
393+ inkscape:export-xdpi="61.120499"
394+ inkscape:export-ydpi="61.120499" />
395+ <path
396+ inkscape:connector-curvature="0"
397+ id="path6777"
398+ d="m 458,271.3622 0,48"
399+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5133)"
400+ inkscape:export-xdpi="61.120499"
401+ inkscape:export-ydpi="61.120499" />
402+ <text
403+ xml:space="preserve"
404+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
405+ x="469"
406+ y="295.36218"
407+ id="text6779"
408+ sodipodi:linespacing="125%"
409+ inkscape:export-xdpi="61.120499"
410+ inkscape:export-ydpi="61.120499"><tspan
411+ style="font-size:15px;fill:#ff0000"
412+ id="tspan6781"
413+ sodipodi:role="line"
414+ x="469"
415+ y="295.36218">DefineDatatype</tspan></text>
416+ <text
417+ sodipodi:linespacing="125%"
418+ id="text6783"
419+ y="344.36218"
420+ x="351"
421+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
422+ xml:space="preserve"
423+ inkscape:export-xdpi="61.120499"
424+ inkscape:export-ydpi="61.120499"><tspan
425+ y="344.36218"
426+ x="351"
427+ sodipodi:role="line"
428+ id="tspan6789"
429+ style="font-size:15px;fill:#0000ff">name:TTName</tspan><tspan
430+ y="363.11218"
431+ x="351"
432+ sodipodi:role="line"
433+ style="font-size:15px;fill:#0000ff"
434+ id="tspan7130">constructors : List ConstructorDefn</tspan></text>
435+ <text
436+ sodipodi:linespacing="125%"
437+ id="text6791"
438+ y="313.36218"
439+ x="379"
440+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
441+ xml:space="preserve"
442+ inkscape:export-xdpi="61.120499"
443+ inkscape:export-ydpi="61.120499"><tspan
444+ y="313.36218"
445+ x="379"
446+ sodipodi:role="line"
447+ id="tspan6793"
448+ style="font-size:15px;fill:#0000ff">DataDefn</tspan></text>
449+ <rect
450+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
451+ id="rect6799"
452+ width="201"
453+ height="69"
454+ x="380"
455+ y="418.36218"
456+ inkscape:export-xdpi="61.120499"
457+ inkscape:export-ydpi="61.120499" />
458+ <path
459+ inkscape:connector-curvature="0"
460+ id="path6801"
461+ d="m 539,367.3622 0,48"
462+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6819)"
463+ inkscape:export-xdpi="61.120499"
464+ inkscape:export-ydpi="61.120499" />
465+ <text
466+ xml:space="preserve"
467+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
468+ x="450"
469+ y="386.36218"
470+ id="text6803"
471+ sodipodi:linespacing="125%"
472+ inkscape:export-xdpi="61.120499"
473+ inkscape:export-ydpi="61.120499"><tspan
474+ style="font-size:15px;fill:#ff0000"
475+ id="tspan6805"
476+ sodipodi:role="line"
477+ x="450"
478+ y="386.36218">Constructor</tspan></text>
479+ <text
480+ sodipodi:linespacing="125%"
481+ id="text6807"
482+ y="440.36218"
483+ x="384"
484+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
485+ xml:space="preserve"
486+ inkscape:export-xdpi="61.120499"
487+ inkscape:export-ydpi="61.120499"><tspan
488+ y="440.36218"
489+ x="384"
490+ id="tspan6809"
491+ sodipodi:role="line"
492+ style="font-size:15px;fill:#0000ff">name:TTName</tspan><tspan
493+ y="459.11218"
494+ x="384"
495+ sodipodi:role="line"
496+ id="tspan6811"
497+ style="font-size:15px;fill:#0000ff">arguments:List FunArg</tspan><tspan
498+ y="477.86218"
499+ x="384"
500+ sodipodi:role="line"
501+ id="tspan6813"
502+ style="font-size:15px;fill:#0000ff">returnType:Raw</tspan></text>
503+ <text
504+ sodipodi:linespacing="125%"
505+ id="text6815"
506+ y="409.36218"
507+ x="378"
508+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
509+ xml:space="preserve"
510+ inkscape:export-xdpi="61.120499"
511+ inkscape:export-ydpi="61.120499"><tspan
512+ y="409.36218"
513+ x="378"
514+ sodipodi:role="line"
515+ id="tspan6817"
516+ style="font-size:15px;fill:#0000ff">ConstructorDefn</tspan></text>
517+ <text
518+ inkscape:export-ydpi="61.120499"
519+ inkscape:export-xdpi="61.120499"
520+ sodipodi:linespacing="125%"
521+ id="text7135"
522+ y="425.36218"
523+ x="307"
524+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
525+ xml:space="preserve"><tspan
526+ y="425.36218"
527+ x="307"
528+ sodipodi:role="line"
529+ id="tspan7137"
530+ style="font-size:15px;fill:#ff0000">MkFunArg</tspan></text>
531+ <path
532+ inkscape:export-ydpi="61.120499"
533+ inkscape:export-xdpi="61.120499"
534+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7147)"
535+ d="m 379,458.3622 -80,-35"
536+ id="path7145"
537+ inkscape:connector-curvature="0"
538+ sodipodi:nodetypes="cc" />
539+ </g>
540+</svg>
docs/image/generateFunction.pngnew file

Binary file not shown.

docs/image/generateFunction.svgnew file+588
@@ -0,0 +1,588 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="generateFunction.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker4348"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow2Mend">
29+ <path
30+ transform="scale(0.6) rotate(180) translate(0,0)"
31+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
32+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
33+ id="path4350" />
34+ </marker>
35+ <marker
36+ inkscape:isstock="true"
37+ style="overflow:visible;"
38+ id="marker7147"
39+ refX="0.0"
40+ refY="0.0"
41+ orient="auto"
42+ inkscape:stockid="Arrow2Mend">
43+ <path
44+ transform="scale(0.6) rotate(180) translate(0,0)"
45+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
46+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
47+ id="path7149" />
48+ </marker>
49+ <marker
50+ inkscape:stockid="Arrow2Mend"
51+ orient="auto"
52+ refY="0.0"
53+ refX="0.0"
54+ id="marker6819"
55+ style="overflow:visible;"
56+ inkscape:isstock="true"
57+ inkscape:collect="always">
58+ <path
59+ id="path6821"
60+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
61+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
62+ transform="scale(0.6) rotate(180) translate(0,0)" />
63+ </marker>
64+ <marker
65+ inkscape:isstock="true"
66+ style="overflow:visible;"
67+ id="marker6325"
68+ refX="0.0"
69+ refY="0.0"
70+ orient="auto"
71+ inkscape:stockid="Arrow2Mend">
72+ <path
73+ transform="scale(0.6) rotate(180) translate(0,0)"
74+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
75+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
76+ id="path6327" />
77+ </marker>
78+ <marker
79+ inkscape:stockid="Arrow2Mend"
80+ orient="auto"
81+ refY="0.0"
82+ refX="0.0"
83+ id="marker5163"
84+ style="overflow:visible;"
85+ inkscape:isstock="true">
86+ <path
87+ id="path5165"
88+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
89+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
90+ transform="scale(0.6) rotate(180) translate(0,0)" />
91+ </marker>
92+ <marker
93+ inkscape:isstock="true"
94+ style="overflow:visible;"
95+ id="marker5133"
96+ refX="0.0"
97+ refY="0.0"
98+ orient="auto"
99+ inkscape:stockid="Arrow2Mend"
100+ inkscape:collect="always">
101+ <path
102+ transform="scale(0.6) rotate(180) translate(0,0)"
103+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
104+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
105+ id="path5135" />
106+ </marker>
107+ <marker
108+ inkscape:stockid="Arrow2Mend"
109+ orient="auto"
110+ refY="0.0"
111+ refX="0.0"
112+ id="Arrow2Mend"
113+ style="overflow:visible;"
114+ inkscape:isstock="true"
115+ inkscape:collect="always">
116+ <path
117+ id="path4183"
118+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
119+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
120+ transform="scale(0.6) rotate(180) translate(0,0)" />
121+ </marker>
122+ </defs>
123+ <sodipodi:namedview
124+ id="base"
125+ pagecolor="#ffffff"
126+ bordercolor="#666666"
127+ borderopacity="1.0"
128+ inkscape:pageopacity="0.0"
129+ inkscape:pageshadow="2"
130+ inkscape:zoom="1"
131+ inkscape:cx="380.92935"
132+ inkscape:cy="520"
133+ inkscape:document-units="px"
134+ inkscape:current-layer="layer1"
135+ showgrid="false"
136+ inkscape:window-width="1212"
137+ inkscape:window-height="1011"
138+ inkscape:window-x="0"
139+ inkscape:window-y="0"
140+ inkscape:window-maximized="0" />
141+ <metadata
142+ id="metadata7">
143+ <rdf:RDF>
144+ <cc:Work
145+ rdf:about="">
146+ <dc:format>image/svg+xml</dc:format>
147+ <dc:type
148+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
149+ <dc:title />
150+ </cc:Work>
151+ </rdf:RDF>
152+ </metadata>
153+ <g
154+ inkscape:label="Layer 1"
155+ inkscape:groupmode="layer"
156+ id="layer1">
157+ <rect
158+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
159+ id="rect4136"
160+ width="201"
161+ height="69"
162+ x="116"
163+ y="203.3622"
164+ inkscape:export-xdpi="61.120499"
165+ inkscape:export-ydpi="61.120499" />
166+ <rect
167+ y="322.36218"
168+ x="113"
169+ height="69"
170+ width="201"
171+ id="rect4138"
172+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
173+ inkscape:export-xdpi="61.120499"
174+ inkscape:export-ydpi="61.120499" />
175+ <rect
176+ y="202.3622"
177+ x="381"
178+ height="69"
179+ width="201"
180+ id="rect4140"
181+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
182+ inkscape:export-xdpi="61.120499"
183+ inkscape:export-ydpi="61.120499" />
184+ <text
185+ xml:space="preserve"
186+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
187+ x="125"
188+ y="227.3622"
189+ id="text4142"
190+ sodipodi:linespacing="125%"
191+ inkscape:export-xdpi="61.120499"
192+ inkscape:export-ydpi="61.120499"><tspan
193+ sodipodi:role="line"
194+ id="tspan4144"
195+ x="125"
196+ y="227.3622">declareType</tspan></text>
197+ <text
198+ sodipodi:linespacing="125%"
199+ id="text4146"
200+ y="225.3622"
201+ x="389"
202+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
203+ xml:space="preserve"
204+ inkscape:export-xdpi="61.120499"
205+ inkscape:export-ydpi="61.120499"><tspan
206+ y="225.3622"
207+ x="389"
208+ id="tspan4148"
209+ sodipodi:role="line">defineFunction</tspan></text>
210+ <path
211+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5133)"
212+ d="m 190,271.3622 0,48"
213+ id="path4150"
214+ inkscape:connector-curvature="0"
215+ inkscape:export-xdpi="61.120499"
216+ inkscape:export-ydpi="61.120499" />
217+ <text
218+ sodipodi:linespacing="125%"
219+ id="text5074"
220+ y="295.36218"
221+ x="201"
222+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
223+ xml:space="preserve"
224+ inkscape:export-xdpi="61.120499"
225+ inkscape:export-ydpi="61.120499"><tspan
226+ y="295.36218"
227+ x="201"
228+ sodipodi:role="line"
229+ id="tspan5080"
230+ style="font-size:15px;fill:#ff0000">Declare</tspan></text>
231+ <text
232+ xml:space="preserve"
233+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
234+ x="117"
235+ y="344.36218"
236+ id="text5082"
237+ sodipodi:linespacing="125%"
238+ inkscape:export-xdpi="61.120499"
239+ inkscape:export-ydpi="61.120499"><tspan
240+ style="font-size:15px;fill:#0000ff"
241+ sodipodi:role="line"
242+ id="tspan5084"
243+ x="117"
244+ y="344.36218">name:TTName</tspan><tspan
245+ style="font-size:15px;fill:#0000ff"
246+ id="tspan5086"
247+ sodipodi:role="line"
248+ x="117"
249+ y="363.11218">arguments:List FunArg</tspan><tspan
250+ style="font-size:15px;fill:#0000ff"
251+ id="tspan5088"
252+ sodipodi:role="line"
253+ x="117"
254+ y="381.86218">returnType:Raw</tspan></text>
255+ <text
256+ xml:space="preserve"
257+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
258+ x="111"
259+ y="313.36218"
260+ id="text5095"
261+ sodipodi:linespacing="125%"
262+ inkscape:export-xdpi="61.120499"
263+ inkscape:export-ydpi="61.120499"><tspan
264+ style="font-size:15px;fill:#0000ff;"
265+ id="tspan5097"
266+ sodipodi:role="line"
267+ x="111"
268+ y="313.36218">TyDecl</tspan></text>
269+ <rect
270+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
271+ id="rect5099"
272+ width="125"
273+ height="88"
274+ x="170"
275+ y="415.36218"
276+ inkscape:export-xdpi="61.120499"
277+ inkscape:export-ydpi="61.120499" />
278+ <path
279+ inkscape:connector-curvature="0"
280+ id="path5101"
281+ d="m 247,364.3622 0,48"
282+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
283+ inkscape:export-xdpi="61.120499"
284+ inkscape:export-ydpi="61.120499" />
285+ <text
286+ xml:space="preserve"
287+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
288+ x="260"
289+ y="408.36218"
290+ id="text5103"
291+ sodipodi:linespacing="125%"
292+ inkscape:export-xdpi="61.120499"
293+ inkscape:export-ydpi="61.120499"><tspan
294+ style="font-size:15px;fill:#ff0000"
295+ id="tspan5105"
296+ sodipodi:role="line"
297+ x="260"
298+ y="408.36218">MkFunArg</tspan></text>
299+ <text
300+ sodipodi:linespacing="125%"
301+ id="text5107"
302+ y="437.36218"
303+ x="174"
304+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
305+ xml:space="preserve"
306+ inkscape:export-xdpi="61.120499"
307+ inkscape:export-ydpi="61.120499"><tspan
308+ y="437.36218"
309+ x="174"
310+ id="tspan5109"
311+ sodipodi:role="line"
312+ style="font-size:15px;fill:#0000ff">name:TTName</tspan><tspan
313+ y="456.11218"
314+ x="174"
315+ sodipodi:role="line"
316+ id="tspan5113"
317+ style="font-size:15px;fill:#0000ff">type:Raw</tspan><tspan
318+ y="474.86218"
319+ x="174"
320+ sodipodi:role="line"
321+ style="font-size:15px;fill:#0000ff"
322+ id="tspan5121">plicity:Plicity</tspan><tspan
323+ y="493.61218"
324+ x="174"
325+ sodipodi:role="line"
326+ style="font-size:15px;fill:#0000ff"
327+ id="tspan5123">erasure:Erasure</tspan></text>
328+ <text
329+ sodipodi:linespacing="125%"
330+ id="text5115"
331+ y="409.36218"
332+ x="170"
333+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
334+ xml:space="preserve"
335+ inkscape:export-xdpi="61.120499"
336+ inkscape:export-ydpi="61.120499"><tspan
337+ y="409.36218"
338+ x="170"
339+ sodipodi:role="line"
340+ id="tspan5117"
341+ style="font-size:15px;fill:#0000ff">FunArg</tspan></text>
342+ <text
343+ sodipodi:linespacing="125%"
344+ id="text5125"
345+ y="526.36218"
346+ x="105"
347+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
348+ xml:space="preserve"
349+ inkscape:export-xdpi="61.120499"
350+ inkscape:export-ydpi="61.120499"><tspan
351+ y="526.36218"
352+ x="105"
353+ sodipodi:role="line"
354+ id="tspan5127"
355+ style="font-size:15px;fill:#ff0000">Explicit</tspan><tspan
356+ y="545.11218"
357+ x="105"
358+ sodipodi:role="line"
359+ style="font-size:15px;fill:#ff0000"
360+ id="tspan5129">Implicit</tspan><tspan
361+ y="563.86218"
362+ x="105"
363+ sodipodi:role="line"
364+ style="font-size:15px;fill:#ff0000"
365+ id="tspan5131">Constraint</tspan></text>
366+ <path
367+ inkscape:connector-curvature="0"
368+ id="path5161"
369+ d="m 169,473.3622 c -30.23945,2.9603 -39.98191,17.10078 -41,36"
370+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5163)"
371+ sodipodi:nodetypes="cc"
372+ inkscape:export-xdpi="61.120499"
373+ inkscape:export-ydpi="61.120499" />
374+ <path
375+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6325)"
376+ d="m 245,499.3622 0,28"
377+ id="path6319"
378+ inkscape:connector-curvature="0"
379+ sodipodi:nodetypes="cc"
380+ inkscape:export-xdpi="61.120499"
381+ inkscape:export-ydpi="61.120499" />
382+ <text
383+ sodipodi:linespacing="125%"
384+ id="text6321"
385+ y="544.36218"
386+ x="221"
387+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
388+ xml:space="preserve"
389+ inkscape:export-xdpi="61.120499"
390+ inkscape:export-ydpi="61.120499"><tspan
391+ y="544.36218"
392+ x="221"
393+ sodipodi:role="line"
394+ id="tspan6323"
395+ style="font-size:15px;fill:#ff0000">Erased</tspan><tspan
396+ y="563.11218"
397+ x="221"
398+ sodipodi:role="line"
399+ style="font-size:15px;fill:#ff0000"
400+ id="tspan6773">NotErased</tspan></text>
401+ <rect
402+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
403+ id="rect6775"
404+ width="247"
405+ height="49"
406+ x="347"
407+ y="322.36218"
408+ inkscape:export-xdpi="61.120499"
409+ inkscape:export-ydpi="61.120499" />
410+ <path
411+ inkscape:connector-curvature="0"
412+ id="path6777"
413+ d="m 458,271.3622 0,48"
414+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5133)"
415+ inkscape:export-xdpi="61.120499"
416+ inkscape:export-ydpi="61.120499" />
417+ <text
418+ xml:space="preserve"
419+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
420+ x="469"
421+ y="295.36218"
422+ id="text6779"
423+ sodipodi:linespacing="125%"
424+ inkscape:export-xdpi="61.120499"
425+ inkscape:export-ydpi="61.120499"><tspan
426+ style="font-size:15px;fill:#ff0000"
427+ id="tspan6781"
428+ sodipodi:role="line"
429+ x="469"
430+ y="295.36218">DefineFun</tspan></text>
431+ <text
432+ sodipodi:linespacing="125%"
433+ id="text6783"
434+ y="344.36218"
435+ x="351"
436+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
437+ xml:space="preserve"
438+ inkscape:export-xdpi="61.120499"
439+ inkscape:export-ydpi="61.120499"><tspan
440+ y="344.36218"
441+ x="351"
442+ sodipodi:role="line"
443+ id="tspan6789"
444+ style="font-size:15px;fill:#0000ff">name:TTName</tspan><tspan
445+ y="363.11218"
446+ x="351"
447+ sodipodi:role="line"
448+ style="font-size:15px;fill:#0000ff"
449+ id="tspan7130">clauses : List (FunClause a)</tspan></text>
450+ <text
451+ sodipodi:linespacing="125%"
452+ id="text6791"
453+ y="313.36218"
454+ x="379"
455+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
456+ xml:space="preserve"
457+ inkscape:export-xdpi="61.120499"
458+ inkscape:export-ydpi="61.120499"><tspan
459+ y="313.36218"
460+ x="379"
461+ sodipodi:role="line"
462+ id="tspan6793"
463+ style="font-size:15px;fill:#0000ff">FunDefn</tspan></text>
464+ <rect
465+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
466+ id="rect6799"
467+ width="86"
468+ height="64"
469+ x="372"
470+ y="462.36218"
471+ inkscape:export-xdpi="61.120499"
472+ inkscape:export-ydpi="61.120499" />
473+ <path
474+ inkscape:connector-curvature="0"
475+ id="path6801"
476+ d="m 552,370.3622 0,86"
477+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6819)"
478+ inkscape:export-xdpi="61.120499"
479+ inkscape:export-ydpi="61.120499"
480+ sodipodi:nodetypes="cc" />
481+ <text
482+ xml:space="preserve"
483+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
484+ x="352"
485+ y="418.36218"
486+ id="text6803"
487+ sodipodi:linespacing="125%"
488+ inkscape:export-xdpi="61.120499"
489+ inkscape:export-ydpi="61.120499"><tspan
490+ style="font-size:15px;fill:#ff0000"
491+ id="tspan6805"
492+ sodipodi:role="line"
493+ x="352"
494+ y="418.36218">MkFunClause</tspan></text>
495+ <text
496+ sodipodi:linespacing="125%"
497+ id="text6807"
498+ y="484.36218"
499+ x="376"
500+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
501+ xml:space="preserve"
502+ inkscape:export-xdpi="61.120499"
503+ inkscape:export-ydpi="61.120499"><tspan
504+ y="484.36218"
505+ x="376"
506+ sodipodi:role="line"
507+ id="tspan6813"
508+ style="font-size:15px;fill:#0000ff">lhs:a</tspan><tspan
509+ y="503.11218"
510+ x="376"
511+ sodipodi:role="line"
512+ style="font-size:15px;fill:#0000ff"
513+ id="tspan4330">rhs:a</tspan></text>
514+ <text
515+ sodipodi:linespacing="125%"
516+ id="text6815"
517+ y="453.36218"
518+ x="370"
519+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
520+ xml:space="preserve"
521+ inkscape:export-xdpi="61.120499"
522+ inkscape:export-ydpi="61.120499"><tspan
523+ y="453.36218"
524+ x="370"
525+ sodipodi:role="line"
526+ id="tspan6817"
527+ style="font-size:15px;fill:#0000ff">FunClause</tspan></text>
528+ <text
529+ inkscape:export-ydpi="61.120499"
530+ inkscape:export-xdpi="61.120499"
531+ sodipodi:linespacing="125%"
532+ id="text4321"
533+ y="395.36218"
534+ x="407"
535+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
536+ xml:space="preserve"><tspan
537+ y="395.36218"
538+ x="407"
539+ sodipodi:role="line"
540+ id="tspan4323"
541+ style="font-size:15px;fill:#ff0000">MkImpossibleClause</tspan></text>
542+ <rect
543+ inkscape:export-ydpi="61.120499"
544+ inkscape:export-xdpi="61.120499"
545+ y="461.36218"
546+ x="473"
547+ height="64"
548+ width="86"
549+ id="rect4332"
550+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
551+ <text
552+ inkscape:export-ydpi="61.120499"
553+ inkscape:export-xdpi="61.120499"
554+ xml:space="preserve"
555+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
556+ x="477"
557+ y="483.36218"
558+ id="text4334"
559+ sodipodi:linespacing="125%"><tspan
560+ id="tspan4338"
561+ style="font-size:15px;fill:#0000ff"
562+ sodipodi:role="line"
563+ x="477"
564+ y="483.36218">lhs:a</tspan></text>
565+ <text
566+ inkscape:export-ydpi="61.120499"
567+ inkscape:export-xdpi="61.120499"
568+ xml:space="preserve"
569+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
570+ x="471"
571+ y="452.36218"
572+ id="text4340"
573+ sodipodi:linespacing="125%"><tspan
574+ style="font-size:15px;fill:#0000ff"
575+ id="tspan4342"
576+ sodipodi:role="line"
577+ x="471"
578+ y="452.36218">FunClause</tspan></text>
579+ <path
580+ inkscape:export-ydpi="61.120499"
581+ inkscape:export-xdpi="61.120499"
582+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4348)"
583+ d="m 450,371.3622 0,84"
584+ id="path4346"
585+ inkscape:connector-curvature="0"
586+ sodipodi:nodetypes="cc" />
587+ </g>
588+</svg>
docs/image/generateFunction2.pngnew file

Binary file not shown.

docs/image/generateFunction2.svgnew file+430
@@ -0,0 +1,430 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="generateFunction2.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker4439"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow2Mend">
29+ <path
30+ transform="scale(0.6) rotate(180) translate(0,0)"
31+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
32+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
33+ id="path4441" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow2Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="marker4433"
41+ style="overflow:visible;"
42+ inkscape:isstock="true">
43+ <path
44+ id="path4435"
45+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
46+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
47+ transform="scale(0.6) rotate(180) translate(0,0)" />
48+ </marker>
49+ <marker
50+ inkscape:isstock="true"
51+ style="overflow:visible;"
52+ id="marker4427"
53+ refX="0.0"
54+ refY="0.0"
55+ orient="auto"
56+ inkscape:stockid="Arrow2Mend"
57+ inkscape:collect="always">
58+ <path
59+ transform="scale(0.6) rotate(180) translate(0,0)"
60+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
61+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
62+ id="path4429" />
63+ </marker>
64+ <marker
65+ inkscape:isstock="true"
66+ style="overflow:visible;"
67+ id="marker4411"
68+ refX="0.0"
69+ refY="0.0"
70+ orient="auto"
71+ inkscape:stockid="Arrow2Mend">
72+ <path
73+ transform="scale(0.6) rotate(180) translate(0,0)"
74+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
75+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
76+ id="path4413" />
77+ </marker>
78+ <marker
79+ inkscape:stockid="Arrow2Mend"
80+ orient="auto"
81+ refY="0.0"
82+ refX="0.0"
83+ id="marker4407"
84+ style="overflow:visible;"
85+ inkscape:isstock="true">
86+ <path
87+ id="path4409"
88+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
89+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
90+ transform="scale(0.6) rotate(180) translate(0,0)" />
91+ </marker>
92+ <marker
93+ inkscape:stockid="Arrow2Mend"
94+ orient="auto"
95+ refY="0.0"
96+ refX="0.0"
97+ id="marker4403"
98+ style="overflow:visible;"
99+ inkscape:isstock="true">
100+ <path
101+ id="path4405"
102+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
103+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
104+ transform="scale(0.6) rotate(180) translate(0,0)" />
105+ </marker>
106+ <marker
107+ inkscape:isstock="true"
108+ style="overflow:visible;"
109+ id="marker4359"
110+ refX="0.0"
111+ refY="0.0"
112+ orient="auto"
113+ inkscape:stockid="Arrow2Mend"
114+ inkscape:collect="always">
115+ <path
116+ transform="scale(0.6) rotate(180) translate(0,0)"
117+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
118+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
119+ id="path4361" />
120+ </marker>
121+ <marker
122+ inkscape:stockid="Arrow2Mend"
123+ orient="auto"
124+ refY="0.0"
125+ refX="0.0"
126+ id="marker4349"
127+ style="overflow:visible;"
128+ inkscape:isstock="true"
129+ inkscape:collect="always">
130+ <path
131+ id="path4351"
132+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
133+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
134+ transform="scale(0.6) rotate(180) translate(0,0)" />
135+ </marker>
136+ <marker
137+ inkscape:isstock="true"
138+ style="overflow:visible;"
139+ id="marker7147"
140+ refX="0.0"
141+ refY="0.0"
142+ orient="auto"
143+ inkscape:stockid="Arrow2Mend">
144+ <path
145+ transform="scale(0.6) rotate(180) translate(0,0)"
146+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
147+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
148+ id="path7149" />
149+ </marker>
150+ <marker
151+ inkscape:isstock="true"
152+ style="overflow:visible;"
153+ id="marker6325"
154+ refX="0.0"
155+ refY="0.0"
156+ orient="auto"
157+ inkscape:stockid="Arrow2Mend">
158+ <path
159+ transform="scale(0.6) rotate(180) translate(0,0)"
160+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
161+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
162+ id="path6327" />
163+ </marker>
164+ <marker
165+ inkscape:stockid="Arrow2Mend"
166+ orient="auto"
167+ refY="0.0"
168+ refX="0.0"
169+ id="marker5163"
170+ style="overflow:visible;"
171+ inkscape:isstock="true">
172+ <path
173+ id="path5165"
174+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
175+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
176+ transform="scale(0.6) rotate(180) translate(0,0)" />
177+ </marker>
178+ </defs>
179+ <sodipodi:namedview
180+ id="base"
181+ pagecolor="#ffffff"
182+ bordercolor="#666666"
183+ borderopacity="1.0"
184+ inkscape:pageopacity="0.0"
185+ inkscape:pageshadow="2"
186+ inkscape:zoom="1"
187+ inkscape:cx="380.92935"
188+ inkscape:cy="592.42473"
189+ inkscape:document-units="px"
190+ inkscape:current-layer="layer1"
191+ showgrid="false"
192+ inkscape:window-width="1067"
193+ inkscape:window-height="1011"
194+ inkscape:window-x="0"
195+ inkscape:window-y="0"
196+ inkscape:window-maximized="0" />
197+ <metadata
198+ id="metadata7">
199+ <rdf:RDF>
200+ <cc:Work
201+ rdf:about="">
202+ <dc:format>image/svg+xml</dc:format>
203+ <dc:type
204+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
205+ <dc:title />
206+ </cc:Work>
207+ </rdf:RDF>
208+ </metadata>
209+ <g
210+ inkscape:label="Layer 1"
211+ inkscape:groupmode="layer"
212+ id="layer1">
213+ <rect
214+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
215+ id="rect6799"
216+ width="86"
217+ height="64"
218+ x="203"
219+ y="105.36218"
220+ inkscape:export-xdpi="61.120499"
221+ inkscape:export-ydpi="61.120499" />
222+ <text
223+ xml:space="preserve"
224+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
225+ x="201"
226+ y="211.36218"
227+ id="text6803"
228+ sodipodi:linespacing="125%"
229+ inkscape:export-xdpi="61.120499"
230+ inkscape:export-ydpi="61.120499"><tspan
231+ style="font-size:15px;fill:#ff0000"
232+ id="tspan6805"
233+ sodipodi:role="line"
234+ x="201"
235+ y="211.36218">RBind <tspan
236+ style="fill:#0000ff"
237+ id="tspan4367">TTName</tspan> (<tspan
238+ style="fill:#0000ff"
239+ id="tspan4363">Binder TT</tspan>) <tspan
240+ style="fill:#0000ff"
241+ id="tspan4365"> TT</tspan></tspan></text>
242+ <text
243+ sodipodi:linespacing="125%"
244+ id="text6807"
245+ y="127.36218"
246+ x="207"
247+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
248+ xml:space="preserve"
249+ inkscape:export-xdpi="61.120499"
250+ inkscape:export-ydpi="61.120499"><tspan
251+ y="127.36218"
252+ x="207"
253+ sodipodi:role="line"
254+ id="tspan6813"
255+ style="font-size:15px;fill:#0000ff">lhs:a</tspan><tspan
256+ y="146.11218"
257+ x="207"
258+ sodipodi:role="line"
259+ style="font-size:15px;fill:#0000ff"
260+ id="tspan4330">rhs:a</tspan></text>
261+ <text
262+ sodipodi:linespacing="125%"
263+ id="text6815"
264+ y="96.362183"
265+ x="201"
266+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
267+ xml:space="preserve"
268+ inkscape:export-xdpi="61.120499"
269+ inkscape:export-ydpi="61.120499"><tspan
270+ y="96.362183"
271+ x="201"
272+ sodipodi:role="line"
273+ id="tspan6817"
274+ style="font-size:15px;fill:#0000ff">FunClause</tspan></text>
275+ <rect
276+ inkscape:export-ydpi="61.120499"
277+ inkscape:export-xdpi="61.120499"
278+ y="177.36218"
279+ x="153"
280+ height="142"
281+ width="350"
282+ id="rect4332"
283+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
284+ <text
285+ inkscape:export-ydpi="61.120499"
286+ inkscape:export-xdpi="61.120499"
287+ xml:space="preserve"
288+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
289+ x="162"
290+ y="168.36218"
291+ id="text4340"
292+ sodipodi:linespacing="125%"><tspan
293+ style="font-size:15px;fill:#0000ff"
294+ id="tspan4342"
295+ sodipodi:role="line"
296+ x="162"
297+ y="168.36218">Raw</tspan></text>
298+ <path
299+ inkscape:export-ydpi="61.120499"
300+ inkscape:export-xdpi="61.120499"
301+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4349)"
302+ d="m 247,145.3622 c 28.96221,0.27049 22.31485,19.06346 -7,48"
303+ id="path4346"
304+ inkscape:connector-curvature="0"
305+ sodipodi:nodetypes="cc" />
306+ <text
307+ inkscape:export-ydpi="61.120499"
308+ inkscape:export-xdpi="61.120499"
309+ sodipodi:linespacing="125%"
310+ id="text4333"
311+ y="362.36218"
312+ x="343"
313+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
314+ xml:space="preserve"><tspan
315+ y="362.36218"
316+ x="343"
317+ sodipodi:role="line"
318+ id="tspan4335"
319+ style="font-size:15px;fill:#ff0000">PVar <tspan
320+ style="fill:#0000ff"
321+ id="tspan4415">a</tspan> (<tspan
322+ style="fill:#0000ff"
323+ id="tspan4369">Binder a</tspan>)</tspan></text>
324+ <path
325+ sodipodi:nodetypes="cc"
326+ inkscape:connector-curvature="0"
327+ id="path4337"
328+ d="m 336,214.3622 0,158"
329+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4407)"
330+ inkscape:export-xdpi="61.120499"
331+ inkscape:export-ydpi="61.120499" />
332+ <text
333+ xml:space="preserve"
334+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
335+ x="439"
336+ y="196.36218"
337+ id="text4339"
338+ sodipodi:linespacing="125%"
339+ inkscape:export-xdpi="61.120499"
340+ inkscape:export-ydpi="61.120499"><tspan
341+ style="font-size:15px;fill:#ff0000"
342+ id="tspan4341"
343+ sodipodi:role="line"
344+ x="439"
345+ y="196.36218">RApp Raw Raw</tspan></text>
346+ <path
347+ inkscape:export-ydpi="61.120499"
348+ inkscape:export-xdpi="61.120499"
349+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4359)"
350+ d="m 396,216.3622 c 22.67213,51.77028 75.6614,-87.82153 4,-37"
351+ id="path4343"
352+ inkscape:connector-curvature="0"
353+ sodipodi:nodetypes="cc" />
354+ <rect
355+ style="opacity:1;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
356+ id="rect4381"
357+ width="314"
358+ height="63"
359+ x="152"
360+ y="373.36218"
361+ inkscape:export-xdpi="61.120499"
362+ inkscape:export-ydpi="61.120499" />
363+ <text
364+ sodipodi:linespacing="125%"
365+ id="text4383"
366+ y="364.36218"
367+ x="161"
368+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
369+ xml:space="preserve"
370+ inkscape:export-xdpi="61.120499"
371+ inkscape:export-ydpi="61.120499"><tspan
372+ y="364.36218"
373+ x="161"
374+ sodipodi:role="line"
375+ id="tspan4385"
376+ style="font-size:15px;fill:#0000ff">Binder a</tspan></text>
377+ <text
378+ xml:space="preserve"
379+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
380+ x="208"
381+ y="254.36218"
382+ id="text4417"
383+ sodipodi:linespacing="125%"
384+ inkscape:export-xdpi="61.120499"
385+ inkscape:export-ydpi="61.120499"><tspan
386+ style="font-size:15px;fill:#ff0000"
387+ id="tspan4419"
388+ sodipodi:role="line"
389+ x="208"
390+ y="254.36218">`{{code}}</tspan></text>
391+ <text
392+ inkscape:export-ydpi="61.120499"
393+ inkscape:export-xdpi="61.120499"
394+ sodipodi:linespacing="125%"
395+ id="text4421"
396+ y="275.36218"
397+ x="242"
398+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
399+ xml:space="preserve"><tspan
400+ y="275.36218"
401+ x="242"
402+ sodipodi:role="line"
403+ id="tspan4423"
404+ style="font-size:15px;fill:#ff0000">`{{body}}</tspan></text>
405+ <path
406+ inkscape:export-ydpi="61.120499"
407+ inkscape:export-xdpi="61.120499"
408+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4427)"
409+ d="m 266,218.3622 -26,17"
410+ id="path4425"
411+ inkscape:connector-curvature="0"
412+ sodipodi:nodetypes="cc" />
413+ <path
414+ sodipodi:nodetypes="cc"
415+ inkscape:connector-curvature="0"
416+ id="path4431"
417+ d="m 272,217.3622 9,42"
418+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4433)"
419+ inkscape:export-xdpi="61.120499"
420+ inkscape:export-ydpi="61.120499" />
421+ <path
422+ sodipodi:nodetypes="cc"
423+ inkscape:connector-curvature="0"
424+ id="path4437"
425+ d="m 248,124.3622 c 30.28183,6.20207 31.24081,36.56361 -10,70"
426+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4439)"
427+ inkscape:export-xdpi="61.120499"
428+ inkscape:export-ydpi="61.120499" />
429+ </g>
430+</svg>
docs/image/idrisTopLevel.pngnew file

Binary file not shown.

docs/image/idrisTopLevel.svgnew file+524
@@ -0,0 +1,524 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="idrisTopLevel.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:stockid="Arrow1Mend"
23+ orient="auto"
24+ refY="0.0"
25+ refX="0.0"
26+ id="marker4198"
27+ style="overflow:visible;"
28+ inkscape:isstock="true">
29+ <path
30+ id="path4200"
31+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
32+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
33+ transform="scale(0.4) rotate(180) translate(10,0)" />
34+ </marker>
35+ <marker
36+ inkscape:isstock="true"
37+ style="overflow:visible;"
38+ id="marker4203"
39+ refX="0.0"
40+ refY="0.0"
41+ orient="auto"
42+ inkscape:stockid="Arrow1Mend"
43+ inkscape:collect="always">
44+ <path
45+ transform="scale(0.4) rotate(180) translate(10,0)"
46+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
47+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
48+ id="path4205" />
49+ </marker>
50+ <marker
51+ inkscape:stockid="Arrow1Mend"
52+ orient="auto"
53+ refY="0.0"
54+ refX="0.0"
55+ id="marker4197"
56+ style="overflow:visible;"
57+ inkscape:isstock="true"
58+ inkscape:collect="always">
59+ <path
60+ id="path4199"
61+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
62+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
63+ transform="scale(0.4) rotate(180) translate(10,0)" />
64+ </marker>
65+ <marker
66+ inkscape:stockid="Arrow1Mend"
67+ orient="auto"
68+ refY="0.0"
69+ refX="0.0"
70+ id="marker4182"
71+ style="overflow:visible;"
72+ inkscape:isstock="true">
73+ <path
74+ id="path4184"
75+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
76+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
77+ transform="scale(0.4) rotate(180) translate(10,0)" />
78+ </marker>
79+ <marker
80+ inkscape:isstock="true"
81+ style="overflow:visible;"
82+ id="marker4176"
83+ refX="0.0"
84+ refY="0.0"
85+ orient="auto"
86+ inkscape:stockid="Arrow1Mend"
87+ inkscape:collect="always">
88+ <path
89+ transform="scale(0.4) rotate(180) translate(10,0)"
90+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
91+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
92+ id="path4178" />
93+ </marker>
94+ <marker
95+ inkscape:stockid="Arrow1Mend"
96+ orient="auto"
97+ refY="0.0"
98+ refX="0.0"
99+ id="marker4830"
100+ style="overflow:visible;"
101+ inkscape:isstock="true"
102+ inkscape:collect="always">
103+ <path
104+ id="path4832"
105+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
106+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
107+ transform="scale(0.4) rotate(180) translate(10,0)" />
108+ </marker>
109+ <marker
110+ inkscape:stockid="Arrow1Mend"
111+ orient="auto"
112+ refY="0.0"
113+ refX="0.0"
114+ id="Arrow1Mend"
115+ style="overflow:visible;"
116+ inkscape:isstock="true"
117+ inkscape:collect="always">
118+ <path
119+ id="path4175"
120+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
121+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
122+ transform="scale(0.4) rotate(180) translate(10,0)" />
123+ </marker>
124+ </defs>
125+ <sodipodi:namedview
126+ id="base"
127+ pagecolor="#ffffff"
128+ bordercolor="#666666"
129+ borderopacity="1.0"
130+ inkscape:pageopacity="0.0"
131+ inkscape:pageshadow="2"
132+ inkscape:zoom="1"
133+ inkscape:cx="353.5"
134+ inkscape:cy="669.5"
135+ inkscape:document-units="px"
136+ inkscape:current-layer="layer1"
137+ showgrid="false"
138+ inkscape:window-width="1744"
139+ inkscape:window-height="1011"
140+ inkscape:window-x="-4"
141+ inkscape:window-y="0"
142+ inkscape:window-maximized="0" />
143+ <metadata
144+ id="metadata7">
145+ <rdf:RDF>
146+ <cc:Work
147+ rdf:about="">
148+ <dc:format>image/svg+xml</dc:format>
149+ <dc:type
150+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
151+ <dc:title />
152+ </cc:Work>
153+ </rdf:RDF>
154+ </metadata>
155+ <g
156+ inkscape:label="Layer 1"
157+ inkscape:groupmode="layer"
158+ id="layer1">
159+ <text
160+ xml:space="preserve"
161+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
162+ x="21"
163+ y="411.36221"
164+ id="text4136"
165+ sodipodi:linespacing="125%"
166+ inkscape:export-xdpi="61.120499"
167+ inkscape:export-ydpi="61.120499"><tspan
168+ sodipodi:role="line"
169+ id="tspan4138"
170+ x="21"
171+ y="411.36221"
172+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000">Idris</tspan></text>
173+ <text
174+ sodipodi:linespacing="125%"
175+ id="text4140"
176+ y="411.36221"
177+ x="203"
178+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
179+ xml:space="preserve"
180+ inkscape:export-xdpi="61.120499"
181+ inkscape:export-ydpi="61.120499"><tspan
182+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
183+ y="411.36221"
184+ x="203"
185+ id="tspan4142"
186+ sodipodi:role="line">Idris</tspan></text>
187+ <text
188+ xml:space="preserve"
189+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
190+ x="253"
191+ y="402.36218"
192+ id="text4144"
193+ sodipodi:linespacing="125%"
194+ inkscape:export-xdpi="61.120499"
195+ inkscape:export-ydpi="61.120499"><tspan
196+ sodipodi:role="line"
197+ id="tspan4146"
198+ x="253"
199+ y="402.36218"
200+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;">~</tspan></text>
201+ <text
202+ sodipodi:linespacing="125%"
203+ id="text4148"
204+ y="411.60635"
205+ x="451"
206+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
207+ xml:space="preserve"
208+ inkscape:export-xdpi="61.120499"
209+ inkscape:export-ydpi="61.120499"><tspan
210+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
211+ y="411.60635"
212+ x="451"
213+ id="tspan4150"
214+ sodipodi:role="line">TT</tspan></text>
215+ <text
216+ xml:space="preserve"
217+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
218+ x="610"
219+ y="411.36221"
220+ id="text4152"
221+ sodipodi:linespacing="125%"
222+ inkscape:export-xdpi="61.120499"
223+ inkscape:export-ydpi="61.120499"><tspan
224+ sodipodi:role="line"
225+ id="tspan4154"
226+ x="610"
227+ y="411.36221"
228+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000">Executable</tspan></text>
229+ <text
230+ sodipodi:linespacing="125%"
231+ id="text4156"
232+ y="436.36218"
233+ x="80"
234+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
235+ xml:space="preserve"
236+ inkscape:export-xdpi="61.120499"
237+ inkscape:export-ydpi="61.120499"><tspan
238+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
239+ y="436.36218"
240+ x="80"
241+ id="tspan4158"
242+ sodipodi:role="line">desugaring</tspan></text>
243+ <path
244+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
245+ d="M 81.977612,407.11261 188,407.3622"
246+ id="path4160"
247+ inkscape:connector-curvature="0"
248+ inkscape:export-xdpi="61.120499"
249+ inkscape:export-ydpi="61.120499"
250+ sodipodi:nodetypes="cc" />
251+ <text
252+ xml:space="preserve"
253+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
254+ x="281"
255+ y="432.36218"
256+ id="text4790"
257+ sodipodi:linespacing="125%"
258+ inkscape:export-xdpi="61.120499"
259+ inkscape:export-ydpi="61.120499"><tspan
260+ sodipodi:role="line"
261+ id="tspan4792"
262+ x="281"
263+ y="432.36218"
264+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">elaboration</tspan></text>
265+ <text
266+ sodipodi:linespacing="125%"
267+ id="text4824"
268+ y="394.36218"
269+ x="498"
270+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
271+ xml:space="preserve"
272+ inkscape:export-xdpi="61.120499"
273+ inkscape:export-ydpi="61.120499"><tspan
274+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
275+ y="394.36218"
276+ x="498"
277+ id="tspan4826"
278+ sodipodi:role="line">compilation</tspan></text>
279+ <path
280+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4830)"
281+ d="m 495,405.33981 105,0.0224"
282+ id="path4828"
283+ inkscape:connector-curvature="0"
284+ inkscape:export-xdpi="61.120499"
285+ inkscape:export-ydpi="61.120499"
286+ sodipodi:nodetypes="cc" />
287+ <text
288+ inkscape:export-ydpi="61.120499"
289+ inkscape:export-xdpi="61.120499"
290+ sodipodi:linespacing="125%"
291+ id="text4166"
292+ y="442.36218"
293+ x="609"
294+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
295+ xml:space="preserve"><tspan
296+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
297+ y="442.36218"
298+ x="609"
299+ id="tspan4168"
300+ sodipodi:role="line">C</tspan></text>
301+ <text
302+ xml:space="preserve"
303+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
304+ x="609"
305+ y="475.36218"
306+ id="text4170"
307+ sodipodi:linespacing="125%"
308+ inkscape:export-xdpi="61.120499"
309+ inkscape:export-ydpi="61.120499"><tspan
310+ sodipodi:role="line"
311+ id="tspan4172"
312+ x="609"
313+ y="475.36218"
314+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:25px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000">JS</tspan></text>
315+ <path
316+ inkscape:export-ydpi="61.120499"
317+ inkscape:export-xdpi="61.120499"
318+ inkscape:connector-curvature="0"
319+ id="path4174"
320+ d="m 495,406.3622 104,26"
321+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:8, 2;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker4176)"
322+ sodipodi:nodetypes="cc" />
323+ <path
324+ sodipodi:nodetypes="cc"
325+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:12, 2;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker4182)"
326+ d="M 495,405.90781 599,467.3622"
327+ id="path4180"
328+ inkscape:connector-curvature="0"
329+ inkscape:export-xdpi="61.120499"
330+ inkscape:export-ydpi="61.120499" />
331+ <text
332+ inkscape:export-ydpi="61.120499"
333+ inkscape:export-xdpi="61.120499"
334+ xml:space="preserve"
335+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
336+ x="20"
337+ y="523.36218"
338+ id="text4186"
339+ sodipodi:linespacing="125%"><tspan
340+ sodipodi:role="line"
341+ x="20"
342+ y="523.36218"
343+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
344+ id="tspan4190">Add implicitly quantified variables.</tspan><tspan
345+ sodipodi:role="line"
346+ x="20"
347+ y="542.11218"
348+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
349+ id="tspan4191">Conditional expressions replaced by function calls.</tspan></text>
350+ <path
351+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
352+ d="m 120.29902,440.01416 0.098,70.81863"
353+ id="path4192"
354+ inkscape:connector-curvature="0"
355+ inkscape:export-xdpi="61.120499"
356+ inkscape:export-ydpi="61.120499"
357+ sodipodi:nodetypes="cc" />
358+ <text
359+ sodipodi:linespacing="125%"
360+ id="text4194"
361+ y="367.36218"
362+ x="358"
363+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
364+ xml:space="preserve"
365+ inkscape:export-xdpi="61.120499"
366+ inkscape:export-ydpi="61.120499"><tspan
367+ id="tspan4198"
368+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
369+ y="367.36218"
370+ x="358"
371+ sodipodi:role="line">proof tactics</tspan></text>
372+ <path
373+ inkscape:connector-curvature="0"
374+ id="path4202"
375+ d="m 382.73881,368.53384 0.16418,32.3209"
376+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
377+ sodipodi:nodetypes="cc"
378+ inkscape:export-xdpi="61.120499"
379+ inkscape:export-ydpi="61.120499" />
380+ <path
381+ inkscape:export-ydpi="61.120499"
382+ inkscape:export-xdpi="61.120499"
383+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4197)"
384+ d="m 277,403.3622 37.7728,-0.0912"
385+ id="path4195"
386+ inkscape:connector-curvature="0"
387+ sodipodi:nodetypes="cc" />
388+ <path
389+ sodipodi:nodetypes="cc"
390+ inkscape:connector-curvature="0"
391+ id="path4201"
392+ d="m 335,403.15739 37.8864,-0.31841"
393+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4203)"
394+ inkscape:export-xdpi="61.120499"
395+ inkscape:export-ydpi="61.120499" />
396+ <text
397+ inkscape:export-ydpi="61.120499"
398+ inkscape:export-xdpi="61.120499"
399+ xml:space="preserve"
400+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
401+ x="215"
402+ y="340.36218"
403+ id="text4207"
404+ sodipodi:linespacing="125%"><tspan
405+ sodipodi:role="line"
406+ x="215"
407+ y="340.36218"
408+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
409+ id="tspan4209">during elaboration</tspan><tspan
410+ sodipodi:role="line"
411+ x="215"
412+ y="359.11218"
413+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
414+ id="tspan4213">may contain holes</tspan><tspan
415+ sodipodi:role="line"
416+ x="215"
417+ y="377.86218"
418+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
419+ id="tspan4199">and guesses</tspan></text>
420+ <path
421+ inkscape:export-ydpi="61.120499"
422+ inkscape:export-xdpi="61.120499"
423+ sodipodi:nodetypes="cc"
424+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
425+ d="m 324,399.3622 0.11194,-38.03731"
426+ id="path4211"
427+ inkscape:connector-curvature="0" />
428+ <text
429+ sodipodi:linespacing="125%"
430+ id="text4215"
431+ y="461.36218"
432+ x="233"
433+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
434+ xml:space="preserve"
435+ inkscape:export-xdpi="61.120499"
436+ inkscape:export-ydpi="61.120499"><tspan
437+ id="tspan4217"
438+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
439+ y="461.36218"
440+ x="233"
441+ sodipodi:role="line">Make explicit all types.</tspan><tspan
442+ id="tspan4223"
443+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
444+ y="480.11218"
445+ x="233"
446+ sodipodi:role="line">Make explicit function and </tspan><tspan
447+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
448+ y="498.86218"
449+ x="233"
450+ sodipodi:role="line"
451+ id="tspan4235"> pattern match variables.</tspan></text>
452+ <path
453+ inkscape:export-ydpi="61.120499"
454+ inkscape:export-xdpi="61.120499"
455+ sodipodi:nodetypes="cc"
456+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
457+ d="m 323.7402,434.372 0.0637,16.14706"
458+ id="path4237"
459+ inkscape:connector-curvature="0" />
460+ <path
461+ inkscape:export-ydpi="61.120499"
462+ inkscape:export-xdpi="61.120499"
463+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4198)"
464+ d="m 395,402.49819 45.38391,-0.31841"
465+ id="path4196"
466+ inkscape:connector-curvature="0"
467+ sodipodi:nodetypes="cc" />
468+ <text
469+ inkscape:export-ydpi="61.120499"
470+ inkscape:export-xdpi="61.120499"
471+ xml:space="preserve"
472+ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
473+ x="431"
474+ y="465.36218"
475+ id="text4202"
476+ sodipodi:linespacing="125%"><tspan
477+ sodipodi:role="line"
478+ x="431"
479+ y="465.36218"
480+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
481+ id="tspan4204">type checker</tspan><tspan
482+ sodipodi:role="line"
483+ x="431"
484+ y="484.11218"
485+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'"
486+ id="tspan4208">Raw -&gt; TT</tspan></text>
487+ <path
488+ inkscape:export-ydpi="61.120499"
489+ inkscape:export-xdpi="61.120499"
490+ sodipodi:nodetypes="cc"
491+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
492+ d="m 421,411.3622 39,40"
493+ id="path4206"
494+ inkscape:connector-curvature="0" />
495+ <text
496+ inkscape:export-ydpi="61.120499"
497+ inkscape:export-xdpi="61.120499"
498+ xml:space="preserve"
499+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
500+ x="378"
501+ y="417.36218"
502+ id="text4203"
503+ sodipodi:linespacing="125%"><tspan
504+ sodipodi:role="line"
505+ id="tspan4205"
506+ x="378"
507+ y="417.36218"
508+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000">Raw</tspan></text>
509+ <text
510+ sodipodi:linespacing="125%"
511+ id="text4205"
512+ y="432.36218"
513+ x="201"
514+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
515+ xml:space="preserve"
516+ inkscape:export-xdpi="61.120499"
517+ inkscape:export-ydpi="61.120499"><tspan
518+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000"
519+ y="432.36218"
520+ x="201"
521+ id="tspan4207"
522+ sodipodi:role="line">PTerm</tspan></text>
523+ </g>
524+</svg>
docs/image/login.pngnew file

Binary file not shown.

docs/image/netstate.pngnew file

Binary file not shown.

docs/image/parserModules.pngnew file

Binary file not shown.

docs/image/parserModules.svgnew file+1251
@@ -0,0 +1,1251 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 210 297"
15+ version="1.1"
16+ id="svg8"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="parserModules.svg">
19+ <defs
20+ id="defs2">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker1078"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow1Mend">
29+ <path
30+ transform="scale(0.4) rotate(180) translate(10,0)"
31+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
32+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
33+ id="path1076" />
34+ </marker>
35+ <marker
36+ inkscape:isstock="true"
37+ style="overflow:visible"
38+ id="marker1074"
39+ refX="0.0"
40+ refY="0.0"
41+ orient="auto"
42+ inkscape:stockid="Arrow1Mstart">
43+ <path
44+ transform="scale(0.4) translate(10,0)"
45+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
46+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
47+ id="path1072" />
48+ </marker>
49+ <marker
50+ inkscape:stockid="Arrow1Mend"
51+ orient="auto"
52+ refY="0.0"
53+ refX="0.0"
54+ id="marker1021"
55+ style="overflow:visible;"
56+ inkscape:isstock="true"
57+ inkscape:collect="always">
58+ <path
59+ id="path1019"
60+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
61+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
62+ transform="scale(0.4) rotate(180) translate(10,0)" />
63+ </marker>
64+ <marker
65+ inkscape:stockid="Arrow1Mstart"
66+ orient="auto"
67+ refY="0.0"
68+ refX="0.0"
69+ id="marker1017"
70+ style="overflow:visible"
71+ inkscape:isstock="true"
72+ inkscape:collect="always">
73+ <path
74+ id="path1015"
75+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
76+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
77+ transform="scale(0.4) translate(10,0)" />
78+ </marker>
79+ <marker
80+ inkscape:isstock="true"
81+ style="overflow:visible;"
82+ id="marker973"
83+ refX="0.0"
84+ refY="0.0"
85+ orient="auto"
86+ inkscape:stockid="Arrow1Mend"
87+ inkscape:collect="always">
88+ <path
89+ transform="scale(0.4) rotate(180) translate(10,0)"
90+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
91+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
92+ id="path971" />
93+ </marker>
94+ <marker
95+ inkscape:isstock="true"
96+ style="overflow:visible"
97+ id="marker969"
98+ refX="0.0"
99+ refY="0.0"
100+ orient="auto"
101+ inkscape:stockid="Arrow1Mstart"
102+ inkscape:collect="always">
103+ <path
104+ transform="scale(0.4) translate(10,0)"
105+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
106+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
107+ id="path967" />
108+ </marker>
109+ <marker
110+ inkscape:stockid="Arrow1Mend"
111+ orient="auto"
112+ refY="0.0"
113+ refX="0.0"
114+ id="Arrow1Mend"
115+ style="overflow:visible;"
116+ inkscape:isstock="true"
117+ inkscape:collect="always">
118+ <path
119+ id="path1214"
120+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
121+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
122+ transform="scale(0.4) rotate(180) translate(10,0)" />
123+ </marker>
124+ <marker
125+ inkscape:stockid="Arrow1Mstart"
126+ orient="auto"
127+ refY="0.0"
128+ refX="0.0"
129+ id="Arrow1Mstart"
130+ style="overflow:visible"
131+ inkscape:isstock="true"
132+ inkscape:collect="always">
133+ <path
134+ id="path1211"
135+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
136+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
137+ transform="scale(0.4) translate(10,0)" />
138+ </marker>
139+ <marker
140+ inkscape:isstock="true"
141+ style="overflow:visible;"
142+ id="marker1000"
143+ refX="0.0"
144+ refY="0.0"
145+ orient="auto"
146+ inkscape:stockid="Arrow1Mend">
147+ <path
148+ transform="scale(0.4) rotate(180) translate(10,0)"
149+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
150+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
151+ id="path998" />
152+ </marker>
153+ <marker
154+ inkscape:isstock="true"
155+ style="overflow:visible;"
156+ id="marker1127"
157+ refX="0.0"
158+ refY="0.0"
159+ orient="auto"
160+ inkscape:stockid="Arrow1Mend">
161+ <path
162+ transform="scale(0.4) rotate(180) translate(10,0)"
163+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
164+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
165+ id="path1125" />
166+ </marker>
167+ <marker
168+ inkscape:isstock="true"
169+ style="overflow:visible;"
170+ id="marker1123"
171+ refX="0.0"
172+ refY="0.0"
173+ orient="auto"
174+ inkscape:stockid="Arrow1Mend">
175+ <path
176+ transform="scale(0.4) rotate(180) translate(10,0)"
177+ style="fill-rule:evenodd;stroke:#00aa3f;stroke-width:1pt;stroke-opacity:1;fill:#00aa3f;fill-opacity:1"
178+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
179+ id="path1121" />
180+ </marker>
181+ <marker
182+ inkscape:isstock="true"
183+ style="overflow:visible;"
184+ id="marker1117"
185+ refX="0.0"
186+ refY="0.0"
187+ orient="auto"
188+ inkscape:stockid="Arrow1Mend">
189+ <path
190+ transform="scale(0.4) rotate(180) translate(10,0)"
191+ style="fill-rule:evenodd;stroke:#00aa3f;stroke-width:1pt;stroke-opacity:1;fill:#00aa3f;fill-opacity:1"
192+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
193+ id="path1115" />
194+ </marker>
195+ <marker
196+ inkscape:stockid="Arrow1Mend"
197+ orient="auto"
198+ refY="0.0"
199+ refX="0.0"
200+ id="marker1111"
201+ style="overflow:visible;"
202+ inkscape:isstock="true"
203+ inkscape:collect="always">
204+ <path
205+ id="path1109"
206+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
207+ style="fill-rule:evenodd;stroke:#00aa3f;stroke-width:1pt;stroke-opacity:1;fill:#00aa3f;fill-opacity:1"
208+ transform="scale(0.4) rotate(180) translate(10,0)" />
209+ </marker>
210+ <marker
211+ inkscape:isstock="true"
212+ style="overflow:visible;"
213+ id="marker1105"
214+ refX="0.0"
215+ refY="0.0"
216+ orient="auto"
217+ inkscape:stockid="Arrow1Mend"
218+ inkscape:collect="always">
219+ <path
220+ transform="scale(0.4) rotate(180) translate(10,0)"
221+ style="fill-rule:evenodd;stroke:#00aa3f;stroke-width:1pt;stroke-opacity:1;fill:#00aa3f;fill-opacity:1"
222+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
223+ id="path1103" />
224+ </marker>
225+ <marker
226+ inkscape:isstock="true"
227+ style="overflow:visible;"
228+ id="marker1057"
229+ refX="0.0"
230+ refY="0.0"
231+ orient="auto"
232+ inkscape:stockid="Arrow1Mend">
233+ <path
234+ transform="scale(0.4) rotate(180) translate(10,0)"
235+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
236+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
237+ id="path1055" />
238+ </marker>
239+ <marker
240+ inkscape:stockid="Arrow1Mend"
241+ orient="auto"
242+ refY="0.0"
243+ refX="0.0"
244+ id="marker1045"
245+ style="overflow:visible;"
246+ inkscape:isstock="true"
247+ inkscape:collect="always">
248+ <path
249+ id="path1043"
250+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
251+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
252+ transform="scale(0.4) rotate(180) translate(10,0)" />
253+ </marker>
254+ <marker
255+ inkscape:stockid="Arrow1Mend"
256+ orient="auto"
257+ refY="0.0"
258+ refX="0.0"
259+ id="marker1033"
260+ style="overflow:visible;"
261+ inkscape:isstock="true">
262+ <path
263+ id="path1031"
264+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
265+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
266+ transform="scale(0.4) rotate(180) translate(10,0)" />
267+ </marker>
268+ <marker
269+ inkscape:stockid="Arrow1Mend"
270+ orient="auto"
271+ refY="0.0"
272+ refX="0.0"
273+ id="marker1027"
274+ style="overflow:visible;"
275+ inkscape:isstock="true">
276+ <path
277+ id="path1025"
278+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
279+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
280+ transform="scale(0.4) rotate(180) translate(10,0)" />
281+ </marker>
282+ <marker
283+ inkscape:isstock="true"
284+ style="overflow:visible;"
285+ id="marker1015"
286+ refX="0.0"
287+ refY="0.0"
288+ orient="auto"
289+ inkscape:stockid="Arrow1Mend"
290+ inkscape:collect="always">
291+ <path
292+ transform="scale(0.4) rotate(180) translate(10,0)"
293+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
294+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
295+ id="path1013" />
296+ </marker>
297+ <marker
298+ inkscape:isstock="true"
299+ style="overflow:visible;"
300+ id="marker1009"
301+ refX="0.0"
302+ refY="0.0"
303+ orient="auto"
304+ inkscape:stockid="Arrow1Mend">
305+ <path
306+ transform="scale(0.4) rotate(180) translate(10,0)"
307+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
308+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
309+ id="path1007" />
310+ </marker>
311+ <marker
312+ inkscape:isstock="true"
313+ style="overflow:visible;"
314+ id="marker1003"
315+ refX="0.0"
316+ refY="0.0"
317+ orient="auto"
318+ inkscape:stockid="Arrow1Mend">
319+ <path
320+ transform="scale(0.4) rotate(180) translate(10,0)"
321+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
322+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
323+ id="path1001" />
324+ </marker>
325+ <marker
326+ inkscape:stockid="Arrow1Mend"
327+ orient="auto"
328+ refY="0.0"
329+ refX="0.0"
330+ id="marker997"
331+ style="overflow:visible;"
332+ inkscape:isstock="true"
333+ inkscape:collect="always">
334+ <path
335+ id="path995"
336+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
337+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
338+ transform="scale(0.4) rotate(180) translate(10,0)" />
339+ </marker>
340+ <marker
341+ inkscape:isstock="true"
342+ style="overflow:visible;"
343+ id="marker991"
344+ refX="0.0"
345+ refY="0.0"
346+ orient="auto"
347+ inkscape:stockid="Arrow1Mend"
348+ inkscape:collect="always">
349+ <path
350+ transform="scale(0.4) rotate(180) translate(10,0)"
351+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
352+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
353+ id="path989" />
354+ </marker>
355+ <marker
356+ inkscape:stockid="Arrow1Mend"
357+ orient="auto"
358+ refY="0.0"
359+ refX="0.0"
360+ id="marker967"
361+ style="overflow:visible;"
362+ inkscape:isstock="true"
363+ inkscape:collect="always">
364+ <path
365+ id="path965"
366+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
367+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
368+ transform="scale(0.4) rotate(180) translate(10,0)" />
369+ </marker>
370+ <marker
371+ inkscape:isstock="true"
372+ style="overflow:visible;"
373+ id="marker961"
374+ refX="0.0"
375+ refY="0.0"
376+ orient="auto"
377+ inkscape:stockid="Arrow1Mend"
378+ inkscape:collect="always">
379+ <path
380+ transform="scale(0.4) rotate(180) translate(10,0)"
381+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
382+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
383+ id="path959" />
384+ </marker>
385+ <marker
386+ inkscape:isstock="true"
387+ style="overflow:visible;"
388+ id="marker3617"
389+ refX="0.0"
390+ refY="0.0"
391+ orient="auto"
392+ inkscape:stockid="Arrow1Mend">
393+ <path
394+ transform="scale(0.4) rotate(180) translate(10,0)"
395+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
396+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
397+ id="path3615" />
398+ </marker>
399+ <marker
400+ inkscape:stockid="Arrow1Mend"
401+ orient="auto"
402+ refY="0.0"
403+ refX="0.0"
404+ id="marker2049"
405+ style="overflow:visible;"
406+ inkscape:isstock="true"
407+ inkscape:collect="always">
408+ <path
409+ id="path2047"
410+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
411+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
412+ transform="scale(0.4) rotate(180) translate(10,0)" />
413+ </marker>
414+ <marker
415+ inkscape:isstock="true"
416+ style="overflow:visible;"
417+ id="marker1539"
418+ refX="0.0"
419+ refY="0.0"
420+ orient="auto"
421+ inkscape:stockid="Arrow1Mend"
422+ inkscape:collect="always">
423+ <path
424+ transform="scale(0.4) rotate(180) translate(10,0)"
425+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
426+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
427+ id="path1537" />
428+ </marker>
429+ </defs>
430+ <sodipodi:namedview
431+ id="base"
432+ pagecolor="#ffffff"
433+ bordercolor="#666666"
434+ borderopacity="1.0"
435+ inkscape:pageopacity="0.0"
436+ inkscape:pageshadow="2"
437+ inkscape:zoom="1"
438+ inkscape:cx="368.33949"
439+ inkscape:cy="547.05121"
440+ inkscape:document-units="mm"
441+ inkscape:current-layer="layer1"
442+ showgrid="false"
443+ inkscape:window-width="1800"
444+ inkscape:window-height="1011"
445+ inkscape:window-x="86"
446+ inkscape:window-y="0"
447+ inkscape:window-maximized="0"
448+ inkscape:snap-nodes="false" />
449+ <metadata
450+ id="metadata5">
451+ <rdf:RDF>
452+ <cc:Work
453+ rdf:about="">
454+ <dc:format>image/svg+xml</dc:format>
455+ <dc:type
456+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
457+ <dc:title />
458+ </cc:Work>
459+ </rdf:RDF>
460+ </metadata>
461+ <g
462+ inkscape:label="Layer 1"
463+ inkscape:groupmode="layer"
464+ id="layer1">
465+ <text
466+ inkscape:export-ydpi="61.120499"
467+ inkscape:export-xdpi="61.120499"
468+ id="text854"
469+ y="119.72919"
470+ x="131.23334"
471+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
472+ xml:space="preserve"><tspan
473+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
474+ y="129.46077"
475+ x="131.23334"
476+ id="tspan852"
477+ sodipodi:role="line" /></text>
478+ <rect
479+ inkscape:export-ydpi="61.120499"
480+ inkscape:export-xdpi="61.120499"
481+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
482+ id="rect875"
483+ width="43.656246"
484+ height="18.520832"
485+ x="92.339577"
486+ y="110.20418" />
487+ <path
488+ inkscape:export-ydpi="61.120499"
489+ inkscape:export-xdpi="61.120499"
490+ inkscape:connector-curvature="0"
491+ id="path881"
492+ d="m 135.73129,118.93554 16.66875,-0.26459"
493+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2049)" />
494+ <text
495+ inkscape:export-ydpi="61.120499"
496+ inkscape:export-xdpi="61.120499"
497+ id="text895"
498+ y="115.76046"
499+ x="138.37698"
500+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
501+ xml:space="preserve"><tspan
502+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
503+ y="115.76046"
504+ x="138.37698"
505+ id="tspan893"
506+ sodipodi:role="line">PTerm</tspan></text>
507+ <text
508+ inkscape:export-ydpi="61.120499"
509+ inkscape:export-xdpi="61.120499"
510+ id="text903"
511+ y="115.23129"
512+ x="93.927078"
513+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
514+ xml:space="preserve"><tspan
515+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332"
516+ y="115.23129"
517+ x="93.927078"
518+ id="tspan901"
519+ sodipodi:role="line">module Idris.Parser</tspan><tspan
520+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332"
521+ y="128.46045"
522+ x="93.927078"
523+ sodipodi:role="line"
524+ id="tspan1021" /></text>
525+ <rect
526+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
527+ id="rect905"
528+ width="44.185421"
529+ height="18.785423"
530+ x="40.463421"
531+ y="141.50723"
532+ inkscape:export-xdpi="61.120499"
533+ inkscape:export-ydpi="61.120499" />
534+ <rect
535+ y="155.183"
536+ x="95.51458"
537+ height="18.256256"
538+ width="49.212498"
539+ id="rect907"
540+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
541+ inkscape:export-xdpi="61.120499"
542+ inkscape:export-ydpi="61.120499" />
543+ <path
544+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker961)"
545+ d="m 84.648837,152.88468 9.013662,7.32603"
546+ id="path909"
547+ inkscape:connector-curvature="0"
548+ inkscape:export-xdpi="61.120499"
549+ inkscape:export-ydpi="61.120499"
550+ sodipodi:nodetypes="cc" />
551+ <path
552+ inkscape:connector-curvature="0"
553+ id="path911"
554+ d="m 22.471756,152.09108 16.66875,-0.26459"
555+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1539)"
556+ inkscape:export-xdpi="61.120499"
557+ inkscape:export-ydpi="61.120499" />
558+ <text
559+ xml:space="preserve"
560+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
561+ x="24.059256"
562+ y="148.91547"
563+ id="text917"
564+ inkscape:export-xdpi="61.120499"
565+ inkscape:export-ydpi="61.120499"><tspan
566+ sodipodi:role="line"
567+ id="tspan915"
568+ x="24.059256"
569+ y="148.91547"
570+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332">String</tspan></text>
571+ <text
572+ id="text923"
573+ y="137.72075"
574+ x="65.087494"
575+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
576+ xml:space="preserve"
577+ inkscape:export-xdpi="61.120499"
578+ inkscape:export-ydpi="61.120499"><tspan
579+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
580+ y="137.72075"
581+ x="65.087494"
582+ sodipodi:role="line"
583+ id="tspan921">List (TokenData Token)</tspan></text>
584+ <text
585+ id="text931"
586+ y="218.41846"
587+ x="36.512497"
588+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
589+ xml:space="preserve"
590+ inkscape:export-xdpi="61.120499"
591+ inkscape:export-ydpi="61.120499"><tspan
592+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;"
593+ y="218.41846"
594+ x="36.512497"
595+ id="tspan929"
596+ sodipodi:role="line">module Text.Lexer</tspan></text>
597+ <text
598+ xml:space="preserve"
599+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
600+ x="98.160408"
601+ y="161.00386"
602+ id="text935"
603+ inkscape:export-xdpi="61.120499"
604+ inkscape:export-ydpi="61.120499"><tspan
605+ sodipodi:role="line"
606+ id="tspan933"
607+ x="98.160408"
608+ y="161.00386"
609+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">module Parser.Support</tspan></text>
610+ <rect
611+ inkscape:export-ydpi="61.120499"
612+ inkscape:export-xdpi="61.120499"
613+ y="214.18488"
614+ x="32.01458"
615+ height="6.3500061"
616+ width="43.656254"
617+ id="rect937"
618+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
619+ <rect
620+ inkscape:export-ydpi="61.120499"
621+ inkscape:export-xdpi="61.120499"
622+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
623+ id="rect939"
624+ width="42.862495"
625+ height="6.8791728"
626+ x="94.985413"
627+ y="214.18488" />
628+ <text
629+ inkscape:export-ydpi="61.120499"
630+ inkscape:export-xdpi="61.120499"
631+ xml:space="preserve"
632+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
633+ x="42.31551"
634+ y="147.59224"
635+ id="text951"><tspan
636+ sodipodi:role="line"
637+ id="tspan949"
638+ x="42.31551"
639+ y="147.59224"
640+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">module Parser.Lexer</tspan></text>
641+ <path
642+ sodipodi:nodetypes="cc"
643+ inkscape:export-ydpi="61.120499"
644+ inkscape:export-xdpi="61.120499"
645+ inkscape:connector-curvature="0"
646+ id="path963"
647+ d="m 53.299561,213.22831 1.53604,-51.85834"
648+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker967)" />
649+ <text
650+ inkscape:export-ydpi="61.120499"
651+ inkscape:export-xdpi="61.120499"
652+ xml:space="preserve"
653+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
654+ x="23.220526"
655+ y="251.01649"
656+ id="text971"><tspan
657+ sodipodi:role="line"
658+ id="tspan969"
659+ x="23.220526"
660+ y="251.01649"
661+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;">module Text.Lexer.Core</tspan></text>
662+ <rect
663+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
664+ id="rect973"
665+ width="47.889587"
666+ height="6.3500061"
667+ x="21.633026"
668+ y="246.51833"
669+ inkscape:export-xdpi="61.120499"
670+ inkscape:export-ydpi="61.120499" />
671+ <path
672+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker991)"
673+ d="m 48.369316,228.83873 0.04943,-6.71548"
674+ id="path975"
675+ inkscape:connector-curvature="0"
676+ inkscape:export-xdpi="61.120499"
677+ inkscape:export-ydpi="61.120499"
678+ sodipodi:nodetypes="cc" />
679+ <text
680+ id="text979"
681+ y="241.96643"
682+ x="23.283329"
683+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
684+ xml:space="preserve"
685+ inkscape:export-xdpi="61.120499"
686+ inkscape:export-ydpi="61.120499"><tspan
687+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;"
688+ y="241.96643"
689+ x="23.283329"
690+ id="tspan977"
691+ sodipodi:role="line">module Text.Quantity</tspan></text>
692+ <rect
693+ inkscape:export-ydpi="61.120499"
694+ inkscape:export-xdpi="61.120499"
695+ y="237.46826"
696+ x="21.695829"
697+ height="6.2469702"
698+ width="43.853985"
699+ id="rect981"
700+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
701+ <text
702+ inkscape:export-ydpi="61.120499"
703+ inkscape:export-xdpi="61.120499"
704+ xml:space="preserve"
705+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
706+ x="23.18244"
707+ y="233.68523"
708+ id="text985"><tspan
709+ sodipodi:role="line"
710+ id="tspan983"
711+ x="23.18244"
712+ y="233.68523"
713+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;">module Text.Token</tspan></text>
714+ <rect
715+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
716+ id="rect987"
717+ width="39.011257"
718+ height="5.9464455"
719+ x="21.59494"
720+ y="229.18706"
721+ inkscape:export-xdpi="61.120499"
722+ inkscape:export-ydpi="61.120499" />
723+ <path
724+ sodipodi:nodetypes="cc"
725+ inkscape:export-ydpi="61.120499"
726+ inkscape:export-xdpi="61.120499"
727+ inkscape:connector-curvature="0"
728+ id="path993"
729+ d="M 62.998384,237.01083 62.846037,221.92147"
730+ style="fill:#ff0000;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker997)" />
731+ <path
732+ style="fill:#ff0000;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1003)"
733+ d="M 67.336659,246.29272 67.083422,221.71969"
734+ id="path999"
735+ inkscape:connector-curvature="0"
736+ inkscape:export-xdpi="61.120499"
737+ inkscape:export-ydpi="61.120499"
738+ sodipodi:nodetypes="cc" />
739+ <path
740+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1009)"
741+ d="M 73.937074,214.02206 94.72083,169.47102"
742+ id="path1005"
743+ inkscape:connector-curvature="0"
744+ inkscape:export-xdpi="61.120499"
745+ inkscape:export-ydpi="61.120499"
746+ sodipodi:nodetypes="cc" />
747+ <path
748+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1015)"
749+ d="M 108.0684,213.75748 108.0169,173.5408"
750+ id="path1011"
751+ inkscape:connector-curvature="0"
752+ inkscape:export-xdpi="61.120499"
753+ inkscape:export-ydpi="61.120499"
754+ sodipodi:nodetypes="cc" />
755+ <text
756+ inkscape:export-ydpi="61.120499"
757+ inkscape:export-xdpi="61.120499"
758+ id="text1019"
759+ y="218.94762"
760+ x="96.837494"
761+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
762+ xml:space="preserve"><tspan
763+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;"
764+ y="218.94762"
765+ x="96.837494"
766+ id="tspan1017"
767+ sodipodi:role="line">module Text.Parser</tspan></text>
768+ <path
769+ sodipodi:nodetypes="cc"
770+ inkscape:export-ydpi="61.120499"
771+ inkscape:export-xdpi="61.120499"
772+ inkscape:connector-curvature="0"
773+ id="path1023"
774+ d="m 113.62466,154.75539 0.0397,-25.06978"
775+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1027)" />
776+ <path
777+ sodipodi:nodetypes="cc"
778+ inkscape:export-ydpi="61.120499"
779+ inkscape:export-xdpi="61.120499"
780+ inkscape:connector-curvature="0"
781+ id="path1029"
782+ d="M 83.757032,147.15485 97.991855,129.77582"
783+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1033)" />
784+ <rect
785+ y="142.91107"
786+ x="118.15033"
787+ height="6.6968417"
788+ width="45.2328"
789+ id="rect1035"
790+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
791+ inkscape:export-xdpi="61.120499"
792+ inkscape:export-ydpi="61.120499" />
793+ <path
794+ sodipodi:nodetypes="cc"
795+ inkscape:export-ydpi="61.120499"
796+ inkscape:export-xdpi="61.120499"
797+ inkscape:connector-curvature="0"
798+ id="path1037"
799+ d="m 121.83513,142.5835 -0.0515,-12.72267"
800+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1057)" />
801+ <text
802+ xml:space="preserve"
803+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
804+ x="120.00241"
805+ y="147.67372"
806+ id="text1041"
807+ inkscape:export-xdpi="61.120499"
808+ inkscape:export-ydpi="61.120499"><tspan
809+ sodipodi:role="line"
810+ id="tspan1039"
811+ x="120.00241"
812+ y="147.67372"
813+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">module TTImp.TTImp</tspan></text>
814+ <rect
815+ inkscape:export-ydpi="61.120499"
816+ inkscape:export-xdpi="61.120499"
817+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
818+ id="rect1047"
819+ width="42.862495"
820+ height="6.8791728"
821+ x="125.28364"
822+ y="133.0603" />
823+ <path
824+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1045)"
825+ d="m 145.18016,132.82376 -9.18434,-4.09859"
826+ id="path1049"
827+ inkscape:connector-curvature="0"
828+ inkscape:export-xdpi="61.120499"
829+ inkscape:export-ydpi="61.120499"
830+ sodipodi:nodetypes="cc" />
831+ <text
832+ inkscape:export-ydpi="61.120499"
833+ inkscape:export-xdpi="61.120499"
834+ id="text1053"
835+ y="137.82295"
836+ x="127.13572"
837+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
838+ xml:space="preserve"><tspan
839+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332"
840+ y="137.82295"
841+ x="127.13572"
842+ id="tspan1051"
843+ sodipodi:role="line">module Idris.Syntax</tspan></text>
844+ <rect
845+ inkscape:export-ydpi="61.120499"
846+ inkscape:export-xdpi="61.120499"
847+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#00871c;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
848+ id="rect1061"
849+ width="59.266659"
850+ height="16.13958"
851+ x="97.102074"
852+ y="186.93335" />
853+ <path
854+ inkscape:export-ydpi="61.120499"
855+ inkscape:export-xdpi="61.120499"
856+ inkscape:connector-curvature="0"
857+ id="path1063"
858+ d="m 76.993749,160.21044 18.785417,28.83958"
859+ style="fill:none;stroke:#00aa3f;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1105)"
860+ sodipodi:nodetypes="cc" />
861+ <text
862+ inkscape:export-ydpi="61.120499"
863+ inkscape:export-xdpi="61.120499"
864+ id="text1081"
865+ y="192.48962"
866+ x="157.95586"
867+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
868+ xml:space="preserve"><tspan
869+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332"
870+ y="192.48962"
871+ x="157.95586"
872+ id="tspan1079"
873+ sodipodi:role="line">SExp</tspan></text>
874+ <text
875+ inkscape:export-ydpi="61.120499"
876+ inkscape:export-xdpi="61.120499"
877+ id="text1089"
878+ y="192.75421"
879+ x="98.954155"
880+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
881+ xml:space="preserve"><tspan
882+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332"
883+ y="192.75421"
884+ x="98.954155"
885+ id="tspan1087"
886+ sodipodi:role="line">module Idris.IDEMode.Parser</tspan></text>
887+ <rect
888+ inkscape:export-ydpi="61.120499"
889+ inkscape:export-xdpi="61.120499"
890+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#7c007d;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
891+ id="rect1097"
892+ width="55.033333"
893+ height="14.287498"
894+ x="20.637447"
895+ y="52.524986" />
896+ <text
897+ inkscape:export-ydpi="61.120499"
898+ inkscape:export-xdpi="61.120499"
899+ id="text1101"
900+ y="58.610428"
901+ x="23.54781"
902+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800080;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
903+ xml:space="preserve"><tspan
904+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800080;stroke-width:0.26458332;"
905+ y="58.610428"
906+ x="23.54781"
907+ id="tspan1099"
908+ sodipodi:role="line">module Idris.REPL</tspan></text>
909+ <path
910+ sodipodi:nodetypes="cc"
911+ style="fill:none;stroke:#00aa3f;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1111)"
912+ d="m 112.97708,174.23335 0,14.02292"
913+ id="path1107"
914+ inkscape:connector-curvature="0"
915+ inkscape:export-xdpi="61.120499"
916+ inkscape:export-ydpi="61.120499" />
917+ <path
918+ inkscape:export-ydpi="61.120499"
919+ inkscape:export-xdpi="61.120499"
920+ inkscape:connector-curvature="0"
921+ id="path1113"
922+ d="m 148.43125,150.15592 0.26458,35.71911"
923+ style="fill:none;stroke:#00aa3f;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1117)"
924+ sodipodi:nodetypes="cc" />
925+ <path
926+ inkscape:export-ydpi="61.120499"
927+ inkscape:export-xdpi="61.120499"
928+ inkscape:connector-curvature="0"
929+ id="path1119"
930+ d="m 156.56889,195.56696 13.16435,-0.41532"
931+ style="fill:none;stroke:#00aa3f;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1123)"
932+ sodipodi:nodetypes="cc" />
933+ <text
934+ id="text950"
935+ y="104.70191"
936+ x="22.426785"
937+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
938+ xml:space="preserve"
939+ inkscape:export-xdpi="61.120499"
940+ inkscape:export-ydpi="61.120499"><tspan
941+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332"
942+ y="104.70191"
943+ x="22.426785"
944+ id="tspan948"
945+ sodipodi:role="line">module Core.Core</tspan></text>
946+ <rect
947+ inkscape:export-ydpi="61.120499"
948+ inkscape:export-xdpi="61.120499"
949+ y="100.20374"
950+ x="20.839275"
951+ height="9.7895899"
952+ width="47.889587"
953+ id="rect952"
954+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
955+ <text
956+ inkscape:export-ydpi="61.120499"
957+ inkscape:export-xdpi="61.120499"
958+ xml:space="preserve"
959+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
960+ x="22.955944"
961+ y="108.40608"
962+ id="text956"><tspan
963+ sodipodi:role="line"
964+ id="tspan954"
965+ x="22.955944"
966+ y="108.40608"
967+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332">error messages</tspan></text>
968+ <text
969+ inkscape:export-ydpi="61.120499"
970+ inkscape:export-xdpi="61.120499"
971+ xml:space="preserve"
972+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
973+ x="79.312202"
974+ y="92.266502"
975+ id="text960"><tspan
976+ sodipodi:role="line"
977+ id="tspan958"
978+ x="79.312202"
979+ y="92.266502"
980+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">module Core.CompileExpr</tspan></text>
981+ <rect
982+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
983+ id="rect962"
984+ width="61.912495"
985+ height="18.785419"
986+ x="77.724693"
987+ y="87.768333"
988+ inkscape:export-xdpi="61.120499"
989+ inkscape:export-ydpi="61.120499" />
990+ <text
991+ id="text966"
992+ y="95.970665"
993+ x="79.841362"
994+ style="font-style:normal;font-weight:normal;font-size:3.52777767px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
995+ xml:space="preserve"
996+ inkscape:export-xdpi="61.120499"
997+ inkscape:export-ydpi="61.120499"><tspan
998+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
999+ y="95.970665"
1000+ x="79.841362"
1001+ sodipodi:role="line"
1002+ id="tspan968">Representation of expressions ready</tspan><tspan
1003+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
1004+ y="100.38039"
1005+ x="79.841362"
1006+ sodipodi:role="line"
1007+ id="tspan974">for compiling: CExp</tspan><tspan
1008+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
1009+ y="104.79011"
1010+ x="79.841362"
1011+ sodipodi:role="line"
1012+ id="tspan972">Type erased, explicit case trees</tspan></text>
1013+ <text
1014+ inkscape:export-ydpi="61.120499"
1015+ inkscape:export-xdpi="61.120499"
1016+ xml:space="preserve"
1017+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
1018+ x="22.162193"
1019+ y="73.217979"
1020+ id="text978"><tspan
1021+ sodipodi:role="line"
1022+ id="tspan976"
1023+ x="22.162193"
1024+ y="73.217979"
1025+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">module Idris.CommandLine</tspan></text>
1026+ <rect
1027+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1028+ id="rect980"
1029+ width="55.827087"
1030+ height="10.054173"
1031+ x="20.574694"
1032+ y="68.719742"
1033+ inkscape:export-xdpi="61.120499"
1034+ inkscape:export-ydpi="61.120499" />
1035+ <text
1036+ id="text984"
1037+ y="76.92215"
1038+ x="22.69136"
1039+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
1040+ xml:space="preserve"
1041+ inkscape:export-xdpi="61.120499"
1042+ inkscape:export-ydpi="61.120499"><tspan
1043+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
1044+ y="76.92215"
1045+ x="22.69136"
1046+ id="tspan982"
1047+ sodipodi:role="line">command line options</tspan></text>
1048+ <text
1049+ id="text988"
1050+ y="89.886726"
1051+ x="22.162193"
1052+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
1053+ xml:space="preserve"
1054+ inkscape:export-xdpi="61.120499"
1055+ inkscape:export-ydpi="61.120499"><tspan
1056+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332"
1057+ y="89.886726"
1058+ x="22.162193"
1059+ id="tspan986"
1060+ sodipodi:role="line">module Idris.Error</tspan></text>
1061+ <rect
1062+ inkscape:export-ydpi="61.120499"
1063+ inkscape:export-xdpi="61.120499"
1064+ y="85.388489"
1065+ x="20.574694"
1066+ height="9.5250101"
1067+ width="37.835419"
1068+ id="rect990"
1069+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
1070+ <text
1071+ inkscape:export-ydpi="61.120499"
1072+ inkscape:export-xdpi="61.120499"
1073+ xml:space="preserve"
1074+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
1075+ x="22.69136"
1076+ y="93.590897"
1077+ id="text994"><tspan
1078+ sodipodi:role="line"
1079+ id="tspan992"
1080+ x="22.69136"
1081+ y="93.590897"
1082+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332">perror</tspan></text>
1083+ <path
1084+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1000)"
1085+ d="m 66.876776,99.410007 c -0.17822,-10.50534 -0.880145,-7.9985 -7.143748,-8.99444"
1086+ id="path996"
1087+ inkscape:connector-curvature="0"
1088+ inkscape:export-xdpi="61.120499"
1089+ inkscape:export-ydpi="61.120499"
1090+ sodipodi:nodetypes="cc" />
1091+ <path
1092+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
1093+ d="M 15.081249,210.48125 H 200.02499"
1094+ id="path1201"
1095+ inkscape:connector-curvature="0"
1096+ sodipodi:nodetypes="cc"
1097+ inkscape:export-xdpi="61.120499"
1098+ inkscape:export-ydpi="61.120499" />
1099+ <path
1100+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
1101+ d="m 154.78125,214.97917 -0.26459,40.21666"
1102+ id="path1203"
1103+ inkscape:connector-curvature="0"
1104+ inkscape:export-xdpi="61.120499"
1105+ inkscape:export-ydpi="61.120499" />
1106+ <text
1107+ xml:space="preserve"
1108+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.40000001;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
1109+ x="158.75"
1110+ y="226.09137"
1111+ id="text1473"
1112+ inkscape:export-xdpi="61.120499"
1113+ inkscape:export-ydpi="61.120499"><tspan
1114+ sodipodi:role="line"
1115+ id="tspan1471"
1116+ x="158.75"
1117+ y="226.09137"
1118+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;">'text' modules are</tspan><tspan
1119+ sodipodi:role="line"
1120+ x="158.75"
1121+ y="230.92491"
1122+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;"
1123+ id="tspan1475">also in Idris 1</tspan><tspan
1124+ sodipodi:role="line"
1125+ x="158.75"
1126+ y="235.75845"
1127+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332;"
1128+ id="tspan1477">library.</tspan></text>
1129+ <path
1130+ inkscape:connector-curvature="0"
1131+ id="path957"
1132+ d="m 172.77292,166.03125 -0.26459,40.21666"
1133+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker969);marker-end:url(#marker973)"
1134+ inkscape:export-xdpi="61.120499"
1135+ inkscape:export-ydpi="61.120499" />
1136+ <text
1137+ inkscape:export-ydpi="61.120499"
1138+ inkscape:export-xdpi="61.120499"
1139+ id="text965"
1140+ y="177.14345"
1141+ x="176.74167"
1142+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.40000001;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
1143+ xml:space="preserve"><tspan
1144+ id="tspan963"
1145+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332;"
1146+ y="177.14345"
1147+ x="176.74167"
1148+ sodipodi:role="line">'IDEMode is for</tspan><tspan
1149+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332;"
1150+ y="181.97699"
1151+ x="176.74167"
1152+ sodipodi:role="line"
1153+ id="tspan981">communicating</tspan><tspan
1154+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332;"
1155+ y="186.81053"
1156+ x="176.74167"
1157+ sodipodi:role="line"
1158+ id="tspan984">with external</tspan><tspan
1159+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332;"
1160+ y="191.64406"
1161+ x="176.74167"
1162+ sodipodi:role="line"
1163+ id="tspan987">editors. It uses</tspan><tspan
1164+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332;"
1165+ y="196.4776"
1166+ x="176.74167"
1167+ sodipodi:role="line"
1168+ id="tspan989">SExp structure</tspan><tspan
1169+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332;"
1170+ y="201.31114"
1171+ x="176.74167"
1172+ sodipodi:role="line"
1173+ id="tspan991">which is Lisp-</tspan><tspan
1174+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#008000;stroke-width:0.26458332;"
1175+ y="206.14468"
1176+ x="176.74167"
1177+ sodipodi:role="line"
1178+ id="tspan993">like.</tspan></text>
1179+ <path
1180+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker1017);marker-end:url(#marker1021)"
1181+ d="m 172.77292,110.20417 -0.26459,40.21666"
1182+ id="path997"
1183+ inkscape:connector-curvature="0"
1184+ inkscape:export-xdpi="61.120499"
1185+ inkscape:export-ydpi="61.120499" />
1186+ <text
1187+ xml:space="preserve"
1188+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.40000001;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
1189+ x="176.21251"
1190+ y="115.76012"
1191+ id="text1013"
1192+ inkscape:export-xdpi="61.120499"
1193+ inkscape:export-ydpi="61.120499"><tspan
1194+ id="tspan1011"
1195+ sodipodi:role="line"
1196+ x="176.21251"
1197+ y="115.76012"
1198+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332">Idris.Parser</tspan><tspan
1199+ sodipodi:role="line"
1200+ x="176.21251"
1201+ y="120.59366"
1202+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
1203+ id="tspan1050">reads from a</tspan><tspan
1204+ sodipodi:role="line"
1205+ x="176.21251"
1206+ y="125.42719"
1207+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
1208+ id="tspan1052">file and outputs</tspan><tspan
1209+ sodipodi:role="line"
1210+ x="176.21251"
1211+ y="130.26073"
1212+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
1213+ id="tspan1054">to a PTerm</tspan><tspan
1214+ sodipodi:role="line"
1215+ x="176.21251"
1216+ y="135.09427"
1217+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;stroke-width:0.26458332"
1218+ id="tspan1056">structure.</tspan></text>
1219+ <path
1220+ inkscape:connector-curvature="0"
1221+ id="path1058"
1222+ d="m 171.97917,51.731253 -0.26459,19.57916"
1223+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker1074);marker-end:url(#marker1078)"
1224+ sodipodi:nodetypes="cc"
1225+ inkscape:export-xdpi="61.120499"
1226+ inkscape:export-ydpi="61.120499" />
1227+ <text
1228+ inkscape:export-ydpi="61.120499"
1229+ inkscape:export-xdpi="61.120499"
1230+ id="text1070"
1231+ y="57.287201"
1232+ x="175.41876"
1233+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.40000001;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#800080;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
1234+ xml:space="preserve"><tspan
1235+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800080;stroke-width:0.26458332;"
1236+ y="57.287201"
1237+ x="175.41876"
1238+ sodipodi:role="line"
1239+ id="tspan1060">Idris.Parser</tspan><tspan
1240+ id="tspan1068"
1241+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800080;stroke-width:0.26458332;"
1242+ y="62.120739"
1243+ x="175.41876"
1244+ sodipodi:role="line">reads from the</tspan><tspan
1245+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:0.40000001;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#800080;stroke-width:0.26458332;"
1246+ y="66.954277"
1247+ x="175.41876"
1248+ sodipodi:role="line"
1249+ id="tspan1089">command line.</tspan></text>
1250+ </g>
1251+</svg>
docs/image/parserTopLevel.pngnew file

Binary file not shown.

docs/image/parserTopLevel.svgnew file+294
@@ -0,0 +1,294 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 210 297"
15+ version="1.1"
16+ id="svg8"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="topLevel.svg">
19+ <defs
20+ id="defs2">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker3617"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow1Mend">
29+ <path
30+ transform="scale(0.4) rotate(180) translate(10,0)"
31+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
32+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
33+ id="path3615" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow1Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="marker2891"
41+ style="overflow:visible;"
42+ inkscape:isstock="true"
43+ inkscape:collect="always">
44+ <path
45+ id="path2889"
46+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
47+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
48+ transform="scale(0.4) rotate(180) translate(10,0)" />
49+ </marker>
50+ <marker
51+ inkscape:stockid="Arrow1Mend"
52+ orient="auto"
53+ refY="0.0"
54+ refX="0.0"
55+ id="marker2049"
56+ style="overflow:visible;"
57+ inkscape:isstock="true">
58+ <path
59+ id="path2047"
60+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
61+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
62+ transform="scale(0.4) rotate(180) translate(10,0)" />
63+ </marker>
64+ <marker
65+ inkscape:isstock="true"
66+ style="overflow:visible;"
67+ id="marker1539"
68+ refX="0.0"
69+ refY="0.0"
70+ orient="auto"
71+ inkscape:stockid="Arrow1Mend"
72+ inkscape:collect="always">
73+ <path
74+ transform="scale(0.4) rotate(180) translate(10,0)"
75+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
76+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
77+ id="path1537" />
78+ </marker>
79+ <marker
80+ inkscape:stockid="Arrow1Mend"
81+ orient="auto"
82+ refY="0.0"
83+ refX="0.0"
84+ id="Arrow1Mend"
85+ style="overflow:visible;"
86+ inkscape:isstock="true"
87+ inkscape:collect="always">
88+ <path
89+ id="path830"
90+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
91+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
92+ transform="scale(0.4) rotate(180) translate(10,0)" />
93+ </marker>
94+ </defs>
95+ <sodipodi:namedview
96+ id="base"
97+ pagecolor="#ffffff"
98+ bordercolor="#666666"
99+ borderopacity="1.0"
100+ inkscape:pageopacity="0.0"
101+ inkscape:pageshadow="2"
102+ inkscape:zoom="1"
103+ inkscape:cx="396.85039"
104+ inkscape:cy="560"
105+ inkscape:document-units="mm"
106+ inkscape:current-layer="layer1"
107+ showgrid="false"
108+ inkscape:window-width="1920"
109+ inkscape:window-height="1015"
110+ inkscape:window-x="0"
111+ inkscape:window-y="0"
112+ inkscape:window-maximized="1" />
113+ <metadata
114+ id="metadata5">
115+ <rdf:RDF>
116+ <cc:Work
117+ rdf:about="">
118+ <dc:format>image/svg+xml</dc:format>
119+ <dc:type
120+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
121+ <dc:title />
122+ </cc:Work>
123+ </rdf:RDF>
124+ </metadata>
125+ <g
126+ inkscape:label="Layer 1"
127+ inkscape:groupmode="layer"
128+ id="layer1">
129+ <rect
130+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
131+ id="rect815"
132+ width="35.983334"
133+ height="18.25625"
134+ x="37.306248"
135+ y="79.512497"
136+ inkscape:export-xdpi="61.120499"
137+ inkscape:export-ydpi="61.120499" />
138+ <rect
139+ y="79.512497"
140+ x="92.339577"
141+ height="18.25625"
142+ width="35.983334"
143+ id="rect817"
144+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
145+ inkscape:export-xdpi="61.120499"
146+ inkscape:export-ydpi="61.120499" />
147+ <path
148+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
149+ d="m 73.554166,88.508337 16.66875,-0.26459"
150+ id="path819"
151+ inkscape:connector-curvature="0"
152+ inkscape:export-xdpi="61.120499"
153+ inkscape:export-ydpi="61.120499" />
154+ <path
155+ inkscape:connector-curvature="0"
156+ id="path1535"
157+ d="m 18.785416,88.77292 16.66875,-0.26459"
158+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1539)"
159+ inkscape:export-xdpi="61.120499"
160+ inkscape:export-ydpi="61.120499" />
161+ <path
162+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2049)"
163+ d="m 128.32291,88.243753 16.66875,-0.26459"
164+ id="path2045"
165+ inkscape:connector-curvature="0"
166+ inkscape:export-xdpi="61.120499"
167+ inkscape:export-ydpi="61.120499" />
168+ <text
169+ xml:space="preserve"
170+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
171+ x="20.372915"
172+ y="85.597931"
173+ id="text2857"
174+ inkscape:export-xdpi="61.120499"
175+ inkscape:export-ydpi="61.120499"><tspan
176+ sodipodi:role="line"
177+ id="tspan2855"
178+ x="20.372915"
179+ y="85.597931"
180+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332">String</tspan></text>
181+ <text
182+ id="text2861"
183+ y="80.835434"
184+ x="76.199997"
185+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
186+ xml:space="preserve"
187+ inkscape:export-xdpi="61.120499"
188+ inkscape:export-ydpi="61.120499"><tspan
189+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
190+ y="80.835434"
191+ x="76.199997"
192+ sodipodi:role="line"
193+ id="tspan2867">List</tspan><tspan
194+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
195+ y="86.127098"
196+ x="76.199997"
197+ sodipodi:role="line"
198+ id="tspan2871">Token</tspan></text>
199+ <text
200+ xml:space="preserve"
201+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
202+ x="130.96875"
203+ y="85.068764"
204+ id="text2865"
205+ inkscape:export-xdpi="61.120499"
206+ inkscape:export-ydpi="61.120499"><tspan
207+ sodipodi:role="line"
208+ id="tspan2863"
209+ x="130.96875"
210+ y="85.068764"
211+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332">PTerm</tspan></text>
212+ <text
213+ id="text2875"
214+ y="89.302101"
215+ x="47.360416"
216+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
217+ xml:space="preserve"
218+ inkscape:export-xdpi="61.120499"
219+ inkscape:export-ydpi="61.120499"><tspan
220+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332;fill:#0000ff;"
221+ y="89.302101"
222+ x="47.360416"
223+ id="tspan2873"
224+ sodipodi:role="line">Lexer</tspan></text>
225+ <text
226+ xml:space="preserve"
227+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
228+ x="100.27708"
229+ y="89.037521"
230+ id="text2879"
231+ inkscape:export-xdpi="61.120499"
232+ inkscape:export-ydpi="61.120499"><tspan
233+ sodipodi:role="line"
234+ id="tspan2877"
235+ x="100.27708"
236+ y="89.037521"
237+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">Parser</tspan></text>
238+ <path
239+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2891)"
240+ d="m 52.916666,71.575003 v 7.67291"
241+ id="path2887"
242+ inkscape:connector-curvature="0"
243+ sodipodi:nodetypes="cc"
244+ inkscape:export-xdpi="61.120499"
245+ inkscape:export-ydpi="61.120499" />
246+ <path
247+ sodipodi:nodetypes="cc"
248+ inkscape:connector-curvature="0"
249+ id="path3613"
250+ d="m 108.74375,71.575003 v 7.67291"
251+ style="fill:none;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker3617)"
252+ inkscape:export-xdpi="61.120499"
253+ inkscape:export-ydpi="61.120499" />
254+ <text
255+ id="text4173"
256+ y="69.987518"
257+ x="43.391666"
258+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
259+ xml:space="preserve"
260+ inkscape:export-xdpi="61.120499"
261+ inkscape:export-ydpi="61.120499"><tspan
262+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
263+ y="69.987518"
264+ x="43.391666"
265+ id="tspan4171"
266+ sodipodi:role="line">Recogniser</tspan></text>
267+ <text
268+ xml:space="preserve"
269+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
270+ x="97.102081"
271+ y="69.722939"
272+ id="text4177"
273+ inkscape:export-xdpi="61.120499"
274+ inkscape:export-ydpi="61.120499"><tspan
275+ sodipodi:role="line"
276+ id="tspan4175"
277+ x="97.102081"
278+ y="69.722939"
279+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332">Grammar</tspan></text>
280+ <text
281+ inkscape:export-ydpi="61.120499"
282+ inkscape:export-xdpi="61.120499"
283+ id="text854"
284+ y="93.800011"
285+ x="131.23334"
286+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
287+ xml:space="preserve"><tspan
288+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
289+ y="103.5316"
290+ x="131.23334"
291+ id="tspan852"
292+ sodipodi:role="line" /></text>
293+ </g>
294+</svg>
docs/image/plusReducesProof.pngnew file

Binary file not shown.

docs/image/plusReducesProof.svgnew file+339
@@ -0,0 +1,339 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="plusReducesProof.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:stockid="Arrow1Mend"
23+ orient="auto"
24+ refY="0.0"
25+ refX="0.0"
26+ id="marker6540"
27+ style="overflow:visible;"
28+ inkscape:isstock="true">
29+ <path
30+ id="path6542"
31+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
32+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
33+ transform="scale(0.4) rotate(180) translate(10,0)" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow1Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="marker5748"
41+ style="overflow:visible;"
42+ inkscape:isstock="true">
43+ <path
44+ id="path5750"
45+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
46+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
47+ transform="scale(0.4) rotate(180) translate(10,0)" />
48+ </marker>
49+ <marker
50+ inkscape:isstock="true"
51+ style="overflow:visible;"
52+ id="marker5154"
53+ refX="0.0"
54+ refY="0.0"
55+ orient="auto"
56+ inkscape:stockid="Arrow1Mend"
57+ inkscape:collect="always">
58+ <path
59+ transform="scale(0.4) rotate(180) translate(10,0)"
60+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
61+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
62+ id="path5156" />
63+ </marker>
64+ <marker
65+ inkscape:stockid="Arrow1Mend"
66+ orient="auto"
67+ refY="0.0"
68+ refX="0.0"
69+ id="Arrow1Mend"
70+ style="overflow:visible;"
71+ inkscape:isstock="true"
72+ inkscape:collect="always">
73+ <path
74+ id="path4189"
75+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
76+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
77+ transform="scale(0.4) rotate(180) translate(10,0)" />
78+ </marker>
79+ </defs>
80+ <sodipodi:namedview
81+ id="base"
82+ pagecolor="#ffffff"
83+ bordercolor="#666666"
84+ borderopacity="1.0"
85+ inkscape:pageopacity="0.0"
86+ inkscape:pageshadow="2"
87+ inkscape:zoom="1"
88+ inkscape:cx="397.18872"
89+ inkscape:cy="520"
90+ inkscape:document-units="px"
91+ inkscape:current-layer="layer1"
92+ showgrid="false"
93+ inkscape:window-width="1110"
94+ inkscape:window-height="1011"
95+ inkscape:window-x="-4"
96+ inkscape:window-y="0"
97+ inkscape:window-maximized="0" />
98+ <metadata
99+ id="metadata7">
100+ <rdf:RDF>
101+ <cc:Work
102+ rdf:about="">
103+ <dc:format>image/svg+xml</dc:format>
104+ <dc:type
105+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
106+ <dc:title></dc:title>
107+ </cc:Work>
108+ </rdf:RDF>
109+ </metadata>
110+ <g
111+ inkscape:label="Layer 1"
112+ inkscape:groupmode="layer"
113+ id="layer1">
114+ <text
115+ xml:space="preserve"
116+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
117+ x="266"
118+ y="225.36221"
119+ id="text4136"
120+ sodipodi:linespacing="125%"><tspan
121+ sodipodi:role="line"
122+ id="tspan4138"
123+ x="266"
124+ y="225.36221">assumptions</tspan><tspan
125+ sodipodi:role="line"
126+ x="266"
127+ y="250.36221"
128+ id="tspan4140">(context)</tspan></text>
129+ <text
130+ sodipodi:linespacing="125%"
131+ id="text4142"
132+ y="238.36221"
133+ x="526"
134+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
135+ xml:space="preserve"><tspan
136+ id="tspan4146"
137+ y="238.36221"
138+ x="526"
139+ sodipodi:role="line">goal</tspan></text>
140+ <text
141+ xml:space="preserve"
142+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
143+ x="420"
144+ y="289.36221"
145+ id="text4150"
146+ sodipodi:linespacing="125%"><tspan
147+ sodipodi:role="line"
148+ x="420"
149+ y="289.36221"
150+ id="tspan4152">(k : Nat) -&gt; (k = plus k 0) -&gt; S k = S (plus k 0)</tspan></text>
151+ <path
152+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
153+ d="m 241,262.3622 428,-1"
154+ id="path4154"
155+ inkscape:connector-curvature="0" />
156+ <path
157+ inkscape:connector-curvature="0"
158+ id="path4160"
159+ d="m 241,308.3622 428,-1"
160+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
161+ <text
162+ sodipodi:linespacing="125%"
163+ id="text4162"
164+ y="312.36221"
165+ x="175"
166+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
167+ xml:space="preserve"><tspan
168+ id="tspan4164"
169+ y="312.36221"
170+ x="175"
171+ sodipodi:role="line">intro `{{k}}</tspan></text>
172+ <text
173+ sodipodi:linespacing="125%"
174+ id="text4166"
175+ y="333.36221"
176+ x="482"
177+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
178+ xml:space="preserve"><tspan
179+ id="tspan4168"
180+ y="333.36221"
181+ x="482"
182+ sodipodi:role="line">(k = plus k 0) -&gt; S k = S (plus k 0)</tspan></text>
183+ <text
184+ xml:space="preserve"
185+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
186+ x="324"
187+ y="334.36221"
188+ id="text4170"
189+ sodipodi:linespacing="125%"><tspan
190+ sodipodi:role="line"
191+ x="324"
192+ y="334.36221"
193+ id="tspan4172">k : Nat</tspan></text>
194+ <path
195+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
196+ d="m 441,294.3622 -73,30"
197+ id="path4174"
198+ inkscape:connector-curvature="0"
199+ sodipodi:nodetypes="cc" />
200+ <path
201+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
202+ d="m 241,352.3622 428,-1"
203+ id="path5134"
204+ inkscape:connector-curvature="0" />
205+ <text
206+ xml:space="preserve"
207+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
208+ x="171"
209+ y="355.36221"
210+ id="text5136"
211+ sodipodi:linespacing="125%"><tspan
212+ sodipodi:role="line"
213+ x="171"
214+ y="355.36221"
215+ id="tspan5138">intro `{{ih}}</tspan></text>
216+ <text
217+ xml:space="preserve"
218+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
219+ x="570"
220+ y="372.36221"
221+ id="text5140"
222+ sodipodi:linespacing="125%"><tspan
223+ sodipodi:role="line"
224+ x="570"
225+ y="372.36221"
226+ id="tspan5142">S k = S (plus k 0)</tspan></text>
227+ <text
228+ sodipodi:linespacing="125%"
229+ id="text5144"
230+ y="378.36221"
231+ x="324"
232+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
233+ xml:space="preserve"><tspan
234+ id="tspan5146"
235+ y="378.36221"
236+ x="324"
237+ sodipodi:role="line">k : Nat</tspan></text>
238+ <text
239+ sodipodi:linespacing="125%"
240+ id="text5150"
241+ y="393.36221"
242+ x="323"
243+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
244+ xml:space="preserve"><tspan
245+ id="tspan5152"
246+ y="393.36221"
247+ x="323"
248+ sodipodi:role="line">ih : k = plus k 0</tspan></text>
249+ <path
250+ inkscape:connector-curvature="0"
251+ id="path5728"
252+ d="m 242,404.3622 428,-1"
253+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
254+ <text
255+ sodipodi:linespacing="125%"
256+ id="text5730"
257+ y="408.36221"
258+ x="109"
259+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
260+ xml:space="preserve"><tspan
261+ id="tspan5732"
262+ y="408.36221"
263+ x="109"
264+ sodipodi:role="line">rewriteWith (Var `{{ih}})</tspan></text>
265+ <text
266+ sodipodi:linespacing="125%"
267+ id="text5734"
268+ y="424.36221"
269+ x="587"
270+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
271+ xml:space="preserve"><tspan
272+ id="tspan5736"
273+ y="424.36221"
274+ x="587"
275+ sodipodi:role="line">S k = S k </tspan></text>
276+ <text
277+ xml:space="preserve"
278+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
279+ x="325"
280+ y="430.36221"
281+ id="text5738"
282+ sodipodi:linespacing="125%"><tspan
283+ sodipodi:role="line"
284+ x="325"
285+ y="430.36221"
286+ id="tspan5740">k : Nat</tspan></text>
287+ <path
288+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5748)"
289+ d="m 610,379.3622 1,29"
290+ id="path5742"
291+ inkscape:connector-curvature="0"
292+ sodipodi:nodetypes="cc" />
293+ <text
294+ xml:space="preserve"
295+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
296+ x="324"
297+ y="445.36221"
298+ id="text5744"
299+ sodipodi:linespacing="125%"><tspan
300+ sodipodi:role="line"
301+ x="324"
302+ y="445.36221"
303+ id="tspan5746">ih : k = plus k 0</tspan></text>
304+ <path
305+ inkscape:connector-curvature="0"
306+ id="path7294"
307+ d="m 418,460.3622 -2,-199"
308+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
309+ sodipodi:nodetypes="cc" />
310+ <path
311+ sodipodi:nodetypes="cc"
312+ inkscape:connector-curvature="0"
313+ id="path5148"
314+ d="m 519,339.3622 -107,44"
315+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5154)" />
316+ <path
317+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:12, 2;stroke-dashoffset:0;stroke-opacity:1"
318+ d="m 609,391.3622 -197,49"
319+ id="path6538"
320+ inkscape:connector-curvature="0"
321+ sodipodi:nodetypes="cc" />
322+ <path
323+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
324+ d="m 242,458.3622 428,-1"
325+ id="path7308"
326+ inkscape:connector-curvature="0" />
327+ <text
328+ xml:space="preserve"
329+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
330+ x="177"
331+ y="462.36221"
332+ id="text7310"
333+ sodipodi:linespacing="125%"><tspan
334+ sodipodi:role="line"
335+ x="177"
336+ y="462.36221"
337+ id="tspan7312">reflexivity</tspan></text>
338+ </g>
339+</svg>
docs/image/recogniser.pngnew file

Binary file not shown.

docs/image/recogniser.svgnew file+477
@@ -0,0 +1,477 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 210 297"
15+ version="1.1"
16+ id="svg8"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="recogniser.svg">
19+ <defs
20+ id="defs2" />
21+ <sodipodi:namedview
22+ id="base"
23+ pagecolor="#ffffff"
24+ bordercolor="#666666"
25+ borderopacity="1.0"
26+ inkscape:pageopacity="0.0"
27+ inkscape:pageshadow="2"
28+ inkscape:zoom="1"
29+ inkscape:cx="384.45994"
30+ inkscape:cy="560"
31+ inkscape:document-units="mm"
32+ inkscape:current-layer="layer1"
33+ showgrid="false"
34+ inkscape:window-width="1920"
35+ inkscape:window-height="1015"
36+ inkscape:window-x="0"
37+ inkscape:window-y="0"
38+ inkscape:window-maximized="1" />
39+ <metadata
40+ id="metadata5">
41+ <rdf:RDF>
42+ <cc:Work
43+ rdf:about="">
44+ <dc:format>image/svg+xml</dc:format>
45+ <dc:type
46+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
47+ <dc:title />
48+ </cc:Work>
49+ </rdf:RDF>
50+ </metadata>
51+ <g
52+ inkscape:label="Layer 1"
53+ inkscape:groupmode="layer"
54+ id="layer1">
55+ <rect
56+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70599997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
57+ id="rect815"
58+ width="112.44793"
59+ height="77.258354"
60+ x="6.3499999"
61+ y="63.108334"
62+ ry="3.96875"
63+ inkscape:export-xdpi="61.120499"
64+ inkscape:export-ydpi="61.120499" />
65+ <text
66+ xml:space="preserve"
67+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444447px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
68+ x="11.112496"
69+ y="68.399994"
70+ id="text819"
71+ inkscape:export-xdpi="61.120499"
72+ inkscape:export-ydpi="61.120499"><tspan
73+ sodipodi:role="line"
74+ id="tspan817"
75+ x="11.112496"
76+ y="68.399994"
77+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444447px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">Text.Lexer.Core</tspan></text>
78+ <text
79+ id="text823"
80+ y="74.749992"
81+ x="8.7312441"
82+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
83+ xml:space="preserve"
84+ inkscape:export-xdpi="61.120499"
85+ inkscape:export-ydpi="61.120499"><tspan
86+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
87+ y="74.749992"
88+ x="8.7312441"
89+ id="tspan821"
90+ sodipodi:role="line">data Recognise : (consumes : Bool) -&gt; Type where</tspan><tspan
91+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
92+ y="80.041656"
93+ x="8.7312441"
94+ sodipodi:role="line"
95+ id="tspan825"> Empty : Recognise False</tspan><tspan
96+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
97+ y="85.333328"
98+ x="8.7312441"
99+ sodipodi:role="line"
100+ id="tspan827"> Fail : Recognise c</tspan><tspan
101+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
102+ y="90.624992"
103+ x="8.7312441"
104+ sodipodi:role="line"
105+ id="tspan829"> Lookahead : (positive : Bool) -&gt; Recognise c -&gt; Recognise False</tspan><tspan
106+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
107+ y="95.916656"
108+ x="8.7312441"
109+ sodipodi:role="line"
110+ id="tspan831"> Pred : (Char -&gt; Bool) -&gt; Recognise True</tspan><tspan
111+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
112+ y="101.20832"
113+ x="8.7312441"
114+ sodipodi:role="line"
115+ id="tspan835"> SeqEat : Recognise True -&gt; Inf (Recognise e) -&gt; Recognise True</tspan><tspan
116+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
117+ y="106.49999"
118+ x="8.7312441"
119+ sodipodi:role="line"
120+ id="tspan837"> SeqEmpty : Recognise e1 -&gt; Recognise e2 -&gt; Recognise (e1 || e2)</tspan><tspan
121+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
122+ y="111.79166"
123+ x="8.7312441"
124+ sodipodi:role="line"
125+ id="tspan839"> Alt : Recognise e1 -&gt; Recognise e2 -&gt; Recognise (e1 &amp;&amp; e2)</tspan><tspan
126+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
127+ y="117.08332"
128+ x="8.7312441"
129+ sodipodi:role="line"
130+ id="tspan841" /><tspan
131+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
132+ y="122.37499"
133+ x="8.7312441"
134+ sodipodi:role="line"
135+ id="tspan843">||| A token recogniser. Guaranteed to consume at least one character.</tspan><tspan
136+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
137+ y="127.66666"
138+ x="8.7312441"
139+ sodipodi:role="line"
140+ id="tspan845">public export</tspan><tspan
141+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
142+ y="132.95833"
143+ x="8.7312441"
144+ sodipodi:role="line"
145+ id="tspan847">Lexer : Type</tspan><tspan
146+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
147+ y="138.24998"
148+ x="8.7312441"
149+ sodipodi:role="line"
150+ id="tspan849">Lexer = Recognise True</tspan><tspan
151+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
152+ y="143.54166"
153+ x="8.7312441"
154+ sodipodi:role="line"
155+ id="tspan851" /></text>
156+ <rect
157+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
158+ id="rect850"
159+ width="111.65417"
160+ height="10.318749"
161+ x="9.7895756"
162+ y="97.504166"
163+ inkscape:export-xdpi="61.120499"
164+ inkscape:export-ydpi="61.120499" />
165+ <rect
166+ y="97.504166"
167+ x="9.7895756"
168+ height="15.610415"
169+ width="111.38958"
170+ id="rect852"
171+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
172+ inkscape:export-xdpi="61.120499"
173+ inkscape:export-ydpi="61.120499" />
174+ <text
175+ inkscape:export-ydpi="61.120499"
176+ inkscape:export-xdpi="61.120499"
177+ id="text870"
178+ y="98.297905"
179+ x="129.64584"
180+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
181+ xml:space="preserve"><tspan
182+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
183+ y="98.297905"
184+ x="129.64584"
185+ sodipodi:role="line"
186+ id="tspan908">(&lt;+&gt;) : Recognise c1 -&gt; inf c1 (Recognise c2) -&gt; </tspan><tspan
187+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
188+ y="103.58957"
189+ x="129.64584"
190+ sodipodi:role="line"
191+ id="tspan929"> Recognise (c1 || c2)</tspan><tspan
192+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
193+ y="108.88124"
194+ x="129.64584"
195+ sodipodi:role="line"
196+ id="tspan916">Sequence two recognisers. If either consumes a</tspan><tspan
197+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
198+ y="114.1729"
199+ x="129.64584"
200+ sodipodi:role="line"
201+ id="tspan918">character, the sequence is guaranteed to</tspan><tspan
202+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
203+ y="119.46457"
204+ x="129.64584"
205+ sodipodi:role="line"
206+ id="tspan935">consume a character</tspan><tspan
207+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
208+ y="124.75623"
209+ x="129.64584"
210+ sodipodi:role="line"
211+ id="tspan912" /><tspan
212+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
213+ y="130.04791"
214+ x="129.64584"
215+ sodipodi:role="line"
216+ id="tspan868" /></text>
217+ <path
218+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
219+ d="m 129.38124,100.41458 -7.9375,-2.910414"
220+ id="path937"
221+ inkscape:connector-curvature="0"
222+ sodipodi:nodetypes="cc"
223+ inkscape:export-xdpi="61.120499"
224+ inkscape:export-ydpi="61.120499" />
225+ <text
226+ xml:space="preserve"
227+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
228+ x="130.175"
229+ y="129.25418"
230+ id="text953"
231+ inkscape:export-xdpi="61.120499"
232+ inkscape:export-ydpi="61.120499"><tspan
233+ sodipodi:role="line"
234+ x="130.175"
235+ y="129.25418"
236+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
237+ id="tspan973">(&lt;|&gt;) : Recognise c1 -&gt; Recognise c2 -&gt;</tspan><tspan
238+ sodipodi:role="line"
239+ x="130.175"
240+ y="134.54584"
241+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
242+ id="tspan975"> Recognise (c1 &amp;&amp; c2)</tspan><tspan
243+ sodipodi:role="line"
244+ x="130.175"
245+ y="139.83751"
246+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
247+ id="tspan983">Alternative recognisers. If both consume, the</tspan><tspan
248+ sodipodi:role="line"
249+ x="130.175"
250+ y="145.12917"
251+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
252+ id="tspan985">combination is guaranteed to consumer a</tspan><tspan
253+ sodipodi:role="line"
254+ x="130.175"
255+ y="150.42084"
256+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
257+ id="tspan992">character.</tspan><tspan
258+ sodipodi:role="line"
259+ x="130.175"
260+ y="155.71251"
261+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
262+ id="tspan977" /><tspan
263+ id="tspan949"
264+ sodipodi:role="line"
265+ x="130.175"
266+ y="161.00417"
267+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /><tspan
268+ id="tspan951"
269+ sodipodi:role="line"
270+ x="130.175"
271+ y="166.29584"
272+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /></text>
273+ <path
274+ inkscape:connector-curvature="0"
275+ id="path996"
276+ d="M 128.05833,126.87292 110.33125,110.46875"
277+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
278+ sodipodi:nodetypes="cc"
279+ inkscape:export-xdpi="61.120499"
280+ inkscape:export-ydpi="61.120499" />
281+ <text
282+ xml:space="preserve"
283+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
284+ x="28.045837"
285+ y="51.731236"
286+ id="text1012"
287+ inkscape:export-xdpi="61.120499"
288+ inkscape:export-ydpi="61.120499"><tspan
289+ id="tspan1006"
290+ sodipodi:role="line"
291+ x="28.045837"
292+ y="51.731236"
293+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332">empty : Recognise False</tspan><tspan
294+ sodipodi:role="line"
295+ x="28.045837"
296+ y="57.022903"
297+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
298+ id="tspan1087">Recognise no input (doesn't consume any input)</tspan><tspan
299+ id="tspan1008"
300+ sodipodi:role="line"
301+ x="28.045837"
302+ y="62.314568"
303+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /><tspan
304+ id="tspan1010"
305+ sodipodi:role="line"
306+ x="28.045837"
307+ y="67.606232"
308+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /></text>
309+ <text
310+ inkscape:export-ydpi="61.120499"
311+ inkscape:export-xdpi="61.120499"
312+ id="text1031"
313+ y="49.614574"
314+ x="114.56458"
315+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
316+ xml:space="preserve"><tspan
317+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
318+ y="49.614574"
319+ x="114.56458"
320+ sodipodi:role="line"
321+ id="tspan1025">fail : Recognise c</tspan><tspan
322+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
323+ y="54.906242"
324+ x="114.56458"
325+ sodipodi:role="line"
326+ id="tspan1089">A recogniser that always fails.</tspan><tspan
327+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
328+ y="60.197906"
329+ x="114.56458"
330+ sodipodi:role="line"
331+ id="tspan1027" /><tspan
332+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
333+ y="65.489571"
334+ x="114.56458"
335+ sodipodi:role="line"
336+ id="tspan1029" /></text>
337+ <text
338+ inkscape:export-ydpi="61.120499"
339+ inkscape:export-xdpi="61.120499"
340+ id="text1039"
341+ y="61.785423"
342+ x="128.32292"
343+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
344+ xml:space="preserve"><tspan
345+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
346+ y="61.785423"
347+ x="128.32292"
348+ sodipodi:role="line"
349+ id="tspan1051">expect : Recognise c -&gt; Recognise False</tspan><tspan
350+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
351+ y="67.077087"
352+ x="128.32292"
353+ sodipodi:role="line"
354+ id="tspan1059">Positive lookahead. Never consumes input.</tspan><tspan
355+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
356+ y="72.368759"
357+ x="128.32292"
358+ sodipodi:role="line"
359+ id="tspan1035" /><tspan
360+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
361+ y="77.660423"
362+ x="128.32292"
363+ sodipodi:role="line"
364+ id="tspan1037" /></text>
365+ <text
366+ xml:space="preserve"
367+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
368+ x="125.14791"
369+ y="86.39167"
370+ id="text1047"
371+ inkscape:export-xdpi="61.120499"
372+ inkscape:export-ydpi="61.120499"><tspan
373+ id="tspan1041"
374+ sodipodi:role="line"
375+ x="125.14791"
376+ y="86.39167"
377+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332">pred : (Char -&gt; Bool) -&gt; Lexer</tspan><tspan
378+ sodipodi:role="line"
379+ x="125.14791"
380+ y="91.683334"
381+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
382+ id="tspan1085">Recognise a character that matches a predicate</tspan><tspan
383+ id="tspan1043"
384+ sodipodi:role="line"
385+ x="125.14791"
386+ y="96.975006"
387+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /><tspan
388+ id="tspan1045"
389+ sodipodi:role="line"
390+ x="125.14791"
391+ y="102.26667"
392+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /></text>
393+ <rect
394+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
395+ id="rect1053"
396+ width="79.904167"
397+ height="23.283327"
398+ x="121.70833"
399+ y="57.816666"
400+ inkscape:export-xdpi="61.120499"
401+ inkscape:export-ydpi="61.120499" />
402+ <text
403+ xml:space="preserve"
404+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
405+ x="128.32291"
406+ y="72.897926"
407+ id="text1069"
408+ inkscape:export-xdpi="61.120499"
409+ inkscape:export-ydpi="61.120499"><tspan
410+ id="tspan1063"
411+ sodipodi:role="line"
412+ x="128.32291"
413+ y="72.897926"
414+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332">reject : Recognise c -&gt; Recognise False</tspan><tspan
415+ sodipodi:role="line"
416+ x="128.32291"
417+ y="78.18959"
418+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
419+ id="tspan1073">Negative lookahead. Never consumes input.</tspan><tspan
420+ sodipodi:role="line"
421+ x="128.32291"
422+ y="83.481262"
423+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
424+ id="tspan1075" /><tspan
425+ id="tspan1065"
426+ sodipodi:role="line"
427+ x="128.32291"
428+ y="88.772926"
429+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.52777767px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /><tspan
430+ id="tspan1067"
431+ sodipodi:role="line"
432+ x="128.32291"
433+ y="94.06459"
434+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332" /></text>
435+ <path
436+ sodipodi:nodetypes="cc"
437+ inkscape:connector-curvature="0"
438+ id="path1081"
439+ d="M 124.35416,89.83125 76.99375,94.858333"
440+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
441+ inkscape:export-xdpi="61.120499"
442+ inkscape:export-ydpi="61.120499" />
443+ <path
444+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
445+ d="M 123.82499,66.01875 112.97708,86.391666"
446+ id="path1083"
447+ inkscape:connector-curvature="0"
448+ sodipodi:nodetypes="cc"
449+ inkscape:export-xdpi="61.120499"
450+ inkscape:export-ydpi="61.120499" />
451+ <path
452+ sodipodi:nodetypes="cc"
453+ inkscape:connector-curvature="0"
454+ id="path1091"
455+ d="M 33.33749,59.139583 20.90208,76.337499"
456+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
457+ inkscape:export-xdpi="61.120499"
458+ inkscape:export-ydpi="61.120499" />
459+ <path
460+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
461+ d="M 113.77082,51.73125 42.068747,83.481249"
462+ id="path1093"
463+ inkscape:connector-curvature="0"
464+ sodipodi:nodetypes="cc"
465+ inkscape:export-xdpi="61.120499"
466+ inkscape:export-ydpi="61.120499" />
467+ <rect
468+ y="94.064583"
469+ x="129.64583"
470+ height="27.51667"
471+ width="78.316658"
472+ id="rect899"
473+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
474+ inkscape:export-xdpi="61.120499"
475+ inkscape:export-ydpi="61.120499" />
476+ </g>
477+</svg>
docs/image/solve.pngnew file

Binary file not shown.

docs/image/solve.svgnew file+163
@@ -0,0 +1,163 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 210 297"
15+ version="1.1"
16+ id="svg8"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="solve.svg">
19+ <defs
20+ id="defs2">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker838"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow1Mend">
29+ <path
30+ transform="scale(0.4) rotate(180) translate(10,0)"
31+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
32+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
33+ id="path836" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow1Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="Arrow1Mend"
41+ style="overflow:visible;"
42+ inkscape:isstock="true"
43+ inkscape:collect="always">
44+ <path
45+ id="path4529"
46+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
47+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
48+ transform="scale(0.4) rotate(180) translate(10,0)" />
49+ </marker>
50+ </defs>
51+ <sodipodi:namedview
52+ id="base"
53+ pagecolor="#ffffff"
54+ bordercolor="#666666"
55+ borderopacity="1.0"
56+ inkscape:pageopacity="0.0"
57+ inkscape:pageshadow="2"
58+ inkscape:zoom="1"
59+ inkscape:cx="313.5"
60+ inkscape:cy="696.5"
61+ inkscape:document-units="mm"
62+ inkscape:current-layer="layer1"
63+ showgrid="false"
64+ inkscape:window-width="1920"
65+ inkscape:window-height="1015"
66+ inkscape:window-x="0"
67+ inkscape:window-y="0"
68+ inkscape:window-maximized="1" />
69+ <metadata
70+ id="metadata5">
71+ <rdf:RDF>
72+ <cc:Work
73+ rdf:about="">
74+ <dc:format>image/svg+xml</dc:format>
75+ <dc:type
76+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
77+ <dc:title />
78+ </cc:Work>
79+ </rdf:RDF>
80+ </metadata>
81+ <g
82+ inkscape:label="Layer 1"
83+ inkscape:groupmode="layer"
84+ id="layer1">
85+ <rect
86+ style="fill:#ffff00;fill-opacity:1;stroke-width:0.26458332"
87+ id="rect22"
88+ width="31.75"
89+ height="5.5562501"
90+ x="70.114571"
91+ y="114.96667"
92+ inkscape:export-xdpi="61.120499"
93+ inkscape:export-ydpi="61.120499" />
94+ <text
95+ id="text16"
96+ y="118.67083"
97+ x="72.231262"
98+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
99+ xml:space="preserve"
100+ inkscape:export-xdpi="61.120499"
101+ inkscape:export-ydpi="61.120499"><tspan
102+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332"
103+ y="118.67083"
104+ x="72.231262"
105+ id="tspan14"
106+ sodipodi:role="line">Prelude.Nat.Z </tspan></text>
107+ <text
108+ id="text20"
109+ y="110.99791"
110+ x="82.814583"
111+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
112+ xml:space="preserve"
113+ inkscape:export-xdpi="61.120499"
114+ inkscape:export-ydpi="61.120499"><tspan
115+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;stroke-width:0.26458332"
116+ y="110.99791"
117+ x="82.814583"
118+ id="tspan18"
119+ sodipodi:role="line">solve</tspan></text>
120+ <path
121+ style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
122+ d="m 80.668481,106.30075 -0.0032,7.57492"
123+ id="path4518"
124+ inkscape:connector-curvature="0"
125+ sodipodi:nodetypes="cc"
126+ inkscape:export-xdpi="61.120499"
127+ inkscape:export-ydpi="61.120499" />
128+ <text
129+ inkscape:export-ydpi="61.120499"
130+ inkscape:export-xdpi="61.120499"
131+ xml:space="preserve"
132+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
133+ x="56.620823"
134+ y="93.006248"
135+ id="text832"><tspan
136+ sodipodi:role="line"
137+ id="tspan830"
138+ x="56.620823"
139+ y="93.006248"
140+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;stroke-width:0.26458332">focus</tspan></text>
141+ <path
142+ inkscape:export-ydpi="61.120499"
143+ inkscape:export-xdpi="61.120499"
144+ sodipodi:nodetypes="cc"
145+ inkscape:connector-curvature="0"
146+ id="path834"
147+ d="m 57.649725,94.659084 -0.0032,5.458256"
148+ style="fill:none;stroke:#0000ff;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker838)" />
149+ <text
150+ inkscape:export-ydpi="61.120499"
151+ inkscape:export-xdpi="61.120499"
152+ xml:space="preserve"
153+ style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
154+ x="56.356247"
155+ y="104.91254"
156+ id="text842"><tspan
157+ sodipodi:role="line"
158+ id="tspan840"
159+ x="56.356247"
160+ y="104.91254"
161+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332">?{hole} ≈ Prelude.Nat.Z . {hole}</tspan></text>
162+ </g>
163+</svg>
docs/image/tokenise.pngnew file

Binary file not shown.

docs/image/tokenise.svgnew file+740
@@ -0,0 +1,740 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 210 297"
15+ version="1.1"
16+ id="svg8"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="tokenise.svg">
19+ <defs
20+ id="defs2">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker7119"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow1Mend">
29+ <path
30+ transform="scale(0.4) rotate(180) translate(10,0)"
31+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
32+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
33+ id="path7117" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow1Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="marker4031"
41+ style="overflow:visible;"
42+ inkscape:isstock="true"
43+ inkscape:collect="always">
44+ <path
45+ id="path4029"
46+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
47+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
48+ transform="scale(0.4) rotate(180) translate(10,0)" />
49+ </marker>
50+ <marker
51+ inkscape:isstock="true"
52+ style="overflow:visible;"
53+ id="marker1931"
54+ refX="0.0"
55+ refY="0.0"
56+ orient="auto"
57+ inkscape:stockid="Arrow1Mend"
58+ inkscape:collect="always">
59+ <path
60+ transform="scale(0.4) rotate(180) translate(10,0)"
61+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
62+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
63+ id="path1929" />
64+ </marker>
65+ <marker
66+ inkscape:stockid="Arrow1Mend"
67+ orient="auto"
68+ refY="0.0"
69+ refX="0.0"
70+ id="Arrow1Mend"
71+ style="overflow:visible;"
72+ inkscape:isstock="true"
73+ inkscape:collect="always">
74+ <path
75+ id="path1036"
76+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
77+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
78+ transform="scale(0.4) rotate(180) translate(10,0)" />
79+ </marker>
80+ </defs>
81+ <sodipodi:namedview
82+ id="base"
83+ pagecolor="#ffffff"
84+ bordercolor="#666666"
85+ borderopacity="1.0"
86+ inkscape:pageopacity="0.0"
87+ inkscape:pageshadow="2"
88+ inkscape:zoom="1"
89+ inkscape:cx="497.48698"
90+ inkscape:cy="885.5"
91+ inkscape:document-units="mm"
92+ inkscape:current-layer="layer1"
93+ showgrid="false"
94+ inkscape:window-width="1920"
95+ inkscape:window-height="1015"
96+ inkscape:window-x="0"
97+ inkscape:window-y="0"
98+ inkscape:window-maximized="1" />
99+ <metadata
100+ id="metadata5">
101+ <rdf:RDF>
102+ <cc:Work
103+ rdf:about="">
104+ <dc:format>image/svg+xml</dc:format>
105+ <dc:type
106+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
107+ <dc:title></dc:title>
108+ </cc:Work>
109+ </rdf:RDF>
110+ </metadata>
111+ <g
112+ inkscape:label="Layer 1"
113+ inkscape:groupmode="layer"
114+ id="layer1">
115+ <rect
116+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
117+ id="rect815"
118+ width="4.3310161"
119+ height="4.3471913"
120+ x="61.383358"
121+ y="51.995804"
122+ inkscape:export-xdpi="61.120499"
123+ inkscape:export-ydpi="61.120499" />
124+ <text
125+ xml:space="preserve"
126+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
127+ x="62.917812"
128+ y="55.649193"
129+ id="text819"
130+ inkscape:export-xdpi="61.120499"
131+ inkscape:export-ydpi="61.120499"><tspan
132+ sodipodi:role="line"
133+ id="tspan817"
134+ x="62.917812"
135+ y="55.649193"
136+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">i</tspan></text>
137+ <rect
138+ y="51.995804"
139+ x="65.714371"
140+ height="4.3471913"
141+ width="4.3310161"
142+ id="rect823"
143+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
144+ inkscape:export-xdpi="61.120499"
145+ inkscape:export-ydpi="61.120499" />
146+ <text
147+ id="text827"
148+ y="55.307304"
149+ x="66.760414"
150+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
151+ xml:space="preserve"
152+ inkscape:export-xdpi="61.120499"
153+ inkscape:export-ydpi="61.120499"><tspan
154+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
155+ y="55.307304"
156+ x="66.760414"
157+ id="tspan825"
158+ sodipodi:role="line">n</tspan></text>
159+ <rect
160+ y="51.995804"
161+ x="70.045387"
162+ height="4.3471913"
163+ width="4.3310161"
164+ id="rect829"
165+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
166+ inkscape:export-xdpi="61.120499"
167+ inkscape:export-ydpi="61.120499" />
168+ <text
169+ id="text833"
170+ y="55.063095"
171+ x="71.237953"
172+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
173+ xml:space="preserve"
174+ inkscape:export-xdpi="61.120499"
175+ inkscape:export-ydpi="61.120499"><tspan
176+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
177+ y="55.063095"
178+ x="71.237953"
179+ id="tspan831"
180+ sodipodi:role="line">p</tspan></text>
181+ <rect
182+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
183+ id="rect835"
184+ width="4.3310161"
185+ height="4.3471913"
186+ x="74.376404"
187+ y="51.995804"
188+ inkscape:export-xdpi="61.120499"
189+ inkscape:export-ydpi="61.120499" />
190+ <text
191+ xml:space="preserve"
192+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
193+ x="75.422447"
194+ y="55.356148"
195+ id="text839"
196+ inkscape:export-xdpi="61.120499"
197+ inkscape:export-ydpi="61.120499"><tspan
198+ sodipodi:role="line"
199+ id="tspan837"
200+ x="75.422447"
201+ y="55.356148"
202+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">u</tspan></text>
203+ <rect
204+ y="51.995804"
205+ x="78.70742"
206+ height="4.3471913"
207+ width="4.3310161"
208+ id="rect841"
209+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
210+ inkscape:export-xdpi="61.120499"
211+ inkscape:export-ydpi="61.120499" />
212+ <text
213+ id="text845"
214+ y="55.649193"
215+ x="80.241875"
216+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
217+ xml:space="preserve"
218+ inkscape:export-xdpi="61.120499"
219+ inkscape:export-ydpi="61.120499"><tspan
220+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
221+ y="55.649193"
222+ x="80.241875"
223+ id="tspan843"
224+ sodipodi:role="line">t</tspan></text>
225+ <rect
226+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
227+ id="rect847"
228+ width="4.3310161"
229+ height="4.3471913"
230+ x="83.038437"
231+ y="51.995804"
232+ inkscape:export-xdpi="61.120499"
233+ inkscape:export-ydpi="61.120499" />
234+ <text
235+ xml:space="preserve"
236+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
237+ x="59.172871"
238+ y="88.457558"
239+ id="text851"><tspan
240+ sodipodi:role="line"
241+ id="tspan849"
242+ x="59.172871"
243+ y="92.350197"
244+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none" /></text>
245+ <rect
246+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
247+ id="rect853"
248+ width="4.3310161"
249+ height="4.3471913"
250+ x="87.369453"
251+ y="51.995804"
252+ inkscape:export-xdpi="61.120499"
253+ inkscape:export-ydpi="61.120499" />
254+ <text
255+ xml:space="preserve"
256+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
257+ x="88.46434"
258+ y="55.453827"
259+ id="text857"
260+ inkscape:export-xdpi="61.120499"
261+ inkscape:export-ydpi="61.120499"><tspan
262+ sodipodi:role="line"
263+ id="tspan855"
264+ x="88.46434"
265+ y="55.453827"
266+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">s</tspan></text>
267+ <rect
268+ y="51.995804"
269+ x="91.70047"
270+ height="4.3471913"
271+ width="4.3310161"
272+ id="rect859"
273+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
274+ inkscape:export-xdpi="61.120499"
275+ inkscape:export-ydpi="61.120499" />
276+ <text
277+ id="text863"
278+ y="55.649193"
279+ x="93.234924"
280+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
281+ xml:space="preserve"
282+ inkscape:export-xdpi="61.120499"
283+ inkscape:export-ydpi="61.120499"><tspan
284+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
285+ y="55.649193"
286+ x="93.234924"
287+ id="tspan861"
288+ sodipodi:role="line">t</tspan></text>
289+ <rect
290+ y="51.995804"
291+ x="96.031487"
292+ height="4.3471913"
293+ width="4.3310161"
294+ id="rect865"
295+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
296+ inkscape:export-xdpi="61.120499"
297+ inkscape:export-ydpi="61.120499" />
298+ <text
299+ id="text869"
300+ y="55.649193"
301+ x="97.565941"
302+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
303+ xml:space="preserve"
304+ inkscape:export-xdpi="61.120499"
305+ inkscape:export-ydpi="61.120499"><tspan
306+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
307+ y="55.649193"
308+ x="97.565941"
309+ id="tspan867"
310+ sodipodi:role="line">r</tspan></text>
311+ <rect
312+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
313+ id="rect871"
314+ width="4.3310161"
315+ height="4.3471913"
316+ x="100.3625"
317+ y="51.995804"
318+ inkscape:export-xdpi="61.120499"
319+ inkscape:export-ydpi="61.120499" />
320+ <text
321+ xml:space="preserve"
322+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
323+ x="101.89697"
324+ y="55.649193"
325+ id="text875"
326+ inkscape:export-xdpi="61.120499"
327+ inkscape:export-ydpi="61.120499"><tspan
328+ sodipodi:role="line"
329+ id="tspan873"
330+ x="101.89697"
331+ y="55.649193"
332+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">i</tspan></text>
333+ <rect
334+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
335+ id="rect877"
336+ width="4.3310161"
337+ height="4.3471913"
338+ x="104.69353"
339+ y="51.995804"
340+ inkscape:export-xdpi="61.120499"
341+ inkscape:export-ydpi="61.120499" />
342+ <text
343+ xml:space="preserve"
344+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
345+ x="105.73955"
346+ y="55.50267"
347+ id="text881"
348+ inkscape:export-xdpi="61.120499"
349+ inkscape:export-ydpi="61.120499"><tspan
350+ sodipodi:role="line"
351+ id="tspan879"
352+ x="105.73955"
353+ y="55.50267"
354+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">n</tspan></text>
355+ <rect
356+ y="51.995804"
357+ x="109.0245"
358+ height="4.3471913"
359+ width="4.3310161"
360+ id="rect883"
361+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
362+ inkscape:export-xdpi="61.120499"
363+ inkscape:export-ydpi="61.120499" />
364+ <text
365+ id="text887"
366+ y="54.965416"
367+ x="110.21709"
368+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
369+ xml:space="preserve"
370+ inkscape:export-xdpi="61.120499"
371+ inkscape:export-ydpi="61.120499"><tspan
372+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
373+ y="54.965416"
374+ x="110.21709"
375+ id="tspan885"
376+ sodipodi:role="line">g</tspan></text>
377+ <text
378+ xml:space="preserve"
379+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
380+ x="125.67681"
381+ y="55.359386"
382+ id="text893"
383+ inkscape:export-xdpi="61.120499"
384+ inkscape:export-ydpi="61.120499"><tspan
385+ sodipodi:role="line"
386+ id="tspan891"
387+ x="125.67681"
388+ y="55.359386"
389+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">:String</tspan></text>
390+ <rect
391+ y="51.995804"
392+ x="113.35551"
393+ height="4.3471913"
394+ width="4.3310161"
395+ id="rect895"
396+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
397+ inkscape:export-xdpi="61.120499"
398+ inkscape:export-ydpi="61.120499" />
399+ <text
400+ id="text899"
401+ y="55.50267"
402+ x="114.40154"
403+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
404+ xml:space="preserve"><tspan
405+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
406+ y="59.395306"
407+ x="114.40154"
408+ id="tspan897"
409+ sodipodi:role="line" /></text>
410+ <rect
411+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
412+ id="rect901"
413+ width="4.3310161"
414+ height="4.3471913"
415+ x="117.68649"
416+ y="51.995804"
417+ inkscape:export-xdpi="61.120499"
418+ inkscape:export-ydpi="61.120499" />
419+ <text
420+ xml:space="preserve"
421+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
422+ x="118.87907"
423+ y="55.494583"
424+ id="text905"
425+ inkscape:export-xdpi="61.120499"
426+ inkscape:export-ydpi="61.120499"><tspan
427+ sodipodi:role="line"
428+ id="tspan903"
429+ x="118.87907"
430+ y="55.494583"
431+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">1</tspan></text>
432+ <g
433+ id="g950"
434+ transform="translate(-15.319488,0.319156)"
435+ inkscape:export-xdpi="61.120499"
436+ inkscape:export-ydpi="61.120499">
437+ <rect
438+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
439+ id="rect907"
440+ width="11.990757"
441+ height="4.3471909"
442+ x="47.978806"
443+ y="69.310013" />
444+ <text
445+ xml:space="preserve"
446+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
447+ x="48.706326"
448+ y="72.963402"
449+ id="text911"><tspan
450+ sodipodi:role="line"
451+ id="tspan909"
452+ x="48.706326"
453+ y="72.963402"
454+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">token</tspan></text>
455+ <rect
456+ y="69.310013"
457+ x="59.969563"
458+ height="4.2674026"
459+ width="10.075821"
460+ id="rect913"
461+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
462+ <text
463+ id="text917"
464+ y="72.940666"
465+ x="61.015606"
466+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
467+ xml:space="preserve"><tspan
468+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
469+ y="72.940666"
470+ x="61.015606"
471+ id="tspan915"
472+ sodipodi:role="line">line</tspan></text>
473+ <rect
474+ y="69.389801"
475+ x="70.045387"
476+ height="4.1876144"
477+ width="7.5225825"
478+ id="rect919"
479+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
480+ <text
481+ id="text923"
482+ y="72.935829"
483+ x="70.998589"
484+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
485+ xml:space="preserve"><tspan
486+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
487+ y="72.935829"
488+ x="70.998589"
489+ id="tspan921"
490+ sodipodi:role="line">col</tspan></text>
491+ </g>
492+ <text
493+ id="text927"
494+ y="80.971657"
495+ x="40.541954"
496+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
497+ xml:space="preserve"
498+ inkscape:export-xdpi="61.120499"
499+ inkscape:export-ydpi="61.120499"><tspan
500+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
501+ y="80.971657"
502+ x="40.541954"
503+ sodipodi:role="line"
504+ id="tspan933">:(List (TokenData Token), Int, Int, String)</tspan></text>
505+ <g
506+ id="g970"
507+ transform="translate(16.596112,0.319156)"
508+ inkscape:export-xdpi="61.120499"
509+ inkscape:export-ydpi="61.120499">
510+ <rect
511+ y="69.310013"
512+ x="47.978806"
513+ height="4.3471909"
514+ width="11.990757"
515+ id="rect952"
516+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
517+ <text
518+ id="text956"
519+ y="72.963402"
520+ x="48.706326"
521+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
522+ xml:space="preserve"><tspan
523+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
524+ y="72.963402"
525+ x="48.706326"
526+ id="tspan954"
527+ sodipodi:role="line">token</tspan></text>
528+ <rect
529+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
530+ id="rect958"
531+ width="10.075821"
532+ height="4.2674026"
533+ x="59.969563"
534+ y="69.310013" />
535+ <text
536+ xml:space="preserve"
537+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
538+ x="61.015606"
539+ y="72.940666"
540+ id="text962"><tspan
541+ sodipodi:role="line"
542+ id="tspan960"
543+ x="61.015606"
544+ y="72.940666"
545+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">line</tspan></text>
546+ <rect
547+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
548+ id="rect964"
549+ width="7.5225825"
550+ height="4.1876144"
551+ x="70.045387"
552+ y="69.389801" />
553+ <text
554+ xml:space="preserve"
555+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
556+ x="70.998589"
557+ y="72.935829"
558+ id="text968"><tspan
559+ sodipodi:role="line"
560+ id="tspan966"
561+ x="70.998589"
562+ y="72.935829"
563+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">col</tspan></text>
564+ </g>
565+ <g
566+ transform="translate(48.591501,0.319156)"
567+ id="g990"
568+ inkscape:export-xdpi="61.120499"
569+ inkscape:export-ydpi="61.120499">
570+ <rect
571+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
572+ id="rect972"
573+ width="11.990757"
574+ height="4.3471909"
575+ x="47.978806"
576+ y="69.310013" />
577+ <text
578+ xml:space="preserve"
579+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
580+ x="48.706326"
581+ y="72.963402"
582+ id="text976"><tspan
583+ sodipodi:role="line"
584+ id="tspan974"
585+ x="48.706326"
586+ y="72.963402"
587+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">token</tspan></text>
588+ <rect
589+ y="69.310013"
590+ x="59.969563"
591+ height="4.2674026"
592+ width="10.075821"
593+ id="rect978"
594+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
595+ <text
596+ id="text982"
597+ y="72.940666"
598+ x="61.015606"
599+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
600+ xml:space="preserve"><tspan
601+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
602+ y="72.940666"
603+ x="61.015606"
604+ id="tspan980"
605+ sodipodi:role="line">line</tspan></text>
606+ <rect
607+ y="69.389801"
608+ x="70.045387"
609+ height="4.1876144"
610+ width="7.5225825"
611+ id="rect984"
612+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
613+ <text
614+ id="text988"
615+ y="72.935829"
616+ x="70.998589"
617+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
618+ xml:space="preserve"><tspan
619+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
620+ y="72.935829"
621+ x="70.998589"
622+ id="tspan986"
623+ sodipodi:role="line">col</tspan></text>
624+ </g>
625+ <path
626+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
627+ d="m 125.97308,68.549658 1.30238,0.0089 -0.0153,6.481345 h -1.30803"
628+ id="path992"
629+ inkscape:connector-curvature="0"
630+ sodipodi:nodetypes="cccc"
631+ inkscape:export-xdpi="61.120499"
632+ inkscape:export-ydpi="61.120499" />
633+ <path
634+ sodipodi:nodetypes="cccc"
635+ inkscape:connector-curvature="0"
636+ id="path994"
637+ d="m 32.561899,68.619523 -1.30238,0.0089 0.0153,6.481345 h 1.30803"
638+ style="fill:none;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
639+ inkscape:export-xdpi="61.120499"
640+ inkscape:export-ydpi="61.120499" />
641+ <rect
642+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
643+ id="rect996"
644+ width="11.990757"
645+ height="4.3471909"
646+ x="155.60759"
647+ y="69.899559"
648+ inkscape:export-xdpi="61.120499"
649+ inkscape:export-ydpi="61.120499" />
650+ <text
651+ xml:space="preserve"
652+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
653+ x="156.33508"
654+ y="73.552948"
655+ id="text1000"
656+ inkscape:export-xdpi="61.120499"
657+ inkscape:export-ydpi="61.120499"><tspan
658+ sodipodi:role="line"
659+ id="tspan998"
660+ x="156.33508"
661+ y="73.552948"
662+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none">string</tspan></text>
663+ <rect
664+ y="69.750786"
665+ x="130.3979"
666+ height="4.2674026"
667+ width="10.075821"
668+ id="rect1002"
669+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
670+ inkscape:export-xdpi="61.120499"
671+ inkscape:export-ydpi="61.120499" />
672+ <text
673+ id="text1006"
674+ y="73.381439"
675+ x="131.44394"
676+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
677+ xml:space="preserve"
678+ inkscape:export-xdpi="61.120499"
679+ inkscape:export-ydpi="61.120499"><tspan
680+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
681+ y="73.381439"
682+ x="131.44394"
683+ id="tspan1004"
684+ sodipodi:role="line">line</tspan></text>
685+ <rect
686+ y="69.830574"
687+ x="143.64868"
688+ height="4.1876144"
689+ width="7.5225825"
690+ id="rect1008"
691+ style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.97596154;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
692+ inkscape:export-xdpi="61.120499"
693+ inkscape:export-ydpi="61.120499" />
694+ <text
695+ id="text1012"
696+ y="73.376602"
697+ x="144.60188"
698+ style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
699+ xml:space="preserve"
700+ inkscape:export-xdpi="61.120499"
701+ inkscape:export-ydpi="61.120499"><tspan
702+ style="font-size:4.23333311px;stroke-width:0.70555556;stroke-miterlimit:4;stroke-dasharray:none"
703+ y="73.376602"
704+ x="144.60188"
705+ id="tspan1010"
706+ sodipodi:role="line">col</tspan></text>
707+ <path
708+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
709+ d="m 58.415342,69.700595 -0.143613,-5.887785 4.912582,-0.06048 0.03784,-6.371998"
710+ id="path1025"
711+ inkscape:connector-curvature="0"
712+ sodipodi:nodetypes="cccc"
713+ inkscape:export-xdpi="61.120499"
714+ inkscape:export-ydpi="61.120499" />
715+ <path
716+ inkscape:connector-curvature="0"
717+ id="path1927"
718+ d="m 89.918872,69.996556 -0.02264,-12.07186"
719+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1931)"
720+ sodipodi:nodetypes="cc"
721+ inkscape:export-xdpi="61.120499"
722+ inkscape:export-ydpi="61.120499" />
723+ <path
724+ sodipodi:nodetypes="cccc"
725+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4031)"
726+ d="m 122.08751,69.519138 -0.0832,-5.464386 -2.3456,-0.06048 -0.20406,-6.674425"
727+ id="path4027"
728+ inkscape:connector-curvature="0"
729+ inkscape:export-xdpi="61.120499"
730+ inkscape:export-ydpi="61.120499" />
731+ <path
732+ inkscape:connector-curvature="0"
733+ id="path7115"
734+ d="m 147.18896,69.882051 -0.0832,-5.827299 -22.72919,0 -0.446,-6.251027"
735+ style="fill:none;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7119)"
736+ sodipodi:nodetypes="cccc"
737+ inkscape:export-xdpi="61.120499"
738+ inkscape:export-ydpi="61.120499" />
739+ </g>
740+</svg>
docs/image/tree.pngnew file

Binary file not shown.

docs/image/tree.svgnew file+212
@@ -0,0 +1,212 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
18+ sodipodi:docname="tree.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:isstock="true"
23+ style="overflow:visible;"
24+ id="marker5204"
25+ refX="0.0"
26+ refY="0.0"
27+ orient="auto"
28+ inkscape:stockid="Arrow1Mend">
29+ <path
30+ transform="scale(0.4) rotate(180) translate(10,0)"
31+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
32+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
33+ id="path5206" />
34+ </marker>
35+ </defs>
36+ <sodipodi:namedview
37+ id="base"
38+ pagecolor="#ffffff"
39+ bordercolor="#666666"
40+ borderopacity="1.0"
41+ inkscape:pageopacity="0.0"
42+ inkscape:pageshadow="2"
43+ inkscape:zoom="1"
44+ inkscape:cx="383.03443"
45+ inkscape:cy="690.88799"
46+ inkscape:document-units="px"
47+ inkscape:current-layer="layer1"
48+ showgrid="false"
49+ inkscape:window-width="1129"
50+ inkscape:window-height="730"
51+ inkscape:window-x="671"
52+ inkscape:window-y="0"
53+ inkscape:window-maximized="0" />
54+ <metadata
55+ id="metadata7">
56+ <rdf:RDF>
57+ <cc:Work
58+ rdf:about="">
59+ <dc:format>image/svg+xml</dc:format>
60+ <dc:type
61+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
62+ <dc:title />
63+ </cc:Work>
64+ </rdf:RDF>
65+ </metadata>
66+ <g
67+ inkscape:label="Layer 1"
68+ inkscape:groupmode="layer"
69+ id="layer1">
70+ <text
71+ xml:space="preserve"
72+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
73+ x="348.5"
74+ y="334.92474"
75+ id="text4136"
76+ inkscape:export-xdpi="61.120499"
77+ inkscape:export-ydpi="61.120499"><tspan
78+ sodipodi:role="line"
79+ id="tspan4138"
80+ x="348.5"
81+ y="334.92474"
82+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;fill-opacity:1">{hole2} :Nat-&gt;Nat</tspan></text>
83+ <text
84+ id="text4152"
85+ y="364.17471"
86+ x="380.375"
87+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
88+ xml:space="preserve"
89+ inkscape:export-xdpi="61.120499"
90+ inkscape:export-ydpi="61.120499"><tspan
91+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;fill-opacity:1"
92+ y="364.17471"
93+ x="380.375"
94+ id="tspan4154"
95+ sodipodi:role="line">intro `{{x}}</tspan></text>
96+ <text
97+ xml:space="preserve"
98+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
99+ x="381.0625"
100+ y="470.23721"
101+ id="text4156"
102+ inkscape:export-xdpi="61.120499"
103+ inkscape:export-ydpi="61.120499"><tspan
104+ sodipodi:role="line"
105+ id="tspan4158"
106+ x="381.0625"
107+ y="470.23721"
108+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;fill-opacity:1">solve</tspan></text>
109+ <text
110+ id="text4160"
111+ y="414.42471"
112+ x="380.5625"
113+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
114+ xml:space="preserve"
115+ inkscape:export-xdpi="61.120499"
116+ inkscape:export-ydpi="61.120499"><tspan
117+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;fill-opacity:1"
118+ y="414.42471"
119+ x="380.5625"
120+ id="tspan4162"
121+ sodipodi:role="line">fill (Var `{{x}})</tspan></text>
122+ <path
123+ style="fill:#0000ff;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5204)"
124+ d="m 371.4375,343.4872 0.875,29.125"
125+ id="path5202"
126+ inkscape:connector-curvature="0"
127+ sodipodi:nodetypes="cc"
128+ inkscape:export-xdpi="61.120499"
129+ inkscape:export-ydpi="61.120499" />
130+ <path
131+ inkscape:export-ydpi="61.120499"
132+ inkscape:export-xdpi="61.120499"
133+ sodipodi:nodetypes="cc"
134+ inkscape:connector-curvature="0"
135+ id="path89"
136+ d="m 371.4375,395.9872 0.875,29.125"
137+ style="fill:#0000ff;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5204)" />
138+ <path
139+ style="fill:#0000ff;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5204)"
140+ d="m 371.4375,450.3622 0.875,29.125"
141+ id="path91"
142+ inkscape:connector-curvature="0"
143+ sodipodi:nodetypes="cc"
144+ inkscape:export-xdpi="61.120499"
145+ inkscape:export-ydpi="61.120499" />
146+ <text
147+ inkscape:export-ydpi="61.120499"
148+ inkscape:export-xdpi="61.120499"
149+ id="text95"
150+ y="332.11224"
151+ x="295.0625"
152+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
153+ xml:space="preserve"><tspan
154+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
155+ y="332.11224"
156+ x="295.0625"
157+ id="tspan93"
158+ sodipodi:role="line">state</tspan></text>
159+ <text
160+ xml:space="preserve"
161+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
162+ x="295.0625"
163+ y="386.48724"
164+ id="text99"
165+ inkscape:export-xdpi="61.120499"
166+ inkscape:export-ydpi="61.120499"><tspan
167+ sodipodi:role="line"
168+ id="tspan97"
169+ x="295.0625"
170+ y="386.48724"
171+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1">state</tspan></text>
172+ <text
173+ inkscape:export-ydpi="61.120499"
174+ inkscape:export-xdpi="61.120499"
175+ id="text103"
176+ y="444.61224"
177+ x="295.0625"
178+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
179+ xml:space="preserve"><tspan
180+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ff0000;fill-opacity:1"
181+ y="444.61224"
182+ x="295.0625"
183+ id="tspan101"
184+ sodipodi:role="line">state</tspan></text>
185+ <text
186+ inkscape:export-ydpi="61.120499"
187+ inkscape:export-xdpi="61.120499"
188+ id="text3796"
189+ y="389.29974"
190+ x="345.6875"
191+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
192+ xml:space="preserve"><tspan
193+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;fill-opacity:1"
194+ y="389.29974"
195+ x="345.6875"
196+ id="tspan3794"
197+ sodipodi:role="line">λ x:Nat . ? {hole 2}</tspan></text>
198+ <text
199+ xml:space="preserve"
200+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
201+ x="344.75"
202+ y="442.73724"
203+ id="text3800"
204+ inkscape:export-xdpi="61.120499"
205+ inkscape:export-ydpi="61.120499"><tspan
206+ sodipodi:role="line"
207+ id="tspan3798"
208+ x="344.75"
209+ y="442.73724"
210+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;fill-opacity:1">λ x:Nat . x</tspan></text>
211+ </g>
212+</svg>
docs/index.rst+4−1
@@ -13,7 +13,7 @@ Documentation for the Idris Language
1313 Idris Community* has waived all copyright and related or neighboring
1414 rights to Documentation for Idris.
1515
16− More information concerning the CC0 can be found online at: http://creativecommons.org/publicdomain/zero/1.0/
16+ More information concerning the CC0 can be found online at: https://creativecommons.org/publicdomain/zero/1.0/
1717
1818
1919.. toctree::
@@ -21,7 +21,10 @@ Documentation for the Idris Language
2121
2222 tutorial/index
2323 faq/faq
24+ st/index
2425 effects/index
2526 proofs/index
27+ elaboratorReflection/index
28+ parserLibrary/index
2629 reference/index
2730 guides/index
docs/listing/idris-prompt-helloworld.txt+2−2
@@ -1,8 +1,8 @@
11$ idris hello.idr
22 ____ __ _
33 / _/___/ /____(_)____
4− / // __ / ___/ / ___/ Version 0.12.2
5− _/ // /_/ / / / (__ ) http://www.idris-lang.org/
4+ / // __ / ___/ / ___/ Version 1.3.2
5+ _/ // /_/ / / / (__ ) https://www.idris-lang.org/
66 /___/\__,_/_/ /_/____/ Type :? for help
77
88Type checking ./hello.idr
docs/listing/idris-prompt-interp.txt+2−2
@@ -1,8 +1,8 @@
11$ idris interp.idr
22 ____ __ _
33 / _/___/ /____(_)____
4− / // __ / ___/ / ___/ Version 0.12.2
5− _/ // /_/ / / / (__ ) http://www.idris-lang.org/
4+ / // __ / ___/ / ___/ Version 1.3.2
5+ _/ // /_/ / / / (__ ) https://www.idris-lang.org/
66 /___/\__,_/_/ /_/____/ Type :? for help
77
88Type checking ./interp.idr
docs/listing/idris-prompt-start.txt+2−2
@@ -1,8 +1,8 @@
11$ idris
22 ____ __ _
33 / _/___/ /____(_)____
4− / // __ / ___/ / ___/ Version 0.12.2
5− _/ // /_/ / / / (__ ) http://www.idris-lang.org/
4+ / // __ / ___/ / ___/ Version 1.3.2
5+ _/ // /_/ / / / (__ ) https://www.idris-lang.org/
66/___/\__,_/_/ /_/____/ Type :? for help
77
88Idris>
docs/make.bat+1−1
@@ -65,7 +65,7 @@ if errorlevel 9009 (
6565 echo.may add the Sphinx directory to PATH.
6666 echo.
6767 echo.If you don't have Sphinx installed, grab it from
68− echo.http://sphinx-doc.org/
68+ echo.https://www.sphinx-doc.org/
6969 exit /b 1
7070)
7171
docs/faq/index.rst → docs/parserLibrary/index.rstrenamed+11−6
@@ -1,10 +1,13 @@
1−.. _faq-index:
1+.. _parserLibrary:
22
3−##########################
4−Frequently Asked Questions
5−##########################
3+########################
4+Lexer and Parser Library
5+########################
6+
7+A tutorial on the lexer and parser library in Idris.
68
79.. note::
10+
811 The documentation for Idris has been published under the Creative
912 Commons CC0 License. As such to the extent possible under law, *The
1013 Idris Community* has waived all copyright and related or neighboring
@@ -12,8 +15,10 @@ Frequently Asked Questions
1215
1316 More information concerning the CC0 can be found online at: http://creativecommons.org/publicdomain/zero/1.0/
1417
15−
1618.. toctree::
1719 :maxdepth: 1
1820
19− faq
21+ introduction
22+ lexer
23+ parser
24+ whitespace
docs/parserLibrary/introduction.rstnew file+76
@@ -0,0 +1,76 @@
1+.. _parserLibraryIntro:
2+
3+***************************
4+Parser Library Introduction
5+***************************
6+
7+The parser library can be used to build Idris structures from text. It involves a
8+certain amount of complexity and so it would typically be used for big projects.
9+An example might be a compiler for another language, written in Idris.
10+
11+Of course the parser library can also be used to compile to Idris, this is what
12+is done in Idris 2 and that is what the this library appears to have been
13+written for.
14+
15+So a secondary use for this tutorial would be to help understanding the internal
16+workings of Idris 2.
17+
18+The parser library is used in a similar way to Parsec which is a library for
19+writing parsers in Haskell. It is based on higher-order parser combinators, so a
20+complicated parser can be made out of many smaller ones.
21+
22+.. list-table::
23+
24+ * - This is a two stage process:
25+ - Lexer - This takes the input string and turns it into a list of Tokens.
26+ - Parser - This takes the list of tokens and outputs the code.
27+
28+ - .. image:: ../image/parserTopLevel.png
29+ :width: 307px
30+ :height: 76px
31+ :alt: diagram illustrating these stages of lexer and parser
32+
33+The advantage of using two stages, like this, is that things like whitespace and
34+comments don't need to be considered in every parser rule.
35+
36+The Idris parser library differs from Parsec in that you need to say, in the
37+Recogniser, whether a rule is guaranteed to consume input. This means that the
38+Idris type system prevents the construction of recognisers/rules that can't
39+consume the input.
40+
41+The Lexer is similar but works at the level of characters rather than tokens, and
42+you need to provide a TokenMap which defines how to build a token from
43+a string when a rule is matched.
44+
45+The following pages contain a tutorial for the :ref:`parserLibraryLexer` and a
46+tutorial for the :ref:`parserLibraryParser`. These tutorials have a running
47+example of a parser for integer expressions. This is a very simple example, there
48+may be easier ways to do something so simple, but it illustrates some of the
49+principles.
50+
51+Parser Library and Idris 2
52+--------------------------
53+
54+The parser library, in Idris 1, is almost the same as the code that the Idris 2
55+parser is built on. Even if you only want to use the Idris 1 parser library it
56+is useful to look at the code in the Idris 2 compilers to see how the library
57+can be used.
58+
59+Idris 2 has at least 3 compilers:
60+
61+- IDEMode - complies to SExp which is a Lisp-like structure used to communicate
62+ with external editors like Emacs and Vim.
63+- Idris.Parser - This is the main compiler which compiles from a file to
64+ PTerm (and eventually TT structure).
65+- REPL - compiles input from the command line.
66+
67+The following diagram is my first attempt to work out how some of the modules in
68+Idris 2 fit together (with a few of the dependencies between them shown). The
69+Idris 1 library is based on the modules at the bottom of the diagram (shown
70+in red).
71+
72+.. image:: ../image/parserModules.png
73+ :width: 460px
74+ :height: 496px
75+ :alt: diagram illustrating these stages of lexer and parser
76+
docs/parserLibrary/lexer.rstnew file+288
@@ -0,0 +1,288 @@
1+.. _parserLibraryLexer:
2+
3+Lexer
4+=====
5+
6+The lexer is run by calling the 'lex' function in the Text.Lexer.Core
7+module:
8+
9+.. code-block:: idris
10+
11+ lex : TokenMap a -> String -> (List (TokenData a), (Int, Int, String))
12+
13+.. list-table::
14+
15+ * - This function takes a String and returns a list of tokens. With the
16+ tokens we have indexes back to the original string which can be used
17+ in error messages:
18+
19+ - .. image:: ../image/tokenise.png
20+ :width: 330px
21+ :height: 73px
22+ :alt: diagram illustrating these stages of lexer
23+
24+TokenMap
25+--------
26+
27+In order to construct this list of tokens we need:
28+
29+- A way to recognise the tokens in the input string.
30+- A way to construct these individual tokens.
31+
32+This is given by the TokenMap which is a list of pairs containing
33+this information:
34+
35+.. code-block:: idris
36+
37+ (Lexer, String -> tokenType)
38+
39+So for each Lexer in the list, if a substring in the input matches, run
40+the associated function to produce a token of type ``tokenType``
41+
42+.. list-table::
43+
44+ * - from Text.Lexer.Core
45+ : https://github.com/idris-lang/Idris-dev/blob/master/libs/contrib/Text/Lexer/Core.idr
46+
47+ - .. code-block:: idris
48+
49+ TokenMap : (tokenType : Type) -> Type
50+ TokenMap tokenType = List (Lexer, String -> tokenType)
51+
52+ * - We can create a tokenMap by using a function like this:
53+
54+ - .. code-block:: idris
55+
56+ myTokenMap : TokenMap Token
57+ myTokenMap = [(is 'a',CharLit)]
58+
59+Once we have a TokenMap we can use it to lex many strings.
60+
61+Recognisers
62+-----------
63+
64+The first part of each entry in the TokenMap is the recogniser.
65+
66+A simple recogniser is 'Pred' which uses a predicate (Char -> Bool) to
67+test whether to accept the character. It can be constructed using the
68+'is' function:
69+
70+.. code-block:: idris
71+
72+ *parserEx> is 'a'
73+ Pred (\ARG =>
74+ intToBool (prim__eqChar ARG 'a'))
75+ : Recognise True
76+
77+More complicated structures can be recognised as tokens, this is done using
78+the combinator structure of recognisers. This allows recognisers to be
79+combined, for example,
80+
81+.. list-table::
82+
83+ * - ``<+>`` means sequence two recognisers. If either consumes a character,
84+ the sequence is guaranteed to consume a character.
85+
86+ - .. code-block:: idris
87+
88+ *parserEx> is 'a' <+> is 'b'
89+ SeqEat (Pred (\ARG => intToBool (prim__eqChar ARG 'a')))
90+ (Delay (is 'b')) : Recognise True
91+
92+ * - ``<|>`` means if both consume, the combination is guaranteed
93+ to consumer a character:
94+
95+ - .. code-block:: idris
96+
97+ *parserEx> is 'a' <|> is 'b'
98+ Alt (Pred (\ARG => intToBool (prim__eqChar ARG 'a')))
99+ (Pred (\ARG => intToBool (prim__eqChar ARG 'b')))
100+ : Recognise True
101+
102+This diagram shows the recogniser combinator with some of its constructors:
103+
104+.. image:: ../image/recogniser.png
105+ :width: 487px
106+ :height: 249px
107+ :alt: recogniser data structure
108+
109+A recogniser consumes its input, that is it advances the index to its input
110+string, as it generates the token list. In some cases we don't want this to
111+happen, for instance, we may need to lookahead before consuming the input
112+string.
113+
114+If a recogniser does not consume input there is a danger of an infinite loop.
115+To prevent this the recogniser is dependent on a boolean called 'consumes' which
116+is true if the recogniser is guaranteed to consume at least one character.
117+
118+The constructors of Recognise allow us to ensure that, even though parts of
119+the recogniser may not consume, overall the recogniser will consume.
120+
121+Since 'Recognise True' is more common than 'Recognise False' it is convenient to
122+use 'Lexer' as a type synonym for 'Recognise True'.
123+
124+Whitespace and Comments
125+-----------------------
126+
127+An important reason to have a lexer is to simplify the parser when whitespace
128+or comments are required. Without this the parser would require a match for
129+every combination, with and without, whitespace and comments.
130+
131+In some languages the lexer needs to remove whitespace and comments so that
132+they don't appear in the token list. In some cases whitespace is significant
133+but a single whitespace token can stand for any number of spaces, tabs,
134+carriage returns and so on.
135+
136+In some cases, such as when parsing the Idris language itself, whitespace
137+is important to indicate blocks. In this case we might want to output a
138+start-of-block token when the indent increases and an end-of-block token
139+when the indent decreases.
140+
141+This topic will be discussed more fully on this page
142+:ref:`parserLibraryWhitespace`.
143+
144+Simple Expression Example for Lexer
145+-----------------------------------
146+
147+On this page we will implement a lexer to 'lex' a very simple expression as
148+a running example, on the next page, we will go on to implement a parser for it.
149+
150+First import the lexer and parser code:
151+
152+.. code-block:: idris
153+
154+ module ParserExample
155+
156+ import Text.Lexer
157+ import public Text.Parser.Core
158+ import public Text.Parser
159+
160+Then decide on the tokens that are needed. For this example the idea is to be
161+able to parse simple arithmetic expressions, like this:
162+
163+.. code-block:: idris
164+
165+ 1+(2*3)
166+
167+so we need:
168+
169+- Numbers (for now integer literals are good enough).
170+- Some operators (for now ``+``, ``-`` and ``*`` will do.
171+- Opening and closing Parentheses.
172+
173+We can define these, as tokens, like this:
174+
175+.. code-block:: idris
176+
177+ %default total
178+
179+ public export
180+ data ExpressionToken = Number Integer
181+ | Operator String
182+ | OParen
183+ | CParen
184+ | EndInput
185+
186+It may help with debugging and to implement error messages to
187+implement ``show`` for these tokens:
188+
189+.. code-block:: idris
190+
191+ export
192+ Show ExpressionToken where
193+ show (Number x) = "number " ++ show x
194+ show (Operator x) = "operator " ++ x
195+ show OParen = "("
196+ show CParen = ")"
197+ show EndInput = "end of input"
198+
199+ export
200+ Show (TokenData ExpressionToken) where
201+ show (MkToken l c t) = "line=" ++ show l ++ " col=" ++ show c ++ "tok=" ++ show t
202+
203+The following defines the 'TokenMap' for this example:
204+
205+.. code-block:: idris
206+
207+ ||| integer arithmetic operators plus, minus and multiply.
208+ export
209+ opChars : String
210+ opChars = "+-*"
211+
212+ operator : Lexer
213+ operator = some (oneOf opChars)
214+
215+ toInt' : String -> Integer
216+ toInt' = cast
217+
218+ expressionTokens : TokenMap ExpressionToken
219+ expressionTokens =
220+ [(digits, \x => Number (toInt' x)),
221+ (operator, \x => Operator x),
222+ (is '(' ,\x => OParen),
223+ (is ')' ,\x => CParen)]
224+
225+This specifies the lexer. It gives, for each token, a function to recognise
226+the token type and a function to construct the token.
227+
228+The library module 'Text.Lexer' contains useful functions to help with this.
229+For example, the digits function used above, which reads one or more
230+numeric characters.
231+
232+We can now run the code with various strings to see what output the lexer
233+produces. This is done by calling the 'lex' function with the TokenMap and
234+input string as parameters:
235+
236+.. code-block:: idris
237+
238+ cd Idris-dev/libs/contrib
239+ idris -p contrib parserEx.idr
240+ ____ __ _
241+ / _/___/ /____(_)____
242+ / // __ / ___/ / ___/ Version 1.3.2
243+ _/ // /_/ / / / (__ ) http://www.idris-lang.org/
244+ /___/\__,_/_/ /_/____/ Type :? for help
245+
246+ Idris is free software with ABSOLUTELY NO WARRANTY.
247+ For details type :warranty.
248+ Type checking ./Text/Token.idr
249+ Type checking ./Text/Quantity.idr
250+ Type checking ./Control/Delayed.idr
251+ Type checking ./Data/Bool/Extra.idr
252+ Type checking ./Text/Lexer/Core.idr
253+ Type checking ./Text/Lexer.idr
254+ Type checking ./parserEx.idr
255+
256+ *parserEx> lex expressionTokens "1+2"
257+ ([MkToken 0 0 (Number 1),
258+ MkToken 0
259+ (case fspan (\ARG => not (intToBool (prim__eqChar ARG '\n'))) "1" of
260+ (incol, "") => c + cast (length incol)
261+ (incol, b) => cast (length incol))
262+ (Operator "+"),
263+ MkToken 0
264+ (case fspan (\ARG => not (intToBool (prim__eqChar ARG '\n'))) "+" of
265+ (incol, "") => c + cast (length incol)
266+ (incol, b) => cast (length incol))
267+ (Number 2)],
268+ 0,
269+ case fspan (\ARG => not (intToBool (prim__eqChar ARG '\n'))) "2" of
270+ (incol, "") => c + cast (length incol)
271+ (incol, b) => cast (length incol),
272+ getString (MkStrLen "" 0)) : (List (TokenData ExpressionToken),
273+ Int,
274+ Int,
275+ String)
276+
277+The lexer uses potentially infinite data structures. It has recursive
278+arguments (codata type) so code is lazy. In the output above the indexes
279+have not been computed but we can pick out the tokens:
280+
281+- (Number 1)
282+- (Operator "+")
283+- (Number 2)
284+
285+So the code is working.
286+
287+We can now go ahead and parse this token list. A parser for this example will
288+be constructed on the next page.
docs/parserLibrary/parser.rstnew file+700
@@ -0,0 +1,700 @@
1+.. _parserLibraryParser:
2+
3+Parser
4+======
5+
6+To run the parser we call ``parse``. This requires a grammar and the output
7+from the lexer (which is a list of tokens).
8+
9+.. code-block:: idris
10+
11+ parse : (act : Grammar tok c ty) -> (xs : List tok) ->
12+ Either (ParseError tok) (ty, List tok)
13+
14+If successful this returns 'Right' with a pair of
15+
16+- the parse result.
17+- the unparsed tokens (the remaining input).
18+
19+otherwise it returns 'Left' with the error message.
20+
21+So we need to define the grammar for our parser, this is done using the following
22+'Grammar' data structure. This is a combinator structure, similar in principle
23+to the recogniser combinator for the lexer, which was discussed on the
24+previous page.
25+
26+As with the Recogniser the ``Grammar`` type is dependent on a boolean 'consumes'
27+value which allows us to ensure that complicated ``Grammar`` structures will always
28+consume input.
29+
30+.. code-block:: idris
31+
32+ ||| Description of a language's grammar. The `tok` parameter is the type
33+ ||| of tokens, and the `consumes` flag is True if the language is guaranteed
34+ ||| to be non-empty - that is, successfully parsing the language is guaranteed
35+ ||| to consume some input.
36+ public export
37+ data Grammar : (tok : Type) -> (consumes : Bool) -> Type -> Type where
38+ Empty : (val : ty) -> Grammar tok False ty
39+ Terminal : String -> (tok -> Maybe a) -> Grammar tok True a
40+ NextIs : String -> (tok -> Bool) -> Grammar tok False tok
41+ EOF : Grammar tok False ()
42+
43+ Fail : Bool -> String -> Grammar tok c ty
44+ Commit : Grammar tok False ()
45+ MustWork : Grammar tok c a -> Grammar tok c a
46+
47+ SeqEat : Grammar tok True a -> Inf (a -> Grammar tok c2 b) ->
48+ Grammar tok True b
49+ SeqEmpty : {c1, c2 : Bool} ->
50+ Grammar tok c1 a -> (a -> Grammar tok c2 b) ->
51+ Grammar tok (c1 || c2) b
52+ Alt : {c1, c2 : Bool} ->
53+ Grammar tok c1 ty -> Grammar tok c2 ty ->
54+ Grammar tok (c1 && c2) ty
55+
56+So an example of a grammer type may look something like this:
57+``Grammar (TokenData ExpressionToken) True Integer``.
58+This is a complicated type name and a given parser will need to use it a lot.
59+So to reduce the amount of typing we can use the following type synonym (similar
60+to what is done in Idris 2
61+: https://github.com/edwinb/Idris2/blob/master/src/Parser/Support.idr
62+)
63+
64+.. code-block:: idris
65+
66+ public export
67+ Rule : Type -> Type
68+ Rule ty = Grammar (TokenData ExpressionToken) True ty
69+
70+Parser Example
71+--------------
72+
73+On the previous page we implemented a lexer to 'lex' a very simple expression, on
74+this page we will go on to add a parser for this running example.
75+
76+.. list-table::
77+
78+ * - The syntax we are aiming at is something
79+ like this (expressed in Backus–Naur form (BNF)):
80+ - .. code-block:: idris
81+
82+ <expr> ::= <integer literal>
83+ | <expr>'+'<expr>
84+ | <expr>'-'<expr>
85+ | <expr>'*'<expr>
86+ | '('<expr>')'
87+
88+ <integer literal> ::= <digit>|<integer literal><digit>
89+
90+.. list-table::
91+
92+ * - To start, here is a grammar to parse an integer literal (that is, a
93+ sequence of numeric characters).
94+
95+ - .. code-block:: idris
96+
97+ export
98+ intLiteral : Rule Integer
99+ intLiteral
100+ = terminal (\x => case tok x of
101+ Number i => Just i
102+ _ => Nothing)
103+
104+In order to try this out, here is a temporary function, this calls
105+parse which takes two parameters:
106+
107+- The grammar (in this case intLiteral)
108+- The token list from the lexer.
109+
110+.. code-block:: idris
111+
112+ test1 : String -> Either (ParseError (TokenData ExpressionToken))
113+ (Integer, List (TokenData ExpressionToken))
114+ test1 s = parse intLiteral (fst (lex expressionTokens s))
115+
116+As required, if we pass it a string which is a number literal then it will
117+return the number in the 'Right' option.
118+
119+.. code-block:: idris
120+
121+ *parserEx> test1 "123"
122+ Right (123, []) : Either (ParseError (TokenData ExpressionToken))
123+ (Integer, List (TokenData ExpressionToken))
124+
125+If we pass it a string which is not a number literal then it will return an
126+error message.
127+
128+.. code-block:: idris
129+
130+ *parserEx> test1 "a"
131+ Left (Error "End of input"
132+ []) : Either (ParseError (TokenData ExpressionToken))
133+ (Integer, List (TokenData ExpressionToken))
134+
135+If we pass it a number followed by something else, then it will still be
136+successful, this is because we are not specifically checking for end-of-file.
137+
138+.. code-block:: idris
139+
140+ *parserEx> test1 "123a"
141+ Right (123, []) : Either (ParseError (TokenData ExpressionToken))
142+ (Integer, List (TokenData ExpressionToken))
143+ *parserEx>
144+
145+.. list-table::
146+
147+ * - The ``intLiteral`` function above uses the ``terminal`` function to
148+ construct the grammar
149+ - .. code-block:: idris
150+
151+ ||| Succeeds if running the predicate on the
152+ ||| next token returns Just x, returning x.
153+ ||| Otherwise fails.
154+ export
155+ terminal : (tok -> Maybe a) -> Grammar tok True a
156+ terminal = Terminal
157+
158+This is defined here
159+: https://github.com/idris-lang/Idris-dev/blob/master/libs/contrib/Text/Parser/Core.idr
160+Idris 2 uses a slightly different version which stores an error message like
161+"Expected integer literal" which can be output if the rule fails
162+: https://github.com/edwinb/Idris2/blob/master/src/Text/Parser/Core.idr
163+
164+.. list-table::
165+
166+ * - The 'terminal' function is also used to construct the other
167+ elements of the grammar that we require, for instance,
168+ opening parenthesis:
169+
170+ - .. code-block:: idris
171+
172+ openParen : Rule Integer
173+ openParen = terminal (\x => case tok x of
174+ OParen => Just 0
175+ _ => Nothing)
176+
177+Integer value is not really relevant for parenthesis so ``0`` (zero) is used as
178+a default value.
179+
180+As before, this can be tested with a function like this:
181+
182+.. code-block:: idris
183+
184+ test2 : String -> Either (ParseError (TokenData ExpressionToken))
185+ (Integer, List (TokenData ExpressionToken))
186+ test2 s = parse openParen (fst (lex expressionTokens s))
187+
188+We can see below that it correctly parses an open parenthesis and gives an
189+error for anything else:
190+
191+.. code-block:: idris
192+
193+ *parserEx> test2 "("
194+ Right (0, []) : Either (ParseError (TokenData ExpressionToken))
195+ (Integer, List (TokenData ExpressionToken))
196+ *parserEx> test2 "123"
197+ Left (Error "Unrecognised token"
198+ [MkToken 0
199+ 0
200+ (Number 123)]) : Either (ParseError (TokenData ExpressionToken))
201+ (Integer,
202+ List (TokenData ExpressionToken))
203+
204+Now we have two Grammars we can try combining them. The following test looks
205+for ``openParen`` followed by ``intLiteral``, the two Grammars are combined using
206+``<*>``. The ``map const`` part uses the integer value from the first.
207+
208+The following test is looking for ``(`` followed by a number:
209+
210+.. code-block:: idris
211+
212+ test3 : String -> Either (ParseError (TokenData ExpressionToken))
213+ (Integer, List (TokenData ExpressionToken))
214+ test3 s = parse (map const openParen <*> intLiteral) (fst (lex expressionTokens s))
215+
216+We can see below that ``(`` followed by a number is successfully parsed but, as
217+required, other token lists are not:
218+
219+.. code-block:: idris
220+
221+ *parserEx> test3 "(123"
222+ Right (0, []) : Either (ParseError (TokenData ExpressionToken))
223+ (Integer, List (TokenData ExpressionToken))
224+ *parserEx> test3 "(("
225+ Left (Error "Unrecognised token"
226+ [MkToken 0
227+ (case fspan (\ARG => not (intToBool (prim__eqChar ARG '\n')))
228+ "(" of
229+ (incol, "") => c + cast (length incol)
230+ (incol, b) => cast (length incol))
231+ OParen]) : Either (ParseError (TokenData ExpressionToken))
232+ (Integer, List (TokenData ExpressionToken))
233+
234+ *parserEx> test3 "123"
235+ Left (Error "Unrecognised token"
236+ [MkToken 0
237+ 0
238+ (Number 123)]) : Either (ParseError (TokenData ExpressionToken))
239+ (Integer,
240+ List (TokenData ExpressionToken))
241+ *parserEx> test3 "123("
242+ Left (Error "Unrecognised token"
243+ [MkToken 0 0 (Number 123),
244+ MkToken 0
245+ (case fspan (\ARG => not (intToBool (prim__eqChar ARG '\n')))
246+ "321" of
247+ (incol, "") => c + cast (length incol)
248+ (incol, b) => cast (length incol))
249+ OParen]) : Either (ParseError (TokenData ExpressionToken))
250+ (Integer, List (TokenData ExpressionToken))
251+
252+.. list-table::
253+
254+ * - The closing parenthesis is constructed in the same way.
255+
256+ - .. code-block:: idris
257+
258+ closeParen : Rule Integer
259+ closeParen = terminal (\x => case tok x of
260+ CParen => Just 0
261+ _ => Nothing)
262+
263+.. list-table::
264+
265+ * - Now we can generate a Grammar for an expression inside parenthesis
266+ like this.
267+
268+ - .. code-block:: idris
269+
270+ paren : Rule Integer -> Rule Integer
271+ paren exp = openParen *> exp <* closeParen
272+
273+The use of ``*>`` and ``<*`` instead of ``<*>`` is an easy way to use the integer
274+value from the inner expression.
275+
276+So lets try to use this to define a grammar which recognises either:
277+
278+- An integer literal
279+- An integer literal inside parenthesis
280+- An integer literal inside parenthesis inside parenthesis
281+- ... and so on.
282+
283+.. list-table::
284+
285+ * - This requires a recursively defined structure like this:
286+
287+ - .. code-block:: idris
288+
289+ partial
290+ expr : Rule Integer
291+ expr = intLiteral <|> (paren expr)
292+
293+This is a valid grammar because every time it is called it is guaranteed to
294+consume a token. However, as an Idris structure, it is problematic due to
295+the recursion. Defining it as partial allows it to compile but at runtime
296+we are likely to get a crash with an (unhelpful) error message like
297+``killed by signal 11``.
298+
299+So a better method is to use ``do`` notation as described in the following
300+section.
301+
302+Monadic Combinator
303+------------------
304+
305+In addition to ``<|>`` and ``<*>`` there is a ``>>=`` combinator, which is
306+defined like this:
307+
308+.. code-block:: idris
309+
310+ ||| Sequence two grammars. If either consumes some input, the sequence is
311+ ||| guaranteed to consume some input. If the first one consumes input, the
312+ ||| second is allowed to be recursive (because it means some input has been
313+ ||| consumed and therefore the input is smaller)
314+ export %inline
315+ (>>=) : {c1 : Bool} ->
316+ Grammar tok c1 a ->
317+ inf c1 (a -> Grammar tok c2 b) ->
318+ Grammar tok (c1 || c2) b
319+ (>>=) {c1 = False} = SeqEmpty
320+ (>>=) {c1 = True} = SeqEat
321+
322+.. list-table::
323+
324+ * - This allows us to use ``do`` notation for the previous parenthesis example:
325+
326+ - .. code-block:: idris
327+
328+ expr = intLiteral <|> do
329+ openParen
330+ r <- expr
331+ closeParen
332+ pure r
333+
334+This can be more flexible than using the ``<*>`` operator. Also it is defined
335+using ``Inf`` so we can implement recursively defined grammars as above.
336+
337+Implementing the Arithmetic Operators
338+-------------------------------------
339+
340+.. list-table::
341+
342+ * - Now for the operations, in this case: ``+``, ``-`` and ``*``.
343+ The syntax we require for these infix operators
344+ would require recursive grammars like this:
345+
346+ - .. code-block:: idris
347+
348+ expr = expr (op "+") expr
349+
350+As already explained, ``do`` notation can allow us to use recursive
351+definitions but not necessarily left-recursion like this.
352+
353+In order to work up to this gradually lets start with prefix operators
354+(sometimes known as Polish notation) then modify later for infix operators.
355+
356+.. list-table::
357+
358+ * - So prefix operators would have this sort of form:
359+
360+ - .. code-block:: idris
361+
362+ expr = (add (op "+") expr expr)
363+
364+where ``op`` is defined like this:
365+
366+.. code-block:: idris
367+
368+ ||| Matches if this is an operator token and string matches, that is,
369+ ||| it is the required type of operator.
370+ op : String -> Rule Integer
371+ op s = terminal (\x => case tok x of
372+ (Operator s1) => if s==s1 then Just 0 else Nothing
373+ _ => Nothing)
374+
375+.. list-table::
376+
377+ * - and ``add`` is defined like this:
378+
379+ Where:
380+
381+ - x is the add operator.
382+ - y is the first operand.
383+ - z is the second operand.
384+
385+ - .. code-block:: idris
386+
387+ addInt : Integer -> Integer -> Integer
388+ addInt a b = a+b
389+
390+ export
391+ add : Grammar tok c1 Integer ->
392+ Grammar tok c2 Integer ->
393+ Grammar tok c3 Integer ->
394+ Grammar tok ((c1 || c2) || c3) Integer
395+ add x y z = map addInt (x *> y) <*> z
396+
397+
398+
399+The resulting integer will be the sum of the two operands.
400+
401+.. list-table::
402+
403+ * - The other operators are defined in a similar way:
404+
405+ - .. code-block:: idris
406+
407+ subInt : Integer -> Integer -> Integer
408+ subInt a b = a-b
409+
410+ export
411+ sub : Grammar tok c1 Integer ->
412+ Grammar tok c2 Integer ->
413+ Grammar tok c3 Integer ->
414+ Grammar tok ((c1 || c2) || c3) Integer
415+ sub x y z = map subInt (x *> y) <*> z
416+
417+ multInt : Integer -> Integer -> Integer
418+ multInt a b = a*b
419+
420+ export
421+ mult : Grammar tok c1 Integer ->
422+ Grammar tok c2 Integer ->
423+ Grammar tok c3 Integer ->
424+ Grammar tok ((c1 || c2) || c3) Integer
425+ mult x y z = map multInt (x *> y) <*> z
426+
427+So the top level ``Grammar`` can now be defined as follows. Note that this is
428+partial as it is a potentially infinite structure and so not total.
429+
430+.. code-block:: idris
431+
432+ partial
433+ expr : Rule Integer
434+ expr = (add (op "+") expr expr)
435+ <|> (sub (op "-") expr expr)
436+ <|> (mult (op "*") expr expr)
437+ <|> intLiteral <|> (paren expr)
438+
439+.. list-table::
440+
441+ * - To make the testing easier we can use this function:
442+
443+ - .. code-block:: idris
444+
445+ partial
446+ test : String -> Either (ParseError (TokenData ExpressionToken))
447+ (Integer, List (TokenData ExpressionToken))
448+ test s = parse expr (fst (lex expressionTokens s))
449+
450+.. list-table::
451+
452+ * - First test a valid (prefix) expression:
453+
454+ - .. code-block:: idris
455+
456+ *parserEx> test "+1*6(4)"
457+ Right (25,
458+ []) : Either (ParseError (TokenData ExpressionToken))
459+ (Integer, List (TokenData ExpressionToken))
460+
461+Then an invalid syntax:
462+
463+.. code-block:: idris
464+
465+ *parserEx> test "))"
466+ Left (Error "Unrecognised token"
467+ [MkToken 0 0 CParen,
468+ MkToken 0
469+ (case fspan (\ARG =>
470+ not (intToBool (prim__eqChar ARG
471+ '\n')))
472+ ")" of
473+ (incol, "") => c + cast (length incol)
474+ (incol, b) => cast (length incol))
475+ CParen]) : Either (ParseError (TokenData ExpressionToken))
476+ (Integer,
477+ List (TokenData ExpressionToken))
478+
479+However if we try something that is invalid, but starts with a valid token,
480+then it will return ``Right`` (to indicate success)
481+
482+.. code-block:: idris
483+
484+ *parserEx> test "1))"
485+ Right (1,
486+ [MkToken 0
487+ (case fspan (\ARG =>
488+ not (intToBool (prim__eqChar ARG '\n')))
489+ "1" of
490+ (incol, "") => c + cast (length incol)
491+ (incol, b) => cast (length incol))
492+ CParen,
493+ MkToken 0
494+ (case fspan (\ARG =>
495+ not (intToBool (prim__eqChar ARG '\n')))
496+ ")" of
497+ (incol, "") => c + cast (length incol)
498+ (incol, b) => cast (length incol))
499+ CParen]) : Either (ParseError (TokenData ExpressionToken))
500+ (Integer,
501+ List (TokenData ExpressionToken))
502+
503+Infix Notation
504+--------------
505+
506+So far we have implemented a prefix notation for operators (like this:
507+``+ expr expr``) but the aim is to implemented an infix notation (like this:
508+``expr + expr``). To do this we must be able to deal with potentially
509+infinite data structures (see Codata Types here :ref:`sect-typefuns`).
510+
511+First alter the grammar to have infix operations:
512+
513+.. code-block:: idris
514+
515+ addInt : Integer -> Integer -> Integer
516+ addInt a b = a+b
517+
518+ export
519+ add : Grammar tok c1 Integer ->
520+ Grammar tok c2 Integer ->
521+ Grammar tok c3 Integer ->
522+ Grammar tok ((c1 || c2) || c3) Integer
523+ add x y z = map addInt (x <* y) <*> z
524+
525+ subInt : Integer -> Integer -> Integer
526+ subInt a b = a-b
527+
528+ export
529+ sub : Grammar tok c1 Integer ->
530+ Grammar tok c2 Integer ->
531+ Grammar tok c3 Integer ->
532+ Grammar tok ((c1 || c2) || c3) Integer
533+ sub x y z = map subInt (x <* y) <*> z
534+
535+
536+ multInt : Integer -> Integer -> Integer
537+ multInt a b = a*b
538+
539+ export
540+ mult : Grammar tok c1 Integer ->
541+ Grammar tok c2 Integer ->
542+ Grammar tok c3 Integer ->
543+ Grammar tok ((c1 || c2) || c3) Integer
544+ mult x y z = map multInt (x <* y) <*> z
545+
546+ partial
547+ expr : Rule Integer
548+ expr = (add expr (op "+") expr)
549+ <|> (sub expr (op "-") expr)
550+ <|> (mult expr (op "*") expr)
551+ <|> intLiteral <|> (paren expr)
552+
553+However, if this was run, the code would not terminate.
554+
555+Implement Left Recursion Elimination
556+------------------------------------
557+
558+Left factoring, like this, is a general problem.
559+
560+If we have a rule like this:
561+
562+.. code-block:: idris
563+
564+ A -> (x<*>y) <|> (x<*>z)
565+
566+If ``x<*>y`` fails but ``x<*>z`` would succeed a problem is that, ``x<*>y`` has
567+already consumed ``x``, so now ``x<*>z`` will fail.
568+
569+so we could write code to backtrack. That is ``try`` ``x<*>y`` without consuming
570+so that, if the first token succeeds but the following tokens fail, then the
571+first tokens would not be consumed.
572+
573+Another approach is left factoring:
574+
575+Left Factoring
576+--------------
577+
578+Replace the rule with two rules (that is we add a non-terminal symbol) so
579+for example, instead of:
580+
581+.. code-block:: idris
582+
583+ A -> (x<*>y) <|> (x<*>z)
584+
585+we add an extra rule to give:
586+
587+.. code-block:: idris
588+
589+ A -> x<*>N
590+ N -> y <|> z
591+
592+That is we convert a general context-free grammar to a LL(1) grammar. Although
593+not every context-free grammar can be converted to a LL(1) grammar.
594+
595+This still does not solve the infinite recursion issue and there is another
596+problem: the precedence of the operators ``+``, ``-`` and ``*`` is not explicit.
597+
598+.. list-table::
599+
600+ * - To resolve this we can alter the example to have a BNF like this:
601+ Where braces ``{ ... }`` mean the contents can occur 1 or more times.
602+
603+ - .. code-block:: idris
604+
605+ 'expression' ::= ('+'|'-') 'term' {('+'|'-') 'term'}
606+
607+ 'term' ::= 'factor' {'*' 'factor'}
608+
609+ 'factor' ::=
610+ number
611+ | '(' 'expression' ')'
612+
613+
614+.. code-block:: idris
615+
616+ expr : Rule Integer
617+
618+ factor : Rule Integer
619+ factor = intLiteral <|> do
620+ openParen
621+ r <- expr
622+ closeParen
623+ pure r
624+
625+ term : Rule Integer
626+ term = map multInt factor <*> (
627+ (op "*")
628+ *> factor)
629+ <|> factor
630+
631+ expr = map addInt term <*> (
632+ (op "+")
633+ *> term)
634+ <|> map subInt term <*> (
635+ (op "-")
636+ *> term)
637+ <|> term
638+
639+ calc : String -> Either (ParseError (TokenData ExpressionToken))
640+ (Integer, List (TokenData ExpressionToken))
641+ calc s = parse expr (fst (lex expressionTokens s))
642+
643+ lft : (ParseError (TokenData ExpressionToken)) -> IO ()
644+ lft (Error s lst) = putStrLn ("error:"++s)
645+
646+ rht : (Integer, List (TokenData ExpressionToken)) -> IO ()
647+ rht i = putStrLn ("right " ++ (show i))
648+
649+ main : IO ()
650+ main = do
651+ putStr "alg>"
652+ x <- getLine
653+ either lft rht (calc x) -- eliminator for Either
654+
655+As the following tests show, this now handles infix operators and precedence.
656+
657+.. list-table::
658+
659+ * - For example '*' is an infix operator:
660+
661+ - .. code-block:: idris
662+
663+ *algebraREPL> :exec
664+ alg>2*3
665+ right (6, [])
666+
667+ * - Check that atomic number literals work:
668+
669+ - .. code-block:: idris
670+
671+ *algebraREPL> :exec
672+ alg>2
673+ right (2, [])
674+
675+ * - Check that '*' has a higher precedence than '+'.
676+
677+ - .. code-block:: idris
678+
679+ *algebraREPL> :exec
680+ alg>2+3*4
681+ right (14, [])
682+
683+ * - Also '*' has a higher precedence than '+' when the order is reversed.
684+
685+ - .. code-block:: idris
686+
687+ *algebraREPL> :exec
688+ alg>3*4+2
689+ right (14, [])
690+
691+ * - Also precedence can be overridden by parenthesis.
692+
693+ - .. code-block:: idris
694+
695+ *algebraREPL> :exec
696+ alg>(2+3)*4
697+ right (20, [])
698+
699+This is still not correct because it does not correctly parse multiple sums or terms
700+like ``1+2+3`` or ``1*2*3``.
docs/parserLibrary/whitespace.rstnew file+250
@@ -0,0 +1,250 @@
1+.. _parserLibraryWhitespace:
2+
3+Whitespace and Comments
4+=======================
5+
6+The previous two pages introduced the lexer and parser but have not yet
7+discussed how to handle whitespace and comments.
8+
9+In some grammars whitespace and comments would not be considered significant and
10+so we might be tempted not to generate any tokens for them. However, in the
11+running example, we may want to make spaces significant in the future. For
12+example, we might want to implement function application expressed by
13+juxtaposition as in Haskell and Idris like this: ``f x``.
14+
15+So, on this page, we will add a token for whitespace and comments. We will
16+then consider two ways to process this:
17+
18+- Filter all whitespace tokens from the lexer results before passing to
19+ the parser.
20+- Process the whitespace tokens in the parser.
21+
22+Whitespace and Comments in Lexer
23+--------------------------------
24+
25+To start with we can use the same token for both whitespace and comments. Here
26+it is called ``Comment`` and added to the ``ExpressionToken`` data structure
27+like this:
28+
29+.. code-block:: idris
30+
31+ public export
32+ data ExpressionToken = Number Integer
33+ | Operator String
34+ | OParen
35+ | CParen
36+ | Comment String
37+ | EndInput
38+
39+This is added to the ``TokenMap`` like this:
40+
41+.. code-block:: idris
42+
43+ ||| from https://github.com/edwinb/Idris2/blob/master/src/Parser/Lexer.idr
44+ comment : Lexer
45+ comment = is '-' <+> is '-' <+> many (isNot '\n')
46+
47+ expressionTokens : TokenMap ExpressionToken
48+ expressionTokens =
49+ [(digits, \x => Number (toInt' x)),
50+ (operator, \x => Operator x),
51+ (is '(' ,\x => OParen),
52+ (is ')' ,\x => CParen),
53+ (spaces, Comment),
54+ (comment, Comment)]
55+
56+As you can see, the comment is defined like a single line Idris comment,
57+it starts with ``--`` and continues for the remainder of the line.
58+
59+We don't need to define ``spaces`` because it is already defined in
60+: https://github.com/idris-lang/Idris-dev/blob/master/libs/contrib/Text/Lexer.idr
61+like this:
62+
63+.. code-block:: idris
64+
65+ ||| Recognise a single whitespace character
66+ ||| /\\s/
67+ space : Lexer
68+ space = pred isSpace
69+
70+ ||| Recognise one or more whitespace characters
71+ ||| /\\s+/
72+ spaces : Lexer
73+ spaces = some space
74+
75+If these whitespace tokens are not significant, that is, they can appear
76+anywhere and they are optional then we can filter them out before the parser
77+gets them like this:
78+
79+.. code-block:: idris
80+
81+ processWhitespace : (List (TokenData ExpressionToken), Int, Int, String)
82+ -> (List (TokenData ExpressionToken), Int, Int, String)
83+ processWhitespace (x,l,c,s) = ((filter notComment x),l,c,s) where
84+ notComment : TokenData ExpressionToken -> Bool
85+ notComment t = case tok t of
86+ Comment _ => False
87+ _ => True
88+
89+ calc : String -> Either (ParseError (TokenData ExpressionToken))
90+ (Integer, List (TokenData ExpressionToken))
91+ calc s = parse expr (fst (processWhitespace (lex expressionTokens s)))
92+
93+
94+Whitespace and Comments in Parser
95+---------------------------------
96+
97+If we sometimes require whitespace to be significant then we can't filter
98+them out as above. In this case the ``Comment`` tokens are sent to the parser
99+which now needs to be able to handle them.
100+
101+.. code-block:: idris
102+
103+ commentSpace : Rule Integer
104+ commentSpace = terminal (\x => case tok x of
105+ Comment s => Just 0
106+ _ => Nothing)
107+
108+So far we don't have any syntax that requires spaces to be significant so we
109+need to define the grammar so that it will parse with, or without, spaces.
110+This needs to be done in a systematic way, here I have defined the grammar so
111+that there is an optional space to the right of every atom or operator.
112+First add versions of ``intLiteral`` , ``openParen`` , ``closeParen``
113+and ``op`` that allow optional spaces/comments to the right of them:
114+
115+.. code-block:: idris
116+
117+ intLiteralC : Rule Integer
118+ intLiteralC = (intLiteral <* commentSpace) <|> intLiteral
119+
120+ openParenC : Rule Integer
121+ openParenC = (openParen <* commentSpace) <|> openParen
122+
123+ closeParenC : Rule Integer
124+ closeParenC = (closeParen <* commentSpace) <|> closeParen
125+
126+ ||| like op but followed by optional comment or space
127+ opC : String -> Rule Integer
128+ opC s = ((op s) <* commentSpace) <|> (op s)
129+
130+Then just use these functions instead of the original functions:
131+
132+.. code-block:: idris
133+
134+ expr : Rule Integer
135+
136+ factor : Rule Integer
137+ factor = intLiteralC <|> do
138+ openParenC
139+ r <- expr
140+ closeParenC
141+ pure r
142+
143+ term : Rule Integer
144+ term = map multInt factor <*> (
145+ (opC "*")
146+ *> factor)
147+ <|> factor
148+
149+ expr = map addInt term <*> (
150+ (opC "+")
151+ *> term)
152+ <|> map subInt term <*> (
153+ (opC "-")
154+ *> term)
155+ <|> term
156+
157+ calc : String -> Either (ParseError (TokenData ExpressionToken))
158+ (Integer, List (TokenData ExpressionToken))
159+ calc s = parse expr (fst (lex expressionTokens s))
160+
161+ lft : (ParseError (TokenData ExpressionToken)) -> IO ()
162+ lft (Error s lst) = putStrLn ("error:"++s)
163+
164+ rht : (Integer, List (TokenData ExpressionToken)) -> IO ()
165+ rht i = putStrLn ("right " ++ (show i))
166+
167+ main : IO ()
168+ main = do
169+ putStr "alg>"
170+ x <- getLine
171+ either lft rht (calc x) -- eliminator for Either
172+
173+
174+Defining Block Structure using Indents
175+--------------------------------------
176+
177+Many languages such as Python, Haskell and Idris use indents to delimit
178+the block structure of the language.
179+
180+We can see how Idris2 does it here
181+: https://github.com/edwinb/Idris2/blob/master/src/Parser/Support.idr
182+
183+.. code-block:: idris
184+
185+ export
186+ IndentInfo : Type
187+ IndentInfo = Int
188+
189+ export
190+ init : IndentInfo
191+ init = 0
192+
193+EndInput Token
194+--------------
195+
196+So far, the parser will return a successful result even if the full input
197+is not consumed. To ensure that the top level syntax is fully matched we
198+add a ``EndInput`` token to indicate the last token.
199+
200+``EndInput`` is added to the other tokens like this:
201+
202+.. code-block:: idris
203+
204+ data ExpressionToken = Number Integer
205+ | Operator String
206+ | OParen
207+ | CParen
208+ | Comment String
209+ | EndInput
210+
211+A rule to consume this token is added:
212+
213+.. code-block:: idris
214+
215+ eoi : Rule Integer
216+ eoi = terminal (\x => case tok x of
217+ EndInput => Just 0
218+ _ => Nothing)
219+
220+Instead of using ``expr`` at the top level of the syntax we can now define
221+``exprFull`` as shown here. This will make sure that only when ``EndInput``
222+is consumed will the parse be successful:
223+
224+.. code-block:: idris
225+
226+ exprFull : Rule Integer
227+ exprFull = expr <* eoi
228+
229+The following code makes sure ``EndInput`` is added to the end of the token
230+list:
231+
232+.. code-block:: idris
233+
234+ processWhitespace : (List (TokenData ExpressionToken), Int, Int, String)
235+ -> (List (TokenData ExpressionToken), Int, Int, String)
236+ processWhitespace (x,l,c,s) = ((filter notComment x)++
237+ [MkToken l c EndInput],l,c,s) where
238+ notComment : TokenData ExpressionToken -> Bool
239+ notComment t = case tok t of
240+ Comment _ => False
241+ _ => True
242+
243+All we have to do now is use ``exprFull`` instead of ``expr``:
244+
245+.. code-block:: idris
246+
247+ calc : String -> Either (ParseError (TokenData ExpressionToken))
248+ (Integer, List (TokenData ExpressionToken))
249+ calc s = parse exprFull (fst (processWhitespace (lex expressionTokens s)))
250+
docs/proofs/definitional.rstnew file+235
@@ -0,0 +1,235 @@
1+*******************
2+Background Material
3+*******************
4+
5+In order to understand how to write proofs in Idris I think its worth clarifying some fundamentals, such as,
6+
7+- Propositions and judgments
8+- Boolean and constructive logic
9+- Curry-Howard correspondence
10+- Definitional and propositional equalities
11+- Axiomatic and constructive approaches
12+
13+Propositions and Judgments
14+==========================
15+
16+Propositions are the subject of our proofs, before the proof then we can't formally say if they are true or not. If the proof is successful then the result is a 'judgment'.
17+For instance, if the ``proposition`` is,
18+
19++-------+
20+| 1+1=2 |
21++-------+
22+
23+When we prove it, the ``judgment`` is,
24+
25++------------+
26+| 1+1=2 true |
27++------------+
28+
29+Or if the ``proposition`` is,
30+
31++-------+
32+| 1+1=3 |
33++-------+
34+
35+Obviously we can't prove it is true, but it is still a valid proposition and perhaps we can prove it is false so the ``judgment`` is,
36+
37++-------------+
38+| 1+1=3 false |
39++-------------+
40+
41+This may seem a bit pedantic but it is important to be careful, in mathematics not every proposition is true or false for instance, a proposition may be unproven or even unprovable.
42+
43+So the logic here is different from the logic that comes from boolean algebra. In that case what is not true is false and what is not false is true. The logic we are using here does not have this 'law of excluded middle' so we have to be careful not to use it.
44+
45+A false proposition is taken to be a contradiction and if we have a contradiction then we can prove anything, so we need to avoid this. Some languages, used in proof assistants, prevent contradictions but such languages cannot be Turing complete, so Idris does not prevent contradictions.
46+
47+The logic we are using is called constructive (or sometimes intuitional) because we are constructing a 'database' of judgments.
48+
49+There are also many other types of logic, another important type of logic for Idris programmers is '``linear logic``' but that's not discussed on this page.
50+
51+Curry-Howard correspondence
52+===========================
53+
54+So how to we relate these proofs to Idris programs? It turns out that there is a correspondence between constructive logic and type theory. They are the same structure and we can switch backward and forward between the two notations because they are the same thing.
55+
56+The way that this works is that a proposition is a type so this,
57+
58+.. code-block:: idris
59+
60+ Idris> 1+1=2
61+ 2 = 2 : Type
62+
63+is a proposition and it is also a type. This is built into Idris so when an '=' equals sign appears in a function type an equality type is generated. The following will also produce an equality type:
64+
65+
66+.. code-block:: idris
67+
68+ Idris> 1+1=3
69+ 2 = 3 : Type
70+
71+Both of these are valid propositions so both are valid equality types. But how do we represent true judgment, that is, how do we denote 1+1=2 is true but not 1+1=3.
72+A type that is true is inhabited, that is, it can be constructed. An equality type has only one constructor 'Refl' so a proof of 1+1=2 is
73+
74+.. code-block:: idris
75+
76+ onePlusOne : 1+1=2
77+ onePlusOne = Refl
78+
79+So how can Refl, which is a constructor without any parameters, construct an equality type? If we type it on its own then it can't:
80+
81+.. code-block:: idris
82+
83+ Idris> Refl
84+ (input):Can't infer argument A to Refl, Can't infer argument x to Refl
85+
86+So it must pattern match on its return type:
87+
88+.. code-block:: idris
89+
90+ Idris> the (1=1) Refl
91+ Refl : 1 = 1
92+
93+So now that we can represent propositions as types other aspects of propositional logic can also be translated to types as follows:
94+
95++----------+-------------------+--------------------------+
96+| | propositions | example of possible type |
97++----------+-------------------+--------------------------+
98+| A | x=y | |
99++----------+-------------------+--------------------------+
100+| B | y=z | |
101++----------+-------------------+--------------------------+
102+| and | A /\\ B | ``Pair(x=y,y=z)`` |
103++----------+-------------------+--------------------------+
104+| or | A \\/ B | ``Either(x=y,y=z)`` |
105++----------+-------------------+--------------------------+
106+| implies | A -> B | ``(x=y) -> (y=x)`` |
107++----------+-------------------+--------------------------+
108+| for all | y=z | |
109++----------+-------------------+--------------------------+
110+| exists | y=z | |
111++----------+-------------------+--------------------------+
112+
113+
114+And (conjunction)
115+-----------------
116+
117+We can have a type which corresponds to conjunction:
118+
119+.. code-block:: idris
120+
121+ AndIntro : a -> b -> A a b
122+
123+There is a built in type called 'Pair'.
124+
125+Or (disjunction)
126+----------------
127+
128+We can have a type which corresponds to disjunction:
129+
130+.. code-block:: idris
131+
132+ data Or : Type -> Type -> Type where
133+ OrIntroLeft : a -> A a b
134+ OrIntroRight : b -> A a b
135+
136+There is a built in type called 'Either'.
137+
138+Definitional and Propositional Equalities
139+=========================================
140+
141+We have seen that we can 'prove' a type by finding a way to construct a term. In the case of equality types there is only one constructor which is 'Refl'.
142+We have also seen that each side of the equation does not have to be identical like '2=2'. It is enough that both sides are ``definitionaly equal`` like this:
143+
144+.. code-block:: idris
145+
146+ onePlusOne : 1+1=2
147+ onePlusOne = Refl
148+
149+So both sides of this equation nomalise to 2 and so Refl will type match and the proposition is proved.
150+
151+We don't have to stick to terms, can also use symbolic parameters so the following will compile:
152+
153+.. code-block:: idris
154+
155+ varIdentity : m = m
156+ varIdentity = Refl
157+
158+If a proposition/equality type is not definitionaly equal but is still true then it is ``propositionaly equal``. In this case we may still be able to prove it but some steps in the proof may require us to add something into the terms or at least to take some sideways steps to get to a proof.
159+
160+Especially when working with equalities containing variable terms (inside functions) it can be hard to know which equality types are definitially equal, in this example plusReducesL is '``definitially equal``' but plusReducesR is not (although it is '``propositionaly equal``'). The only difference between them is the order of the operands.
161+
162+.. code-block:: idris
163+
164+ plusReducesL : (n:Nat) -> plus Z n = n
165+ plusReducesL n = Refl
166+
167+ plusReducesR : (n:Nat) -> plus n Z = n
168+ plusReducesR n = Refl
169+
170+plusReducesR gives the following error:
171+
172+
173+.. code-block:: idris
174+
175+ - + Errors (1)
176+ `-- proof.idr line 6 col 17:
177+ When checking right hand side of plusReducesR with expected type
178+ plus n 0 = n
179+
180+ Type mismatch between
181+ n = n (Type of Refl)
182+ and
183+ plus n 0 = n (Expected type)
184+
185+ Specifically:
186+ Type mismatch between
187+ n
188+ and
189+ plus n 0
190+
191+So why is 'Refl' able to prove some equality types but not others?
192+
193+The first answer is that 'plus' is defined in such a way that it splits on its first argument so it is simple to prove when 0 is the first argument but not the second. So what is the general way to know if Refl will work?
194+
195+If an equality type can be proved/constructed by using Refl alone it is known as a ``definitional equality``. In order to be definitinally equal both sides of the equation must normalise to unique values. That is, each step in the proof must reduce the term so each step is effectively forced.
196+
197+So when we type 1+1 in Idris it is immediately converted to 2 because definitional equality is built in.
198+
199+.. code-block:: idris
200+
201+ Idris> 1+1
202+ 2 : Integer
203+
204+In the following pages we discuss how to resolve propositionaly equalies.
205+
206+Axiomatic and Constructive Approaches
207+=====================================
208+
209+How should we define types so that we can do proofs on them? In the natural numbers with the plus example we could have started by treating it as a group based on the plus operator. So we have axioms:
210+
211+- for all x,y : ``x+y=y+x``
212+- for all x: ``x + 0 = x = 0 + x``
213+- for all x,y,z: ``(x + y) + z = x + (x + z)``
214+
215+Then we can implement '+' so that it respects these axioms (presumably implemented in hardware).
216+
217+These are axioms, that is a propositions/types that are asserted to be true without proof. In Idris we can use the 'postulate' keyword
218+
219+
220+.. code-block:: idris
221+
222+ postulate commutePlus: (x:Nat) -> (y:Nat) -> plus x y = plus y x
223+
224+Alternatively we could define the natural numbers based on Zero and Successor. The axioms above then become derived rules and we also gain the ability to do inductive proofs.
225+
226+As we know, Idris uses both of these approaches with automatic coercion between them which gives the best of both worlds.
227+
228+So what can we learn from this to implement our own types:
229+
230+- Should we try to implement both approaches?
231+- Should we define our types by constructing up from primitive types?
232+
233+Proof theory affects these design decisions.
234+
235+
docs/proofs/index.rst+5−2
@@ -4,7 +4,7 @@
44Theorem Proving
55###############
66
7−A tutorial on theorem proving in Idris.
7+A tutorial on theorem proving in Idris.
88
99.. note::
1010
@@ -13,13 +13,16 @@ A tutorial on theorem proving in Idris.
1313 Idris Community* has waived all copyright and related or neighboring
1414 rights to Documentation for Idris.
1515
16− More information concerning the CC0 can be found online at: http://creativecommons.org/publicdomain/zero/1.0/
16+ More information concerning the CC0 can be found online at: https://creativecommons.org/publicdomain/zero/1.0/
1717
1818.. toctree::
1919 :maxdepth: 1
2020
21+ definitional
2122 pluscomm
2223 inductive
2324 patterns
25+ propositional
2426 interactive
27+ interactiveOld
2528
docs/proofs/inductive.rst+2
@@ -1,3 +1,5 @@
1+.. _sect-inductive:
2+
13****************
24Inductive Proofs
35****************
docs/proofs/interactive.rst+224−97
@@ -1,15 +1,102 @@
1−***************************************
2−DEPRECATED: Interactive Theorem Proving
3−***************************************
1+***************************
2+Interactive Theorem Proving
3+***************************
44
5−.. warning::
6− The interactive theorem-proving interface documented here has been
7− deprecated in favor of :ref:`elaborator-reflection`.
5+Idris supports interactive theorem proving via elaborator reflection.
86
9−Idris also supports interactive theorem proving via tactics. This
10−is generally not recommended to be used directly, but rather used as a
11−mechanism for building proof automation which is beyond the scope of this
12−tutorial. In this section, we briefly discus tactics.
7+:ref:`elaborator-reflection` is also used to convert high-level Idris code into
8+the core language and for customising the language. Here we show how to use it
9+to interactively construct proofs.
10+
11+The primary purpose of the elaboration mechanism is to elaborate Idris and so it
12+is not optimised to work as a proof assistant, however it can interactively
13+construct proofs as described on this page.
14+
15+Elab and Pruviloj Libraries
16+===========================
17+
18+Elaborator reflection is defined in ``prelude/Language/Reflection/Elab.idr``
19+and ``pruviloj`` is defined in ``Idris-dev/libs/pruviloj/``.
20+
21+``Elab`` defines the basics such as: ``solve``, ``attack``, ``intro``, ``compute``,
22+``rewriteWith`` and others.
23+``pruviloj`` defines some more advanced derived commands such as:
24+``reflexivity`` and others.
25+
26+To use ``pruviloj`` call Idris with the ``-p pruviloj`` option and add:
27+
28+.. code-block:: idris
29+
30+ import Pruviloj
31+ import Pruviloj.Induction
32+
33+to the top of your file.
34+
35+It is useful to get the docs at the REPL by using the ``:doc`` command, and
36+search the docstrings using ``:apropos``. So to introduce the functions from
37+``Elab`` and ``Pruviloj``, that we will need for the following example, here are
38+their docstrings:
39+
40+.. code-block:: idris
41+
42+ *plusReducesZ> :doc solve
43+ Language.Reflection.Elab.Tactics.solve : Elab ()
44+ Substitute a guess into a hole.
45+
46+.. code-block:: idris
47+
48+ *plusReducesZ> :doc attack
49+ Language.Reflection.Elab.Tactics.attack : Elab ()
50+ Convert a hole to make it suitable for bindings - that is, transform
51+ it such that it has the form ?h : t . h as opposed to ?h : t . f h.
52+
53+ The binding tactics require that a hole be directly under its binding,
54+ or else the scopes of the generated terms won't make sense. This
55+ tactic creates a new hole of the proper form, and points the old hole
56+ at it.
57+
58+.. code-block:: idris
59+
60+ *plusReducesZ> :doc intro
61+ Language.Reflection.Elab.Tactics.intro : (n : TTName) -> Elab ()
62+ Introduce a lambda binding around the current hole and focus on the
63+ body. Requires that the hole be in binding form (use attack).
64+ Arguments:
65+ n : TTName -- the name to use for the argument
66+
67+.. code-block:: idris
68+
69+ *plusReducesZ> :doc compute
70+ Language.Reflection.Elab.Tactics.compute : Elab ()
71+ Normalise the goal.
72+
73+.. code-block:: idris
74+
75+ *plusReducesZ> :doc rewriteWith
76+ Language.Reflection.Elab.Tactics.rewriteWith : Raw -> Elab ()
77+ Attempt to rewrite the goal using an equality.
78+
79+ The tactic searches the goal for applicable subterms, and constructs a
80+ context for replace using them. In some cases, this is not possible,
81+ and replace must be called manually with an appropriate context.
82+
83+ Because this tactic internally introduces a let binding, it requires
84+ that the hole be immediately under its binder (use attack if it might
85+ not be).
86+
87+Here is the command from ``pruviloj`` that we will need for the example on
88+this page:
89+
90+.. code-block:: idris
91+
92+ *plusReducesZ> :doc reflexivity
93+ Pruviloj.Core.reflexivity : Elab ()
94+ A special-purpose tactic that attempts to solve a goal using Refl.
95+ This is useful for ensuring that goals in fact are trivial when
96+ developing or testing other tactics; otherwise, consider using search.
97+
98+Interactive Example: plusReduces
99+================================
13100
14101One way to write proofs interactively is to write the general *structure* of
15102the proof, and use the interactive mode to complete the details.
@@ -25,145 +112,185 @@ hypothesis, and insert *holes* for the rest of the definition:
25112
26113.. code-block:: idris
27114
115+ import Pruviloj
116+ import Pruviloj.Induction
117+
28118 plusReducesZ' : (n:Nat) -> n = plus n Z
29119 plusReducesZ' Z = ?plusredZ_Z
30120 plusReducesZ' (S k) = let ih = plusReducesZ' k in
31121 ?plusredZ_S
32122
33123On running , two global names are created, ``plusredZ_Z`` and
34−``plusredZ_S``, with no definition. We can use the ``:m`` command at the
35−prompt to find out which holes are still to be solved (or, more
36−precisely, which functions exist but have no definitions), then the
37−``:t`` command to see their types:
124+``plusredZ_S``, with no definition.
38125
39126.. code-block:: idris
40127
41− *theorems> :m
42− Global holes:
43− [plusredZ_S,plusredZ_Z]
128+ *theorems> : idris plusReducesZ.idr -p pruviloj
44129
45−.. code-block:: idris
130+ . / _/___/ /____(_)____
131+ / // __ / ___/ / ___/ Version 1.2.0
132+ _/ // /_/ / / / (__ ) https://www.idris-lang.org/
133+ /___/\__,_/_/ /_/____/ Type :? for help
46134
47− *theorems> :t plusredZ_Z
48− plusredZ_Z : Z = plus Z Z
135+ Idris is free software with ABSOLUTELY NO WARRANTY.
136+ For details type :warranty.
137+ Holes: Main.plusredZ_S, Main.plusredZ_Z
49138
50− *theorems> :t plusredZ_S
51− plusredZ_S : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
139+This tells us that we have two holes ``Main.plusredZ_S`` and ``Main.plusredZ_Z``. We can solve
140+these separately, ``plusredZ_Z`` is the simplest so we will do that first.
52141
53−The ``:p`` command enters interactive proof mode, which can be used to
54−complete the missing definitions.
142+The ``:elab plusredZ_Z`` command enters interactive elaboration mode, which can be used to
143+complete the missing definition for ``plusredZ_Z``.
55144
56145.. code-block:: idris
57146
58− *theorems> :p plusredZ_Z
147+ *plusReducesZ> :elab plusredZ_Z
59148
60− ---------------------------------- (plusredZ_Z) --------
61− {hole0} : Z = plus Z Z
149+ ---------- Goal: ----------
150+ {hole_0} : 0 = 0
62151
63−This gives us a list of premises (above the line; there are none here)
64−and the current goal (below the line; named ``{hole0}`` here). At the
65−prompt we can enter tactics to direct the construction of the proof. In
66−this case, we can normalise the goal with the ``compute`` tactic:
152+This has been normalised to ``0 = 0`` so now we have to prove that ``0`` equals ``0``, which
153+is easy to prove by ``reflexivity`` from the ``pruviloj`` library:
67154
68155.. code-block:: idris
69156
70− -plusredZ_Z> compute
71−
72− ---------------------------------- (plusredZ_Z) --------
73− {hole0} : Z = Z
157+ -Main.plusredZ_Z> reflexivity
158+ plusredZ_Z: No more goals.
74159
75−Now we have to prove that ``Z`` equals ``Z``, which is easy to prove by
76−``Refl``. To apply a function, such as ``Refl``, we use ``refine`` which
77−introduces subgoals for each of the function’s explicit arguments
78−(``Refl`` has none):
160+This tells us that the proof is complete. We can now leave the interactive mode which
161+we entered with the ``:elab`` command. We do this with the ``:qed`` command:
79162
80163.. code-block:: idris
81164
82− -plusredZ_Z> refine Refl
83− plusredZ_Z: no more goals
165+ -Main.plusredZ_Z> :qed
166+ Proof completed!
167+ Main.plusredZ_Z = %runElab (do reflexivity)
168+ Holes: Main.plusredZ_S
84169
85−Here, we could also have used the ``trivial`` tactic, which tries to
86−refine by ``Refl``, and if that fails, tries to refine by each name in
87−the local context. When a proof is complete, we use the ``qed`` tactic
88−to add the proof to the global context, and remove the hole from the
89−unsolved holes list. This also outputs a trace of the proof:
170+This gives us a trace of the proof which is ``plusredZ_Z = %runElab (do reflexivity)``. We
171+can cut & paste this into the hole in the original file. This also tells us that we
172+have another hole ``Main.plusredZ_S`` remaining.
90173
91−.. code-block:: idris
92−
93− -plusredZ_Z> qed
94− plusredZ_Z = proof
95− compute
96− refine Refl
97−
98−.. code-block:: idris
174+This remaining proof is bit more complicated, the following diagram gives an overview:
99175
100− *theorems> :m
101− Global holes:
102− [plusredZ_S]
176+|image|
103177
104−The ``:addproof`` command, at the interactive prompt, will add the proof
105−to the source file (effectively in an appendix). Let us now prove the
106−other required lemma, ``plusredZ_S``:
178+We approach this remaining proof in the same way by using the ``:elab`` command:
107179
108180.. code-block:: idris
109181
110− *theorems> :p plusredZ_S
182+ *plusReducesZ> :elab plusredZ_S
111183
112− ---------------------------------- (plusredZ_S) --------
113− {hole0} : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
184+
185+ ---------- Goal: ----------
186+ {hole_0} : (k : Nat) -> (k = plus k 0) -> S k = S (plus k 0)
114187
115188In this case, the goal is a function type, using ``k`` (the argument
116189accessible by pattern matching) and ``ih`` — the local variable
117190containing the result of the recursive call. We can introduce these as
118−premises using the ``intro`` tactic twice (or ``intros``, which
119−introduces all arguments as premises). This gives:
191+assumptions using the ``intro`` tactic twice. The parameter is entered as
192+a constant of type ``TTName`` which is entered as a backtick with double
193+braces ```{{ih}}``. This gives:
194+
195+.. code-block:: idris
196+
197+ -Main.plusredZ_S> intro `{{k}}
198+
199+ ---------- Assumptions: ----------
200+ k : Nat
201+ ---------- Goal: ----------
202+ {hole_0} : (k = plus k 0) -> S k = S (plus k 0)
203+ -Main.plusredZ_S> intro `{{ih}}
204+
205+ ---------- Assumptions: ----------
206+ k : Nat
207+ ih : k = plus k 0
208+ ---------- Goal: ----------
209+ {hole_0} : S k = S (plus k 0)
210+
211+We know, from the type of ``ih``, that ``k = plus k 0``, so we would
212+like to use this knowledge to replace ``plus k 0`` in the goal with
213+``k``. We can achieve this with the ``rewriteWith`` tactic:
120214
121215.. code-block:: idris
122216
123− k : Nat
124− ih : k = plus k Z
125− ---------------------------------- (plusredZ_S) --------
126− {hole2} : S k = plus (S k) Z
217+ -Main.plusredZ_S> rewriteWith (Var `{{ih}})
127218
128−Since plus is defined by recursion on its first argument, the term
129−``plus (S k) Z`` in the goal can be simplified, so we use ``compute``.
219+ ---------- Assumptions: ----------
220+ k : Nat
221+ ih : k = plus k 0
222+ ---------- Goal: ----------
223+ {hole_0} : S k = S k
224+
225+The ``rewriteWith`` tactic takes an equality proof as an argument, and tries
226+to rewrite the goal using that proof. The ``ih`` value is entered as a constant
227+of type ``TTName`` which is entered as a backtick with double braces ```{{ih}}`` but
228+``rewriteWith`` requires an expression of type ``Raw``, rather than just a name,
229+so the ``Var`` constructor is used to make a variable. Here, it results in an equality
230+which is trivially provable using ``reflexivity``:
130231
131232.. code-block:: idris
132233
133− k : Nat
134− ih : k = plus k Z
135− ---------------------------------- (plusredZ_S) --------
136− {hole2} : S k = S (plus k Z)
234+ -Main.plusredZ_S> reflexivity
235+ plusredZ_S: No more goals.
236+ -Main.plusredZ_S> :qed
237+ Proof completed!
238+ Main.plusredZ_S = %runElab (do intro `{{k}}
239+ intro `{{ih}}
240+ rewriteWith (Var `{{ih}})
241+ reflexivity)
137242
138−We know, from the type of ``ih``, that ``k = plus k Z``, so we would
139−like to use this knowledge to replace ``plus k Z`` in the goal with
140−``k``. We can achieve this with the ``rewrite`` tactic:
243+We can't just cut & paste this into the hole in the original file like this:
141244
142245.. code-block:: idris
143246
144− -plusredZ_S> rewrite ih
247+ import Pruviloj
248+ import Pruviloj.Induction
249+
250+ %language ElabReflection
251+
252+ plusReducesZ' : (n:Nat) -> n = plus n Z
253+ plusReducesZ' Z = %runElab (do reflexivity)
254+ plusReducesZ' (S k) = let ih = plusReducesZ' k in
255+ (%runElab (do intro `{{k}}
256+ intro `{{ih}}
257+ rewriteWith (Var `{{ih}})
258+ reflexivity)
259+ )
145260
146− k : Nat
147− ih : k = plus k Z
148− ---------------------------------- (plusredZ_S) --------
149− {hole3} : S k = S k
261+because this gives the following error:
150262
151− -plusredZ_S>
263+.. code-block:: idris
264+
265+ Idris> :load elabInteractiveEx2.idr
266+ elabInteractiveEx2.idr:10:32:
267+ |
268+ 10 | intro `{{ih}}
269+ | ^
270+ unexpected "in"
271+ expecting dependent type signature
152272
153−The ``rewrite`` tactic takes an equality proof as an argument, and tries
154−to rewrite the goal using that proof. Here, it results in an equality
155−which is trivially provable:
273+However if we put the proof into a separate function like this:
156274
157275.. code-block:: idris
158276
159− -plusredZ_S> trivial
160− plusredZ_S: no more goals
161− -plusredZ_S> qed
162− plusredZ_S = proof {
163− intros;
164− rewrite ih;
165− trivial;
166− }
277+ import Pruviloj
278+ import Pruviloj.Induction
279+
280+ %language ElabReflection
281+
282+ plusredZ_S : (k : Nat) -> (ih:(k = plus k Z)) -> (S k = S (plus k Z))
283+ plusredZ_S = %runElab (do intro `{{k}}
284+ intro `{{ih}}
285+ rewriteWith (Var `{{ih}})
286+ reflexivity)
287+
288+ plusReducesZ' : (n:Nat) -> n = plus n Z
289+ plusReducesZ' Z = %runElab (do reflexivity)
290+ plusReducesZ' (S k) = let ih = plusReducesZ' k in plusredZ_S k ih
291+
292+This then loads [#f1]_ .
293+
294+.. [#f1] https://github.com/idris-lang/Idris-dev/issues/4556
167295
168−Again, we can add this proof to the end of our source file using the
169−``:addproof`` command at the interactive prompt.
296+.. |image| image:: ../image/plusReducesProof.png
docs/proofs/interactiveOld.rstnew file+169
@@ -0,0 +1,169 @@
1+**************************************************************
2+DEPRECATED: Interactive Theorem Proving Using Old Tactics Code
3+**************************************************************
4+
5+.. warning::
6+ The interactive theorem-proving interface documented here has been
7+ deprecated in favor of :ref:`elaborator-reflection`.
8+
9+Idris also supports interactive theorem proving via tactics. This
10+is generally not recommended to be used directly, but rather used as a
11+mechanism for building proof automation which is beyond the scope of this
12+tutorial. In this section, we briefly discus tactics.
13+
14+One way to write proofs interactively is to write the general *structure* of
15+the proof, and use the interactive mode to complete the details.
16+Consider the following definition, proved in :ref:`sect-theorems`:
17+
18+.. code-block:: idris
19+
20+ plusReduces : (n:Nat) -> plus Z n = n
21+
22+We’ll be constructing the proof by *induction*, so we write the cases for ``Z``
23+and ``S``, with a recursive call in the ``S`` case giving the inductive
24+hypothesis, and insert *holes* for the rest of the definition:
25+
26+.. code-block:: idris
27+
28+ plusReducesZ' : (n:Nat) -> n = plus n Z
29+ plusReducesZ' Z = ?plusredZ_Z
30+ plusReducesZ' (S k) = let ih = plusReducesZ' k in
31+ ?plusredZ_S
32+
33+On running , two global names are created, ``plusredZ_Z`` and
34+``plusredZ_S``, with no definition. We can use the ``:m`` command at the
35+prompt to find out which holes are still to be solved (or, more
36+precisely, which functions exist but have no definitions), then the
37+``:t`` command to see their types:
38+
39+.. code-block:: idris
40+
41+ *theorems> :m
42+ Global holes:
43+ [plusredZ_S,plusredZ_Z]
44+
45+.. code-block:: idris
46+
47+ *theorems> :t plusredZ_Z
48+ plusredZ_Z : Z = plus Z Z
49+
50+ *theorems> :t plusredZ_S
51+ plusredZ_S : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
52+
53+The ``:p`` command enters interactive proof mode, which can be used to
54+complete the missing definitions.
55+
56+.. code-block:: idris
57+
58+ *theorems> :p plusredZ_Z
59+
60+ ---------------------------------- (plusredZ_Z) --------
61+ {hole0} : Z = plus Z Z
62+
63+This gives us a list of premises (above the line; there are none here)
64+and the current goal (below the line; named ``{hole0}`` here). At the
65+prompt we can enter tactics to direct the construction of the proof. In
66+this case, we can normalise the goal with the ``compute`` tactic:
67+
68+.. code-block:: idris
69+
70+ -plusredZ_Z> compute
71+
72+ ---------------------------------- (plusredZ_Z) --------
73+ {hole0} : Z = Z
74+
75+Now we have to prove that ``Z`` equals ``Z``, which is easy to prove by
76+``Refl``. To apply a function, such as ``Refl``, we use ``refine`` which
77+introduces subgoals for each of the function’s explicit arguments
78+(``Refl`` has none):
79+
80+.. code-block:: idris
81+
82+ -plusredZ_Z> refine Refl
83+ plusredZ_Z: no more goals
84+
85+Here, we could also have used the ``trivial`` tactic, which tries to
86+refine by ``Refl``, and if that fails, tries to refine by each name in
87+the local context. When a proof is complete, we use the ``qed`` tactic
88+to add the proof to the global context, and remove the hole from the
89+unsolved holes list. This also outputs a trace of the proof:
90+
91+.. code-block:: idris
92+
93+ -plusredZ_Z> qed
94+ plusredZ_Z = proof
95+ compute
96+ refine Refl
97+
98+.. code-block:: idris
99+
100+ *theorems> :m
101+ Global holes:
102+ [plusredZ_S]
103+
104+The ``:addproof`` command, at the interactive prompt, will add the proof
105+to the source file (effectively in an appendix). Let us now prove the
106+other required lemma, ``plusredZ_S``:
107+
108+.. code-block:: idris
109+
110+ *theorems> :p plusredZ_S
111+
112+ ---------------------------------- (plusredZ_S) --------
113+ {hole0} : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
114+
115+In this case, the goal is a function type, using ``k`` (the argument
116+accessible by pattern matching) and ``ih`` — the local variable
117+containing the result of the recursive call. We can introduce these as
118+premises using the ``intro`` tactic twice (or ``intros``, which
119+introduces all arguments as premises). This gives:
120+
121+.. code-block:: idris
122+
123+ k : Nat
124+ ih : k = plus k Z
125+ ---------------------------------- (plusredZ_S) --------
126+ {hole2} : S k = plus (S k) Z
127+
128+Since plus is defined by recursion on its first argument, the term
129+``plus (S k) Z`` in the goal can be simplified, so we use ``compute``.
130+
131+.. code-block:: idris
132+
133+ k : Nat
134+ ih : k = plus k Z
135+ ---------------------------------- (plusredZ_S) --------
136+ {hole2} : S k = S (plus k Z)
137+
138+We know, from the type of ``ih``, that ``k = plus k Z``, so we would
139+like to use this knowledge to replace ``plus k Z`` in the goal with
140+``k``. We can achieve this with the ``rewrite`` tactic:
141+
142+.. code-block:: idris
143+
144+ -plusredZ_S> rewrite ih
145+
146+ k : Nat
147+ ih : k = plus k Z
148+ ---------------------------------- (plusredZ_S) --------
149+ {hole3} : S k = S k
150+
151+ -plusredZ_S>
152+
153+The ``rewrite`` tactic takes an equality proof as an argument, and tries
154+to rewrite the goal using that proof. Here, it results in an equality
155+which is trivially provable:
156+
157+.. code-block:: idris
158+
159+ -plusredZ_S> trivial
160+ plusredZ_S: no more goals
161+ -plusredZ_S> qed
162+ plusredZ_S = proof {
163+ intros;
164+ rewrite ih;
165+ trivial;
166+ }
167+
168+Again, we can add this proof to the end of our source file using the
169+``:addproof`` command at the interactive prompt.
docs/proofs/pluscomm.rst+1−1
@@ -182,7 +182,7 @@ interface rather than using ``plus`` directly. They have the names
182182
183183In the remainder of this tutorial, we will explore several different
184184ways of proving ``plus_commutes`` (or, to put it another way, writing
185−the function.) We will also discuss how to use such equality proofs, and
185+the function). We will also discuss how to use such equality proofs, and
186186see where the need for them arises in practice.
187187
188188.. [1]
docs/proofs/propositional.rstnew file+133
@@ -0,0 +1,133 @@
1+******************************
2+Proving Propositional Equality
3+******************************
4+
5+This page attempts to explain some of the techniques used in Idris to prove propositional equalities.
6+
7+We have seen that definitional equalities can be proved using ``Refl`` since they always normalise to unique values that can be compared directly.
8+
9+However with propositional equalities we are using symbolic variables they do not always normalise.
10+
11+So to take the previous example:
12+
13+.. code-block:: idris
14+
15+ plusReducesR : (n:Nat) -> plus n Z = n
16+
17+In this case ``plus n Z`` does not normalise to ``n``. Even though both sides are equal we cannot pattern match ``Refl``.
18+
19+If the pattern match cannot match for all ``n`` then the way around this is to separately match all possible values of ``n``. In the case of natural numbers we do this by induction.
20+
21+So here:
22+
23+.. code-block:: idris
24+
25+ plusReducesR : n = plus n 0
26+ plusReducesR {n = Z} = Refl
27+ plusReducesR {n = (S k)} = let rec = plus_commutes_Z {n=k} in
28+ rewrite rec in Refl
29+
30+we don't call ``Refl`` to match on ``n = plus n 0`` forall ``n`` we call it for every number separately. So, in the second line, the pattern matcher knows to substitute ``Z`` for ``n`` in the type being matched. This uses ``rewrite`` which is explained below.
31+
32+Replace
33+=======
34+
35+This implements the *indiscernability of identicals* principle, if two terms are equal then they have the same properties. In other words, if ``x=y``, then we can substitute ``y`` for ``x`` in any expression. In our proofs we can express this as:
36+
37+.. code-block:: idris
38+
39+ if x=y
40+ then P x = P y
41+
42+where ``P`` is a pure function representing the property. In the examples below ``P`` is an expression in some variable with a type like this: ``P: n -> Type``.
43+
44+So if ``n`` is a natural number variable then ``P`` could be something like ``2*n + 3``.
45+
46+To use this in our proofs there is the following function in the prelude:
47+
48+.. code-block:: idris
49+
50+ ||| Perform substitution in a term according to some equality.
51+ replace : {a:_} -> {x:_} -> {y:_} -> {P : a -> Type} -> x = y -> P x -> P y
52+ replace Refl prf = prf
53+
54+Removing the implicits, if we supply an equality ``x=y`` and a proof of a property of ``x`` (i.e. ``P x``) then we get a proof of a property of ``y`` (i.e. ``P y``)
55+
56+.. code-block:: idris
57+
58+ > :t replace
59+ replace : (x = y) -> P x -> P y
60+
61+So, in the following example, if we supply ``p1 x`` which is a proof that ``x=2`` and the equality ``x=y`` then we get a proof that ``y=2``.
62+
63+.. code-block:: idris
64+
65+ p1: Nat -> Type
66+ p1 n = (n=2)
67+
68+ testReplace: (x=y) -> (p1 x) -> (p1 y)
69+ testReplace a b = replace a b
70+
71+Rewrite
72+=======
73+
74+Similar to ``replace`` above but Idris provides a nicer syntax which makes ``rewrite`` easier to use in examples like ``plusReducesR`` above.
75+
76+.. code-block:: idris
77+
78+ rewrite__impl : (P : a -> Type) -> x = y -> P y -> P x
79+ rewrite__impl p Refl prf = prf
80+
81+The difference from ``replace`` above is nicer syntax and the property ``p1`` is explicitly supplied and it goes in the opposite direction (input and output reversed).
82+
83+Example: again we supply ``p1`` which is a proof that ``x=2`` and the equality ``x=y`` then we get a proof that ``y=2``.
84+
85+.. code-block:: idris
86+
87+ p1: Nat -> Type
88+ p1 x = (x=2)
89+
90+ testRewrite2: (x=y) -> (p1 y) -> (p1 x)
91+ testRewrite2 a b = rewrite a in b
92+
93+We can think of rewrite doing this:
94+
95+ * start with a equation ``x=y`` and a property ``P: x -> Type``;
96+ * search ``y`` in ``P``;
97+ * replace all occurrences of ``y`` with ``x`` in ``P``.
98+
99+That is, we are doing a substitution.
100+
101+Symmetry and Transitivity
102+=========================
103+
104+In addition to *reflexivity* equality also obeys *symmetry* and *transitivity* and these are also included in the prelude:
105+
106+.. code-block:: idris
107+
108+ ||| Symmetry of propositional equality
109+ sym : {left:a} -> {right:b} -> left = right -> right = left
110+ sym Refl = Refl
111+
112+ ||| Transitivity of propositional equality
113+ trans : {a:x} -> {b:y} -> {c:z} -> a = b -> b = c -> a = c
114+ trans Refl Refl = Refl
115+
116+Heterogeneous Equality
117+======================
118+
119+Also included in the prelude:
120+
121+.. code-block:: idris
122+
123+ ||| Explicit heterogeneous ("John Major") equality. Use this when Idris
124+ ||| incorrectly chooses homogeneous equality for `(=)`.
125+ ||| @ a the type of the left side
126+ ||| @ b the type of the right side
127+ ||| @ x the left side
128+ ||| @ y the right side
129+ (~=~) : (x : a) -> (y : b) -> Type
130+ (~=~) x y = (x = y)
131+
132+
133+
docs/reference/codegen.rstnew file+147
@@ -0,0 +1,147 @@
1+.. _code-generation-targets:
2+
3+************************
4+Code Generation Targets
5+************************
6+
7+``Idris`` has been designed such that the compiler can generate code for
8+different backends upon request. By default ``Idris`` generates a ``C``
9+backend when generating an executable. Included within the standard Idris installation are backends for Javascript and Node.js.
10+
11+However, there are third-party code generators out there. Below we
12+describe some of these backends and how you can use them when
13+compiling your ``Idris`` code. If you want to write your own codegen for your language there is a `stub project on GitHub <https://github.com/idris-lang/idris-emptycg>`__ that can help point you in the right direction.
14+
15+Official Backends
16+==================
17+
18+C Language
19+----------
20+
21+The default target of Idris is C. In order to view the generated C code, compile via:
22+
23+::
24+
25+ $ idris hello.idr -S -o hello.c
26+
27+
28+Javascript
29+----------
30+
31+To generate code that is tailored for running in the browser
32+issue the following command:
33+
34+::
35+
36+ $ idris --codegen javascript hello.idr -o hello.js
37+
38+
39+Idris can produce big chunks of JavaScript code (hello world weighs in at about
40+60 lines). However, the generated code can be minified using the
41+`closure-compiler <https://developers.google.com/closure/compiler/>`__ from
42+Google.
43+
44+::
45+
46+ java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js
47+
48+
49+Node.js
50+-------
51+
52+Generating code for NodeJS is slightly different. Idris outputs a
53+JavaScript file that can be directly executed via node.
54+
55+::
56+
57+ $ idris --codegen node hello.idr -o hello
58+ $ ./hello
59+ Hello world
60+
61+
62+
63+Third Party
64+============
65+
66+.. note::
67+
68+ These are third-party code generations and may have bit-rotted or
69+ do not work with current versions of Idris. Please speak to the
70+ project's maintainors if there are any problems.
71+
72+
73+CIL (.NET, Mono, Unity)
74+-----------------------
75+
76+::
77+
78+ idris --codegen cil Main.idr -o HelloWorld.exe \
79+ && mono HelloWorld.exe
80+
81+The resulting assemblies can also be used with .NET or Unity.
82+
83+Requires `idris-cil <https://github.com/bamboo/idris-cil>`__.
84+
85+Erlang
86+------
87+
88+`Available online <https://github.com/lenary/idris-erlang>`__
89+
90+Java
91+----
92+
93+`Available online <https://github.com/idris-hackers/idris-java>`__
94+
95+
96+::
97+
98+ idris hello.idr --codegen java -o hello.jar
99+
100+
101+Note: The resulting .jar is automatically prefixed by a header including
102+an .sh script to allow executing it directly.
103+
104+JVM
105+---
106+
107+`Available online <https://github.com/mmhelloworld/idris-jvm>`__
108+
109+LLVM
110+-----
111+
112+`Available online <https://github.com/idris-hackers/idris-llvm>`__
113+
114+Malfunction
115+------------
116+
117+`Available online <https://github.com/stedolan/idris-malfunction>`__
118+
119+Ocaml
120+-----
121+
122+`Available online <https://github.com/ziman/idris-ocaml>`__
123+
124+PHP
125+---
126+
127+`Available online <https://github.com/edwinb/idris-php>`__
128+
129+Python
130+------
131+
132+`Available online <https://github.com/ziman/idris-py>`__
133+
134+Ruby
135+----
136+
137+`Available online <https://github.com/mrb/idris-ruby>`__
138+
139+WS
140+---
141+
142+`Available online <https://github.com/edwinb/WS-idr>`__
143+
144+WebAssembly
145+-----------
146+
147+`Available online <https://github.com/SPY/idris-codegen-wasm>`__
docs/reference/compilation.rst+59−35
@@ -1,6 +1,6 @@
1−***********************
2−Compilation and Logging
3−***********************
1+************************************
2+Compilation, Logging, and Reporting
3+************************************
44
55This section provides information about the Idris compilation process, and
66provides details over how you can follow the process through logging.
@@ -41,23 +41,39 @@ With Idris you can ask it to terminate the compilation process after type checki
4141
4242Use of this option will still result in the generation of the Idris binary ``.ibc`` files, and is suitable if you do not wish to generate code from one of the supported backends.
4343
44−Logging Output
45−==============
44+Reporting Compilation Process
45+=============================
4646
47−The internal operation of Idris is captured using a category based logger.
48−Currently, the logging infrastructure has support for the following categories:
47+During compilation the reporting of Idris' progress can be controlled
48+by setting a verbosity level.
4949
50−+ Parser
51−+ Elaborator
52−+ Code generation
53−+ Erasure
54−+ Coverage Checking
55−+ IBC generation
50++ ``-V``, or alternatively ``--verbose`` and ``--V0``, will report which file Idris is currently type checking.
51++ ``--V1`` will additionally report: Parsing, IBC Generation, and Code
52+ Generation.
53++ ``--V2`` will additionally report: Totality Checking, Universe
54+ Checking, and the individual steps prior to code generation.
55+
56+
57+By default Idris' progress reporting is set to quiet: ``-q``, or ``--quiet``.
58+
59+Logging Internal Operation
60+===========================
61+
62+For those that develop on the Idris compiler, the internal operation
63+of Idris is captured using a category based logger. Currently, the
64+logging infrastructure has support for the following categories:
65+
66++ Parser (``parser``)
67++ Elaborator (``elab``)
68++ Code generation (``codegen``)
69++ Erasure (``erasure``)
70++ Coverage Checking (``coverage``)
71++ IBC generation (``ibc``)
5672
5773
5874These categories are specified using the command-line option:
5975``--logging-categories CATS``, where ``CATS`` is a quoted colon
60−seperated string of the categories you want to see. By default if this
76+separated string of the categories you want to see. By default if this
6177option is not specified all categories are allowed. Sub-categories
6278have yet to be defined but will be in the future, especially for the
6379elaborator.
@@ -84,24 +100,32 @@ Environment Variables
84100Several paths set by default within the Idris compiler can be
85101overridden through environment variables. The provided variables are:
86102
87−* `IDRIS_CC` Change the `C` compiler used by the `C` backend.
88−* `IDRIS_CFLAGS` Change the `C` flags passed to the `C` compiler.
89−* `TARGET` Change the target directory to generate files.
90−* `IDRIS_LIBRARY_PATH` Change the location of where installed packages are found.
91−
92−Alternativly, and perhaps a cleaner approach is to configure these
93−options using the CLI options. Idris also supports options to augment
94−the paths used, and pass options to the code generator backend.
95−
96−The option `--cg-opt <ARG>` can be used to pass options to the code
97−generator. The format of `<ARG>` is dependent on the selected backend.
98−
99−Further, Idris does support multiple include paths. The CLI option
100−`-i <dir>` allows you to add a directory to the library search path; this
101−option can be used multiple times. This is a cleaner option when you
102−wish to add single directories to the `IDRIS_LIBRARY_PATH` than
103−ammending `IDRIS_LIBRARY_PATH` directly.
104−To add directories to the source search path, use the `--sourcepath <dir>` option.
105−
106−Moreover, rather than using `TARGET` the CLI option `--ibcsubdir` can
107−be used to direct where built IBC files are placed.
103+* ``IDRIS_CC`` Change the *C compiler* used by the *C backend*.
104+* ``IDRIS_CFLAGS`` Change the *C flags* passed to the *C compiler*.
105+* ``TARGET`` Change the target directory i.e. *data dir* where Idris installs files when installing using Cabal/Stack.
106+* ``IDRIS_LIBRARY_PATH`` Change the location of where installed packages are found/installed.
107+* ``IDRIS_DOC_PATH`` Change the location of where generated idrisdoc for packages are installed.
108+
109+.. note::
110+
111+ In versions of Idris prior to 0.12.3 the environment variables
112+ ``IDRIS_LIBRARY_PATH`` and ``TARGET`` were both used to affect the
113+ installation of single packages and direct where Idris installed
114+ its data. The meaning of these variables has changed, and command
115+ line options are preferred when changing where individual packages
116+ are installed.
117+
118+The CLI option ``--ibcsubdir`` can be used to direct where generated IBC
119+files are placed. However, this means Idris will install files in a
120+non-standard location separate from the rest of the installed
121+packages. The CLI option ``--idrispath <dir>`` allows you to add a
122+directory to the library search path; this option can be used multiple
123+times and can be shortened to ``-i <dir>``. Similary, the ``--sourcepath
124+<dir>`` option can be used to add directories to the source search
125+path. There is no shortened version for this option as ``-s`` is a
126+reserved flag.
127+
128+Further, Idris also supports options to augment the paths used, and
129+pass options to the code generator backend. The option ``--cg-opt
130+<ARG>`` can be used to pass options to the code generator. The format
131+of ``<ARG>`` is dependent on the selected backend.
docs/reference/documenting.rst+8−1
@@ -61,7 +61,14 @@ italics correctly). A comprehensive set of examples is given below.
6161 ||| Add some numbers.
6262 |||
6363 ||| Addition is really great. This paragraph is not part of the overview.
64− ||| Still the same paragraph. Lists are also nifty:
64+ ||| Still the same paragraph.
65+ |||
66+ ||| You can even provide examples which are inlined in the documentation:
67+ ||| ```idris example
68+ ||| add 4 5
69+ ||| ```
70+ |||
71+ ||| Lists are also nifty:
6572 ||| * Really nifty!
6673 ||| * Yep!
6774 ||| * The name `add` is a **bold** choice
docs/reference/erasure.rst+5−5
@@ -103,7 +103,7 @@ that's a moot point for two reasons:
103103
104104This ought not to be the case since the ``Nat`` are never used at
105105runtime and they are only there for typechecking purposes. Hence we
106−should get rid of them and get runtime code similar to what a idris
106+should get rid of them and get runtime code similar to what an Idris
107107programmer would write.
108108
109109U-views of lists
@@ -127,7 +127,7 @@ For better intuition, the shape of the U-view of
127127
128128 x0 y0 (two)
129129 x1 y1 (two)
130− x2 y1 (two)
130+ x2 y2 (two)
131131 z (one)
132132
133133When recursing over this structure, the values of ``xs`` range over
@@ -254,7 +254,7 @@ Benchmarks
254254==========
255255
256256- source: https://github.com/ziman/idris-benchmarks
257−- results: http://ziman.functor.sk/erasure-bm/
257+- results: https://ziman.functor.sk/erasure-bm/
258258
259259It can be clearly seen that asymptotics are improved by erasure.
260260
@@ -269,7 +269,7 @@ Usage warnings are quite bad and unhelpful at the moment. We should
269269include more information and at least translate argument numbers to
270270their names.
271271
272−There is no decent documentation yet. This wiki page is the first one.
272+There is no decent documentation yet. This page is the first one.
273273
274274There is no generally accepted terminology. We switch between
275275"dotted", "unused", "erased", "irrelevant", "inaccessible", while each
@@ -499,4 +499,4 @@ References
499499
500500.. [BMM04] Edwin Brady, Conor McBride, James McKinna: `Inductive
501501 families need not store their indices
502− <http://citeseerx.ist.psu.edu/viewdoc/summary;jsessionid=1F796FCF0F2C4C535FC70F62BE2FB821?doi=10.1.1.62.3849>`__
502+ <https://citeseerx.ist.psu.edu/viewdoc/summary;jsessionid=1F796FCF0F2C4C535FC70F62BE2FB821?doi=10.1.1.62.3849>`__
docs/reference/ffi.rst+178−8
@@ -115,6 +115,26 @@ For C, this is:
115115 FFI_C : FFI
116116 FFI_C = MkFFI C_Types String String
117117
118+Linking foreign code
119+====================
120+
121+This is the example of linking C code.
122+
123+.. code-block:: idris
124+
125+ %include C "mylib.h"
126+ %link C "mylib.o"
127+
128+Example Makefile
129+
130+.. code-block:: shell
131+
132+ DEFAULT: mylib.o main.idr
133+ idris main.idr -o executableFile
134+
135+ clean:
136+ rm -f executableFile mylib.o main.ibc
137+
118138Foreign calls
119139=============
120140
@@ -164,7 +184,7 @@ library function ``qsort`` which takes a pointer to a comparison function.
164184 myComparer = ...
165185
166186 qsort : Ptr -> Int -> Int -> IO ()
167− test2 data elems elsize = foreign FFI_C "qsort"
187+ qsort data elems elsize = foreign FFI_C "qsort"
168188 (Ptr -> Int -> Int -> CFnPtr (Ptr -> Ptr -> Int) -> IO ())
169189 data elems elsize (MkCFnPtr myComparer)
170190
@@ -178,9 +198,16 @@ compilation error:
178198 example : (Int -> ()) -> IO ()
179199 example f = foreign FFI_C "callbacker" (CFnPtr (Int -> ()) -> IO ()) f
180200
181−The other big limitation is that it doesn't support IO functions. Use
182−``unsafePerformIO`` to wrap them (i.e. to make an IO function usable as a callback, change the return type
183−from IOr to r, and change the = do to = unsafePerformIO $ do).
201+Note that the function that is used as a callback can't be a closure, that is
202+it can't be a partially applied function. This is because the mechanism used is
203+unable to pass the closed-over values through C. If we want to pass Idris values
204+to the callback we have to pass them through C explicitly. Non-primitive Idris
205+values can be passed to C via the ``Raw`` type.
206+
207+The other big limitation is that it doesn't support ``IO`` functions. Use
208+``unsafePerformIO`` to wrap them (i.e. to make an ``IO`` function usable as a
209+callback, change the return type from ``IO r`` to ``r``, and change the ``= do``
210+to ``= unsafePerformIO $ do``).
184211
185212There are two special function names:
186213``%wrapper`` returns the function pointer that wraps an Idris function. This
@@ -217,14 +244,157 @@ global variable with the following name. The type must be just ``IO Ptr``.
217244 errno : IO Ptr
218245 errno = foreign FFI_C "&errno" (IO Ptr)
219246
220−For more complicated interactions with C (such as reading and setting fields of a C struct), there is
221−a module CFFI available in the contrib package.
247+If the foreign name is prefixed by a ``#``, the name is pasted in literally. This is
248+useful to access constants that are preprocessor definitions (like ``INT_MAX``).
249+
250+.. code-block:: idris
251+
252+ %include C "limits.h"
253+
254+ -- access the preprocessor definition INT_MAX
255+ intMax : IO Int
256+ intMax = foreign FFI_C "#INT_MAX" (IO Int)
257+
258+ main : IO ()
259+ main = print !intMax
260+
261+For more complicated interactions with C (such as reading and setting fields
262+of a C ``struct``), there is a module C FFI available in the contrib package.
263+
264+C heap
265+------
266+
267+Idris has two heaps where objects can be allocated:
268+
269++--------------------------------------+---------------------------------------+
270+| FP heap | C heap |
271++======================================+=======================================+
272+| Cheney-collected | Mark-and-sweep-collected |
273++--------------------------------------+---------------------------------------+
274+| Garbage collections touches only | Garbage collection has to traverse |
275+| live objects. | all registered items. |
276++--------------------------------------+---------------------------------------+
277+| Ideal for FP-style rapid allocation | Ideal for C-style allocation of a few |
278+| of lots of small short-lived pieces | big buffers. |
279+| of memory, such as data constructors.| |
280++--------------------------------------+---------------------------------------+
281+| Finalizers are impossible to support | Items have finalizers that are called |
282+| reasonably. | on deallocation. |
283++--------------------------------------+---------------------------------------+
284+| Data is copied all the time (when | Copying does not happen. |
285+| collecting garbage, modifying data, | |
286+| registering managed pointers, etc.) | |
287++--------------------------------------+---------------------------------------+
288+| Contains objects of various types. | Contains C heap items: ``(void *)`` |
289+| | pointers with finalizers. A finalizer |
290+| | is a routine that deallocates the |
291+| | resources associated with the item. |
292++--------------------------------------+---------------------------------------+
293+| Fixed set of object types. | The data pointer may point |
294+| | to anything, as long as the finalizer |
295+| | cleans up correctly. |
296++--------------------------------------+---------------------------------------+
297+| Not suitable for C resources and | Suitable for C resources and arbitrary|
298+| arbitrary pointers. | pointers. |
299++--------------------------------------+---------------------------------------+
300+| Values form a compact memory block. | Items are kept in a linked list. |
301++--------------------------------------+---------------------------------------+
302+| Any Idris value, most notably | Items represented by the |
303+| ``ManagedPtr``. | Idris type ``CData``. |
304++--------------------------------------+---------------------------------------+
305+| Data of ``ManagedPtr`` allocated | Data allocated in C, pointer copied |
306+| in C, buffer then copied into the FP | into the C heap. |
307+| heap. | |
308++--------------------------------------+---------------------------------------+
309+| Allocation and reallocation not | Allocated and reallocate freely in C, |
310+| possible from C code (without having | registering the allocated items |
311+| a reference to the VM). Everything | in the FFI. |
312+| is copied instead. | |
313++--------------------------------------+---------------------------------------+
314+
315+The FP heap is the primary heap. It may contain values of type ``CData``,
316+which are references to items in the C heap. A C heap item contains
317+a ``(void *)`` pointer and the corresponding finalizer. Once a C heap item
318+is no longer referenced from the FP heap, it is marked as unused and
319+the next GC sweep will call its finalizer and deallocate it.
320+
321+There is no Idris interface for ``CData`` other than its type and FFI.
322+
323+Usage from C code
324+~~~~~~~~~~~~~~~~~
325+
326+* Although not enforced in code, ``CData`` is meant to be opaque
327+ and non-RTS code (such as libraries or C bindings) should
328+ access only its ``(void *)`` field called ``data``.
329+
330+* Feel free to mutate both the pointer ``data`` (eg. after calling ``realloc``)
331+ and the memory it points to. However, keep in mind
332+ that this must not break Idris's referential transparency.
333+
334+* **WARNING!** If you call ``cdata_allocate`` or ``cdata_manage``,
335+ the resulting ``CData`` object *must* be returned from your
336+ FFI function so that it is inserted in the C heap by the RTS.
337+ Otherwise the memory will be leaked.
338+
339+.. code:: idris
340+
341+ some_allocating_fun : Int -> IO CData
342+ some_allocating_fun i = foreign FFI_C "some_allocating_fun" (Int -> IO CData) i
343+
344+ other_fun : CData -> Int -> IO Int
345+ other_fun cd i = foreign FFI_C "other_fun" (CData -> Int -> IO Int) cd i
346+
347+.. code:: cpp
348+
349+ #include "idris_rts.h"
350+
351+ static void finalizer(void * data)
352+ {
353+ MyStruct * ptr = (MyStruct *) data;
354+ free_something(ptr->something);
355+ free(ptr);
356+ }
357+
358+ CData some_allocating_fun(int arg)
359+ {
360+ size_t size = sizeof(...);
361+ void * data = (void *) malloc(size);
362+ // ...
363+ return cdata_manage(data, size, finalizer);
364+ }
365+
366+ int other_fun(CData cd, int arg)
367+ {
368+ int result = foo(cd->data);
369+ return result;
370+ }
371+
372+The ``Raw`` type constructor allows you to access or return a runtime
373+representation of the value. For instance, if you want to copy a string
374+generated from C code into an Idris value, you may want to return a
375+``Raw String`` instead of a ``String`` and use ``MKSTR`` or ``MKSTRlen`` to
376+copy it over.
377+
378+.. code-block:: idris
379+
380+ getString : () -> IO (Raw String)
381+ getString () = foreign FFI_C "get_string" (IO (Raw String))
382+
383+.. code-block:: cpp
384+
385+ const VAL get_string ()
386+ {
387+ char * c_string = get_string_allocated_with_malloc()
388+ const VAL idris_string = MKSTR(get_vm(), c_string);
389+ free(c_string);
390+ return idris_string
391+ }
222392
223393FFI implementation
224394------------------
225395
226396In order to write bindings to external libraries, the details of how
227−``foreign`` works are unnecessary --- you simply need to know that
397+``foreign`` works are unnecessary: you simply need to know that
228398``foreign`` takes an FFI descriptor, the function name, and its
229399type. It is instructive to look a little deeper, however:
230400
@@ -361,4 +531,4 @@ timeouts:
361531 timeout <- jscall "setTimeout(%0, %1)"
362532 (JsFn (() -> JS_IO ()) -> Int -> JS_IO Ptr)
363533 (MkJsFn f) millis
364− return $ MkTimeout timeout
534+ pure $ MkTimeout timeout
docs/reference/ide-protocol.rst+21−11
@@ -45,15 +45,12 @@ This is achieved by the already seen ``:load-file`` command.
4545
4646The available commands include:
4747
48− ``(:load-file FILENAME)``
49− Load the named file.
48+ ``(:load-file FILENAME [LINE])``
49+ Load the named file. If a ``LINE`` number is provided, the file is only loaded up to that line. Otherwise, the entire file is loaded.
5050
5151 ``(:interpret STRING)``
5252 Interpret ``STRING`` at the Idris REPL, returning a highlighted result.
5353
54− ``(:repl-completions STRING)``
55− Return the result of tab-completing ``STRING`` as a REPL command.
56−
5754 ``(:type-of STRING)``
5855 Return the type of the name, written with Idris syntax in the ``STRING``.
5956 The reply may contain highlighting information.
@@ -77,13 +74,23 @@ The available commands include:
7774 Create a with-rule pattern match template for the clause of function ``NAME`` on line ``LINE``.
7875 The new code is returned with no highlighting.
7976
77+ ``(:make-case LINE NAME)``
78+ Create a case pattern match template for the clause of function ``NAME`` on line ``LINE``.
79+ The new code is returned with no highlighting.
80+
81+ ``(:make-lemma LINE NAME)``
82+ Create a top level function with a type which solves the hole named ``NAME`` on line ``LINE``.
83+
8084 ``(:proof-search LINE NAME HINTS)``
81− Attempt to fill out the holes on ``LINE```named ``NAME`` by proof search.
85+ Attempt to fill out the holes on ``LINE`` named ``NAME`` by proof search.
8286 ``HINTS`` is a possibly-empty list of additional things to try while searching.
8387
84− ``(:docs-for NAME)``
85− Look up the documentation for ``NAME``, and return it as a highlighted string.
86−
88+ ``(:docs-for NAME [MODE])``
89+ Look up the documentation for ``NAME``, and return it as a highlighted string. If ``MODE`` is ``:overview``, only the first paragraph of documentation is provided for ``NAME``. If ``MODE`` is ``:full``, or omitted, the full documentation is returned for ``NAME``.
90+
91+ ``(:apropos STRING)``
92+ Search the documentation for mentions of ``STRING``, and return any found as a list of highlighted strings.
93+
8794 ``(:metavariables WIDTH)``
8895 List the currently-active holes, with their types pretty-printed with ``WIDTH`` columns.
8996
@@ -106,12 +113,15 @@ The available commands include:
106113 Return a highlighted string consisting of the results of making all arguments in serialised term ``TM`` (which would previously have been sent as the ``tt-term`` property of a string) follow their usual implicitness setting.
107114
108115 ``(:elaborate-term TM)``
109− Return a highlighted string consisting of the the core language term corresponding to serialised term ``TM`` (which would previously have been sent as the ``tt-term`` property of a string).
116+ Return a highlighted string consisting of the core language term corresponding to serialised term ``TM`` (which would previously have been sent as the ``tt-term`` property of a string).
110117
111118 ``(:print-definition NAME)``
112119 Return the definition of ``NAME`` as a highlighted string.
113120
114− ``(:version UID)``
121+ ``(:repl-completions NAME)``
122+ Search names, types and documentations which contain ``NAME``. Return the result of tab-completing ``NAME`` as a REPL command.
123+
124+ ``:version``
115125 Return the version information of the Idris compiler.
116126
117127
docs/reference/index.rst+6−2
@@ -14,24 +14,28 @@ This will tell you how Idris works, for using it you should read the Idris Tutor
1414 Idris Community* has waived all copyright and related or neighboring
1515 rights to Documentation for Idris.
1616
17− More information concerning the CC0 can be found online at: http://creativecommons.org/publicdomain/zero/1.0/
17+ More information concerning the CC0 can be found online at: https://creativecommons.org/publicdomain/zero/1.0/
1818
1919
2020.. toctree::
2121 :maxdepth: 1
2222
23+ codegen
2324 documenting
2425 packages
2526 uniqueness-types
2627 ffi
2728 syntax-guide
29+ syntax-reference
2830 erasure
2931 ide-protocol
3032 semantic-highlighting
3133 tactics
3234 repl
3335 compilation
36+ internals
3437 language-features
3538 language-extensions
36− elaborator-reflection
39+ type-directed-search
40+ partial-evaluation
3741 misc
docs/reference/internals.rstnew file+179
@@ -0,0 +1,179 @@
1+*****************
2+Idris' Internals
3+*****************
4+
5+Note: this is still a fairly raw set of notes taken by David
6+Christiansen at Edwin's presentation at the 2013 Idris Developers
7+Meeting. They're in the process of turning into a useful guide - feel
8+free to contribute.
9+
10+This document assumes that you are already familiar with Idris. It is
11+intended for those who want to work on the internals.
12+
13+People looking to develop new back ends may want to look at
14+:ref:`code-generation-targets`
15+
16+Core/TT.hs
17+==========
18+
19+Idris is compiled to a simple, explicit core language. This core
20+language is called TT because it looks a bit like a Π. It's a minimal
21+language, with a locally nameless representation. That is, local
22+variables are represented with de Bruijn indices and globally-defined
23+constants are represented with names.
24+
25+The ``TT`` datatype uses a trick that is common in the Idris code: it is
26+polymorphic over the type of names stored in it, and it derives
27+``Functor``. This allows ``fmap`` to be used as a general-purpose
28+traversal.
29+
30+There is a general construction for binders, used for λ, Π, and
31+let-bindings. These are distinguished using a ``BinderType``.
32+
33+During compilation, some terms (especially types) will be erased. This
34+is represented using the ``Erased`` constructor of ``TT``. A handy trick
35+when generating TT terms is to insert ``Erased`` where a term is
36+uniquely determined, as the typechecker will fill it out.
37+
38+The constructor ``Proj`` is a result of the optimizer. It is used to
39+extract a specific constructor argument, in a more economical way than
40+defining a new pattern-matching operation.
41+
42+The datatype ``Raw`` represents terms that have not yet been
43+typechecked. The typechecker converts a ``Raw`` to a ``TT`` if it can.
44+
45+Core/CaseTree.hs
46+================
47+
48+Case trees are used to represent top-level pattern-matching definitions
49+in the TT language.
50+
51+Just as with the ``TT`` datatype, the ``deriving Functor`` trick is used
52+with ``SC`` and ``CaseAlt`` to get GHC to generate a function for
53+mapping over contained terms.
54+
55+Constructor cases (``ConCase`` in ``CaseAlt``) refer to numbered
56+constructors. Every constructor is numbered *0,1,2,…*. At this stage in
57+the compiler, the tags are datatype-local. After defunctionalization,
58+however, they are made globally unique.
59+
60+The ``n+1`` patterns (``SucCase``) and hacky-seeming things are to make
61+code fast -- please ask before "cleaning up" the representation.
62+
63+Core/Evaluate.hs
64+================
65+
66+This module contains the main evaluator for Idris. The evaluator is used
67+both at the REPL and during type checking, where normalised terms need
68+to be compared for equality.
69+
70+A key datatype in the evaluator is a *context*. Contexts are mappings
71+from global names to their values, but they are organized to make
72+type-directed disambiguation quick. In particular, the main part of a
73+name that a user might type is used as the key, and its values are maps
74+from namespaces to actual values.
75+
76+The datatype ``Def`` represents a definition in the global context. All
77+global names map to this structure.
78+
79+``Type`` and ``Term`` are both synonyms for ``TT``.
80+
81+Datatypes are represented by a ``TyDecl`` with the appropriate
82+``NameType``. A ``Function`` is a global constant term with an annotated
83+type, ``Operator`` represents primitives implemented in Haskell, and
84+``CaseOp`` represents ordinary pattern-matching definitions. ``CaseOp``
85+has four versions for different purposes, and all are saved because
86+that's easiest.
87+
88+``CaseInfo``: the ``tc_dictionary`` is because it's a type class
89+dictionary which makes totality checking easier.
90+
91+The ``normalise*`` functions give different behaviors - but
92+``normalise`` is the most common.
93+
94+- ``normaliseC`` - "resolved" means with names converted to de Bruijn
95+ indices as appropriate;
96+
97+- ``normaliseAll`` - reduce everything, even if it's non-total;
98+
99+- ``normaliseTrace`` - special-purpose for debugging.
100+
101+``simplify`` - reduce the things that are small - the list argument is
102+the things to not reduce.
103+
104+Core/Typecheck.hs
105+=================
106+
107+Standard stuff. Hopefully no changes are necessary.
108+
109+Core/Elaborate.hs
110+=================
111+
112+Idris definitions are elaborated one by one and turned into the
113+corresponding ``TT``. This is done with a tactic language as an EDSL in the
114+``Elab`` monad (or ``Elab'`` when there's a custom state).
115+
116+Lots of plumbing for errors.
117+
118+All elaboration is relative to a global context.
119+
120+The string in the pair returned by elaborate is log information.
121+
122+See JFP paper, but the names don't necessarily map to each other. The
123+paper is the "idealized version" without logging, additional state, etc.
124+
125+All the tactics take ``Raw`` s, typechecking happens there.
126+
127+``claim (x : t)`` assumes a new ``x : t``.
128+
129+PLEASE TIDY THINGS UP!
130+
131+``proofSearch`` flag is to try whether the failure came from a human (so
132+fail) or from a machine (so continue)
133+
134+Idris-level syntax for providing alternatives explicitly: ``(| x, y, z
135+|)`` try ``x``, ``y``, ``z`` in order, and take the first that succeeds.
136+
137+Core/ProofState.hs
138+==================
139+
140+Core/Unify.hs
141+=============
142+
143+Deals with unification. Unification can reply with:
144+
145+- this works
146+- this can never work
147+- this will work if these other unification problems work out (e.g.
148+ unifying ``f x`` with ``1``)
149+
150+``match_unify``: same thing as unification except it's just matching name
151+against name, term against term. ``x + y`` matches to ``0 + y`` with
152+``x = 0``. Used for ``<==`` syntax as well as type class resolution.
153+
154+Idris/AbsSyntaxTree.hs
155+======================
156+
157+``PTerm`` is the datatype of Idris syntax. ``P`` is for *Program*.
158+Each ``PTerm`` turns into a TT term by applying a series of tactics.
159+
160+``IState`` is the major interpreter state. The global context is the
161+``tt_ctxt`` field.
162+
163+``Ctxt`` maps possibly ambiguous names to their referents.
164+
165+Idris/ElabDecls.hs
166+==================
167+
168+This is where the actual elaboration from ``PTerm`` to ``TT`` happens.
169+
170+Idris/ElabTerm.hs
171+=================
172+
173+``build`` is the function that creates a ``Raw``. All the "junk" is to deal with
174+things like metavars and so forth. It has to remember what names are
175+still to be defined, and it doesn't yet know the type (filled in by
176+unificaiton later). Also case expressions have to turn into top-level
177+functions.
178+
179+``resolveTC`` is type class resolution.
docs/reference/language-extensions.rst+8−3
@@ -3,13 +3,12 @@ Language Extensions
33*******************
44
55
6−
76Type Providers
87===============
98
109Idris type providers are a way to get the type system to reflect
1110observations about the world outside of Idris. Similarly to `F# type
12−providers <http://msdn.microsoft.com/en-us/library/vstudio/hh156509.aspx>`__,
11+providers <https://msdn.microsoft.com/en-us/library/vstudio/hh156509.aspx>`__,
1312they cause effectful computations to run during type checking, returning
1413information that the type checker can use when checking the rest of the
1514program. While F# type providers are based on code generation, Idris
@@ -32,5 +31,11 @@ to the user.
3231Example Idris type providers can be seen at `this
3332repository <https://github.com/david-christiansen/idris-type-providers>`__.
3433More detailed descriptions are available in David Christiansen's `WGP
35−'13 paper <http://dx.doi.org/10.1145/2502488.2502495>`__ and `M.Sc.
34+'13 paper <https://dx.doi.org/10.1145/2502488.2502495>`__ and `M.Sc.
3635thesis <http://itu.dk/people/drc/david-christiansen-thesis.pdf>`__.
36+
37+Elaborator Reflection
38+=====================
39+
40+Another way to extend the language is elaborator reflection which is described
41+in the :ref:`elaborator-index` section.
docs/reference/misc.rst+10−117
@@ -51,7 +51,7 @@ some constructors of proofs.
5151
5252::
5353
54− syntax Trivial = (| oh, refl |)
54+ syntax Trivial = (| Oh, Refl |)
5555
5656
5757Totality checking assertions
@@ -100,113 +100,6 @@ follows:
100100 (x :: qsort (assert_smaller (x :: xs) (filter (>= x) xs))))
101101
102102
103−C heap
104−======
105−
106−Idris has two heaps where objects can be allocated:
107−
108−+--------------------------------------+---------------------------------------+
109−| FP heap | C heap |
110−+======================================+=======================================+
111−| Cheney-collected | Mark-and-sweep-collected |
112−+--------------------------------------+---------------------------------------+
113−| Garbage collections touches only | Garbage collection has to traverse |
114−| live objects. | all registered items. |
115−+--------------------------------------+---------------------------------------+
116−| Ideal for FP-style rapid allocation | Ideal for C-style allocation of a few |
117−| of lots of small short-lived pieces | big buffers. |
118−| of memory, such as data constructors.| |
119−+--------------------------------------+---------------------------------------+
120−| Finalizers are impossible to support | Items have finalizers that are called |
121−| reasonably. | on deallocation. |
122−+--------------------------------------+---------------------------------------+
123−| Data is copied all the time (when | Copying does not happen. |
124−| collecting garbage, modifying data, | |
125−| registering managed pointers, etc.) | |
126−+--------------------------------------+---------------------------------------+
127−| Contains objects of various types. | Contains C heap items: ``(void *)`` |
128−| | pointers with finalizers. A finalizer |
129−| | is a routine that deallocates the |
130−| | resources associated with the item. |
131−+--------------------------------------+---------------------------------------+
132−| Fixed set of object types. | The data pointer may point |
133−| | to anything, as long as the finalizer |
134−| | cleans up correctly. |
135−+--------------------------------------+---------------------------------------+
136−| Not suitable for C resources and | Suitable for C resources and arbitrary|
137−| arbitrary pointers. | pointers. |
138−+--------------------------------------+---------------------------------------+
139−| Values form a compact memory block. | Items are kept in a linked list. |
140−+--------------------------------------+---------------------------------------+
141−| Any Idris value, most notably | Items represented by the |
142−| ``ManagedPtr``. | Idris type ``CData``. |
143−+--------------------------------------+---------------------------------------+
144−| Data of ``ManagedPtr`` allocated | Data allocated in C, pointer copied |
145−| in C, buffer then copied into the FP | into the C heap. |
146−| heap. | |
147−+--------------------------------------+---------------------------------------+
148−| Allocation and reallocation not | Allocated and reallocate freely in C, |
149−| possible from C code (without having | registering the allocated items |
150−| a reference to the VM). Everything | in the FFI. |
151−| is copied instead. | |
152−+--------------------------------------+---------------------------------------+
153−
154−The FP heap is the primary heap. It may contain values of type ``CData``,
155−which are references to items in the C heap. A C heap item contains
156−a ``(void *)`` pointer and the corresponding finalizer. Once a C heap item
157−is no longer referenced from the FP heap, it is marked as unused and
158−the next GC sweep will call its finalizer and deallocate it.
159−
160−There is no Idris interface for ``CData`` other than its type and FFI.
161−
162−Usage from C code
163−-----------------
164−
165−* Although not enforced in code, ``CData`` is meant to be opaque
166− and non-RTS code (such as libraries or C bindings) should
167− access only its ``(void *)`` field called ``data``.
168−
169−* Feel free to mutate both the pointer ``data`` (eg. after calling ``realloc``)
170− and the memory it points to. However, keep in mind
171− that this must not break Idris's referential transparency.
172−
173−* **WARNING!** If you call ``cdata_allocate`` or ``cdata_manage``,
174− the resulting ``CData`` object *must* be returned from your
175− FFI function so that it is inserted in the C heap by the RTS.
176− Otherwise the memory will be leaked.
177−
178−.. code:: idris
179−
180− some_allocating_fun : Int -> IO CData
181− some_allocating_fun i = foreign FFI_C "some_allocating_fun" (Int -> IO CData) i
182−
183− other_fun : CData -> Int -> IO Int
184− other_fun cd i = foreign FFI_C "other_fun" (CData -> Int -> IO Int) cd i
185−
186−.. code:: cpp
187−
188− #include "idris_rts.h"
189−
190− static void finalizer(void * data)
191− {
192− MyStruct * ptr = (MyStruct *) data;
193− free_something(ptr->something);
194− free(ptr);
195− }
196−
197− CData some_allocating_fun(int arg)
198− {
199− void * data = (void *) malloc(...);
200− // ...
201− return cdata_manage(data, finalizer);
202− }
203−
204− int other_fun(CData cd, int arg)
205− {
206− int result = foo(cd->data);
207− return result;
208− }
209−
210103Preorder reasoning
211104==================
212105
@@ -222,11 +115,11 @@ Here is an example:
222115 import Syntax.PreorderReasoning
223116 multThree : (a, b, c : Nat) -> a * b * c = c * a * b
224117 multThree a b c =
225− (a * b * c) ={ sym (multAssociative a b c) }=
226− (a * (b * c)) ={ cong (multCommutative b c) }=
227− (a * (c * b)) ={ multAssociative a c b }=
228− (a * c * b) ={ cong {f = (* b)} (multCommutative a c) }=
229− (c * a * b) QED
118+ (a * b * c) ={ sym (multAssociative a b c) }=
119+ (a * (b * c)) ={ cong (multCommutative b c) }=
120+ (a * (c * b)) ={ multAssociative a c b }=
121+ (a * c * b) ={ cong {f = (* b)} (multCommutative a c) }=
122+ (c * a * b) QED
230123
231124Note that the parentheses are required -- only a simple expression can
232125be on the left of ``={ }=`` or ``QED``. Also, when using preorder
@@ -273,7 +166,7 @@ That is, ``{x}`` behaves like ``{x=x}``.
273166
274167
275168Existence of an implementation
276−========================
169+==============================
277170
278171In order to show that an implementation of some interface is defined for some
279172type, one could use the ``%implementation`` keyword:
@@ -296,13 +189,13 @@ can be used in proofs, for example:
296189 -- Base case
297190 (Z + m = m + Z) <== plus_comm =
298191 rewrite ((m + Z = m) <== plusZeroRightNeutral) ==>
299− (Z + m = m) in refl
192+ (Z + m = m) in Refl
300193
301194 -- Step case
302195 (S k + m = m + S k) <== plus_comm =
303196 rewrite ((k + m = m + k) <== plus_comm) in
304197 rewrite ((S (m + k) = m + S k) <== plusSuccRightSucc) in
305− refl
198+ Refl
306199
307200Reflection
308201==========
@@ -327,7 +220,7 @@ following command::
327220 source <(idris --bash-completion-script `which idris`)
328221
329222
330−To enable completion permenatly you must either:
223+To enable completion permanently you must either:
331224
332225* Modify your bash init script with the above command.
333226
docs/reference/packages.rst+16−4
@@ -24,7 +24,7 @@ comma separated list of modules. For example, a library test which
2424has two modules ``foo.idr`` and ``bar.idr`` as source files would be
2525written as follows::
2626
27− package foo
27+ package test
2828
2929 modules = foo, bar
3030
@@ -91,13 +91,16 @@ external ``C`` libraries, the following options are available:
9191
9292+ ``makefile = <file>``, which specifies a ``Makefile``, to be built
9393 before the Idris modules, for example to support linking with a
94− ``C`` library.
94+ ``C`` library. When building, Idris sets the environment variables
95+ ``IDRIS_INCLUDES`` (with C include flags) and ``IDRIS_LDFLAGS``
96+ (with C linking flags) so they can be used from inside the
97+ ``Makefile``.
9598
9699+ ``libs = <libs>``, which takes a comma separated list of libraries
97100 which must be present for the package to be usable.
98101
99102+ ``objs = <objs>``, which takes a comma separated list of additional
100− files to be installed (object files, headers), perhaps generated
103+ files to be installed (object files, headers), perhaps generated
101104 by the ``Makefile``.
102105
103106Testing
@@ -112,10 +115,15 @@ The following option is available:
112115.. IMPORTANT::
113116 The modules containing the test functions must also be added to the list of modules.
114117
118+Comments
119+---------
120+
121+Package files support comments using the standard Idris singleline ``--`` and multiline ``{- -}`` format.
122+
115123Using Package files
116124===================
117125
118−Given an Idris package file ``text.ipkg`` it can be used with the Idris compiler as follows:
126+Given an Idris package file ``test.ipkg`` it can be used with the Idris compiler as follows:
119127
120128+ ``idris --build test.ipkg`` will build all modules in the package
121129
@@ -127,10 +135,14 @@ Given an Idris package file ``text.ipkg`` it can be used with the Idris compiler
127135
128136+ ``idris --mkdoc test.ipkg`` will build HTML documentation for your package in the folder ``test_doc`` in your project's root directory.
129137
138++ ``idris --installdoc test.ipkg`` will install the packages documentation into Idris' central documentation folder located at ``idris --docdir``.
139+
130140+ ``idris --checkpkg test.ipkg`` will type check all modules in the package only. This differs from build that type checks **and** generates code.
131141
132142+ ``idris --testpkg test.ipkg`` will compile and run any embedded tests you have specified in the ``tests`` parameter.
133143
144+When building or install packages the commandline flag ``--warnipkg`` will audit the project and warn of any potentiable problems.
145+
134146Once the test package has been installed, the command line option
135147``--package test`` makes it accessible (abbreviated to ``-p test``).
136148For example::
docs/reference/partial-evaluation.rstnew file+305
@@ -0,0 +1,305 @@
1+****************************************
2+Static Arguments and Partial Evaluation
3+****************************************
4+
5+As of version 0.9.15, Idris has support for *partial evaluation* of
6+statically known arguments. This involves creating specialised versions
7+of functions with arguments annotated as ``%static``.
8+
9+(This is an implementation of the partial evaluator described in `this
10+ICFP 2010
11+paper <https://eb.host.cs.st-andrews.ac.uk/writings/icfp10.pdf>`__.
12+Please refer to this for more precise definitions of what follows.)
13+
14+Partial evaluation is switched off by default since Idris 1.0. It can
15+be enabled with the ``--partial-eval`` flag.
16+
17+Introductory Example
18+--------------------
19+
20+Consider the power function over natural numbers, defined as follows
21+(we'll call it ``my_pow`` since ``pow`` already exists in the Prelude):
22+
23+::
24+
25+ my_pow : Nat -> Nat -> Nat
26+ my_pow x Z = 1
27+ my_pow x (S k) = mult x (my_pow x k)
28+
29+This is implemented by recursion on the second argument, and we can
30+evaluate the definition further if the second argument is known, even if
31+the first isn't. For example, we can build a function at the REPL to
32+cube a number as follows:
33+
34+::
35+
36+ *pow> \x => my_pow x 3
37+ \x => mult x (mult x (mult x 1)) : Nat -> Nat
38+ *pow> it 3
39+ 27 : Nat
40+
41+Note that in the resulting function the recursion has been eliminated,
42+since ``my_pow`` is implemented by recursion on the known argument. We
43+have no such luck if the first argument is known and the second isn't:
44+
45+::
46+
47+ *pow> \x => my_pow 2 x
48+ \x => my_pow 2 x : Nat -> Nat
49+
50+Now, consider the following definition which calculates x^2 + 1:
51+
52+::
53+
54+ powFn : Nat -> Nat
55+ powFn x = plus (my_pow x (S (S Z))) (S Z)
56+
57+Since the second argument to ``my_pow`` here is statically known, it
58+seems a shame to have to make the recursive calls every time. However,
59+Idris will not in general inline recursive definitions, in particular
60+since they may diverge or duplicate work without some deeper analysis.
61+
62+We can, however, give Idris some hints that here we really would like to
63+create a specialised version of ``my_pow``.
64+
65+Automatic specialisation of ``pow``
66+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67+
68+The trick is to mark the statically known arguments with the
69+``%static`` flag:
70+
71+::
72+
73+ my_pow : Nat -> %static Nat -> Nat
74+ my_pow k Z = 1
75+ my_pow k (S j) = mult k (my_pow k j)
76+
77+When an argument is annotated in this way, Idris will try to create a
78+specialised version whenever it accounts a call with a concrete value
79+(i.e. a constant, constructor form, or globally defined function) in a
80+``%static`` position. If ``my_pow`` is defined this way, and ``powFn``
81+defined as above, we can see the effect by typing ``:printdef powFn`` at
82+the REPL:
83+
84+::
85+
86+ *pow> :printdef powFn
87+ powFn : Nat -> Nat
88+ powFn x = plus (PE_my_pow_3f3e5ad8 x) 1
89+
90+What is this mysterious ``PE_my_pow_3f3e5ad8``? It's a specialised power
91+function where the statically known argument has been specialised away.
92+The name is generated from a hash of the specialised arguments, and we
93+can see its definition with ``:printdef`` too:
94+
95+::
96+
97+ *petest> :printdef PE_my_pow_3f3e5ad8
98+ PE_my_pow_3f3e5ad8 : Nat -> Nat
99+ PE_my_pow_3f3e5ad8 (0arg) = mult (0arg) (mult (0arg) (PE_fromInteger_7ba9767f 1))
100+
101+The ``(0arg)`` is an internal argument name (programmers can't give
102+variable names beginning with a digit after all). Notice also that there
103+is a specialised version of ``fromInteger`` for ``Nat``\ s, since type
104+class dictionaries are themselves a particularly common case of
105+statically known arguments!
106+
107+Specialising Type Classes
108+-------------------------
109+
110+Type class dictionaries are very often statically known, so Idris
111+automatically marks any type class constraint as ``%static`` and builds
112+specialised versions of top level functions where the class is
113+instantiated. For example, given:
114+
115+::
116+
117+ calc : Int -> Int
118+ calc x = (x * x) + x
119+
120+If we print this definition, we'll see a specialised version of ``+`` is
121+used:
122+
123+::
124+
125+ *petest> :printdef calc
126+ calc : Int -> Int
127+ calc x = PE_+_954510b4 (PE_*_954510b4 x x) x
128+
129+More interestingly, consider ``vadd`` which adds corresponding elements
130+in a vector of anything numeric:
131+
132+::
133+
134+ vadd : Num a => Vect n a -> Vect n a -> Vect n a
135+ vadd [] [] = []
136+ vadd (x :: xs) (y :: ys) = x + y :: vadd xs ys
137+
138+If we use this on something concrete as follows...
139+
140+::
141+
142+ test : List Int -> List Int
143+ test xs = let xs' = fromList xs in
144+ toList $ vadd xs' xs'
145+
146+...then in fact, we get a specialised version of ``vadd`` in the
147+definition of ``test``, and indeed the specialised version of
148+``toList``:
149+
150+::
151+
152+ test : List Int -> List Int
153+ test xs = let xs' = fromList xs
154+ in PE_toList_888ae67 (PE_vadd_33f98d3d xs' xs')
155+
156+Here's the specialised version of ``vadd``:
157+
158+::
159+
160+ PE_vadd_33f98d3d : Vect n Int -> Vect n Int -> Vect n Int
161+ PE_vadd_33f98d3d [] [] = []
162+ PE_vadd_33f98d3d (x :: xs) (y :: ys) = ((PE_+_954510b4 x y) ::
163+ (PE_vadd_33f98d3d xs ys))
164+
165+Note that the recursive structure has been preserved, and the recursive
166+call to ``vadd`` has been replaced with a recursive call to the
167+specialised version. We've also got the same specialised version of
168+``+`` that we had above in ``calc``.
169+
170+Specialising Higher Order Functions
171+-----------------------------------
172+
173+Another case where partial evaluation can be useful is in automatically
174+making specialised versions of higher order functions. Unlike type class
175+dictionaries, this is not done automatically, but we might consider
176+writing ``map`` as follows:
177+
178+::
179+
180+ my_map : %static (a -> b) -> List a -> List b
181+ my_map f [] = []
182+ my_map f (x :: xs) = f x :: my_map f xs
183+
184+Then using ``my_map`` will yield specialised versions, for example to
185+double every value in a list of ``Int``\ s we could write:
186+
187+::
188+
189+ doubleAll : List Int -> List Int
190+ doubleAll xs = my_map (*2) xs
191+
192+This would yield a specialised version of ``my_map``, used in
193+``doubleAll`` as follows:
194+
195+::
196+
197+ doubleAll : List Int -> List Int
198+ doubleAll xs = PE_my_map_1f8225c4 xs
199+
200+ PE_my_map_1f8225c4 : List Int -> List Int
201+ PE_my_map_1f8225c4 [] = []
202+ PE_my_map_1f8225c4 (x :: xs) = ((PE_*_954510b4 x 2) :: (PE_my_map_1f8225c4 xs))
203+
204+Specialising Interpreters
205+-------------------------
206+
207+A particularly useful situation where partial evaluation becomes
208+effective is in defining an interpreter for a well-typed expression
209+language, defined as follows (see the `Idris tutorial, section
210+4 <https://eb.host.cs.st-andrews.ac.uk/writings/idris-tutorial.pdf>`__
211+for more details on how this works):
212+
213+::
214+
215+ data Expr : Vect n Ty -> Ty -> Type where
216+ Var : HasType i gamma t -> Expr gamma t
217+ Val : (x : Int) -> Expr gamma TyInt
218+ Lam : Expr (a :: gamma) t -> Expr gamma (TyFun a t)
219+ App : Lazy (Expr gamma (TyFun a t)) -> Expr gamma a -> Expr gamma t
220+ Op : (interpTy a -> interpTy b -> interpTy c) -> Expr gamma a -> Expr gamma
221+ Expr gamma c
222+ If : Expr gamma TyBool -> Expr gamma a -> Expr gamma a -> Expr gamma a
223+
224+ dsl expr
225+ lambda = Lam
226+ variable = Var
227+ index_first = stop
228+ index_next = pop
229+
230+We can write a couple of test functions in this language as follows,
231+using the ``dsl`` notation to overload lambdas; first a function which
232+multiplies two inputs:
233+
234+::
235+
236+ eMult : Expr gamma (TyFun TyInt (TyFun TyInt TyInt))
237+ eMult = expr (\x, y => Op (*) x y)
238+
239+Then, a function which calculates the factorial of its input:
240+
241+::
242+
243+ eFac : Expr gamma (TyFun TyInt TyInt)
244+ eFac = expr (\x => If (Op (==) x (Val 0))
245+ (Val 1)
246+ (App (App eMult (App eFac (Op (-) x (Val 1)))) x))
247+
248+The interpreter's type is written as follows, marking the expression to
249+be evaluated as ``%static``:
250+
251+::
252+
253+ interp : (env : Env gamma) -> %static (e : Expr gamma t) -> interpTy t
254+
255+This means that if we write an Idris program to calculate a factorial by
256+calling ``interp`` on ``eFac``, the resulting definition will be
257+specialised, partially evaluating away the interpreter:
258+
259+::
260+
261+ runFac : Int -> Int
262+ runFac x = interp [] eFac x
263+
264+We can see that the call to ``interp`` has been partially evaluated away
265+as follows:
266+
267+::
268+
269+ *interp> :printdef runFac
270+ runFac : Int -> Int
271+ runFac x = PE_interp_ed1429e [] x
272+
273+If we look at ``PE_interp_ed1429e`` we'll see that it follows exactly
274+the structur of ``eFac``, with the interpreter evaluated away:
275+
276+::
277+
278+ *interp> :printdef PE_interp_ed1429e
279+ PE_interp_ed1429e : Env gamma -> Int -> Int
280+ PE_interp_ed1429e (3arg) = \x =>
281+ boolElim (x == 0)
282+ (Delay 1)
283+ (Delay (PE_interp_b5c2d0ff (x :: (3arg))
284+ (PE_interp_ed1429e (x :: (3arg)) (x - 1)) x))
285+
286+
287+For the sake of readability, I have simplified this slightly: what you
288+will really see also includes specialised versions of ``==``, ``-`` and
289+``fromInteger``. Note that ``PE_interp_ed1429e``, which represents
290+``eFac`` has become a recursive function following the structure of
291+``eFac``. There is also a call to ``PE_interp_b5c2d0ff`` which is a
292+specialised interpeter for ``eMult``.
293+
294+These definitions arise because the partial evaluator will only
295+specialise a definition by a specific concrete argument once, then it is
296+cached for future use. So any future applications of ``interp`` on
297+``eFac`` will also be translated to ``PE_interp_ed1429e``.
298+
299+The specialised version of ``eMult``, without any simplification for
300+readability, is:
301+
302+::
303+
304+ PE_interp_b5c2d0ff : Env gamma -> Int -> Int -> Int
305+ PE_interp_b5c2d0ff (3arg) = \x => \x1 => PE_*_954510b4 x x1
docs/reference/syntax-guide.rst+83−2
@@ -158,6 +158,76 @@ value of type ``Type``).
158158 Nil : Vect Z a
159159 (::) : (x : a) -> (xs : Vect n a) -> Vect (S n) a
160160
161+The signature of type constructors may use dependent types
162+
163+.. code:: idris
164+
165+ data DPair : (a : Type) -> (a -> Type) -> Type where
166+ MkDPair : {P : a -> Type} -> (x : a) -> (pf : P x) -> DPair a P
167+
168+Records
169+~~~~~~~
170+
171+There is a special syntax for data types with one constructor and
172+multiple fields.
173+
174+.. code:: idris
175+
176+ record A a where
177+ constructor MkA
178+ foo, bar : a
179+ baz : Nat
180+
181+This defines a constructor as well as getter and setter function for
182+each field.
183+
184+.. code:: idris
185+
186+ MkA : a -> a -> Nat -> A a
187+ foo : A a -> a
188+ set_foo : a -> A a -> A a
189+
190+The types of record fields may depend on the value of other fields
191+
192+.. code:: idris
193+
194+ record Collection a where
195+ constructor MkCollection
196+ size : Nat
197+ items : Vect size a
198+
199+Setter functions are only provided for fields that do not use dependant
200+types. In the example above neither ``set_size`` nor ``set_items`` are
201+defined.
202+
203+
204+Co-data
205+~~~~~~~
206+
207+Inifinite data structures can be introduced with the ``codata``
208+keyword.
209+
210+.. code:: idris
211+
212+ codata Stream : Type -> Type where
213+ (::) a -> Stream a -> Stream a
214+
215+This is syntactic sugar for the following, which is usually preferred:
216+
217+.. code:: idris
218+
219+ data Stream : Type -> Type where
220+ (::) a -> Inf (Stream a) -> Stream a
221+
222+Every occurence of the defined type in a constructor argument will be
223+wrapped in the ``Inf`` type constructor. This has the effect of delaying the
224+evaluation of the second argument when the data constructor is applied.
225+An ``Inf`` argument is constructed using ``Delay`` (which Idris will insert
226+implicitly) and evaluated using ``Force`` (again inserted implicitly).
227+
228+Furthermore, recursive calls under a ``Delay`` must be guarded by a constructor
229+to pass the totality checker.
230+
161231Operators
162232---------
163233
@@ -317,10 +387,22 @@ Totality
317387::
318388
319389 total
320− implicit
321390 partial
322391 covering
323392
393+Sets explicitly to which extent pattern matching is terminating and/or
394+exhaustive. A ``partial`` pattern matching makes no assumption. A ``covering``
395+pattern matching ensures that pattern matching is exhaustive on its clauses.
396+Furthermore, a ``total`` pattern matching enforces both exhaustivity and
397+termination of the evaluation of its clauses.
398+
399+Implicit Coercion
400+^^^^^^^^^^^^^^^^^
401+
402+::
403+
404+ implicit
405+
324406Options
325407^^^^^^^
326408
@@ -331,7 +413,6 @@ Options
331413 %no_implicit
332414 %error_handler
333415 %error_reverse
334− %assert_total
335416 %reflection
336417 %specialise [<name list>]
337418
docs/reference/syntax-reference.rstnew file+422
@@ -0,0 +1,422 @@
1+*****************
2+Syntax Reference
3+*****************
4+
5+Here we present a rough description of Idris' surface syntax as an eBNF grammar.
6+This presentend grammar may differ from syntax that Idris' parser can handle due to the parser and grammar description not being in sync.
7+
8+=========
9+Notation
10+=========
11+
12+Grammar shortcut notation::
13+
14+ ~CHARSEQ = complement of char sequence (i.e. any character except CHARSEQ)
15+ RULE? = optional rule (i.e. RULE or nothing)
16+ RULE* = repeated rule (i.e. RULE zero or more times)
17+ RULE+ = repeated rule with at least one match (i.e. RULE one or more times)
18+ RULE! = invalid rule (i.e. rule that is not valid in context, report meaningful error in case)
19+ RULE{n} = rule repeated n times
20+
21+
22+=============
23+Main Grammar
24+=============
25+
26+.. productionlist::
27+ ModuleHeader : `DocComment_t`? "module" `Identifier_t` ";"? ;
28+ Import : "import" `Identifier_t` ";"? ;
29+ Prog : `Decl`* `EOF`;
30+ Decl : `DeclP`
31+ : | `Using`
32+ : | `Params`
33+ : | `Mutual`
34+ : | `Namespace`
35+ : | `Interface`
36+ : | `Implementation`
37+ : | `DSL`
38+ : | `Directive`
39+ : | `Provider`
40+ : | `Transform`
41+ : | `Import`!
42+ : | `RunElabDecl` ;
43+ DeclP : `Fixity`
44+ : | `FunDecl`
45+ : | `Data`
46+ : | `Record`
47+ : | `SyntaxDecl` ;
48+
49+
50+--------------------
51+Syntax Declarations
52+--------------------
53+
54+.. productionlist::
55+ SyntaxDecl : `SyntaxRule` ;
56+ SyntaxRuleOpts : "term" | "pattern" ;
57+ SyntaxRule : `SyntaxRuleOpts`? "syntax" `SyntaxSym`+ "=" `TypeExpr` `Terminator`;
58+ SyntaxSym : '[' `Name_t` ']'
59+ : | '{' `Name_t` '}'
60+ : | `Name_t`
61+ : | `StringLiteral_t`;
62+ SyntaxSym : '[' `Name_t` ']'
63+ : | '{' `Name_t` '}'
64+ : | `Name_t`
65+ : | `StringLiteral_t`;
66+
67+----------
68+Functions
69+----------
70+
71+.. productionlist::
72+ FunDecl : `FunDeclP`;
73+ FunDeclP : `DocComment_t`? `FnOpts`* `Accessibility`? `FnOpts`* `FnName` `TypeSig` `Terminator`
74+ : | `Postulate`
75+ : | `Pattern`
76+ : | `CAF` ;
77+ FnOpts : `FnOpt`* `Accessibility` `FnOpt`* ;
78+ FnOpt : 'total'
79+ : | 'partial'
80+ : | 'covering'
81+ : | 'implicit'
82+ : | '%' 'no_implicit'
83+ : | '%' 'assert_total'
84+ : | '%' 'error_handler'
85+ : | '%' 'reflection'
86+ : | '%' 'specialise' '[' `NameTimesList`? ']' ;
87+ NameTimes : `FnName` `Natural`?;
88+ NameTimesList : `NameTimes` | `NameTimes` ',' `NameTimesList` ;
89+ Postulate : `DocComment_t`? 'postulate' `FnOpts`* `Accesibility`? `FnOpts`* `FnName` `TypeSig` `Terminator` ;
90+
91+--------------------
92+Blocks & Namespaces
93+--------------------
94+
95+.. productionlist::
96+ Using : 'using' '(' `UsingDeclList` ')' `OpenBlock` `Decl`* `CloseBlock` ;
97+ UsingDeclList : `UsingDeclListP` | `NameList TypeSig`;
98+ UsingDeclListP : `UsingDecl` | `UsingDecl` ',' `UsingDeclListP` ;
99+ NameList : `Name` | `Name` ',' `NameList` ;
100+ UsingDecl : `FnName` `TypeSig` | `FnName` `FnName`+ ;
101+ Params : 'parameters' '(' `TypeDeclList` ')' `OpenBlock` `Decl`* `CloseBlock`;
102+ Mutual : 'mutual' `OpenBlock` `Decl`* `CloseBlock` ;
103+ Namespace : 'namespace' `identifier` `OpenBlock` `Decl`+ `CloseBlock` ;
104+
105+----------------------------
106+Interfaces & Implementation
107+----------------------------
108+
109+.. productionlist::
110+ ImplementationBlock : 'where' `OpenBlock` `FnDecl`* `CloseBlock` ;
111+ MethodOrImplementation : `FnDecl` | `Implementation`;
112+ InterfaceBlock : 'where' `OpenBlock` `Constructor`? `MethodOrImplementation`* `CloseBlock` ;
113+ InterfaceArgument : `Name` | '(' `Name` ':' `Expr` ')';
114+ Interface ::= `DocComment_t`? `Accessibility`? 'interface' `ConstraintList`? `Name` `InterfaceArgument`* `InterfaceBlock`?;
115+ Implementation : `DocComment_t`? 'implementation' `ImplementationName`? `ConstraintList`? `Name` `SimpleExpr`* `ImplementationBlock`? ;
116+ ImplementationName : '[' `Name` ']';
117+
118+
119+-------
120+Bodies
121+-------
122+
123+.. productionlist::
124+ Pattern : `Clause`;
125+ CAF : 'let' `FnName` '=' `Expr` `Terminator`;
126+ ArgExpr : `HSimpleExpr` | "In Pattern External (User-defined) Expression";
127+ RHS : '=' `Expr`
128+ : | '?=' `RHSName`? `Expr`
129+ : | `Impossible` ;
130+ RHSName : '{' `FnName` '}' ;
131+ RHSOrWithBlock : `RHS` `WhereOrTerminator`
132+ : | 'with' `SimpleExpr` `OpenBlock` `FnDecl`+ `CloseBlock`;
133+ Clause : `WExpr`+ `RHSOrWithBlock`
134+ : | `SimpleExpr` '<==' `FnName` `RHS` `WhereOrTerminator`
135+ : | `ArgExpr` `Operator` `ArgExpr` `WExpr`* `RHSOrWithBlock` {- Except "=" and "?=" operators to avoid ambiguity -}
136+ : | `FnName` `ConstraintArg`* `ImplicitOrArgExpr`* `WExpr`* `RHSOrWithBlock`;
137+ ImplicitOrArgExpr ::= `ImplicitArg` | `ArgExpr`;
138+ WhereOrTerminator ::= `WhereBlock` | `Terminator`;
139+ WExpr ::= '|' `Expr`';
140+ WhereBlock : 'where' `OpenBlock` `Decl`+ `CloseBlock`;
141+
142+----------
143+Directives
144+----------
145+
146+.. productionlist::
147+ Codegen: 'C'
148+ : | 'Java'
149+ : | 'JavaScript'
150+ : | 'Node'
151+ : | 'LLVM'
152+ : | 'Bytecode' ;
153+ StringList : `String` | `String` ',' `StringList` ;
154+ Directive : '%' `DirectiveP`;
155+ DirectiveP : 'lib' `CodeGen` `String_t`
156+ : | 'link' `CodeGen` `String_t`
157+ : | 'flag' `CodeGen` `String_t`
158+ : | 'include' `CodeGen` `String_t`
159+ : | 'hide' `Name`
160+ : | 'freeze' `Name`
161+ : | 'thaw' `Name`
162+ : | 'access' `Accessibility`
163+ : | 'default' `Totality`
164+ : | 'logging' `Natural`
165+ : | 'dynamic' `StringList`
166+ : | 'name' `Name` `NameList`
167+ : | 'error_handlers' `Name` `NameList`
168+ : | 'language' 'TypeProviders'
169+ : | 'language' 'ErrorReflection'
170+ : | 'deprecated' `Name` `String`
171+ : | 'fragile' `Name` `Reason` ;
172+ LangExt : "TypeProviders"
173+ : | "ErrorReflection"
174+ : | "UniquenessTypes"
175+ : | "LinearTypes"
176+ : | "DSLNotation"
177+ : | "ElabReflection"
178+ : | "FirstClassReflection" ;
179+ Totality : 'partial' | 'total' | 'covering'
180+ Provider : `DocComment_t`? '%' 'provide' `Provider_What`? '(' `FnName` `TypeSig` ')' 'with' `Expr`;
181+ ProviderWhat : 'proof' | 'term' | 'type' | 'postulate'
182+ Transform : '%' 'transform' `Expr` '==>' `Expr`;
183+ RunElabDecl : '%' 'runElab' `Expr`;
184+
185+
186+===========
187+Expressions
188+===========
189+
190+.. productionlist::
191+ FullExpr : `Expr` `EOF_t` ;
192+ Expr : `Pi` ;
193+ OpExpr : "Expression Parser with Operators based on ExprP" ;
194+ ExprP : "External (User-defined) Syntax" | `InternalExpr` ;
195+ InternalExpr : `UnifyLog`
196+ : | `RecordType`
197+ : | `SimpleExpr`
198+ : | `Lambda`
199+ : | `QuoteGoal`
200+ : | `Let`
201+ : | `If`
202+ : | `RewriteTerm`
203+ : | `CaseExpr`
204+ : | `DoBlock`
205+ : | `App` ;
206+
207+-------
208+Bodies
209+-------
210+
211+.. productionlist::
212+ Impossible : `impossible` ;
213+ CaseExpr : "case" `Expr` "of" `OpenBlock` `CaseOption`+ `CloseBlock` ;
214+ CaseOption : `Expr` (`Impossible` | "=>" `Expr`) `Terminator` ;
215+ ProofExpr : "proof" `OpenBlock` `Tactic'`* `CloseBlock` ;
216+ TacticsExpr : "tactics" `OpenBlock` `Tactic'`* `CloseBlock` ;
217+ SimpleExpr : "External (User-defined) Simple Expression"
218+ : | "?" `Name`
219+ : | "%" "implementation"
220+ : | "Refl" ("{" `Expr` "}")?
221+ : | `ProofExpr`
222+ : | `TacticsExpr`
223+ : | `FnName`
224+ : | `Idiom`
225+ : | `List`
226+ : | `Alt`
227+ : | `Bracketed`
228+ : | `Constant`
229+ : | `Type`
230+ : | "Void"
231+ : | `Quasiquote`
232+ : | `NameQuote`
233+ : | `Unquote`
234+ : | "_" ;
235+ Bracketed : "(" `BracketedP` ;
236+ BracketedP : ")"
237+ : | `Expr` ")"
238+ : | `ExprList` ")"
239+ : | `DependentPair` ")"
240+ : | `Operator` `Expr` ")"
241+ : | `Expr` `Operator` ")" ;
242+ Alt : "(|" `Expr_List` "|)" ;
243+ Expr_List : `Expr'` | `Expr'` "," `Expr_List` ;
244+ HSimpleExpr : "." `SimpleExpr` | `SimpleExpr` ;
245+ UnifyLog : "%" "unifyLog" `SimpleExpr` ;
246+ RunTactics : "%" "runElab" `SimpleExpr` ;
247+ Disamb : "with" `NameList` `Expr` ;
248+ NoImplicits : "%" "noImplicits" `SimpleExpr` ;
249+ App : "mkForeign" `Arg` `Arg`*
250+ : | `MatchApp`
251+ : | `SimpleExpr` `Arg`* ;
252+ MatchApp : `SimpleExpr` "<==" `FnName` ;
253+ Arg :` ImplicitArg` | `ConstraintArg` | `SimpleExpr` ;
254+ ImplicitArg : "{" `Name` ("=" `Expr`)? "}" ;
255+ ConstraintArg : "@{" `Expr` "}" ;
256+ Quasiquote : "`(" `Expr` ")" ;
257+ Unquote : "," `Expr` ;
258+ RecordType : "record" "{" `FieldTypeList` "}" ;
259+ FieldTypeList : `FieldType` | `FieldType` "," `FieldTypeList` ;
260+ FieldType : `FnName` "=" `Expr` ;
261+ TypeSig : ":" `Expr` ;
262+ TypeExpr : `ConstraintList`? `Expr` ;
263+ Lambda : "\\" `TypeOptDeclList` `LambdaTail`
264+ : | "\\" `SimpleExprList` `LambdaTail` ;
265+ SimpleExprList : `SimpleExpr` | `SimpleExpr` "," `SimpleExprList` ;
266+ LambdaTail : `Impossible` | "=>" `Expr` ;
267+ RewriteTerm : "rewrite" `Expr` ("==>" `Expr`)? "in" `Expr` ;
268+ RigCount: "1" : "0" ;
269+ Let : "let" `Name` `TypeSig`"? "=" `Expr` "in" `Expr`
270+ : | "let" `Expr'` "=" `Expr'` "in" `Expr` ;
271+ TypeSig' : ":" `Expr'` ;
272+ If : "if" `Expr` "then" `Expr` "else" `Expr` ;
273+ QuoteGoal : "quoteGoal" `Name` "by" `Expr` "in" `Expr` ;
274+
275+----
276+Pies
277+----
278+
279+.. productionlist::
280+ Pi : `PiOpts` `Static`? `PiP` ;
281+ PiP : `OpExpr` ("->" `Pi`)?
282+ : | "(" `TypeDeclList` ")" "->" `Pi`
283+ : | "{" `TypeDeclList` "}" "->" `Pi`
284+ : | "{" "auto" `TypeDeclList` "}" "->" `Pi`
285+ : | "{" "default" `SimpleExpr` `TypeDeclList` "}" "->" `Pi` ;
286+ PiOpts : "."? ;
287+ ConstraintList : "(" `Expr_List` ")" "=>"
288+ : | `Expr` "=>" ;
289+ TypeDeclList : `FunctionSignatureList`
290+ : | `NameList` `TypeSig` ;
291+ FunctionSignatureList : `Name` `TypeSig`
292+ : | `Name` `TypeSig` "," `FunctionSignatureList` ;
293+ TypeOptDeclList : `NameOrPlaceholder` `TypeSig`?
294+ : | `NameOrPlaceholder` `TypeSig`? "," `TypeOptDeclList` ;
295+ NameOrPlaceHolder : `Name` : "_" ;
296+ ListExpr : "[" "]" | "[" `Expr` "|" `DoList` "]" | "[" `ExprList` "]" ;
297+ ExprList : `Expr` | `Expr` "," `ExprList` ;
298+
299+
300+-------------------
301+Do Blocks & Idioms
302+-------------------
303+
304+.. productionlist::
305+ DoList : `Do` : `Do` "," `DoList` ;
306+ Do' : `Do` `KeepTerminator` ;
307+ DoBlock : "do" `OpenBlock` `Do'`+ `CloseBlock` ;
308+ Do : "let" `Name` `TypeSig`"? "=" `Expr`
309+ : | "let" `Expr'` "=" `Expr`
310+ : | "rewrite" `Expr`
311+ : | `Name` "<-" `Expr`
312+ : | `Expr'` "<-" `Expr`
313+ : | `Expr` ;
314+ Idiom : "[|" `Expr` "|]" ;
315+
316+
317+----------
318+Constants
319+----------
320+
321+.. productionlist::
322+ Constant : | "Integer"
323+ : | "Int"
324+ : | "Char"
325+ : | "Double"
326+ : | "String"
327+ : | "Bits8"
328+ : | "Bits16"
329+ : | "Bits32"
330+ : | "Bits64"
331+ : | `Float_t`
332+ : | `Natural_t`
333+ : | `VerbatimString_t`
334+ : | `String_t`
335+ : | `Char_t` ;
336+ VerbatimString_t : "\"\"\"" ~"\"\"\"" "\""* "\"\"\"" ;
337+
338+-------
339+Tactics
340+-------
341+
342+.. productionlist::
343+ Tactic : "intro" `NameList`?
344+ : | "intros"
345+ : | "refine" `Name` `Imp`+
346+ : | "mrefine" `Name`
347+ : | "rewrite" `Expr`
348+ : | "induction" `Expr`
349+ : | "equiv" `Expr`
350+ : | "let" `Name` ":" `Expr'` "=" `Expr`
351+ : | "let" `Name` "=" `Expr`
352+ : | "focus" `Name`
353+ : | "exact" `Expr`
354+ : | "applyTactic" `Expr`
355+ : | "reflect" `Expr`
356+ : | "fill" `Expr`
357+ : | "try" `Tactic` "|" `Tactic`
358+ : | "{" `TacticSeq` "}"
359+ : | "compute"
360+ : | "trivial"
361+ : | "solve"
362+ : | "attack"
363+ : | "state"
364+ : | "term"
365+ : | "undo"
366+ : | "qed"
367+ : | "abandon"
368+ : | ":" "q" ;
369+ TacticSeq : `Tactic` ";" `Tactic` | `Tactic` ";" `TacticSeq` ;
370+
371+----
372+Misc
373+----
374+
375+.. productionlist::
376+ Imp : "?" | "_" ;
377+ Static : "%static" ;
378+
379+=====
380+Data
381+=====
382+
383+.. productionlist::
384+ Record : `DocComment` `Accessibility`? "record" `FnName` `TypeSig` "where" `OpenBlock` `Constructor` `KeepTerminator` `CloseBlock`;
385+ DataI : "data" | "codata";
386+ Data : `DocComment`? `Accessibility`? `DataI` `FnName` `TypeSig` `ExplicitTypeDataRest`?
387+ : `DocComment`? `Accessibility`? `DataI` `FnName` `Name`* `DataRest`? ;
388+ Constructor': `Constructor` `KeepTerminator` ;
389+ ExplicitTypeDataRest : "where" `OpenBlock` `Constructor'`* `CloseBlock`;
390+ DataRest : "=" `SimpleConstructorList` `Terminator` | "where"!;
391+ SimpleConstructorList : `SimpleConstructor` | `SimpleConstructor` "|" `SimpleConstructorList`;
392+ Constructor : `DocComment`? `FnName` `TypeSig`;
393+ SimpleConstructor : `FnName` `SimpleExpr`* `DocComment`?;
394+ DSL : "dsl" `FnName` `OpenBlock` `Overload'`+ `CloseBlock`;
395+ OverloadIdentifier : "let" | `Identifier`;
396+ Overload : `OverloadIdentifier` "=" `Expr`;
397+
398+
399+=========
400+Operators
401+=========
402+
403+.. productionlist::
404+ BacktickOperator: `Name` ;
405+ OperatorName: `SymbolicOperator` : `BacktickOperator` ;
406+ OperatorFront: "(" "=" ")" | (`Identifier_t` ".")? "(" `Operator_t` ")" ;
407+ FnName: `Name` | `OperatorFront`;
408+ Fixity: `FixityType` `Natural_t` `OperatorList` `Terminator`;
409+ FixityType: "infixl" | "infixr" | "infix" | "prefix";
410+
411+
412+==============
413+Documentation
414+==============
415+
416+.. productionlist::
417+ SingleLineComment_t: "--" ~`EOL_t`* `EOL_t` ;
418+ MultiLineComment_t: "{" .. "}" | "{ -" `InCommentChars_t` ;
419+ InCommentChars_t : "- }" | `MultiLineComment_t` `InCommentChars_t` | ~"- }"+ `InCommentChars_t`;
420+ DocComment_t : `DocCommentLine` (`ArgCommentLine` `DocCommentLine`*)* ;
421+ DocCommentLine : "|||" ~`EOL_t`* `EOL_t` ;
422+ ArgCommentLine : "|||" "@" ~`EOL_t`* `EOL_t` ;
docs/reference/tactics.rst−13
@@ -173,19 +173,6 @@ rewrite
173173 Vect Z a
174174 -lemma>
175175
176−induction
177−---------
178−
179−- ``induction`` - (``Note that this is still experimental`` and you may
180− get strange results and error messages. We are aware of these and
181− will finish the implementation eventually!) Prove the goal by
182− induction. Each constructor of the datatype becomes a goal.
183− Constructors with recursive arguments become induction steps, while
184− simple constructors become base cases. Note that this only works for
185− datatypes that have eliminators: a datatype definition must have the
186− ``%elim`` modifier.
187−
188−
189176sourceLocation
190177--------------
191178
docs/reference/type-directed-search.rstnew file+336
@@ -0,0 +1,336 @@
1+*********************************
2+Type Directed Search ``:search``
3+*********************************
4+
5+Idris' ``:search`` command searches for terms according to their
6+approximate type signature (much like
7+`Hoogle <https://www.haskell.org/hoogle/>`__ for Haskell). For
8+example::
9+
10+ Idris> :search e -> List e -> List e
11+ = Prelude.List.(::) : a -> List a -> List a
12+ Cons cell
13+
14+ = Prelude.List.intersperse : a -> List a -> List a
15+ Insert some separator between the elements of a list.
16+
17+ > Prelude.List.delete : Eq a => a -> List a -> List a
18+
19+
20+ < assert_smaller : a -> b -> b
21+ Assert to the totality checker than y is always structurally
22+ smaller than x (which is typically a pattern argument)
23+
24+ < Prelude.Basics.const : a -> b -> a
25+ Constant function. Ignores its second argument.
26+
27+The best results are listed first. As we can see, ``(::)`` and
28+``intersperse`` are exact matches; the ``=`` symbol to the left of those
29+results tells us the types of ``(::)`` and ``intersperse`` are
30+effectively the same as the type that was searched.
31+
32+The next result is ``delete``, whose type is more specific than the type
33+that was searched; that's indicated by the ``>`` symbol. If we had a
34+function with the signature ``e -> List e -> List e``, we could have
35+given it the type ``Eq a => a -> List a -> List a``, but not necessarily
36+the other way around.
37+
38+The final two results, ``assert_smaller`` and ``const``, have types more
39+general than the type that was searched, and so they have ``<`` symbols
40+to their left. For example, ``e -> List e -> List e`` would be a valid
41+type for ``assert_smaller``. The correspondence for ``const`` is more
42+complicated than any of the four previous results. ``:search`` shows
43+this result because we could change the order of the arguments! That is,
44+the following definition would be legal:
45+
46+.. code:: idris
47+
48+ f : e -> List e -> List e
49+ f x xs = const xs x
50+
51+About :search results
52+---------------------
53+
54+:search's functionality is based on the notion of type isomorphism.
55+Informally, two types are isomorphic if we can identify terms of one
56+type exactly with terms of the other. For example, we can consider the
57+types ``Nat -> a -> List a`` and ``a -> Nat -> List a`` to be
58+isomorphic, because if we have ``f : Nat -> a -> List a``, then
59+``flip f : a -> Nat -> List a``. Similarly, if
60+``g : a -> Nat -> List a``, then ``flip g : Nat -> a -> List a``.
61+
62+With :search, we create a partial order on types; that is, given two
63+types ``A`` and ``B``, we may choose to say that ``A <= B``, ``A >= B``,
64+or both (in which case we say ``A == B``), or neither. For :search, we
65+say that ``A >= B`` if all of the terms inhabiting ``A`` correspond to
66+terms of ``B``, but it need not necessarily be the case that *all* the
67+terms of ``B`` correspond to terms of ``A``. Here's an example:
68+
69+::
70+
71+ a -> a >= Nat -> Nat
72+
73+The left-hand type has just a single inhabitant, ``id``, which
74+corresponds to the term ``id {a = Nat}``, which has the right-hand type.
75+However, there are various terms inhabiting the right-hand type (such as
76+``S``) which cannot correspond with terms of type ``a -> a``.
77+
78+We can consider the partial order for ``:search`` to be, in some sense,
79+inductively generated by several classes of "edits" which are described
80+below.
81+
82+Possible edits
83+~~~~~~~~~~~~~~
84+
85+Here is a simple approximate list of the edits that are possible in
86+``:search``. They are not entirely formal, and do not necessarily
87+reflect the ``:search`` command's actual behavior. For example, the
88+*argument application* rule may be used directly on arguments that are
89+bound after other arguments, without using several applications of the
90+*argument transposition* rule.
91+
92+- **Argument transposition**
93+
94+ ::
95+
96+ A : Type B : Type a : A, b : B |- M : Type
97+ ----------------------------------------------------------------------------
98+ (x : A) -> (y : B) -> [x,y/a,b]M == (y : B) -> (x : A) -> [x,y/a,b]M
99+
100+ Score: 1 point
101+
102+Example:
103+
104+::
105+
106+ a -> Vect n a -> Vect (S n) a == Vect n a -> a -> Vect (S n) a
107+
108+Note that in order for it to make sense to change the order of
109+arguments, neither of the arguments' types may depend on the value bound
110+by the other argument!
111+
112+- **Symmetry of equality**
113+
114+ ::
115+
116+ A = B : Type t : Type |- M : Type
117+ ----------------------------------------
118+ [A = B/t]M == [B = A/t]M
119+
120+ Score: 1 point
121+
122+Example:
123+
124+::
125+
126+ (x,y,z : Nat) -> x + (y + z) = (x + y) + z
127+ ==
128+ (x,y,z : Nat) -> (x + y) + z = x + (y + z)
129+
130+Note that this rule means that we can flip equalities anywhere they
131+occur (i.e., not only in the return type).
132+
133+- **Argument application**
134+
135+ ::
136+
137+ e : A |- M : Type y1 : T1, ..., yn : Tn |- x : A
138+ -----------------------------------------------------------------
139+ (z : A) -> [z/e]M >= (y1 : T1) -> ... -> (yn :Tn) -> [x/e]M
140+
141+ Score: <= : 3 points, >= : 9 points
142+
143+Examples:
144+
145+::
146+
147+ a -> a >= Nat -> Nat
148+ a -> a >= List e -> List e
149+ Vect k (Fin k) >= Vect 5 (Fin 5)
150+
151+Note that the ``n`` shown in the scheme above may be 0; that is, there
152+are no Pi terms to be added on the right side. For example, that's the
153+case for the first example shown above. This is probably the most
154+important, and most widely used, rule of all.
155+
156+- **Type class application**
157+
158+ ::
159+
160+ C : Type -> TypeClass
161+ , y1 : T1, ..., yn : Tn |- A : Type, instance : C A
162+ , t : Type |- M : Type
163+ -----------------------------------------------------------------
164+ C a => [a/t]M >= (y1 : T1) -> ... -> (yn : Tn) -> [A/t]M
165+
166+ Score: <= : 4 points, >= : 12 points
167+
168+Examples
169+
170+::
171+
172+ Ord a => a >= Int
173+ Show (List e) => List e -> String >= Show a => List a -> String
174+
175+This rule is used by looking at the instances for a particular type
176+class. While the scheme is shown only for single-parameter type classes,
177+it naturally generalizes to multi-parameter type classes. This rule is
178+particularly useful in conjunction with argument application. Again,
179+note that the ``n`` in the scheme above may be 0.
180+
181+- **Type class introduction**
182+
183+ ::
184+
185+ t : Type |- M : Type C : Type -> TypeClass
186+ -----------------------------------------------
187+ (t : Type) -> M >= C t => M
188+
189+ Score: <= : 2 points, >= : 6 points
190+
191+Example:
192+
193+::
194+
195+ a -> a -> Bool >= Eq a => a -> a -> Bool
196+
197+Scoring and listing search results
198+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
199+
200+When a type ``S`` is searched, the type is compared against the types of
201+all of the terms which are currently in context. When :search compares
202+two types ``S`` and ``T``, it essentially tries to find a chain of
203+inequalities
204+
205+::
206+
207+ R1 R2 Rn Rn+1
208+ S <= A1 <= ... <= An <= T
209+
210+using the edit rules listed above. It also tries to find chains going
211+the other way (i.e., showing ``S >= T``) as well. Each rule has an
212+associated score which indicates how drastic of a change the rule
213+corresponds to. These scores are listed above. Note that for the rules
214+which are not symmetric, the score depends on the direction in which the
215+rule is used. Finding types which are more general that the searched
216+typed (``S <= T``) is preferred to finding types which are less general.
217+
218+The score for the entire chain is, at minimum, the sum of the scores of
219+the individual rules (some non-linear interactions may be added). The
220+:search function tries to find the chain between ``S`` and ``T`` which
221+results in the lowest score, and this is the score associated to the
222+search result for ``T``.
223+
224+Search results are listed in order of ascending score. The symbol which
225+is shown along with the search result reflects the type of the chain
226+which resulted in the minimum score.
227+
228+Implementation of :search
229+-------------------------
230+
231+Practically, naive and undirected application of the rules enumerated
232+above is not possible; not only is this obviously inefficient, but the
233+two application rules (particularly *argument application*) are really
234+impossible to use without context given by other types. Therefore, we
235+use a heuristic algorithm that is meant to be practical, though it might
236+not find ways to relate two types which may actually be related by the
237+rules listed above.
238+
239+Suppose we wish to match two types, ``S`` and ``T``. We think of the
240+problem as a non-deterministic state machine. There is a ``State``
241+datatype which keeps track of how well we've matched ``S`` and ``T`` so
242+far. It contains:
243+
244+- Names of argument variables (Pi-bound variables) in either type which
245+ have yet to be matched
246+- A directed acyclic graph (DAG) of arguments (Pi-bindings) for ``S``
247+ and ``T`` which have yet to be matched
248+- A list of typeclass constraints for ``S`` and ``T`` which have yet to
249+ be matched
250+- A record of the rules which have been used so far to get to this
251+ point
252+
253+A function ``nextSteps : State -> [State]`` finds the next states which
254+may follow from a given state. Some states, where everything has been
255+matched, are considered final. The algorithm can be roughly broken down
256+into multiple stages; if we start from having two types, ``S`` and
257+``T``, which we wish to match, they are as follows:
258+
259+1. For each of ``S`` and ``T``, split the types up into their return
260+ types and directed acyclic graphs of the arguments, where there is an
261+ edge from argument A to argument B if the term bound in A appears in
262+ the type of B. The topological sorts of the DAG represent all the
263+ possible ways in which the arguments may be permuted.
264+2. For type ``T``, recursively find (saturated) uses of the ``=`` type
265+ constructor and produce a list of modified versions of ``T``
266+ containing all possible flips of the ``=`` constructor (this
267+ corresponds to the *symmetry of equality rule*).
268+3. For each modified type for ``T``, try to unify the return type of the
269+ modified ``T`` with ``S``, considering arguments from both ``S`` and
270+ ``T`` to be holes, so that the unifier may match pieces of the two
271+ types. For each modified version of ``T`` where this succeeds, an
272+ initial ``State`` can be made. The arguments and typeclasses are
273+ updated accordingly with the results of unification. The remainder of
274+ the algorithm involves applying ``nextSteps`` to these states until
275+ either no states remain (corresponding to no path from ``S`` to
276+ ``T``) or a final state is found. ``nextSteps`` also has several
277+ stages:
278+4. Try to unify arguments of ``S`` with arguments of ``T``, much like is
279+ done with the return types. We work "backwards" through the
280+ arguments: we try matching all remaining arguments of ``S`` which
281+ lack outgoing edges in the DAG of remaining arguments (that is, the
282+ bound value doesn't appear in the type of any other remaining
283+ arguments) with the all of the corresponding remaining arguments of
284+ ``T``. This is done recursively until no arguments remain for both
285+ ``S`` and ``T``; otherwise, we give up at this point. This step
286+ corresponds to application of the *argument application rule*, as
287+ well as the *argument transposition* rule.
288+5. Now, we try to match the type classes. First, we take all possible
289+ subsets of type class constraints for ``S`` and ``T``. So if ``S``
290+ and ``T`` have a total of ``n`` type class constraints, this produces
291+ ``2^n`` states for every state, and this quickly becomes infeasible
292+ as ``n`` grows large. This is probably the biggest bottleneck of the
293+ algorithm at the moment. This step corresponds to applications of the
294+ *type class introduction* rule.
295+6. Try to match type class constraints for ``S`` with those for ``T``.
296+ We attempt to unify each type class constraint for ``S`` with each
297+ constraint for ``T``. This may result in applications of the *type
298+ class application* rule. Once we are unable to match any more type
299+ class constraints between ``S`` and ``T``, we proceed to the final
300+ step.
301+7. Try instantiating type classes with their instances (in either ``S``
302+ or ``T``). This corresponds to applications of the *type class
303+ application* rule. After instantiating a type class, we hopefully
304+ open up more opportunities to match typeclass constraints of ``S``
305+ with those of ``T``, so we return to the previous step.
306+
307+The code for :search is located in the `Idris.TypeSearch
308+module <https://github.com/idris-lang/Idris-dev/blob/master/src/Idris/TypeSearch.hs>`__.
309+
310+Aggregating results
311+~~~~~~~~~~~~~~~~~~~
312+
313+The search for chains of rules/edits which relate two types can be
314+viewed as a shortest path problem where nodes correspond to types and
315+edges correspond to rules relating two types. The weights or distances
316+on each edge correspond to the score of each rule. We then may imagine
317+that we have a single start node, our search type ``S``, and several
318+final nodes: all of the types for terms which are currently in context.
319+The problem, then, is to find the shortest paths (where they exist) to
320+all of the final nodes. In particular, we wish to find the "closest"
321+types (those with the minimum score) first, as we'd like to display them
322+first.
323+
324+This problem nicely maps to usage of Dijkstra's algorithm. We search for
325+all types simultaneously so we can find the closest ones with the
326+minimum amount of work. In practice, this results in using a priority
327+queue of priority queues. We first ask "which goal type should we work
328+on next?", and then ask "which state should we expand upon next?" By
329+using this strategy, the best results can be shown quickly, even if it
330+takes a bit of time to find worse results (or at least rule them out).
331+
332+Miscellaneous Notes
333+-------------------
334+
335+Whether arguments are explicit or implicit does not affect search
336+results.
docs/reference/uniqueness-types.rst+3−3
@@ -13,7 +13,7 @@ ideally while giving up as little high level conveniences as possible.
1313
1414They are inspired by linear types, `Uniqueness Types
1515<https://en.wikipedia.org/wiki/Uniqueness_type>`__ in the `Clean
16−<http://wiki.clean.cs.ru.nl/Clean>`__ programming language, and
16+<https://wiki.clean.cs.ru.nl/Clean>`__ programming language, and
1717ownership types and borrowed pointers in the `Rust
1818<https://www.rust-lang.org/>`__ programming language.
1919
@@ -199,7 +199,7 @@ return it in exactly the condition in which it was received!
199199The restriction is that when a ``Borrowed`` type is matched, any
200200pattern variables under the ``Read`` which have a unique type may not
201201be referred to at all on the right hand side (unless they are
202−themselves ``lent`` to another function).
202+themselves lent to another function).
203203
204204Uniqueness information is stored in the type, and in particular in
205205function types. Once we're in a unique context, any new function which
@@ -212,7 +212,7 @@ the following sort of bad program being implemented:
212212 foo xs = do let f = \x : Int => showU xs
213213 putStrLn $ free xs
214214 putStrLn $ f 42
215− return ()
215+ pure ()
216216
217217Since ``lend`` is implicit, in practice for functions to lend and borrow
218218values merely requires the argument to be marked as ``Borrowed``. We can
docs/st/composing.rstnew file+774
@@ -0,0 +1,774 @@
1+.. _composing:
2+
3+************************
4+Composing State Machines
5+************************
6+
7+In the previous section, we defined a ``DataStore`` interface and used it
8+to implement the following small program which allows a user to log in to
9+the store then display the store's contents;
10+
11+.. code-block:: idris
12+
13+ getData : (ConsoleIO m, DataStore m) => ST m () []
14+ getData = do st <- connect
15+ OK <- login st
16+ | BadPassword => do putStrLn "Failure"
17+ disconnect st
18+ secret <- readSecret st
19+ putStrLn ("Secret is: " ++ show secret)
20+ logout st
21+ disconnect st
22+
23+This function only uses one state, the store itself. Usually, though,
24+larger programs have lots of states, and might add, delete and update
25+states over the course of its execution. Here, for example, a useful
26+extension might be to loop forever, keeping count of the number of times
27+there was a login failure in a state.
28+
29+Furthermore, we may have *hierarchies* of state machines, in that one
30+state machine could be implemented by composing several others. For
31+example, we can have a state machine representing the state of a
32+graphics system, and use this to implement a *higher level* graphics API
33+such as turtle graphics, which uses the graphics system plus some additional
34+state for the turtle.
35+
36+In this section, we'll see how to work with multiple states, and how to
37+compose state machines to make higher level state machines. We'll begin by
38+seeing how to add a login failure counter to ``getData``.
39+
40+Working with multiple resources
41+===============================
42+
43+To see how to work with multiple resources, we'll modify ``getData`` so
44+that it loops, and counts the total number of times the user fails to
45+log in. For example, if we write a ``main`` program which initialises the
46+count to zero, a session might run as follows:
47+
48+.. code::
49+
50+ *LoginCount> :exec main
51+ Enter password: Mornington Crescent
52+ Secret is: "Secret Data"
53+ Enter password: Dollis Hill
54+ Failure
55+ Number of failures: 1
56+ Enter password: Mornington Crescent
57+ Secret is: "Secret Data"
58+ Enter password: Codfanglers
59+ Failure
60+ Number of failures: 2
61+ ...
62+
63+We'll start by adding a state resource to ``getData`` to keep track of the
64+number of failures:
65+
66+.. code-block:: idris
67+
68+ getData : (ConsoleIO m, DataStore m) =>
69+ (failcount : Var) -> ST m () [failcount ::: State Integer]
70+
71+.. topic:: Type checking ``getData``
72+
73+ If you're following along in the code, you'll find that ``getData``
74+ no longer compiles when you update this type. That is to be expected!
75+ For the moment, comment out the definition of ``getData``. We'll come back
76+ to it shortly.
77+
78+Then, we can create a ``main`` program which initialises the state to ``0``
79+and invokes ``getData``, as follows:
80+
81+.. code-block:: idris
82+
83+ main : IO ()
84+ main = run (do fc <- new 0
85+ getData fc
86+ delete fc)
87+
88+We'll start our implementation of ``getData`` just by adding the new
89+argument for the failure count:
90+
91+.. code-block:: idris
92+
93+ getData : (ConsoleIO m, DataStore m) =>
94+ (failcount : Var) -> ST m () [failcount ::: State Integer]
95+ getData failcount
96+ = do st <- connect
97+ OK <- login st
98+ | BadPassword => do putStrLn "Failure"
99+ disconnect st
100+ secret <- readSecret st
101+ putStrLn ("Secret is: " ++ show secret)
102+ logout st
103+ disconnect st
104+
105+Unfortunately, this doesn't type check, because we have the wrong resources
106+for calling ``connect``. The error messages shows how the resources don't
107+match:
108+
109+.. code-block:: idris
110+
111+ When checking an application of function Control.ST.>>=:
112+ Error in state transition:
113+ Operation has preconditions: []
114+ States here are: [failcount ::: State Integer]
115+ Operation has postconditions: \result => [result ::: Store LoggedOut] ++ []
116+ Required result states here are: st2_fn
117+
118+In other words, ``connect`` requires that there are *no* resources on
119+entry, but we have *one*, the failure count!
120+This shouldn't be a problem, though: the required resources are a *subset* of
121+the resources we have, after all, and the additional resources (here, the
122+failure count) are not relevant to ``connect``. What we need, therefore,
123+is a way to temporarily *hide* the additional resource.
124+
125+We can achieve this with the ``call`` function:
126+
127+.. code-block:: idris
128+
129+ getData : (ConsoleIO m, DataStore m) =>
130+ (failcount : Var) -> ST m () [failcount ::: State Integer]
131+ getData failcount
132+ = do st <- call connect
133+ ?whatNow
134+
135+Here we've left a hole for the rest of ``getData`` so that you can see the
136+effect of ``call``. It has removed the unnecessary parts of the resource
137+list for calling ``connect``, then reinstated them on return. The type of
138+``whatNow`` therefore shows that we've added a new resource ``st``, and still
139+have ``failcount`` available:
140+
141+.. code-block:: idris
142+
143+ failcount : Var
144+ m : Type -> Type
145+ constraint : ConsoleIO m
146+ constraint1 : DataStore m
147+ st : Var
148+ --------------------------------------
149+ whatNow : STrans m () [failcount ::: State Integer, st ::: Store LoggedOut]
150+ (\result => [failcount ::: State Integer])
151+
152+By the end of the function, ``whatNow`` says that we need to have finished with
153+``st``, but still have ``failcount`` available. We can complete ``getData``
154+so that it works with an additional state resource by adding ``call`` whenever
155+we invoke one of the operations on the data store, to reduce the list of
156+resources:
157+
158+.. code-block:: idris
159+
160+ getData : (ConsoleIO m, DataStore m) =>
161+ (failcount : Var) -> ST m () [failcount ::: State Integer]
162+ getData failcount
163+ = do st <- call connect
164+ OK <- call $ login st
165+ | BadPassword => do putStrLn "Failure"
166+ call $ disconnect st
167+ secret <- call $ readSecret st
168+ putStrLn ("Secret is: " ++ show secret)
169+ call $ logout st
170+ call $ disconnect st
171+
172+This is a little noisy, and in fact we can remove the need for it by
173+making ``call`` implicit. By default, you need to add the ``call`` explicitly,
174+but if you import ``Control.ST.ImplicitCall``, Idris will insert ``call``
175+where it is necessary.
176+
177+.. code-block:: idris
178+
179+ import Control.ST.ImplicitCall
180+
181+It's now possible to write ``getData`` exactly as before:
182+
183+.. code-block:: idris
184+
185+ getData : (ConsoleIO m, DataStore m) =>
186+ (failcount : Var) -> ST m () [failcount ::: State Integer]
187+ getData failcount
188+ = do st <- connect
189+ OK <- login st
190+ | BadPassword => do putStrLn "Failure"
191+ disconnect st
192+ secret <- readSecret st
193+ putStrLn ("Secret is: " ++ show secret)
194+ logout st
195+ disconnect st
196+
197+There is a trade off here: if you import ``Control.ST.ImplicitCall`` then
198+functions which use multiple resources are much easier to read, because the
199+noise of ``call`` has gone. On the other hand, Idris has to work a little
200+harder to type check your functions, and as a result it can take slightly
201+longer, and the error messages can be less helpful.
202+
203+It is instructive to see the type of ``call``:
204+
205+.. code-block:: idris
206+
207+ call : STrans m t sub new_f -> {auto res_prf : SubRes sub old} ->
208+ STrans m t old (\res => updateWith (new_f res) old res_prf)
209+
210+The function being called has a list of resources ``sub``, and
211+there is an implicit proof, ``SubRes sub old`` that the resource list in
212+the function being called is a subset of the overall resource list. The
213+ordering of resources is allowed to change, although resources which
214+appear in ``old`` can't appear in the ``sub`` list more than once (you will
215+get a type error if you try this).
216+
217+The function ``updateWith`` takes the *output* resources of the
218+called function, and updates them in the current resource list. It makes
219+an effort to preserve ordering as far as possible, although this isn't
220+always possible if the called function does some complicated resource
221+manipulation.
222+
223+.. topic:: Newly created resources in called functions
224+
225+ If the called function creates any new resources, these will typically
226+ appear at the *end* of the resource list, due to the way ``updateWith``
227+ works. You can see this in the type of ``whatNow`` in our incomplete
228+ definition of ``getData`` above.
229+
230+Finally, we can update ``getData`` so that it loops, and keeps
231+``failCount`` updated as necessary:
232+
233+.. code-block:: idris
234+
235+ getData : (ConsoleIO m, DataStore m) =>
236+ (failcount : Var) -> ST m () [failcount ::: State Integer]
237+ getData failcount
238+ = do st <- call connect
239+ OK <- login st
240+ | BadPassword => do putStrLn "Failure"
241+ fc <- read failcount
242+ write failcount (fc + 1)
243+ putStrLn ("Number of failures: " ++ show (fc + 1))
244+ disconnect st
245+ getData failcount
246+ secret <- readSecret st
247+ putStrLn ("Secret is: " ++ show secret)
248+ logout st
249+ disconnect st
250+ getData failcount
251+
252+Note that here, we're connecting and disconnecting on every iteration.
253+Another way to implement this would be to ``connect`` first, then call
254+``getData``, and implement ``getData`` as follows:
255+
256+.. code-block:: idris
257+
258+ getData : (ConsoleIO m, DataStore m) =>
259+ (st, failcount : Var) -> ST m () [st ::: Store {m} LoggedOut, failcount ::: State Integer]
260+ getData st failcount
261+ = do OK <- login st
262+ | BadPassword => do putStrLn "Failure"
263+ fc <- read failcount
264+ write failcount (fc + 1)
265+ putStrLn ("Number of failures: " ++ show (fc + 1))
266+ getData st failcount
267+ secret <- readSecret st
268+ putStrLn ("Secret is: " ++ show secret)
269+ logout st
270+ getData st failcount
271+
272+It is important to add the explicit ``{m}`` in the type of ``Store {m}
273+LoggedOut`` for ``st``, because this gives Idris enough information to know
274+which implementation of ``DataStore`` to use to find the appropriate
275+implementation for ``Store``. Otherwise, if we only write ``Store LoggedOut``,
276+there's no way to know that the ``Store`` is linked with the computation
277+context ``m``.
278+
279+We can then ``connect`` and ``disconnect`` only once, in ``main``:
280+
281+.. code-block:: idris
282+
283+ main : IO ()
284+ main = run (do fc <- new 0
285+ st <- connect
286+ getData st fc
287+ disconnect st
288+ delete fc)
289+
290+By using ``call``, and importing ``Control.ST.ImplicitCall``, we can
291+write programs which use multiple resources, and reduce the list of
292+resources as necessary when calling functions which only use a subset of
293+the overall resources.
294+
295+Composite resources: Hierarchies of state machines
296+==================================================
297+
298+We've now seen how to use multiple resources in one function, which is
299+necessary for any realistic program which manipulates state. We can think
300+of this as "horizontal" composition: using multiple resources at once.
301+We'll often also need "vertical" composition: implementing one resource
302+in terms of one or more other resources.
303+
304+We'll see an example of this in this section. First, we'll implement a
305+small API for graphics, in an interface ``Draw``, supporting:
306+
307+* Opening a window, creating a double-buffered surface to draw on
308+* Drawing lines and rectangles onto a surface
309+* "Flipping" buffers, displaying the surface we've just drawn onto in
310+ the window
311+* Closing a window
312+
313+Then, we'll use this API to implement a higher level API for turtle graphics,
314+in an ``interface``.
315+This will require not only the ``Draw`` interface, but also a representation
316+of the turtle state (location, direction and pen colour).
317+
318+.. topic:: SDL bindings
319+
320+ For the examples in this section, you'll need to install the
321+ (very basic!) SDL bindings for Idris, available from
322+ https://github.com/edwinb/SDL-idris. These bindings implement a small
323+ subset of the SDL API, and are for illustrative purposes only.
324+ Nevertheless, they are enough to implement small graphical programs
325+ and demonstrate the concepts of this section.
326+
327+ Once you've installed this package, you can start Idris with the
328+ ``-p sdl`` flag, for the SDL bindings, and the ``-p contrib`` flag,
329+ for the ``Control.ST`` library.
330+
331+The ``Draw`` interface
332+----------------------
333+
334+We're going to use the Idris SDL bindings for this API, so you'll need
335+to import ``Graphics.SDL`` once you've installed the bindings.
336+We'll start by defining the ``Draw`` interface, which includes a data type
337+representing a surface on which we'll draw lines and rectangles:
338+
339+.. code-block:: idris
340+
341+ interface Draw (m : Type -> Type) where
342+ Surface : Type
343+
344+We'll need to be able to create a new ``Surface`` by opening a window:
345+
346+.. code-block:: idris
347+
348+ initWindow : Int -> Int -> ST m Var [add Surface]
349+
350+However, this isn't quite right. It's possible that opening a window
351+will fail, for example if our program is running in a terminal without
352+a windowing system available. So, somehow, ``initWindow`` needs to cope
353+with the possibility of failure. We can do this by returning a
354+``Maybe Var``, rather than a ``Var``, and only adding the ``Surface``
355+on success:
356+
357+.. code-block:: idris
358+
359+ initWindow : Int -> Int -> ST m (Maybe Var) [addIfJust Surface]
360+
361+This uses a type level function ``addIfJust``, defined in ``Control.ST``
362+which returns an ``Action`` that only adds a resource if the operation
363+succeeds (that is, returns a result of the form ``Just val``.
364+
365+.. topic:: ``addIfJust`` and ``addIfRight``
366+
367+ ``Control.ST`` defines functions for constructing new resources if an
368+ operation succeeds. As well as ``addIfJust``, which adds a resource if
369+ an operation returns ``Just ty``, there's also ``addIfRight``:
370+
371+ .. code-block:: idris
372+
373+ addIfJust : Type -> Action (Maybe Var)
374+ addIfRight : Type -> Action (Either a Var)
375+
376+ Each of these is implemented in terms of the following primitive action
377+ ``Add``, which takes a function to construct a resource list from the result
378+ of an operation:
379+
380+ .. code-block:: idris
381+
382+ Add : (ty -> Resources) -> Action ty
383+
384+ Using this, you can create your own actions to add resources
385+ based on the result of an operation, if required. For example,
386+ ``addIfJust`` is implemented as follows:
387+
388+ .. code-block:: idris
389+
390+ addIfJust : Type -> Action (Maybe Var)
391+ addIfJust ty = Add (maybe [] (\var => [var ::: ty]))
392+
393+If we create windows, we'll also need to be able to delete them:
394+
395+.. code-block:: idris
396+
397+ closeWindow : (win : Var) -> ST m () [remove win Surface]
398+
399+We'll also need to respond to events such as keypresses and mouse clicks.
400+The ``Graphics.SDL`` library provides an ``Event`` type for this, and
401+we can ``poll`` for events which returns the last event which occurred,
402+if any:
403+
404+.. code-block:: idris
405+
406+ poll : ST m (Maybe Event) []
407+
408+The remaining methods of ``Draw`` are ``flip``, which flips the buffers
409+displaying everything that we've drawn since the previous ``flip``, and
410+two methods for drawing: ``filledRectangle`` and ``drawLine``.
411+
412+.. code-block:: idris
413+
414+ flip : (win : Var) -> ST m () [win ::: Surface]
415+ filledRectangle : (win : Var) -> (Int, Int) -> (Int, Int) -> Col -> ST m () [win ::: Surface]
416+ drawLine : (win : Var) -> (Int, Int) -> (Int, Int) -> Col -> ST m () [win ::: Surface]
417+
418+We define colours as follows, as four components (red, green, blue, alpha):
419+
420+.. code-block:: idris
421+
422+ data Col = MkCol Int Int Int Int
423+
424+ black : Col
425+ black = MkCol 0 0 0 255
426+
427+ red : Col
428+ red = MkCol 255 0 0 255
429+
430+ green : Col
431+ green = MkCol 0 255 0 255
432+
433+ -- Also blue, yellow, magenta, cyan, white, similarly...
434+
435+If you import ``Graphics.SDL``, you can implement the ``Draw`` interface
436+using the SDL bindings as follows:
437+
438+.. code-block:: idris
439+
440+ implementation Draw IO where
441+ Surface = State SDLSurface
442+
443+ initWindow x y = do Just srf <- lift (startSDL x y)
444+ | pure Nothing
445+ var <- new srf
446+ pure (Just var)
447+
448+ closeWindow win = do lift endSDL
449+ delete win
450+
451+ flip win = do srf <- read win
452+ lift (flipBuffers srf)
453+ poll = lift pollEvent
454+
455+ filledRectangle win (x, y) (ex, ey) (MkCol r g b a)
456+ = do srf <- read win
457+ lift $ filledRect srf x y ex ey r g b a
458+ drawLine win (x, y) (ex, ey) (MkCol r g b a)
459+ = do srf <- read win
460+ lift $ drawLine srf x y ex ey r g b a
461+
462+In this implementation, we've used ``startSDL`` to initialise a window, which,
463+returns ``Nothing`` if it fails. Since the type of ``initWindow`` states that
464+it adds a resource when it returns a value of the form ``Just val``, we
465+add the surface returned by ``startSDL`` on success, and nothing on
466+failure. We can only successfully initialise if ``startDSL`` succeeds.
467+
468+Now that we have an implementation of ``Draw``, we can try writing some
469+functions for drawing into a window and execute them via the SDL bindings.
470+For example, assuming we have a surface ``win`` to draw onto, we can write a
471+``render`` function as follows which draws a line onto a black background:
472+
473+.. code-block:: idris
474+
475+ render : Draw m => (win : Var) -> ST m () [win ::: Surface {m}]
476+ render win = do filledRectangle win (0,0) (640,480) black
477+ drawLine win (100,100) (200,200) red
478+ flip win
479+
480+The ``flip win`` at the end is necessary because the drawing primitives
481+are double buffered, to prevent flicker. We draw onto one buffer, off-screen,
482+and display the other. When we call ``flip``, it displays the off-screen
483+buffer, and creates a new off-screen buffer for drawing the next frame.
484+
485+To include this in a program, we'll write a main loop which renders our
486+image and waits for an event to indicate the user wants to close the
487+application:
488+
489+.. code-block:: idris
490+
491+ loop : Draw m => (win : Var) -> ST m () [win ::: Surface {m}]
492+ loop win = do render win
493+ Just AppQuit <- poll
494+ | _ => loop win
495+ pure ()
496+
497+Finally, we can create a main program which initialises a window, if
498+possible, then runs the main loop:
499+
500+.. code-block:: idris
501+
502+ drawMain : (ConsoleIO m, Draw m) => ST m () []
503+ drawMain = do Just win <- initWindow 640 480
504+ | Nothing => putStrLn "Can't open window"
505+ loop win
506+ closeWindow win
507+
508+We can try this at the REPL using ``run``:
509+
510+.. code::
511+
512+ *Draw> :exec run drawMain
513+
514+A higher level interface: ``TurtleGraphics``
515+--------------------------------------------
516+
517+Turtle graphics involves a "turtle" moving around the screen, drawing a line as
518+it moves with a "pen". A turtle has attributes describing its location, the
519+direction it's facing, and the current pen colour. There are commands for
520+moving the turtle forwards, turning through an angle, and changing the
521+pen colour, among other things. One possible interface would be the
522+following:
523+
524+.. code-block:: idris
525+
526+ interface TurtleGraphics (m : Type -> Type) where
527+ Turtle : Type
528+
529+ start : Int -> Int -> ST m (Maybe Var) [addIfJust Turtle]
530+ end : (t : Var) -> ST m () [Remove t Turtle]
531+
532+ fd : (t : Var) -> Int -> ST m () [t ::: Turtle]
533+ rt : (t : Var) -> Int -> ST m () [t ::: Turtle]
534+
535+ penup : (t : Var) -> ST m () [t ::: Turtle]
536+ pendown : (t : Var) -> ST m () [t ::: Turtle]
537+ col : (t : Var) -> Col -> ST m () [t ::: Turtle]
538+
539+ render : (t : Var) -> ST m () [t ::: Turtle]
540+
541+Like ``Draw``, we have a command for initialising the turtle (here called
542+``start``) which might fail if it can't create a surface for the turtle to
543+draw on. There is also a ``render`` method, which is intended to render the
544+picture drawn so far in a window. One possible program with this interface
545+is the following, with draws a colourful square:
546+
547+.. code-block:: idris
548+
549+ turtle : (ConsoleIO m, TurtleGraphics m) => ST m () []
550+ turtle = with ST do
551+ Just t <- start 640 480
552+ | Nothing => putStr "Can't make turtle\n"
553+ col t yellow
554+ fd t 100; rt t 90
555+ col t green
556+ fd t 100; rt t 90
557+ col t red
558+ fd t 100; rt t 90
559+ col t blue
560+ fd t 100; rt t 90
561+ render t
562+ end t
563+
564+.. topic:: ``with ST do``
565+
566+ The purpose of ``with ST do`` in ``turtle`` is to disambiguate ``(>>=)``,
567+ which could be either the version from the ``Monad`` interface, or the
568+ version from ``ST``. Idris can work this out itself, but it takes time to
569+ try all of the possibilities, so the ``with`` clause can
570+ speed up type checking.
571+
572+To implement the interface, we could try using ``Surface`` to represent
573+the surface for the turtle to draw on:
574+
575+.. code-block:: idris
576+
577+ implementation Draw m => TurtleGraphics m where
578+ Turtle = Surface {m}
579+
580+Knowing that a ``Turtle`` is represented as a ``Surface``, we can use the
581+methods provided by ``Draw`` to implement the turtle. Unfortunately, though,
582+this isn't quite enough. We need to store more information: in particular, the
583+turtle has several attributes which we need to store somewhere.
584+So, not only do we need to represent the turtle as a ``Surface``, we need
585+to store some additional state. We can achieve this using a *composite*
586+resource.
587+
588+Introducing composite resources
589+-------------------------------
590+
591+A *composite* resource is built up from a list of other resources, and
592+is implemented using the following type, defined by ``Control.ST``:
593+
594+.. code-block:: idris
595+
596+ data Composite : List Type -> Type
597+
598+If we have a composite resource, we can split it into its constituent
599+resources, and create new variables for each of those resources, using
600+the *split* function. For example:
601+
602+.. code-block:: idris
603+
604+ splitComp : (comp : Var) -> ST m () [comp ::: Composite [State Int, State String]]
605+ splitComp comp = do [int, str] <- split comp
606+ ?whatNow
607+
608+The call ``split comp`` extracts the ``State Int`` and ``State String`` from
609+the composite resource ``comp``, and stores them in the variables ``int``
610+and ``str`` respectively. If we check the type of ``whatNow``, we'll see
611+how this has affected the resource list:
612+
613+.. code-block:: idris
614+
615+ int : Var
616+ str : Var
617+ comp : Var
618+ m : Type -> Type
619+ --------------------------------------
620+ whatNow : STrans m () [int ::: State Int, str ::: State String, comp ::: State ()]
621+ (\result => [comp ::: Composite [State Int, State String]])
622+
623+So, we have two new resources ``int`` and ``str``, and the type of
624+``comp`` has been updated to the unit type, so currently holds no data.
625+This is to be expected: we've just extracted the data into individual
626+resources after all.
627+
628+Now that we've extracted the individual resources, we can manipulate them
629+directly (say, incrementing the ``Int`` and adding a newline to the
630+``String``) then rebuild the composite resource using ``combine``:
631+
632+.. code-block:: idris
633+
634+ splitComp : (comp : Var) ->
635+ ST m () [comp ::: Composite [State Int, State String]]
636+ splitComp comp = do [int, str] <- split comp
637+ update int (+ 1)
638+ update str (++ "\n")
639+ combine comp [int, str]
640+ ?whatNow
641+
642+As ever, we can check the type of ``whatNow`` to see the effect of
643+``combine``:
644+
645+.. code-block:: idris
646+
647+ comp : Var
648+ int : Var
649+ str : Var
650+ m : Type -> Type
651+ --------------------------------------
652+ whatNow : STrans m () [comp ::: Composite [State Int, State String]]
653+ (\result => [comp ::: Composite [State Int, State String]])
654+
655+The effect of ``combine``, therefore, is to take existing
656+resources and merge them into one composite resource. Before we run
657+``combine``, the target resource must exist (``comp`` here) and must be
658+of type ``State ()``.
659+
660+It is instructive to look at the types of ``split`` and ``combine`` to see
661+the requirements on resource lists they work with. The type of ``split``
662+is the following:
663+
664+.. code-block:: idris
665+
666+ split : (lbl : Var) -> {auto prf : InState lbl (Composite vars) res} ->
667+ STrans m (VarList vars) res (\vs => mkRes vs ++ updateRes res prf (State ()))
668+
669+The implicit ``prf`` argument says that the ``lbl`` being split must be
670+a composite resource. It returns a variable list, built from the composite
671+resource, and the ``mkRes`` function makes a list of resources of the
672+appropriate types. Finally, ``updateRes`` updates the composite resource to
673+have the type ``State ()``.
674+
675+The ``combine`` function does the inverse:
676+
677+.. code-block:: idris
678+
679+ combine : (comp : Var) -> (vs : List Var) ->
680+ {auto prf : InState comp (State ()) res} ->
681+ {auto var_prf : VarsIn (comp :: vs) res} ->
682+ STrans m () res (const (combineVarsIn res var_prf))
683+
684+The implicit ``prf`` argument here ensures that the target resource ``comp``
685+has type ``State ()``. That is, we're not overwriting any other data.
686+The implicit ``var_prf`` argument is similar to ``SubRes`` in ``call``, and
687+ensures that every variable we're using to build the composite resource
688+really does exist in the current resource list.
689+
690+We can use composite resources to implement our higher level ``TurtleGraphics``
691+API in terms of ``Draw``, and any additional resources we need.
692+
693+Implementing ``Turtle``
694+-----------------------
695+
696+Now that we've seen how to build a new resource from an existing collection,
697+we can implement ``Turtle`` using a composite resource, containing the
698+``Surface`` to draw on, and individual states for the pen colour and the
699+pen location and direction. We also have a list of lines, which describes
700+what we'll draw onto the ``Surface`` when we call ``render``:
701+
702+.. code-block:: idris
703+
704+ Turtle = Composite [Surface {m}, -- surface to draw on
705+ State Col, -- pen colour
706+ State (Int, Int, Int, Bool), -- pen location/direction/d
707+ State (List Line)] -- lines to draw on render
708+
709+A ``Line`` is defined as a start location, and end location, and a colour:
710+
711+.. code-block:: idris
712+
713+ Line : Type
714+ Line = ((Int, Int), (Int, Int), Col)
715+
716+To implement ``start``, which creates a new ``Turtle`` (or returns ``Nothing``
717+if this is impossible), we begin by initialising the drawing surface then
718+all of the components of the state. Finally, we combine all of these
719+into a composite resource for the turtle:
720+
721+.. code-block:: idris
722+
723+ start x y = do Just srf <- initWindow x y
724+ | Nothing => pure Nothing
725+ col <- new white
726+ pos <- new (320, 200, 0, True)
727+ lines <- new []
728+ turtle <- new ()
729+ combine turtle [srf, col, pos, lines]
730+ pure (Just turtle)
731+
732+To implement ``end``, which needs to dispose of the turtle,
733+we deconstruct the composite resource, close the window,
734+then remove each individual resource. Remember that we can only ``delete``
735+a ``State``, so we need to ``split`` the composite resource, close the
736+drawing surface cleanly with ``closeWindow``, then ``delete`` the states:
737+
738+.. code-block:: idris
739+
740+ end t = do [srf, col, pos, lines] <- split t
741+ closeWindow srf; delete col; delete pos; delete lines; delete t
742+
743+For the other methods, we need to ``split`` the resource to get each
744+component, and ``combine`` into a composite resource when we're done.
745+As an example, here's ``penup``:
746+
747+.. code-block:: idris
748+
749+ penup t = do [srf, col, pos, lines] <- split t -- Split the composite resource
750+ (x, y, d, _) <- read pos -- Deconstruct the pen position
751+ write pos (x, y, d, False) -- Set the pen down flag to False
752+ combine t [srf, col, pos, lines] -- Recombine the components
753+
754+The remaining operations on the turtle follow a similar pattern. See
755+``samples/ST/Graphics/Turtle.idr`` in the Idris distribution for the full
756+details. It remains to render the image created by the turtle:
757+
758+.. code-block:: idris
759+
760+ render t = do [srf, col, pos, lines] <- split t -- Split the composite resource
761+ filledRectangle srf (0, 0) (640, 480) black -- Draw a background
762+ drawAll srf !(read lines) -- Render the lines drawn by the turtle
763+ flip srf -- Flip the buffers to display the image
764+ combine t [srf, col, pos, lines]
765+ Just ev <- poll
766+ | Nothing => render t -- Keep going until a key is pressed
767+ case ev of
768+ KeyUp _ => pure () -- Key pressed, so quit
769+ _ => render t
770+ where drawAll : (srf : Var) -> List Line -> ST m () [srf ::: Surface {m}]
771+ drawAll srf [] = pure ()
772+ drawAll srf ((start, end, col) :: xs)
773+ = do drawLine srf start end col -- Draw a line in the appropriate colour
774+ drawAll srf xs
docs/st/examples.rstnew file+439
@@ -0,0 +1,439 @@
1+.. _netexample:
2+
3+***********************************
4+Example: Network Socket Programming
5+***********************************
6+
7+The POSIX sockets API supports communication between processes across a
8+network. A *socket* represents an endpoint of a network communication, and can be
9+in one of several states:
10+
11+* ``Ready``, the initial state
12+* ``Bound``, meaning that it has been bound to an address ready for incoming
13+ connections
14+* ``Listening``, meaning that it is listening for incoming connections
15+* ``Open``, meaning that it is ready for sending and receiving data;
16+* ``Closed``, meaning that it is no longer active.
17+
18+The following diagram shows how the operations provided by the API modify the
19+state, where ``Ready`` is the initial state:
20+
21+|netstate|
22+
23+If a connection is ``Open``, then we can also ``send`` messages to the
24+other end of the connection, and ``recv`` messages from it.
25+
26+The ``contrib`` package provides a module ``Network.Socket`` which
27+provides primitives for creating sockets and sending and receiving
28+messages. It includes the following functions:
29+
30+.. code-block:: idris
31+
32+ bind : (sock : Socket) -> (addr : Maybe SocketAddress) -> (port : Port) -> IO Int
33+ connect : (sock : Socket) -> (addr : SocketAddress) -> (port : Port) -> IO ResultCode
34+ listen : (sock : Socket) -> IO Int
35+ accept : (sock : Socket) -> IO (Either SocketError (Socket, SocketAddress))
36+ send : (sock : Socket) -> (msg : String) -> IO (Either SocketError ResultCode)
37+ recv : (sock : Socket) -> (len : ByteLength) -> IO (Either SocketError (String, ResultCode))
38+ close : Socket -> IO ()
39+
40+These functions cover the state transitions in the diagram above, but
41+none of them explain how the operations affect the state! It's perfectly
42+possible, for example, to try to send a message on a socket which is
43+not yet ready, or to try to receive a message after the socket is closed.
44+
45+Using ``ST``, we can provide a better API which explains exactly how
46+each operation affects the state of a connection. In this section, we'll
47+define a sockets API, then use it to implement an "echo" server which
48+responds to requests from a client by echoing back a single message sent
49+by the client.
50+
51+Defining a ``Sockets`` interface
52+================================
53+
54+Rather than using ``IO`` for low level socket programming, we'll implement
55+an interface using ``ST`` which describes precisely how each operation
56+affects the states of sockets, and describes when sockets are created
57+and removed. We'll begin by creating a type to describe the abstract state
58+of a socket:
59+
60+.. code-block:: idris
61+
62+ data SocketState = Ready | Bound | Listening | Open | Closed
63+
64+Then, we'll begin defining an interface, starting with a ``Sock`` type
65+for representing sockets, parameterised by their current state:
66+
67+.. code-block:: idris
68+
69+ interface Sockets (m : Type -> Type) where
70+ Sock : SocketState -> Type
71+
72+We create sockets using the ``socket`` method. The ``SocketType`` is defined
73+by the sockets library, and describes whether the socket is TCP, UDP,
74+or some other form. We'll use ``Stream`` for this throughout, which indicates a
75+TCP socket.
76+
77+.. code-block:: idris
78+
79+ socket : SocketType -> ST m (Either () Var) [addIfRight (Sock Ready)]
80+
81+Remember that ``addIfRight`` adds a resource if the result of the operation
82+is of the form ``Right val``. By convention in this interface, we'll use
83+``Either`` for operations which might fail, whether or not they might carry
84+any additional information about the error, so that we can consistently
85+use ``addIfRight`` and some other type level functions.
86+
87+To define a server, once we've created a socket, we need to ``bind`` it
88+to a port. We can do this with the ``bind`` method:
89+
90+.. code-block:: idris
91+
92+ bind : (sock : Var) -> (addr : Maybe SocketAddress) -> (port : Port) ->
93+ ST m (Either () ()) [sock ::: Sock Ready :-> (Sock Closed `or` Sock Bound)]
94+
95+Binding a socket might fail, for example if there is already a socket
96+bound to the given port, so again it returns a value of type ``Either``.
97+The action here uses a type level function ``or``, and says that:
98+
99+* If ``bind`` fails, the socket moves to the ``Sock Closed`` state
100+* If ``bind`` succeeds, the socket moves to the ``Sock Bound`` state, as
101+ shown in the diagram above
102+
103+``or`` is implemented as follows:
104+
105+.. code-block:: idris
106+
107+ or : a -> a -> Either b c -> a
108+ or x y = either (const x) (const y)
109+
110+So, the type of ``bind`` could equivalently be written as:
111+
112+.. code-block:: idris
113+
114+ bind : (sock : Var) -> (addr : Maybe SocketAddress) -> (port : Port) ->
115+ STrans m (Either () ()) [sock ::: Sock Ready]
116+ (either [sock ::: Sock Closed] [sock ::: Sock Bound])
117+
118+However, using ``or`` is much more concise than this, and attempts to
119+reflect the state transition diagram as directly as possible while still
120+capturing the possibility of failure.
121+
122+Once we've bound a socket to a port, we can start listening for connections
123+from clients:
124+
125+.. code-block:: idris
126+
127+ listen : (sock : Var) ->
128+ ST m (Either () ()) [sock ::: Sock Bound :-> (Sock Closed `or` Sock Listening)]
129+
130+A socket in the ``Listening`` state is ready to accept connections from
131+individual clients:
132+
133+.. code-block:: idris
134+
135+ accept : (sock : Var) ->
136+ ST m (Either () Var)
137+ [sock ::: Sock Listening, addIfRight (Sock Open)]
138+
139+If there is an incoming connection from a client, ``accept`` adds a *new*
140+resource to the end of the resource list (by convention, it's a good idea
141+to add resources to the end of the list, because this works more tidily
142+with ``updateWith``, as discussed in the previous section). So, we now
143+have *two* sockets: one continuing to listen for incoming connections,
144+and one ready for communication with the client.
145+
146+We also need methods for sending and receiving data on a socket:
147+
148+.. code-block:: idris
149+
150+ send : (sock : Var) -> String ->
151+ ST m (Either () ()) [sock ::: Sock Open :-> (Sock Closed `or` Sock Open)]
152+ recv : (sock : Var) ->
153+ ST m (Either () String) [sock ::: Sock Open :-> (Sock Closed `or` Sock Open)]
154+
155+Once we've finished communicating with another machine via a socket, we'll
156+want to ``close`` the connection and remove the socket:
157+
158+.. code-block:: idris
159+
160+ close : (sock : Var) ->
161+ {auto prf : CloseOK st} -> ST m () [sock ::: Sock st :-> Sock Closed]
162+ remove : (sock : Var) ->
163+ ST m () [Remove sock (Sock Closed)]
164+
165+We have a predicate ``CloseOK``, used by ``close`` in an implicit proof
166+argument, which describes when it is okay to close a socket:
167+
168+.. code-block:: idris
169+
170+ data CloseOK : SocketState -> Type where
171+ CloseOpen : CloseOK Open
172+ CloseListening : CloseOK Listening
173+
174+That is, we can close a socket which is ``Open``, talking to another machine,
175+which causes the communication to terminate. We can also close a socket which
176+is ``Listening`` for incoming connections, which causes the server to stop
177+accepting requests.
178+
179+In this section, we're implementing a server, but for completeness we may
180+also want a client to connect to a server on another machine. We can do
181+this with ``connect``:
182+
183+.. code-block:: idris
184+
185+ connect : (sock : Var) -> SocketAddress -> Port ->
186+ ST m (Either () ()) [sock ::: Sock Ready :-> (Sock Closed `or` Sock Open)]
187+
188+For reference, here is the complete interface:
189+
190+.. code-block:: idris
191+
192+ interface Sockets (m : Type -> Type) where
193+ Sock : SocketState -> Type
194+ socket : SocketType -> ST m (Either () Var) [addIfRight (Sock Ready)]
195+ bind : (sock : Var) -> (addr : Maybe SocketAddress) -> (port : Port) ->
196+ ST m (Either () ()) [sock ::: Sock Ready :-> (Sock Closed `or` Sock Bound)]
197+ listen : (sock : Var) ->
198+ ST m (Either () ()) [sock ::: Sock Bound :-> (Sock Closed `or` Sock Listening)]
199+ accept : (sock : Var) ->
200+ ST m (Either () Var) [sock ::: Sock Listening, addIfRight (Sock Open)]
201+ connect : (sock : Var) -> SocketAddress -> Port ->
202+ ST m (Either () ()) [sock ::: Sock Ready :-> (Sock Closed `or` Sock Open)]
203+ close : (sock : Var) -> {auto prf : CloseOK st} ->
204+ ST m () [sock ::: Sock st :-> Sock Closed]
205+ remove : (sock : Var) -> ST m () [Remove sock (Sock Closed)]
206+ send : (sock : Var) -> String ->
207+ ST m (Either () ()) [sock ::: Sock Open :-> (Sock Closed `or` Sock Open)]
208+ recv : (sock : Var) ->
209+ ST m (Either () String) [sock ::: Sock Open :-> (Sock Closed `or` Sock Open)]
210+
211+We'll see how to implement this shortly; mostly, the methods can be implemented
212+in ``IO`` by using the raw sockets API directly. First, though, we'll see
213+how to use the API to implement an "echo" server.
214+
215+Implementing an "Echo" server with ``Sockets``
216+==============================================
217+
218+At the top level, our echo server begins and ends with no resources available,
219+and uses the ``ConsoleIO`` and ``Sockets`` interfaces:
220+
221+.. code-block:: idris
222+
223+ startServer : (ConsoleIO m, Sockets m) => ST m () []
224+
225+The first thing we need to do is create a socket for binding to a port
226+and listening for incoming connections, using ``socket``. This might fail,
227+so we'll need to deal with the case where it returns ``Right sock``, where
228+``sock`` is the new socket variable, or where it returns ``Left err``:
229+
230+.. code-block:: idris
231+
232+ startServer : (ConsoleIO m, Sockets m) => ST m () []
233+ startServer =
234+ do Right sock <- socket Stream
235+ | Left err => pure ()
236+ ?whatNow
237+
238+It's a good idea to implement this kind of function interactively, step by
239+step, using holes to see what state the overall system is in after each
240+step. Here, we can see that after a successful call to ``socket``, we
241+have a socket available in the ``Ready`` state:
242+
243+.. code-block:: idris
244+
245+ sock : Var
246+ m : Type -> Type
247+ constraint : ConsoleIO m
248+ constraint1 : Sockets m
249+ --------------------------------------
250+ whatNow : STrans m () [sock ::: Sock Ready] (\result1 => [])
251+
252+Next, we need to bind the socket to a port, and start listening for
253+connections. Again, each of these could fail. If they do, we'll remove
254+the socket. Failure always results in a socket in the ``Closed`` state,
255+so all we can do is ``remove`` it:
256+
257+.. code-block:: idris
258+
259+ startServer : (ConsoleIO m, Sockets m) => ST m () []
260+ startServer =
261+ do Right sock <- socket Stream | Left err => pure ()
262+ Right ok <- bind sock Nothing 9442 | Left err => remove sock
263+ Right ok <- listen sock | Left err => remove sock
264+ ?runServer
265+
266+Finally, we have a socket which is listening for incoming connections:
267+
268+.. code-block:: idris
269+
270+ ok : ()
271+ sock : Var
272+ ok1 : ()
273+ m : Type -> Type
274+ constraint : ConsoleIO m
275+ constraint1 : Sockets m
276+ --------------------------------------
277+ runServer : STrans m () [sock ::: Sock Listening]
278+ (\result1 => [])
279+
280+We'll implement this in a separate function. The type of ``runServer``
281+tells us what the type of ``echoServer`` must be (noting that we need
282+to give the ``m`` argument to ``Sock`` explicitly):
283+
284+.. code-block:: idris
285+
286+ echoServer : (ConsoleIO m, Sockets m) => (sock : Var) ->
287+ ST m () [remove sock (Sock {m} Listening)]
288+
289+We can complete the definition of ``startServer`` as follows:
290+
291+.. code-block:: idris
292+
293+ startServer : (ConsoleIO m, Sockets m) => ST m () []
294+ startServer =
295+ do Right sock <- socket Stream | Left err => pure ()
296+ Right ok <- bind sock Nothing 9442 | Left err => remove sock
297+ Right ok <- listen sock | Left err => remove sock
298+ echoServer sock
299+
300+In ``echoServer``, we'll keep accepting requests and responding to them
301+until something fails, at which point we'll close the sockets and
302+return. We begin by trying to accept an incoming connection:
303+
304+.. code-block:: idris
305+
306+ echoServer : (ConsoleIO m, Sockets m) => (sock : Var) ->
307+ ST m () [remove sock (Sock {m} Listening)]
308+ echoServer sock =
309+ do Right new <- accept sock | Left err => do close sock; remove sock
310+ ?whatNow
311+
312+If ``accept`` fails, we need to close the ``Listening`` socket and
313+remove it before returning, because the type of ``echoServer`` requires
314+this.
315+
316+As always, implementing ``echoServer`` incrementally means that we can check
317+the state we're in as we develop. If ``accept`` succeeds, we have the
318+existing ``sock`` which is still listening for connections, and a ``new``
319+socket, which is open for communication:
320+
321+.. code-block:: idris
322+
323+ new : Var
324+ sock : Var
325+ m : Type -> Type
326+ constraint : ConsoleIO m
327+ constraint1 : Sockets m
328+ --------------------------------------
329+ whatNow : STrans m () [sock ::: Sock Listening, new ::: Sock Open]
330+ (\result1 => [])
331+
332+To complete ``echoServer``, we'll receive a message on the ``new``
333+socket, and echo it back. When we're done, we close the ``new`` socket,
334+and go back to the beginning of ``echoServer`` to handle the next
335+connection:
336+
337+.. code-block:: idris
338+
339+ echoServer : (ConsoleIO m, Sockets m) => (sock : Var) ->
340+ ST m () [remove sock (Sock {m} Listening)]
341+ echoServer sock =
342+ do Right new <- accept sock | Left err => do close sock; remove sock
343+ Right msg <- recv new | Left err => do close sock; remove sock; remove new
344+ Right ok <- send new ("You said " ++ msg)
345+ | Left err => do remove new; close sock; remove sock
346+ close new; remove new; echoServer sock
347+
348+Implementing ``Sockets``
349+========================
350+
351+To implement ``Sockets`` in ``IO``, we'll begin by giving a concrete type
352+for ``Sock``. We can use the raw sockets API (implemented in
353+``Network.Socket``) for this, and use a ``Socket`` stored in a ``State``, no
354+matter what abstract state the socket is in:
355+
356+.. code-block:: idris
357+
358+ implementation Sockets IO where
359+ Sock _ = State Socket
360+
361+Most of the methods can be implemented by using the raw socket API
362+directly, returning ``Left`` or ``Right`` as appropriate. For example,
363+we can implement ``socket``, ``bind`` and ``listen`` as follows:
364+
365+.. code-block:: idris
366+
367+ socket ty = do Right sock <- lift $ Socket.socket AF_INET ty 0
368+ | Left err => pure (Left ())
369+ lbl <- new sock
370+ pure (Right lbl)
371+ bind sock addr port = do ok <- lift $ bind !(read sock) addr port
372+ if ok /= 0
373+ then pure (Left ())
374+ else pure (Right ())
375+ listen sock = do ok <- lift $ listen !(read sock)
376+ if ok /= 0
377+ then pure (Left ())
378+ else pure (Right ())
379+
380+There is a small difficulty with ``accept``, however, because when we
381+use ``new`` to create a new resource for the open connection, it appears
382+at the *start* of the resource list, not the end. We can see this by
383+writing an incomplete definition, using ``returning`` to see what the
384+resources need to be if we return ``Right lbl``:
385+
386+.. code-block:: idris
387+
388+ accept sock = do Right (conn, addr) <- lift $ accept !(read sock)
389+ | Left err => pure (Left ())
390+ lbl <- new conn
391+ returning (Right lbl) ?fixResources
392+
393+It's convenient for ``new`` to add the resource to the beginning of the
394+list because, in general, this makes automatic proof construction with
395+an ``auto``-implicit easier for Idris. On the other hand, when we use
396+``call`` to make a smaller set of resources, ``updateWith`` puts newly
397+created resources at the *end* of the list, because in general that reduces
398+the amount of re-ordering of resources.
399+
400+If we look at the type of
401+``fixResources``, we can see what we need to do to finish ``accept``:
402+
403+.. code-block:: idris
404+
405+ _bindApp0 : Socket
406+ conn : Socket
407+ addr : SocketAddress
408+ sock : Var
409+ lbl : Var
410+ --------------------------------------
411+ fixResources : STrans IO () [lbl ::: State Socket, sock ::: State Socket]
412+ (\value => [sock ::: State Socket, lbl ::: State Socket])
413+
414+The current list of resources is ordered ``lbl``, ``sock``, and we need them
415+to be in the order ``sock``, ``lbl``. To help with this situation,
416+``Control.ST`` provides a primitive ``toEnd`` which moves a resource to the
417+end of the list. We can therefore complete ``accept`` as follows:
418+
419+.. code-block:: idris
420+
421+ accept sock = do Right (conn, addr) <- lift $ accept !(read sock)
422+ | Left err => pure (Left ())
423+ lbl <- new conn
424+ returning (Right lbl) (toEnd lbl)
425+
426+For the complete implementation of ``Sockets``, take a look at
427+``samples/ST/Net/Network.idr`` in the Idris distribution. You can also
428+find the complete echo server there, ``EchoServer.idr``. There is also
429+a higher level network protocol, ``RandServer.idr``, using a hierarchy of
430+state machines to implement a high level network communication protocol
431+in terms of the lower level sockets API. This also uses threading, to
432+handle incoming requests asynchronously. You can find some more detail
433+on threading and the random number server in the draft paper
434+`State Machines All The Way Down <https://www.idris-lang.org/drafts/sms.pdf>`_
435+by Edwin Brady.
436+
437+.. |netstate| image:: ../image/netstate.png
438+ :width: 300px
439+
docs/st/index.rstnew file+27
@@ -0,0 +1,27 @@
1+.. _st-tutorial-index:
2+
3+##########################################################
4+Implementing State-aware Systems in Idris: The ST Tutorial
5+##########################################################
6+
7+A tutorial on implementing state-aware systems using
8+the `Control.ST` library in `Idris`.
9+
10+.. note::
11+
12+ The documentation for Idris has been published under the Creative
13+ Commons CC0 License. As such to the extent possible under law, *The
14+ Idris Community* has waived all copyright and related or neighbouring
15+ rights to Documentation for Idris.
16+
17+ More information concerning the CC0 can be found online at: https://creativecommons.org/publicdomain/zero/1.0/
18+
19+.. toctree::
20+ :maxdepth: 1
21+
22+ introduction
23+ state
24+ machines
25+ composing
26+ examples
27+
docs/st/introduction.rstnew file+93
@@ -0,0 +1,93 @@
1+********
2+Overview
3+********
4+
5+Pure functional languages with dependent types such as `Idris
6+<https://www.idris-lang.org/>`_ support reasoning about programs directly
7+in the type system, promising that we can *know* a program will run
8+correctly (i.e. according to the specification in its type) simply
9+because it compiles.
10+
11+Realistically, though, software relies on state, and many components rely on state machines. For
12+example, they describe network transport protocols like TCP, and
13+implement event-driven systems and regular expression matching. Furthermore,
14+many fundamental resources like network sockets and files are, implicitly,
15+managed by state machines, in that certain operations are only valid on
16+resources in certain states, and those operations can change the states of the
17+underlying resource. For example, it only makes sense to send a message on a
18+connected network socket, and closing a socket changes its state from "open" to
19+"closed". State machines can also encode important security properties. For
20+example, in the software which implements an ATM, it’s important that the ATM
21+dispenses cash only when the machine is in a state where a card has been
22+inserted and the PIN verified.
23+
24+In this tutorial we will introduce the ``Control.ST`` library, which is included
25+with the Idris distribution (currently as part of the ``contrib`` package)
26+and supports programming and reasoning with state and side effects. This
27+tutorial assumes familiarity with pure programming in Idris, as described in
28+:ref:`tutorial-index`.
29+For further background information, the ``ST`` library is based on ideas
30+discussed in Chapter 13 (available as a free sample chapter) and Chapter 14
31+of `Type-Driven Development with Idris <https://www.manning.com/books/type-driven-development-with-idris>`_.
32+
33+The ``ST`` library allows us to write programs which are composed of multiple
34+state transition systems. It supports composition in two ways: firstly, we can
35+use several independently implemented state transition systems at once;
36+secondly, we can implement one state transition system in terms of others.
37+
38+
39+Introductory example: a data store requiring a login
40+====================================================
41+
42+Many software components rely on some form of state, and there may be
43+operations which are only valid in specific states. For example, consider
44+a secure data store in which a user must log in before getting access to
45+some secret data. This system can be in one of two states:
46+
47+* ``LoggedIn``, in which the user is allowed to read the secret
48+* ``LoggedOut``, in which the user has no access to the secret
49+
50+We can provide commands to log in, log out, and read the data, as illustrated
51+in the following diagram:
52+
53+|login|
54+
55+The ``login`` command, if it succeeds, moves the overall system state from
56+``LoggedOut`` to ``LoggedIn``. The ``logout`` command moves the state from
57+``LoggedIn`` to ``LoggedOut``. Most importantly, the ``readSecret`` command
58+is only valid when the system is in the ``LoggedIn`` state.
59+
60+We routinely use type checkers to ensure that variables and arguments are used
61+consistently. However, statically checking that operations are performed only
62+on resources in an appropriate state is not well supported by mainstream type
63+systems. In the data store example, for example, it's important to check that
64+the user is successfully logged in before using ``readSecret``. The
65+``ST`` library allows us to represent this kind of *protocol* in the type
66+system, and ensure at *compile-time* that the secret is only read when the
67+user is logged in.
68+
69+Outline
70+=======
71+
72+This tutorial starts (:ref:`introst`) by describing how to manipulate
73+individual states, introduces a data type ``STrans`` for describing stateful
74+functions, and ``ST`` which describes top level state transitions.
75+Next (:ref:`smstypes`) it describes how to represent state machines in
76+types, and how to define *interfaces* for describing stateful systems.
77+Then (:ref:`composing`) it describes how to compose systems of multiple
78+state machines. It explains how to implement systems which use several
79+state machines at once, and how to implement a high level stateful system
80+in terms of lower level systems.
81+Finally (:ref:`netexample`) we'll see a specific example of a stateful
82+API in practice, implementing the POSIX network sockets API.
83+
84+The ``Control.ST`` library is also described in a draft paper by
85+`Edwin Brady <https://edwinb.wordpress.com/>`_, "State Machines All The Way
86+Down", available `here <https://www.idris-lang.org/drafts/sms.pdf>`_.
87+This paper presents many of the examples from this tutorial, and describes
88+the motivation, design and implementation of the library in more depth.
89+
90+.. |login| image:: ../image/login.png
91+ :width: 500px
92+
93+
docs/st/machines.rstnew file+536
@@ -0,0 +1,536 @@
1+.. _smstypes:
2+
3+***********************
4+State Machines in Types
5+***********************
6+
7+In the introduction, we saw the following state transition diagram representing
8+the (abstract) states of a data store, and the actions we can perform on the
9+store:
10+
11+|login|
12+
13+We say that these are the *abstract* states of the store, because the concrete
14+state will contain a lot more information: for example, it might contain
15+user names, hashed passwords, the store contents, and so on. However, as far
16+as we are concerned for the actions ``login``, ``logout`` and ``readSecret``,
17+it's whether we are logged in or not which affects which are valid.
18+
19+We've seen how to manipulate states using ``ST``, and some small examples
20+of dependent types in states. In this section, we'll see how to use
21+``ST`` to provide a safe API for the data store. In the API, we'll encode
22+the above diagram in the types, in such a way that we can only execute the
23+operations ``login``, ``logout`` and ``readSecret`` when the state is
24+valid.
25+
26+So far, we've used ``State`` and the primitive operations, ``new``, ``read``,
27+``write`` and ``delete`` to manipulate states. For the data store API,
28+however, we'll begin by defining an *interface* (see :ref:`sect-interfaces` in
29+the Idris tutorial) which describes the operations on the store, and explains
30+in their types exactly when each operation is valid, and how it affects
31+the store's state. By using an interface, we can be sure that
32+this is the *only* way to access the store.
33+
34+Defining an interface for the data store
35+========================================
36+
37+We'll begin by defining a data type, in a file ``Login.idr``, which represents
38+the two abstract states of the store, either ``LoggedOut`` or ``LoggedIn``:
39+
40+.. code-block:: idris
41+
42+ data Access = LoggedOut | LoggedIn
43+
44+We can define a data type for representing the current state of a store,
45+holding all of the necessary information (this might be user names, hashed
46+passwords, store contents and so on) and parameterise it by the logged in
47+status of the store:
48+
49+.. code-block:: idris
50+
51+ Store : Access -> Type
52+
53+Rather than defining a concrete type now, however, we'll include this in
54+a data store *interface* and define a concrete type later:
55+
56+.. code-block:: idris
57+
58+ interface DataStore (m : Type -> Type) where
59+ Store : Access -> Type
60+
61+We can continue to populate this interface with operations on the store. Among
62+other advantages, by separating the *interface* from its *implementation* we
63+can provide different concrete implementations for different contexts.
64+Furthermore, we can write programs which work with a store without needing
65+to know any details of how the store is implemented.
66+
67+We'll need to be able to ``connect`` to a store, and ``disconnect`` when
68+we're done. Add the following methods to the ``DataStore`` interface:
69+
70+.. code-block:: idris
71+
72+ connect : ST m Var [add (Store LoggedOut)]
73+ disconnect : (store : Var) -> ST m () [remove store (Store LoggedOut)]
74+
75+The type of ``connect`` says that it returns a new resource which has the
76+initial type ``Store LoggedOut``. Conversely, ``disconnect``, given a
77+resource in the state ``Store LoggedOut``, removes that resource.
78+We can see more clearly what ``connect`` does by trying the following
79+(incomplete) definition:
80+
81+.. code-block:: idris
82+
83+ doConnect : DataStore m => ST m () []
84+ doConnect = do st <- connect
85+ ?whatNow
86+
87+Note that we're working in a *generic* context ``m``, constrained so that
88+there must be an implementation of ``DataStore`` for ``m`` to be able to
89+execute ``doConnect``.
90+If we check the type of ``?whatNow``, we'll see that the remaining
91+operations begin with a resource ``st`` in the state ``Store LoggedOut``,
92+and we need to finish with no resources.
93+
94+.. code-block:: idris
95+
96+ m : Type -> Type
97+ constraint : DataStore m
98+ st : Var
99+ --------------------------------------
100+ whatNow : STrans m () [st ::: Store LoggedOut] (\result => [])
101+
102+Then, we can remove the resource using ``disconnect``:
103+
104+.. code-block:: idris
105+
106+ doConnect : DataStore m => ST m () []
107+ doConnect = do st <- connect
108+ disconnect st
109+ ?whatNow
110+
111+Now checking the type of ``?whatNow`` shows that we have no resources
112+available:
113+
114+.. code-block:: idris
115+
116+ m : Type -> Type
117+ constraint : DataStore m
118+ st : Var
119+ --------------------------------------
120+ whatNow : STrans m () [] (\result => [])
121+
122+To continue our implementation of the ``DataStore`` interface, next we'll add a
123+method for reading the secret data. This requires that the ``store`` is in the
124+state ``Store LoggedIn``:
125+
126+.. code-block:: idris
127+
128+ readSecret : (store : Var) -> ST m String [store ::: Store LoggedIn]
129+
130+At this point we can try writing a function which connects to a store,
131+reads the secret, then disconnects. However, it will be unsuccessful, because
132+``readSecret`` requires us to be logged in:
133+
134+.. code-block:: idris
135+
136+ badGet : DataStore m => ST m () []
137+ badGet = do st <- connect
138+ secret <- readSecret st
139+ disconnect st
140+
141+This results in the following error, because ``connect`` creates a new
142+store in the ``LoggedOut`` state, and ``readSecret`` requires the store
143+to be in the ``LoggedIn`` state:
144+
145+.. code-block:: idris
146+
147+ When checking an application of function Control.ST.>>=:
148+ Error in state transition:
149+ Operation has preconditions: [st ::: Store LoggedOut]
150+ States here are: [st ::: Store LoggedIn]
151+ Operation has postconditions: \result => []
152+ Required result states here are: \result => []
153+
154+The error message explains how the required input states (the preconditions)
155+and the required output states (the postconditions) differ from the states
156+in the operation. In order to use ``readSecret``, we'll need a way to get
157+from a ``Store LoggedOut`` to a ``Store LoggedIn``. As a first attempt,
158+we can try the following type for ``login``:
159+
160+.. code-block:: idris
161+
162+ login : (store : Var) -> ST m () [store ::: Store LoggedOut :-> Store LoggedIn] -- Incorrect type!
163+
164+Note that in the *interface* we say nothing about *how* ``login`` works;
165+merely how it affects the overall state. Even so, there is a problem with
166+the type of ``login``, because it makes the assumption that it will always
167+succeed. If it fails - for example because the implementation prompts for
168+a password and the user enters the password incorrectly - then it must not
169+result in a ``LoggedIn`` store.
170+
171+Instead, therefore, ``login`` will return whether logging in was successful,
172+via the following type;
173+
174+.. code-block:: idris
175+
176+ data LoginResult = OK | BadPassword
177+
178+Then, we can *calculate* the result state (see :ref:`depstate`) from the
179+result. Add the following method to the ``DataStore`` interface:
180+
181+.. code-block:: idris
182+
183+ login : (store : Var) ->
184+ ST m LoginResult [store ::: Store LoggedOut :->
185+ (\res => Store (case res of
186+ OK => LoggedIn
187+ BadPassword => LoggedOut))]
188+
189+If ``login`` was successful, then the state after ``login`` is
190+``Store LoggedIn``. Otherwise, the state is ``Store LoggedOut``.
191+
192+To complete the interface, we'll add a method for logging out of the store.
193+We'll assume that logging out is always successful, and moves the store
194+from the ``Store LoggedIn`` state to the ``Store LoggedOut`` state.
195+
196+.. code-block:: idris
197+
198+ logout : (store : Var) -> ST m () [store ::: Store LoggedIn :-> Store LoggedOut]
199+
200+This completes the interface, repeated in full for reference below:
201+
202+.. code-block:: idris
203+
204+ interface DataStore (m : Type -> Type) where
205+ Store : Access -> Type
206+
207+ connect : ST m Var [add (Store LoggedOut)]
208+ disconnect : (store : Var) -> ST m () [remove store (Store LoggedOut)]
209+
210+ readSecret : (store : Var) -> ST m String [store ::: Store LoggedIn]
211+ login : (store : Var) ->
212+ ST m LoginResult [store ::: Store LoggedOut :->
213+ (\res => Store (case res of
214+ OK => LoggedIn
215+ BadPassword => LoggedOut))]
216+ logout : (store : Var) -> ST m () [store ::: Store LoggedIn :-> Store LoggedOut]
217+
218+Before we try creating any implementations of this interface, let's see how
219+we can write a function with it, to log into a data store, read the secret
220+if login is successful, then log out again.
221+
222+Writing a function with the data store
223+======================================
224+
225+As an example of working with the ``DataStore`` interface, we'll write a
226+function ``getData``, which connects to a store in order to read some data from
227+it. We'll write this function interactively, step by step, using the types of
228+the operations to guide its development. It has the following type:
229+
230+.. code-block:: idris
231+
232+ getData : (ConsoleIO m, DataStore m) => ST m () []
233+
234+This type means that there are no resources available on entry or exit.
235+That is, the overall list of actions is ``[]``, meaning that at least
236+externally, the function has no overall effect on the resources. In other
237+words, for every resource we create during ``getData``, we'll also need to
238+delete it before exit.
239+
240+Since we want to use methods of the ``DataStore`` interface, we'll
241+constraint the computation context ``m`` so that there must be an
242+implementation of ``DataStore``. We also have a constraint ``ConsoleIO m``
243+so that we can display any data we read from the store, or any error
244+messages.
245+
246+We start by connecting to the store, creating a new resource ``st``, then
247+trying to ``login``:
248+
249+.. code-block:: idris
250+
251+ getData : (ConsoleIO m, DataStore m) => ST m () []
252+ getData = do st <- connect
253+ ok <- login st
254+ ?whatNow
255+
256+Logging in will either succeed or fail, as reflected by the value of
257+``ok``. If we check the type of ``?whatNow``, we'll see what state the
258+store currently has:
259+
260+.. code-block:: idris
261+
262+ m : Type -> Type
263+ constraint : ConsoleIO m
264+ constraint1 : DataStore m
265+ st : Var
266+ ok : LoginResult
267+ --------------------------------------
268+ whatNow : STrans m () [st ::: Store (case ok of
269+ OK => LoggedIn
270+ BadPassword => LoggedOut)]
271+ (\result => [])
272+
273+The current state of ``st`` therefore depends on the value of ``ok``,
274+meaning that we can make progress by case splitting on ``ok``:
275+
276+.. code-block:: idris
277+
278+ getData : (ConsoleIO m, DataStore m) => ST m () []
279+ getData = do st <- connect
280+ ok <- login st
281+ case ok of
282+ OK => ?whatNow_1
283+ BadPassword => ?whatNow_2
284+
285+The types of the holes in each branch, ``?whatNow_1`` and ``?whatNow_2``,
286+show how the state changes depending on whether logging in was successful.
287+If it succeeded, the store is ``LoggedIn``:
288+
289+.. code-block:: idris
290+
291+ --------------------------------------
292+ whatNow_1 : STrans m () [st ::: Store LoggedIn] (\result => [])
293+
294+On the other hand, if it failed, the store is ``LoggedOut``:
295+
296+.. code-block:: idris
297+
298+ --------------------------------------
299+ whatNow_2 : STrans m () [st ::: Store LoggedOut] (\result => [])
300+
301+In ``?whatNow_1``, since we've successfully logged in, we can now read
302+the secret and display it to the console:
303+
304+.. code-block:: idris
305+
306+ getData : (ConsoleIO m, DataStore m) => ST m () []
307+ getData = do st <- connect
308+ ok <- login st
309+ case ok of
310+ OK => do secret <- readSecret st
311+ putStrLn ("Secret is: " ++ show secret)
312+ ?whatNow_1
313+ BadPassword => ?whatNow_2
314+
315+We need to finish the ``OK`` branch with no resources available. We can
316+do this by logging out of the store then disconnecting:
317+
318+.. code-block:: idris
319+
320+ getData : (ConsoleIO m, DataStore m) => ST m () []
321+ getData = do st <- connect
322+ ok <- login st
323+ case ok of
324+ OK => do secret <- readSecret st
325+ putStrLn ("Secret is: " ++ show secret)
326+ logout st
327+ disconnect st
328+ BadPassword => ?whatNow_2
329+
330+Note that we *must* ``logout`` of ``st`` before calling ``disconnect``,
331+because ``disconnect`` requires that the store is in the ``LoggedOut``
332+state.
333+
334+Furthermore, we can't simply use ``delete`` to remove the resource, as
335+we did with the ``State`` examples in the previous section, because
336+``delete`` only works when the resource has type ``State ty``, for some
337+type ``ty``. If we try to use ``delete`` instead of ``disconnect``, we'll
338+see an error message like the following:
339+
340+.. code-block:: idris
341+
342+ When checking argument prf to function Control.ST.delete:
343+ Can't find a value of type
344+ InState st (State st) [st ::: Store LoggedOut]
345+
346+In other words, the type checker can't find a proof that the resource
347+``st`` has a type of the form ``State st``, because its type is
348+``Store LoggedOut``. Since ``Store`` is part of the ``DataStore`` interface,
349+we *can't* yet know the concrete representation of the ``Store``, so we
350+need to remove the resource via the interface, with ``disconnect``, rather
351+than directly with ``delete``.
352+
353+We can complete ``getData`` as follows, using a pattern matching bind
354+alternative (see the Idris tutorial, :ref:`monadsdo`) rather than a
355+``case`` statement to catch the possibility of an error with ``login``:
356+
357+.. code-block:: idris
358+
359+ getData : (ConsoleIO m, DataStore m) => ST m () []
360+ getData = do st <- connect
361+ OK <- login st
362+ | BadPassword => do putStrLn "Failure"
363+ disconnect st
364+ secret <- readSecret st
365+ putStrLn ("Secret is: " ++ show secret)
366+ logout st
367+ disconnect st
368+
369+We can't yet try this out, however, because we don't have any implementations
370+of ``DataStore``! If we try to execute it in an ``IO`` context, for example,
371+we'll get an error saying that there's no implementation of ``DataStore IO``:
372+
373+.. code::
374+
375+ *Login> :exec run {m = IO} getData
376+ When checking an application of function Control.ST.run:
377+ Can't find implementation for DataStore IO
378+
379+The final step in implementing a data store which correctly follows the
380+state transition diagram, therefore, is to provide an implementation
381+of ``DataStore``.
382+
383+Implementing the interface
384+==========================
385+
386+To execute ``getData`` in ``IO``, we'll need to provide an implementation
387+of ``DataStore`` which works in the ``IO`` context. We can begin as
388+follows:
389+
390+.. code-block:: idris
391+
392+ implementation DataStore IO where
393+
394+Then, we can ask Idris to populate the interface with skeleton definitions
395+for the necessary methods (press ``Ctrl-Alt-A`` in Atom for "add definition"
396+or the corresponding shortcut for this in the Idris mode in your favourite
397+editor):
398+
399+.. code-block:: idris
400+
401+ implementation DataStore IO where
402+ Store x = ?DataStore_rhs_1
403+ connect = ?DataStore_rhs_2
404+ disconnect store = ?DataStore_rhs_3
405+ readSecret store = ?DataStore_rhs_4
406+ login store = ?DataStore_rhs_5
407+ logout store = ?DataStore_rhs_6
408+
409+The first decision we'll need to make is how to represent the data store.
410+We'll keep this simple, and store the data as a single ``String``, using
411+a hard coded password to gain access. So, we can define ``Store`` as
412+follows, using a ``String`` to represent the data no matter whether we
413+are ``LoggedOut`` or ``LoggedIn``:
414+
415+.. code-block:: idris
416+
417+ Store x = State String
418+
419+Now that we've given a concrete type for ``Store``, we can implement operations
420+for connecting, disconnecting, and accessing the data. And, since we used
421+``State``, we can use ``new``, ``delete``, ``read`` and ``write`` to
422+manipulate the store.
423+
424+Looking at the types of the holes tells us how we need to manipulate the
425+state. For example, the ``?DataStore_rhs_2`` hole tells us what we need
426+to do to implement ``connect``. We need to return a new ``Var`` which
427+represents a resource of type ``State String``:
428+
429+.. code-block:: idris
430+
431+ --------------------------------------
432+ DataStore_rhs_2 : STrans IO Var [] (\result => [result ::: State String])
433+
434+We can implement this by creating a new variable with some data for the
435+content of the store (we can use any ``String`` for this) and returning
436+that variable:
437+
438+.. code-block:: idris
439+
440+ connect = do store <- new "Secret Data"
441+ pure store
442+
443+For ``disconnect``, we only need to delete the resource:
444+
445+.. code-block:: idris
446+
447+ disconnect store = delete store
448+
449+For ``readSecret``, we need to read the secret data and return the
450+``String``. Since we now know the concrete representation of the data is
451+a ``State String``, we can use ``read`` to access the data directly:
452+
453+.. code-block:: idris
454+
455+ readSecret store = read store
456+
457+We'll do ``logout`` next and return to ``login``. Checking the hole
458+reveals the following:
459+
460+.. code-block:: idris
461+
462+ store : Var
463+ --------------------------------------
464+ DataStore_rhs_6 : STrans IO () [store ::: State String] (\result => [store ::: State String])
465+
466+So, in this minimal implementation, we don't actually have to do anything!
467+
468+.. code-block:: idris
469+
470+ logout store = pure ()
471+
472+For ``login``, we need to return whether logging in was successful. We'll
473+do this by prompting for a password, and returning ``OK`` if it matches
474+a hard coded password, or ``BadPassword`` otherwise:
475+
476+.. code-block:: idris
477+
478+ login store = do putStr "Enter password: "
479+ p <- getStr
480+ if p == "Mornington Crescent"
481+ then pure OK
482+ else pure BadPassword
483+
484+For reference, here is the complete implementation which allows us to
485+execute a ``DataStore`` program at the REPL:
486+
487+.. code-block:: idris
488+
489+ implementation DataStore IO where
490+ Store x = State String
491+ connect = do store <- new "Secret Data"
492+ pure store
493+ disconnect store = delete store
494+ readSecret store = read store
495+ login store = do putStr "Enter password: "
496+ p <- getStr
497+ if p == "Mornington Crescent"
498+ then pure OK
499+ else pure BadPassword
500+ logout store = pure ()
501+
502+Finally, we can try this at the REPL as follows (Idris defaults to the
503+``IO`` context at the REPL if there is an implementation available, so no
504+need to give the ``m`` argument explicitly here):
505+
506+.. code::
507+
508+ *Login> :exec run getData
509+ Enter password: Mornington Crescent
510+ Secret is: "Secret Data"
511+
512+ *Login> :exec run getData
513+ Enter password: Dollis Hill
514+ Failure
515+
516+We can only use ``read``, ``write``, ``new`` and ``delete`` on a resource
517+with a ``State`` type. So, *within* the implementation of ``DataStore``,
518+or anywhere where we know the context is ``IO``, we can access the data store
519+however we like: this is where the internal details of ``DataStore`` are
520+implemented. However, if we merely have a constraint ``DataStore m``, we can't
521+know how the store is implemented, so we can only access via the API given
522+by the ``DataStore`` interface.
523+
524+It is therefore good practice to use a *generic* context ``m`` for functions
525+like ``getData``, and constrain by only the interfaces we need, rather than
526+using a concrete context ``IO``.
527+
528+We've now seen how to manipulate states, and how to encapsulate state
529+transitions for a specific system like the data store in an interface.
530+However, realistic systems will need to *compose* state machines. We'll
531+either need to use more than one state machine at a time, or implement one
532+state machine in terms of one or more others. We'll see how to achieve this
533+in the next section.
534+
535+.. |login| image:: ../image/login.png
536+ :width: 500px
docs/st/state.rstnew file+654

This diff is too big to show here.

docs/tutorial/conclusions.rst+6−6

This diff is too big to show here.

docs/tutorial/index.rst+5−3

This diff is too big to show here.

docs/tutorial/interactive.rst+5−6

This diff is too big to show here.

docs/tutorial/interfaces.rst+73−19

This diff is too big to show here.

docs/tutorial/interp.rst+3−3

This diff is too big to show here.

docs/tutorial/introduction.rst+7−2

This diff is too big to show here.

docs/tutorial/miscellany.rst+51−17

This diff is too big to show here.

docs/tutorial/modules.rst+25−52

This diff is too big to show here.

docs/tutorial/packages.rst+141−23

This diff is too big to show here.

docs/tutorial/starting.rst+2−1

This diff is too big to show here.

docs/tutorial/syntax.rst+11−11

This diff is too big to show here.

docs/tutorial/testing.rstdeleted−85

This diff is too big to show here.

docs/tutorial/theorems.rst+145−6

This diff is too big to show here.

docs/tutorial/typesfuns.rst+149−150

This diff is too big to show here.

docs/tutorial/views.rst+77−19

This diff is too big to show here.

idris-tutorial.pdf

Binary file not shown.

idris.cabal+155−93

This diff is too big to show here.

jsrts/Runtime-browser.jsdeleted−17

This diff is too big to show here.

jsrts/Runtime-common.js+20−115

This diff is too big to show here.

jsrts/Runtime-javascript.jsnew file+15

This diff is too big to show here.

jsrts/Runtime-node.js+34−36

This diff is too big to show here.

jsrts/jsbn/jsbn-browser.jsnew file+1353

This diff is too big to show here.

jsrts/jsbn/jsbn-node.jsnew file+1

This diff is too big to show here.

jsrts/jsbn/jsbn.jsdeleted−1238

This diff is too big to show here.

libs/Makefile−1

This diff is too big to show here.

libs/base/Control/Catchable.idr+24−1

This diff is too big to show here.

libs/base/Control/Category.idr+1−1

This diff is too big to show here.

libs/base/Control/Isomorphism.idr+37−29

This diff is too big to show here.

libs/base/Control/Monad/Identity.idr+23−4

This diff is too big to show here.

libs/base/Control/Monad/RWS.idr+7−1

This diff is too big to show here.

libs/base/Control/Monad/State.idr+4

This diff is too big to show here.

libs/base/Control/Monad/Writer.idr+3

This diff is too big to show here.

libs/base/Data/Bits.idr+69−6

This diff is too big to show here.

libs/base/Data/Buffer.idrnew file+170

This diff is too big to show here.

libs/base/Data/Complex.idr+14−16

This diff is too big to show here.

libs/base/Data/Fin.idr+10−1

This diff is too big to show here.

libs/base/Data/HVect.idr+4−4

This diff is too big to show here.

libs/base/Data/IORef.idrnew file+61

This diff is too big to show here.

libs/base/Data/List.idr+24−9

This diff is too big to show here.

libs/base/Data/List/Quantifiers.idr+5

This diff is too big to show here.

libs/base/Data/List/Views.idr+18−24

This diff is too big to show here.

libs/base/Data/Morphisms.idr+53−25

This diff is too big to show here.

libs/base/Data/Nat/Views.idr+10−14

This diff is too big to show here.

libs/base/Data/Primitives/Views.idr+19−15

This diff is too big to show here.

libs/base/Data/So.idr+11−1

This diff is too big to show here.

libs/base/Data/SortedSet.idrdeleted−28

This diff is too big to show here.

libs/base/Data/String.idr+3−1

This diff is too big to show here.

libs/base/Data/String/Views.idr+2

This diff is too big to show here.

libs/base/Data/Vect.idr+513−114

This diff is too big to show here.

libs/base/Data/Vect/Views.idr+10−10

This diff is too big to show here.

libs/base/Debug/Error.idr+3−6

This diff is too big to show here.

libs/base/Language/Reflection/Utils.idr+20−4

This diff is too big to show here.

libs/base/Makefile+4−3

This diff is too big to show here.

libs/base/System.idr+52−6

This diff is too big to show here.

libs/base/System/Concurrency/Channels.idr+9−2

This diff is too big to show here.

libs/base/System/Concurrency/Raw.idr+13−8

This diff is too big to show here.

libs/base/base.ipkg+51−33

This diff is too big to show here.

libs/contrib/CFFI/Memory.idr+3−2

This diff is too big to show here.

libs/contrib/CFFI/Types.idr+10−8

This diff is too big to show here.

libs/contrib/Control/Algebra.idr+14

This diff is too big to show here.

libs/contrib/Control/Algebra/Lattice.idr+16

This diff is too big to show here.

libs/contrib/Control/Algebra/Laws.idrnew file+153

This diff is too big to show here.

libs/contrib/Control/Algebra/NumericImplementations.idr+26−6

This diff is too big to show here.

libs/contrib/Control/Delayed.idrnew file+26

This diff is too big to show here.

libs/contrib/Control/Isomorphism/Extra.idrnew file+42

This diff is too big to show here.

libs/contrib/Control/Isomorphism/Fin.idrnew file+54

This diff is too big to show here.

libs/contrib/Control/Isomorphism/Vect.idrnew file+155

This diff is too big to show here.

libs/contrib/Control/Monad/Syntax.idrnew file+18

This diff is too big to show here.

libs/contrib/Control/Pipeline.idrnew file+26

This diff is too big to show here.

libs/contrib/Control/ST.idrnew file+660

This diff is too big to show here.

libs/contrib/Control/ST/Exception.idrnew file+38

This diff is too big to show here.

libs/contrib/Control/ST/File.idrnew file+247

This diff is too big to show here.

libs/contrib/Control/ST/ImplicitCall.idrnew file+13

This diff is too big to show here.

libs/contrib/Control/ST/Random.idrnew file+42

This diff is too big to show here.

libs/contrib/Data/Bool/Extra.idrnew file+82

This diff is too big to show here.

libs/contrib/Data/BoundedList.idr+29

This diff is too big to show here.

libs/contrib/Data/Chain.idrnew file+46

This diff is too big to show here.

libs/contrib/Data/CoList.idr+1−1

This diff is too big to show here.

libs/contrib/Data/Combinators.idrnew file+38

This diff is too big to show here.

libs/contrib/Data/Combinators/Applicative.idrnew file+27

This diff is too big to show here.

libs/contrib/Data/Combinators/Arrow.idrnew file+15

This diff is too big to show here.

libs/contrib/Data/Fin/Extra.idrnew file+86

This diff is too big to show here.

libs/contrib/Data/Fuel.idrnew file+18

This diff is too big to show here.

libs/contrib/Data/Heap.idr−4

This diff is too big to show here.

libs/contrib/Data/IOArray.idrnew file+47

This diff is too big to show here.

libs/contrib/Data/List/Group.idrnew file+27

This diff is too big to show here.

libs/contrib/Data/List/Permutations.idrnew file+12

This diff is too big to show here.

libs/contrib/Data/List/Reverse.idrnew file+99

This diff is too big to show here.

libs/contrib/Data/List/Zipper.idrnew file+160

This diff is too big to show here.

libs/contrib/Data/Logic/Propositional.idrnew file+161

This diff is too big to show here.

libs/contrib/Data/Matrix/Numeric.idr+3−1

This diff is too big to show here.

libs/contrib/Data/Monoid.idrnew file+33

This diff is too big to show here.

libs/contrib/Data/Nat.idrnew file+25

This diff is too big to show here.

libs/contrib/Data/Nat/Ack.idrnew file+60

This diff is too big to show here.

libs/contrib/Data/Nat/Fact.idrnew file+56

This diff is too big to show here.

libs/contrib/Data/Nat/Fib.idrnew file+50

This diff is too big to show here.

libs/contrib/Data/Nat/Parity.idrnew file+217

This diff is too big to show here.

libs/contrib/Data/Pairs/Implicit.idrnew file+13

This diff is too big to show here.

libs/contrib/Data/PosNat.idrnew file+57

This diff is too big to show here.

libs/contrib/Data/Sign.idr+29

This diff is too big to show here.

libs/contrib/Data/SortedBag.idrnew file+127

This diff is too big to show here.

libs/contrib/Data/SortedMap.idr+66−2

This diff is too big to show here.

libs/contrib/Data/SortedSet.idr+34−3

This diff is too big to show here.

libs/contrib/Data/Stream/Extra.idrnew file+10

This diff is too big to show here.

libs/contrib/Data/String.idrdeleted−31

This diff is too big to show here.

libs/contrib/Data/String/Extra.idrnew file+88

This diff is too big to show here.

libs/contrib/Data/ZZ.idr+206−8

This diff is too big to show here.

libs/contrib/Interfaces/Correlative.idrnew file+63

This diff is too big to show here.

libs/contrib/Interfaces/Proposition.idrnew file+32

This diff is too big to show here.

libs/contrib/Interfaces/Verified.idr+285−49

This diff is too big to show here.

libs/contrib/Language/JSON.idrnew file+14

This diff is too big to show here.

libs/contrib/Language/JSON/Data.idrnew file+98

This diff is too big to show here.

libs/contrib/Language/JSON/Lexer.idrnew file+40

This diff is too big to show here.

libs/contrib/Language/JSON/Parser.idrnew file+71

This diff is too big to show here.

libs/contrib/Language/JSON/String.idrnew file+16

This diff is too big to show here.

libs/contrib/Language/JSON/String/Lexer.idrnew file+38

This diff is too big to show here.

libs/contrib/Language/JSON/String/Parser.idrnew file+25

This diff is too big to show here.

libs/contrib/Language/JSON/String/Tokens.idrnew file+60

This diff is too big to show here.

libs/contrib/Language/JSON/Tokens.idrnew file+72

This diff is too big to show here.

libs/contrib/Makefile+4−3

This diff is too big to show here.

libs/contrib/Network/Cgi.idr+3

This diff is too big to show here.

libs/contrib/Network/Socket.idr+31−396

This diff is too big to show here.

libs/contrib/Network/Socket/Data.idrnew file+172

This diff is too big to show here.

libs/contrib/Network/Socket/Raw.idrnew file+199

This diff is too big to show here.

libs/contrib/Test/Unit.idrnew file+14

This diff is too big to show here.

libs/contrib/Test/Unit/Assertions.idrnew file+37

This diff is too big to show here.

libs/contrib/Test/Unit/Display.idrnew file+27

This diff is too big to show here.

libs/contrib/Test/Unit/Generic.idrnew file+43

This diff is too big to show here.

libs/contrib/Test/Unit/Runners.idrnew file+36

This diff is too big to show here.

libs/contrib/Text/Lexer.idrnew file+324

This diff is too big to show here.

libs/contrib/Text/Lexer/Core.idrnew file+193

This diff is too big to show here.

libs/contrib/Text/Literate.idrnew file+155

This diff is too big to show here.

libs/contrib/Text/Parser.idrnew file+226

This diff is too big to show here.

libs/contrib/Text/Parser/Core.idrnew file+265

This diff is too big to show here.

libs/contrib/Text/PrettyPrint/WL.idrnew file+18

This diff is too big to show here.

libs/contrib/Text/PrettyPrint/WL/Characters.idrnew file+103

This diff is too big to show here.

libs/contrib/Text/PrettyPrint/WL/Combinators.idrnew file+259

This diff is too big to show here.

libs/contrib/Text/PrettyPrint/WL/Core.idrnew file+226

This diff is too big to show here.

libs/contrib/Text/Quantity.idrnew file+38

This diff is too big to show here.

libs/contrib/Text/Token.idrnew file+38

This diff is too big to show here.

libs/contrib/contrib.ipkg+105−20

This diff is too big to show here.

libs/effects/Effect/Exception.idr+1−2

This diff is too big to show here.

libs/effects/Effect/File.idr+4−4

This diff is too big to show here.

libs/effects/Effect/Logging/Category.idr+2−2

This diff is too big to show here.

libs/effects/Effect/Logging/Level.idr+9−9

This diff is too big to show here.

libs/effects/Effect/Perf.idr+1−1

This diff is too big to show here.

libs/effects/Effect/Random.idr+21−4

This diff is too big to show here.

libs/effects/Effect/System.idr+7

This diff is too big to show here.

libs/effects/Effects.idr+6−7

This diff is too big to show here.

libs/effects/Makefile+2−1

This diff is too big to show here.

libs/effects/effects.ipkg+12−10

This diff is too big to show here.

libs/oldeffects/Effect/Default.idrdeleted−44

This diff is too big to show here.

libs/oldeffects/Effect/Exception.idrdeleted−41

This diff is too big to show here.

libs/oldeffects/Effect/File.idrdeleted−128

This diff is too big to show here.

libs/oldeffects/Effect/Memory.idrdeleted−175

This diff is too big to show here.

libs/oldeffects/Effect/Monad.idrdeleted−21

This diff is too big to show here.

libs/oldeffects/Effect/Random.idrdeleted−47

This diff is too big to show here.

libs/oldeffects/Effect/Select.idrdeleted−23

This diff is too big to show here.

libs/oldeffects/Effect/State.idrdeleted−40

This diff is too big to show here.

libs/oldeffects/Effect/StdIO.idrdeleted−60

This diff is too big to show here.

libs/oldeffects/Effect/System.idrdeleted−43

This diff is too big to show here.

libs/oldeffects/Effects.idrdeleted−333

This diff is too big to show here.

libs/oldeffects/Makefiledeleted−22

This diff is too big to show here.

libs/oldeffects/effects.ipkgdeleted−9

This diff is too big to show here.

libs/prelude/Builtins.idr+21−24

This diff is too big to show here.

libs/prelude/Decidable/Equality.idr+31−16

This diff is too big to show here.

libs/prelude/IO.idr+8−3

This diff is too big to show here.

libs/prelude/Language/Reflection.idr+38−87

This diff is too big to show here.

libs/prelude/Language/Reflection/Elab.idr+9−6

This diff is too big to show here.

libs/prelude/Language/Reflection/Errors.idr−1

This diff is too big to show here.

libs/prelude/Makefile+3−2

This diff is too big to show here.

libs/prelude/Prelude.idr+26−10

This diff is too big to show here.

libs/prelude/Prelude/Algebra.idr−2

This diff is too big to show here.

libs/prelude/Prelude/Applicative.idr+4−4

This diff is too big to show here.

libs/prelude/Prelude/Basics.idr+1−2

This diff is too big to show here.

libs/prelude/Prelude/Bits.idr+85−28

This diff is too big to show here.

libs/prelude/Prelude/Bool.idr+13−3

This diff is too big to show here.

libs/prelude/Prelude/Cast.idr+1−1

This diff is too big to show here.

libs/prelude/Prelude/Chars.idr+12−2

This diff is too big to show here.

libs/prelude/Prelude/Doubles.idr+4−1

This diff is too big to show here.

libs/prelude/Prelude/Either.idr+5−1

This diff is too big to show here.

libs/prelude/Prelude/File.idr+160−56

This diff is too big to show here.

libs/prelude/Prelude/Functor.idr+10−3

This diff is too big to show here.

libs/prelude/Prelude/Interactive.idr+19−7

This diff is too big to show here.

libs/prelude/Prelude/Interfaces.idr+22−10

This diff is too big to show here.

libs/prelude/Prelude/List.idr+88−34

This diff is too big to show here.

libs/prelude/Prelude/Maybe.idr+22−1

This diff is too big to show here.

libs/prelude/Prelude/Monad.idr+8−8

This diff is too big to show here.

libs/prelude/Prelude/Nat.idr+94−79

This diff is too big to show here.

libs/prelude/Prelude/Pairs.idr−8

This diff is too big to show here.

libs/prelude/Prelude/Show.idr+6−6

This diff is too big to show here.

libs/prelude/Prelude/Strings.idr+65−19

This diff is too big to show here.

libs/prelude/Prelude/WellFounded.idr+47−24

This diff is too big to show here.

libs/prelude/prelude.ipkg+37−12

This diff is too big to show here.

libs/pruviloj/Makefile+2−1

This diff is too big to show here.

libs/pruviloj/Pruviloj/Core.idr+71−10

This diff is too big to show here.

libs/pruviloj/Pruviloj/Derive/DecEq.idr+4−4

This diff is too big to show here.

libs/pruviloj/Pruviloj/Derive/Eliminators.idr+5−5

This diff is too big to show here.

libs/pruviloj/Pruviloj/Disjoint.idr+66−26

This diff is too big to show here.

libs/pruviloj/Pruviloj/Induction.idr+3−1

This diff is too big to show here.

libs/pruviloj/Pruviloj/Injective.idr+1−1

This diff is too big to show here.

libs/pruviloj/Pruviloj/Internals.idr+3−13

This diff is too big to show here.

libs/pruviloj/Pruviloj/Internals/TyConInfo.idr+1−1

This diff is too big to show here.

libs/pruviloj/pruviloj.ipkg+7−1

This diff is too big to show here.

main/Main.hs+20−11

This diff is too big to show here.

man/idris.1+22−7

This diff is too big to show here.

mkpkg.sh+48−7

This diff is too big to show here.

rts/Makefile+12−17

This diff is too big to show here.

rts/idris_bitstring.c+255−523

This diff is too big to show here.

rts/idris_bitstring.h−5

This diff is too big to show here.

rts/idris_buffer.cnew file+146

This diff is too big to show here.

rts/idris_buffer.hnew file+29

This diff is too big to show here.

rts/idris_gc.c+57−57

This diff is too big to show here.

rts/idris_gmp.c+92−223

This diff is too big to show here.

rts/idris_gmp.h+10−3

This diff is too big to show here.

rts/idris_heap.c+21−14

This diff is too big to show here.

rts/idris_heap.h+1−1

This diff is too big to show here.

rts/idris_main.c+42−6

This diff is too big to show here.

rts/idris_net.c+42−8

This diff is too big to show here.

rts/idris_net.h+14

This diff is too big to show here.

rts/idris_opts.c+1−1

This diff is too big to show here.

rts/idris_opts.h+1−1

This diff is too big to show here.

rts/idris_rts.c+412−325

This diff is too big to show here.

rts/idris_rts.h+235−103

This diff is too big to show here.

rts/idris_stdfgn.c+184−16

This diff is too big to show here.

rts/idris_stdfgn.h+30−2

This diff is too big to show here.

rts/idris_utf8.c+12−2

This diff is too big to show here.

rts/idris_utf8.h+2

This diff is too big to show here.

rts/mini-gmp.c+459−167

This diff is too big to show here.

rts/mini-gmp.h+47−8

This diff is too big to show here.

rts/seL4/CMakeLists.txtnew file+43

This diff is too big to show here.

rts/seL4/README.mdnew file+5

This diff is too big to show here.

rts/seL4/idris_main.cnew file+31

This diff is too big to show here.

rts/windows/idris_net.cdeleted−195

This diff is too big to show here.

rts/windows/win_utils.c+49−3

This diff is too big to show here.

rts/windows/win_utils.hnew file+9

This diff is too big to show here.

samples/ST/Composite.idrnew file+8

This diff is too big to show here.

samples/ST/Graphics/Draw.idrnew file+88

This diff is too big to show here.

samples/ST/Graphics/Turtle.idrnew file+116

This diff is too big to show here.

samples/ST/Intro.idrnew file+75

This diff is too big to show here.

samples/ST/Login.idrnew file+55

This diff is too big to show here.

samples/ST/LoginCount.idrnew file+77

This diff is too big to show here.

samples/ST/Net/EchoSimple.idrnew file+24

This diff is too big to show here.

samples/ST/Net/Network.idrnew file+106

This diff is too big to show here.

samples/ST/Net/RandServer.idrnew file+156

This diff is too big to show here.

samples/ST/Net/Threads.idrnew file+23

This diff is too big to show here.

samples/ST/TreeTag.idrnew file+29

This diff is too big to show here.

samples/effects/TreeTag.idr+2−2

This diff is too big to show here.

samples/misc/interp.idr+23−14

This diff is too big to show here.

samples/tutorial/bmain.idr → samples/tutorial/BMain.idrrenamed+2−2

This diff is too big to show here.

samples/tutorial/btree.idr → samples/tutorial/BTree.idrrenamed+4

This diff is too big to show here.

samples/tutorial/btreemod.idr → samples/tutorial/BTreeMod.idrrenamed+5−5

This diff is too big to show here.

samples/tutorial/foo.idr → samples/tutorial/Foo.idrrenamed

The content is the same.

samples/tutorial/hello.idr → samples/tutorial/Hello.idrrenamed

The content is the same.

samples/tutorial/idiom.idr → samples/tutorial/Idiom.idrrenamed

The content is the same.

samples/tutorial/classes.idr → samples/tutorial/Interfaces.idrrenamed+1−1

This diff is too big to show here.

samples/tutorial/interp.idr → samples/tutorial/Interp.idrrenamed+2−2

This diff is too big to show here.

samples/tutorial/letbind.idr → samples/tutorial/LetBind.idrrenamed+1−1

This diff is too big to show here.

samples/tutorial/prims.idr → samples/tutorial/Prims.idrrenamed+1−1

This diff is too big to show here.

samples/tutorial/Record.idrnew file+21

This diff is too big to show here.

samples/tutorial/theorems.idr → samples/tutorial/Theorems.idrrenamed−20

This diff is too big to show here.

samples/tutorial/universe.idr → samples/tutorial/Universe.idrrenamed

The content is the same.

samples/tutorial/usefultypes.idr → samples/tutorial/UsefulTypes.idrrenamed+1

This diff is too big to show here.

samples/tutorial/vbroken.idr → samples/tutorial/VBroken.idrrenamed

The content is the same.

samples/tutorial/views.idr → samples/tutorial/Views.idrrenamed+8−20

This diff is too big to show here.

samples/tutorial/viewsbroken.idr → samples/tutorial/ViewsBroken.idrrenamed

The content is the same.

samples/tutorial/wheres.idr → samples/tutorial/Wheres.idrrenamed+1−1

This diff is too big to show here.

samples/tutorial/binary.idrdeleted−61

This diff is too big to show here.

scripts/runidrisnew file+25

This diff is too big to show here.

scripts/runidris-nodenew file+25

This diff is too big to show here.

src/IRTS/BCImp.hsdeleted−23

This diff is too big to show here.

src/IRTS/Bytecode.hs+7−6

This diff is too big to show here.

src/IRTS/CodegenC.hs+179−157

This diff is too big to show here.

src/IRTS/CodegenCommon.hs+6−4

This diff is too big to show here.

src/IRTS/CodegenJavaScript.hs+53−1299

This diff is too big to show here.

src/IRTS/Compiler.hs+209−78

This diff is too big to show here.

src/IRTS/Defunctionalise.hs+28−80

This diff is too big to show here.

src/IRTS/DumpBC.hs+4−4

This diff is too big to show here.

src/IRTS/Exports.hs+2−2

This diff is too big to show here.

src/IRTS/Inliner.hs+1−2

This diff is too big to show here.

src/IRTS/JavaScript/AST.hs+276−402

This diff is too big to show here.

src/IRTS/JavaScript/Codegen.hsnew file+636

This diff is too big to show here.

src/IRTS/JavaScript/LangTransforms.hsnew file+99

This diff is too big to show here.

src/IRTS/JavaScript/Name.hsnew file+57

This diff is too big to show here.

src/IRTS/JavaScript/PrimOp.hsnew file+246

This diff is too big to show here.

src/IRTS/JavaScript/Specialize.hsnew file+109

This diff is too big to show here.

src/IRTS/Lang.hs+148−59

This diff is too big to show here.

src/IRTS/LangOpts.hs+299−59

This diff is too big to show here.

src/IRTS/Portable.hs+97−17

This diff is too big to show here.

src/IRTS/Simplified.hs+52−61

This diff is too big to show here.

src/IRTS/System.hs+65−26

This diff is too big to show here.

src/Idris/ASTUtils.hs+15−10

This diff is too big to show here.

src/Idris/AbsSyntax.hs+246−285

This diff is too big to show here.

src/Idris/AbsSyntaxTree.hs+216−273

This diff is too big to show here.

src/Idris/Apropos.hs+10−15

This diff is too big to show here.

src/Idris/CaseSplit.hs+33−45

This diff is too big to show here.

src/Idris/Chaser.hs+78−41

This diff is too big to show here.

src/Idris/CmdOptions.hs+80−51

This diff is too big to show here.

src/Idris/Colours.hs+1−1

This diff is too big to show here.

src/Idris/Completion.hs+21−21

This diff is too big to show here.

src/Idris/Core/Binary.hs+25−330

This diff is too big to show here.

src/Idris/Core/CaseTree.hs+156−106

This diff is too big to show here.

src/Idris/Core/Constraints.hs+5−6

This diff is too big to show here.

src/Idris/Core/DeepSeq.hs+7−3

This diff is too big to show here.

src/Idris/Core/Elaborate.hs+52−73

This diff is too big to show here.

src/Idris/Core/Evaluate.hs+267−183

This diff is too big to show here.

src/Idris/Core/Execute.hs+129−74

This diff is too big to show here.

src/Idris/Core/ProofState.hs+116−199

This diff is too big to show here.

src/Idris/Core/ProofTerm.hs+43−48

This diff is too big to show here.

src/Idris/Core/TT.hs+215−171

This diff is too big to show here.

src/Idris/Core/Typecheck.hs+155−142

This diff is too big to show here.

src/Idris/Core/Unify.hs+84−155

This diff is too big to show here.

src/Idris/Core/WHNF.hs+73−31

This diff is too big to show here.

src/Idris/Coverage.hs+414−855

This diff is too big to show here.

src/Idris/DSL.hs+26−31

This diff is too big to show here.

src/Idris/DataOpts.hs+5−11

This diff is too big to show here.

src/Idris/DeepSeq.hs+10−23

This diff is too big to show here.

src/Idris/Delaborate.hs+129−114

This diff is too big to show here.

src/Idris/Directives.hs+9−9

This diff is too big to show here.

src/Idris/Docs.hs+43−23

This diff is too big to show here.

src/Idris/Docstrings.hs+14−13

This diff is too big to show here.

src/Idris/Elab/AsPat.hs+23−13

This diff is too big to show here.

src/Idris/Elab/Clause.hs+256−157

This diff is too big to show here.

src/Idris/Elab/Data.hs+78−308

This diff is too big to show here.

src/Idris/Elab/Implementation.hs+45−58

This diff is too big to show here.

src/Idris/Elab/Interface.hs+201−120

This diff is too big to show here.

src/Idris/Elab/Provider.hs+11−41

This diff is too big to show here.

src/Idris/Elab/Quasiquote.hs+8−8

This diff is too big to show here.

src/Idris/Elab/Record.hs+20−62

This diff is too big to show here.

src/Idris/Elab/Rewrite.hs+20−23

This diff is too big to show here.

src/Idris/Elab/RunElab.hs+6−11

This diff is too big to show here.

src/Idris/Elab/Term.hs+277−392

This diff is too big to show here.

src/Idris/Elab/Transform.hs+10−43

This diff is too big to show here.

src/Idris/Elab/Type.hs+15−59

This diff is too big to show here.

src/Idris/Elab/Utils.hs+337−61

This diff is too big to show here.

src/Idris/Elab/Value.hs+14−42

This diff is too big to show here.

src/Idris/ElabDecls.hs+66−64

This diff is too big to show here.

src/Idris/Erasure.hs+154−41

This diff is too big to show here.

src/Idris/ErrReverse.hs+12−16

This diff is too big to show here.

src/Idris/Error.hs+21−19

This diff is too big to show here.

src/Idris/Help.hs+3−1

This diff is too big to show here.

src/Idris/IBC.hs+250−1651

This diff is too big to show here.

src/Idris/IdeMode.hs+36−32

This diff is too big to show here.

src/Idris/IdrisDoc.hs+54−71

This diff is too big to show here.

src/Idris/Imports.hs+54−16

This diff is too big to show here.

src/Idris/Info.hs+26−9

This diff is too big to show here.

src/Idris/Info/Show.hs+49−1

This diff is too big to show here.

src/Idris/Inliner.hs+3−3

This diff is too big to show here.

src/Idris/Interactive.hs+54−62

This diff is too big to show here.

src/Idris/Main.hs+79−65

This diff is too big to show here.

src/Idris/ModeCommon.hs+34−37

This diff is too big to show here.

src/Idris/Options.hsnew file+291

This diff is too big to show here.

src/Idris/Output.hs+187−36

This diff is too big to show here.

src/Idris/Package.hs+163−90

This diff is too big to show here.

src/Idris/Package/Common.hs+5−5

This diff is too big to show here.

src/Idris/Package/Parser.hs+89−183

This diff is too big to show here.

src/Idris/Parser.hs+614−639

This diff is too big to show here.

src/Idris/Parser/Data.hs+79−129

This diff is too big to show here.

src/Idris/Parser/Expr.hs+341−403

This diff is too big to show here.

src/Idris/Parser/Helpers.hs+240−402

This diff is too big to show here.

src/Idris/Parser/Ops.hs+141−94

This diff is too big to show here.

src/Idris/Parser/Stack.hsnew file+161

This diff is too big to show here.

src/Idris/PartialEval.hs+98−55

This diff is too big to show here.

src/Idris/Primitives.hs+30−62

This diff is too big to show here.

src/Idris/ProofSearch.hs+19−36

This diff is too big to show here.

src/Idris/Prover.hs+62−67

This diff is too big to show here.

src/Idris/Providers.hs+3−5

This diff is too big to show here.

src/Idris/REPL.hs+190−147

This diff is too big to show here.

src/Idris/REPL/Browse.hs+7−8

This diff is too big to show here.

src/Idris/REPL/Commands.hs+9−4

This diff is too big to show here.

src/Idris/REPL/Parser.hs+192−190

This diff is too big to show here.

src/Idris/Reflection.hs+51−47

This diff is too big to show here.

src/Idris/Termination.hsnew file+639

This diff is too big to show here.

src/Idris/Transforms.hs+3−6

This diff is too big to show here.

src/Idris/TypeSearch.hs+57−42

This diff is too big to show here.

src/Idris/Unlit.hs+6−4

This diff is too big to show here.

src/Idris/WhoCalls.hs+3−5

This diff is too big to show here.

src/Util/DynamicLinker.hs+20−13

This diff is too big to show here.

src/Util/Net.hs+10−13

This diff is too big to show here.

src/Util/Pretty.hs+4−1

This diff is too big to show here.

src/Util/ScreenSize.hs+1−1

This diff is too big to show here.

src/Util/System.hs+44−15

This diff is too big to show here.

stack-11.22.yamlnew file+21

This diff is too big to show here.

stack-12.26.yamlnew file+20

This diff is too big to show here.

stack-15.3.yamlnew file+17

This diff is too big to show here.

stack-15.4.yamlnew file+17

This diff is too big to show here.

stack-shell.nix+13−20

This diff is too big to show here.

stack.yamlmode 100644 → 120000+1−17

This diff is too big to show here.

stylize.shnew file+40

This diff is too big to show here.

test/README.md+7−12

This diff is too big to show here.

test/TestData.hs+96−38

This diff is too big to show here.

test/TestRun.hs+36−22

This diff is too big to show here.

test/base001/Makefile+2−2

This diff is too big to show here.

test/base001/exit1.c+4

This diff is too big to show here.

test/base001/expected → test/base001/expected.outrenamed

The content is the same.

test/base001/run → test/base001/run.shrenamed+1−1

This diff is too big to show here.

test/base001/sys.c+4

This diff is too big to show here.

test/basic001/expected → test/basic001/expected.outrenamed

The content is the same.

test/basic001/run → test/basic001/run.shrenamed

Only the mode changed.

test/basic002/expected → test/basic002/expected.outrenamed+10−2

This diff is too big to show here.

test/basic002/run → test/basic002/run.shrenamed

Only the mode changed.

test/basic003/expected → test/basic003/expected.outrenamed

The content is the same.

test/basic003/run → test/basic003/run.shrenamed

Only the mode changed.

test/basic004/expected → test/basic004/expected.outrenamed

The content is the same.

test/basic004/run → test/basic004/run.shrenamed

Only the mode changed.

test/basic005/expected → test/basic005/expected.outrenamed

The content is the same.

test/basic005/run → test/basic005/run.shrenamed

Only the mode changed.

test/basic006/expected → test/basic006/expected.outrenamed+6−1

This diff is too big to show here.

test/basic006/run → test/basic006/run.shrenamed

Only the mode changed.

test/basic007/expected → test/basic007/expected.outrenamed

The content is the same.

test/basic007/run → test/basic007/run.shrenamed

Only the mode changed.

test/basic008/expected → test/basic008/expected.outrenamed

The content is the same.

test/basic008/run → test/basic008/run.shrenamed

Only the mode changed.

test/basic009/expecteddeleted−17

This diff is too big to show here.

test/basic009/expected.outnew file+32

This diff is too big to show here.

test/basic009/run → test/basic009/run.shrenamed

Only the mode changed.

test/basic010/expected → test/basic010/expected.outrenamed

The content is the same.

test/basic010/run → test/basic010/run.shrenamed+2−2

This diff is too big to show here.

test/basic011/expected → test/basic011/expected.outrenamed

The content is the same.

test/basic011/run → test/basic011/run.shrenamed

Only the mode changed.

test/basic012/expected → test/basic012/expected.outrenamed

The content is the same.

test/basic012/run → test/basic012/run.shrenamed

Only the mode changed.

test/basic013/basic013.idr+37−2

This diff is too big to show here.

test/basic013/expected → test/basic013/expected.outrenamed+37−1

This diff is too big to show here.

test/basic013/run → test/basic013/run.shrenamed

Only the mode changed.

test/basic014/expected → test/basic014/expected.outrenamed

The content is the same.

test/basic014/run → test/basic014/run.shrenamed

Only the mode changed.

test/basic015/expected → test/basic015/expected.outrenamed

The content is the same.

test/basic015/run → test/basic015/run.shrenamed

Only the mode changed.

test/basic016/expecteddeleted−1

This diff is too big to show here.

test/basic016/expected.outnew file+1

This diff is too big to show here.

test/basic016/run → test/basic016/run.shrenamed

Only the mode changed.

test/basic017/expecteddeleted−3

This diff is too big to show here.

test/basic017/expected.outnew file+8

This diff is too big to show here.

test/basic017/run → test/basic017/run.shrenamed

Only the mode changed.

test/basic018/expecteddeleted−17

This diff is too big to show here.

test/basic018/expected.outnew file+32

This diff is too big to show here.

test/basic018/run → test/basic018/run.shrenamed

Only the mode changed.

test/basic019/basic019.idrnew file+10

This diff is too big to show here.

test/basic019/expected.outnew file+12

This diff is too big to show here.

test/basic019/run.shnew file+4

This diff is too big to show here.

test/basic020/basic020.idrnew file+42

This diff is too big to show here.

test/bignum001/expected → test/basic020/expected.outrenamed

The content is the same.

test/basic020/run.shnew file+4

This diff is too big to show here.

test/basic021/basic021.idrnew file+13

This diff is too big to show here.

test/basic021/basic021_2.idrnew file+13

This diff is too big to show here.

test/basic021/expected.outnew file+2

This diff is too big to show here.

test/basic021/run.shnew file+6

This diff is too big to show here.

test/basic022/basic022.idrnew file+13

This diff is too big to show here.

test/basic022/expected.outnew file+1

This diff is too big to show here.

test/basic022/run.shnew file+4

This diff is too big to show here.

test/prelude001/expected → test/basic023/expected.outrenamed

The content is the same.

test/basic023/run.shnew file+4

This diff is too big to show here.

test/basic023/sections.idrnew file+34

This diff is too big to show here.

test/basic024/basic024.idrnew file+51

This diff is too big to show here.

test/basic024/expected.outnew file+76

This diff is too big to show here.

test/basic024/input.innew file+46

This diff is too big to show here.

test/basic024/run.shnew file+8

This diff is too big to show here.

test/basic025/basic025.idrnew file+28

This diff is too big to show here.

test/basic025/expected.outnew file+12

This diff is too big to show here.

test/basic025/input.innew file+7

This diff is too big to show here.

test/basic025/run.shnew file+7

This diff is too big to show here.

test/basic026/basic026.idrnew file+12

This diff is too big to show here.

test/basic026/expected.outnew file+2

This diff is too big to show here.

test/basic026/run.shnew file+4

This diff is too big to show here.

test/bignum001/expected.outnew file+1

This diff is too big to show here.

test/bignum001/run → test/bignum001/run.shrenamed

Only the mode changed.

test/bignum002/bignum002.idr+10−1

This diff is too big to show here.

test/bignum002/expecteddeleted−1

This diff is too big to show here.

test/bignum002/expected.outnew file+8

This diff is too big to show here.

test/bignum002/run → test/bignum002/run.shrenamed

Only the mode changed.

test/bignum003/bignum003.idrnew file+23

This diff is too big to show here.

test/bignum003/expected.outnew file+2

This diff is too big to show here.

test/bignum003/run.shnew file+4

This diff is too big to show here.

test/bounded001/expected → test/bounded001/expected.outrenamed

The content is the same.

test/bounded001/run → test/bounded001/run.shrenamed

Only the mode changed.

test/buffer001/buffer001.idrnew file+33

This diff is too big to show here.

test/buffer001/expected.outnew file+7

This diff is too big to show here.

test/buffer001/run.shnew file+4

This diff is too big to show here.

test/buffer002/buffer002.idrnew file+34

This diff is too big to show here.

test/buffer002/expected.outnew file+11

This diff is too big to show here.

test/buffer002/run.shnew file+4

This diff is too big to show here.

test/contrib001/contrib001.idrnew file+14

This diff is too big to show here.

test/contrib001/expected.outnew file+12

This diff is too big to show here.

test/contrib001/run.shnew file+4

This diff is too big to show here.

test/corecords001/expected → test/corecords001/expected.outrenamed

The content is the same.

test/corecords001/run → test/corecords001/run.shrenamed

Only the mode changed.

test/corecords002/expected → test/corecords002/expected.outrenamed

The content is the same.

test/corecords002/run → test/corecords002/run.shrenamed

Only the mode changed.

test/delab001/expected → test/delab001/expected.outrenamed

The content is the same.

test/delab001/input → test/delab001/input.inrenamed

The content is the same.

test/delab001/rundeleted−3

This diff is too big to show here.

test/delab001/run.shnew file+3

This diff is too big to show here.

test/directives001/expecteddeleted−12

This diff is too big to show here.

test/directives001/expected.outnew file+42

This diff is too big to show here.

test/directives001/run → test/directives001/run.shrenamed

Only the mode changed.

test/directives002/expecteddeleted−2

This diff is too big to show here.

test/directives002/expected.outnew file+6

This diff is too big to show here.

test/directives002/run → test/directives002/run.shrenamed

The content is the same.

test/directives003/directives003.idrnew file+11

This diff is too big to show here.

test/directives003/expected.outnew file+6

This diff is too big to show here.

test/directives003/run.shnew file+13

This diff is too big to show here.

test/disambig002/disambig002.idr+2−7

This diff is too big to show here.

test/disambig002/expected → test/disambig002/expected.outrenamed

The content is the same.

test/disambig002/run → test/disambig002/run.shrenamed

Only the mode changed.

test/docs001/expected → test/docs001/expected.outrenamed+1−1

This diff is too big to show here.

test/docs001/input → test/docs001/input.inrenamed

The content is the same.

test/docs001/rundeleted−3

This diff is too big to show here.

test/docs001/run.shnew file+3

This diff is too big to show here.

test/docs002/expecteddeleted−12

This diff is too big to show here.

test/docs002/expected.outnew file+12

This diff is too big to show here.

test/docs002/input → test/docs002/input.inrenamed

The content is the same.

test/docs002/rundeleted−3

This diff is too big to show here.

test/docs002/run.shnew file+3

This diff is too big to show here.

test/docs003/expected → test/docs003/expected.outrenamed+4−1

This diff is too big to show here.

test/docs003/input → test/docs003/input.inrenamed

The content is the same.

test/docs003/rundeleted−3

This diff is too big to show here.

test/docs003/run.shnew file+3

This diff is too big to show here.

test/docs004/expected → test/docs004/expected.outrenamed+3−3

This diff is too big to show here.

test/docs004/input → test/docs004/input.inrenamed

The content is the same.

test/docs004/rundeleted−3

This diff is too big to show here.

test/docs004/run.shnew file+3

This diff is too big to show here.

test/docs005/expected → test/docs005/expected.outrenamed+3−1

This diff is too big to show here.

test/docs005/input → test/docs005/input.inrenamed

The content is the same.

test/docs005/rundeleted−3

This diff is too big to show here.

test/docs005/run.shnew file+3

This diff is too big to show here.

test/docs006/docs006.idrnew file+7

This diff is too big to show here.

test/docs006/expected.outnew file+16

This diff is too big to show here.

test/docs006/input.innew file+1

This diff is too big to show here.

test/docs006/run.shnew file+3

This diff is too big to show here.

test/dsl001/expected → test/dsl001/expected.outrenamed+9−9

This diff is too big to show here.

test/dsl001/inputdeleted−2

This diff is too big to show here.

test/dsl001/input.innew file+2

This diff is too big to show here.

test/dsl001/rundeleted−5

This diff is too big to show here.

test/dsl001/run.shnew file+5

This diff is too big to show here.

test/dsl001/test001.idr+2−1

This diff is too big to show here.

test/dsl002/Resimp.idr+2−1

This diff is too big to show here.

test/dsl002/expected → test/dsl002/expected.outrenamed

The content is the same.

test/dsl002/run → test/dsl002/run.shrenamed

Only the mode changed.

test/dsl002/test → test/dsl002/test.inrenamed

The content is the same.

test/dsl002/test014.idr+1−1

This diff is too big to show here.

test/dsl003/DSLPi.idr+2

This diff is too big to show here.

test/dsl003/expected → test/dsl003/expected.outrenamed

The content is the same.

test/dsl003/run → test/dsl003/run.shrenamed

Only the mode changed.

test/dsl004/Door0.idr+3−1

This diff is too big to show here.

test/dsl004/Door1.idr+2

This diff is too big to show here.

test/dsl004/Door2.idr+2

This diff is too big to show here.

test/dsl004/Door3.idr+2

This diff is too big to show here.

test/dsl004/IOu.idr+2

This diff is too big to show here.

test/dsl004/expected → test/dsl004/expected.outrenamed

The content is the same.

test/dsl004/run → test/dsl004/run.shrenamed

Only the mode changed.

test/effects001/expected → test/effects001/expected.outrenamed+2−2

This diff is too big to show here.

test/effects001/run → test/effects001/run.shrenamed

Only the mode changed.

test/effects001/test021.idr+1−1

This diff is too big to show here.

test/effects001/testFile → test/effects001/testFile.inrenamed

The content is the same.

test/effects002/expected → test/effects002/expected.outrenamed

The content is the same.

test/effects002/run → test/effects002/run.shrenamed

Only the mode changed.

test/effects003/expecteddeleted−43

This diff is too big to show here.

test/effects003/expected.outnew file+31

This diff is too big to show here.

test/effects003/inputdeleted−10

This diff is too big to show here.

test/effects003/input.innew file+6

This diff is too big to show here.

test/effects003/run → test/effects003/run.shrenamed+1−1

This diff is too big to show here.

test/effects004/expected → test/effects004/expected.outrenamed

The content is the same.

test/effects004/input → test/effects004/input.inrenamed

The content is the same.

test/effects004/run → test/effects004/run.shrenamed+1−1

This diff is too big to show here.

test/effects005/expected → test/effects005/expected.outrenamed

The content is the same.

test/effects005/run → test/effects005/run.shrenamed

Only the mode changed.

test/error001/expected → test/error001/expected.outrenamed+6−1

This diff is too big to show here.

test/error001/run → test/error001/run.shrenamed

Only the mode changed.

test/error002/expected → test/error002/expected.outrenamed

The content is the same.

test/error002/run → test/error002/run.shrenamed

Only the mode changed.

test/error003/expecteddeleted−4

This diff is too big to show here.

test/error003/expected.outnew file+9

This diff is too big to show here.

test/error003/run → test/error003/run.shrenamed

Only the mode changed.

test/error004/expected → test/error004/expected.outrenamed+10−2

This diff is too big to show here.

test/error004/run → test/error004/run.shrenamed

Only the mode changed.

test/error005/expected → test/error005/expected.outrenamed+30−5

This diff is too big to show here.

test/error005/run → test/error005/run.shrenamed

Only the mode changed.

test/error006/WithPatsNoWith.idr+11

This diff is too big to show here.

test/error006/expecteddeleted−2

This diff is too big to show here.

test/error006/expected.outnew file+21

This diff is too big to show here.

test/error006/run → test/error006/run.shrenamed

Only the mode changed.

test/error007/expected → test/error007/expected.outrenamed+5−1

This diff is too big to show here.

test/error007/run → test/error007/run.shrenamed

Only the mode changed.

test/error008/expecteddeleted−4

This diff is too big to show here.

test/error008/expected.outnew file+14

This diff is too big to show here.

test/error008/run → test/error008/run.shrenamed

Only the mode changed.

test/error009/expected → test/error009/expected.outrenamed

The content is the same.

test/error009/run → test/error009/run.shrenamed

Only the mode changed.

test/ffi001/expected → test/ffi001/expected.outrenamed

The content is the same.

test/ffi001/rundeleted−3

This diff is too big to show here.

test/ffi001/run.shnew file+3

This diff is too big to show here.

test/ffi002/expecteddeleted−1

This diff is too big to show here.

test/ffi002/expected.outnew file+6

This diff is too big to show here.

test/ffi002/rundeleted−3

This diff is too big to show here.

test/ffi002/run.shnew file+3

This diff is too big to show here.

test/ffi003/expected → test/ffi003/expected.outrenamed

The content is the same.

test/ffi003/input → test/ffi003/input.inrenamed

The content is the same.

test/ffi003/rundeleted−3

This diff is too big to show here.

test/ffi003/run.shnew file+3

This diff is too big to show here.

test/ffi004/expected → test/ffi004/expected.outrenamed

The content is the same.

test/ffi004/rundeleted−3

This diff is too big to show here.

test/ffi004/run.shnew file+3

This diff is too big to show here.

test/ffi005/expected → test/ffi005/expected.outrenamed

The content is the same.

test/ffi005/run → test/ffi005/run.shrenamed

Only the mode changed.

test/ffi006/expected → test/ffi006/expected.outrenamed

The content is the same.

test/ffi006/run → test/ffi006/run.shrenamed

Only the mode changed.

test/ffi007/expected → test/ffi007/expected.outrenamed+1

This diff is too big to show here.

test/ffi007/ffi007.h+2

This diff is too big to show here.

test/ffi007/ffi007.idr+6−1

This diff is too big to show here.

test/ffi007/run → test/ffi007/run.shrenamed

The content is the same.

test/ffi008/expected → test/ffi008/expected.outrenamed

The content is the same.

test/ffi008/ffi008.c+12−1

This diff is too big to show here.

test/ffi008/ffi008.h+2

This diff is too big to show here.

test/ffi008/ffi008.idr+10

This diff is too big to show here.

test/ffi008/run → test/ffi008/run.shrenamed

The content is the same.

test/ffi009/Bad.idrnew file+36

This diff is too big to show here.

test/ffi009/Good.idrnew file+37

This diff is too big to show here.

test/ffi009/expected.outnew file+1

This diff is too big to show here.

test/ffi009/ffi009.cnew file+44

This diff is too big to show here.

test/ffi009/ffi009.hnew file+20

This diff is too big to show here.

test/ffi009/run.shnew file+5

This diff is too big to show here.

test/ffi010/expected.outnew file+3

This diff is too big to show here.

test/ffi010/ffi010.idrnew file+43

This diff is too big to show here.

test/ffi010/run.shnew file+4

This diff is too big to show here.

test/ffi011/expected.outnew file+2

This diff is too big to show here.

test/ffi011/ffi011.idrnew file+27

This diff is too big to show here.

test/ffi011/ffi011.jsnew file+7

This diff is too big to show here.

test/ffi011/run.shnew file+4

This diff is too big to show here.

test/ffi012/expected.outnew file+1

This diff is too big to show here.

test/ffi012/ffi012.idrnew file+14

This diff is too big to show here.

test/ffi012/ffi012.jsnew file+3

This diff is too big to show here.

test/ffi012/run.shnew file+4

This diff is too big to show here.

test/ffi013/expected.outnew file+4

This diff is too big to show here.

test/ffi013/ffi013.idrnew file+5

This diff is too big to show here.

test/ffi013/run.shnew file+17

This diff is too big to show here.

test/folding001/expected → test/folding001/expected.outrenamed

The content is the same.

test/folding001/run → test/folding001/run.shrenamed

Only the mode changed.

test/idrisdoc001/expected → test/idrisdoc001/expected.outrenamed

The content is the same.

test/idrisdoc001/run → test/idrisdoc001/run.shrenamed

Only the mode changed.

test/idrisdoc002/expected → test/idrisdoc002/expected.outrenamed

The content is the same.

test/idrisdoc002/run → test/idrisdoc002/run.shrenamed

Only the mode changed.

test/idrisdoc003/expected → test/idrisdoc003/expected.outrenamed

The content is the same.

test/idrisdoc003/run → test/idrisdoc003/run.shrenamed

Only the mode changed.

test/idrisdoc004/expected → test/idrisdoc004/expected.outrenamed

The content is the same.

test/idrisdoc004/run → test/idrisdoc004/run.shrenamed

Only the mode changed.

test/idrisdoc005/expected → test/idrisdoc005/expected.outrenamed

The content is the same.

test/idrisdoc005/run → test/idrisdoc005/run.shrenamed

Only the mode changed.

test/idrisdoc006/expected → test/idrisdoc006/expected.outrenamed

The content is the same.

test/idrisdoc006/run → test/idrisdoc006/run.shrenamed

Only the mode changed.

test/idrisdoc007/expected → test/idrisdoc007/expected.outrenamed

The content is the same.

test/idrisdoc007/run → test/idrisdoc007/run.shrenamed

Only the mode changed.

test/idrisdoc008/expected → test/idrisdoc008/expected.outrenamed

The content is the same.

test/idrisdoc008/run → test/idrisdoc008/run.shrenamed

Only the mode changed.

test/idrisdoc009/expected → test/idrisdoc009/expected.outrenamed+2

This diff is too big to show here.

test/idrisdoc009/input → test/idrisdoc009/input.inrenamed

The content is the same.

test/idrisdoc009/rundeleted−3

This diff is too big to show here.

test/idrisdoc009/run.shnew file+3

This diff is too big to show here.

test/interactive001/expected → test/interactive001/expected.outrenamed+1−1

This diff is too big to show here.

test/interactive001/inputdeleted−8

This diff is too big to show here.

test/interactive001/input.innew file+8

This diff is too big to show here.

test/interactive001/test032.idr → test/interactive001/interactive001.idrrenamed

The content is the same.

test/interactive001/rundeleted−3

This diff is too big to show here.

test/interactive001/run.shnew file+5

This diff is too big to show here.

test/interactive002/expected → test/interactive002/expected.outrenamed

The content is the same.

test/interactive002/input → test/interactive002/input.inrenamed

The content is the same.

test/interactive002/rundeleted−3

This diff is too big to show here.

test/interactive002/run.shnew file+3

This diff is too big to show here.

test/interactive003/expected → test/interactive003/expected.outrenamed

The content is the same.

test/interactive003/input → test/interactive003/input.inrenamed

The content is the same.

test/interactive003/rundeleted−3

This diff is too big to show here.

test/interactive003/run.shnew file+3

This diff is too big to show here.

test/interactive004/expected → test/interactive004/expected.outrenamed

The content is the same.

test/interactive004/input → test/interactive004/input.inrenamed

The content is the same.

test/interactive004/rundeleted−3

This diff is too big to show here.

test/interactive004/run.shnew file+3

This diff is too big to show here.

test/interactive005/expected → test/interactive005/expected.outrenamed+3−3

This diff is too big to show here.

test/interactive005/input → test/interactive005/input.inrenamed

The content is the same.

test/interactive005/rundeleted−6

This diff is too big to show here.

test/interactive005/run.shnew file+6

This diff is too big to show here.

test/interactive006/expected → test/interactive006/expected.outrenamed

The content is the same.

test/interactive006/input → test/interactive006/input.inrenamed

The content is the same.

test/interactive006/rundeleted−3

This diff is too big to show here.

test/interactive006/run.shnew file+3

This diff is too big to show here.

test/interactive007/expected → test/interactive007/expected.outrenamed

The content is the same.

test/interactive007/input → test/interactive007/input.inrenamed

The content is the same.

test/interactive007/rundeleted−2

This diff is too big to show here.

test/interactive007/run.shnew file+2

This diff is too big to show here.

test/interactive008/expected → test/interactive008/expected.outrenamed

The content is the same.

test/interactive008/input → test/interactive008/input.inrenamed

The content is the same.

test/interactive008/rundeleted−2

This diff is too big to show here.

test/interactive008/run.shnew file+2

This diff is too big to show here.

test/interactive009/expected → test/interactive009/expected.outrenamed

The content is the same.

test/interactive009/input → test/interactive009/input.inrenamed

The content is the same.

test/interactive009/rundeleted−3

This diff is too big to show here.

test/interactive009/run.shnew file+3

This diff is too big to show here.

test/interactive010/expecteddeleted−20

This diff is too big to show here.

test/interactive010/expected.outnew file+24

This diff is too big to show here.

test/interactive010/input → test/interactive010/input.inrenamed

The content is the same.

test/interactive010/rundeleted−2

This diff is too big to show here.

test/interactive010/run.shnew file+2

This diff is too big to show here.

test/interactive011/.gitignorenew file+1

This diff is too big to show here.

test/interactive011/expected → test/interactive011/expected.outrenamed

The content is the same.

test/interactive011/inputdeleted−2

This diff is too big to show here.

test/interactive011/input.innew file+2

This diff is too big to show here.

test/interactive011/interactive011.ipkgnew file+8

This diff is too big to show here.

test/interactive011/rundeleted−3

This diff is too big to show here.

test/interactive011/run.shnew file+6

This diff is too big to show here.

test/interactive011/src/Foo.idrnew file+5

This diff is too big to show here.

test/interactive011/interactive011.idr → test/interactive011/src/Main.idrrenamed+5−2

This diff is too big to show here.

test/interactive012/expected → test/interactive012/expected.outrenamed

The content is the same.

test/interactive012/input → test/interactive012/input.inrenamed

The content is the same.

test/interactive012/rundeleted−3

This diff is too big to show here.

test/interactive012/run.shnew file+3

This diff is too big to show here.

test/interactive013/expected → test/interactive013/expected.outrenamed

The content is the same.

test/interactive013/input → test/interactive013/input.inrenamed

The content is the same.

test/interactive013/rundeleted−3

This diff is too big to show here.

test/interactive013/run.shnew file+3

This diff is too big to show here.

test/interactive014/expected.outnew file+7

This diff is too big to show here.

test/interactive014/input.innew file+5

This diff is too big to show here.

test/interactive014/interactive014.idrnew file+10

This diff is too big to show here.

test/interactive014/run.shnew file+3

This diff is too big to show here.

test/interactive015/expected.outnew file+6

This diff is too big to show here.

test/interactive015/input.innew file+2

This diff is too big to show here.

test/interactive015/run.shnew file+8

This diff is too big to show here.

test/interactive015/src/interactive015.idrnew file+4

This diff is too big to show here.

test/interactive016/expected.outnew file+7

This diff is too big to show here.

test/interactive016/input.innew file+2

This diff is too big to show here.

test/interactive016/run.shnew file+8

This diff is too big to show here.

test/interactive016/src/interactive016.idrnew file+7

This diff is too big to show here.

test/interactive017/TestMod.idrnew file+5

This diff is too big to show here.

test/interactive017/expected.outnew file+7

This diff is too big to show here.

test/interactive017/run.shnew file+9

This diff is too big to show here.

test/interactive017/shebang-args.idrnew file+6

This diff is too big to show here.

test/interactive017/shebang-import.idrnew file+6

This diff is too big to show here.

test/interactive017/shebang-node.idrnew file+4

This diff is too big to show here.

test/interactive017/shebang.idrnew file+4

This diff is too big to show here.

test/interactive018/Imported1.idrnew file+10

This diff is too big to show here.

test/interactive018/Imported2.idrnew file+8

This diff is too big to show here.

test/interactive018/Public1.idrnew file+10

This diff is too big to show here.

test/interactive018/Public2.idrnew file+8

This diff is too big to show here.

test/interactive018/Top.idrnew file+11

This diff is too big to show here.

test/interactive018/expected.outnew file+20

This diff is too big to show here.

test/interactive018/input.innew file+20

This diff is too big to show here.

test/interactive018/run.shnew file+3

This diff is too big to show here.

test/interfaces001/expected → test/interfaces001/expected.outrenamed+3−2

This diff is too big to show here.

test/interfaces001/input → test/interfaces001/input.inrenamed

The content is the same.

test/interfaces001/rundeleted−3

This diff is too big to show here.

test/interfaces001/run.shnew file+3

This diff is too big to show here.

test/interfaces002/expected → test/interfaces002/expected.outrenamed

The content is the same.

test/interfaces002/interfaces002.idr+2−3

This diff is too big to show here.

test/interfaces002/run → test/interfaces002/run.shrenamed

Only the mode changed.

test/interfaces003/expected → test/interfaces003/expected.outrenamed

The content is the same.

test/interfaces003/run → test/interfaces003/run.shrenamed

Only the mode changed.

test/interfaces004/expected → test/interfaces004/expected.outrenamed

The content is the same.

test/interfaces004/run → test/interfaces004/run.shrenamed

Only the mode changed.

test/interfaces005/expected → test/interfaces005/expected.outrenamed

The content is the same.

test/interfaces005/interfaces005.idr+8−8

This diff is too big to show here.

test/interfaces005/run → test/interfaces005/run.shrenamed

Only the mode changed.

test/interfaces006/expected → test/interfaces006/expected.outrenamed

The content is the same.

test/interfaces006/run → test/interfaces006/run.shrenamed

Only the mode changed.

test/interfaces007/expected.outnew file+1

This diff is too big to show here.

test/interfaces007/interfaces007.idrnew file+52

This diff is too big to show here.

test/interfaces007/run.shnew file+4

This diff is too big to show here.

test/interfaces008/expected.outnew file+6

This diff is too big to show here.

test/interfaces008/interfaces008.idrnew file+20

This diff is too big to show here.

test/interfaces008/run.shnew file+3

This diff is too big to show here.

test/meta001/expected → test/interfaces009/expected.outrenamed

The content is the same.

test/interfaces009/interfaces009.idrnew file+24

This diff is too big to show here.

test/interfaces009/run.shnew file+3

This diff is too big to show here.

test/pkg002/expected → test/interfaces010/expected.outrenamed

The content is the same.

test/interfaces010/interfaces010.idrnew file+12

This diff is too big to show here.

test/interfaces010/run.shnew file+3

This diff is too big to show here.

test/interpret001/double-echo.idrnew file+6

This diff is too big to show here.

test/interpret001/expected.outnew file+2

This diff is too big to show here.

test/interpret001/input.innew file+2

This diff is too big to show here.

test/interpret001/run.shnew file+3

This diff is too big to show here.

test/interpret002/expected.outnew file+4

This diff is too big to show here.

test/interpret002/file-error.idrnew file+6

This diff is too big to show here.

test/interpret002/input.innew file+2

This diff is too big to show here.

test/interpret002/readable.txtnew file+1

This diff is too big to show here.

test/interpret002/run.shnew file+3

This diff is too big to show here.

test/interpret003/expected.outnew file+1

This diff is too big to show here.

test/interpret003/input.innew file+1

This diff is too big to show here.

test/interpret003/interpret003.idrnew file+4

This diff is too big to show here.

test/interpret003/run.shnew file+3

This diff is too big to show here.

test/interpret003/testnew file

Binary file not shown.

test/io001/expected → test/io001/expected.outrenamed

The content is the same.

test/io001/run → test/io001/run.shrenamed

Only the mode changed.

test/io002/expected → test/io002/expected.outrenamed

The content is the same.

test/io002/run → test/io002/run.shrenamed

Only the mode changed.

test/io003/expected → test/io003/expected.outrenamed

The content is the same.

test/io003/run → test/io003/run.shrenamed

Only the mode changed.

test/layout001/expecteddeleted−76

This diff is too big to show here.

test/layout001/expected.outnew file+82

This diff is too big to show here.

test/layout001/run → test/layout001/run.shrenamed+1−1

This diff is too big to show here.

test/literate001/expecteddeleted−7

This diff is too big to show here.

test/literate001/expected.outnew file+12

This diff is too big to show here.

test/literate001/run → test/literate001/run.shrenamed

Only the mode changed.

test/meta001/Finite.idr+2

This diff is too big to show here.

test/pkg003/expected → test/meta001/expected.outrenamed

The content is the same.

test/meta001/run → test/meta001/run.shrenamed

Only the mode changed.

test/meta002/AgdaStyleReflection.idr+1−1

This diff is too big to show here.

test/meta002/DataDef.idr+2

This diff is too big to show here.

test/meta002/Deriving.idr+2

This diff is too big to show here.

test/meta002/Tacs.idr+1

This diff is too big to show here.

test/meta002/expected → test/meta002/expected.outrenamed+15−3

This diff is too big to show here.

test/meta002/run → test/meta002/run.shrenamed

Only the mode changed.

test/meta003/BadDef.idr+2

This diff is too big to show here.

test/meta003/Catch.idrnew file+17

This diff is too big to show here.

test/meta003/expected → test/meta003/expected.outrenamed+7−1

This diff is too big to show here.

test/meta003/rundeleted−3

This diff is too big to show here.

test/meta003/run.shnew file+5

This diff is too big to show here.

test/meta004/expected → test/meta004/expected.outrenamed+5−1

This diff is too big to show here.

test/meta004/meta004.idr+2

This diff is too big to show here.

test/meta004/run → test/meta004/run.shrenamed

Only the mode changed.

test/pkg001/expecteddeleted−19

This diff is too big to show here.

test/pkg001/expected.outnew file+23

This diff is too big to show here.

test/pkg001/run → test/pkg001/run.shrenamed+3

This diff is too big to show here.

test/pkg001/test-pkg.ipkg+4−4

This diff is too big to show here.

test/proof004/expected → test/pkg002/expected.outrenamed

The content is the same.

test/pkg002/run → test/pkg002/run.shrenamed

Only the mode changed.

test/proof005/expected → test/pkg003/expected.outrenamed

The content is the same.

test/pkg003/run → test/pkg003/run.shrenamed

Only the mode changed.

test/pkg004/expecteddeleted−5

This diff is too big to show here.

test/pkg004/expected.outnew file+6

This diff is too big to show here.

test/pkg004/run → test/pkg004/run.shrenamed

Only the mode changed.

test/pkg004/test.ipkg+1−1

This diff is too big to show here.

test/pkg005/expected → test/pkg005/expected.outrenamed

The content is the same.

test/pkg005/run → test/pkg005/run.shrenamed

Only the mode changed.

test/pkg006/expected → test/pkg006/expected.outrenamed

The content is the same.

test/pkg006/run → test/pkg006/run.shrenamed

Only the mode changed.

test/pkg007/expected → test/pkg007/expected.outrenamed

The content is the same.

test/pkg007/input → test/pkg007/input.inrenamed

The content is the same.

test/pkg007/run → test/pkg007/run.shrenamed+1−1

This diff is too big to show here.

test/pkg008/expected.outnew file+13

This diff is too big to show here.

test/pkg008/maths.ipkgnew file+10

This diff is too big to show here.

test/pkg008/run.shnew file+11

This diff is too big to show here.

test/pkg008/src/NumOps.idrnew file+9

This diff is too big to show here.

test/pkg008/src/Test.idrnew file+21

This diff is too big to show here.

test/pkg009/datatype.ipkgnew file+6

This diff is too big to show here.

test/pkg009/expected.outnew file+9

This diff is too big to show here.

test/pkg009/run.shnew file+7

This diff is too big to show here.

test/pkg009/src/Data/Type.idrnew file+3

This diff is too big to show here.

test/pkg010/expected.outnew file+29

This diff is too big to show here.

test/pkg010/run.shnew file+2

This diff is too big to show here.

test/pkg010/wrongopts.ipkgnew file+3

This diff is too big to show here.

test/prelude001/expected.outnew file+10

This diff is too big to show here.

test/prelude001/run → test/prelude001/run.shrenamed

Only the mode changed.

test/primitives001/expected → test/primitives001/expected.outrenamed

The content is the same.

test/primitives001/input → test/primitives001/input.inrenamed

The content is the same.

test/primitives001/run → test/primitives001/run.shrenamed+1−1

This diff is too big to show here.

test/primitives002/expected → test/primitives002/expected.outrenamed

The content is the same.

test/primitives002/run → test/primitives002/run.shrenamed+1−1

This diff is too big to show here.

test/primitives003/expected → test/primitives003/expected.outrenamed+4

This diff is too big to show here.

test/primitives003/run → test/primitives003/run.shrenamed

Only the mode changed.

test/primitives003/test038.idr+14−10

This diff is too big to show here.

test/primitives004-disabled/expected → test/primitives004-disabled/expected.outrenamed

The content is the same.

test/primitives004-disabled/run → test/primitives004-disabled/run.shrenamed

Only the mode changed.

test/primitives005/expected → test/primitives005/expected.outrenamed

The content is the same.

test/primitives005/run → test/primitives005/run.shrenamed

The content is the same.

test/primitives006/expected → test/primitives006/expected.outrenamed

The content is the same.

test/primitives006/run → test/primitives006/run.shrenamed

Only the mode changed.

test/proof001/expecteddeleted−4

This diff is too big to show here.

test/proof001/expected.outnew file+12

This diff is too big to show here.

test/proof001/run → test/proof001/run.shrenamed

Only the mode changed.

test/proof001/test029.idr+4−5

This diff is too big to show here.

test/proof002/Reflect.idr+47−46

This diff is too big to show here.

test/proof002/expected → test/proof002/expected.outrenamed+20−4

This diff is too big to show here.

test/proof002/run → test/proof002/run.shrenamed

Only the mode changed.

test/proof003/expecteddeleted−15

This diff is too big to show here.

test/proof003/expected.outnew file+39

This diff is too big to show here.

test/proof003/run → test/proof003/run.shrenamed

Only the mode changed.

test/proof006/expected → test/proof004/expected.outrenamed

The content is the same.

test/proof004/run → test/proof004/run.shrenamed

Only the mode changed.

test/proofsearch001/expected → test/proof005/expected.outrenamed

The content is the same.

test/proof005/run → test/proof005/run.shrenamed

Only the mode changed.

test/proofsearch002/expected → test/proof006/expected.outrenamed

The content is the same.

test/proof006/run → test/proof006/run.shrenamed

Only the mode changed.

test/proof007/expected → test/proof007/expected.outrenamed+5−1

This diff is too big to show here.

test/proof007/run → test/proof007/run.shrenamed

Only the mode changed.

test/proof008/expecteddeleted−2

This diff is too big to show here.

test/proof008/expected.outnew file+6

This diff is too big to show here.

test/proof008/run → test/proof008/run.shrenamed

Only the mode changed.

test/proof009/expected → test/proof009/expected.outrenamed+5−5

This diff is too big to show here.

test/proof009/input → test/proof009/input.inrenamed

The content is the same.

test/proof009/rundeleted−3

This diff is too big to show here.

test/proof009/run.shnew file+3

This diff is too big to show here.

test/proof010/expected → test/proof010/expected.outrenamed

The content is the same.

test/proof010/run → test/proof010/run.shrenamed

Only the mode changed.

test/proof011/expected → test/proof011/expected.outrenamed+12−2

This diff is too big to show here.

test/proof011/run → test/proof011/run.shrenamed

Only the mode changed.

test/proofsearch003/expected → test/proofsearch001/expected.outrenamed

The content is the same.

test/proofsearch001/run → test/proofsearch001/run.shrenamed

Only the mode changed.

test/pruviloj001/expected → test/proofsearch002/expected.outrenamed

The content is the same.

test/proofsearch002/run → test/proofsearch002/run.shrenamed

Only the mode changed.

test/quasiquote005/expected → test/proofsearch003/expected.outrenamed

The content is the same.

test/proofsearch003/run → test/proofsearch003/run.shrenamed

Only the mode changed.

test/reg048/expected → test/pruviloj001/expected.outrenamed

The content is the same.

test/pruviloj001/pruviloj001.idr+14

This diff is too big to show here.

test/pruviloj001/run → test/pruviloj001/run.shrenamed

Only the mode changed.

test/quasiquote001/expected → test/quasiquote001/expected.outrenamed+2−2

This diff is too big to show here.

test/quasiquote001/run → test/quasiquote001/run.shrenamed

Only the mode changed.

test/quasiquote002/expected → test/quasiquote002/expected.outrenamed

The content is the same.

test/quasiquote002/run → test/quasiquote002/run.shrenamed

Only the mode changed.

test/quasiquote003/expecteddeleted−4

This diff is too big to show here.

test/quasiquote003/expected.outnew file+9

This diff is too big to show here.

test/quasiquote003/run → test/quasiquote003/run.shrenamed

Only the mode changed.

test/quasiquote004/expecteddeleted−11

This diff is too big to show here.

test/quasiquote004/expected.outnew file+27

This diff is too big to show here.

test/quasiquote004/run → test/quasiquote004/run.shrenamed

Only the mode changed.

test/reg051-disabled/expected → test/quasiquote005/expected.outrenamed

The content is the same.

test/quasiquote005/run → test/quasiquote005/run.shrenamed

Only the mode changed.

test/quasiquote006/expected → test/quasiquote006/expected.outrenamed+16−4

This diff is too big to show here.

test/quasiquote006/rundeleted−3

This diff is too big to show here.

test/quasiquote006/run.shnew file+3

This diff is too big to show here.

test/records001/expected → test/records001/expected.outrenamed

The content is the same.

test/records001/run → test/records001/run.shrenamed

Only the mode changed.

test/records002/expected → test/records002/expected.outrenamed

The content is the same.

test/records002/run → test/records002/run.shrenamed

Only the mode changed.

test/records003/expected → test/records003/expected.outrenamed

The content is the same.

test/records003/run → test/records003/run.shrenamed

Only the mode changed.

test/records004/expected → test/records004/expected.outrenamed

The content is the same.

test/records004/run → test/records004/run.shrenamed

Only the mode changed.

test/records005/expected → test/records005/expected.outrenamed

The content is the same.

test/records005/run → test/records005/run.shrenamed

Only the mode changed.

test/reg001/Area.idrnew file+12

This diff is too big to show here.

test/reg001/TestEx.idrnew file+31

This diff is too big to show here.

test/reg001/expected.outnew file+3

This diff is too big to show here.

test/reg001/run.shnew file+4

This diff is too big to show here.

test/reg002/expected → test/reg002/expected.outrenamed

The content is the same.

test/reg002/run → test/reg002/run.shrenamed

Only the mode changed.

test/reg004/expected → test/reg004/expected.outrenamed

The content is the same.

test/reg004/run → test/reg004/run.shrenamed

Only the mode changed.

test/reg005/expected → test/reg005/expected.outrenamed

The content is the same.

test/reg005/run → test/reg005/run.shrenamed

Only the mode changed.

test/reg007/expected → test/reg007/expected.outrenamed

The content is the same.

test/reg007/run → test/reg007/run.shrenamed

Only the mode changed.

test/reg013/expected → test/reg013/expected.outrenamed

The content is the same.

test/reg013/run → test/reg013/run.shrenamed

Only the mode changed.

test/reg016/expected → test/reg016/expected.outrenamed

The content is the same.

test/reg016/run → test/reg016/run.shrenamed

Only the mode changed.

test/reg017/expecteddeleted−5

This diff is too big to show here.

test/reg017/expected.outnew file+13

This diff is too big to show here.

test/reg017/run → test/reg017/run.shrenamed

Only the mode changed.

test/reg020/expected → test/reg020/expected.outrenamed

The content is the same.

test/reg020/run → test/reg020/run.shrenamed

Only the mode changed.

test/reg024/expected → test/reg024/expected.outrenamed

The content is the same.

test/reg024/run → test/reg024/run.shrenamed

Only the mode changed.

test/reg025/expected → test/reg025/expected.outrenamed

The content is the same.

test/reg025/run → test/reg025/run.shrenamed

Only the mode changed.

test/reg027/expecteddeleted−3

This diff is too big to show here.

test/reg027/expected.outnew file+7

This diff is too big to show here.

test/reg027/reg027.idr+1−16

This diff is too big to show here.

test/reg027/run → test/reg027/run.shrenamed

Only the mode changed.

test/reg029/expected → test/reg029/expected.outrenamed

The content is the same.

test/reg029/run → test/reg029/run.shrenamed

Only the mode changed.

test/reg031/expected → test/reg031/expected.outrenamed

The content is the same.

test/reg031/run → test/reg031/run.shrenamed

Only the mode changed.

test/reg032/expected → test/reg032/expected.outrenamed

The content is the same.

test/reg032/run → test/reg032/run.shrenamed

Only the mode changed.

test/reg039/expected → test/reg039/expected.outrenamed

The content is the same.

test/reg039/run → test/reg039/run.shrenamed

Only the mode changed.

test/reg040/expected → test/reg040/expected.outrenamed

The content is the same.

test/reg040/run → test/reg040/run.shrenamed

Only the mode changed.

test/reg041/expected → test/reg041/expected.outrenamed

The content is the same.

test/reg041/run → test/reg041/run.shrenamed+1−1

This diff is too big to show here.

test/reg042/expected → test/reg042/expected.outrenamed

The content is the same.

test/reg042/run → test/reg042/run.shrenamed

Only the mode changed.

test/reg045/expected → test/reg045/expected.outrenamed

The content is the same.

test/reg045/run → test/reg045/run.shrenamed

Only the mode changed.

test/regression001/expected → test/reg048/expected.outrenamed

The content is the same.

test/reg048/run → test/reg048/run.shrenamed

Only the mode changed.

test/tactics001/expected → test/reg051-disabled/expected.outrenamed

The content is the same.

test/reg051-disabled/run → test/reg051-disabled/run.shrenamed

Only the mode changed.

test/reg052/expected → test/reg052/expected.outrenamed

The content is the same.

test/reg052/run → test/reg052/run.shrenamed

Only the mode changed.

test/reg067/expected → test/reg067/expected.outrenamed

The content is the same.

test/reg067/run → test/reg067/run.shrenamed

Only the mode changed.

test/reg075/expected → test/reg075/expected.outrenamed

The content is the same.

test/reg075/input → test/reg075/input.inrenamed

The content is the same.

test/reg075/rundeleted−3

This diff is too big to show here.

test/reg075/run.shnew file+3

This diff is too big to show here.

test/reg076/expected.outnew file+1

This diff is too big to show here.

test/tutorial001/expected → test/reg076/input.inrenamed

The content is the same.

test/reg076/reg076.idrnew file+11

This diff is too big to show here.

test/reg076/run.shnew file+4

This diff is too big to show here.

test/tutorial003/expected → test/reg077/expected.outrenamed

The content is the same.

test/reg077/reg077.idrnew file+17

This diff is too big to show here.

test/reg077/run.shnew file+3

This diff is too big to show here.

test/regression001/coverage001.idrnew file+79

This diff is too big to show here.

test/regression001/eff001.idrnew file+39

This diff is too big to show here.

test/tutorial005/expected → test/regression001/expected.outrenamed

The content is the same.

test/regression001/reg001.idr+1−1

This diff is too big to show here.

test/regression001/reg002.idrnew file+8

This diff is too big to show here.

test/regression001/reg003.idrnew file+11

This diff is too big to show here.

test/regression001/reg004.lidrnew file+43

This diff is too big to show here.

test/regression001/reg005.idrnew file+8

This diff is too big to show here.

test/regression001/reg006.idrnew file+14

This diff is too big to show here.

test/regression001/reg007.idrnew file+69

This diff is too big to show here.

test/regression001/reg036.idr+2−2

This diff is too big to show here.

test/regression001/reg046.idr+4−4

This diff is too big to show here.

test/regression001/reg047.idr+2−2

This diff is too big to show here.

test/regression001/reg047a.idr+1−1

This diff is too big to show here.

test/regression001/reg062.lidrdeleted−41

This diff is too big to show here.

test/regression001/reg064.idr+1−1

This diff is too big to show here.

test/regression001/rundeleted−13

This diff is too big to show here.

test/regression001/run.shnew file+18

This diff is too big to show here.

test/regression002/Canonicity.idrnew file+13

This diff is too big to show here.

test/regression002/Negation.idrnew file+2

This diff is too big to show here.

test/regression002/expecteddeleted−147

This diff is too big to show here.

test/regression002/expected.outnew file+368

This diff is too big to show here.

test/regression002/reg001.idrnew file+2

This diff is too big to show here.

test/regression002/reg002.idrnew file+3

This diff is too big to show here.

test/regression002/run → test/regression002/run.shrenamed+5−1

This diff is too big to show here.

test/regression003/expected.outnew file+1

This diff is too big to show here.

test/regression003/regression003.idrnew file+56

This diff is too big to show here.

test/regression003/run.shnew file+4

This diff is too big to show here.

test/sourceLocation001/SourceLoc.idr+1

This diff is too big to show here.

test/sourceLocation001/expecteddeleted−19

This diff is too big to show here.

test/sourceLocation001/expected.outnew file+35

This diff is too big to show here.

test/sourceLocation001/run → test/sourceLocation001/run.shrenamed

Only the mode changed.

test/st001/expected.outnew file+8

This diff is too big to show here.

test/st001/run.shnew file+6

This diff is too big to show here.

test/st001/test001.idrnew file+66

This diff is too big to show here.

test/st001/testFile.innew file+2

This diff is too big to show here.

test/st002/expected.outnew file+8

This diff is too big to show here.

test/st002/run.shnew file+6

This diff is too big to show here.

test/st002/test002.idrnew file+66

This diff is too big to show here.

test/st002/testFile.innew file+2

This diff is too big to show here.

test/st003/expected.outnew file+8

This diff is too big to show here.

test/st003/run.shnew file+6

This diff is too big to show here.

test/st003/test003.idrnew file+25

This diff is too big to show here.

test/st003/testFile.innew file+2

This diff is too big to show here.

test/st004/expected.outnew file+6

This diff is too big to show here.

test/st004/run.shnew file+6

This diff is too big to show here.

test/st004/test004.idrnew file+24

This diff is too big to show here.

test/st005/expected.outnew file+6

This diff is too big to show here.

test/st005/run.shnew file+7

This diff is too big to show here.

test/st005/test005.idrnew file+33

This diff is too big to show here.

test/st006/expected.outnew file+5

This diff is too big to show here.

test/st006/run.shnew file+6

This diff is too big to show here.

test/st006/test006.idrnew file+37

This diff is too big to show here.

test/st007/expected.outnew file+6

This diff is too big to show here.

test/st007/run.shnew file+6

This diff is too big to show here.

test/st007/test007.idrnew file+24

This diff is too big to show here.

test/sugar001/expected → test/sugar001/expected.outrenamed

The content is the same.

test/sugar001/run → test/sugar001/run.shrenamed

Only the mode changed.

test/sugar002/expected → test/sugar002/expected.outrenamed

The content is the same.

test/sugar002/run → test/sugar002/run.shrenamed

Only the mode changed.

test/sugar003/expected → test/sugar003/expected.outrenamed

The content is the same.

test/sugar003/run → test/sugar003/run.shrenamed

Only the mode changed.

test/sugar004/expected → test/sugar004/expected.outrenamed+1

This diff is too big to show here.

test/sugar004/run → test/sugar004/run.shrenamed+1

This diff is too big to show here.

test/sugar004/sugar004.idr+12−1

This diff is too big to show here.

test/sugar005/As.idr+1−1

This diff is too big to show here.

test/sugar005/expected → test/sugar005/expected.outrenamed

The content is the same.

test/sugar005/run → test/sugar005/run.shrenamed

Only the mode changed.

test/syntax001/expected → test/syntax001/expected.outrenamed+12−2

This diff is too big to show here.

test/syntax001/run → test/syntax001/run.shrenamed

Only the mode changed.

test/syntax002/expected → test/syntax002/expected.outrenamed

The content is the same.

test/syntax002/run → test/syntax002/run.shrenamed

Only the mode changed.

test/tactics001/Tactics.idr+5−3

This diff is too big to show here.

test/tactics001/expected.outnew file

No changes to the content.

test/tactics001/run → test/tactics001/run.shrenamed

Only the mode changed.

test/totality001/expecteddeleted−3

This diff is too big to show here.

test/totality001/expected.outnew file+18

This diff is too big to show here.

test/totality001/run → test/totality001/run.shrenamed

Only the mode changed.

test/totality002/expecteddeleted−5

This diff is too big to show here.

test/totality002/expected.outnew file+18

This diff is too big to show here.

test/totality002/run → test/totality002/run.shrenamed

Only the mode changed.

test/totality003/expected → test/totality003/expected.outrenamed+5−1

This diff is too big to show here.

test/totality003/run → test/totality003/run.shrenamed

Only the mode changed.

test/totality004/expecteddeleted−4

This diff is too big to show here.

test/totality004/expected.outnew file+13

This diff is too big to show here.

test/totality004/run → test/totality004/run.shrenamed

Only the mode changed.

test/totality005/expected → test/totality005/expected.outrenamed

The content is the same.

test/totality005/run → test/totality005/run.shrenamed

Only the mode changed.

test/totality006/expecteddeleted−4

This diff is too big to show here.

test/totality006/expected.outnew file+18

This diff is too big to show here.

test/totality006/run → test/totality006/run.shrenamed

Only the mode changed.

test/totality007/expecteddeleted−5

This diff is too big to show here.

test/totality007/expected.outnew file+9

This diff is too big to show here.

test/totality007/run → test/totality007/run.shrenamed

Only the mode changed.

test/totality008/expecteddeleted−1

This diff is too big to show here.

test/totality008/expected.outnew file+6

This diff is too big to show here.

test/totality008/run → test/totality008/run.shrenamed

Only the mode changed.

test/totality009/expecteddeleted−10

This diff is too big to show here.

test/totality009/expected.outnew file+60

This diff is too big to show here.

test/totality009/run → test/totality009/run.shrenamed

Only the mode changed.

test/totality010/expecteddeleted−2

This diff is too big to show here.

test/totality010/expected.outnew file+12

This diff is too big to show here.

test/totality010/run → test/totality010/run.shrenamed

Only the mode changed.

test/totality011/expecteddeleted−2

This diff is too big to show here.

test/totality011/expected.outnew file+6

This diff is too big to show here.

test/totality011/run → test/totality011/run.shrenamed

Only the mode changed.

test/totality011/totality011.lidr+2−2

This diff is too big to show here.

test/totality012/expecteddeleted−4

This diff is too big to show here.

test/totality012/expected.outnew file+12

This diff is too big to show here.

test/totality012/run → test/totality012/run.shrenamed

Only the mode changed.

test/totality013/expecteddeleted−4

This diff is too big to show here.

test/totality013/expected.outnew file+12

This diff is too big to show here.

test/totality013/run → test/totality013/run.shrenamed

Only the mode changed.

test/totality014/expected → test/totality014/expected.outrenamed+9−4

This diff is too big to show here.

test/totality014/run → test/totality014/run.shrenamed

Only the mode changed.

test/totality015/expecteddeleted−4

This diff is too big to show here.

test/totality015/expected.outnew file+18

This diff is too big to show here.

test/totality015/run → test/totality015/run.shrenamed

Only the mode changed.

test/totality015/totality015.idr+1−1

This diff is too big to show here.

test/totality016/expecteddeleted−9

This diff is too big to show here.

test/totality016/expected.outnew file+54

This diff is too big to show here.

test/totality016/run → test/totality016/run.shrenamed

Only the mode changed.

test/totality017/expecteddeleted−6

This diff is too big to show here.

test/totality017/expected.outnew file+36

This diff is too big to show here.

test/totality017/run → test/totality017/run.shrenamed

Only the mode changed.

test/totality018/expected.outnew file+6

This diff is too big to show here.

test/totality018/run.shnew file+3

This diff is too big to show here.

test/totality018/totality018.idrnew file+15

This diff is too big to show here.

test/totality019/expected.outnew file+12

This diff is too big to show here.

test/totality019/run.shnew file+4

This diff is too big to show here.

test/totality019/totality019.idrnew file+14

This diff is too big to show here.

test/totality019/totality019a.idrnew file+81

This diff is too big to show here.

test/totality020/expected.outnew file+12

This diff is too big to show here.

test/totality020/run.shnew file+3

This diff is too big to show here.

test/totality020/totality020.idrnew file+11

This diff is too big to show here.

test/totality021/expected.outnew file+30

This diff is too big to show here.

test/totality021/run.shnew file+4

This diff is too big to show here.

test/totality021/totality021.idrnew file+18

This diff is too big to show here.

test/totality021/totality021a.idrnew file+12

This diff is too big to show here.

test/totality022/expected.outnew file+6

This diff is too big to show here.

test/totality022/run.shnew file+3

This diff is too big to show here.

test/totality022/totality022.idrnew file+11

This diff is too big to show here.

test/totality023/expected.outnew file+6

This diff is too big to show here.

test/totality023/run.shnew file+3

This diff is too big to show here.

test/totality023/totality023.idrnew file+11

This diff is too big to show here.

test/totality024/expected.outnew file+1

This diff is too big to show here.

test/totality024/run.shnew file+3

This diff is too big to show here.

test/totality024/totality023.idrnew file+7

This diff is too big to show here.

test/totality025/expected.outnew file+18

This diff is too big to show here.

test/totality025/run.shnew file+3

This diff is too big to show here.

test/totality025/totality025.idrnew file+17

This diff is too big to show here.

test/totality026/expected.outnew file+6

This diff is too big to show here.

test/totality026/run.shnew file+3

This diff is too big to show here.

test/totality026/totality026.idrnew file+7

This diff is too big to show here.

test/tutorial001/expected.outnew file

No changes to the content.

test/tutorial001/run → test/tutorial001/run.shrenamed

Only the mode changed.

test/tutorial002/expecteddeleted−6

This diff is too big to show here.

test/tutorial002/expected.outnew file+18

This diff is too big to show here.

test/tutorial002/run → test/tutorial002/run.shrenamed

Only the mode changed.

test/tutorial003/expected.outnew file

No changes to the content.

test/tutorial003/run → test/tutorial003/run.shrenamed

Only the mode changed.

test/tutorial004/expecteddeleted−4

This diff is too big to show here.

test/tutorial004/expected.outnew file+12

This diff is too big to show here.

test/tutorial004/run → test/tutorial004/run.shrenamed

Only the mode changed.

test/tutorial005/expected.outnew file

No changes to the content.

test/tutorial005/run → test/tutorial005/run.shrenamed

Only the mode changed.

test/tutorial006/expected → test/tutorial006/expected.outrenamed+15−7

This diff is too big to show here.

test/tutorial006/run → test/tutorial006/run.shrenamed

Only the mode changed.

test/tutorial007/expected → test/tutorial007/expected.outrenamed

The content is the same.

test/tutorial007/run → test/tutorial007/run.shrenamed

Only the mode changed.

test/unique001/expected → test/unique001/expected.outrenamed

The content is the same.

test/unique001/run → test/unique001/run.shrenamed

Only the mode changed.

test/unique001/unique001.idr+2

This diff is too big to show here.

test/unique004/expecteddeleted−26

This diff is too big to show here.

test/unique004/expected.outnew file+75

This diff is too big to show here.

test/unique004/run → test/unique004/run.shrenamed+1−1

This diff is too big to show here.

test/unique004/unique001a.idr+2

This diff is too big to show here.

test/unique004/unique001b.idr+2

This diff is too big to show here.

test/unique004/unique001c.idr+1

This diff is too big to show here.

test/unique004/unique001d.idr+1

This diff is too big to show here.

test/unique004/unique001e.idr+1

This diff is too big to show here.

test/unique004/unique002.idr+2

This diff is too big to show here.

test/unique004/unique002a.idr+2

This diff is too big to show here.

test/unique004/unique003.idr+2

This diff is too big to show here.

test/universes001/expected → test/universes001/expected.outrenamed+10−5

This diff is too big to show here.

test/universes001/run → test/universes001/run.shrenamed

Only the mode changed.

test/universes002/expecteddeleted−9

This diff is too big to show here.

test/universes002/expected.outnew file+14

This diff is too big to show here.

test/universes002/run → test/universes002/run.shrenamed

Only the mode changed.

test/views001/expected → test/views001/expected.outrenamed

The content is the same.

test/views001/run → test/views001/run.shrenamed

Only the mode changed.

test/views001/views001.idr+1−1

This diff is too big to show here.

test/views001/views001a.idr+1−1

This diff is too big to show here.

test/views002/expected → test/views002/expected.outrenamed

The content is the same.

test/views002/run → test/views002/run.shrenamed

Only the mode changed.

test/views002/views002.idr+1−1

This diff is too big to show here.

test/views003/expected → test/views003/expected.outrenamed

The content is the same.

test/views003/run → test/views003/run.shrenamed

Only the mode changed.