idris 0.9.19 → 0.9.19.1
raw patch · 215 files changed
+6612/−2044 lines, 215 filesdep ~utf8-stringnew-component:exe:idris-codegen-cnew-component:exe:idris-codegen-javascriptnew-component:exe:idris-codegen-nodebinary-addedPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: utf8-string
API changes (from Hackage documentation)
+ IRTS.Lang: LStrSubstr :: PrimFn
+ Idris.AbsSyntax: addRecord :: Name -> RecordInfo -> Idris ()
+ Idris.AbsSyntax: getDesugarNats :: Idris Bool
+ Idris.AbsSyntax: setDesugarNats :: Bool -> Idris ()
+ Idris.AbsSyntaxTree: DesugarNats :: Opt
+ Idris.AbsSyntaxTree: IBCRecord :: Name -> IBCWrite
+ Idris.AbsSyntaxTree: RI :: [(Name, PTerm)] -> Name -> [Name] -> RecordInfo
+ Idris.AbsSyntaxTree: data RecordInfo
+ Idris.AbsSyntaxTree: idris_records :: IState -> Ctxt RecordInfo
+ Idris.AbsSyntaxTree: instance Show RecordInfo
+ Idris.AbsSyntaxTree: opt_desugarnats :: IOption -> Bool
+ Idris.AbsSyntaxTree: ppopt_desugarnats :: PPOption -> Bool
+ Idris.AbsSyntaxTree: record_constructor :: RecordInfo -> Name
+ Idris.AbsSyntaxTree: record_parameters :: RecordInfo -> [(Name, PTerm)]
+ Idris.AbsSyntaxTree: record_projections :: RecordInfo -> [Name]
+ Idris.Core.DeepSeq: forceDefCtxt :: Context -> Context
+ Idris.Core.DeepSeq: instance NFData Context
+ Idris.Core.DeepSeq: instance NFData NameOutput
+ Idris.Core.DeepSeq: instance NFData Ordering
+ Idris.Core.DeepSeq: instance NFData OutputAnnotation
+ Idris.Core.DeepSeq: instance NFData TextFormatting
+ Idris.Core.ProofTerm: resetProofTerm :: ProofTerm -> ProofTerm
+ Idris.DeepSeq: instance NFData ColourTheme
+ Idris.DeepSeq: instance NFData ConsoleWidth
+ Idris.DeepSeq: instance NFData DynamicLib
+ Idris.DeepSeq: instance NFData IBCWrite
+ Idris.DeepSeq: instance NFData IOption
+ Idris.DeepSeq: instance NFData IState
+ Idris.DeepSeq: instance NFData IdrisColour
+ Idris.DeepSeq: instance NFData LanguageExt
+ Idris.DeepSeq: instance NFData Opt
+ Idris.DeepSeq: instance NFData Optimisation
+ Idris.DeepSeq: instance NFData OutputMode
+ Idris.DeepSeq: instance NFData OutputType
+ Idris.DeepSeq: instance NFData PrimFn
+ Idris.DeepSeq: instance NFData RecordInfo
+ Idris.DeepSeq: instance NFData SyntaxRules
+ Idris.DeepSeq: instance NFData TIData
+ Idris.Delaborate: pprintNoDelab :: IState -> Term -> Doc OutputAnnotation
+ Idris.Docs: RecordDoc :: Name -> d -> (FunDoc' d) -> [FunDoc' d] -> [(Name, PTerm, Maybe d)] -> Docs' d
+ Idris.Elab.Utils: getTCParamsInType :: IState -> [Name] -> [PArg] -> Type -> [Name]
+ Idris.Elab.Utils: getTCinj :: IState -> TT Name -> [Name]
+ Idris.IBC: instance Binary RecordInfo
+ Pkg.Package: rmExe :: String -> IO ()
- Idris.AbsSyntax: aiFn :: Bool -> Bool -> Bool -> [Name] -> IState -> FC -> Name -> FC -> [[Text]] -> [PArg] -> Either Err PTerm
+ Idris.AbsSyntax: aiFn :: Name -> Bool -> Bool -> Bool -> [Name] -> IState -> FC -> Name -> FC -> [[Text]] -> [PArg] -> [PArg] -> Either Err PTerm
- Idris.AbsSyntaxTree: IOption :: Int -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Codegen -> OutputType -> FilePath -> [FilePath] -> String -> String -> [Opt] -> Bool -> Bool -> [FilePath] -> [Optimisation] -> Maybe Int -> Bool -> IOption
+ Idris.AbsSyntaxTree: IOption :: Int -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Codegen -> OutputType -> FilePath -> [FilePath] -> String -> String -> [Opt] -> Bool -> Bool -> [FilePath] -> [Optimisation] -> Maybe Int -> Bool -> Bool -> IOption
- Idris.AbsSyntaxTree: IState :: Context -> Set ConstraintFC -> [FixDecl] -> Ctxt [PArg] -> Ctxt [Bool] -> Ctxt ClassInfo -> Ctxt DSL -> Ctxt OptInfo -> Ctxt TypeInfo -> Ctxt [Name] -> Ctxt ([([Name], Term, Term)], [PTerm]) -> Ctxt [FnOpt] -> Ctxt CGInfo -> Ctxt [Name] -> Ctxt (Docstring DocTerm, [(Name, Docstring DocTerm)]) -> Ctxt (Docstring DocTerm) -> Ctxt TIData -> Ctxt FnInfo -> Ctxt [(Term, Term)] -> Ctxt [Name] -> [(FC, Name)] -> [(FC, Name)] -> [(FC, String)] -> IOption -> Int -> [((FilePath, Int), PTerm)] -> [(Name, (Maybe Name, Int, [Name], Bool))] -> [Name] -> [(Term, Term)] -> SyntaxRules -> [String] -> [FilePath] -> [(Name, (Int, PrimFn))] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(FilePath, Bool)] -> [(Name, (Bool, [String]))] -> Maybe FC -> [(FC, Err)] -> Maybe Name -> [Int] -> [Maybe Int] -> Maybe FC -> Maybe FC -> [(Name, Maybe Accessibility)] -> Accessibility -> Bool -> [IBCWrite] -> Maybe String -> [DynamicLib] -> [LanguageExt] -> OutputMode -> Bool -> ColourTheme -> [Name] -> (Int, Ctxt (Int, Name)) -> Ctxt (Map Name (Set Name)) -> Map [Text] [Text] -> ConsoleWidth -> Set Name -> Set (Name, Int) -> [(Name, Int)] -> Maybe (Map Name [Name]) -> Maybe (Map Name [Name]) -> [Name] -> [(Name, Bool)] -> Map Name Name -> [Name] -> [(FC, OutputAnnotation)] -> [(FC, OutputAnnotation)] -> IState
+ Idris.AbsSyntaxTree: IState :: Context -> Set ConstraintFC -> [FixDecl] -> Ctxt [PArg] -> Ctxt [Bool] -> Ctxt ClassInfo -> Ctxt RecordInfo -> Ctxt DSL -> Ctxt OptInfo -> Ctxt TypeInfo -> Ctxt [Name] -> Ctxt ([([Name], Term, Term)], [PTerm]) -> Ctxt [FnOpt] -> Ctxt CGInfo -> Ctxt [Name] -> Ctxt (Docstring DocTerm, [(Name, Docstring DocTerm)]) -> Ctxt (Docstring DocTerm) -> Ctxt TIData -> Ctxt FnInfo -> Ctxt [(Term, Term)] -> Ctxt [Name] -> [(FC, Name)] -> [(FC, Name)] -> [(FC, String)] -> IOption -> Int -> [((FilePath, Int), PTerm)] -> [(Name, (Maybe Name, Int, [Name], Bool))] -> [Name] -> [(Term, Term)] -> SyntaxRules -> [String] -> [FilePath] -> [(Name, (Int, PrimFn))] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(FilePath, Bool)] -> [(Name, (Bool, [String]))] -> Maybe FC -> [(FC, Err)] -> Maybe Name -> [Int] -> [Maybe Int] -> Maybe FC -> Maybe FC -> [(Name, Maybe Accessibility)] -> Accessibility -> Bool -> [IBCWrite] -> Maybe String -> [DynamicLib] -> [LanguageExt] -> OutputMode -> Bool -> ColourTheme -> [Name] -> (Int, Ctxt (Int, Name)) -> Ctxt (Map Name (Set Name)) -> Map [Text] [Text] -> ConsoleWidth -> Set Name -> Set (Name, Int) -> [(Name, Int)] -> Maybe (Map Name [Name]) -> Maybe (Map Name [Name]) -> [Name] -> [(Name, Bool)] -> Map Name Name -> [Name] -> [(FC, OutputAnnotation)] -> [(FC, OutputAnnotation)] -> IState
- Idris.AbsSyntaxTree: PPOption :: Bool -> Bool -> Maybe Int -> PPOption
+ Idris.AbsSyntaxTree: PPOption :: Bool -> Bool -> Bool -> Maybe Int -> PPOption
- Idris.AbsSyntaxTree: PQuoteName :: Name -> FC -> PTerm
+ Idris.AbsSyntaxTree: PQuoteName :: Name -> Bool -> FC -> PTerm
- Idris.Core.Elaborate: defer :: [Name] -> Name -> Elab' aux ()
+ Idris.Core.Elaborate: defer :: [Name] -> Name -> Elab' aux Name
- Idris.Core.Elaborate: get_autos :: Elab' aux [(Name, [Name])]
+ Idris.Core.Elaborate: get_autos :: Elab' aux [(Name, ([FailContext], [Name]))]
- Idris.Core.ProofState: PS :: Name -> [Name] -> [Name] -> Int -> ProofTerm -> Type -> [Name] -> (Name, [(Name, Term)]) -> [(Name, Term)] -> [(Name, [Name])] -> Maybe (Name, Term) -> Fails -> [Name] -> [Name] -> [Name] -> [(Name, [Name])] -> [Name] -> Maybe ProofState -> Context -> Ctxt TypeInfo -> String -> Bool -> Bool -> [Name] -> [FailContext] -> ProofState
+ Idris.Core.ProofState: PS :: Name -> [Name] -> [Name] -> Int -> ProofTerm -> Type -> [Name] -> (Name, [(Name, Term)]) -> [(Name, Term)] -> [(Name, [Name])] -> Maybe (Name, Term) -> Fails -> [Name] -> [Name] -> [Name] -> [(Name, ([FailContext], [Name]))] -> [Name] -> Maybe ProofState -> Context -> Ctxt TypeInfo -> String -> Bool -> Bool -> [Name] -> [FailContext] -> ProofState
- Idris.Core.ProofState: autos :: ProofState -> [(Name, [Name])]
+ Idris.Core.ProofState: autos :: ProofState -> [(Name, ([FailContext], [Name]))]
- Idris.Core.TT: CaseN :: Name -> SpecialName
+ Idris.Core.TT: CaseN :: !Name -> SpecialName
- Idris.Core.TT: ElimN :: Name -> SpecialName
+ Idris.Core.TT: ElimN :: !Name -> SpecialName
- Idris.Core.TT: InstanceCtorN :: Name -> SpecialName
+ Idris.Core.TT: InstanceCtorN :: !Name -> SpecialName
- Idris.Core.TT: InstanceN :: Name -> [Text] -> SpecialName
+ Idris.Core.TT: InstanceN :: !Name -> [Text] -> SpecialName
- Idris.Core.TT: MN :: Int -> Text -> Name
+ Idris.Core.TT: MN :: !Int -> !Text -> Name
- Idris.Core.TT: MetaN :: Name -> Name -> SpecialName
+ Idris.Core.TT: MetaN :: !Name -> !Name -> SpecialName
- Idris.Core.TT: MethodN :: Name -> SpecialName
+ Idris.Core.TT: MethodN :: !Name -> SpecialName
- Idris.Core.TT: NS :: Name -> [Text] -> Name
+ Idris.Core.TT: NS :: !Name -> [Text] -> Name
- Idris.Core.TT: ParentN :: Name -> Text -> SpecialName
+ Idris.Core.TT: ParentN :: !Name -> !Text -> SpecialName
- Idris.Core.TT: SN :: SpecialName -> Name
+ Idris.Core.TT: SN :: !SpecialName -> Name
- Idris.Core.TT: UN :: Text -> Name
+ Idris.Core.TT: UN :: !Text -> Name
- Idris.Core.TT: WhereN :: Int -> Name -> Name -> SpecialName
+ Idris.Core.TT: WhereN :: !Int -> !Name -> !Name -> SpecialName
- Idris.Core.TT: WithN :: Int -> Name -> SpecialName
+ Idris.Core.TT: WithN :: !Int -> !Name -> SpecialName
- Idris.Elab.Term: solveAuto :: IState -> Name -> Bool -> Name -> ElabD ()
+ Idris.Elab.Term: solveAuto :: IState -> Name -> Bool -> (Name, [FailContext]) -> ElabD ()
- Idris.Elab.Utils: recheckC_borrowing :: Bool -> [Name] -> FC -> (Err' (TT Name) -> Err) -> Env -> TT Name -> StateT IState (ExceptT Err IO) (Term, Type)
+ Idris.Elab.Utils: recheckC_borrowing :: Bool -> Bool -> [Name] -> FC -> (Err' (TT Name) -> Err) -> Env -> TT Name -> StateT IState (ExceptT Err IO) (Term, Type)
Files
- CHANGELOG +624/−0
- CITATION.md +29/−0
- CONTRIBUTING.md +169/−0
- CONTRIBUTORS +47/−0
- README.md +78/−0
- benchmarks/ALL +4/−0
- benchmarks/README +21/−0
- benchmarks/build.pl +14/−0
- benchmarks/fasta/fasta.idr +84/−0
- benchmarks/fasta/fasta.ipkg +6/−0
- benchmarks/pidigits/pidigits.idr +52/−0
- benchmarks/pidigits/pidigits.ipkg +6/−0
- benchmarks/quasigroups/Main.idr +24/−0
- benchmarks/quasigroups/Parser.idr +79/−0
- benchmarks/quasigroups/Solver.idr +204/−0
- benchmarks/quasigroups/board +12/−0
- benchmarks/quasigroups/qgsolve.ipkg +7/−0
- benchmarks/run.pl +24/−0
- benchmarks/trivial/sortvec.idr +24/−0
- benchmarks/trivial/sortvec.ipkg +8/−0
- codegen/idris-c/Main.hs +0/−52
- codegen/idris-codegen-c/Main.hs +50/−0
- codegen/idris-codegen-javascript/Main.hs +44/−0
- codegen/idris-codegen-node/Main.hs +43/−0
- codegen/idris-javascript/Main.hs +0/−42
- codegen/idris-node/Main.hs +0/−42
- config.mk +4/−0
- idris-tutorial.pdf binary
- idris.cabal +58/−44
- jsrts/Runtime-node.js +12/−6
- libs/base/Control/Category.idr +3/−1
- libs/base/Data/Bits.idr +1/−1
- libs/base/Data/Complex.idr +7/−8
- libs/base/Data/Floats.idr +0/−59
- libs/base/Data/Mod2.idr +0/−2
- libs/base/Data/Vect.idr +561/−7
- libs/base/Data/VectType.idr +0/−601
- libs/base/base.ipkg +2/−2
- libs/contrib/Classes/Verified.idr +13/−16
- libs/contrib/Control/Algebra.idr +1/−1
- libs/contrib/Data/Matrix/Numeric.idr +9/−6
- libs/contrib/Data/Nat/DivMod/IteratedSubtraction.idr +1/−1
- libs/contrib/Data/ZZ.idr +14/−11
- libs/effects/Effect/Logging/Category.idr +184/−0
- libs/effects/Effect/Logging/Default.idr +96/−35
- libs/effects/Effect/Logging/Level.idr +66/−34
- libs/effects/Effect/Logging/Simple.idr +0/−48
- libs/effects/Effects.idr +10/−10
- libs/effects/effects.ipkg +1/−1
- libs/prelude/Prelude.idr +3/−2
- libs/prelude/Prelude/Cast.idr +1/−1
- libs/prelude/Prelude/Chars.idr +3/−3
- libs/prelude/Prelude/Classes.idr +31/−32
- libs/prelude/Prelude/Doubles.idr +63/−0
- libs/prelude/Prelude/List.idr +3/−4
- libs/prelude/Prelude/Nat.idr +17/−17
- libs/prelude/Prelude/Strings.idr +9/−6
- libs/prelude/prelude.ipkg +1/−1
- man/idris.1 +94/−0
- rts/idris_rts.c +11/−0
- rts/idris_rts.h +6/−0
- rts/idris_utf8.c +26/−0
- rts/idris_utf8.h +3/−1
- samples/effects/ConsoleIO.idr +15/−0
- samples/effects/Exception.idr +21/−0
- samples/effects/Random.idr +37/−0
- samples/effects/ReadInt.idr +22/−0
- samples/effects/Select.idr +17/−0
- samples/effects/TreeTag-noeff.idr +21/−0
- samples/effects/TreeTag.idr +40/−0
- samples/effects/TreeTagCount.idr +29/−0
- samples/effects/hworld.idr +10/−0
- samples/effects/vadd.idr +41/−0
- samples/misc/binary.idr +94/−0
- samples/misc/interp-alt.idr +81/−0
- samples/misc/interp.idr +91/−0
- samples/misc/javaffi.idr +12/−0
- samples/misc/named_instance.lidr +36/−0
- samples/misc/reflection.idr +151/−0
- samples/tutorial/binary.idr +61/−0
- samples/tutorial/bmain.idr +8/−0
- samples/tutorial/btree.idr +18/−0
- samples/tutorial/btreemod.idr +20/−0
- samples/tutorial/classes.idr +10/−0
- samples/tutorial/foo.idr +10/−0
- samples/tutorial/hello.idr +5/−0
- samples/tutorial/idiom.idr +38/−0
- samples/tutorial/interp.idr +71/−0
- samples/tutorial/letbind.idr +16/−0
- samples/tutorial/prims.idr +14/−0
- samples/tutorial/theorems.idr +57/−0
- samples/tutorial/universe.idr +7/−0
- samples/tutorial/usefultypes.idr +20/−0
- samples/tutorial/vbroken.idr +10/−0
- samples/tutorial/views.idr +37/−0
- samples/tutorial/viewsbroken.idr +12/−0
- samples/tutorial/wheres.idr +14/−0
- src/IRTS/CodegenC.hs +17/−1
- src/IRTS/CodegenJavaScript.hs +9/−0
- src/IRTS/Compiler.hs +8/−84
- src/IRTS/Lang.hs +1/−1
- src/Idris/AbsSyntax.hs +238/−181
- src/Idris/AbsSyntaxTree.hs +215/−137
- src/Idris/Completion.hs +1/−0
- src/Idris/Core/DeepSeq.hs +43/−0
- src/Idris/Core/Elaborate.hs +3/−2
- src/Idris/Core/Evaluate.hs +13/−11
- src/Idris/Core/ProofState.hs +15/−9
- src/Idris/Core/ProofTerm.hs +4/−0
- src/Idris/Core/TT.hs +30/−14
- src/Idris/Core/Unify.hs +134/−101
- src/Idris/Coverage.hs +8/−4
- src/Idris/DeepSeq.hs +303/−1
- src/Idris/Delaborate.hs +10/−3
- src/Idris/Docs.hs +44/−0
- src/Idris/Elab/Clause.hs +29/−10
- src/Idris/Elab/Record.hs +6/−0
- src/Idris/Elab/Term.hs +72/−37
- src/Idris/Elab/Transform.hs +2/−2
- src/Idris/Elab/Type.hs +1/−0
- src/Idris/Elab/Utils.hs +23/−4
- src/Idris/Error.hs +1/−1
- src/Idris/IBC.hs +34/−7
- src/Idris/IdrisDoc.hs +27/−0
- src/Idris/ParseExpr.hs +9/−4
- src/Idris/Primitives.hs +8/−1
- src/Idris/ProofSearch.hs +15/−4
- src/Idris/Prover.hs +9/−4
- src/Idris/REPL.hs +53/−26
- src/Idris/REPLParser.hs +1/−0
- src/Idris/Reflection.hs +7/−0
- src/Pkg/Package.hs +10/−3
- stack.yaml +6/−0
- test/basic009/expected +11/−2
- test/basic014/basic014.idr +44/−0
- test/basic014/expected +0/−0
- test/basic014/run +3/−0
- test/basic015/basic015.idr +73/−0
- test/basic015/expected +3/−0
- test/basic015/run +4/−0
- test/classes001/ClassName.idr +1/−1
- test/dsl003/DSLPi.idr +1/−1
- test/effects001/test021.idr +2/−1
- test/effects005/categoryLogger.idr +23/−0
- test/effects005/defaultLogger.idr +14/−0
- test/effects005/defaultlog.idr +0/−18
- test/effects005/expected +2/−2
- test/effects005/run +4/−4
- test/effects005/simplelog.idr +0/−14
- test/error003/expected +1/−1
- test/error004/expected +4/−4
- test/meta002/Tacs.idr +40/−0
- test/meta002/expected +1/−1
- test/primitives001/expected +22/−1
- test/primitives001/input +2/−0
- test/primitives001/run +3/−1
- test/primitives001/substring.idr +58/−0
- test/primitives001/test005.idr +0/−1
- test/primitives002/run +0/−2
- test/proof003/test015.idr +1/−1
- test/proofsearch001/expected +0/−0
- test/proofsearch001/proofsearch001.idr +11/−0
- test/proofsearch001/run +3/−0
- test/proofsearch002/Process.idr +443/−0
- test/proofsearch002/expected +0/−0
- test/proofsearch002/proofsearch002.idr +51/−0
- test/proofsearch002/run +3/−0
- test/proofsearch003/expected +0/−0
- test/proofsearch003/proofsearch003.idr +34/−0
- test/proofsearch003/run +3/−0
- test/quasiquote006/quasiquote006.idr +2/−2
- test/reg001/reg001.idr +171/−1
- test/reg005/expected +0/−0
- test/reg005/reg005.idr +0/−12
- test/reg005/run +0/−3
- test/reg009/expected +0/−0
- test/reg009/reg009.lidr +0/−21
- test/reg009/run +0/−3
- test/reg011/expected +0/−0
- test/reg011/reg011.idr +0/−11
- test/reg011/run +0/−3
- test/reg012/expected +0/−0
- test/reg012/reg012.lidr +0/−36
- test/reg012/run +0/−3
- test/reg014/expected +0/−0
- test/reg014/reg014.idr +0/−14
- test/reg014/run +0/−3
- test/reg015/expected +0/−0
- test/reg015/reg015.idr +0/−3
- test/reg015/run +0/−3
- test/reg019/expected +0/−0
- test/reg019/reg019.idr +0/−7
- test/reg019/run +0/−3
- test/reg021/expected +0/−0
- test/reg021/reg021.idr +0/−22
- test/reg021/run +0/−3
- test/reg022/expected +0/−0
- test/reg022/reg022.idr +0/−18
- test/reg022/run +0/−3
- test/reg026/expected +0/−0
- test/reg026/reg026.idr +0/−16
- test/reg026/run +0/−3
- test/reg030/expected +0/−0
- test/reg030/reg030.idr +0/−15
- test/reg030/run +0/−3
- test/reg033/expected +0/−0
- test/reg033/reg033.idr +0/−12
- test/reg033/run +0/−3
- test/reg041/ott.idr +1/−1
- test/reg047/reg047.idr +5/−5
- test/reg047/reg047a.idr +7/−7
- test/totality010/expected +4/−0
- test/totality010/run +3/−0
- test/totality010/totality010.idr +31/−0
- test/tutorial006/expected +1/−1
+ CHANGELOG view
@@ -0,0 +1,624 @@+New in 0.9.20:+==============++Language updates+----------------++* Improved unification by implementing a pattern unification rule+* The syntax `{{n}} quotes n without resolving it, allowing short syntax+ for defining new names. `{n} still quotes n to an existing name in scope.+* A new primitive operator prim__strSubstr for more efficient extraction of+ substrings. External code generators should implement this.+* Changed scoping rules for unbound implicits: any name which would be a+ valid unbound implicit is now *always* an unbound implicit. This is much+ more resilient to changes in inputs, but does require that function names+ be explicitly qualified when in argument position.++Library updates+---------------++* The 'Neg' class now represents numeric types which can be negative. As+such, the (-) operator and 'abs' have been moved there from 'Num'.+* A special version of (-) on 'Nat' requires that the second argument is+smaller than or equal to the first. 'minus' retains the old behaviour,+returning Z if there is an underflow.+* New Logging Effects have been added to facilitate logging of effectful+ programmes.++Tool updates+------------+* Records are now shown as records in :doc, rather than as the underlying+ datatype++Miscellaneous updates+---------------------++[None so far]++New in 0.9.19:+--------------+* The Idris Reference manual has been fleshed out with content originally found+ on the GitHub wiki.+* The Show class has been moved into Prelude.Show and augmented with the method+ showPrec, which allows correct parenthesization of showed terms. This comes+ with the type Prec of precedences and a few helper functions.+* New REPL command :printerdepth that sets the pretty-printer to only descend to+ some particular depth when printing. The default is set to a high number to+ make it less dangerous to experiment with infinite structures. Infinite depth+ can be set by calling :printerdepth with no argument.+* Compiler output shows applications of >>= in do-notation+* fromInteger i where i is an integer constant is now shown just as i in+ compiler output+* An interactive shell, similar to the prover, for running reflected elaborator+ actions. Access it with :elab from the REPL.+* New command-line option --highlight that causes Idris to save highlighting+ information when successfully type checking. The information is in the same+ format sent by the IDE mode, and is saved in a file with the extension ".idh".+* Highlighting information is saved by the parser as well, allowing it to highlight+ keywords like "case", "of", "let", and "do"+* Use predicates instead of boolean equality proofs as preconditions+ on List functions+* More flexible 'case' construct, allowing each branch to target different+ types, provided that the case analysis does not affect the form of any+ variable used in the right hand side of the case.+* Some improvements in interactive editing, particularly in lifting out+ definitions and proof search.+* Moved System.Interactive, along with getArgs to the Prelude.+* Major improvements to reflected elaboration scripts, including the ability to run+ them in a declaration context and many bug fixes.+* "decl syntax" rules to allow syntax extensions at the declaration level+* Experimental Windows support for console colours++New in 0.9.18:+--------------+* GHC 7.10 compatibility+* Add support for bundled toolchains.+* Strings are now UTF8 encoded in the default back end+* Idris source files are now assumed to be in UTF8, regardless of locale+ settings.+* Some reorganisation of primitives:+ + Buffer and BitVector primitives have been removed (they were not+ tested sufficiently, and lack a maintainer)+ + Float has been renamed 'Double' (Float is defined in the Prelude for+ compatibility)+ + Externally defined primitives and operations now supported with+ '%extern' directive, allowing back ends to define their own special+ purpose primitives+ + Ptr and ManagedPtr have been removed and replaced with external primitives+* Add %hint function annotation, which allows functions to be used as+ hints in proof search for 'auto' arguments. Only functions which return+ an instance of a data or record type are allowed as hints.+* Syntax rules no longer perform variable capture. Users of effects will+ need to explicitly name results in dependent effect signatures instead+ of using the default name "result".+* Pattern-matching lambdas are allowed to be impossible. For example,+ Dec (2 = 3) can now be constructed with No $ \(Refl) impossible, instead of+ requiring a separate lemma.+* Case alternatives are allowed to be impossible:+ case Vect.Nil {a=Nat} of { (x::xs) impossible ; [] => True }+* The default Semigroup and Monoid instances for Maybe are now prioritised+ choice, keeping the first success as Alternative does. The version that+ collects successes is now a named instance.+* :exec REPL command now takes an optional expression to compile and run/show+* The return types of `Vect.findIndex`, `Vect.elemIndex` and+ `Vect.elemIndexBy` were changed from `Maybe Nat` to `Maybe (Fin n)`+* A new :browse command shows the contents of a namespace+* `{n} is syntax for a quotation of the reflected representation of the name+ "n". If "n" is lexically bound, then the resulting quotation will be for it,+ whereas if it is not, then it will succeed with a quotation of the unique+ global name that matches.+* New syntax for records that closely matches our other record-like structures:+ type classes. See the updated tutorial for details.+* Records can be coinductive. Define coinductive records with the "corecord"+ keyword.+* Type class constructors can be assigned user-accessible names. This is done+ using the same syntax as record constructors.+* if ... then ... else ... is now built-in syntax instead of being defined in+ a library. It is shown in REPL output and error messages, rather than its+ desugaring.+* The desugaring of if ... then ... else ... has been renamed to ifThenElse from+ boolElim. This is for consistency with GHC Haskell and scala-virtualized, and+ to reflect that if-notation makes sense with non-Bool datatypes.+* Agda-style semantic highlighting is supported over the IDE protocol.+* Experimental support for elaborator reflection. Users can now script the+ elaborator, for use in code generation and proof automation. This feature is+ still under rapid development and is subject to change without notice. See+ Language.Reflection.Elab and the %runElab constructs+++New in 0.9.17:+--------------+* The --ideslave command line option has been replaced with a --ide-mode+ command line option with the same semantics.+* A new tactic "claim N TY" that introduces a new hole named N with type TY+* A new tactic "unfocus" that moves the current hole to the bottom of the+ hole stack+* Quasiquotation supports the generation of Language.Reflection.Raw terms+ in addition to Language.Reflection.TT. Types are used for disambiguation,+ defaulting to TT at the REPL.+* Language.Reflection.Quotable now takes an extra type parameter which+ determines the type to be quoted to. Instances are provided to quote+ common types to both TT and Raw.+* Library operators have been renamed for consistency with Haskell. In+ particular, Applicative.(<$>) is now Applicative.(<*>) and (<$>) is+ now an alias for Functor.map. Correspondingly, ($>) and (<$) have+ been renamed to (<*) and (*>). The cascading effects of this rename+ are that Algebra.(<*>) has been renamed to Algebra.(<.>) and+ Matrix.(<.>) is now Matrix.(<:>).+* Binding forms in DSL notation are now given an extra argument: a+ reflected representation of the name that the user chose.+ Specifically, the rewritten lambda, pi, and let binders will now get+ an extra argument of type TTName. This allows more understandable+ dynamic errors in DSL code and more readable code generation results.+* DSL notation can now be applied with $+* Added FFI_Export type which allows Idris functions to be exportoed and+ called from foreign code+* Instances can now have documentation strings.+* Type providers can have documentation strings.+* Unification errors now (where possible) contain information about provenance+ of a type+* New REPL command ":core TM" that shows the elaborated form of TM along with+ its elaborated type using the syntax of TT. IDE mode has a corresponding+ command :elaborate-term for serialized terms.+* Effectful and IO function names for sending data to STDOUT have been+ aligned, semantically.+ + `print` is now for putting showable things to STDOUT.+ + `printLn` is for putting showable things to STDOUT with a new line+ + `putCharLn` for putting a single character to STDOUT, with a new line.+* Classes can now be annotated with 'determining parameters' to say which+ must be available before resolving instances. Only determining parameters+ are checked when checking for overlapping instances.+* New package 'contrib' containing things that are less mature or less used+ than the contents of 'base'. 'contrib' is not available by default, so you+ may need to add '-p contrib' to your .ipkg file or Idris command line.+* Arguments to class instances are now checked for injectivity.+ Unification assumes this, so we need to check when instances are defined.++New in 0.9.16:+--------------+* Inductive-inductive definitions are now supported (i.e. simultaneously+ defined types where one is indexed by the other.)+* Implicits and type class constraints can now appear in scopes other than+ the top level.+* Importing a module no longer means it is automatically reexported. A new+ "public" modifier has been added to import statements, which will reexport+ the names exported from that module.+* Implemented @-patterns. A pattern of the form x@p on the left hand side+ matches p, with x in scope on the right hand side with value p.+* A new tactic sourceLocation that fills the current hole with the current+ source code span, if this information is available. If not, it raises an+ error.+* Better Unicode support for the JavaScript/Node codegen+* ':search' and ':apropos' commands can now be given optional package lists+ to search.+* Vect, Fin and So moved out of prelude into base, in modules Data.Vect,+ Data.Fin and Data.So respectively.+* Several long-standing issues resolved, particularly with pattern matching+ and coverage checking.+* Modules can now have API documentation strings.++New in 0.9.15:+--------------+* Two new tactics: skip and fail. Skip does nothing, and fail takes a string+ as an argument and produces it as an error.+* Corresponding reflected tactics Skip and Fail. Reflected Fail takes a list+ of ErrorReportParts as an argument, like error handlers produce, allowing+ access to the pretty-printer.+* Stop showing irrelevant and inaccessible internal names in the interactive+ prover.+* The proof arguments in the List library functions are now implicit and+ solved automatically.+* More efficient representation of proof state, leading to faster elaboration+ of large expressions.+* EXPERIMENTAL Implementation of uniqueness types+* Unary negation now desugars to "negate", which is a method of the Neg type class.+ This allows instances of Num that can't be negative, like Nat, and it makes correct+ IEEE Float operations easier to encode. Additionally, unary negation is now available+ to DSL authors.+* The Java and LLVM backends have been factored out for separate maintenance. Now, the+ compiler distribution only ships with the C and JavaScript backends.+* New REPL command :printdef displays the internal definition of a name+* New REPL command :pprint pretty-prints a definition or term with LaTeX or+ HTML highlighting+* Naming of data and type constructors is made consistent across the standard+ library (see #1516)+* Terms in `code blocks` inside of documentation strings are now parsed and+ type checked. If this succeeds, they are rendered in full color in+ documentation lookups, and with semantic highlighting for IDEs.+* Fenced code blocks in docs defined with the "example" attribute are rendered+ as code examples.+* Fenced code blocks declared to be Idris code that fail to parse or type check now+ provide error messages to IDE clients.+* EXPERIMENTAL support for partial evaluation (Scrapping your Inefficient+ Engine style)++New in 0.9.14:+--------------+* Tactic for case analysis in proofs+* Induction and case tactic now work on expressions+* Support for running tests for a package with the tests section of .ipkg files and the+ --testpkg command-line option+* Clearly distinguish between type providers and postulate providers at the use site+* Allow dependent function syntax to be overridden in dsl blocks, similarly to+ functions and let. The keyword for this is "pi".+* Updated 'effects' library, with simplified API+* All new JavaScript backend (avoids callstack overflows)+* Add support for %lib directive for NodeJS+* Quasiquotes and quasiquote patterns allow easier work with reflected terms.+ `(EXPR) quasiquotes EXPR, causing the elaborator to be used to produce a reflected+ version of it. Subterms prefixed with ~ are unquoted - on the RHS, they are reflected+ terms to splice in, while on the LHS they are patterns.+ A quasiquote expression can be given a goal type for the elaborator, which helps with+ disambiguation. For instance, `(() : ()) quotes the unit constructor, while `(() : Type)+ quotes the unit type.+ Both goal types and quasiquote are typechecked in the global environment.+* Better inference of unbound implicits++New in 0.9.13:+--------------+* IDE support for retrieving structured information about metavariables+* Experimental Bits support for JavaScript+* IdrisDoc: a Haddock- and JavaDoc-like HTML documentation generator+* Command line option -e (or --eval) to evaluate expressions without loading the+ REPL. This is useful for writing more portable tests.+* Many more of the basic functions and datatypes are documented.+* Primitive types such as Int and String are documented+* Removed javascript lib in favor of idris-hackers/iQuery+* Specify codegen for :compile REPL command (e.g. :compile javascript program.js)+* Remove :info REPL command, subsume and enhance its functionality in the :doc command+* New (first class) nested record update/access syntax:+ record { a->b->c = val } x -- sets field accessed by c (b (a x)) to val+ record { a->b->c } x -- accesses field, equivalent to c (b (a x))+* The banner at startup can be suppressed by adding :set nobanner to the initialisation script.+* :apropos now accepts space-delimited lists of query items, and searches for the conjunction+ of its inputs. It also accepts binder syntax as search strings - for instance, -> finds+ functions.+* Totality errors are now treated as warnings until code generation time, when they become+ errors again. This allows users to use the interactive editing features to fix totality+ issues, but no programs that violate the stated assumptions will actually run.+* Added :makelemma command, which adds a new top level definition to solve+ a metavariable.+* Extend :addclause to add instance bodies as well as definitions+* Reverse parameters to BoundedList -- now matches Vect, and is easier to instantiate classes.+* Move foldl into Foldable so it can be overridden.+* Experimental :search REPL command for finding functions by type++Internal changes++* New implementation of erasure++New in 0.9.12:+--------------++* Proof search now works for metavariables in types, giving some interactive+ type inference.+* New 'Lazy' type, replacing laziness annotations.+* JavaScript and Node codegen now understand the %include directive.+* Concept of 'null' is now understood in the JavaScript and Node codegen.+* Lots of performance patches for generated JavaScript.+* New commands :eval (:e) and :type (:t) in the prover, which either normalise+ or show the type of expressions.+* Allow type providers to return postulates in addition to terms.+* Syntax for dealing with match failure in <- and pattern matching let.+* New syntax for inline documentation. Documentation starts with |||, and+ arguments are documented by preceding their name with @. Example:+ ||| Add two natural numbers+ ||| @ n the first number (examined by the function)+ ||| @ m the second number (not examined)+ plus (n, m : Nat) -> Nat+* Allow the auto-solve behaviour in the prover to be disabled, for easier+ debugging of proof automation. Use ":set autosolve" and ":unset autosolve".+* Updated 'effects' library+* New :apropos command at REPL to search documentation, names, and types+* Unification errors are now slightly more informative+* Support mixed induction/coinduction with 'Inf' type+* Add 'covering' function option, which checks whether a function and all+ descendants cover all possible inputs++New in 0.9.11:+--------------++* Agda-style equational reasoning (in Syntax.PreorderReasoning)+* 'case' construct now abstracts over the scrutinee in its type+* Added label type 'name (equivalent to the empty type).+ This is intended for field/effect disambiguation. "name" can be any+ valid identifier. Two labels are definitionally equal if they have the+ same name.+* General improvements in error messages, especially %error_reverse+ annotation, which allows a hint as to how to display a term in error+ messages+* --ideslave mode now transmits semantic information about many of the+ strings that it emits, which can be used by clients to implement+ semantic highlighting like that of the REPL. This has been implemented+ in the Emacs mode and the IRC bot, which can serve as examples.+* New expression form: with NAME EXPR privileges the namespace NAME+ when disambiguating overloaded names. For example, it is possible to+ write "with Vect [1,2,3]" at the REPL instead of "the (Vect _ _) [1,2,3]",+ because the Vect constructors are defined in a namespace called Vect.+* assert_smaller internal function, which marks an expression as smaller than+ a pattern for use in totality checking.+ e.g. "assert_smaller (x :: xs) (f xs)" asserts that "f xs" will always be+ structurally smaller than "(x :: xs)"+* assert_total internal function, which marks a subexpression as assumed to+ be total, e.g "assert_total (tail (x :: xs))".+* Terminal width is automatically detected if Idris is compiled with curses+ support. If curses is not available, automatic mode assumes 80 columns.+* Changed argument order for Prelude.Either.either.+* Experimental 'neweffects' library, intended to replace 'effects' in the+ next release.++Internal changes++* Faster elaboration+* Smaller .ibc files+* Pretty-printer now used for all term output+++New in 0.9.10:+--------------++* Type classes now implemented as dependent records, meaning that method+ types may now depend on earlier methods.+* More flexible class instance resolution, so that function types and lambda+ expressions can be made instances of a type class.+* Add !expr notation for implicit binding of intermediate results in+ monadic/do/etc expressions.+* Extend Effects package to cope with possibly failing operations, using+ "if_valid", "if_error", etc.+* At the REPL, "it" now refers to the previous expression.+* Semantic colouring at the REPL. Turn this off with --nocolour.+* Some prettifying of error messages.+* The contents of ~/.idris/repl/init are run at REPL start-up.+* The REPL stores a command history in ~/.idris/repl/history.+* The [a..b], [a,b..c], [a..], and [a,b..] syntax now pass the totality+ checker and can thus be used in types. The [x..] syntax now returns an+ actually infinite stream.+* Add '%reflection' option for functions, for compile-time operations on+ syntax.+* Add expression form 'quoteGoal x by p in e' which applies p to the expected+ expression type and binds the result to x in the scope e.+* Performance improvements in Strings library.+* Library reorganisation, separated into prelude/ and base/.++Internal changes++* New module/dependency tree checking.+* New parser implementation with more precise errors.+* Improved type class resolution.+* Compiling Nat via GMP integers.+* Performance improvements in elaboration.+* Improvements in termination checking.+* Various REPL commands to support interactive editing, and a client/server+ mode to allow external invocation of REPL commands.++New in 0.9.9:+-------------++* Apply functions by return type, rather than with arguments:+ "t <== f" means "apply f with arguments such that it returns a value+ of type t"+* Allow the result type of a rewrite to be specified+* Allow names to be attached to provisional definitions+ lhs ?= {name} rhs -- generates a lemma called 'name' which makes the+ types of the lhs and rhs match. {name} is optional - a unique name is+ generated if it is absent.+* Experimental LLVM backend+* Added Data.HVect module+* Fix fromInteger to take an Integer, rather than an Int+* Integer literals for Fin+* Renamed O to Z, and fO to fZ+* Swapped Vect arguments, now Vect : Nat -> Type -> Type+* Added DecEq instances+* Add 'equiv' tactic, which rewrites a goal to an equivalent (convertible) goal++Internal changes++* Add annotation for unification traces+* Add 'mrefine' tactic for refining by matching against a type+* Type class resolution fixes+* Much faster coverage checking++New in 0.9.8:+-------------++User visible changes:++* Added "rewrite ... in ..." construct+* Allow type class constraints in 'using' clauses+* Renamed EFF to EFFECT in Effect package+* Experimental Java backend+* Tab completion in REPL+* Dynamic loading of C libraries in the interpreter+* Testing IO actions at the REPL with :x command+* Improve rendering of :t+* Fixed some INTERNAL ERROR messages++Internal changes:++* Fix non-linear pattern checking+* Improved name disambiguation+* More flexible unification and elaboration of lambdas+* Various unification and totality checking bug fixes++New in 0.9.7:+-------------++User visible changes:++* 'implicit' keyword, for implicit type conversion+* Added Effects package+* Primitives for 8,16,32 and 64 bit integers++Internal changes:++* Change unification so that it keeps track of failed constraints in case+ later information helps to resolve them+* Distinguishing parameters and indices in data types+* Faster termination/coverage checking+* Split 'javascript' target into 'javascript' and 'node'++New in 0.9.6:+-------------++User visible changes:++* The type of types is now 'Type' rather than 'Set'+* Forward declarations of data allowed+ - supporting induction recursion and mutually recursive data+* Type inference of definitions in 'where' clauses+ - Provided that the type can be completely determined from the first+ application of the function (in the top level definition)+* 'mutual' blocks added+ - effect is to elaborate all types of declarations in the block before+ elaborating their definitions+ - allows inductive-recursive definitions+* Expression inspected by 'with' clause now abstracted from the goal+ - i.e. "magic" with+* Implicit arguments will be added automatically only if their initial+ letter is lower case, or they are in a using declaration+* Added documentation comments (Haddock style) and ':doc' REPL command+* Pattern matching on strings, big integers and characters+* Added System.Concurrency modules+* Added 'postulate' declarations+* Allow type annotations on 'let' tactic+* EXPERIMENTAL JavaScript generation, with '--target javascript' option++Internal changes:++* Separate inlining methods at compile-time and run-time+* Fixed nested parameters blocks+* Improve efficiency of elaborator by:+ - only normalising when necessary+ - reducing backtracking with resolving ambiguities+* Better compilation of case trees++New in 0.9.5:+-------------++User visible changes:++* Added codata+ - as data declarations, but constructor arguments are evaluated lazily+ - functions which return a codata type do not reduce at compile time+* Added 'parameters' blocks+* Allow local data definitions in where blocks+* Added '%default' directive to declare total-by-default or partial-by-default+ for functions, and a corresponding "partial" reserved words to mark functions+ as allowed to be partial. Also "--total" and "--partial" added as command+ line options.+* Command line option "--warnpartial" for flagging all undeclared+ partial functions, without error.+* New termination checker supporting mutually recursive definitions.+* Added ':load' command to REPL, for loading a new file+* Added ':module' command to REPL, for adding modules+* Renamed library modules (now have initial capital)++Internal changes:++* Several improvements and fixes to unification+* Added collapsing optimisation and more aggressive erasure++New in 0.9.4:+-------------++User visible changes:++* Simple packaging system+* Added --dumpc flag for displaying generated code++Internal changes:++* Improve overloading resolution (especially where this is a type error)+* Various important bug fixes with evaluation and compilation+* More aggressive compile-time evaluation++New in 0.9.3:+-------------++User visible changes:++* Added binding forms to syntax rules+* Named class instances+* Added ':set' command, with options 'errorcontext' for displaying local+ variables in scope when a unification error occurs, and 'showimplicits'+ for displaying elaborated terms in full+* Added '--errorcontext' command line switch+* Added ':proofs' and ':rmproofs' commands+* Various minor REPL improvements and fixes++Internal changes:++* Completely new run time system (not based on Epic or relying on Boehm GC)+* Normalise before forcing to catch more forceable arguments+* Types no longer exported in normal form+* Try to resolve overloading by inspecting types, rather than full type+ checking++New in 0.9.2:+-------------++User visible changes:++* backtick notation added: x `foo` y ==> foo x y+* case expressions allowed in type signatures+* Library extensions in prelude.vect and prelude.algebra+* malloc/trace_malloc added to builtins.idr++Internal changes:++* Some type class resolution fixes+* Several minor bug fixes+* Performance improvements in resolving overloading and type classes++New in 0.9.1:+-------------++User visible changes:++* DSL notation, for overloading lambda and let bindings+* Dependent records, with projection and update+* Totality checking and 'total' keyword+* Auto implicits and default argument values {auto n : T}, {default val n : T}+* Overlapping type class instances disallowed+* Many extensions to prelude.nat and prelude.list libraries (mostly thanks to+ Dominic Mulligan)+* New libraries: control.monad.identity, control.monad.state+* Small improvements in error reporting++Internal changes:++* Faster compilation (only compiling names which are used)+* Better type class resolution+* Lots of minor bug fixes++0.1.x to 0.9.0:++Complete rewrite. User visible changes:++* New proof/tactics syntax+* New syntax for pairs/dependent pairs+* Indentation-significant syntax+* Added type classes+* Added where clauses+* Added case expressions, pattern matching let and lambda+* Added monad comprehensions+* Added cumulativity and universe checking+* Ad-hoc name overloading+ - Resolved by type or explicit namespace+* Modules (Haskell-style)+* public, abstract and private access to functions and types+* Separate type-checking+* Improved interactive environment+* Replaced 'do using' with Monad class+* Extended syntax macros++Internal changes:++* Everything :-)+* All definitions (functions, classes and instances) are elaborated to top+ level, fully explicit, data declarations and pattern matching definitions,+ which are verified by a minimal type checker.++This is the first release of a complete reimplementation. There will be bugs.+If you find any, please do not hesitate to contact Edwin Brady+(ecb10@st-andrews.ac.uk).
+ CITATION.md view
@@ -0,0 +1,29 @@+# Citing `Idris`++If you use `Idris` in your work we would prefer it if you would use the following reference in your work.++## BibTeX++```bibtex+@article{JFP:9060502,+ author = {BRADY,EDWIN},+ title = {Idris, a general-purpose dependently typed programming language: Design and implementation},+ journal = {Journal of Functional Programming},+ volume = {23},+ issue = {05},+ month = {9},+ year = {2013},+ issn = {1469-7653},+ pages = {552--593},+ numpages = {42},+ doi = {10.1017/S095679681300018X},+ URL = {http://journals.cambridge.org/article_S095679681300018X},+}+```++## Textual++ EDWIN BRADY (2013). Idris, a general-purpose dependently typed+ programming language: Design and implementation. Journal of+ Functional Programming, 23, pp+ 552-593. doi:10.1017/S095679681300018X.
+ CONTRIBUTING.md view
@@ -0,0 +1,169 @@+# Contributing to Idris-Dev++The Idris Community welcomes pull requests, bug reporting, and bug squashing!+However, we cannot do it all ourselves, and want to make it as easy as possible to contribute changes to get things working.+Here are a few guidelines that we would like contributors to follow so that we can have a chance of keeping on top of things.++## Getting Started++1. Make sure you are familiar with [Git](http://git-scm.com/book).+1. Make sure you have a [GitHub account](https://github.com/signup/free).+1. Make sure you are familiar with: [Idris](http://eb.host.cs.st-andrews.ac.uk/writings/idris-tutorial.pdf).+1. Make sure you can install Idris:+ * [Mac OS X](https://github.com/idris-lang/Idris-dev/wiki/Idris-on-OS-X-using-Homebrew)+ * [Ubuntu](https://github.com/idris-lang/Idris-dev/wiki/Idris-on-Ubuntu)+ * [Debian](https://github.com/idris-lang/Idris-dev/wiki/Idris-on-Debian)+ * [Windows](https://github.com/idris-lang/Idris-dev/wiki/Idris-on-Windows)++## Issue Reporting++Before 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).+We do not want you wasting your time, duplicating somebody's work!++## The Campsite Rule++We try to follow the **campsite rule**: leave the code base in better condition than you found it.+Please clean up any messes that you find, and don't leave behind new messes for the next contributor.++## Contributing to the default libraries.++Idris ships with a set of packages in `libs/` that is provided as a default library.+++ `prelude` is a collection of basic definitions, automatically imported by Idris programs.++ `base` is tried and tested code that may be useful, and has seen active use in multiple projects.++ `contrib` is code that is experimental in design and that we want to test before possible inclusion in `base`.++ `effects` is a library which supports effectful programming.++These packages should not be seen as the *standard* as when working with dependent types; we do not necessarily know how best to work with dependent types yet.+These packages offer functionality that can be built on top of when constructing Idris programs.++Everything in prelude will be imported automatically, unless given the `--noprelude` option.+The contents of base are available with no special options, but modules must be imported.+The other two packages that ship with Idris, contrib and effects, require the use of the `-p` command-line argument to bring their contents into the include path.++New contributions should be added to the contrib package (never directly to base or prelude!).+If they turn out to be widely applicable and useful, they may later be moved into base.++As Idris is still being developed we are open to suggestions and changes that make improvements to these default packages.+Major changes to the library, or Idris itself, should be discussed first through the project's official channels of communication:++1. The mailing List.+1. On our IRC Channel `#idris` on freenode, or+1. As a [Dragon Egg](https://github.com/idris-lang/Idris-dev/wiki/Feature-proposals).++Developers then seeking to add content to Idris's prelude and default library, should do so through a PR where more discussions and refinements can be made.++We do not want you wasting your time nor duplicating somebody's work!++## Making Changes++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/).+The steps are described below.++### New contributors++For those new to the project:++1. Fork our [main development repository](https://github.com/idris-lang/Idris-dev) `idris-dev` on github e.g.+2. Clone your fork to your local machine:++```+$ git clone git@github.com/<your github user name>/Idris-dev.git+```++3. Add `idris-lang/Idris-dev` as a remote upstream++```+$ git remote add upstream git@github.com:idris-lang/Idris-dev.git+```++### Existing Contributors++For those already contributing to the project:++1. Ensure your existing clone is up-to-date with current `HEAD` e.g.++```+$ git fetch upstream+$ git merge upstream/master+```++### Remaining Steps++The remaining steps are the same for both new and existing contributors:++1. Create, and checkout onto, a topic branch on which to base you work.+ * This is typically the master branch.+ * Please avoid working on the `master` branch.++```+$ git branch fix/master/my_contrib master+$ git checkout fix/master/my_contrib+```++1. Make commits of logical units.+1. Check for unnecessary whitespace with++```+$ git diff --check+```++1. Make sure your commit messages are along the lines of:++ Short (50 chars or less) summary of changes++ More detailed explanatory text, if necessary. Wrap it to about 72+ characters or so. In some contexts, the first line is treated as the+ subject of an email and the rest of the text as the body. The blank+ line separating the summary from the body is critical (unless you omit+ the body entirely); tools like rebase can get confused if you run the+ two together.++ Further paragraphs come after blank lines.++ - Bullet points are okay, too++ - Typically a hyphen or asterisk is used for the bullet, preceded by a+ single space, with blank lines in between, but conventions vary here++1. Make sure you have added any necessary tests for your changes.+1. Run all the tests to ensure nothing else was accidentally broken.++```+$ make test+```++1. Push your changes to a topic branch in your fork of the repository.++```+$ git push origin fix/master/my_contrib+```++1. Go to GitHub and submit a pull request to `idris-dev`++From there you will have to wait on one of the `idris-dev` committers to respond to the request.+This response might be an accept or some changes/improvements/alternatives will be suggest.+We do not guarantee that all requests will be accepted.++## Increasing chances of acceptance.++To help increase the chance of your pull request being accepted:++1. Run the tests.+1. Update the documentation, the surrounding code, examples elsewhere, guides, whatever is affected by your contribution+1. Use appropriate code formatting for both Idris and Haskell.++## Additional Resources++* [Idris Wiki](https://github.com/idris-lang/Idris-dev/wiki);+* [Zen Of Idris](https://github.com/idris-lang/Idris-dev/wiki/The-Zen-of-Idris);+* Idris FAQs: [Official](http://www.idris-lang.org/documentation/faq/); [Unofficial](https://github.com/idris-lang/Idris-dev/wiki/Unofficial-FAQ);+* [Idris Manual](https://github.com/idris-lang/Idris-dev/wiki/Manual);+* [Idris Tutorial](http://eb.host.cs.st-andrews.ac.uk/writings/idris-tutorial.pdf);+* [Idris News](http://www.idris-lang.org/news/);+* [other Idris docs](http://www.idris-lang.org/documentation/).+* [Using Pull Requests](https://help.github.com/articles/using-pull-requests)+* [General GitHub Documentation](https://help.github.com/).+++Adapted from the most excellent contributing files from the [Puppet project](https://github.com/puppetlabs/puppet) and [Factroy Girl Rails](https://github.com/thoughtbot/factory_girl_rails/blob/master/CONTRIBUTING.md)
+ CONTRIBUTORS view
@@ -0,0 +1,47 @@+Thanks to the following for their help and contributions:++Ozgur Akgun+Ahmad Salim Al-Sibahi+Edward Chadwick Amsden+Jan Bessai+Michael R. Bernstein+Nicola Botta+Edwin Brady+Jakob Brünker+Alyssa Carter+David Raymond Christiansen+Carter Charbonneau+Jason Dagit+Guglielmo Fachini+Simon Fowler+Google+Cezar Ionescu+Heath Johns+Irene Knapp+Paul Koerbitz+Niklas Larsson+Shea Levy+Mathnerd314+Hannes Mehnert+Mekeor Melire+Melissa Mozifian+Dominic Mulligan+Jan de Muijnck-Hughes+Tom Prince+raichoo+Philip Rasmussen+Reynir Reynisson+Adam Sandberg Eriksson+Seo Sanghyeon+Benjamin Saunders+Alexander Shabalin+Timo Petteri Sinnemäki+JP Smith+startling+Chetan T+Matúš Tejiščák+Dirk Ullrich+Leif Warner+Daniel Waterworth+Jonas Westerlund+Sean Hunt
+ README.md view
@@ -0,0 +1,78 @@+# Idris++[](https://travis-ci.org/idris-lang/Idris-dev)+[](https://readthedocs.org/projects/idris/?badge=latest)+[](https://hackage.haskell.org/package/idris)++Idris (http://idris-lang.org/) is a general-purpose functional programming+language with dependent types.++## Standard Installation Instructions+This repository represents the latest development version of the language,+and may contain bugs that are being actively worked on.+For those who wish to use a more stable version of Idris please consider+installing the latest version that has been released on Hackage.+Installation instructions for various platforms can be [found on the Idris Wiki](https://github.com/idris-lang/Idris-dev/wiki/Installation-Instructions).++## Installing Development Versions++If you like to work against the latest development version, please consider+using Cabal Sandboxes to minimise disruption to your local Haskell setup.+Instructions for installing Idris HEAD within a cabal sandbox are+[available on the Idris Wiki](https://github.com/idris-lang/Idris-dev/wiki/Installing-an-Idris-Development-version-in-a-sandbox).++To configure, edit config.mk. The default values should work for most people.++Idris is built using a Makefile common targets include:++* `make` This will install everything using cabal and+typecheck the libraries.+* `make test` This target execute the test suite.+* `make relib` This target will typecheck and recompile the standard library.++Idris has an optional buildtime dependency on the C library `libffi`. If you+would like to use the features that it enables, make sure that it is compiled+for the same architecture as your Haskell compiler (e.g. 64 bit libraries+for 64 bit ghc). By default, Idris builds without it. To build with it, pass+the flag `-f FFI`.++To build with `libffi` by default, create a `custom.mk` file and add the+following line to it:++`CABALFLAGS += -f FFI`++The file custom.mk-alldeps is a suitable example.++The continuous integration builds on travis-ci.org are built using the+ghc-flag -Werror. To enable this behaviour locally also, please compile+using `make CI=true` or adding the following line into `custom.mk`:++`CI = true`++If you are only compiling for installing the most current version, you can+omit the CI flag, but please make sure you use it if you want to contribute.++## Code Generation++Idris has support for external code generators. Supplied with the distribution+is a C code generator to compile executables, and a JavaScript code generator+with support for node.js and browser JavaScript.++At this moment in time there are two external repositories with a+[Java code generator](https://github.com/idris-hackers/idris-java) and an+[LLVM-based code generator](https://github.com/idris-hackers/idris-llvm).++## More Information++If you would like to find out more information, or ask questions, we+currently have a [Wiki](https://github.com/idris-lang/Idris-dev/wiki);+a [mailing list](https://groups.google.com/forum/#!forum/idris-lang),+and an `IRC` channel `#idris` on freenode. To join the IRC channel,+point your irc client to `chat.freenode.net` then `/join #idris`.++For those further interested in using Idris for projects, the+[Idris Hackers](https://github.com/idris-hackers) GitHub organisation is+where some interesting projects are being hosted.++For those interested in contributing to Idris directly we kindly ask that+prospective developers please consult the [Contributing Guide](CONTRIBUTING.md) first.
+ benchmarks/ALL view
@@ -0,0 +1,4 @@+trivial/sortvec 2000+quasigroups/qgsolve board+fasta/fasta 1+pidigits/pidigits 3000
+ benchmarks/README view
@@ -0,0 +1,21 @@+Benchmarks+----------++To run:++$ ./build.pl -- builds all benchmark binaries+$ ./run.pl -- runs all benchmarks++Adding a test +-------------++Add a line to the 'ALL' file of the following form:++dir/main arg++where 'dir' is the directory the benchmark lives in, 'main' is the name of the+ipkg file and executable (these must be the same), 'arg' is the input to give+to the binary. ++It is assumed that all benchmarks take exactly one argument, which helps to+ensure that they are not simply doing all the work at compile time.
+ benchmarks/build.pl view
@@ -0,0 +1,14 @@+#!/usr/bin/env perl++$bmarks = `cat ALL`;+@bm = split(/\n/, $bmarks);++foreach $b (@bm) {+ if ($b =~ /([a-zA-Z0-9]+)\/([a-zA-Z0-9]+)\s+(.*)/) {+ print "Building $1 / $2\n";+ chdir $1;+ system("idris --clean $2.ipkg");+ system("idris --build $2.ipkg");+ chdir "..";+ }+}
+ benchmarks/fasta/fasta.idr view
@@ -0,0 +1,84 @@+module Main++import System+import Data.Floats++alu : String+alu = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG\+ \TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG\+ \CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC\+ \GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"++iub : List (Char, Float)+iub = [('a',0.27),('c',0.12),('g',0.12),('t',0.27),('B',0.02)+ ,('D',0.02),('H',0.02),('K',0.02),('M',0.02),('N',0.02)+ ,('R',0.02),('S',0.02),('V',0.02),('W',0.02),('Y',0.02)]++homosapiens : List (Char, Float)+homosapiens = [('a',0.3029549426680),('c',0.1979883004921)+ ,('g',0.1975473066391),('t',0.3015094502008)]+++takeRepeat : Int -> String -> String+takeRepeat n s = if n > m+ then s ++ takeRepeat (n-m) s+ else pack $ take (cast n) $ unpack s+ where+ m = cast $ length s++splitAt' : Nat -> String -> (String, String)+splitAt' n s = let s' = unpack s in (pack $ take n s', pack $ drop n s')++writeAlu : String -> String -> IO ()+writeAlu name s0 = putStrLn name $> go s0+ where+ go "" = return ()+ go s = let (h,t) = splitAt' 60 s in putStrLn h $> go t++replicate : Int -> Char -> String+replicate 0 c = ""+replicate n c = singleton c <+> replicate (n-1) c++scanl : (f : acc -> a -> acc) -> acc -> List a -> List acc+scanl f q ls = q :: (case ls of+ [] => []+ x::xs => scanl f (f q x) xs)++accum : (Char,Float) -> (Char,Float) -> (Char,Float)+accum (_,p) (c,q) = (c,p+q)++make : String -> Int -> List (Char, Float) -> Int -> IO Int+make name n0 tbl seed0 = do+ putStrLn name+ make' n0 0 seed0 ""+ where+ modulus : Int+ modulus = 139968++ fill : List (Char,Float) -> Int -> List String+ fill ((c,p) :: cps) j =+ let k = min modulus (cast (cast modulus * p + 1))+ in replicate (k - j) c :: fill cps k+ fill _ _ = []++ lookupTable : String+ lookupTable = Foldable.concat (fill (scanl accum ('a',0) tbl) 0)++ make' : Int -> Int -> Int -> String -> IO Int+ make' 0 col seed buf = when (col > 0) (putStrLn buf) $> return seed+ make' n col seed buf = do+ let newseed = modInt (seed * 3877 + 29573) modulus+ let nextchar = strIndex lookupTable newseed+ let newbuf = buf <+> singleton nextchar+ if col+1 >= 60+ then putStrLn newbuf $> make' (n-1) 0 newseed ""+ else make' (n-1) (col+1) newseed newbuf+++main : IO ()+main = do+ (_ :: n :: _) <- getArgs+ writeAlu ">ONE Homo sapiens alu" (takeRepeat (fromInteger (cast n)*2) alu)+ nseed <- make ">TWO IUB ambiguity codes" (fromInteger (cast n)*3) iub 42+ make ">THREE Homo sapiens frequency" (fromInteger (cast n)*5) homosapiens nseed+ return ()
+ benchmarks/fasta/fasta.ipkg view
@@ -0,0 +1,6 @@+package fasta++modules = fasta++executable = fasta+main = fasta
+ benchmarks/pidigits/pidigits.idr view
@@ -0,0 +1,52 @@+import System++{- Toy program that outputs the n first digits of Pi.++ Inspired from http://www.haskell.org/haskellwiki/Shootout/Pidigits. + The original ns and str lazy lists have been replaced by strict functions.++ Memory usage seems to be excessive. One of the branches of str is tail recursive, and + the other one only needs to cons an extra Integer.++ For reference, the Haskell version runs in 0m0.230s when printing to /dev/null. + It almost runs in constant space.+-}++data F = mkF Integer Integer Integer++-- Prints the list of digits by groups of 10+loop : Nat -> Nat -> List Integer -> IO()+loop n k' Nil = putStrLn $ (pack $ Vect.replicate n ' ') ++ "\t:" ++ show k'+loop Z k' xs = do putStrLn ("\t:"++show k')+ loop 10 k' xs+loop (S k) k' (x::xs) = do putStr (show x)+ loop k (S k') xs++fn : Integer -> F+fn k = mkF k (4*k+2) (2*k+1)++flr : Integer -> F -> Integer+flr x (mkF q r t) = (q*x + r) `div` t++comp : F -> F -> F+comp (mkF q r t) (mkF u v x) = mkF (q*u) (q*v+r*x) (t*x)++-- Returns the list of digits of pi. Memory hungry.+str : F -> Integer -> Nat -> List Integer+str _ _ Z = Nil+str z k (S n) = if(y == flr 4 z)+ then y :: str (comp (mkF 10 (-10*y) 1) z ) k n+ else str (comp z (fn k)) (k+1) (S n)+ where y = flr 3 z++pidigit : IO()+pidigit = do+ [_,a] <- getArgs+ let n = fromIntegerNat (the Integer (cast a))+ let l = str (mkF 1 0 1) 1 n+ loop 10 0 l+ return ()++main : IO ()+main = pidigit+
+ benchmarks/pidigits/pidigits.ipkg view
@@ -0,0 +1,6 @@+package pidigits++modules = pidigits++executable = pidigits+main = pidigits
+ benchmarks/quasigroups/Main.idr view
@@ -0,0 +1,24 @@+module Main++import System+import Parser+import Solver++main : IO ()+main = do+ args <- getArgs+ case args of+ [_, path] => do+ f <- readFile path+ case parse f of+ Left err => putStrLn err+ Right (_ ** (board ** legal)) => do+ putStrLn "Got board:"+ printLn board+ putStrLn "Solving..."+ case fillBoard board legal of+ Nothing => putStrLn "No solution found"+ Just (solved ** _) => do+ putStrLn "Solution found:"+ printLn solved+ [self] => putStrLn ("Usage: " ++ self ++ " <board file>")
+ benchmarks/quasigroups/Parser.idr view
@@ -0,0 +1,79 @@+module Parser++import Decidable.Equality++import Solver++ParseErr : Type+ParseErr = String++Parser : Nat -> Type+Parser n = Either ParseErr (b : Board n ** LegalBoard b)++mapM : Monad m => (a -> m b) -> Vect n a -> m (Vect n b)+mapM _ Nil = return Vect.Nil+mapM f (x::xs) = do+ x' <- f x+ xs' <- mapM f xs+ return (Vect.(::) x' xs')++parseToken : String -> Either String (Cell n)+parseToken "." = return Nothing+parseToken "0" = Left "Got cell 0, expected 1-based numbering"+parseToken x = map Just (tryParseFin ((cast x) - 1))+ where+ tryParseFin : Int -> Either String (Fin n)+ tryParseFin {n=Z} _ = Left ("Given cell " ++ x ++ " out of range")+ tryParseFin {n=S k} 0 = return FZ+ tryParseFin {n=S k} x =+ case tryParseFin {n=k} (x-1) of+ Left err => Left err+ Right fin => return (FS fin)++length : Vect n a -> Nat+length {n=n} _ = n++parseCols : {b : Board n} -> Fin n -> LegalBoard b -> Vect n String -> Parser n+parseCols {n=Z} _ l _ = Right (_ ** l)+parseCols {n=S k} row l cs = helper last l+ where+ step : {b : Board (S k)} -> LegalBoard b -> Fin (S k) -> Parser (S k)+ step {b=b} l x = do+ let here = (x, row) -- TODO: Determine why naming this makes idris smarter+ tok <- parseToken {n=S k} (index x cs)+ case tok of+ Nothing => return (_ ** l)+ Just t =>+ case legalVal b here t of+ Yes prf => Right (_ ** Step prf l)+ No _ => Left ("Illegal cell " ++ index x cs)++ helper : {b : Board (S k)} -> Fin (S k) -> LegalBoard b -> Parser (S k)+ helper FZ l = step l FZ+ helper (FS k) l = do+ (_ ** next) <- step l (FS k)+ helper (weaken k) next++parseRows : (b : Board n) -> LegalBoard b -> Vect n String -> Parser n+parseRows {n=Z} _ l _ = Right (_ ** l)+parseRows {n=S k} _ l rs = helper last l+ where+ step : {b : Board (S k)} -> Fin (S k) -> LegalBoard b -> Parser (S k)+ step i l =+ let cs = fromList (words (index i rs)) in+ case decEq (length cs) (S k) of+ No _ => Left "Row length not equal to column height"+ Yes prf => let foo = (replace {P=\n => Vect n String} prf cs) in parseCols i l foo -- TODO: foo shouldn't be needed++ helper : {b : Board (S k)} -> Fin (S k) -> LegalBoard b -> Parser (S k)+ helper FZ l = step FZ l+ helper (FS k) l = do+ (_ ** next) <- step (FS k) l+ helper (weaken k) next++parse : String -> Either String (n : Nat ** (b : Board n ** LegalBoard b))+parse str =+ let rows = fromList (lines str) in+ case parseRows {n=length rows} emptyBoard Base rows of+ Left msg => Left msg+ Right board => return (_ ** board)
+ benchmarks/quasigroups/Solver.idr view
@@ -0,0 +1,204 @@+module Solver++import Decidable.Equality+import Control.Monad.State+import Data.Vect.Quantifiers++%default total++Cell : Nat -> Type+Cell n = Maybe (Fin n)++data Board : Nat -> Type where+ MkBoard : {n : Nat} -> Vect n (Vect n (Cell n)) -> Board n++emptyBoard : Board n+emptyBoard {n=n} = MkBoard (replicate n (replicate n Nothing))++showElt : Cell n -> String+showElt Nothing = "."+showElt (Just x) = show (1 + (the Int (fromInteger (cast x))))++-- FIXME: Inline type decl should not be necessary here+showRow : Vect n (Cell n) -> String+showRow {n=n} xs = unwords (toList (the (Vect n String) (map showElt xs)))++unlines : Vect n String -> String+unlines Nil = ""+unlines (l::Nil) = l+unlines (l::ls) = pack (foldl addLine (unpack l) (map unpack ls))+ where+ addLine : List Char -> List Char -> List Char+ addLine w s = w ++ ('\n' :: s)++instance Show (Board n) where+ show (MkBoard rs) = unlines (map showRow rs)++updateAt : Fin n -> Vect n a -> (a -> a) -> Vect n a+updateAt FZ (x::xs) f = f x :: xs+updateAt (FS i) (x::xs) f = x :: updateAt i xs f++setCell : Board n -> (Fin n, Fin n) -> Fin n -> Board n+setCell (MkBoard b) (x, y) value = MkBoard (updateAt y b (\row => updateAt x row (const (Just value))))++getCell : Board n -> (Fin n, Fin n) -> Cell n+getCell (MkBoard b) (x, y) = index x (index y b)++anyElim : {xs : Vect n a} -> {P : a -> Type} -> (Any P xs -> b) -> (P x -> b) -> Any P (x :: xs) -> b+anyElim _ f (Here p) = f p+anyElim f _ (There p) = f p++getRow : Fin n -> Board n -> Vect n (Cell n)+getRow i (MkBoard b) = index i b++getCol : Fin n -> Board n -> Vect n (Cell n)+getCol i (MkBoard b) = helper i b+ where+ helper : Fin n -> Vect m (Vect n a) -> Vect m a+ helper _ Nil = Nil+ helper i (xs::xss) = index i xs :: helper i xss++LegalNeighbors : Cell n -> Cell n -> Type+LegalNeighbors (Just x) (Just y) = Not (x = y)+LegalNeighbors _ _ = ()++legalNeighbors : (x : Cell n) -> (y : Cell n) -> Dec (LegalNeighbors x y)+legalNeighbors (Just x) (Just y) with (decEq x y)+ | Yes prf = No (\pf => pf prf)+ | No prf = Yes prf+legalNeighbors Nothing (Just _) = Yes ()+legalNeighbors (Just _) Nothing = Yes ()+legalNeighbors Nothing Nothing = Yes ()++rowSafe : (b : Board n) -> (r : Fin n) -> (val : Fin n) -> Dec (All (LegalNeighbors (Just val)) (getRow r b))+rowSafe b r v = all (legalNeighbors (Just v)) (getRow r b)++colSafe : (b : Board n) -> (r : Fin n) -> (val : Fin n) -> Dec (All (LegalNeighbors (Just val)) (getCol r b))+colSafe b r v = all (legalNeighbors (Just v)) (getCol r b)++Empty : Cell n -> Type+Empty {n=n} x = (the (Cell n) Nothing) = x++empty : (cell : Cell n) -> Dec (Empty cell)+empty Nothing = Yes Refl+empty (Just _) = No nothingNotJust++-- Predicate for legal cell assignments+LegalVal : Board n -> (Fin n, Fin n) -> Fin n -> Type+LegalVal b (x, y) val = (Empty (getCell b (x, y)), All (LegalNeighbors (Just val)) (getCol x b), All (LegalNeighbors (Just val)) (getRow y b))++legalVal : (b : Board n) -> (coord : (Fin n, Fin n)) -> (val : Fin n) -> Dec (LegalVal b coord val)+legalVal b (x, y) v =+ case rowSafe b y v of+ No prf => No (\(_, _, rf) => prf rf)+ Yes prf =>+ case colSafe b x v of+ No prf' => No (\(_, cf, _) => prf' cf)+ Yes prf' =>+ case empty (getCell b (x, y)) of+ No prf'' => No (\(ef, _, _) => prf'' ef)+ Yes prf'' => Yes (prf'', prf', prf)+++Filled : Cell n -> Type+--Filled {n=n} x = Not (Empty x) -- TODO: Find out why this doesn't work+Filled {n=n} = (\x => Not (Empty x))+--Filled {n=n} x = the (Maybe (Fin n)) Nothing = x -> Void+--Filled {n=n} = \x => the (Maybe (Fin n)) Nothing = x -> Void++filled : (cell : Cell n) -> Dec (Filled cell)+filled Nothing = No (\f => f Refl)+filled (Just _) = Yes nothingNotJust++FullBoard : Board n -> Type+FullBoard (MkBoard b) = All (All Filled) b++fullBoard : (b : Board n) -> Dec (FullBoard b)+fullBoard (MkBoard b) = all (all filled) b++fins : Vect n (Fin n)+fins {n=Z} = Nil+fins {n=(S m)} = last :: map weaken fins++data LegalBoard : Board n -> Type where+ Base : LegalBoard (emptyBoard {n})+ Step : {b : Board n} -> {coords : (Fin n, Fin n)} -> {v : Fin n} -> LegalVal b coords v -> LegalBoard b -> LegalBoard (setCell b coords v)++CompleteBoard : Board n -> Type+CompleteBoard b = (LegalBoard b, FullBoard b)++indexStep : {i : Fin n} -> {xs : Vect n a} -> {x : a} -> index i xs = index (FS i) (x::xs)+indexStep = Refl++find : {P : a -> Type} -> ((x : a) -> Dec (P x)) -> (xs : Vect n a)+ -> Either (All (\x => Not (P x)) xs) (y : a ** (P y, (i : Fin n ** y = index i xs)))+find _ Nil = Left Nil+find d (x::xs) with (d x)+ | Yes prf = Right (x ** (prf, (FZ ** Refl)))+ | No prf =+ case find d xs of+ Right (y ** (prf', (i ** prf''))) =>+ Right (y ** (prf', (FS i ** replace {P=(\x => y = x)} (indexStep {x=x}) prf'')))+ Left prf' => Left (prf::prf')++findEmptyInRow : (xs : Vect n (Cell n)) -> Either (All Filled xs) (i : Fin n ** Empty (index i xs))+findEmptyInRow xs =+ case find {P=Empty} empty xs of+ Right (_ ** (pempty, (i ** pidx))) => Right (i ** trans pempty pidx)+ Left p => Left p++emptyCell : (b : Board n) -> Either (FullBoard b) (c : (Fin n, Fin n) ** Empty (getCell b c))+emptyCell (MkBoard rs) =+ case helper rs of+ Left p => Left p+ Right (ri ** (ci ** pf)) => Right ((ci, ri) ** pf)+ where+ helper : (rs : Vect m (Vect n (Cell n)))+ -> Either (All (All Filled) rs) (r : Fin m ** (c : Fin n ** Empty (index c (index r rs))))+ helper Nil = Left Nil+ helper (r::rs) =+ case findEmptyInRow r of+ Right (ci ** pf) => Right (FZ ** (ci ** pf))+ Left prf =>+ case helper rs of+ Left prf' => Left (prf::prf')+ Right (ri ** (ci ** pf)) => Right (FS ri ** (ci ** pf))+++tryValue : {b : Board (S n)} -> LegalBoard b -> (c : (Fin (S n), Fin (S n))) -> Empty (getCell b c) -> (v : Fin (S n))+ -> Either (Not (LegalVal b c v)) (b' : Board (S n) ** LegalBoard b')+tryValue {b=b} l c _ v =+ case legalVal b c v of+ No prf => Left prf+ Yes prf => Right (_ ** Step prf l)++nullBoardFull : (b : Board Z) -> FullBoard b+nullBoardFull (MkBoard Nil) = Nil++-- TODO: Prove complete by induction on illegal values wrt. some base state, e.g. every value is illegal for 123\21_\3_2+fillBoard : (b : Board n) -> LegalBoard b -> Maybe (b' : Board n ** CompleteBoard b')+fillBoard {n=Z} b l = Just (b ** (l, nullBoardFull b))+fillBoard {n=(S n)} b l with (emptyCell b)+ | Left full = Just (b ** (l, full))+ | Right (coords ** p) = recurse last+ where+ %assert_total+ tryAll : (v : Fin (S n)) -> (Fin (S n), Maybe (b' : Board (S n) ** LegalBoard b'))+ tryAll v = --trace ("Trying " ++ show (the Int (cast v))) $+ case tryValue l coords p v of+ Right success => (v, Just success)+ Left _ => -- TODO: Prove unsolvable+ case v of+ FS k => tryAll (weaken k)+ FZ => (v, Nothing)++ %assert_total+ recurse : Fin (S n) -> Maybe (b' : Board (S n) ** CompleteBoard b')+ recurse start = + case tryAll start of+ (_, Nothing) => Nothing+ (FZ, Just (b' ** l')) => fillBoard b' l'+ (FS next, Just (b' ** l')) =>+ case fillBoard b' l' of+ Just solution => Just solution+ Nothing => recurse (weaken next)
+ benchmarks/quasigroups/board view
@@ -0,0 +1,12 @@+. . . . . . . . . . . 1+. . . . . . . . . . 1 .+. . . . . . . . . 1 . .+. . . . . . . . 1 . . .+. . . . . . . 1 . . . .+. . . . . . 1 . . . . .+. . . . . 1 . . . . . .+. . . . 1 . . . . . . .+. . . . . . . . . . . .+. . 9 . . . . . . . . .+. 1 . . . . . . . . . .+1 . . . . . . . . . . .
+ benchmarks/quasigroups/qgsolve.ipkg view
@@ -0,0 +1,7 @@+package qgsolve++modules = Solver, Parser, Main++executable = qgsolve+main = Main+
+ benchmarks/run.pl view
@@ -0,0 +1,24 @@+#!/usr/bin/env perl++$bmarks = `cat ALL`;+@bm = split(/\n/, $bmarks);++$total = 0;++foreach $b (@bm) {+ if ($b =~ /([a-zA-Z0-9]+)\/([a-zA-Z0-9]+)\s+(.*)/) {+ #print "Running $1 $2\n";+ chdir $1;+ $result = `/usr/bin/time ./$2 $3 2> .times`;+ $time = `cat .times`; + chdir "..";+ #print $time;+ @timeflds = split(/\s+/, $time);+ $user = $timeflds[3];+ print "$1 / $2 $user\n";+ $total += $user;+ }+}++print "\nTOTAL $total\n";+
+ benchmarks/trivial/sortvec.idr view
@@ -0,0 +1,24 @@+module Main++import System+import Effect.Random++total+insert : Ord a => a -> Vect n a -> Vect (S n) a+insert x [] = [x]+insert x (y :: ys) = if (x < y) then x :: y :: ys else y :: insert x ys++vsort : Ord a => Vect n a -> Vect n a+vsort [] = []+vsort (x :: xs) = insert x (vsort xs)++mkSortVec : (n : Nat) -> Eff m [RND] (Vect n Int)+mkSortVec Z = return []+mkSortVec (S k) = return (fromInteger !(rndInt 0 10000) :: !(mkSortVec k))++main : IO ()+main = do (_ :: arg :: _) <- getArgs+-- let arg = "2000"+ let vec = runPure [123456789] (mkSortVec (fromInteger (cast arg)))+ putStrLn "Made vector"+ printLn (vsort vec)
+ benchmarks/trivial/sortvec.ipkg view
@@ -0,0 +1,8 @@+package sort++modules = sortvec +opts = "-p effects" ++executable = sortvec+main = sortvec+
− codegen/idris-c/Main.hs
@@ -1,52 +0,0 @@-module Main where--import Idris.Core.TT-import Idris.AbsSyntax-import Idris.ElabDecls-import Idris.REPL--import IRTS.Compiler-import IRTS.CodegenC--import System.Environment-import System.Exit-import Control.Monad--import Paths_idris--import Util.System--data Opts = Opts { inputs :: [FilePath],- interface :: Bool,- output :: FilePath }--showUsage = do putStrLn "Usage: idris-c <ibc-files> [-o <output-file>]"- exitWith ExitSuccess--getOpts :: IO Opts-getOpts = do xs <- getArgs- return $ process (Opts [] False "a.out") xs- where- process opts ("-o":o:xs) = process (opts { output = o }) xs- process opts ("--interface":xs) = process (opts { interface = True }) xs- process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs- process opts [] = opts--c_main :: Opts -> Idris ()-c_main opts = do runIO setupBundledCC- elabPrims- loadInputs (inputs opts) Nothing- mainProg <- if interface opts - then liftM Just elabMain- else return Nothing- ir <- compile (Via "c") (output opts) mainProg- runIO $ codegenC ir--main :: IO ()-main = do opts <- getOpts- if (null (inputs opts)) - then showUsage- else runMain (c_main opts)---
+ codegen/idris-codegen-c/Main.hs view
@@ -0,0 +1,50 @@+module Main where++import Idris.Core.TT+import Idris.AbsSyntax+import Idris.ElabDecls+import Idris.REPL++import IRTS.Compiler+import IRTS.CodegenC++import System.Environment+import System.Exit+import Control.Monad++import Paths_idris++import Util.System++data Opts = Opts { inputs :: [FilePath],+ interface :: Bool,+ output :: FilePath }++showUsage = do putStrLn "A code generator which is intended to be called by the compiler, not by a user."+ putStrLn "Usage: idris-codegen-c <ibc-files> [-o <output-file>]"+ exitWith ExitSuccess++getOpts :: IO Opts+getOpts = do xs <- getArgs+ return $ process (Opts [] False "a.out") xs+ where+ process opts ("-o":o:xs) = process (opts { output = o }) xs+ process opts ("--interface":xs) = process (opts { interface = True }) xs+ process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs+ process opts [] = opts++c_main :: Opts -> Idris ()+c_main opts = do runIO setupBundledCC+ elabPrims+ loadInputs (inputs opts) Nothing+ mainProg <- if interface opts+ then liftM Just elabMain+ else return Nothing+ ir <- compile (Via "c") (output opts) mainProg+ runIO $ codegenC ir++main :: IO ()+main = do opts <- getOpts+ if (null (inputs opts))+ then showUsage+ else runMain (c_main opts)
+ codegen/idris-codegen-javascript/Main.hs view
@@ -0,0 +1,44 @@+module Main where++import Idris.Core.TT+import Idris.AbsSyntax+import Idris.ElabDecls+import Idris.REPL++import IRTS.Compiler+import IRTS.CodegenJavaScript++import System.Environment+import System.Exit++import Paths_idris++data Opts = Opts {+ inputs :: [FilePath]+ , output :: FilePath+ }++showUsage = do putStrLn "A code generator which is intended to be called by the compiler, not by a user."+ putStrLn "Usage: idris-codegen-javascript <ibc-files> [-o <output-file>]"+ exitWith ExitSuccess++getOpts :: IO Opts+getOpts = do xs <- getArgs+ return $ process (Opts [] "main.js") xs+ where+ process opts ("-o":o:xs) = process (opts { output = o }) xs+ process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs+ process opts [] = opts++jsMain :: Opts -> Idris ()+jsMain opts = do elabPrims+ loadInputs (inputs opts) Nothing+ mainProg <- elabMain+ ir <- compile (Via "javascript") (output opts) (Just mainProg)+ runIO $ codegenJavaScript ir++main :: IO ()+main = do opts <- getOpts+ if (null (inputs opts))+ then showUsage+ else runMain (jsMain opts)
+ codegen/idris-codegen-node/Main.hs view
@@ -0,0 +1,43 @@+module Main where++import Idris.Core.TT+import Idris.AbsSyntax+import Idris.ElabDecls+import Idris.REPL++import IRTS.Compiler+import IRTS.CodegenJavaScript++import System.Environment+import System.Exit++import Paths_idris++data Opts = Opts { inputs :: [FilePath]+ , output :: FilePath+ }++showUsage = do putStrLn "A code generator which is intended to be called by the compiler, not by a user."+ putStrLn "Usage: idris-codegen-node <ibc-files> [-o <output-file>]"+ exitWith ExitSuccess++getOpts :: IO Opts+getOpts = do xs <- getArgs+ return $ process (Opts [] "main.js") xs+ where+ process opts ("-o":o:xs) = process (opts { output = o }) xs+ process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs+ process opts [] = opts++jsMain :: Opts -> Idris ()+jsMain opts = do elabPrims+ loadInputs (inputs opts) Nothing+ mainProg <- elabMain+ ir <- compile (Via "node") (output opts) (Just mainProg)+ runIO $ codegenNode ir++main :: IO ()+main = do opts <- getOpts+ if (null (inputs opts))+ then showUsage+ else runMain (jsMain opts)
− codegen/idris-javascript/Main.hs
@@ -1,42 +0,0 @@-module Main where--import Idris.Core.TT-import Idris.AbsSyntax-import Idris.ElabDecls-import Idris.REPL--import IRTS.Compiler-import IRTS.CodegenJavaScript--import System.Environment-import System.Exit--import Paths_idris--data Opts = Opts { inputs :: [FilePath]- , output :: FilePath- }--showUsage = do putStrLn "Usage: idris-javascript <ibc-files> [-o <output-file>]"- exitWith ExitSuccess--getOpts :: IO Opts-getOpts = do xs <- getArgs- return $ process (Opts [] "main.js") xs- where- process opts ("-o":o:xs) = process (opts { output = o }) xs- process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs- process opts [] = opts--jsMain :: Opts -> Idris ()-jsMain opts = do elabPrims- loadInputs (inputs opts) Nothing- mainProg <- elabMain- ir <- compile (Via "javascript") (output opts) (Just mainProg)- runIO $ codegenJavaScript ir--main :: IO ()-main = do opts <- getOpts- if (null (inputs opts))- then showUsage- else runMain (jsMain opts)
− codegen/idris-node/Main.hs
@@ -1,42 +0,0 @@-module Main where--import Idris.Core.TT-import Idris.AbsSyntax-import Idris.ElabDecls-import Idris.REPL--import IRTS.Compiler-import IRTS.CodegenJavaScript--import System.Environment-import System.Exit--import Paths_idris--data Opts = Opts { inputs :: [FilePath]- , output :: FilePath- }--showUsage = do putStrLn "Usage: idris-node <ibc-files> [-o <output-file>]"- exitWith ExitSuccess--getOpts :: IO Opts-getOpts = do xs <- getArgs- return $ process (Opts [] "main.js") xs- where- process opts ("-o":o:xs) = process (opts { output = o }) xs- process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs- process opts [] = opts--jsMain :: Opts -> Idris ()-jsMain opts = do elabPrims- loadInputs (inputs opts) Nothing- mainProg <- elabMain- ir <- compile (Via "node") (output opts) (Just mainProg)- runIO $ codegenNode ir--main :: IO ()-main = do opts <- getOpts- if (null (inputs opts))- then showUsage- else runMain (jsMain opts)
config.mk view
@@ -27,7 +27,11 @@ ifneq (, $(findstring mingw, $(MACHINE))) OS :=windows else+ifneq (, $(findstring windows, $(MACHINE)))+ OS :=windows+else OS :=unix+endif endif endif endif
+ idris-tutorial.pdf view
binary file changed (absent → 287080 bytes)
idris.cabal view
@@ -1,5 +1,5 @@ Name: idris-Version: 0.9.19+Version: 0.9.19.1 License: BSD3 License-file: LICENSE Author: Edwin Brady@@ -76,9 +76,23 @@ rts/mini-gmp.h rts/libtest.c +Extra-doc-files:+ CHANGELOG+ CITATION.md+ CONTRIBUTING.md+ CONTRIBUTORS+ README.md+ idris-tutorial.pdf+ man/idris.1+ samples/effects/*.idr+ samples/misc/*.idr+ samples/misc/*.lidr+ samples/tutorial/*.idr+ Extra-source-files: Makefile config.mk+ stack.yaml rts/*.c rts/*.h@@ -143,36 +157,18 @@ test/reg004/run test/reg004/*.idr test/reg004/expected- test/reg005/run- test/reg005/*.idr- test/reg005/expected test/reg006/run test/reg006/*.idr test/reg006/expected test/reg007/run test/reg007/*.lidr test/reg007/expected- test/reg009/run- test/reg009/*.lidr- test/reg009/expected test/reg010/run test/reg010/*.idr test/reg010/expected- test/reg011/run- test/reg011/*.idr- test/reg011/expected- test/reg012/run- test/reg012/*.lidr- test/reg012/expected test/reg013/run test/reg013/*.idr test/reg013/expected- test/reg014/run- test/reg014/*.idr- test/reg014/expected- test/reg015/run- test/reg015/*.idr- test/reg015/expected test/reg016/run test/reg016/*.idr test/reg016/expected@@ -182,18 +178,9 @@ test/reg018/run test/reg018/*.idr test/reg018/expected- test/reg019/run- test/reg019/*.idr- test/reg019/expected test/reg020/run test/reg020/*.idr test/reg020/expected- test/reg021/run- test/reg021/*.idr- test/reg021/expected- test/reg022/run- test/reg022/*.idr- test/reg022/expected test/reg023/run test/reg023/*.idr test/reg023/expected@@ -203,9 +190,6 @@ test/reg025/run test/reg025/*.idr test/reg025/expected- test/reg026/run- test/reg026/*.idr- test/reg026/expected test/reg027/run test/reg027/*.idr test/reg027/expected@@ -215,18 +199,12 @@ test/reg029/run test/reg029/*.idr test/reg029/expected- test/reg030/run- test/reg030/*.idr- test/reg030/expected test/reg031/run test/reg031/*.idr test/reg031/expected test/reg032/run test/reg032/*.idr test/reg032/expected- test/reg033/run- test/reg033/*.idr- test/reg033/expected test/reg034/run test/reg034/*.idr test/reg034/expected@@ -365,6 +343,12 @@ test/basic013/run test/basic013/*.idr test/basic013/expected+ test/basic014/run+ test/basic014/*.idr+ test/basic014/expected+ test/basic015/run+ test/basic015/*.idr+ test/basic015/expected test/bignum001/run test/bignum001/*.idr@@ -569,6 +553,7 @@ test/primitives001/run test/primitives001/*.idr test/primitives001/expected+ test/primitives001/input test/primitives002/run test/primitives002/expected test/primitives003/run@@ -606,6 +591,16 @@ test/proof010/run test/proof010/*.idr test/proof010/expected+ + test/proofsearch001/run+ test/proofsearch001/*.idr+ test/proofsearch001/expected+ test/proofsearch002/run+ test/proofsearch002/*.idr+ test/proofsearch002/expected+ test/proofsearch003/run+ test/proofsearch003/*.idr+ test/proofsearch003/expected test/quasiquote001/run test/quasiquote001/*.idr@@ -695,6 +690,9 @@ test/totality009/run test/totality009/*.idr test/totality009/expected+ test/totality010/run+ test/totality010/*.idr+ test/totality010/expected test/tutorial001/run test/tutorial001/*.idr@@ -738,7 +736,23 @@ test/docs003/*.idr test/docs003/expected + benchmarks/ALL+ benchmarks/*.pl+ benchmarks/README + benchmarks/fasta/fasta.idr+ benchmarks/fasta/fasta.ipkg++ benchmarks/pidigits/pidigits.idr+ benchmarks/pidigits/pidigits.ipkg++ benchmarks/quasigroups/board+ benchmarks/quasigroups/*.idr+ benchmarks/quasigroups/qgsolve.ipkg++ benchmarks/trivial/sortvec.idr+ benchmarks/trivial/sortvec.ipkg+ source-repository head type: git location: git://github.com/idris-lang/Idris-dev.git@@ -923,7 +937,7 @@ , trifecta >= 1.1 && < 1.6 , uniplate >=1.6 && < 1.7 , unordered-containers < 0.3- , utf8-string <= 1+ , utf8-string < 1.1 , vector < 0.11 , vector-binary-instances < 0.3 , zip-archive > 0.2.3.5 && < 0.2.4@@ -984,9 +998,9 @@ ghc-prof-options: -auto-all -caf-all ghc-options: -threaded -rtsopts -funbox-strict-fields -Executable idris-c+Executable idris-codegen-c Main-is: Main.hs- hs-source-dirs: codegen/idris-c+ hs-source-dirs: codegen/idris-codegen-c Build-depends: idris , base@@ -997,9 +1011,9 @@ ghc-prof-options: -auto-all -caf-all ghc-options: -threaded -rtsopts -funbox-strict-fields -Executable idris-javascript+Executable idris-codegen-javascript Main-is: Main.hs- hs-source-dirs: codegen/idris-javascript+ hs-source-dirs: codegen/idris-codegen-javascript Build-depends: idris , base@@ -1010,9 +1024,9 @@ ghc-prof-options: -auto-all -caf-all ghc-options: -threaded -rtsopts -funbox-strict-fields -Executable idris-node+Executable idris-codegen-node Main-is: Main.hs- hs-source-dirs: codegen/idris-node+ hs-source-dirs: codegen/idris-codegen-node Build-depends: idris , base
jsrts/Runtime-node.js view
@@ -10,14 +10,20 @@ return function() { var ret = "";-+ var b = new Buffer(1024);+ var i = 0; while(true) {- var b = new Buffer(1);- fs.readSync(0, b, 0, 1 )- if (b[0] == 10)+ fs.readSync(0, b, i, 1 )+ if (b[i] == 10) {+ ret = b.toString('utf8', 0, i); break;- else- ret += String.fromCharCode(b[0]);+ }+ i++;+ if (i == b.length) {+ nb = new Buffer (b.length*2);+ b.copy(nb)+ b = nb;+ } } return ret;
libs/base/Control/Category.idr view
@@ -10,7 +10,9 @@ instance Category Morphism where id = Mor id- (Mor f) . (Mor g) = Mor (f . g)+ -- disambiguation needed below, because unification can now get further+ -- here with Category.(.) and it's only type class resolution that fails!+ (Mor f) . (Mor g) = with Basics (Mor (f . g)) instance Monad m => Category (Kleislimorphism m) where id = Kleisli (return . id)
libs/base/Data/Bits.idr view
@@ -42,7 +42,7 @@ | S (S (S _)) = natToBits' {n=3} (prim__truncInt_B64 0) x getPad : Nat -> machineTy n-getPad n = natToBits ((bitsUsed (nextBytes n)) - n)+getPad n = natToBits (minus (bitsUsed (nextBytes n)) n) public data Bits : Nat -> Type where
libs/base/Data/Complex.idr view
@@ -5,8 +5,6 @@ module Data.Complex -import Data.Floats- ------------------------------ Rectangular form infix 6 :+@@ -57,20 +55,21 @@ ------------------------------ Conjugate -conjugate : Num a => Complex a -> Complex a+conjugate : Neg a => Complex a -> Complex a conjugate (r:+i) = (r :+ (0-i)) instance Functor Complex where- map f (r :+ i) = f r :+ f i--instance Neg a => Neg (Complex a) where- negate = map negate+ map f (r :+ i) = f r :+ f i -- We can't do "instance Num a => Num (Complex a)" because -- we need "abs" which needs "magnitude" which needs "sqrt" which needs Float instance Num (Complex Float) where (+) (a:+b) (c:+d) = ((a+c):+(b+d))- (-) (a:+b) (c:+d) = ((a-c):+(b-d)) (*) (a:+b) (c:+d) = ((a*c-b*d):+(b*c+a*d)) fromInteger x = (fromInteger x:+0)++instance Neg (Complex Float) where+ negate = map negate+ (-) (a:+b) (c:+d) = ((a-c):+(b-d)) abs (a:+b) = (magnitude (a:+b):+0)+
− libs/base/Data/Floats.idr
@@ -1,59 +0,0 @@-module Data.Floats--%access public-%default total--%include C "math.h"-%lib C "m"--pi : Float-pi = 3.14159265358979323846 --euler : Float-euler = 2.7182818284590452354--exp : Float -> Float-exp x = prim__floatExp x--log : Float -> Float-log x = prim__floatLog x--sin : Float -> Float-sin x = prim__floatSin x--cos : Float -> Float-cos x = prim__floatCos x--tan : Float -> Float-tan x = prim__floatTan x--asin : Float -> Float-asin x = prim__floatASin x--acos : Float -> Float-acos x = prim__floatACos x--atan : Float -> Float-atan x = prim__floatATan x--atan2 : Float -> Float -> Float-atan2 y x = atan (y/x)--sinh : Float -> Float-sinh x = (exp x - exp (-x)) / 2--cosh : Float -> Float-cosh x = (exp x + exp (-x)) / 2--tanh : Float -> Float-tanh x = sinh x / cosh x--sqrt : Float -> Float-sqrt x = prim__floatSqrt x--floor : Float -> Float-floor x = prim__floatFloor x--ceiling : Float -> Float-ceiling x = prim__floatCeil x-
libs/base/Data/Mod2.idr view
@@ -40,9 +40,7 @@ instance Num (Mod2 n) where (+) = modBin plus- (-) = modBin minus (*) = modBin times- abs = id fromInteger = intToMod instance Cast (Mod2 n) (Bits n) where
libs/base/Data/Vect.idr view
@@ -1,12 +1,572 @@ module Data.Vect +import public Data.Fin import Language.Reflection-import public Data.VectType %access public %default total +infixr 7 ::++||| Vectors: Generic lists with explicit length in the type+%elim+data Vect : Nat -> Type -> Type where+ ||| Empty vector+ Nil : Vect Z a+ ||| A non-empty vector of length `S k`, consisting of a head element and+ ||| the rest of the list, of length `k`.+ (::) : (x : a) -> (xs : Vect k a) -> Vect (S k) a++-- Hints for interactive editing+%name Vect xs,ys,zs,ws+ --------------------------------------------------------------------------------+-- Length+--------------------------------------------------------------------------------++||| Calculate the length of a `Vect`.+|||+||| **Note**: this is only useful if you don't already statically know the length+||| and you want to avoid matching the implicit argument for erasure reasons.+||| @ n the length (provably equal to the return value)+||| @ xs the vector+length : (xs : Vect n a) -> Nat+length [] = 0+length (x::xs) = 1 + length xs++||| Show that the length function on vectors in fact calculates the length+private lengthCorrect : (n : Nat) -> (xs : Vect n a) -> length xs = n+lengthCorrect Z [] = Refl+lengthCorrect (S n) (x :: xs) = rewrite lengthCorrect n xs in Refl++--------------------------------------------------------------------------------+-- Indexing into vectors+--------------------------------------------------------------------------------++||| All but the first element of the vector+tail : Vect (S n) a -> Vect n a+tail (x::xs) = xs++||| Only the first element of the vector+head : Vect (S n) a -> a+head (x::xs) = x++||| The last element of the vector+last : Vect (S n) a -> a+last (x::[]) = x+last (x::y::ys) = last $ y::ys++||| All but the last element of the vector+init : Vect (S n) a -> Vect n a+init (x::[]) = []+init (x::y::ys) = x :: init (y::ys)++||| Extract a particular element from a vector+index : Fin n -> Vect n a -> a+index FZ (x::xs) = x+index (FS k) (x::xs) = index k xs+++||| Insert an element at a particular index+insertAt : Fin (S n) -> a -> Vect n a -> Vect (S n) a+insertAt FZ y xs = y :: xs+insertAt (FS k) y (x::xs) = x :: insertAt k y xs+insertAt (FS k) y [] = absurd k++||| Construct a new vector consisting of all but the indicated element+deleteAt : Fin (S n) -> Vect (S n) a -> Vect n a+deleteAt FZ (x::xs) = xs+deleteAt {n = S m} (FS k) (x::xs) = x :: deleteAt k xs+deleteAt {n = Z} (FS k) (x::xs) = absurd k+deleteAt _ [] impossible++||| Replace an element at a particlar index with another+replaceAt : Fin n -> t -> Vect n t -> Vect n t+replaceAt FZ y (x::xs) = y :: xs+replaceAt (FS k) y (x::xs) = x :: replaceAt k y xs++||| Replace the element at a particular index with the result of applying a function to it+||| @ i the index to replace at+||| @ f the update function+||| @ xs the vector to replace in+updateAt : (i : Fin n) -> (f : t -> t) -> (xs : Vect n t) -> Vect n t+updateAt FZ f (x::xs) = f x :: xs+updateAt (FS k) f (x::xs) = x :: updateAt k f xs++--------------------------------------------------------------------------------+-- Subvectors+--------------------------------------------------------------------------------++||| Get the first n elements of a Vect+||| @ n the number of elements to take+take : (n : Nat) -> Vect (n + m) a -> Vect n a+take Z xs = []+take (S k) (x :: xs) = x :: take k xs++||| Remove the first n elements of a Vect+||| @ n the number of elements to remove+drop : (n : Nat) -> Vect (n + m) a -> Vect m a+drop Z xs = xs+drop (S k) (x :: xs) = drop k xs++||| Take the longest prefix of a Vect such that all elements satisfy some+||| Boolean predicate.+|||+||| @ p the predicate+takeWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)+takeWhile p [] = (_ ** [])+takeWhile p (x::xs) =+ let (len ** ys) = takeWhile p xs+ in if p x then+ (S len ** x :: ys)+ else+ (_ ** [])++||| Remove the longest prefix of a Vect such that all removed elements satisfy some+||| Boolean predicate.+|||+||| @ p the predicate+dropWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)+dropWhile p [] = (_ ** [])+dropWhile p (x::xs) =+ if p x then+ dropWhile p xs+ else+ (_ ** x::xs)++--------------------------------------------------------------------------------+-- Transformations+--------------------------------------------------------------------------------++||| Reverse the order of the elements of a vector+reverse : Vect n a -> Vect n a+reverse xs = go [] xs+ where go : Vect n a -> Vect m a -> Vect (n+m) a+ go {n} acc [] = rewrite plusZeroRightNeutral n in acc+ go {n} {m=S m} acc (x :: xs) = rewrite sym $ plusSuccRightSucc n m+ in go (x::acc) xs++||| Alternate an element between the other elements of a vector+||| @ sep the element to intersperse+||| @ xs the vector to separate with `sep`+intersperse : (sep : a) -> (xs : Vect n a) -> Vect (n + pred n) a+intersperse sep [] = []+intersperse sep (x::xs) = x :: intersperse' sep xs+ where+ intersperse' : a -> Vect n a -> Vect (n + n) a+ intersperse' sep [] = []+ intersperse' {n=S n} sep (x::xs) = rewrite sym $ plusSuccRightSucc n n+ in sep :: x :: intersperse' sep xs++--------------------------------------------------------------------------------+-- Conversion from list (toList is provided by Foldable)+--------------------------------------------------------------------------------+++fromList' : Vect n a -> (l : List a) -> Vect (length l + n) a+fromList' ys [] = ys+fromList' {n} ys (x::xs) =+ rewrite (plusSuccRightSucc (length xs) n) ==>+ Vect (plus (length xs) (S n)) a in+ fromList' (x::ys) xs++||| Convert a list to a vector.+|||+||| The length of the list should be statically known.+fromList : (l : List a) -> Vect (length l) a+fromList l =+ rewrite (sym $ plusZeroRightNeutral (length l)) in+ reverse $ fromList' [] l++--------------------------------------------------------------------------------+-- Building (bigger) vectors+--------------------------------------------------------------------------------++||| Append two vectors+(++) : Vect m a -> Vect n a -> Vect (m + n) a+(++) [] ys = ys+(++) (x::xs) ys = x :: xs ++ ys++||| Repeate some value n times+||| @ n the number of times to repeat it+||| @ x the value to repeat+replicate : (n : Nat) -> (x : a) -> Vect n a+replicate Z x = []+replicate (S k) x = x :: replicate k x++--------------------------------------------------------------------------------+-- Zips and unzips+--------------------------------------------------------------------------------++||| Combine two equal-length vectors pairwise with some function+zipWith : (a -> b -> c) -> Vect n a -> Vect n b -> Vect n c+zipWith f [] [] = []+zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys++||| Combine three equal-length vectors into a vector with some function+zipWith3 : (a -> b -> c -> d) -> Vect n a -> Vect n b -> Vect n c -> Vect n d+zipWith3 f [] [] [] = []+zipWith3 f (x::xs) (y::ys) (z::zs) = f x y z :: zipWith3 f xs ys zs++||| Combine two equal-length vectors pairwise+zip : Vect n a -> Vect n b -> Vect n (a, b)+zip = zipWith (\x,y => (x,y))++||| Combine three equal-length vectors elementwise into a vector of tuples+zip3 : Vect n a -> Vect n b -> Vect n c -> Vect n (a, b, c)+zip3 = zipWith3 (\x,y,z => (x,y,z))++||| Convert a vector of pairs to a pair of vectors+unzip : Vect n (a, b) -> (Vect n a, Vect n b)+unzip [] = ([], [])+unzip ((l, r)::xs) with (unzip xs)+ | (lefts, rights) = (l::lefts, r::rights)++||| Convert a vector of three-tuples to a triplet of vectors+unzip3 : Vect n (a, b, c) -> (Vect n a, Vect n b, Vect n c)+unzip3 [] = ([], [], [])+unzip3 ((l,c,r)::xs) with (unzip3 xs)+ | (lefts, centers, rights) = (l::lefts, c::centers, r::rights)++--------------------------------------------------------------------------------+-- Equality+--------------------------------------------------------------------------------++instance (Eq a) => Eq (Vect n a) where+ (==) [] [] = True+ (==) (x::xs) (y::ys) = x == y && xs == ys+++--------------------------------------------------------------------------------+-- Order+--------------------------------------------------------------------------------++instance Ord a => Ord (Vect n a) where+ compare [] [] = EQ+ compare (x::xs) (y::ys) = compare x y `thenCompare` compare xs ys+++--------------------------------------------------------------------------------+-- Maps+--------------------------------------------------------------------------------++instance Functor (Vect n) where+ map f [] = []+ map f (x::xs) = f x :: map f xs+++||| Map a partial function across a vector, returning those elements for which+||| the function had a value.+|||+||| The first projection of the resulting pair (ie the length) will always be+||| at most the length of the input vector. This is not, however, guaranteed+||| by the type.+|||+||| @ f the partial function (expressed by returning `Maybe`)+||| @ xs the vector to check for results+mapMaybe : (f : a -> Maybe b) -> (xs : Vect n a) -> (m : Nat ** Vect m b)+mapMaybe f [] = (_ ** [])+mapMaybe f (x::xs) =+ let (len ** ys) = mapMaybe f xs+ in case f x of+ Just y => (S len ** y :: ys)+ Nothing => ( len ** ys)+++--------------------------------------------------------------------------------+-- Folds+--------------------------------------------------------------------------------++foldrImpl : (t -> acc -> acc) -> acc -> (acc -> acc) -> Vect n t -> acc+foldrImpl f e go [] = go e+foldrImpl f e go (x::xs) = foldrImpl f e (go . (f x)) xs++instance Foldable (Vect n) where+ foldr f e xs = foldrImpl f e id xs++--------------------------------------------------------------------------------+-- Special folds+--------------------------------------------------------------------------------++||| Flatten a vector of equal-length vectors+concat : Vect m (Vect n a) -> Vect (m * n) a+concat [] = []+concat (v::vs) = v ++ concat vs++||| Foldr without seeding the accumulator+foldr1 : (t -> t -> t) -> Vect (S n) t -> t+foldr1 f (x::xs) = foldr f x xs++||| Foldl without seeding the accumulator+foldl1 : (t -> t -> t) -> Vect (S n) t -> t+foldl1 f (x::xs) = foldl f x xs+--------------------------------------------------------------------------------+-- Scans+--------------------------------------------------------------------------------++scanl : (b -> a -> b) -> b -> Vect n a -> Vect (S n) b+scanl f q [] = [q]+scanl f q (x::xs) = q :: scanl f (f q x) xs++--------------------------------------------------------------------------------+-- Membership tests+--------------------------------------------------------------------------------++||| Search for an item using a user-provided test+||| @ p the equality test+||| @ e the item to search for+||| @ xs the vector to search in+elemBy : (p : a -> a -> Bool) -> (e : a) -> (xs : Vect n a) -> Bool+elemBy p e [] = False+elemBy p e (x::xs) = p e x || elemBy p e xs++||| Use the default Boolean equality on elements to search for an item+||| @ x what to search for+||| @ xs where to search+elem : Eq a => (x : a) -> (xs : Vect n a) -> Bool+elem = elemBy (==)++||| Find the association of some key with a user-provided comparison+||| @ p the comparison operator for keys (True if they match)+||| @ e the key to look for+lookupBy : (p : a -> a -> Bool) -> (e : a) -> (xs : Vect n (a, b)) -> Maybe b+lookupBy p e [] = Nothing+lookupBy p e ((l, r)::xs) = if p e l then Just r else lookupBy p e xs++||| Find the assocation of some key using the default Boolean equality test+lookup : Eq a => a -> Vect n (a, b) -> Maybe b+lookup = lookupBy (==)++||| Check if any element of xs is found in elems by a user-provided comparison+||| @ p the comparison operator+||| @ elems the vector to search+||| @ xs what to search for+hasAnyBy : (p : a -> a -> Bool) -> (elems : Vect m a) -> (xs : Vect n a) -> Bool+hasAnyBy p elems [] = False+hasAnyBy p elems (x::xs) = elemBy p x elems || hasAnyBy p elems xs++||| Check if any element of xs is found in elems using the default Boolean equality test+hasAny : Eq a => Vect m a -> Vect n a -> Bool+hasAny = hasAnyBy (==)++--------------------------------------------------------------------------------+-- Searching with a predicate+--------------------------------------------------------------------------------++||| Find the first element of the vector that satisfies some test+||| @ p the test to satisfy+find : (p : a -> Bool) -> (xs : Vect n a) -> Maybe a+find p [] = Nothing+find p (x::xs) = if p x then Just x else find p xs++||| Find the index of the first element of the vector that satisfies some test+findIndex : (a -> Bool) -> Vect n a -> Maybe (Fin n)+findIndex p [] = Nothing+findIndex p (x :: xs) = if p x then Just 0 else map FS (findIndex p xs)++||| Find the indices of all elements that satisfy some test+findIndices : (a -> Bool) -> Vect m a -> List (Fin m)+findIndices p [] = []+findIndices p (x :: xs) = let is = map FS $ findIndices p xs+ in if p x then 0 :: is else is++elemIndexBy : (a -> a -> Bool) -> a -> Vect m a -> Maybe (Fin m)+elemIndexBy p e = findIndex $ p e++elemIndex : Eq a => a -> Vect m a -> Maybe (Fin m)+elemIndex = elemIndexBy (==)++elemIndicesBy : (a -> a -> Bool) -> a -> Vect m a -> List (Fin m)+elemIndicesBy p e = findIndices $ p e++elemIndices : Eq a => a -> Vect m a -> List (Fin m)+elemIndices = elemIndicesBy (==)++--------------------------------------------------------------------------------+-- Filters+--------------------------------------------------------------------------------++||| Find all elements of a vector that satisfy some test+filter : (a -> Bool) -> Vect n a -> (p ** Vect p a)+filter p [] = ( _ ** [] )+filter p (x::xs) =+ let (_ ** tail) = filter p xs+ in if p x then+ (_ ** x::tail)+ else+ (_ ** tail)++||| Make the elements of some vector unique by some test+nubBy : (a -> a -> Bool) -> Vect n a -> (p ** Vect p a)+nubBy = nubBy' []+ where+ nubBy' : Vect m a -> (a -> a -> Bool) -> Vect n a -> (p ** Vect p a)+ nubBy' acc p [] = (_ ** [])+ nubBy' acc p (x::xs) with (elemBy p x acc)+ | True = nubBy' acc p xs+ | False with (nubBy' (x::acc) p xs)+ | (_ ** tail) = (_ ** x::tail)++||| Make the elements of some vector unique by the default Boolean equality+nub : Eq a => Vect n a -> (p ** Vect p a)+nub = nubBy (==)++deleteBy : (a -> a -> Bool) -> a -> Vect n a -> (p ** Vect p a)+deleteBy _ _ [] = (_ ** [])+deleteBy eq x (y::ys) =+ let (len ** zs) = deleteBy eq x ys+ in if x `eq` y then (_ ** ys) else (S len ** y ::zs)++delete : (Eq a) => a -> Vect n a -> (p ** Vect p a)+delete = deleteBy (==)++--------------------------------------------------------------------------------+-- Splitting and breaking lists+--------------------------------------------------------------------------------++||| A tuple where the first element is a Vect of the n first elements and+||| the second element is a Vect of the remaining elements of the original Vect+||| It is equivalent to (take n xs, drop n xs)+||| @ n the index to split at+||| @ xs the Vect to split in two+splitAt : (n : Nat) -> (xs : Vect (n + m) a) -> (Vect n a, Vect m a)+splitAt n xs = (take n xs, drop n xs)++partition : (a -> Bool) -> Vect n a -> ((p ** Vect p a), (q ** Vect q a))+partition p [] = ((_ ** []), (_ ** []))+partition p (x::xs) =+ let ((leftLen ** lefts), (rightLen ** rights)) = partition p xs in+ if p x then+ ((S leftLen ** x::lefts), (rightLen ** rights))+ else+ ((leftLen ** lefts), (S rightLen ** x::rights))++--------------------------------------------------------------------------------+-- Predicates+--------------------------------------------------------------------------------++isPrefixOfBy : (a -> a -> Bool) -> Vect m a -> Vect n a -> Bool+isPrefixOfBy p [] right = True+isPrefixOfBy p left [] = False+isPrefixOfBy p (x::xs) (y::ys) = p x y && isPrefixOfBy p xs ys++isPrefixOf : Eq a => Vect m a -> Vect n a -> Bool+isPrefixOf = isPrefixOfBy (==)++isSuffixOfBy : (a -> a -> Bool) -> Vect m a -> Vect n a -> Bool+isSuffixOfBy p left right = isPrefixOfBy p (reverse left) (reverse right)++isSuffixOf : Eq a => Vect m a -> Vect n a -> Bool+isSuffixOf = isSuffixOfBy (==)++--------------------------------------------------------------------------------+-- Conversions+--------------------------------------------------------------------------------++maybeToVect : Maybe a -> (p ** Vect p a)+maybeToVect Nothing = (_ ** [])+maybeToVect (Just j) = (_ ** [j])++vectToMaybe : Vect n a -> Maybe a+vectToMaybe [] = Nothing+vectToMaybe (x::xs) = Just x++--------------------------------------------------------------------------------+-- Misc+--------------------------------------------------------------------------------++catMaybes : Vect n (Maybe a) -> (p ** Vect p a)+catMaybes [] = (_ ** [])+catMaybes (Nothing::xs) = catMaybes xs+catMaybes ((Just j)::xs) =+ let (_ ** tail) = catMaybes xs+ in (_ ** j::tail)++diag : Vect n (Vect n a) -> Vect n a+diag [] = []+diag ((x::xs)::xss) = x :: diag (map tail xss)++range : {n : Nat} -> Vect n (Fin n)+range {n=Z} = []+range {n=S _} = FZ :: map FS range++||| Transpose a Vect of Vects, turning rows into columns and vice versa.+|||+||| As the types ensure rectangularity, this is an involution, unlike `Prelude.List.transpose`.+transpose : {n : Nat} -> Vect m (Vect n a) -> Vect n (Vect m a)+transpose [] = replicate _ []+transpose (x :: xs) = zipWith (::) x (transpose xs)++--------------------------------------------------------------------------------+-- Applicative/Monad/Traversable+--------------------------------------------------------------------------------++instance Applicative (Vect k) where+ pure = replicate _++ fs <*> vs = zipWith apply fs vs++||| This monad is different from the List monad, (>>=)+||| uses the diagonal.+instance Monad (Vect n) where+ m >>= f = diag (map f m)++instance Traversable (Vect n) where+ traverse f [] = pure Vect.Nil+ traverse f (x::xs) = [| Vect.(::) (f x) (traverse f xs) |]++--------------------------------------------------------------------------------+-- Show+--------------------------------------------------------------------------------++instance Show a => Show (Vect n a) where+ show = show . toList++--------------------------------------------------------------------------------+-- Properties+--------------------------------------------------------------------------------++vectConsCong : (x : a) -> (xs : Vect n a) -> (ys : Vect m a) -> (xs = ys) -> (x :: xs = x :: ys)+vectConsCong x xs xs Refl = Refl++vectNilRightNeutral : (xs : Vect n a) -> xs ++ [] = xs+vectNilRightNeutral [] = Refl+vectNilRightNeutral (x :: xs) =+ vectConsCong _ _ _ (vectNilRightNeutral xs)++vectAppendAssociative : (x : Vect xLen a) -> (y : Vect yLen a) -> (z : Vect zLen a) -> x ++ (y ++ z) = (x ++ y) ++ z+vectAppendAssociative [] y z = Refl+vectAppendAssociative (x :: xs) ys zs =+ vectConsCong _ _ _ (vectAppendAssociative xs ys zs)++--------------------------------------------------------------------------------+-- DecEq+--------------------------------------------------------------------------------++vectInjective1 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> x = y+vectInjective1 {x=x} {y=x} {xs=xs} {ys=xs} Refl = Refl++vectInjective2 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> xs = ys+vectInjective2 {x=x} {y=x} {xs=xs} {ys=xs} Refl = Refl++instance DecEq a => DecEq (Vect n a) where+ decEq [] [] = Yes Refl+ decEq (x :: xs) (y :: ys) with (decEq x y)+ decEq (x :: xs) (x :: ys) | Yes Refl with (decEq xs ys)+ decEq (x :: xs) (x :: xs) | Yes Refl | Yes Refl = Yes Refl+ decEq (x :: xs) (x :: ys) | Yes Refl | No neq = No (neq . vectInjective2)+ decEq (x :: xs) (y :: ys) | No neq = No (neq . vectInjective1)++{- The following definition is elaborated in a wrong case-tree. Examination pending.+instance DecEq a => DecEq (Vect n a) where+ decEq [] [] = Yes Refl+ decEq (x :: xs) (y :: ys) with (decEq x y, decEq xs ys)+ decEq (x :: xs) (x :: xs) | (Yes Refl, Yes Refl) = Yes Refl+ decEq (x :: xs) (y :: ys) | (_, No nEqTl) = No (\p => nEqTl (vectInjective2 p))+ decEq (x :: xs) (y :: ys) | (No nEqHd, _) = No (\p => nEqHd (vectInjective1 p))+-}++-------------------------------------------------------------------------------- -- Elem -------------------------------------------------------------------------------- @@ -32,12 +592,6 @@ isElem x (y :: xs) | (No xneqy) with (isElem x xs) isElem x (y :: xs) | (No xneqy) | (Yes xinxs) = Yes (There xinxs) isElem x (y :: xs) | (No xneqy) | (No xninxs) = No (neitherHereNorThere xneqy xninxs)--||| A tactic for discovering where, if anywhere, an element is in a vector-||| @ n how many elements to search before giving up-findElem : (n : Nat) -> List (TTName, Binder TT) -> TT -> Tactic-findElem Z ctxt goal = Refine "Here" `Seq` Solve-findElem (S n) ctxt goal = GoalType "Elem" (Try (Refine "Here" `Seq` Solve) (Refine "There" `Seq` (Solve `Seq` findElem n ctxt goal))) replaceElem : (xs : Vect k t) -> Elem x xs -> (y : t) -> (ys : Vect k t ** Elem y ys) replaceElem (x::xs) Here y = (y :: xs ** Here)
− libs/base/Data/VectType.idr
@@ -1,601 +0,0 @@-module Data.VectType--import public Data.Fin--%access public-%default total--namespace Vect {--infixr 7 ::--||| Vectors: Generic lists with explicit length in the type-%elim -data Vect : Nat -> Type -> Type where- ||| Empty vector - Nil : Vect Z a- ||| A non-empty vector of length `S k`, consisting of a head element and - ||| the rest of the list, of length `k`.- (::) : (x : a) -> (xs : Vect k a) -> Vect (S k) a---- Hints for interactive editing-%name Vect xs,ys,zs,ws------------------------------------------------------------------------------------- Length-----------------------------------------------------------------------------------||| Calculate the length of a `Vect`.-|||-||| **Note**: this is only useful if you don't already statically know the length-||| and you want to avoid matching the implicit argument for erasure reasons.-||| @ n the length (provably equal to the return value)-||| @ xs the vector-length : (xs : Vect n a) -> Nat-length [] = 0-length (x::xs) = 1 + length xs--||| Show that the length function on vectors in fact calculates the length-private lengthCorrect : (n : Nat) -> (xs : Vect n a) -> length xs = n-lengthCorrect Z [] = Refl-lengthCorrect (S n) (x :: xs) = rewrite lengthCorrect n xs in Refl------------------------------------------------------------------------------------- Indexing into vectors-----------------------------------------------------------------------------------||| All but the first element of the vector-tail : Vect (S n) a -> Vect n a-tail (x::xs) = xs--||| Only the first element of the vector-head : Vect (S n) a -> a-head (x::xs) = x--||| The last element of the vector-last : Vect (S n) a -> a-last (x::[]) = x-last (x::y::ys) = last $ y::ys--||| All but the last element of the vector-init : Vect (S n) a -> Vect n a-init (x::[]) = []-init (x::y::ys) = x :: init (y::ys)--||| Extract a particular element from a vector-index : Fin n -> Vect n a -> a-index FZ (x::xs) = x-index (FS k) (x::xs) = index k xs---||| Insert an element at a particular index-insertAt : Fin (S n) -> a -> Vect n a -> Vect (S n) a-insertAt FZ y xs = y :: xs-insertAt (FS k) y (x::xs) = x :: insertAt k y xs-insertAt (FS k) y [] = absurd k--||| Construct a new vector consisting of all but the indicated element-deleteAt : Fin (S n) -> Vect (S n) a -> Vect n a-deleteAt FZ (x::xs) = xs-deleteAt {n = S m} (FS k) (x::xs) = x :: deleteAt k xs-deleteAt {n = Z} (FS k) (x::xs) = absurd k-deleteAt _ [] impossible--||| Replace an element at a particlar index with another-replaceAt : Fin n -> t -> Vect n t -> Vect n t-replaceAt FZ y (x::xs) = y :: xs-replaceAt (FS k) y (x::xs) = x :: replaceAt k y xs--||| Replace the element at a particular index with the result of applying a function to it-||| @ i the index to replace at-||| @ f the update function-||| @ xs the vector to replace in-updateAt : (i : Fin n) -> (f : t -> t) -> (xs : Vect n t) -> Vect n t-updateAt FZ f (x::xs) = f x :: xs-updateAt (FS k) f (x::xs) = x :: updateAt k f xs------------------------------------------------------------------------------------- Subvectors-----------------------------------------------------------------------------------||| Get the first n elements of a Vect-||| @ n the number of elements to take-take : (n : Nat) -> Vect (n + m) a -> Vect n a-take Z xs = []-take (S k) (x :: xs) = x :: take k xs--||| Remove the first n elements of a Vect-||| @ n the number of elements to remove-drop : (n : Nat) -> Vect (n + m) a -> Vect m a-drop Z xs = xs-drop (S k) (x :: xs) = drop k xs--||| Take the longest prefix of a Vect such that all elements satisfy some-||| Boolean predicate.-|||-||| @ p the predicate-takeWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)-takeWhile p [] = (_ ** [])-takeWhile p (x::xs) =- let (len ** ys) = takeWhile p xs- in if p x then- (S len ** x :: ys)- else- (_ ** [])--||| Remove the longest prefix of a Vect such that all removed elements satisfy some-||| Boolean predicate.-|||-||| @ p the predicate-dropWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)-dropWhile p [] = (_ ** [])-dropWhile p (x::xs) =- if p x then- dropWhile p xs- else- (_ ** x::xs)------------------------------------------------------------------------------------- Transformations-----------------------------------------------------------------------------------||| Reverse the order of the elements of a vector-reverse : Vect n a -> Vect n a-reverse xs = go [] xs- where go : Vect n a -> Vect m a -> Vect (n+m) a- go {n} acc [] = rewrite plusZeroRightNeutral n in acc- go {n} {m=S m} acc (x :: xs) = rewrite sym $ plusSuccRightSucc n m- in go (x::acc) xs--||| Alternate an element between the other elements of a vector-||| @ sep the element to intersperse-||| @ xs the vector to separate with `sep`-intersperse : (sep : a) -> (xs : Vect n a) -> Vect (n + pred n) a-intersperse sep [] = []-intersperse sep (x::xs) = x :: intersperse' sep xs- where- intersperse' : a -> Vect n a -> Vect (n + n) a- intersperse' sep [] = []- intersperse' {n=S n} sep (x::xs) = rewrite sym $ plusSuccRightSucc n n- in sep :: x :: intersperse' sep xs------------------------------------------------------------------------------------- Conversion from list (toList is provided by Foldable)------------------------------------------------------------------------------------fromList' : Vect n a -> (l : List a) -> Vect (length l + n) a-fromList' ys [] = ys-fromList' {n} ys (x::xs) =- rewrite (plusSuccRightSucc (length xs) n) ==>- Vect (plus (length xs) (S n)) a in- fromList' (x::ys) xs--||| Convert a list to a vector.-|||-||| The length of the list should be statically known.-fromList : (l : List a) -> Vect (length l) a-fromList l =- rewrite (sym $ plusZeroRightNeutral (length l)) in- reverse $ fromList' [] l------------------------------------------------------------------------------------- Building (bigger) vectors-----------------------------------------------------------------------------------||| Append two vectors-(++) : Vect m a -> Vect n a -> Vect (m + n) a-(++) [] ys = ys-(++) (x::xs) ys = x :: xs ++ ys--||| Repeate some value n times-||| @ n the number of times to repeat it-||| @ x the value to repeat-replicate : (n : Nat) -> (x : a) -> Vect n a-replicate Z x = []-replicate (S k) x = x :: replicate k x------------------------------------------------------------------------------------- Zips and unzips-----------------------------------------------------------------------------------||| Combine two equal-length vectors pairwise with some function-zipWith : (a -> b -> c) -> Vect n a -> Vect n b -> Vect n c-zipWith f [] [] = []-zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys--||| Combine three equal-length vectors into a vector with some function-zipWith3 : (a -> b -> c -> d) -> Vect n a -> Vect n b -> Vect n c -> Vect n d-zipWith3 f [] [] [] = []-zipWith3 f (x::xs) (y::ys) (z::zs) = f x y z :: zipWith3 f xs ys zs--||| Combine two equal-length vectors pairwise-zip : Vect n a -> Vect n b -> Vect n (a, b)-zip = zipWith (\x,y => (x,y))--||| Combine three equal-length vectors elementwise into a vector of tuples-zip3 : Vect n a -> Vect n b -> Vect n c -> Vect n (a, b, c)-zip3 = zipWith3 (\x,y,z => (x,y,z))--||| Convert a vector of pairs to a pair of vectors-unzip : Vect n (a, b) -> (Vect n a, Vect n b)-unzip [] = ([], [])-unzip ((l, r)::xs) with (unzip xs)- | (lefts, rights) = (l::lefts, r::rights)--||| Convert a vector of three-tuples to a triplet of vectors-unzip3 : Vect n (a, b, c) -> (Vect n a, Vect n b, Vect n c)-unzip3 [] = ([], [], [])-unzip3 ((l,c,r)::xs) with (unzip3 xs)- | (lefts, centers, rights) = (l::lefts, c::centers, r::rights)------------------------------------------------------------------------------------- Equality-----------------------------------------------------------------------------------instance (Eq a) => Eq (Vect n a) where- (==) [] [] = True- (==) (x::xs) (y::ys) =- if x == y then- xs == ys- else- False-------------------------------------------------------------------------------------- Order-----------------------------------------------------------------------------------instance Ord a => Ord (Vect n a) where- compare [] [] = EQ- compare (x::xs) (y::ys) =- if x /= y then- compare x y- else- compare xs ys-------------------------------------------------------------------------------------- Maps-----------------------------------------------------------------------------------instance Functor (Vect n) where- map f [] = []- map f (x::xs) = f x :: map f xs---||| Map a partial function across a vector, returning those elements for which-||| the function had a value.-|||-||| The first projection of the resulting pair (ie the length) will always be-||| at most the length of the input vector. This is not, however, guaranteed-||| by the type.-|||-||| @ f the partial function (expressed by returning `Maybe`)-||| @ xs the vector to check for results-mapMaybe : (f : a -> Maybe b) -> (xs : Vect n a) -> (m : Nat ** Vect m b)-mapMaybe f [] = (_ ** [])-mapMaybe f (x::xs) =- let (len ** ys) = mapMaybe f xs- in case f x of- Just y => (S len ** y :: ys)- Nothing => ( len ** ys)-------------------------------------------------------------------------------------- Folds-----------------------------------------------------------------------------------total foldrImpl : (t -> acc -> acc) -> acc -> (acc -> acc) -> Vect n t -> acc-foldrImpl f e go [] = go e-foldrImpl f e go (x::xs) = foldrImpl f e (go . (f x)) xs--instance Foldable (Vect n) where- foldr f e xs = foldrImpl f e id xs------------------------------------------------------------------------------------- Special folds-----------------------------------------------------------------------------------||| Flatten a vector of equal-length vectors-concat : Vect m (Vect n a) -> Vect (m * n) a-concat [] = []-concat (v::vs) = v ++ concat vs--||| Foldr without seeding the accumulator-foldr1 : (t -> t -> t) -> Vect (S n) t -> t-foldr1 f (x::xs) = foldr f x xs--||| Foldl without seeding the accumulator-foldl1 : (t -> t -> t) -> Vect (S n) t -> t-foldl1 f (x::xs) = foldl f x xs------------------------------------------------------------------------------------ Scans-----------------------------------------------------------------------------------scanl : (b -> a -> b) -> b -> Vect n a -> Vect (S n) b-scanl f q [] = [q]-scanl f q (x::xs) = q :: scanl f (f q x) xs------------------------------------------------------------------------------------- Membership tests-----------------------------------------------------------------------------------||| Search for an item using a user-provided test-||| @ p the equality test-||| @ e the item to search for-||| @ xs the vector to search in-elemBy : (p : a -> a -> Bool) -> (e : a) -> (xs : Vect n a) -> Bool-elemBy p e [] = False-elemBy p e (x::xs) with (p e x)- | True = True- | False = elemBy p e xs--||| Use the default Boolean equality on elements to search for an item-||| @ x what to search for-||| @ xs where to search-elem : Eq a => (x : a) -> (xs : Vect n a) -> Bool-elem = elemBy (==)--||| Find the association of some key with a user-provided comparison-||| @ p the comparison operator for keys (True if they match)-||| @ e the key to look for-lookupBy : (p : a -> a -> Bool) -> (e : a) -> (xs : Vect n (a, b)) -> Maybe b-lookupBy p e [] = Nothing-lookupBy p e ((l, r)::xs) with (p e l)- | True = Just r- | False = lookupBy p e xs--||| Find the assocation of some key using the default Boolean equality test-lookup : Eq a => a -> Vect n (a, b) -> Maybe b-lookup = lookupBy (==)--||| Check if any element of xs is found in elems by a user-provided comparison-||| @ p the comparison operator-||| @ elems the vector to search-||| @ xs what to search for-hasAnyBy : (p : a -> a -> Bool) -> (elems : Vect m a) -> (xs : Vect n a) -> Bool-hasAnyBy p elems [] = False-hasAnyBy p elems (x::xs) with (elemBy p x elems)- | True = True- | False = hasAnyBy p elems xs--||| Check if any element of xs is found in elems using the default Boolean equality test-hasAny : Eq a => Vect m a -> Vect n a -> Bool-hasAny = hasAnyBy (==)------------------------------------------------------------------------------------- Searching with a predicate-----------------------------------------------------------------------------------||| Find the first element of the vector that satisfies some test-||| @ p the test to satisfy-find : (p : a -> Bool) -> (xs : Vect n a) -> Maybe a-find p [] = Nothing-find p (x::xs) with (p x)- | True = Just x- | False = find p xs--||| Find the index of the first element of the vector that satisfies some test-findIndex : (a -> Bool) -> Vect n a -> Maybe (Fin n)-findIndex p [] = Nothing-findIndex p (x :: xs) with (p x)- | True = Just 0- | False = map FS (findIndex p xs)--||| Find the indices of all elements that satisfy some test-total findIndices : (a -> Bool) -> Vect m a -> (p ** Vect p Nat)-findIndices = findIndices' 0- where- total findIndices' : Nat -> (a -> Bool) -> Vect m a -> (p ** Vect p Nat)- findIndices' cnt p [] = (_ ** [])- findIndices' cnt p (x::xs) with (findIndices' (S cnt) p xs)- | (_ ** tail) =- if p x then- (_ ** cnt::tail)- else- (_ ** tail)--elemIndexBy : (a -> a -> Bool) -> a -> Vect m a -> Maybe (Fin m)-elemIndexBy p e = findIndex $ p e--elemIndex : Eq a => a -> Vect m a -> Maybe (Fin m)-elemIndex = elemIndexBy (==)--total elemIndicesBy : (a -> a -> Bool) -> a -> Vect m a -> (p ** Vect p Nat)-elemIndicesBy p e = findIndices $ p e--total elemIndices : Eq a => a -> Vect m a -> (p ** Vect p Nat)-elemIndices = elemIndicesBy (==)------------------------------------------------------------------------------------- Filters-----------------------------------------------------------------------------------||| Find all elements of a vector that satisfy some test-total filter : (a -> Bool) -> Vect n a -> (p ** Vect p a)-filter p [] = ( _ ** [] )-filter p (x::xs) with (filter p xs)- | (_ ** tail) =- if p x then- (_ ** x::tail)- else- (_ ** tail)--||| Make the elements of some vector unique by some test-nubBy : (a -> a -> Bool) -> Vect n a -> (p ** Vect p a)-nubBy = nubBy' []- where- nubBy' : Vect m a -> (a -> a -> Bool) -> Vect n a -> (p ** Vect p a)- nubBy' acc p [] = (_ ** [])- nubBy' acc p (x::xs) with (elemBy p x acc)- | True = nubBy' acc p xs- | False with (nubBy' (x::acc) p xs)- | (_ ** tail) = (_ ** x::tail)--||| Make the elements of some vector unique by the default Boolean equality-nub : Eq a => Vect n a -> (p ** Vect p a)-nub = nubBy (==)--deleteBy : (a -> a -> Bool) -> a -> Vect n a -> (p ** Vect p a)-deleteBy _ _ [] = (_ ** [])-deleteBy eq x (y::ys) =- let (len ** zs) = deleteBy eq x ys- in if x `eq` y then (_ ** ys) else (S len ** y ::zs)--delete : (Eq a) => a -> Vect n a -> (p ** Vect p a)-delete = deleteBy (==)------------------------------------------------------------------------------------- Splitting and breaking lists-----------------------------------------------------------------------------------||| A tuple where the first element is a Vect of the n first elements and-||| the second element is a Vect of the remaining elements of the original Vect-||| It is equivalent to (take n xs, drop n xs)-||| @ n the index to split at-||| @ xs the Vect to split in two-splitAt : (n : Nat) -> (xs : Vect (n + m) a) -> (Vect n a, Vect m a)-splitAt n xs = (take n xs, drop n xs)--partition : (a -> Bool) -> Vect n a -> ((p ** Vect p a), (q ** Vect q a))-partition p [] = ((_ ** []), (_ ** []))-partition p (x::xs) =- let ((leftLen ** lefts), (rightLen ** rights)) = partition p xs in- if p x then- ((S leftLen ** x::lefts), (rightLen ** rights))- else- ((leftLen ** lefts), (S rightLen ** x::rights))------------------------------------------------------------------------------------- Predicates-----------------------------------------------------------------------------------isPrefixOfBy : (a -> a -> Bool) -> Vect m a -> Vect n a -> Bool-isPrefixOfBy p [] right = True-isPrefixOfBy p left [] = False-isPrefixOfBy p (x::xs) (y::ys) with (p x y)- | True = isPrefixOfBy p xs ys- | False = False--isPrefixOf : Eq a => Vect m a -> Vect n a -> Bool-isPrefixOf = isPrefixOfBy (==)--isSuffixOfBy : (a -> a -> Bool) -> Vect m a -> Vect n a -> Bool-isSuffixOfBy p left right = isPrefixOfBy p (reverse left) (reverse right)--isSuffixOf : Eq a => Vect m a -> Vect n a -> Bool-isSuffixOf = isSuffixOfBy (==)------------------------------------------------------------------------------------- Conversions-----------------------------------------------------------------------------------total maybeToVect : Maybe a -> (p ** Vect p a)-maybeToVect Nothing = (_ ** [])-maybeToVect (Just j) = (_ ** [j])--total vectToMaybe : Vect n a -> Maybe a-vectToMaybe [] = Nothing-vectToMaybe (x::xs) = Just x------------------------------------------------------------------------------------- Misc-----------------------------------------------------------------------------------catMaybes : Vect n (Maybe a) -> (p ** Vect p a)-catMaybes [] = (_ ** [])-catMaybes (Nothing::xs) = catMaybes xs-catMaybes ((Just j)::xs) with (catMaybes xs)- | (_ ** tail) = (_ ** j::tail)--diag : Vect n (Vect n a) -> Vect n a-diag [] = []-diag ((x::xs)::xss) = x :: diag (map tail xss)--range : Vect n (Fin n)-range {n=Z} = []-range {n=S _} = FZ :: map FS range--||| Transpose a Vect of Vects, turning rows into columns and vice versa.-|||-||| As the types ensure rectangularity, this is an involution, unlike `Prelude.List.transpose`.-transpose : Vect m (Vect n a) -> Vect n (Vect m a)-transpose [] = replicate _ []-transpose (x :: xs) = zipWith (::) x (transpose xs)------------------------------------------------------------------------------------- Applicative/Monad/Traversable-----------------------------------------------------------------------------------instance Applicative (Vect k) where- pure = replicate _-- fs <*> vs = zipWith apply fs vs--||| This monad is different from the List monad, (>>=)-||| uses the diagonal.-instance Monad (Vect n) where- m >>= f = diag (map f m)--instance Traversable (Vect n) where- traverse f [] = pure Vect.Nil- traverse f (x::xs) = [| Vect.(::) (f x) (traverse f xs) |]------------------------------------------------------------------------------------- Show-----------------------------------------------------------------------------------instance Show a => Show (Vect n a) where- show = show . toList------------------------------------------------------------------------------------- Properties-----------------------------------------------------------------------------------vectConsCong : (x : a) -> (xs : Vect n a) -> (ys : Vect m a) -> (xs = ys) -> (x :: xs = x :: ys)-vectConsCong x xs xs Refl = Refl--vectNilRightNeutral : (xs : Vect n a) -> xs ++ [] = xs-vectNilRightNeutral [] = Refl-vectNilRightNeutral (x :: xs) =- vectConsCong _ _ _ (vectNilRightNeutral xs)--vectAppendAssociative : (x : Vect xLen a) -> (y : Vect yLen a) -> (z : Vect zLen a) -> x ++ (y ++ z) = (x ++ y) ++ z-vectAppendAssociative [] y z = Refl-vectAppendAssociative (x :: xs) ys zs =- vectConsCong _ _ _ (vectAppendAssociative xs ys zs)--}------------------------------------------------------------------------------------- DecEq-----------------------------------------------------------------------------------total-vectInjective1 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> x = y-vectInjective1 {x=x} {y=x} {xs=xs} {ys=xs} Refl = Refl--total-vectInjective2 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> xs = ys-vectInjective2 {x=x} {y=x} {xs=xs} {ys=xs} Refl = Refl--instance DecEq a => DecEq (Vect n a) where- decEq [] [] = Yes Refl- decEq (x :: xs) (y :: ys) with (decEq x y)- decEq (x :: xs) (x :: ys) | Yes Refl with (decEq xs ys)- decEq (x :: xs) (x :: xs) | Yes Refl | Yes Refl = Yes Refl- decEq (x :: xs) (x :: ys) | Yes Refl | No neq = No (neq . vectInjective2)- decEq (x :: xs) (y :: ys) | No neq = No (neq . vectInjective1)--{- The following definition is elaborated in a wrong case-tree. Examination pending.-instance DecEq a => DecEq (Vect n a) where- decEq [] [] = Yes Refl- decEq (x :: xs) (y :: ys) with (decEq x y, decEq xs ys)- decEq (x :: xs) (x :: xs) | (Yes Refl, Yes Refl) = Yes Refl- decEq (x :: xs) (y :: ys) | (_, No nEqTl) = No (\p => nEqTl (vectInjective2 p))- decEq (x :: xs) (y :: ys) | (No nEqHd, _) = No (\p => nEqHd (vectInjective1 p))--}---- For the primitives, we have to cheat because we don't have access to their--- internal implementations.
libs/base/base.ipkg view
@@ -13,9 +13,9 @@ Data.Morphisms, Data.Bits, Data.Mod2,- Data.Fin, Data.Vect, Data.VectType,+ Data.Fin, Data.Vect, Data.HVect, Data.Vect.Quantifiers,- Data.Floats, Data.Complex,+ Data.Complex, Data.Erased, Data.List, Data.So,
libs/contrib/Classes/Verified.idr view
@@ -17,12 +17,10 @@ (g1 : a -> b) -> (g2 : b -> c) -> map (g2 . g1) x = (map g2 . map g1) x -- class (Applicative f, VerifiedFunctor f) => VerifiedApplicative (f : Type -> Type) where applicativeMap : (x : f a) -> (g : a -> b) -> map g x = pure g <*> x- applicativeIdentity : (x : f a) -> pure id <*> x = x+ applicativeIdentity : (x : f a) -> pure Basics.id <*> x = x applicativeComposition : (x : f a) -> (g1 : f (a -> b)) -> (g2 : f (b -> c)) -> ((pure (.) <*> g2) <*> g1) <*> x = g2 <*> (g1 <*> x) applicativeHomomorphism : (x : a) -> (g : a -> b) ->@@ -30,14 +28,13 @@ applicativeInterchange : (x : a) -> (g : f (a -> b)) -> g <*> pure x = pure (\g' : a -> b => g' x) <*> g - class (Monad m, VerifiedApplicative m) => VerifiedMonad (m : Type -> Type) where monadApplicative : (mf : m (a -> b)) -> (mx : m a) -> mf <*> mx = mf >>= \f => mx >>= \x => pure (f x) monadLeftIdentity : (x : a) -> (f : a -> m b) -> return x >>= f = f x- monadRightIdentity : (mx : m a) -> mx >>= return = mx+ monadRightIdentity : (mx : m a) -> mx >>= Monad.return = mx monadAssociativity : (mx : m a) -> (f : a -> m b) -> (g : b -> m c) -> (mx >>= f) >>= g = mx >>= (\x => f x >>= g) @@ -53,8 +50,8 @@ class (VerifiedSemigroup a, Monoid a) => VerifiedMonoid a where- total monoidNeutralIsNeutralL : (l : a) -> l <+> neutral = l- total monoidNeutralIsNeutralR : (r : a) -> neutral <+> r = r+ total monoidNeutralIsNeutralL : (l : a) -> l <+> Algebra.neutral = l+ total monoidNeutralIsNeutralR : (r : a) -> Algebra.neutral <+> r = r -- instance VerifiedMonoid Nat where -- monoidNeutralIsNeutralL = plusZeroRightNeutral@@ -65,8 +62,8 @@ monoidNeutralIsNeutralR xs = Refl class (VerifiedMonoid a, Group a) => VerifiedGroup a where- total groupInverseIsInverseL : (l : a) -> l <+> inverse l = neutral- total groupInverseIsInverseR : (r : a) -> inverse r <+> r = neutral+ total groupInverseIsInverseL : (l : a) -> l <+> inverse l = Algebra.neutral+ total groupInverseIsInverseR : (r : a) -> inverse r <+> r = Algebra.neutral class (VerifiedGroup a, AbelianGroup a) => VerifiedAbelianGroup a where total abelianGroupOpIsCommutative : (l, r : a) -> l <+> r = r <+> l@@ -77,12 +74,12 @@ total ringOpIsDistributiveR : (l, c, r : a) -> (l <+> c) <.> r = (l <.> r) <+> (c <.> r) class (VerifiedRing a, RingWithUnity a) => VerifiedRingWithUnity a where- total ringWithUnityIsUnityL : (l : a) -> l <.> unity = l- total ringWithUnityIsUnityR : (r : a) -> unity <.> r = r+ total ringWithUnityIsUnityL : (l : a) -> l <.> Algebra.unity = l+ total ringWithUnityIsUnityR : (r : a) -> Algebra.unity <.> r = r --class (VerifiedRingWithUnity a, Field a) => VerifiedField a where--- total fieldInverseIsInverseL : (l : a) -> (notId : Not (l = neutral)) -> l <.> (inverseM l notId) = unity--- total fieldInverseIsInverseR : (r : a) -> (notId : Not (r = neutral)) -> (inverseM r notId) <.> r = unity+-- total fieldInverseIsInverseL : (l : a) -> (notId : Not (l = neutral)) -> l <.> (inverseM l notId) = Algebra.unity+-- total fieldInverseIsInverseR : (r : a) -> (notId : Not (r = neutral)) -> (inverseM r notId) <.> r = Algebra.unity class JoinSemilattice a => VerifiedJoinSemilattice a where@@ -96,10 +93,10 @@ total meetSemilatticeMeetIsIdempotent : (e : a) -> meet e e = e class (VerifiedJoinSemilattice a, BoundedJoinSemilattice a) => VerifiedBoundedJoinSemilattice a where- total boundedJoinSemilatticeBottomIsBottom : (e : a) -> join e bottom = e+ total boundedJoinSemilatticeBottomIsBottom : (e : a) -> join e Algebra.bottom = e class (VerifiedMeetSemilattice a, BoundedMeetSemilattice a) => VerifiedBoundedMeetSemilattice a where- total boundedMeetSemilatticeTopIsTop : (e : a) -> meet e top = e+ total boundedMeetSemilatticeTopIsTop : (e : a) -> meet e Algebra.top = e class (VerifiedJoinSemilattice a, VerifiedMeetSemilattice a) => VerifiedLattice a where total latticeMeetAbsorbsJoin : (l, r : a) -> meet l (join l r) = l@@ -110,7 +107,7 @@ --class (VerifiedRingWithUnity a, VerifiedAbelianGroup b, Module a b) => VerifiedModule a b where -- total moduleScalarMultiplyComposition : (x,y : a) -> (v : b) -> x <#> (y <#> v) = (x <.> y) <#> v--- total moduleScalarUnityIsUnity : (v : b) -> unity {a} <#> v = v+-- total moduleScalarUnityIsUnity : (v : b) -> Algebra.unity {a} <#> v = v -- total moduleScalarMultDistributiveWRTVectorAddition : (s : a) -> (v, w : b) -> s <#> (v <+> w) = (s <#> v) <+> (s <#> w) -- total moduleScalarMultDistributiveWRTModuleAddition : (s, t : a) -> (v : b) -> (s <+> t) <#> v = (s <#> v) <+> (t <#> v)
libs/contrib/Control/Algebra.idr view
@@ -113,7 +113,7 @@ ||| forall a b c, a <.> (b <+> c) == (a <.> b) <+> (a <.> c) ||| forall a b c, (a <+> b) <.> c == (a <.> c) <+> (b <.> c) class RingWithUnity a => Field a where- inverseM : (x : a) -> Not (x = neutral) -> a+ inverseM : (x : a) -> Not (x = Algebra.neutral) -> a sum' : (Foldable t, Monoid a) => t a -> a sum' = concat
libs/contrib/Data/Matrix/Numeric.idr view
@@ -24,11 +24,14 @@ instance Num a => Num (Vect n a) where (+) = zipWith (+)- (-) = zipWith (+) (*) = zipWith (*)- abs = id fromInteger n = replicate _ (fromInteger n) +instance Neg a => Neg (Vect n a) where+ (-) = zipWith (-)+ abs = map abs+ negate = map negate+ ----------------------------------------------------------------------- -- Vector functions -----------------------------------------------------------------------@@ -88,7 +91,7 @@ (><) x y = col x <> row y ||| Matrix commutator-(<<>>) : Num a => Matrix n n a -> Matrix n n a -> Matrix n n a+(<<>>) : Neg a => Matrix n n a -> Matrix n n a -> Matrix n n a (<<>>) m1 m2 = (m1 <> m2) - (m2 <> m1) ||| Matrix anti-commutator@@ -112,17 +115,17 @@ ----------------------------------------------------------------------- ||| Alternating sum-altSum : Num a => Vect n a -> a+altSum : Neg a => Vect n a -> a altSum (x::y::zs) = (x - y) + altSum zs altSum [x] = x altSum [] = 0 ||| Determinant of a 2-by-2 matrix-det2 : Num a => Matrix 2 2 a -> a+det2 : Neg a => Matrix 2 2 a -> a det2 [[x1,x2],[y1,y2]] = x1*y2 - x2*y1 ||| Determinant of a square matrix-det : Num a => Matrix (S (S n)) (S (S n)) a -> a+det : Neg a => Matrix (S (S n)) (S (S n)) a -> a det {n} m = case n of Z => det2 m (S k) => altSum . map (\c => indices FZ c m * det (subMatrix FZ c m))
libs/contrib/Data/Nat/DivMod/IteratedSubtraction.idr view
@@ -47,7 +47,7 @@ ltToLTE (LTStep lt) = lteSuccRight $ ltToLTE lt ||| Subtraction gives a result that is actually smaller.-minusLT' : (x,y : Nat) -> x - y `LT'` S x+minusLT' : (x,y : Nat) -> minus x y `LT'` S x minusLT' Z y = LTSucc minusLT' (S k) Z = LTSucc minusLT' (S k) (S j) = LTStep (minusLT' k j)
libs/contrib/Data/ZZ.idr view
@@ -28,11 +28,6 @@ show (Pos n) = show n show (NegS n) = "-" ++ show (S n) -instance Neg ZZ where- negate (Pos Z) = Pos Z- negate (Pos (S n)) = NegS n- negate (NegS n) = Pos (S n)- negNat : Nat -> ZZ negNat Z = Pos Z negNat (S n) = NegS n@@ -51,10 +46,6 @@ plusZ (Pos n) (NegS m) = minusNatZ n (S m) plusZ (NegS n) (Pos m) = minusNatZ m (S n) -||| Subtract two `ZZ`s. Consider using `(-) {a=ZZ}`.-subZ : ZZ -> ZZ -> ZZ-subZ n m = plusZ n (negate m)- instance Eq ZZ where (Pos n) == (Pos m) = n == m (NegS n) == (NegS m) = n == m@@ -85,10 +76,22 @@ instance Num ZZ where (+) = plusZ- (-) = subZ (*) = multZ- abs = cast . absZ fromInteger = fromInt++mutual+ instance Neg ZZ where+ negate (Pos Z) = Pos Z+ negate (Pos (S n)) = NegS n+ negate (NegS n) = Pos (S n)+ + (-) = subZ+ abs = cast . absZ++ ||| Subtract two `ZZ`s. Consider using `(-) {a=ZZ}`.+ subZ : ZZ -> ZZ -> ZZ+ subZ n m = plusZ n (negate m)+ instance Cast ZZ Integer where cast (Pos n) = cast n
+ libs/effects/Effect/Logging/Category.idr view
@@ -0,0 +1,184 @@+-- ------------------------------------------------------------ [ Category.idr ]+-- Module : Category.idr+-- Copyright : (c) The Idris Community+-- License : see LICENSE+-- --------------------------------------------------------------------- [ EOH ]+||| A logging effect that allows messages to be logged using both+||| numerical levels and user specified categories. The higher the+||| logging level the grater in verbosity the logging.+|||+||| In this effect the resource we are computing over is the logging+||| level itself and the list of categories to show.+module Effect.Logging.Category++import Effects+import public Effect.Logging.Level++%access public++-- -------------------------------------------------------- [ Logging Resource ]++||| The Logging details, this is the resource that the effect is+||| defined over.+record LogRes (a : Type) where+ constructor MkLogRes+ getLevel : LogLevel n+ getCategories : List a++instance (Show a) => Show (LogRes a) where+ show (MkLogRes l cs) = unwords ["Log Settings:", show l, show cs]++instance Default (LogRes a) where+ default = MkLogRes OFF Nil++-- ------------------------------------------------------- [ Effect Definition ]++||| A Logging effect to log levels and categories.+data Logging : Effect where+ ||| Log a message.+ |||+ ||| @lvl The logging level it should appear at.+ ||| @cats The categories it should appear under.+ ||| @msg The message to log.+ Log : (Show a, Eq a) =>+ (lvl : LogLevel n)+ -> (cats : List a)+ -> (msg : String)+ -> sig Logging () (LogRes a)++ ||| Change the logging level.+ |||+ ||| @nlvl The new logging level+ SetLogLvl : (Show a, Eq a) =>+ (nlvl : LogLevel n) ->+ sig Logging () (LogRes a) (LogRes a)++ ||| Change the categories to show.+ |||+ ||| @ncats The new categories.+ SetLogCats : (Show a, Eq a) =>+ (ncats : List a) ->+ sig Logging () (LogRes a) (LogRes a)++ ||| Initialise the logging.+ |||+ ||| @nlvl The new logging level.+ ||| @ncats The categories to show.+ InitLogger : (Show a, Eq a) =>+ (nlvl : LogLevel n) ->+ (ncats : List a) ->+ sig Logging () (LogRes a) (LogRes a)++-- -------------------------------------------------------------- [ IO Handler ]++instance Handler Logging IO where+ handle st (SetLogLvl nlvl) k = do+ let newSt = record {getLevel = nlvl} st+ k () newSt+ handle st (SetLogCats newcs) k = do+ let newSt = record {getCategories = newcs} st+ k () newSt++ handle st (InitLogger l cs) k = do+ let newSt = MkLogRes l cs+ k () newSt++ handle st (Log l cs' msg) k = do+ case cmpLevel l (getLevel st) of+ GT => k () st+ otherwise => do+ let res = and $ map (\x => elem x cs') (getCategories st)+ let prompt = if isNil (getCategories st)+ then unwords [show l, ":"]+ else unwords [show l, ":", show (getCategories st), ":"]+ if res || isNil (getCategories st)+ then do+ putStrLn $ unwords [prompt, msg]+ k () st+ else k () st+++-- ------------------------------------------------------- [ Effect Descriptor ]++||| The Logging effect.+|||+||| @a The type used to differentiate categories.+LOG : (a : Type) -> EFFECT+LOG a = MkEff (LogRes a) Logging++-- ----------------------------------------------------------- [ Effectful API ]++||| Change the logging level.+|||+||| @l The new logging level.+setLoglvl : (Show a, Eq a) => (l : LogLevel n) -> Eff () [LOG a]+setLoglvl l = call $ SetLogLvl l++||| Change the categories to show.+|||+||| @cs The new categories.+setLogCats : (Show a, Eq a) => (cs : List a) -> Eff () [LOG a]+setLogCats cs = call $ SetLogCats cs++||| Initialise the Logger.+|||+||| @l The logging level.+||| @cs The categories to show.+initLogger : (Show a, Eq a) => (l : LogLevel n)+ -> (cs : List a)+ -> Eff () [LOG a]+initLogger l cs = call $ InitLogger l cs++||| Log the given message at the given level indicated by a natural number and assign it the list of categories.+|||+||| @l The logging level.+||| @cs The logging categories.+||| @m THe message to be logged.+log : (Show a, Eq a) => (l : LogLevel n)+ -> (cs : List a)+ -> (m : String)+ -> Eff () [LOG a]+log l cs msg = call $ Log l cs msg++||| Log the given message at the given level indicated by a natural number and assign it the list of categories.+|||+||| @l The logging level.+||| @cs The logging categories.+||| @m THe message to be logged.+logN : (Show a, Eq a) => (l : Nat)+ -> {auto prf : LTE l 70}+ -> (cs : List a)+ -> (m : String)+ -> Eff () [LOG a]+logN l cs msg = call $ Log (getProof lvl) cs msg+ where+ lvl : (n ** LogLevel n)+ lvl = case cast {to=String} (cast {to=Int} l) of+ "0" => (_ ** OFF)+ "10" => (_ ** TRACE)+ "20" => (_ ** DEBUG)+ "30" => (_ ** INFO)+ "40" => (_ ** WARN)+ "50" => (_ ** FATAL)+ "60" => (_ ** ERROR)+ _ => (_ ** CUSTOM l)++trace : (Show a, Eq a) => List a -> String -> Eff () [LOG a]+trace cs msg = call $ Log TRACE cs msg++debug : (Show a, Eq a) => List a -> String -> Eff () [LOG a]+debug cs msg = call $ Log DEBUG cs msg++info : (Show a, Eq a) => List a -> String -> Eff () [LOG a]+info cs msg = call $ Log INFO cs msg++warn : (Show a, Eq a) => List a -> String -> Eff () [LOG a]+warn cs msg = call $ Log WARN cs msg++fatal : (Show a, Eq a) => List a -> String -> Eff () [LOG a]+fatal cs msg = call $ Log FATAL cs msg++error : (Show a, Eq a) => List a -> String -> Eff () [LOG a]+error cs msg = call $ Log ERROR cs msg++-- --------------------------------------------------------------------- [ EOF ]
libs/effects/Effect/Logging/Default.idr view
@@ -2,56 +2,117 @@ -- Module : Default.idr -- Copyright : (c) The Idris Community -- License : see LICENSE--- --------------------------------------------------------------------- [ EOH ]--||| A logging effect that allows messages to be logged using both-||| numerical levels and user specified categories. The higher the-||| logging level the grater in verbosity the logging.+--------------------------------------------------------------------- [ EOH ]+||| The default logging effect that allows messages to be logged at+||| different numerical levels. The higher the number the greater in+||| verbosity the logging. ||| ||| In this effect the resource we are computing over is the logging-||| level itself and the list of categories to show.+||| level itself. ||| module Effect.Logging.Default import Effects import public Effect.Logging.Level -import Control.IOExcept -- TODO Add IOExcept Logger.+%access public -||| A Logging effect to log levels and categories.+-- ------------------------------------------------------------ [ The Resource ]++||| The resource that the log effect is defined over.+record LogRes where+ constructor MkLogRes+ getLevel : LogLevel n++instance Default LogRes where+ default = MkLogRes OFF++-- ------------------------------------------------------ [ The Logging Effect ]++||| A Logging effect that displays a logging message to be logged at a+||| certain level. data Logging : Effect where- Log : (Eq a, Show a) =>- (lvl : Nat)- -> (cats : List a)+ ||| Change the logging level.+ |||+ ||| @lvl The new logging level.+ SetLvl : (lvl : LogLevel n)+ -> sig Logging () (LogRes) (LogRes)++ ||| Log a message.+ |||+ ||| @lvl The logging level it should appear at.+ ||| @msg The message to log.+ Log : (lvl : LogLevel n) -> (msg : String)- -> Logging () (Nat,List a) (\v => (Nat,List a))+ -> sig Logging () (LogRes) -||| The Logging effect.-|||-||| @cTy The type used to differentiate categories.-LOG : (cTy : Type) -> EFFECT-LOG a = MkEff (Nat, List a) Logging+-- -------------------------------------------------------------- [ IO Handler ] +-- For logging in the IO context instance Handler Logging IO where- handle (l,cs) (Log lvl cs' msg) k = do- case lvl <= l of- False => k () (l,cs)- True => do- let res = and $ map (\x => elem x cs') cs- let prompt = if isNil cs then "" else show cs- if res || isNil cs- then do- printLn $ unwords [show lvl, ":", prompt, ":", msg]- k () (l,cs)- else k () (l,cs)+ handle st (SetLvl newLvl) k = k () (MkLogRes newLvl)+ handle st (Log lvl msg) k = do+ case cmpLevel lvl (getLevel st) of+ GT => k () st+ otherwise => do+ putStrLn $ unwords [show lvl, ":", msg]+ k () st -||| Log the given message at the given level and assign it the list of categories.+-- ------------------------------------------------------- [ Effect Descriptor ]++||| A Logging Effect.+LOG : EFFECT+LOG = MkEff (LogRes) Logging++-- ----------------------------------------------------------- [ Effectful API ]++||| Set the logging level. |||-||| @l The logging level.-||| @cs The logging categories.-||| @m THe message to be logged.-log : (Show a, Eq a) => (l : Nat)- -> (cs : List a) -> (m : String) -> Eff () [LOG a]-log lvl cs msg = call $ Log lvl cs msg+||| @l The new logging level.+setLogLvl : (l : LogLevel n) -> Eff () [LOG]+setLogLvl l = call $ SetLvl l++||| Log `msg` at the given level specified as a natural number.+|||+||| @l The level to log.+||| @m The message to log.+log : (l : LogLevel n) -> (m : String) -> Eff () [LOG]+log l msg = call $ Log l msg++||| Log `msg` at the given level specified as a natural number.+|||+||| @l The level to log.+||| @m The message to log.+logN : (l : Nat) -> {auto prf : LTE l 70} -> (m : String) -> Eff () [LOG]+logN l msg = call $ Log (getProof lvl) msg+ where+ lvl : (n ** LogLevel n)+ lvl = case cast {to=String} (cast {to=Int} l) of+ "0" => (_ ** OFF)+ "10" => (_ ** TRACE)+ "20" => (_ ** DEBUG)+ "30" => (_ ** INFO)+ "40" => (_ ** WARN)+ "50" => (_ ** FATAL)+ "60" => (_ ** ERROR)+ _ => (_ ** CUSTOM l)++trace : String -> Eff () [LOG]+trace msg = call $ Log TRACE msg++debug : String -> Eff () [LOG]+debug msg = call $ Log DEBUG msg++info : String -> Eff () [LOG]+info msg = call $ Log INFO msg++warn : String -> Eff () [LOG]+warn msg = call $ Log WARN msg++fatal : String -> Eff () [LOG]+fatal msg = call $ Log FATAL msg++error : String -> Eff () [LOG]+error msg = call $ Log ERROR msg -- --------------------------------------------------------------------- [ EOF ]
libs/effects/Effect/Logging/Level.idr view
@@ -1,49 +1,81 @@--- -------------------------------------------------------------- [ Levels.idr ]--- Module : Levels.idr--- Copyright : (c) Jan de Muijnck-Hughes+-- --------------------------------------------------------------- [ Level.idr ]+-- Module : Level.idr+-- Copyright : (c) The Idris Community -- License : see LICENSE -- --------------------------------------------------------------------- [ EOH ]-||| Common aliases and definitions of Logging Levels.+||| A dependently typed logging level representation where logging+||| levels are based on a Natural number range [0,70].+|||+||| The `LogLevel` type allows for semantic constructors to be used+||| for the majority of logging levels, with an option for custom+||| levels to be defined.+|||+||| The logging level design comes from the Log4j/Python family of+||| loggers. module Effect.Logging.Level %access public--- ---------------------------------------------- [ Nat Derived Logging Levels ]------ Several aliases have been defined to aide in semantic use of the--- logging levels. These aliases have come from the Log4j family of--- loggers.+%default total -||| No events will be logged.-OFF : Nat-OFF = 0+-- ---------------------------------------------------- [ Log Level Definition ] -||| A severe error that will prevent the application from continuing.-FATAL : Nat-FATAL = 1+||| Logging levels are natural numbers wrapped in a data type for+||| convenience.+|||+||| Several aliases have been defined to aide in semantic use of the+||| logging levels. These aliases have come from the Log4j/Python+||| family of loggers.+data LogLevel : Nat -> Type where+ ||| Log No Events+ OFF : LogLevel 0 -||| An error in the application, possibly recoverable.-ERROR : Nat-ERROR = 2+ ||| A fine-grained debug message, typically capturing the flow through+ ||| the application.+ TRACE : LogLevel 10 -||| An event that might possible lead to an error.-WARN : Nat-WARN = 3+ ||| A general debugging event.+ DEBUG : LogLevel 20 -||| An event for informational purposes.-INFO : Nat-INFO = 4+ ||| An event for informational purposes.+ INFO : LogLevel 30 -||| A general debugging event.-DEBUG : Nat-DEBUG = 5+ ||| An event that might possible lead to an error.+ WARN : LogLevel 40 -||| A fine-grained debug message, typically capturing the flow through-||| the application.-TRACE : Nat-TRACE = 6+ ||| An error in the application, possibly recoverable.+ ERROR : LogLevel 50 -||| All events should be logged.-ALL : Nat-ALL = 7+ ||| A severe error that will prevent the application from continuing.+ FATAL : LogLevel 60++ ||| All events should be logged.+ ALL : LogLevel 70++ ||| User defined logging level.+ CUSTOM : (n : Nat) -> {auto prf : LTE n 70} -> LogLevel n++instance Cast (LogLevel n) Nat where+ cast {n} _ = n++instance Show (LogLevel n) where+ show OFF = "OFF"+ show TRACE = "TRACE"+ show DEBUG = "DEBUG"+ show INFO = "INFO"+ show WARN = "WARN"+ show FATAL = "FATAL"+ show ERROR = "ERROR"+ show ALL = "ALL"+ show (CUSTOM n) = unwords ["CUSTOM", show n]++instance Eq (LogLevel n) where+ (==) x y = lvlEq x y+ where+ lvlEq : LogLevel a -> LogLevel b -> Bool+ lvlEq {a} {b} _ _ = a == b++||| Compare to logging levels.+cmpLevel : LogLevel a -> LogLevel b -> Ordering+cmpLevel {a} {b} _ _ = compare a b -- --------------------------------------------------------------------- [ EOF ]
− libs/effects/Effect/Logging/Simple.idr
@@ -1,48 +0,0 @@--- -------------------------------------------------------------- [ Simple.idr ]--- Module : Logging.idr--- Copyright : (c) The Idris Community--- License : see LICENSE---------------------------------------------------------------------- [ EOH ]--||| A simple logging effect that allows messages to be logged at-||| different numerical level. The higher the number the grater in-||| verbosity the logging.-|||-||| In this effect the resource we are computing over is the logging-||| level itself.-|||-module Effect.Logging.Simple--import Effects-import public Effect.Logging.Level--import Control.IOExcept -- TODO Add IO Logging Handler--||| A Logging effect that displays a logging message to be logged at a-||| certain level.-data Logging : Effect where- Log : (lvl : Nat)- -> (msg : String)- -> Logging () Nat (\v => Nat)--||| A Logging Effect.-LOG : EFFECT-LOG = MkEff Nat Logging---- For logging in the IO context-instance Handler Logging IO where- handle l (Log lvl msg) k = do- case lvl <= l of- False => k () l- True => do- printLn $ unwords [show lvl, ":", msg]- k () l--||| Log `msg` at the given level.-|||-||| @l The level to log.-||| @m The message to log.-log : (l : Nat) -> (m : String) -> Eff () [LOG]-log lvl msg = call $ Log lvl msg---- --------------------------------------------------------------------- [ EOF ]
libs/effects/Effects.idr view
@@ -25,7 +25,7 @@ MkEff : Type -> Effect -> EFFECT -- 'sig' gives the signature for an effect. There are four versions--- depending on whether there is no resource needed, +-- depending on whether there is no resource needed, -- no state change, a non-dependent change, -- or a dependent change. These are easily disambiguated by type. @@ -42,7 +42,7 @@ sig e r e_in e_out = e r e_in (\v => e_out) namespace DepUpdateEffect- sig : Effect -> + sig : Effect -> (ret : Type) -> (res_in : Type) -> (res_out : ret -> Type) -> Type sig e r e_in e_out = e r e_in e_out @@ -193,17 +193,17 @@ Eff : (x : Type) -> (es : List EFFECT) -> (ce : List EFFECT) -> Type Eff x es ce = {m : Type -> Type} -> EffM m x es (\_ => ce) - EffT : (m : Type -> Type) -> + EffT : (m : Type -> Type) -> (x : Type) -> (es : List EFFECT) -> (ce : List EFFECT) -> Type EffT m x es ce = EffM m x es (\_ => ce) namespace DepEff -- Dependent effects, updates dependent on result- Eff : (x : Type) -> (es : List EFFECT) + Eff : (x : Type) -> (es : List EFFECT) -> (ce : x -> List EFFECT) -> Type Eff x es ce = {m : Type -> Type} -> EffM m x es ce - EffT : (m : Type -> Type) -> (x : Type) -> (es : List EFFECT) + EffT : (m : Type -> Type) -> (x : Type) -> (es : List EFFECT) -> (ce : x -> List EFFECT) -> Type EffT m x es ce = EffM m x es ce @@ -269,7 +269,7 @@ eff env (liftP prf effP) k = let env' = dropEnv env prf in eff env' effP (\p', envk => k p' (rebuildEnv envk prf env))-eff env (new (MkEff resTy newEff) res {prf=Refl} effP) k +eff env (new (MkEff resTy newEff) res {prf=Refl} effP) k = eff (res :: env) effP (\p', (val :: envk) => k p' envk) -- FIXME: -- xs is needed explicitly because otherwise the pattern binding for@@ -313,7 +313,7 @@ ||| ||| @prog The effectful program to run. %no_implicit-run : Applicative m => +run : Applicative m => (prog : EffM m a xs xs') -> {default MkDefaultEnv env : Env m xs} -> m a run prog {env} = eff env prog (\r, env => pure r)@@ -325,8 +325,8 @@ ||| ||| @prog The effectful program to run. %no_implicit-runPure : (prog : EffM id a xs xs') -> - {default MkDefaultEnv env : Env id xs} -> a +runPure : (prog : EffM Basics.id a xs xs') ->+ {default MkDefaultEnv env : Env Basics.id xs} -> a runPure prog {env} = eff env prog (\r, env => r) ||| Run an effectful program in a given context `m` with a default value for the environment.@@ -346,7 +346,7 @@ ||| @env The environment to use. ||| @prog The effectful program to run. %no_implicit-runPureInit : (env : Env id xs) -> (prog : EffM id a xs xs') -> a+runPureInit : (env : Env Basics.id xs) -> (prog : EffM Basics.id a xs xs') -> a runPureInit env prog = eff env prog (\r, env => r) %no_implicit
libs/effects/effects.ipkg view
@@ -16,5 +16,5 @@ , Effect.System , Effect.Trans , Effect.Logging.Level- , Effect.Logging.Simple , Effect.Logging.Default+ , Effect.Logging.Category
libs/prelude/Prelude.idr view
@@ -27,6 +27,7 @@ import public Prelude.Show import public Prelude.Interactive import public Prelude.File+import public Prelude.Doubles import public Decidable.Equality import public Language.Reflection import public Language.Reflection.Errors@@ -134,10 +135,10 @@ total natEnumFromThen : Nat -> Nat -> Stream Nat natEnumFromThen n inc = n :: natEnumFromThen (inc + n) inc total natEnumFromTo : Nat -> Nat -> List Nat-natEnumFromTo n m = map (plus n) (natRange ((S m) - n))+natEnumFromTo n m = map (plus n) (natRange (minus (S m) n)) total natEnumFromThenTo : Nat -> Nat -> Nat -> List Nat natEnumFromThenTo _ Z _ = []-natEnumFromThenTo n (S inc) m = map (plus n . (* (S inc))) (natRange (S (divNatNZ (m - n) (S inc) SIsNotZ)))+natEnumFromThenTo n (S inc) m = map (plus n . (* (S inc))) (natRange (S (divNatNZ (minus m n) (S inc) SIsNotZ))) class Enum a where total pred : a -> a
libs/prelude/Prelude/Cast.idr view
@@ -3,7 +3,7 @@ import Prelude.Bool import public Builtins -||| Type class for transforming a instance of a data type to another type.+||| Type class for transforming an instance of a data type to another type. class Cast from to where ||| Perform a cast operation. |||
libs/prelude/Prelude/Chars.idr view
@@ -7,16 +7,16 @@ import Prelude.Cast import Builtins -||| Return the ASCII representation of the character.+||| Convert the number to its ASCII equivalent. chr : Int -> Char-chr x = if (x >= 0 && x < 0x11000)+chr x = if (x >= 0 && x < 0x110000) then assert_total (prim__intToChar x) else '\0' instance Cast Int Char where cast = chr -||| Convert the number to its ASCII equivalent.+||| Return the ASCII representation of the character. ord : Char -> Int ord x = prim__charToInt x
libs/prelude/Prelude/Classes.idr view
@@ -71,6 +71,12 @@ GT == GT = True _ == _ = False +||| Compose two comparisons into the lexicographic product+thenCompare : Ordering -> Lazy Ordering -> Ordering+thenCompare LT y = LT+thenCompare EQ y = y+thenCompare GT y = GT+ ||| The Ord class defines comparison operations on ordered data types. class Eq a => Ord a where compare : a -> a -> Ordering@@ -143,85 +149,78 @@ then compare xl yl else compare xr yr --- --------------------------------------------------------- [ Negatable Class ]-||| The `Neg` class defines unary negation (-).-class Neg a where- ||| The underlying implementation of unary minus. `-5` desugars to `negate (fromInteger 5)`.- negate : a -> a--instance Neg Integer where- negate x = prim__subBigInt 0 x--instance Neg Int where- negate x = prim__subInt 0 x--instance Neg Float where- negate x = prim__negFloat x- -- --------------------------------------------------------- [ Numerical Class ] ||| The Num class defines basic numerical arithmetic. class Num a where (+) : a -> a -> a- (-) : a -> a -> a (*) : a -> a -> a- ||| Absolute value- abs : a -> a ||| Conversion from Integer. fromInteger : Integer -> a instance Num Integer where (+) = prim__addBigInt- (-) = prim__subBigInt (*) = prim__mulBigInt - abs x = if x < 0 then -x else x fromInteger = id instance Num Int where (+) = prim__addInt- (-) = prim__subInt (*) = prim__mulInt fromInteger = prim__truncBigInt_Int- abs x = if x < (prim__truncBigInt_Int 0) then -x else x instance Num Float where (+) = prim__addFloat- (-) = prim__subFloat (*) = prim__mulFloat - abs x = if x < (prim__toFloatBigInt 0) then -x else x fromInteger = prim__toFloatBigInt instance Num Bits8 where (+) = prim__addB8- (-) = prim__subB8 (*) = prim__mulB8- abs = id fromInteger = prim__truncBigInt_B8 instance Num Bits16 where (+) = prim__addB16- (-) = prim__subB16 (*) = prim__mulB16- abs = id fromInteger = prim__truncBigInt_B16 instance Num Bits32 where (+) = prim__addB32- (-) = prim__subB32 (*) = prim__mulB32- abs = id fromInteger = prim__truncBigInt_B32 instance Num Bits64 where (+) = prim__addB64- (-) = prim__subB64 (*) = prim__mulB64- abs = id fromInteger = prim__truncBigInt_B64 +-- --------------------------------------------------------- [ Negatable Class ]+||| The `Neg` class defines operations on numbers which can be negative.+class Num a => Neg a where+ ||| The underlying implementation of unary minus. `-5` desugars to `negate (fromInteger 5)`.+ negate : a -> a+ (-) : a -> a -> a+ ||| Absolute value+ abs : a -> a++instance Neg Integer where+ negate x = prim__subBigInt 0 x+ (-) = prim__subBigInt+ abs x = if x < 0 then -x else x++instance Neg Int where+ negate x = prim__subInt 0 x+ (-) = prim__subInt+ abs x = if x < (prim__truncBigInt_Int 0) then -x else x++instance Neg Float where+ negate x = prim__negFloat x+ (-) = prim__subFloat+ abs x = if x < (prim__toFloatBigInt 0) then -x else x++-- ------------------------------------------------------------ instance Eq Bits8 where x == y = intToBool (prim__eqB8 x y)
+ libs/prelude/Prelude/Doubles.idr view
@@ -0,0 +1,63 @@+module Prelude.Doubles ++import Builtins+import Prelude.Classes++%access public+%default total++%include C "math.h"+%lib C "m"++pi : Double+pi = 3.14159265358979323846 ++euler : Double+euler = 2.7182818284590452354++exp : Double -> Double+exp x = prim__floatExp x++log : Double -> Double+log x = prim__floatLog x++sin : Double -> Double+sin x = prim__floatSin x++cos : Double -> Double+cos x = prim__floatCos x++tan : Double -> Double+tan x = prim__floatTan x++asin : Double -> Double+asin x = prim__floatASin x++acos : Double -> Double+acos x = prim__floatACos x++atan : Double -> Double+atan x = prim__floatATan x++atan2 : Double -> Double -> Double+atan2 y x = atan (y/x)++sinh : Double -> Double+sinh x = (exp x - exp (-x)) / 2++cosh : Double -> Double+cosh x = (exp x + exp (-x)) / 2++tanh : Double -> Double+tanh x = sinh x / cosh x++sqrt : Double -> Double+sqrt x = prim__floatSqrt x++floor : Double -> Double+floor x = prim__floatFloor x++ceiling : Double -> Double+ceiling x = prim__floatCeil x++
libs/prelude/Prelude/List.idr view
@@ -52,13 +52,12 @@ ||| The proof that a cons cell is non-empty IsNonEmpty : NonEmpty (x :: xs) -private-nonEmptyNil : NonEmpty [] -> Void-nonEmptyNil IsNonEmpty impossible+instance Uninhabited (NonEmpty []) where+ uninhabited IsNonEmpty impossible ||| Decide whether a list is non-empty nonEmpty : (xs : List a) -> Dec (NonEmpty xs)-nonEmpty [] = No nonEmptyNil+nonEmpty [] = No absurd nonEmpty (x :: xs) = Yes IsNonEmpty ||| Satisfiable if `k` is a valid index into `xs`
libs/prelude/Prelude/Nat.idr view
@@ -180,6 +180,9 @@ toIntNat' Z x = x toIntNat' (S n) x = toIntNat' n (x + 1) +(-) : (m : Nat) -> (n : Nat) -> {auto smaller : LTE n m} -> Nat+(-) m n {smaller} = minus m n+ -------------------------------------------------------------------------------- -- Type class instances --------------------------------------------------------------------------------@@ -200,11 +203,8 @@ instance Num Nat where (+) = plus- (-) = minus (*) = mult - abs x = x- fromInteger = fromIntegerNat instance MinBound Nat where@@ -307,7 +307,7 @@ if lte centre right then centre else- mod' left (centre - (S right)) right+ mod' left (minus centre (S right)) right partial modNat : Nat -> Nat -> Nat@@ -323,7 +323,7 @@ if lte centre right then Z else- S (div' left (centre - (S right)) right)+ S (div' left (minus centre (S right)) right) partial divNat : Nat -> Nat -> Nat@@ -544,34 +544,34 @@ -- Minus total minusSuccSucc : (left : Nat) -> (right : Nat) ->- (S left) - (S right) = left - right+ minus (S left) (S right) = minus left right minusSuccSucc left right = Refl -total minusZeroLeft : (right : Nat) -> 0 - right = Z+total minusZeroLeft : (right : Nat) -> minus 0 right = Z minusZeroLeft right = Refl -total minusZeroRight : (left : Nat) -> left - 0 = left+total minusZeroRight : (left : Nat) -> minus left 0 = left minusZeroRight Z = Refl minusZeroRight (S left) = Refl -total minusZeroN : (n : Nat) -> Z = n - n+total minusZeroN : (n : Nat) -> Z = minus n n minusZeroN Z = Refl minusZeroN (S n) = minusZeroN n -total minusOneSuccN : (n : Nat) -> S Z = (S n) - n+total minusOneSuccN : (n : Nat) -> S Z = minus (S n) n minusOneSuccN Z = Refl minusOneSuccN (S n) = minusOneSuccN n -total minusSuccOne : (n : Nat) -> S n - 1 = n+total minusSuccOne : (n : Nat) -> minus (S n) 1 = n minusSuccOne Z = Refl minusSuccOne (S n) = Refl -total minusPlusZero : (n : Nat) -> (m : Nat) -> n - (n + m) = Z+total minusPlusZero : (n : Nat) -> (m : Nat) -> minus n (n + m) = Z minusPlusZero Z m = Refl minusPlusZero (S n) m = minusPlusZero n m total minusMinusMinusPlus : (left : Nat) -> (centre : Nat) -> (right : Nat) ->- left - centre - right = left - (centre + right)+ minus (minus left centre) right = minus left (centre + right) minusMinusMinusPlus Z Z right = Refl minusMinusMinusPlus (S left) Z right = Refl minusMinusMinusPlus Z (S centre) right = Refl@@ -581,7 +581,7 @@ Refl total plusMinusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) ->- (left + right) - (left + right') = right - right'+ minus (left + right) (left + right') = minus right right' plusMinusLeftCancel Z right right' = Refl plusMinusLeftCancel (S left) right right' = let inductiveHypothesis = plusMinusLeftCancel left right right' in@@ -589,7 +589,7 @@ Refl total multDistributesOverMinusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) ->- (left - centre) * right = (left * right) - (centre * right)+ (minus left centre) * right = minus (left * right) (centre * right) multDistributesOverMinusLeft Z Z right = Refl multDistributesOverMinusLeft (S left) Z right = rewrite (minusZeroRight (plus right (mult left right))) in Refl@@ -601,7 +601,7 @@ Refl total multDistributesOverMinusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->- left * (centre - right) = (left * centre) - (left * right)+ left * (minus centre right) = minus (left * centre) (left * right) multDistributesOverMinusRight left centre right = rewrite multCommutative left (minus centre right) in rewrite multDistributesOverMinusLeft centre right left in@@ -658,7 +658,7 @@ predSucc n = Refl total minusSuccPred : (left : Nat) -> (right : Nat) ->- left - (S right) = pred (left - right)+ minus left (S right) = pred (minus left right) minusSuccPred Z right = Refl minusSuccPred (S left) Z = rewrite minusZeroRight left in Refl
libs/prelude/Prelude/Strings.idr view
@@ -308,12 +308,15 @@ length = fromInteger . prim__zextInt_BigInt . prim_lenString ||| Returns a substring of a given string-||| @index The (zero based) index of the string to extract. If this is-||| beyond the end of the String, the function returns the empty string.-||| @len The desired length of the substring. Truncated if this exceeds-||| the length of the input.-substr : (index : Nat) -> (len : Nat) -> String -> String-substr i len = pack . List.take len . drop i . unpack+|||+||| @ index The (zero based) index of the string to extract. If this is+||| beyond the end of the string, the function returns the empty+||| string.+||| @ len The desired length of the substring. Truncated if this exceeds+||| the length of the input.+||| @ subject The string to return a portion of+substr : (index : Nat) -> (len : Nat) -> (subject : String) -> String+substr i len subject = prim__strSubstr (cast i) (cast len) subject ||| Lowercases all characters in the string. |||
libs/prelude/prelude.ipkg view
@@ -9,7 +9,7 @@ Prelude.Strings, Prelude.Chars, Prelude.Show, Prelude.Functor, Prelude.Foldable, Prelude.Traversable, Prelude.Bits, Prelude.Stream, Prelude.Uninhabited, Prelude.Pairs, Prelude.Providers,- Prelude.Interactive, Prelude.File,+ Prelude.Interactive, Prelude.File, Prelude.Doubles, Language.Reflection, Language.Reflection.Errors, Language.Reflection.Elab,
+ man/idris.1 view
@@ -0,0 +1,94 @@+.\" Manpage for Idris.+.\" Contact <> to correct errors or typos.+.TH man 1 "06 August 2014" "0.9.14.1" "Idris man page"+.SH NAME+idris -\ a general purpose pure functional programming language with dependent types.+.SH SYNOPSIS+idris [ options] [FILES]+.SH DESCRIPTION+Idris is a general purpose pure functional programming language with+dependent types. Dependent types allow types to be predicated on+values, meaning that some aspects of a program’s behaviour can be+specified precisely in the type. It is compiled, with eager+evaluation. Its features are influenced by Haskell and ML.+++ Full dependent types with dependent pattern matching+++ where clauses, with rule, simple case expressions+++ pattern matching let and lambda bindings+++ Type classes, monad comprehensions+++ do notation, idiom brackets+++ syntactic conveniences for lists, tuples, dependent pairs+++ Totality checking+++ Coinductive types+++ Indentation significant syntax, extensible syntax+++ Tactic based theorem proving (influenced by Coq)+++ Cumulative universes+++ Simple foreign function interface (to C)+++ Hugs style interactive environment++It is important to note that Idris is first and foremost a research tool+and project. Thus the tooling provided and resulting programs created+should not necessarily be seen as production ready nor for industrial use.++.SH OPTIONS+ --nobanner Suppress the banner+ -q,--quiet Quiet verbosity+ --log LEVEL Debugging log level+ -o,--output FILE Specify output file+ --total Require functions to be total by default+ --warnpartial Warn about undeclared partial functions+ --warnreach Warn about reachable but inaccessible arguments+ --link Display link flags+ --libdir Display library directory+ --include Display the includes flags+ -V,--verbose Loud verbosity+ --ibcsubdir FILE Write IBC files into sub directory+ -i,--idrispath ARG Add directory to the list of import paths+ --build IPKG Build package+ --install IPKG Install package+ --clean IPKG Clean package+ --mkdoc IPKG Generate IdrisDoc for package+ --checkpkg IPKG Check package only+ --testpkg IPKG Run tests for package+ -S,--codegenonly Do no further compilation of code generator output+ -c,--compileonly Compile to object files rather than an executable+ --mvn Create a maven project (for Java codegen)+ --codegen TARGET Select code generator: C, Java, bytecode+ -e,--eval EXPR Evaluate an expression without loading the REPL+ --execute Execute as idris+ --exec EXPR Execute as idris+ -X,--extension EXT Turn on language extension (TypeProviders or+ ErrorReflection)+ --target TRIPLE Select target triple (for llvm codegen)+ --cpu CPU Select target CPU e.g. corei7 or cortex-m3 (for LLVM+ codegen)+ --color,--colour Force coloured output+ --nocolor,--nocolour Disable coloured output+ -v,--version Print version information+ -h,--help Show this help text+.SH SEE ALSO+++ The IDRIS web site (http://idris-lang.org/+++ The IRC channel #idris, on chat.freenode.net+++ The wiki (https://github.com/idris-lang/Idris-dev/wiki/) has further user provided information, in particular:++ – https://github.com/idris-lang/Idris-dev/wiki/Manual++ – https://github.com/idris-lang/Idris-dev/wiki/Language-Features++.SH AUTHOR+The Idris Community
rts/idris_rts.c view
@@ -594,6 +594,17 @@ return MKINT((i_int)idx); } +VAL idris_substr(VM* vm, VAL offset, VAL length, VAL str) {+ char *start = idris_utf8_advance(GETSTR(str), GETINT(offset));+ char *end = idris_utf8_advance(start, GETINT(length));+ Closure* newstr = allocate(sizeof(Closure) + (end - start) +1, 0);+ SETTY(newstr, STRING);+ newstr -> info.str = (char*)newstr + sizeof(Closure);+ memcpy(newstr -> info.str, start, end - start);+ *(newstr -> info.str + (end - start) + 1) = '\0';+ return newstr;+}+ VAL idris_strRev(VM* vm, VAL str) { char *xstr = GETSTR(str); Closure* cl = allocate(sizeof(Closure) +
rts/idris_rts.h view
@@ -145,6 +145,11 @@ #define GETMPTR(x) (((VAL)(x))->info.mptr->data) #define GETFLOAT(x) (((VAL)(x))->info.f) +#define GETBITS8(x) (((VAL)(x))->info.bits8)+#define GETBITS16(x) (((VAL)(x))->info.bits16)+#define GETBITS32(x) (((VAL)(x))->info.bits32)+#define GETBITS64(x) (((VAL)(x))->info.bits64)+ #define TAG(x) (ISINT(x) || x == NULL ? (-1) : ( GETTY(x) == CON ? (x)->info.c.tag_arity >> 8 : (-1)) ) #define ARITY(x) (ISINT(x) || x == NULL ? (-1) : ( GETTY(x) == CON ? (x)->info.c.tag_arity & 0x000000ff : (-1)) ) @@ -309,6 +314,7 @@ VAL idris_strCons(VM* vm, VAL x, VAL xs); VAL idris_strIndex(VM* vm, VAL str, VAL i); VAL idris_strRev(VM* vm, VAL str);+VAL idris_substr(VM* vm, VAL offset, VAL length, VAL str); // system infox // used indices:
rts/idris_utf8.c view
@@ -78,6 +78,32 @@ return top; } +char* idris_utf8_advance(char* str, int i) {+ while (i > 0 && *str != '\0') {+ // In a UTF8 single-byte char, the highest bit is 0. In the+ // first byte of a multi-byte char, the highest two bits are+ // 11, but the rest of the bytes start with 10. So we can+ // decrement our character counter when we see something other+ // than 10 at the front.++ // This is a bit of an overapproximation, as invalid multibyte+ // sequences that are too long will be treated as if they are+ // OK, but it's always paying attention to null-termination.+ if ((*str & 0xc0) != 0x80) {+ i--;+ }+ str++;+ }+ // Now we've found the first byte of the last character. Advance+ // to the end of it, or the end of the string, whichever is first.+ // Here, we don't risk overrunning the end of the string because+ // ('\0' & 0xc0) != 0x80.+ while ((*str & 0xc0) == 0x80) { str++; }++ return str;+}++ char* idris_utf8_fromChar(int x) { char* str; int bytes = 0, top = 0;
rts/idris_utf8.h view
@@ -18,5 +18,7 @@ char* idris_utf8_fromChar(int x); // Reverse a UTF8 encoded string, putting the result in 'result' char* idris_utf8_rev(char* s, char* result);-+// Advance a pointer into a string by i UTF8 characters.+// Return original pointer if i <= 0.+char* idris_utf8_advance(char* str, int i); #endif
+ samples/effects/ConsoleIO.idr view
@@ -0,0 +1,15 @@+module Main++import Effects+import Effect.StdIO+import Effect.State++hello : { [STATE Int, STDIO] } Eff ()+hello = do putStr "Name? "+ putStrLn ("Hello " ++ trim !getStr ++ "!")+ update (+1)+ putStrLn ("I've said hello to: " ++ show !get ++ " people")+ hello++main : IO ()+main = run hello
+ samples/effects/Exception.idr view
@@ -0,0 +1,21 @@+module Main++import Effects+import Effect.Exception+import Effect.StdIO+import Control.IOExcept++data MyErr = NotANumber | OutOfRange++instance Show MyErr where+ show NotANumber = "Not a number"+ show OutOfRange = "Out of range"++parseNumber : Int -> String -> { [EXCEPTION MyErr] } Eff Int+parseNumber num str+ = if all isDigit (unpack str)+ then let x = cast str in+ if (x >=0 && x <= num)+ then pure x+ else raise OutOfRange+ else raise NotANumber
+ samples/effects/Random.idr view
@@ -0,0 +1,37 @@+module Main++import Effects+import Effect.Random+import Effect.Exception+import Effect.StdIO++data MyErr = NotANumber | OutOfRange++parseNumber : Int -> String -> { [EXCEPTION MyErr] } Eff Int+parseNumber num str+ = if all isDigit (unpack str)+ then let x = cast str in+ if (x >=0 && x <= num)+ then pure x+ else raise OutOfRange+ else raise NotANumber++guess : Int -> { [STDIO] } Eff ()+guess target+ = do putStr "Guess: "+ case run {m=Maybe} (parseNumber 100 (trim !getStr)) of+ Nothing => do putStrLn "Invalid input"+ guess target+ Just v => case compare v target of+ LT => do putStrLn "Too low"+ guess target+ EQ => putStrLn "You win!"+ GT => do putStrLn "Too high"+ guess target++game : { [RND, STDIO] } Eff ()+game = do srand 123456789+ guess (fromInteger !(rndInt 0 100))++main : IO ()+main = run game
+ samples/effects/ReadInt.idr view
@@ -0,0 +1,22 @@+module ReadInt++import Effects+import Effect.State+import Effect.StdIO++readInt : { [STATE (Vect n Int), STDIO] ==>+ {ok} if ok then [STATE (Vect (S n) Int), STDIO]+ else [STATE (Vect n Int), STDIO] } Eff Bool+readInt = do let x = trim !getStr+ case all isDigit (unpack x) of+ False => pure False+ True => do updateM (\xs => cast x ::xs)+ pure True++readN : (n : Nat) ->+ { [STATE (Vect m Int), STDIO] ==>+ [STATE (Vect (n + m) Int), STDIO] } Eff ()+readN Z = pure ()+readN {m} (S k) = case !readInt of+ True => rewrite plusSuccRightSucc k m in readN k+ False => readN (S k)
+ samples/effects/Select.idr view
@@ -0,0 +1,17 @@+module Main++import Effects+import Effect.Select+import Effect.Exception++triple : Int -> { [SELECT, EXCEPTION String] } Eff (Int, Int, Int)+triple max = do z <- select [1..max]+ y <- select [1..z]+ x <- select [1..y]+ if (x * x + y * y == z * z)+ then pure (x, y, z)+ else raise "No triple"++main : IO ()+main = do print $ the (Maybe _) $ run (triple 100)+ print $ the (List _) $ run (triple 100)
+ samples/effects/TreeTag-noeff.idr view
@@ -0,0 +1,21 @@++data BTree a = Leaf+ | Node (BTree a) a (BTree a)++testTree : BTree String+testTree = Node (Node Leaf "Jim" Leaf)+ "Fred"+ (Node (Node Leaf "Alice" Leaf)+ "Sheila"+ (Node Leaf "Bob" Leaf))++treeTagAux : (i : Int) -> BTree a -> (Int, BTree (Int, a))+treeTagAux i Leaf = (i, Leaf)+treeTagAux i (Node l x r)+ = let (i', l') = treeTagAux i l in+ let x' = (i', x) in+ let (i'', r') = treeTagAux (i' + 1) r in+ (i'', Node l' x' r')++treeTag : (i : Int) -> BTree a -> BTree (Int, a)+treeTag i x = snd (treeTagAux i x)
+ samples/effects/TreeTag.idr view
@@ -0,0 +1,40 @@+module Main++import Effects+import Effect.State++data BTree a = Leaf+ | Node (BTree a) a (BTree a)++instance Show a => Show (BTree a) where+ show Leaf = "[]"+ show (Node l x r) = "[" ++ show l ++ " "+ ++ show x ++ " "+ ++ show r ++ "]"++testTree : BTree String+testTree = Node (Node Leaf "Jim" Leaf)+ "Fred"+ (Node (Node Leaf "Alice" Leaf)+ "Sheila"+ (Node Leaf "Bob" Leaf))++treeTagAux : BTree a -> { [STATE Int] } Eff (BTree (Int, a))+treeTagAux Leaf = return Leaf+treeTagAux (Node l x r)+ = do l' <- treeTagAux l+ i <- get+ put (i + 1)+ r' <- treeTagAux r+ return (Node l' (i, x) r')++treeTag : (i : Int) -> BTree a -> BTree (Int, a)+treeTag i x = runPure (do put i+ treeTagAux x)++treeTagIO : (i : Int) -> BTree a -> IO (BTree (Int, a))+treeTagIO i x = run (do put i+ treeTagAux x)++main : IO ()+main = print (treeTag 1 testTree)
+ samples/effects/TreeTagCount.idr view
@@ -0,0 +1,29 @@+import Effects+import Effect.State+import Effect.StdIO++data BTree a = Leaf+ | Node (BTree a) a (BTree a)++testTree : BTree String+testTree = Node (Node Leaf "Jim" Leaf)+ "Fred"+ (Node (Node Leaf "Alice" Leaf)+ "Sheila"+ (Node Leaf "Bob" Leaf))++treeTagAux : BTree a -> { ['Tag ::: STATE Int,+ 'Leaves ::: STATE Int] } Eff (BTree (Int, a))+treeTagAux Leaf = do 'Leaves :- update (+1)+ pure Leaf+treeTagAux (Node l x r)+ = do l' <- treeTagAux l+ i <- 'Tag :- get+ 'Tag :- put (i + 1)+ r' <- treeTagAux r+ pure (Node l' (i, x) r')++treeTag : (i : Int) -> BTree a -> (BTree (Int, a), Int)+treeTag i x = runPureInit ['Tag := i, 'Leaves := 0]+ (do x' <- treeTagAux x+ pure (x', !('Leaves :- get)))
+ samples/effects/hworld.idr view
@@ -0,0 +1,10 @@+module Main++import Effects+import Effect.StdIO++hello : { [STDIO] } Eff ()+hello = putStrLn "Hello world!"++main : IO ()+main = run hello
+ samples/effects/vadd.idr view
@@ -0,0 +1,41 @@+module Main++import Effects+import Effect.Exception+import Effect.StdIO++parseNumber : String -> { [EXCEPTION String] } Eff Int+parseNumber str+ = if all (\x => isDigit x || x == '-') (unpack str)+ then pure (cast str)+ else raise "Not a number"++vadd : Vect n Int -> Vect n Int -> Vect n Int+vadd [] [] = []+vadd (x :: xs) (y :: ys) = x + y :: vadd xs ys++vadd_check : Vect n Int -> Vect m Int ->+ { [EXCEPTION String] } Eff (Vect m Int)+vadd_check {n} {m} xs ys with (decEq n m)+ vadd_check {n} {m=n} xs ys | (Yes Refl) = pure (vadd xs ys)+ vadd_check {n} {m} xs ys | (No _) = raise "Length mismatch"++read_vec : { [STDIO] } Eff (p ** Vect p Int)+read_vec = do putStr "Number (-1 when done): "+ case run {m=Maybe} (parseNumber (trim !getStr)) of+ Nothing => do putStrLn "Input error"+ read_vec+ Just v => if (v /= -1)+ then do (_ ** xs) <- read_vec+ pure (_ ** v :: xs)+ else pure (_ ** [])++do_vadd : { [STDIO, EXCEPTION String] } Eff ()+do_vadd = do putStrLn "Vector 1"+ (_ ** xs) <- read_vec+ putStrLn "Vector 2"+ (_ ** ys) <- read_vec+ putStrLn (show !(vadd_check xs ys))++main : IO ()+main = run do_vadd
+ samples/misc/binary.idr view
@@ -0,0 +1,94 @@+module main++data Bit : Nat -> Type where+ b0 : Bit 0+ b1 : Bit 1++instance Show (Bit n) where+ show b0 = "0"+ show b1 = "1"++infixl 5 #++data Binary : (width : Nat) -> (value : Nat) -> Type where+ zero : Binary Z Z+ (#) : Binary w v -> Bit bit -> Binary (S w) (bit + 2 * v)++instance Show (Binary w k) where+ show zero = ""+ show (bin # bit) = show bin ++ show bit++pattern syntax bitpair [x] [y] = (_ ** (_ ** (x, y, _)))+term syntax bitpair [x] [y] = (_ ** (_ ** (x, y, Refl)))++addBit : Bit x -> Bit y -> Bit c ->+ (bx ** (by ** (Bit bx, Bit by, c + x + y = by + 2 * bx)))+addBit b0 b0 b0 = bitpair b0 b0+addBit b0 b0 b1 = bitpair b0 b1+addBit b0 b1 b0 = bitpair b0 b1+addBit b0 b1 b1 = bitpair b1 b0+addBit b1 b0 b0 = bitpair b0 b1+addBit b1 b0 b1 = bitpair b1 b0+addBit b1 b1 b0 = bitpair b1 b0+addBit b1 b1 b1 = bitpair b1 b1++adc : Binary w x -> Binary w y -> Bit c -> Binary (S w) (c + x + y)+adc zero zero carry ?= zero # carry+adc (numx # bx) (numy # by) carry+ ?= let (bitpair carry0 lsb) = addBit bx by carry in+ adc numx numy carry0 # lsb++main : IO ()+main = do let n1 = zero # b1 # b0 # b1 # b0+ let n2 = zero # b1 # b1 # b1 # b0+ print (adc n1 n2 b0)++++++++++---------- Proofs ----------++-- There is almost certainly an easier proof. I don't care, for now :)++main.adc_lemma_2 = proof {+ intro c,w,v,bit0,num0;+ intro b0,v1,bit1,num1,b1;+ intro bc,x,x1,bx,bx1,prf;+ intro;+ rewrite sym (plusZeroRightNeutral v);+ rewrite sym (plusZeroRightNeutral v1);+ rewrite sym (plusAssociative (plus c (plus bit0 (plus v v))) bit1 (plus v1 v1));+ rewrite (plusAssociative c (plus bit0 (plus v v)) bit1);+ rewrite (plusAssociative bit0 (plus v v) bit1);+ rewrite sym (plusCommutative (plus v v) bit1);+ rewrite sym (plusAssociative c bit0 (plus bit1 (plus v v)));+ rewrite sym (plusAssociative (plus c bit0) bit1 (plus v v));+ rewrite sym prf;+ rewrite sym (plusZeroRightNeutral x);+ rewrite plusAssociative x1 (plus x x) (plus v v);+ rewrite plusAssociative x x (plus v v);+ rewrite sym (plusAssociative x v v);+ rewrite plusCommutative v (plus x v);+ rewrite sym (plusAssociative x v (plus x v));+ rewrite plusAssociative x1 (plus (plus x v) (plus x v)) (plus v1 v1);+ rewrite plusAssociative (plus x v) (plus x v) (plus v1 v1);+ rewrite plusAssociative x v (plus v1 v1);+ rewrite sym (plusAssociative v v1 v1);+ rewrite sym (plusAssociative x (plus v v1) v1);+ rewrite sym (plusAssociative x v v1);+ rewrite sym (plusCommutative (plus (plus x v) v1) v1);+ rewrite plusZeroRightNeutral (plus (plus x v) v1);+ rewrite sym (plusAssociative (plus x v) v1 (plus (plus (plus x v) v1) Z));+ trivial;+}++main.adc_lemma_1 = proof {+ intros;+ rewrite sym (plusZeroRightNeutral c) ;+ trivial;+}
+ samples/misc/interp-alt.idr view
@@ -0,0 +1,81 @@+module main++data Ty = TyInt | TyBool| TyFun Ty Ty++interpTy : Ty -> Type+interpTy TyInt = Int+interpTy TyBool = Bool+interpTy (TyFun s t) = interpTy s -> interpTy t++using (G : Vect n Ty)++ data Env : Vect n Ty -> Type where+ Nil : Env Nil+ (::) : interpTy a -> Env G -> Env (a :: G)++-- data HasType : (i : Fin n) -> Vect n Ty -> Ty -> Type where+-- stop : HasType FZ (t :: G) t+-- pop : HasType k G t -> HasType (FS k) (u :: G) t++ lookup : (i:Fin n) -> Env G -> interpTy (index i G)+ lookup FZ (x :: xs) = x+ lookup (FS i) (x :: xs) = lookup i xs++ data Expr : Vect n Ty -> Ty -> Type where+ Var : (i : Fin n) -> Expr G (index i G)+ Val : (x : Int) -> Expr G TyInt+ Lam : Expr (a :: G) t -> Expr G (TyFun a t)+ App : Expr G (TyFun a t) -> Expr G a -> Expr G t+ Op : (interpTy a -> interpTy b -> interpTy c) -> Expr G a -> Expr G b ->+ Expr G c+ If : Expr G TyBool -> Expr G a -> Expr G a -> Expr G a+ Bind : Expr G a -> (interpTy a -> Expr G b) -> Expr G b++ interp : Env G -> {static} Expr G t -> interpTy t+ interp env (Var i) = lookup i env+ interp env (Val x) = x+ interp env (Lam sc) = \x => interp (x :: env) sc+ interp env (App f s) = (interp env f) (interp env s)+ interp env (Op op x y) = op (interp env x) (interp env y)+ interp env (If x t e) = if (interp env x) then (interp env t) else (interp env e)+ interp env (Bind v f) = interp env (f (interp env v))++ eId : Expr G (TyFun TyInt TyInt)+ eId = Lam (Var FZ)++ eTEST : Expr G (TyFun TyInt (TyFun TyInt TyInt))+ eTEST = Lam (Lam (Var (FS FZ)))++ eAdd : Expr G (TyFun TyInt (TyFun TyInt TyInt))+ eAdd = Lam (Lam (Op prim__addInt (Var FZ) (Var (FS FZ))))++-- eDouble : Expr G (TyFun TyInt TyInt)+-- eDouble = Lam (App (App (Lam (Lam (Op' (+) (Var FZ) (Var (FS FZ))))) (Var FZ)) (Var FZ))++ eDouble : Expr G (TyFun TyInt TyInt)+ eDouble = Lam (App (App eAdd (Var FZ)) (Var FZ))++ app : |(f : Expr G (TyFun a t)) -> Expr G a -> Expr G t+ app = \f, a => App f a++ eFac : Expr G (TyFun TyInt TyInt)+ eFac = Lam (If (Op (==) (Var FZ) (Val 0))+ (Val 1) (Op (*) (app eFac (Op (-) (Var FZ) (Val 1))) (Var FZ)))++ -- Exercise elaborator: Complicated way of doing \x y => x*4 + y*2++ eProg : Expr G (TyFun TyInt (TyFun TyInt TyInt))+ eProg = Lam (Lam (Bind (App eDouble (Var (FS FZ)))+ (\x => Bind (App eDouble (Var FZ))+ (\y => Bind (App eDouble (Val x))+ (\z => App (App eAdd (Val y)) (Val z))))))++test : Int+test = interp [] eProg 2 2++testFac : Int+testFac = interp [] eFac 4++main : IO ()+main = do printLn test+ printLn testFac
+ samples/misc/interp.idr view
@@ -0,0 +1,91 @@+module Main++data Ty = TyInt | TyBool | TyFun Ty Ty++interpTy : Ty -> Type+interpTy TyInt = Int+interpTy TyBool = Bool+interpTy (TyFun s t) = interpTy s -> interpTy t++using (G : Vect n Ty)++ data Env : Vect n Ty -> Type where+ Nil : Env Nil+ (::) : interpTy a -> Env G -> Env (a :: G)++ data HasType : (i : Fin n) -> Vect n Ty -> Ty -> Type where+ stop : HasType FZ (t :: G) t+ pop : HasType k G t -> HasType (FS k) (u :: G) t++ lookup : HasType i G t -> Env G -> interpTy t+ lookup stop (x :: xs) = x+ lookup (pop k) (x :: xs) = lookup k xs++ data Expr : Vect n Ty -> Ty -> Type where+ Var : HasType i G t -> Expr G t+ Val : (x : Int) -> Expr G TyInt+ Lam : Expr (a :: G) t -> Expr G (TyFun a t)+ App : Expr G (TyFun a t) -> Expr G a -> Expr G t+ Op : (interpTy a -> interpTy b -> interpTy c) -> Expr G a -> Expr G b ->+ Expr G c+ If : Expr G TyBool -> Expr G a -> Expr G a -> Expr G a+ Bind : Expr G a -> (interpTy a -> Expr G b) -> Expr G b++ dsl expr+ lambda = Lam+ variable = Var+ index_first = stop+ index_next = pop++ (<*>) : |(f : Expr G (TyFun a t)) -> Expr G a -> Expr G t+ (<*>) = \f, a => App f a++ pure : Expr G a -> Expr G a+ pure = id++ syntax IF [x] THEN [t] ELSE [e] = If x t e++ (==) : Expr G TyInt -> Expr G TyInt -> Expr G TyBool+ (==) = Op (==)++ (<) : Expr G TyInt -> Expr G TyInt -> Expr G TyBool+ (<) = Op (<)++ instance Num (Expr G TyInt) where+ (+) x y = Op (+) x y+ (-) x y = Op (-) x y+ (*) x y = Op (*) x y++ abs x = IF (x < 0) THEN (-x) ELSE x++ fromInteger = Val . fromInteger++ interp : Env G -> {static} Expr G t -> interpTy t+ interp env (Var i) = lookup i env+ interp env (Val x) = x+ interp env (Lam sc) = \x => interp (x :: env) sc+ interp env (App f s) = (interp env f) (interp env s)+ interp env (Op op x y) = op (interp env x) (interp env y)+ interp env (If x t e) = if (interp env x) then (interp env t) else (interp env e)+ interp env (Bind v f) = interp env (f (interp env v))++ eId : Expr G (TyFun TyInt TyInt)+ eId = expr (\x => x)++ eTEST : Expr G (TyFun TyInt (TyFun TyInt TyInt))+ eTEST = expr (\x, y => y)++ eAdd : Expr G (TyFun TyInt (TyFun TyInt TyInt))+ eAdd = expr (\x, y => Op (+) x y)++ eDouble : Expr G (TyFun TyInt TyInt)+ eDouble = expr (\x => App (App eAdd x) (Var stop))++ eFac : Expr G (TyFun TyInt TyInt)+ eFac = expr (\x => IF x == 0 THEN 1 ELSE [| eFac (x - 1) |] * x)++testFac : Int+testFac = interp [] eFac 4++main : IO ()+main = printLn testFac
+ samples/misc/javaffi.idr view
@@ -0,0 +1,12 @@+module Main++%include Java "com.google.common.math.IntMath"+%lib Java "com.google.guava:guava:14.0"++binom : Int -> Int -> IO Int+binom n k = mkForeign (FFun "IntMath.binomial" [FInt, FInt] FInt) n k++main : IO ()+main = do print "The number of possibilities in lotto is 49 choose 6:"+ res <- binom 49 6+ printLn res
+ samples/misc/named_instance.lidr view
@@ -0,0 +1,36 @@+> module MyOrd++An alternative Ord instance for Nats, with an explicit name "myord"+for the dictionary:++> instance [myord] Ord Nat where+> compare O (S n) = GT+> compare (S n) O = LT+> compare O O = EQ++The @{name} syntax below gives an explicit dictionary for the compare function.+Here, we're telling it to use the "myord" dictionary. Otherwise, it'd just+use the default (unnamed) instance. Note that there can only be one unnamed+instance --- they must not overlap.++> compare (S x) (S y) = compare @{myord} x y++> foo : List Nat+> foo = [1,4,2,8,3,7,5,6]++Sort foo using the default comparison operator:++> test1 : List Nat+> test1 = sort foo++-- which gives [1,2,3,4,5,6,7,8]++Sort foo using the alternative instance. No need for 'sortBy' and other+such functions. Hoorah!++> test2 : List Nat+> test2 = sort @{myord} foo++-- which gives [8,7,6,5,4,3,2,1]++
+ samples/misc/reflection.idr view
@@ -0,0 +1,151 @@+module ReflectionExamples++import Language.Reflection++||| The reflected term for (\ x => reverse "bba")+reflectVal : TT+reflectVal = ?valPrf++||| intEq for the integers 3 and 3+applyTac1 : Int+applyTac1 = ?tacPrf1++||| intEq for the integers 3 and 42+applyTac0 : Int+applyTac0 = ?tacPrf0++||| intEq for the two arguments+applyTacDyn : Int -> Int -> Int+applyTacDyn x y = ?tacPrfDyn++||| Restored version for RConstant (I 42)+fill : Int+fill = ?fillPrf++||| The type (TTName, TT) computed from its reflected raw rep.+envTuple : Type+envTuple = ?envTuplePrf++||| The type List (TTName, TT) computed from its reflected raw rep.+envList : List (TTName, TT)+envList = ?envListPrf++||| Reflected raw rep. for the type (TTName, TT)+tupleType : Raw+tupleType = RApp (RApp (Var (UN "Pair"))+ (Var (NS (UN "TTName") ["Reflection", "Language"])))+ (Var (NS (UN "TT") ["Reflection", "Language"]))++||| Reflected raw rep for the type List (TTName, TT)+mkTuple : Raw+mkTuple = RApp (RApp (Var (UN "MkPair"))+ (Var (NS (UN "TTName") ["Reflection", "Language"])))+ (Var (NS (UN "TT") ["Reflection", "Language"]))++||| Reflected raw rep for Prelude.List.Nil+nil : Raw+nil = (Var (NS (UN "Nil") ["List", "Prelude"]))++||| Reflected raw rep for Prelude.List.::+cons : Raw+cons = (Var (NS (UN "::") ["List", "Prelude"]))++||| 1 if the two arguments are equal, 0 otherwise+||| This function is chosen as simple as possible for+||| demo purposes.+intEq : Int -> Int -> Int+intEq x y = case x == y of+ True => 1+ False => 0++||| A tactic script to run intEq on two let-bound or introduced+||| arguments of the current (otherwise empty) proof context+firstEq : List (TTName, Binder TT) -> TT -> Tactic+firstEq ((_, (Let _ y))::(_, (Let _ x))::(_, Let _ f)::Nil) _ = Exact (App (App f x) y)+firstEq ((y, Lam yt)::(x, Lam xt)::(_, Let _ f)::Nil) _ = Exact (App (App f (P (Bound) x xt)) (P Bound y yt))+firstEq xs _ = Exact (TConst (I 0))++||| Skip 1 argument of the proof context and return the second one which+||| has to be introduced. Used for the tactical dispatch example, which+||| will push dispatch, as first env agrument.+innerTac : List (TTName, Binder TT) -> TT -> Tactic+innerTac (_::(x, Lam xt)::_) _ = Exact (P Bound x xt)++||| Returns the reflected representation of innerTac+innerTacTT : TT+innerTacTT = ?innerTacTTPrf++||| Dispatch to the reflected rep. of innerTac+dispatch : List (TTName, Binder TT) -> TT -> Tactic+dispatch xs _ = ApplyTactic (innerTacTT)++||| Call dispatch which will then dispatch to innerTac.+tacticalDispatch : Int -> Int+tacticalDispatch = ?tacticalDispatchPrf++||| A tactic to get the representation of its goal+studyGoalTac : List (TTName, Binder TT) -> TT -> Tactic+studyGoalTac _ goal = Reflect goal++||| Returns the representation of its goal, TT+||| (so this is reflect on the type TT)+studyGoal : TT+studyGoal = ?studyGoalPrf++---------- Proofs ----------++ReflectionExamples.studyGoalPrf = proof {+ applyTactic studyGoalTac;+}++ReflectionExamples.envTuplePrf = proof {+ let x = tupleType;+ fill x;+}++ReflectionExamples.envListPrf = proof {+ let x : Raw = RApp nil tupleType;+ fill x;+}+++ReflectionExamples.valPrf = proof {+ let x : (List String -> String) = (\ x => reverse "bba");+ reflect x;+}+++ReflectionExamples.tacPrf1 = proof {+ let f : (Int -> Int -> Int) = intEq;+ let x : Int = 3;+ let y : Int = 3;+ applyTactic firstEq;+}++ReflectionExamples.tacPrf0 = proof {+ let f : (Int -> Int -> Int) = intEq;+ let x : Int = 3;+ let y : Int = 42;+ applyTactic firstEq;+}++ReflectionExamples.tacPrfDyn = proof {+ let f : (Int -> Int -> Int) = intEq;+ intros;+ applyTactic firstEq;+}++ReflectionExamples.fillPrf = proof {+ let x : Raw = RConstant (I 42);+ fill x;+}++ReflectionExamples.innerTacTTPrf = proof {+ reflect innerTac;+}++ReflectionExamples.tacticalDispatchPrf = proof {+ intros;+ applyTactic dispatch;+}+
+ samples/tutorial/binary.idr view
@@ -0,0 +1,61 @@+module Main++data Binary : Nat -> Type where+ bEnd : Binary Z+ bO : Binary n -> Binary (n + n)+ bI : Binary n -> Binary (S (n + n))++instance Show (Binary n) where+ show (bO x) = show x ++ "0"+ show (bI x) = show x ++ "1"+ show bEnd = ""++data Parity : Nat -> Type where+ Even : Parity (n + n)+ Odd : Parity (S (n + n))++parity : (n:Nat) -> Parity n+parity Z = Even {n=Z}+parity (S Z) = Odd {n=Z}+parity (S (S k)) with (parity k)+ parity (S (S (j + j))) | Even ?= Even {n=S j}+ parity (S (S (S (j + j)))) | Odd ?= Odd {n=S j}++natToBin : (n:Nat) -> Binary n+natToBin Z = bEnd+natToBin (S k) with (parity k)+ natToBin (S (j + j)) | Even = bI (natToBin j)+ natToBin (S (S (j + j))) | Odd ?= bO (natToBin (S j))++intToNat : Int -> Nat+intToNat 0 = Z+intToNat x = if (x>0) then (S (intToNat (x-1))) else Z++main : IO ()+main = do putStr "Enter a number: "+ x <- getLine+ print (natToBin (fromInteger (cast x)))++---------- Proofs ----------++Main.natToBin_lemma_1 = proof+ intros+ rewrite plusSuccRightSucc j j+ rewrite sym (plusSuccRightSucc j j)+ trivial+++parity_lemma_1 = proof+ intros+ rewrite sym (plusSuccRightSucc j j)+ trivial+++parity_lemma_2 = proof {+ intro;+ intro;+ rewrite sym (plusSuccRightSucc j j);+ trivial;+}++
+ samples/tutorial/bmain.idr view
@@ -0,0 +1,8 @@+module Main++import btree++main : IO ()+main = do let t = toTree [1,8,2,7,9,3]+ print (btree.toList t)+
+ samples/tutorial/btree.idr view
@@ -0,0 +1,18 @@+module btree++data BTree a = Leaf+ | Node (BTree a) a (BTree a)++insert : Ord a => a -> BTree a -> BTree a+insert x Leaf = Node Leaf x Leaf+insert x (Node l v r) = if (x < v) then (Node (insert x l) v r)+ else (Node l v (insert x r))++toList : BTree a -> List a+toList Leaf = []+toList (Node l v r) = btree.toList l ++ (v :: btree.toList r)++toTree : Ord a => List a -> BTree a+toTree [] = Leaf+toTree (x :: xs) = insert x (toTree xs)+
+ samples/tutorial/btreemod.idr view
@@ -0,0 +1,20 @@+module btree++abstract data BTree a = Leaf+ | Node (BTree a) a (BTree a)++abstract+insert : Ord a => a -> BTree a -> BTree a+insert x Leaf = Node Leaf x Leaf+insert x (Node l v r) = if (x < v) then (Node (insert x l) v r)+ else (Node l v (insert x r))++abstract+toList : BTree a -> List a+toList Leaf = []+toList (Node l v r) = btree.toList l ++ (v :: btree.toList r)++abstract+toTree : Ord a => List a -> BTree a+toTree [] = Leaf+toTree (x :: xs) = insert x (toTree xs)
+ samples/tutorial/classes.idr view
@@ -0,0 +1,10 @@+m_add : Maybe Int -> Maybe Int -> Maybe Int+m_add x y = do x' <- x -- Extract value from x+ y' <- y -- Extract value from y+ return (x' + y') -- Add them++m_add' : Maybe Int -> Maybe Int -> Maybe Int+m_add' x y = [ x' + y' | x' <- x, y' <- y ]++sortAndShow : (Ord a, Show a) => List a -> String+sortAndShow xs = show (sort xs)
+ samples/tutorial/foo.idr view
@@ -0,0 +1,10 @@+module foo++namespace x+ test : Int -> Int+ test x = x * 2++namespace y+ test : String -> String+ test x = x ++ x+
+ samples/tutorial/hello.idr view
@@ -0,0 +1,5 @@+module Main++main : IO ()+main = putStrLn "Hello world"+
+ samples/tutorial/idiom.idr view
@@ -0,0 +1,38 @@+module idiom++data Expr = Var String+ | Val Int+ | Add Expr Expr++data Eval : Type -> Type where+ MkEval : (List (String, Int) -> Maybe a) -> Eval a++fetch : String -> Eval Int+fetch x = MkEval fetchVal where+ fetchVal : List (String, Int) -> Maybe Int+ fetchVal [] = Nothing+ fetchVal ((v, val) :: xs) = if (x == v) then (Just val) else (fetchVal xs)++instance Functor Eval where+ map f (MkEval g) = MkEval (\e => map f (g e))++instance Applicative Eval where+ pure x = MkEval (\e => Just x)++ (<*>) (MkEval f) (MkEval g) = MkEval (\x => app (f x) (g x)) where+ app : Maybe (a -> b) -> Maybe a -> Maybe b+ app (Just fx) (Just gx) = Just (fx gx)+ app _ _ = Nothing++eval : Expr -> Eval Int+eval (Var x) = fetch x+eval (Val x) = [| x |]+eval (Add x y) = [| eval x + eval y |]++runEval : List (String, Int) -> Expr -> Maybe Int+runEval env e = case eval e of+ MkEval envFn => envFn env++m_add' : Maybe Int -> Maybe Int -> Maybe Int+m_add' x y = [| x + y |]+
+ samples/tutorial/interp.idr view
@@ -0,0 +1,71 @@+module Main++import Data.Vect+import Data.Fin++data Ty = TyInt | TyBool| TyFun Ty Ty++interpTy : Ty -> Type+interpTy TyInt = Int+interpTy TyBool = Bool+interpTy (TyFun s t) = interpTy s -> interpTy t++using (G : Vect n Ty)++ data Env : Vect n Ty -> Type where+ Nil : Env Nil+ (::) : interpTy a -> Env G -> Env (a :: G)++ data HasType : (i : Fin n) -> Vect n Ty -> Ty -> Type where+ Stop : HasType FZ (t :: G) t+ Pop : HasType k G t -> HasType (FS k) (u :: G) t++ lookup : HasType i G t -> Env G -> interpTy t+ lookup Stop (x :: xs) = x+ lookup (Pop k) (x :: xs) = lookup k xs++ data Expr : Vect n Ty -> Ty -> Type where+ Var : HasType i G t -> Expr G t+ Val : (x : Int) -> Expr G TyInt+ Lam : Expr (a :: G) t -> Expr G (TyFun a t)+ App : Expr G (TyFun a t) -> Expr G a -> Expr G t+ Op : (interpTy a -> interpTy b -> interpTy c) -> Expr G a -> Expr G b ->+ Expr G c+ If : Expr G TyBool -> Lazy (Expr G a) -> Lazy (Expr G a) -> Expr G a++ interp : Env G -> [static] (e : Expr G t) -> interpTy t+ interp env (Var i) = lookup i env+ interp env (Val x) = x+ interp env (Lam sc) = \x => interp (x :: env) sc+ interp env (App f s) = interp env f (interp env s)+ interp env (Op op x y) = op (interp env x) (interp env y)+ interp env (If x t e) = if interp env x then interp env t+ else interp env e++ eId : Expr G (TyFun TyInt TyInt)+ eId = Lam (Var Stop)++ eAdd : Expr G (TyFun TyInt (TyFun TyInt TyInt))+ eAdd = Lam (Lam (Op (+) (Var Stop) (Var (Pop Stop))))++ eEq : Expr G (TyFun TyInt (TyFun TyInt TyBool))+ eEq = Lam (Lam (Op (==) (Var Stop) (Var (Pop Stop))))++ eDouble : Expr G (TyFun TyInt TyInt)+ eDouble = Lam (App (App eAdd (Var Stop)) (Var Stop))++ fact : Expr G (TyFun TyInt TyInt)+ fact = Lam (If (Op (==) (Var Stop) (Val 0))+ (Val 1) (Op (*) (App fact (Op (-) (Var Stop) (Val 1))) (Var Stop)))++testFac : Int+testFac = interp [] fact 4++-- unitTestFac : so (interp [] fact 4 == 24)+-- unitTestFac = oh++main : IO ()+main = do putStr "Enter a number: "+ x <- getLine+ print (interp [] fact (cast x))+
+ samples/tutorial/letbind.idr view
@@ -0,0 +1,16 @@+module letbind++mirror : List a -> List a+mirror xs = let xs' = reverse xs in+ xs ++ xs'++data Person = MkPerson String Int++showPerson : Person -> String+showPerson p = let MkPerson name age = p in+ name ++ " is " ++ show age ++ " years old"++splitAt : Char -> String -> (String, String)+splitAt c x = case break (== c) x of+ (x, y) => (x, strTail y)+
+ samples/tutorial/prims.idr view
@@ -0,0 +1,14 @@+module prims++x : Int+x = 42++foo : String+foo = "Sausage machine"++bar : Char+bar = 'Z'++quux : Bool+quux = False+
+ samples/tutorial/theorems.idr view
@@ -0,0 +1,57 @@++fiveIsFive : 5 = 5+fiveIsFive = Refl++twoPlusTwo : 2 + 2 = 4+twoPlusTwo = Refl++total disjoint : (n : Nat) -> Z = S n -> Void+disjoint n p = replace {P = disjointTy} p ()+ where+ disjointTy : Nat -> Type+ disjointTy Z = ()+ disjointTy (S k) = Void++total acyclic : (n : Nat) -> n = S n -> Void+acyclic Z p = disjoint _ p+acyclic (S k) p = acyclic k (succInjective _ _ p)++empty1 : Void+empty1 = hd [] where+ hd : List a -> a+ hd (x :: xs) = x++empty2 : Void+empty2 = empty2++plusReduces : (n:Nat) -> plus Z n = n+plusReduces n = Refl++plusReducesZ : (n:Nat) -> n = plus n Z+plusReducesZ Z = Refl+plusReducesZ (S k) = cong (plusReducesZ k)++plusReducesS : (n:Nat) -> (m:Nat) -> S (plus n m) = plus n (S m)+plusReducesS Z m = Refl+plusReducesS (S k) m = cong (plusReducesS k m)++plusReducesZ' : (n:Nat) -> n = plus n Z+plusReducesZ' Z = ?plusredZ_Z+plusReducesZ' (S k) = let ih = plusReducesZ' k in+ ?plusredZ_S+++---------- Proofs ----------++plusredZ_S = proof {+ intro;+ intro;+ rewrite ih;+ trivial;+}++plusredZ_Z = proof {+ compute;+ trivial;+}+
+ samples/tutorial/universe.idr view
@@ -0,0 +1,7 @@+myid : (a : Type) -> a -> a+myid _ x = x++idid : (a : Type) -> a -> a+idid = myid _ myid++
+ samples/tutorial/usefultypes.idr view
@@ -0,0 +1,20 @@++intVec : Vect 5 Int+intVec = [1, 2, 3, 4, 5]++double : Int -> Int+double x = x * 2++vec : (n ** Vect n Int)+vec = (_ ** [3, 4])++list_lookup : Nat -> List a -> Maybe a+list_lookup _ Nil = Nothing+list_lookup Z (x :: xs) = Just x+list_lookup (S k) (x :: xs) = list_lookup k xs++lookup_default : Nat -> List a -> a -> a+lookup_default i xs def = case list_lookup i xs of+ Nothing => def+ Just x => x+
+ samples/tutorial/vbroken.idr view
@@ -0,0 +1,10 @@+module Vect++data Vect : Nat -> Type -> Type where+ Nil : Vect Z a+ (::) : a -> Vect k a -> Vect (S k) a++(++) : Vect n a -> Vect m a -> Vect (n + m) a+(++) Nil ys = ys+(++) (x :: xs) ys = x :: xs ++ xs -- BROKEN+
+ samples/tutorial/views.idr view
@@ -0,0 +1,37 @@+module views++data Parity : Nat -> Type where+ Even : Parity (n + n)+ Odd : Parity (S (n + n))++parity : (n:Nat) -> Parity n+parity Z = Even {n=Z}+parity (S Z) = Odd {n=Z}+parity (S (S k)) with (parity k)+ parity (S (S (j + j))) | Even ?= Even {n=S j}+ parity (S (S (S (j + j)))) | Odd ?= Odd {n=S j}++natToBin : Nat -> List Bool+natToBin Z = Nil+natToBin k with (parity k)+ natToBin (j + j) | Even = False :: natToBin j+ natToBin (S (j + j)) | Odd = True :: natToBin j+++---------- Proofs ----------++views.parity_lemma_2 = proof {+ intro;+ intro;+ rewrite sym (plusSuccRightSucc j j);+ trivial;+}++views.parity_lemma_1 = proof {+ intro;+ intro;+ rewrite sym (plusSuccRightSucc j j);+ trivial;+}++
+ samples/tutorial/viewsbroken.idr view
@@ -0,0 +1,12 @@++data Parity : Nat -> Type where+ Even : Parity (n + n)+ Odd : Parity (S (n + n))++parity : (n:Nat) -> Parity n+parity Z = Even {n=Z}+parity (S Z) = Odd {n=Z}+parity (S (S k)) with (parity k)+ parity (S (S (j + j))) | Even = Even {n=S j}+ parity (S (S (S (j + j)))) | Odd = Odd {n=S j}+
+ samples/tutorial/wheres.idr view
@@ -0,0 +1,14 @@+module wheres++even : Nat -> Bool+even Z = True+even (S k) = odd k where+ odd Z = False+ odd (S k) = even k++test : List Nat+test = [c (S 1), c Z, d (S Z)]+ where c x = 42 + x+ d y = c (y + 1 + z y)+ where z w = y + w+
src/IRTS/CodegenC.hs view
@@ -259,6 +259,10 @@ where intConsts ((I _, _ ) : _) = True intConsts ((Ch _, _ ) : _) = True+ intConsts ((B8 _, _ ) : _) = True+ intConsts ((B16 _, _ ) : _) = True+ intConsts ((B32 _, _ ) : _) = True+ intConsts ((B64 _, _ ) : _) = True intConsts _ = False bigintConsts ((BI _, _ ) : _) = True@@ -279,7 +283,18 @@ iCase v (Ch b, bc) = indent i ++ "if (GETINT(" ++ v ++ ") == " ++ show (fromEnum b) ++ ") {\n" ++ concatMap (bcc (i+1)) bc ++ indent i ++ "} else\n"-+ iCase v (B8 w, bc) =+ indent i ++ "if (GETBITS8(" ++ v ++ ") == " ++ show (fromEnum w) ++ ") {\n"+ ++ concatMap (bcc (i+1)) bc ++ indent i ++ "} else\n"+ iCase v (B16 w, bc) =+ indent i ++ "if (GETBITS16(" ++ v ++ ") == " ++ show (fromEnum w) ++ ") {\n"+ ++ concatMap (bcc (i+1)) bc ++ indent i ++ "} else\n"+ iCase v (B32 w, bc) =+ indent i ++ "if (GETBITS32(" ++ v ++ ") == " ++ show (fromEnum w) ++ ") {\n"+ ++ concatMap (bcc (i+1)) bc ++ indent i ++ "} else\n"+ iCase v (B64 w, bc) =+ indent i ++ "if (GETBITS64(" ++ v ++ ") == " ++ show (fromEnum w) ++ ") {\n"+ ++ concatMap (bcc (i+1)) bc ++ indent i ++ "} else\n" showCase i (t, bc) = indent i ++ "case " ++ show t ++ ":\n" ++ concatMap (bcc (i+1)) bc ++ indent (i + 1) ++ "break;\n"@@ -544,6 +559,7 @@ doOp v LStrIndex [x, y] = v ++ "idris_strIndex(vm, " ++ creg x ++ "," ++ creg y ++ ")" doOp v LStrRev [x] = v ++ "idris_strRev(vm, " ++ creg x ++ ")" doOp v LStrLen [x] = v ++ "idris_strlen(vm, " ++ creg x ++ ")"+doOp v LStrSubstr [x,y,z] = v ++ "idris_substr(vm, " ++ creg x ++ "," ++ creg y ++ "," ++ creg z ++ ")" doOp v LFork [x] = v ++ "MKPTR(vm, vmThread(vm, " ++ cname (sMN 0 "EVAL") ++ ", " ++ creg x ++ "))" doOp v LPar [x] = v ++ creg x -- "MKPTR(vm, vmThread(vm, " ++ cname (MN 0 "EVAL") ++ ", " ++ creg x ++ "))"
src/IRTS/CodegenJavaScript.hs view
@@ -1140,6 +1140,15 @@ JSNum (JSInt 1), JSBinOp "-" (JSProj v "length") (JSNum (JSInt 1)) ]+ | LStrSubstr <- op+ , (offset:length:string:_) <- args =+ let off = translateReg offset+ len = translateReg length+ str = translateReg string+ in JSApp (JSProj str "substr") [+ jsCall "Math.max" [JSNum (JSInt 0), off],+ jsCall "Math.max" [JSNum (JSInt 0), len]+ ] | LSystemInfo <- op , (arg:_) <- args = jsCall "i$systemInfo" [translateReg arg]
src/IRTS/Compiler.hs view
@@ -44,8 +44,7 @@ import System.Environment import System.FilePath ((</>), addTrailingPathSeparator) --- | Given a 'main' term to compiler, return the IRs which can be used to--- generate code.+-- | Compile to simplified forms and return CodegenInfo compile :: Codegen -> FilePath -> Maybe Term -> Idris CodegenInfo compile codegen f mtm = do checkMVs -- check for undefined metavariables@@ -74,7 +73,7 @@ Just _ -> False let defs = defsIn ++ maindef- -- iputStrLn $ showSep "\n" (map show defs)+ -- Inlined top level LDecl made here let defsInlined = inlineAll defs let defsUniq = map (allocUnique (addAlist defsInlined emptyContext))@@ -90,7 +89,7 @@ let defuns = inline defuns_in logLvl 5 $ show defuns logLvl 1 "Resolving variables for CG"- -- iputStrLn $ showSep "\n" (map show (toAlist defuns))+ let checked = simplifyDefs defuns (toAlist defuns) outty <- outputTy dumpCases <- getDumpCases@@ -109,13 +108,6 @@ hdrs impdirs objs libs flags NONE c (toAlist defuns) tagged iface exports--- runIO $ case codegen of--- ViaC -> codegenC cginfo--- ViaJava -> codegenJava cginfo--- ViaJavaScript -> codegenJavaScript cginfo--- ViaNode -> codegenNode cginfo--- ViaLLVM -> codegenLLVM cginfo--- Bytecode -> dumpBC c f Error e -> ierror e where checkMVs = do i <- getIState case map fst (idris_metavars i) \\ primDefs of@@ -125,9 +117,6 @@ case idris_totcheckfail i of [] -> return () ((fc, msg):fs) -> ierror . At fc . Msg $ "Cannot compile:\n " ++ msg- inDir d h = do let f = d </> h- ex <- doesFileExist f- if ex then return f else return h generate :: Codegen -> FilePath -> CodegenInfo -> IO () generate codegen mainmod ir@@ -135,7 +124,7 @@ -- Built-in code generators (FIXME: lift these out!) Via "c" -> codegenC ir -- Any external code generator- Via cg -> do let cmd = "idris-" ++ cg+ Via cg -> do let cmd = "idris-codegen-" ++ cg args = [mainmod, "-o", outputFile ir] ++ compilerFlags ir exit <- rawSystem cmd args when (exit /= ExitSuccess) $@@ -485,75 +474,6 @@ deNS n = n doForeign vs env xs = ifail "Badly formed foreign function call" -{-- - | (_, (Constant (Str fgnName) : fgnArgTys : ret : [])) <- unApply fgn- = case getFTypes fgnArgTys of- Nothing -> ifail $ "Foreign type specification is not a constant list: " ++ show (fgn:args)- Just tys -> do- args' <- mapM (irTerm vs env) (init args)- return $ LForeign LANG_C (mkIty' ret) fgnName (zip tys args')-- | otherwise = ifail "Badly formed foreign function call"- where- getFTypes :: TT Name -> Maybe [FType]- getFTypes tm = case unApply tm of- -- nil : {a : Type} -> List a- (nil, [_]) -> Just []- -- cons : {a : Type} -> a -> List a -> List a- (cons, [_, ty, xs]) -> (mkIty' ty :) <$> getFTypes xs- _ -> Nothing-- mkIty' (P _ (UN ty) _) = mkIty (str ty)- mkIty' (App (P _ (UN fi) _) (P _ (UN intTy) _))- | fi == txt "FIntT"- = mkIntIty (str intTy)-- mkIty' (App (App (P _ (UN ff) _) _) (App (P _ (UN fa) _) (App (P _ (UN io) _) _)))- | ff == txt "FFunction"- , fa == txt "FAny"- , io == txt "IO"- = FFunctionIO-- mkIty' (App (App (P _ (UN ff) _) _) _)- | ff == txt "FFunction"- = FFunction-- mkIty' _ = FAny-- -- would be better if these FInt types were evaluated at compile time- -- TODO: add %eval directive for such things- -- Issue #1742 on the issue tracker.- -- https://github.com/idris-lang/Idris-dev/issues/1742- mkIty "FFloat" = FArith ATFloat- mkIty "FInt" = mkIntIty "ITNative"- mkIty "FChar" = mkIntIty "ITChar"- mkIty "FByte" = mkIntIty "IT8"- mkIty "FShort" = mkIntIty "IT16"- mkIty "FLong" = mkIntIty "IT64"- mkIty "FBits8" = mkIntIty "IT8"- mkIty "FBits16" = mkIntIty "IT16"- mkIty "FBits32" = mkIntIty "IT32"- mkIty "FBits64" = mkIntIty "IT64"- mkIty "FString" = FString- mkIty "FPtr" = FPtr- mkIty "FManagedPtr" = FManagedPtr- mkIty "FUnit" = FUnit- mkIty "FFunction" = FFunction- mkIty "FFunctionIO" = FFunctionIO- mkIty "FBits8x16" = FArith (ATInt (ITVec IT8 16))- mkIty "FBits16x8" = FArith (ATInt (ITVec IT16 8))- mkIty "FBits32x4" = FArith (ATInt (ITVec IT32 4))- mkIty "FBits64x2" = FArith (ATInt (ITVec IT64 2))- mkIty x = error $ "Unknown type " ++ x-- mkIntIty "ITNative" = FArith (ATInt ITNative)- mkIntIty "ITChar" = FArith (ATInt ITChar)- mkIntIty "IT8" = FArith (ATInt (ITFixed IT8))- mkIntIty "IT16" = FArith (ATInt (ITFixed IT16))- mkIntIty "IT32" = FArith (ATInt (ITFixed IT32))- mkIntIty "IT64" = FArith (ATInt (ITFixed IT64))--}- irTree :: [Name] -> SC -> Idris LExp irTree args tree = do logLvl 3 $ "Compiling " ++ show args ++ "\n" ++ show tree@@ -685,6 +605,10 @@ matchable (BI _) = True matchable (Ch _) = True matchable (Str _) = True+ matchable (B8 _) = True+ matchable (B16 _) = True+ matchable (B32 _) = True+ matchable (B64 _) = True matchable _ = False matchableTy (AType (ATInt ITNative)) = True
src/IRTS/Lang.hs view
@@ -74,7 +74,7 @@ | LFExp | LFLog | LFSin | LFCos | LFTan | LFASin | LFACos | LFATan | LFSqrt | LFFloor | LFCeil | LFNegate - | LStrHead | LStrTail | LStrCons | LStrIndex | LStrRev+ | LStrHead | LStrTail | LStrCons | LStrIndex | LStrRev | LStrSubstr | LReadStr | LWriteStr -- system info
src/Idris/AbsSyntax.hs view
@@ -31,6 +31,8 @@ import qualified Data.Set as S import Data.Word (Word) +import Data.Generics.Uniplate.Data (descend, descendM)+ import Debug.Trace import System.IO.Error(isUserError, ioeGetErrorString, tryIOError)@@ -200,7 +202,7 @@ where findCoercions t [] = [] findCoercions t (n : ns) = let ps = case lookupTy n (tt_ctxt i) of- [ty'] -> case unApply (getRetTy ty') of+ [ty'] -> case unApply (getRetTy (normalise (tt_ctxt i) [] ty')) of (t', _) -> if t == t' then [n] else [] _ -> [] in@@ -397,6 +399,10 @@ _ -> i putIState $ ist { idris_classes = addDef n i' (idris_classes ist) } +addRecord :: Name -> RecordInfo -> Idris ()+addRecord n ri = do ist <- getIState+ putIState $ ist { idris_records = addDef n ri (idris_records ist) }+ addAutoHint :: Name -> Name -> Idris () addAutoHint n hint = do ist <- getIState@@ -796,6 +802,18 @@ let opt' = opts { opt_evaltypes = n } putIState $ i { idris_options = opt' } +getDesugarNats :: Idris Bool+getDesugarNats = do i <- getIState+ let opts = idris_options i+ return (opt_desugarnats opts)+++setDesugarNats :: Bool -> Idris ()+setDesugarNats n = do i <- getIState+ let opts = idris_options i+ let opt' = opts { opt_desugarnats = n }+ putIState $ i { idris_options = opt' }+ setQuiet :: Bool -> Idris () setQuiet q = do i <- getIState let opts = idris_options i@@ -976,7 +994,7 @@ [Name] -> -- all names [Name] -> -- names with no declaration PTerm -> PTerm-expandParams dec ps ns infs tm = en tm+expandParams dec ps ns infs tm = en 0 tm where -- if we shadow a name (say in a lambda binding) that is used in a call to -- a lifted function, we need access to both names - once in the scope of the@@ -988,78 +1006,85 @@ mkShadow (MN i n) = MN (i+1) n mkShadow (NS x s) = NS (mkShadow x) s - en (PLam fc n nfc t s)+ en :: Int -- ^ The quotation level - only transform terms that are used, not terms+ -- that are merely mentioned.+ -> PTerm -> PTerm+ en 0 (PLam fc n nfc t s) | n `elem` (map fst ps ++ ns) = let n' = mkShadow n in- PLam fc n' nfc (en t) (en (shadow n n' s))- | otherwise = PLam fc n nfc (en t) (en s)- en (PPi p n nfc t s)+ PLam fc n' nfc (en 0 t) (en 0 (shadow n n' s))+ | otherwise = PLam fc n nfc (en 0 t) (en 0 s)+ en 0 (PPi p n nfc t s) | n `elem` (map fst ps ++ ns) = let n' = mkShadow n in -- TODO THINK SHADOWING TacImp?- PPi (enTacImp p) n' nfc (en t) (en (shadow n n' s))- | otherwise = PPi (enTacImp p) n nfc (en t) (en s)- en (PLet fc n nfc ty v s)+ PPi (enTacImp 0 p) n' nfc (en 0 t) (en 0 (shadow n n' s))+ | otherwise = PPi (enTacImp 0 p) n nfc (en 0 t) (en 0 s)+ en 0 (PLet fc n nfc ty v s) | n `elem` (map fst ps ++ ns) = let n' = mkShadow n in- PLet fc n' nfc (en ty) (en v) (en (shadow n n' s))- | otherwise = PLet fc n nfc (en ty) (en v) (en s)+ PLet fc n' nfc (en 0 ty) (en 0 v) (en 0 (shadow n n' s))+ | otherwise = PLet fc n nfc (en 0 ty) (en 0 v) (en 0 s) -- FIXME: Should only do this in a type signature!- en (PDPair f hls p (PRef f' fcs n) t r)+ en 0 (PDPair f hls p (PRef f' fcs n) t r) | n `elem` (map fst ps ++ ns) && t /= Placeholder = let n' = mkShadow n in- PDPair f hls p (PRef f' fcs n') (en t) (en (shadow n n' r))- en (PRewrite f l r g) = PRewrite f (en l) (en r) (fmap en g)- en (PTyped l r) = PTyped (en l) (en r)- en (PPair f hls p l r) = PPair f hls p (en l) (en r)- en (PDPair f hls p l t r) = PDPair f hls p (en l) (en t) (en r)- en (PAlternative ns a as) = PAlternative ns a (map en as)- en (PHidden t) = PHidden (en t)- en (PUnifyLog t) = PUnifyLog (en t)- en (PDisamb ds t) = PDisamb ds (en t)- en (PNoImplicits t) = PNoImplicits (en t)- en (PDoBlock ds) = PDoBlock (map (fmap en) ds)- en (PProof ts) = PProof (map (fmap en) ts)- en (PTactics ts) = PTactics (map (fmap en) ts)+ PDPair f hls p (PRef f' fcs n') (en 0 t) (en 0 (shadow n n' r))+ en 0 (PRewrite f l r g) = PRewrite f (en 0 l) (en 0 r) (fmap (en 0) g)+ en 0 (PTyped l r) = PTyped (en 0 l) (en 0 r)+ en 0 (PPair f hls p l r) = PPair f hls p (en 0 l) (en 0 r)+ en 0 (PDPair f hls p l t r) = PDPair f hls p (en 0 l) (en 0 t) (en 0 r)+ en 0 (PAlternative ns a as) = PAlternative ns a (map (en 0) as)+ en 0 (PHidden t) = PHidden (en 0 t)+ en 0 (PUnifyLog t) = PUnifyLog (en 0 t)+ en 0 (PDisamb ds t) = PDisamb ds (en 0 t)+ en 0 (PNoImplicits t) = PNoImplicits (en 0 t)+ en 0 (PDoBlock ds) = PDoBlock (map (fmap (en 0)) ds)+ en 0 (PProof ts) = PProof (map (fmap (en 0)) ts)+ en 0 (PTactics ts) = PTactics (map (fmap (en 0)) ts) - en (PQuote (Var n))+ en 0 (PQuote (Var n)) | n `nselem` ns = PQuote (Var (dec n))- en (PApp fc (PInferRef fc' hl n) as)+ en 0 (PApp fc (PInferRef fc' hl n) as) | n `nselem` ns = PApp fc (PInferRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))- en (PApp fc (PRef fc' hl n) as)+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ en 0 (PApp fc (PRef fc' hl n) as) | n `elem` infs = PApp fc (PInferRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as)) | n `nselem` ns = PApp fc (PRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))- en (PAppBind fc (PRef fc' hl n) as)+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ en 0 (PAppBind fc (PRef fc' hl n) as) | n `elem` infs = PAppBind fc (PInferRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as)) | n `nselem` ns = PAppBind fc (PRef fc' hl (dec n))- (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))- en (PRef fc hl n)+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap (en 0)) as))+ en 0 (PRef fc hl n) | n `elem` infs = PApp fc (PInferRef fc hl (dec n)) (map (pexp . (PRef fc hl)) (map fst ps)) | n `nselem` ns = PApp fc (PRef fc hl (dec n)) (map (pexp . (PRef fc hl)) (map fst ps))- en (PInferRef fc hl n)+ en 0 (PInferRef fc hl n) | n `nselem` ns = PApp fc (PInferRef fc hl (dec n)) (map (pexp . (PRef fc hl)) (map fst ps))- en (PApp fc f as) = PApp fc (en f) (map (fmap en) as)- en (PAppBind fc f as) = PAppBind fc (en f) (map (fmap en) as)- en (PCase fc c os) = PCase fc (en c) (map (pmap en) os)- en (PIfThenElse fc c t f) = PIfThenElse fc (en c) (en t) (en f)- en (PRunElab fc tm ns) = PRunElab fc (en tm) ns- en (PConstSugar fc tm) = PConstSugar fc (en tm)- en t = t+ en 0 (PApp fc f as) = PApp fc (en 0 f) (map (fmap (en 0)) as)+ en 0 (PAppBind fc f as) = PAppBind fc (en 0 f) (map (fmap (en 0)) as)+ en 0 (PCase fc c os) = PCase fc (en 0 c) (map (pmap (en 0)) os)+ en 0 (PIfThenElse fc c t f) = PIfThenElse fc (en 0 c) (en 0 t) (en 0 f)+ en 0 (PRunElab fc tm ns) = PRunElab fc (en 0 tm) ns+ en 0 (PConstSugar fc tm) = PConstSugar fc (en 0 tm) + en ql (PQuasiquote tm ty) = PQuasiquote (en (ql + 1) tm) (fmap (en ql) ty)+ en ql (PUnquote tm) = PUnquote (en (ql - 1) tm)++ en ql t = descend (en ql) t+ nselem x [] = False nselem x (y : xs) | nseq x y = True | otherwise = nselem x xs nseq x y = nsroot x == nsroot y - enTacImp (TacImp aos st scr) = TacImp aos st (en scr)- enTacImp other = other+ enTacImp ql (TacImp aos st scr) = TacImp aos st (en ql scr)+ enTacImp ql other = other expandParamsD :: Bool -> -- True = RHS only IState ->@@ -1550,103 +1575,109 @@ addImpl' :: Bool -> [Name] -> [Name] -> [Name] -> IState -> PTerm -> PTerm addImpl' inpat env infns imp_meths ist ptm- = mkUniqueNames env [] (ai False (zip env (repeat Nothing)) [] ptm)+ = mkUniqueNames env [] (ai inpat False (zip env (repeat Nothing)) [] ptm) where- ai :: Bool -> [(Name, Maybe PTerm)] -> [[T.Text]] -> PTerm -> PTerm- ai qq env ds (PRef fc fcs f)+ topname = case ptm of+ PRef _ _ n -> n+ PApp _ (PRef _ _ n) _ -> n+ _ -> sUN "" -- doesn't matter then++ ai :: Bool -> Bool -> [(Name, Maybe PTerm)] -> [[T.Text]] -> PTerm -> PTerm+ ai inpat qq env ds (PRef fc fcs f) | f `elem` infns = PInferRef fc fcs f- | not (f `elem` map fst env) = handleErr $ aiFn inpat inpat qq imp_meths ist fc f fc ds []- ai qq env ds (PHidden (PRef fc hl f))- | not (f `elem` map fst env) = PHidden (handleErr $ aiFn inpat False qq imp_meths ist fc f fc ds [])- ai qq env ds (PRewrite fc l r g)- = let l' = ai qq env ds l- r' = ai qq env ds r- g' = fmap (ai qq env ds) g in+ | not (f `elem` map fst env) = handleErr $ aiFn topname inpat inpat qq imp_meths ist fc f fc ds [] []+ ai inpat qq env ds (PHidden (PRef fc hl f))+ | not (f `elem` map fst env) = PHidden (handleErr $ aiFn topname inpat False qq imp_meths ist fc f fc ds [] [])+ ai inpat qq env ds (PRewrite fc l r g)+ = let l' = ai inpat qq env ds l+ r' = ai inpat qq env ds r+ g' = fmap (ai inpat qq env ds) g in PRewrite fc l' r' g'- ai qq env ds (PTyped l r)- = let l' = ai qq env ds l- r' = ai qq env ds r in+ ai inpat qq env ds (PTyped l r)+ = let l' = ai inpat qq env ds l+ r' = ai inpat qq env ds r in PTyped l' r'- ai qq env ds (PPair fc hls p l r)- = let l' = ai qq env ds l- r' = ai qq env ds r in+ ai inpat qq env ds (PPair fc hls p l r)+ = let l' = ai inpat qq env ds l+ r' = ai inpat qq env ds r in PPair fc hls p l' r'- ai qq env ds (PDPair fc hls p l t r)- = let l' = ai qq env ds l- t' = ai qq env ds t- r' = ai qq env ds r in+ ai inpat qq env ds (PDPair fc hls p l t r)+ = let l' = ai inpat qq env ds l+ t' = ai inpat qq env ds t+ r' = ai inpat qq env ds r in PDPair fc hls p l' t' r'- ai qq env ds (PAlternative ms a as)- = let as' = map (ai qq env ds) as in+ ai inpat qq env ds (PAlternative ms a as)+ = let as' = map (ai inpat qq env ds) as in PAlternative ms a as'- ai qq env _ (PDisamb ds' as) = ai qq env ds' as- ai qq env ds (PApp fc (PInferRef ffc hl f) as)- = let as' = map (fmap (ai qq env ds)) as in+ ai inpat qq env _ (PDisamb ds' as) = ai inpat qq env ds' as+ ai inpat qq env ds (PApp fc (PInferRef ffc hl f) as)+ = let as' = map (fmap (ai inpat qq env ds)) as in PApp fc (PInferRef ffc hl f) as'- ai qq env ds (PApp fc ftm@(PRef ffc hl f) as)- | f `elem` infns = ai qq env ds (PApp fc (PInferRef ffc hl f) as)+ ai inpat qq env ds (PApp fc ftm@(PRef ffc hl f) as)+ | f `elem` infns = ai inpat qq env ds (PApp fc (PInferRef ffc hl f) as) | not (f `elem` map fst env)- = let as' = map (fmap (ai qq env ds)) as in- handleErr $ aiFn inpat False qq imp_meths ist fc f ffc ds as'+ = let as' = map (fmap (ai inpat qq env ds)) as + asdotted' = map (fmap (ai False qq env ds)) as in+ handleErr $ aiFn topname inpat False qq imp_meths ist fc f ffc ds as' asdotted' | Just (Just ty) <- lookup f env =- let as' = map (fmap (ai qq env ds)) as+ let as' = map (fmap (ai inpat qq env ds)) as arity = getPArity ty in mkPApp fc arity ftm as'- ai qq env ds (PApp fc f as)- = let f' = ai qq env ds f- as' = map (fmap (ai qq env ds)) as in+ ai inpat qq env ds (PApp fc f as)+ = let f' = ai inpat qq env ds f+ as' = map (fmap (ai inpat qq env ds)) as in mkPApp fc 1 f' as'- ai qq env ds (PCase fc c os)- = let c' = ai qq env ds c in+ ai inpat qq env ds (PCase fc c os)+ = let c' = ai inpat qq env ds c in -- leave os alone, because they get lifted into a new pattern match- -- definition which is passed through addImpl again with more scope+ -- definition which is passed through addImpl agai inpatn with more scope -- information PCase fc c' os - ai qq env ds (PIfThenElse fc c t f) = PIfThenElse fc (ai qq env ds c)- (ai qq env ds t)- (ai qq env ds f)+ ai inpat qq env ds (PIfThenElse fc c t f) = PIfThenElse fc (ai inpat qq env ds c)+ (ai inpat qq env ds t)+ (ai inpat qq env ds f) -- If the name in a lambda is a constructor name, do this as a 'case' -- instead (it is harmless to do so, especially since the lambda will -- be lifted anyway!)- ai qq env ds (PLam fc n nfc ty sc)+ ai inpat qq env ds (PLam fc n nfc ty sc) = case lookupDef n (tt_ctxt ist) of- [] -> let ty' = ai qq env ds ty- sc' = ai qq ((n, Just ty):env) ds sc in+ [] -> let ty' = ai inpat qq env ds ty+ sc' = ai inpat qq ((n, Just ty):env) ds sc in PLam fc n nfc ty' sc'- _ -> ai qq env ds (PLam fc (sMN 0 "lamp") NoFC ty+ _ -> ai inpat qq env ds (PLam fc (sMN 0 "lamp") NoFC ty (PCase fc (PRef fc [] (sMN 0 "lamp") ) [(PRef fc [] n, sc)]))- ai qq env ds (PLet fc n nfc ty val sc)+ ai inpat qq env ds (PLet fc n nfc ty val sc) = case lookupDef n (tt_ctxt ist) of- [] -> let ty' = ai qq env ds ty- val' = ai qq env ds val- sc' = ai qq ((n, Just ty):env) ds sc in+ [] -> let ty' = ai inpat qq env ds ty+ val' = ai inpat qq env ds val+ sc' = ai inpat qq ((n, Just ty):env) ds sc in PLet fc n nfc ty' val' sc' defs ->- ai qq env ds (PCase fc val [(PRef fc [] n, sc)])- ai qq env ds (PPi p n nfc ty sc)- = let ty' = ai qq env ds ty+ ai inpat qq env ds (PCase fc val [(PRef fc [] n, sc)])+ ai inpat qq env ds (PPi p n nfc ty sc)+ = let ty' = ai inpat qq env ds ty env' = if n `elem` imp_meths then env else ((n, Just ty) : env)- sc' = ai qq env' ds sc in+ sc' = ai inpat qq env' ds sc in PPi p n nfc ty' sc'- ai qq env ds (PGoal fc r n sc)- = let r' = ai qq env ds r- sc' = ai qq ((n, Nothing):env) ds sc in+ ai inpat qq env ds (PGoal fc r n sc)+ = let r' = ai inpat qq env ds r+ sc' = ai inpat qq ((n, Nothing):env) ds sc in PGoal fc r' n sc'- ai qq env ds (PHidden tm) = PHidden (ai qq env ds tm)+ ai inpat qq env ds (PHidden tm) = PHidden (ai inpat qq env ds tm) -- Don't do PProof or PTactics since implicits get added when scope is -- properly known in ElabTerm.runTac- ai qq env ds (PUnifyLog tm) = PUnifyLog (ai qq env ds tm)- ai qq env ds (PNoImplicits tm) = PNoImplicits (ai qq env ds tm)- ai qq env ds (PQuasiquote tm g) = PQuasiquote (ai True env ds tm)- (fmap (ai True env ds) g)- ai qq env ds (PUnquote tm) = PUnquote (ai False env ds tm)- ai qq env ds (PRunElab fc tm ns) = PRunElab fc (ai False env ds tm) ns- ai qq env ds (PConstSugar fc tm) = PConstSugar fc (ai qq env ds tm)- ai qq env ds tm = tm+ ai inpat qq env ds (PUnifyLog tm) = PUnifyLog (ai inpat qq env ds tm)+ ai inpat qq env ds (PNoImplicits tm) = PNoImplicits (ai inpat qq env ds tm)+ ai inpat qq env ds (PQuasiquote tm g) = PQuasiquote (ai inpat True env ds tm)+ (fmap (ai inpat True env ds) g)+ ai inpat qq env ds (PUnquote tm) = PUnquote (ai inpat False env ds tm)+ ai inpat qq env ds (PRunElab fc tm ns) = PRunElab fc (ai inpat False env ds tm) ns+ ai inpat qq env ds (PConstSugar fc tm) = PConstSugar fc (ai inpat qq env ds tm)+ ai inpat qq env ds tm = tm handleErr (Left err) = PElabError err handleErr (Right x) = x@@ -1654,14 +1685,15 @@ -- if in a pattern, and there are no arguments, and there's no possible -- names with zero explicit arguments, don't add implicits. -aiFn :: Bool -> Bool -> Bool+aiFn :: Name -> Bool -> Bool -> Bool -> [Name] -> IState -> FC -> Name -- ^ function being applied -> FC -> [[T.Text]]- -> [PArg] -- ^ initial arguments+ -> [PArg] -- ^ initial arguments (if in a pattern)+ -> [PArg] -- ^ initial arguments (if in an expression) -> Either Err PTerm-aiFn inpat True qq imp_meths ist fc f ffc ds []+aiFn topname inpat True qq imp_meths ist fc f ffc ds [] _ = case lookupDef f (tt_ctxt ist) of [] -> Right $ PPatvar ffc f alts -> let ialts = lookupCtxtName f (idris_implicits ist) in@@ -1669,7 +1701,7 @@ if (not (vname f) || tcname f || any (conCaf (tt_ctxt ist)) ialts) -- any constructor alts || any allImp ialts))- then aiFn inpat False qq imp_meths ist fc f ffc ds [] -- use it as a constructor+ then aiFn topname inpat False qq imp_meths ist fc f ffc ds [] [] -- use it as a constructor else Right $ PPatvar ffc f where imp (PExp _ _ _ _) = False imp _ = True@@ -1683,9 +1715,9 @@ vname (UN n) = True -- non qualified vname _ = False -aiFn inpat expat qq imp_meths ist fc f ffc ds as+aiFn topname inpat expat qq imp_meths ist fc f ffc ds as asexp | f `elem` primNames = Right $ PApp fc (PRef ffc [ffc] f) as-aiFn inpat expat qq imp_meths ist fc f ffc ds as+aiFn topname inpat expat qq imp_meths ist fc f ffc ds as asexp -- This is where namespaces get resolved by adding PAlternative = do let ns = lookupCtxtName f (idris_implicits ist) let nh = filter (\(n, _) -> notHidden n) ns@@ -1693,15 +1725,25 @@ [] -> nh x -> x case ns' of- [(f',ns)] -> Right $ mkPApp fc (length ns) (PRef ffc [ffc] (isImpName f f')) (insertImpl ns as)+ [(f',ns)] -> Right $ mkPApp fc (length ns) (PRef ffc [ffc] (isImpName f f')) + (insertImpl ns (chooseArgs f' as asexp)) [] -> if f `elem` (map fst (idris_metavars ist)) then Right $ PApp fc (PRef ffc [ffc] f) as else Right $ mkPApp fc (length as) (PRef ffc [ffc] f) as alts -> Right $ PAlternative [] (ExactlyOne True) $ map (\(f', ns) -> mkPApp fc (length ns) (PRef ffc [ffc] (isImpName f f'))- (insertImpl ns as)) alts+ (insertImpl ns (chooseArgs f' as asexp))) alts where+ -- choose whether to treat the arguments as patterns or expressions+ -- if 'f' is a defined function, treat as expression, otherwise do the default.+ -- This is so any names which later go under a PHidden are treated+ -- as function names rather than bound pattern variables+ chooseArgs f as asexp | isConName f (tt_ctxt ist) = as+ | f == topname = as+ | Nothing <- lookupDefExact f (tt_ctxt ist) = as+ | otherwise = asexp+ -- if the name is in imp_meths, we should actually refer to the bound -- name rather than the global one after expanding implicits isImpName f f' | f `elem` imp_meths = f@@ -2081,43 +2123,46 @@ fullApp x = x shadow :: Name -> Name -> PTerm -> PTerm-shadow n n' t = sm t where- sm (PRef fc hl x) | n == x = PRef fc hl n'- sm (PLam fc x xfc t sc) | n /= x = PLam fc x xfc (sm t) (sm sc)- | otherwise = PLam fc x xfc (sm t) sc- sm (PPi p x fc t sc) | n /= x = PPi p x fc (sm t) (sm sc)- | otherwise = PPi p x fc (sm t) sc- sm (PLet fc x xfc t v sc) | n /= x = PLet fc x xfc (sm t) (sm v) (sm sc)- | otherwise = PLet fc x xfc (sm t) (sm v) sc- sm (PApp f x as) = PApp f (sm x) (map (fmap sm) as)- sm (PAppBind f x as) = PAppBind f (sm x) (map (fmap sm) as)- sm (PCase f x as) = PCase f (sm x) (map (pmap sm) as)- sm (PIfThenElse fc c t f) = PIfThenElse fc (sm c) (sm t) (sm f)- sm (PRewrite f x y tm) = PRewrite f (sm x) (sm y) (fmap sm tm)- sm (PTyped x y) = PTyped (sm x) (sm y)- sm (PPair f hls p x y) = PPair f hls p (sm x) (sm y)- sm (PDPair f hls p x t y) = PDPair f hls p (sm x) (sm t) (sm y)- sm (PAlternative ms a as) = PAlternative ms a (map sm as)- sm (PTactics ts) = PTactics (map (fmap sm) ts)- sm (PProof ts) = PProof (map (fmap sm) ts)- sm (PHidden x) = PHidden (sm x)- sm (PUnifyLog x) = PUnifyLog (sm x)- sm (PNoImplicits x) = PNoImplicits (sm x)- sm x = x+shadow n n' t = sm 0 t where+ sm 0 (PRef fc hl x) | n == x = PRef fc hl n'+ sm 0 (PLam fc x xfc t sc) | n /= x = PLam fc x xfc (sm 0 t) (sm 0 sc)+ | otherwise = PLam fc x xfc (sm 0 t) sc+ sm 0 (PPi p x fc t sc) | n /= x = PPi p x fc (sm 0 t) (sm 0 sc)+ | otherwise = PPi p x fc (sm 0 t) sc+ sm 0 (PLet fc x xfc t v sc) | n /= x = PLet fc x xfc (sm 0 t) (sm 0 v) (sm 0 sc)+ | otherwise = PLet fc x xfc (sm 0 t) (sm 0 v) sc+ sm 0 (PApp f x as) = PApp f (sm 0 x) (map (fmap (sm 0)) as)+ sm 0 (PAppBind f x as) = PAppBind f (sm 0 x) (map (fmap (sm 0)) as)+ sm 0 (PCase f x as) = PCase f (sm 0 x) (map (pmap (sm 0)) as)+ sm 0 (PIfThenElse fc c t f) = PIfThenElse fc (sm 0 c) (sm 0 t) (sm 0 f)+ sm 0 (PRewrite f x y tm) = PRewrite f (sm 0 x) (sm 0 y) (fmap (sm 0) tm)+ sm 0 (PTyped x y) = PTyped (sm 0 x) (sm 0 y)+ sm 0 (PPair f hls p x y) = PPair f hls p (sm 0 x) (sm 0 y)+ sm 0 (PDPair f hls p x t y) = PDPair f hls p (sm 0 x) (sm 0 t) (sm 0 y)+ sm 0 (PAlternative ms a as) = PAlternative ms a (map (sm 0) as)+ sm 0 (PTactics ts) = PTactics (map (fmap (sm 0)) ts)+ sm 0 (PProof ts) = PProof (map (fmap (sm 0)) ts)+ sm 0 (PHidden x) = PHidden (sm 0 x)+ sm 0 (PUnifyLog x) = PUnifyLog (sm 0 x)+ sm 0 (PNoImplicits x) = PNoImplicits (sm 0 x)+ sm 0 (PCoerced t) = PCoerced (sm 0 t)+ sm ql (PQuasiquote tm ty) = PQuasiquote (sm (ql + 1) tm) (fmap (sm ql) ty)+ sm ql (PUnquote tm) = PUnquote (sm (ql - 1) tm)+ sm ql x = descend (sm ql) x -- | Rename any binders which are repeated (so that we don't have to mess -- about with shadowing anywhere else). mkUniqueNames :: [Name] -> [(Name, Name)] -> PTerm -> PTerm mkUniqueNames env shadows tm - = evalState (mkUniq initMap tm) (S.fromList env) where+ = evalState (mkUniq 0 initMap tm) (S.fromList env) where initMap = M.fromList shadows inScope :: S.Set Name inScope = S.fromList $ boundNamesIn tm - mkUniqA nmap arg = do t' <- mkUniq nmap (getTm arg)- return (arg { getTm = t' })+ mkUniqA ql nmap arg = do t' <- mkUniq ql nmap (getTm arg)+ return (arg { getTm = t' }) -- Initialise the unique name with the environment length (so we're not -- looking for too long...)@@ -2127,10 +2172,11 @@ -- FIXME: Probably ought to do this for completeness! It's fine as -- long as there are no bindings inside tactics though.- mkUniqT nmap tac = return tac+ mkUniqT _ nmap tac = return tac - mkUniq :: M.Map Name Name -> PTerm -> State (S.Set Name) PTerm- mkUniq nmap (PLam fc n nfc ty sc)+ mkUniq :: Int -- ^ The number of quotations that we're under+ -> M.Map Name Name -> PTerm -> State (S.Set Name) PTerm+ mkUniq 0 nmap (PLam fc n nfc ty sc) = do env <- get (n', sc') <- if n `S.member` env@@ -2140,10 +2186,10 @@ else return (n, sc) put (S.insert n' env) let nmap' = M.insert n n' nmap- ty' <- mkUniq nmap ty- sc'' <- mkUniq nmap' sc'+ ty' <- mkUniq 0 nmap ty+ sc'' <- mkUniq 0 nmap' sc' return $! PLam fc n' nfc ty' sc''- mkUniq nmap (PPi p n fc ty sc)+ mkUniq 0 nmap (PPi p n fc ty sc) = do env <- get (n', sc') <- if n `S.member` env@@ -2153,10 +2199,10 @@ else return (n, sc) put (S.insert n' env) let nmap' = M.insert n n' nmap- ty' <- mkUniq nmap ty- sc'' <- mkUniq nmap' sc'+ ty' <- mkUniq 0 nmap ty+ sc'' <- mkUniq 0 nmap' sc' return $! PPi p n' fc ty' sc''- mkUniq nmap (PLet fc n nfc ty val sc)+ mkUniq 0 nmap (PLet fc n nfc ty val sc) = do env <- get (n', sc') <- if n `S.member` env@@ -2166,28 +2212,28 @@ else return (n, sc) put (S.insert n' env) let nmap' = M.insert n n' nmap- ty' <- mkUniq nmap ty; val' <- mkUniq nmap val- sc'' <- mkUniq nmap' sc'+ ty' <- mkUniq 0 nmap ty; val' <- mkUniq 0 nmap val+ sc'' <- mkUniq 0 nmap' sc' return $! PLet fc n' nfc ty' val' sc''- mkUniq nmap (PApp fc t args)- = do t' <- mkUniq nmap t- args' <- mapM (mkUniqA nmap) args+ mkUniq 0 nmap (PApp fc t args)+ = do t' <- mkUniq 0 nmap t+ args' <- mapM (mkUniqA 0 nmap) args return $! PApp fc t' args'- mkUniq nmap (PAppBind fc t args)- = do t' <- mkUniq nmap t- args' <- mapM (mkUniqA nmap) args+ mkUniq 0 nmap (PAppBind fc t args)+ = do t' <- mkUniq 0 nmap t+ args' <- mapM (mkUniqA 0 nmap) args return $! PAppBind fc t' args'- mkUniq nmap (PCase fc t alts)- = do t' <- mkUniq nmap t- alts' <- mapM (\(x,y)-> do x' <- mkUniq nmap x; y' <- mkUniq nmap y+ mkUniq 0 nmap (PCase fc t alts)+ = do t' <- mkUniq 0 nmap t+ alts' <- mapM (\(x,y)-> do x' <- mkUniq 0 nmap x; y' <- mkUniq 0 nmap y return (x', y')) alts return $! PCase fc t' alts'- mkUniq nmap (PIfThenElse fc c t f)- = liftM3 (PIfThenElse fc) (mkUniq nmap c) (mkUniq nmap t) (mkUniq nmap f)- mkUniq nmap (PPair fc hls p l r)- = do l' <- mkUniq nmap l; r' <- mkUniq nmap r+ mkUniq 0 nmap (PIfThenElse fc c t f)+ = liftM3 (PIfThenElse fc) (mkUniq 0 nmap c) (mkUniq 0 nmap t) (mkUniq 0 nmap f)+ mkUniq 0 nmap (PPair fc hls p l r)+ = do l' <- mkUniq 0 nmap l; r' <- mkUniq 0 nmap r return $! PPair fc hls p l' r'- mkUniq nmap (PDPair fc hls p (PRef fc' hls' n) t sc)+ mkUniq 0 nmap (PDPair fc hls p (PRef fc' hls' n) t sc) | t /= Placeholder = do env <- get (n', sc') <- if n `S.member` env@@ -2196,26 +2242,37 @@ else return (n, sc) put (S.insert n' env) let nmap' = M.insert n n' nmap- t' <- mkUniq nmap t- sc'' <- mkUniq nmap' sc'+ t' <- mkUniq 0 nmap t+ sc'' <- mkUniq 0 nmap' sc' return $! PDPair fc hls p (PRef fc' hls' n') t' sc''- mkUniq nmap (PDPair fc hls p l t r)- = do l' <- mkUniq nmap l; t' <- mkUniq nmap t; r' <- mkUniq nmap r+ mkUniq 0 nmap (PDPair fc hls p l t r)+ = do l' <- mkUniq 0 nmap l; t' <- mkUniq 0 nmap t; r' <- mkUniq 0 nmap r return $! PDPair fc hls p l' t' r'- mkUniq nmap (PAlternative ns b as)+ mkUniq 0 nmap (PAlternative ns b as) -- store the nmap and defer the rest until we've pruned the set -- during elaboration = return $ PAlternative (M.toList nmap ++ ns) b as- mkUniq nmap (PHidden t) = liftM PHidden (mkUniq nmap t)- mkUniq nmap (PUnifyLog t) = liftM PUnifyLog (mkUniq nmap t)- mkUniq nmap (PDisamb n t) = liftM (PDisamb n) (mkUniq nmap t)- mkUniq nmap (PNoImplicits t) = liftM PNoImplicits (mkUniq nmap t)- mkUniq nmap (PProof ts) = liftM PProof (mapM (mkUniqT nmap) ts)- mkUniq nmap (PTactics ts) = liftM PTactics (mapM (mkUniqT nmap) ts)- mkUniq nmap (PRunElab fc ts ns) = liftM (\tm -> PRunElab fc tm ns) (mkUniq nmap ts)- mkUniq nmap (PConstSugar fc tm) = liftM (PConstSugar fc) (mkUniq nmap tm)- mkUniq nmap t = return (shadowAll (M.toList nmap) t)+ mkUniq 0 nmap (PHidden t) = liftM PHidden (mkUniq 0 nmap t)+ mkUniq 0 nmap (PUnifyLog t) = liftM PUnifyLog (mkUniq 0 nmap t)+ mkUniq 0 nmap (PDisamb n t) = liftM (PDisamb n) (mkUniq 0 nmap t)+ mkUniq 0 nmap (PNoImplicits t) = liftM PNoImplicits (mkUniq 0 nmap t)+ mkUniq 0 nmap (PProof ts) = liftM PProof (mapM (mkUniqT 0 nmap) ts)+ mkUniq 0 nmap (PTactics ts) = liftM PTactics (mapM (mkUniqT 0 nmap) ts)+ mkUniq 0 nmap (PRunElab fc ts ns) = liftM (\tm -> PRunElab fc tm ns) (mkUniq 0 nmap ts)+ mkUniq 0 nmap (PConstSugar fc tm) = liftM (PConstSugar fc) (mkUniq 0 nmap tm)+ mkUniq 0 nmap (PCoerced tm) = liftM PCoerced (mkUniq 0 nmap tm)+ mkUniq 0 nmap t = return $ shadowAll (M.toList nmap) t where shadowAll [] t = t shadowAll ((n, n') : ns) t = shadow n n' (shadowAll ns t) + mkUniq ql nmap (PQuasiquote tm ty) =+ do tm' <- mkUniq (ql + 1) nmap tm+ ty' <- case ty of+ Nothing -> return Nothing+ Just t -> fmap Just $ mkUniq ql nmap t+ return $! PQuasiquote tm' ty'+ mkUniq ql nmap (PUnquote tm) = fmap PUnquote (mkUniq (ql - 1) nmap tm)++ mkUniq ql nmap tm = descendM (mkUniq ql nmap) tm+
src/Idris/AbsSyntaxTree.hs view
@@ -28,7 +28,7 @@ import Data.Data (Data) import Data.Function (on)-import Data.Generics.Uniplate.Data (universe)+import Data.Generics.Uniplate.Data (universe, children) import Data.List hiding (group) import Data.Char import qualified Data.Map.Strict as M@@ -90,8 +90,9 @@ opt_autoImport :: [FilePath], -- ^ e.g. Builtins+Prelude opt_optimise :: [Optimisation], opt_printdepth :: Maybe Int,- opt_evaltypes :: Bool -- ^ normalise types in :t- }+ opt_evaltypes :: Bool, -- ^ normalise types in :t+ opt_desugarnats :: Bool+ } deriving (Show, Eq) defaultOpts = IOption { opt_logLevel = 0@@ -117,10 +118,12 @@ , opt_optimise = defaultOptimise , opt_printdepth = Just 5000 , opt_evaltypes = True+ , opt_desugarnats = False } data PPOption = PPOption { ppopt_impl :: Bool -- ^^ whether to show implicits+ , ppopt_desugarnats :: Bool , ppopt_pinames :: Bool -- ^^ whether to show names in pi bindings , ppopt_depth :: Maybe Int } deriving (Show)@@ -133,12 +136,14 @@ -- | Pretty printing options with default verbosity. defaultPPOption :: PPOption defaultPPOption = PPOption { ppopt_impl = False, + ppopt_desugarnats = False, ppopt_pinames = False, ppopt_depth = Just 200 } -- | Pretty printing options with the most verbosity. verbosePPOption :: PPOption verbosePPOption = PPOption { ppopt_impl = True,+ ppopt_desugarnats = True, ppopt_pinames = True, ppopt_depth = Just 200 } @@ -147,7 +152,8 @@ ppOption opt = PPOption { ppopt_impl = opt_showimp opt, ppopt_pinames = False,- ppopt_depth = opt_printdepth opt+ ppopt_depth = opt_printdepth opt,+ ppopt_desugarnats = opt_desugarnats opt } -- | Get pretty printing options from an idris state record.@@ -177,6 +183,7 @@ idris_implicits :: Ctxt [PArg], idris_statics :: Ctxt [Bool], idris_classes :: Ctxt ClassInfo,+ idris_records :: Ctxt RecordInfo, idris_dsls :: Ctxt DSL, idris_optimisation :: Ctxt OptInfo, idris_datatypes :: Ctxt TypeInfo,@@ -290,6 +297,7 @@ | IBCImp Name | IBCStatic Name | IBCClass Name+ | IBCRecord Name | IBCInstance Bool Bool Name Name | IBCDSL Name | IBCData Name@@ -336,7 +344,7 @@ emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext- emptyContext+ emptyContext emptyContext [] [] [] defaultOpts 6 [] [] [] [] emptySyntaxRules [] [] [] [] [] [] [] [] [] Nothing [] Nothing [] [] Nothing Nothing [] Hidden False [] Nothing [] [] (RawOutput stdout) True defaultTheme [] (0, emptyContext) emptyContext M.empty@@ -501,6 +509,7 @@ | AutoSolve -- ^ Automatically issue "solve" tactic in interactive prover | UseConsoleWidth ConsoleWidth | DumpHighlights+ | DesugarNats deriving (Show, Eq) data ElabShellCmd = EQED | EAbandon | EUndo | EProofState | EProofTerm@@ -967,7 +976,7 @@ | PNoImplicits PTerm -- ^ never run implicit converions on the term | PQuasiquote PTerm (Maybe PTerm) -- ^ `(Term [: Term]) | PUnquote PTerm -- ^ ~Term- | PQuoteName Name FC -- ^ `{n} where the FC is the precise highlighting for the name in particular+ | PQuoteName Name Bool FC -- ^ `{n} where the FC is the precise highlighting for the name in particular. If the Bool is False, then it's `{{n}} and the name won't be resolved. | PRunElab FC PTerm [String] -- ^ %runElab tm - New-style proof script. Args are location, script, enclosing namespace. | PConstSugar FC PTerm -- ^ A desugared constant. The FC is a precise source location that will be used to highlight it later. deriving (Eq, Data, Typeable)@@ -1030,7 +1039,7 @@ mapPTermFC f g (PUnquote t) = PUnquote (mapPTermFC f g t) mapPTermFC f g (PRunElab fc tm ns) = PRunElab (f fc) (mapPTermFC f g tm) ns mapPTermFC f g (PConstSugar fc tm) = PConstSugar (g fc) (mapPTermFC f g tm)-mapPTermFC f g (PQuoteName n fc) = PQuoteName n (g fc)+mapPTermFC f g (PQuoteName n x fc) = PQuoteName n x (g fc) {-! dg instance Binary PTerm@@ -1257,7 +1266,7 @@ highestFC (PNoImplicits tm) = highestFC tm highestFC (PQuasiquote _ _) = Nothing highestFC (PUnquote tm) = highestFC tm-highestFC (PQuoteName _ fc) = Just fc+highestFC (PQuoteName _ _ fc) = Just fc highestFC (PRunElab fc _ _) = Just fc highestFC (PConstSugar fc _) = Just fc highestFC (PAppImpl t _) = highestFC t@@ -1277,6 +1286,12 @@ deriving instance NFData ClassInfo !-} +-- Record data+data RecordInfo = RI { record_parameters :: [(Name,PTerm)],+ record_constructor :: Name,+ record_projections :: [Name] }+ deriving Show+ -- Type inference data data TIData = TIPartial -- ^ a function with a partially defined type@@ -1645,7 +1660,7 @@ prettySe d p bnd (PPatvar fc n) = pretty n prettySe d p bnd e | Just str <- slist d p bnd e = depth d $ str- | Just n <- snat d p e = depth d $ annotate (AnnData "Nat" "") (text (show n))+ | Just n <- snat ppo d p e = depth d $ annotate (AnnData "Nat" "") (text (show n)) prettySe d p bnd (PRef fc _ n) = prettyName True (ppopt_impl ppo) bnd n prettySe d p bnd (PLam fc n nfc ty sc) = depth d . bracket p startPrec . group . align . hang 2 $@@ -1862,7 +1877,9 @@ prettySe d p bnd (PQuasiquote t Nothing) = text "`(" <> prettySe (decD d) p [] t <> text ")" prettySe d p bnd (PQuasiquote t (Just g)) = text "`(" <> prettySe (decD d) p [] t <+> colon <+> prettySe (decD d) p [] g <> text ")" prettySe d p bnd (PUnquote t) = text "~" <> prettySe (decD d) p bnd t- prettySe d p bnd (PQuoteName n _) = text "`{" <> prettyName True (ppopt_impl ppo) bnd n <> text "}"+ prettySe d p bnd (PQuoteName n res _) = text start <> prettyName True (ppopt_impl ppo) bnd n <> text end+ where start = if res then "`{" else "`{{"+ end = if res then "}" else "}}" prettySe d p bnd (PRunElab _ tm _) = bracket p funcAppPrec . group . align . hang 2 $ text "%runElab" <$>@@ -1934,15 +1951,20 @@ natns = "Prelude.Nat." - snat :: Maybe Int -> Int -> PTerm -> Maybe Integer- snat (Just x) _ _ | x <= 0 = Nothing- snat d p (PRef _ _ z)- | show z == (natns++"Z") || show z == "Z" = Just 0- snat d p (PApp _ s [PExp {getTm=n}])- | show s == (natns++"S") || show s == "S",- Just n' <- snat (decD d) p n- = Just $ 1 + n'- snat _ _ _ = Nothing+ snat :: PPOption -> Maybe Int -> Int -> PTerm -> Maybe Integer+ snat ppo d p e+ | ppopt_desugarnats ppo = Nothing+ | otherwise = snat' d p e+ where+ snat' :: Maybe Int -> Int -> PTerm -> Maybe Integer+ snat' (Just x) _ _ | x <= 0 = Nothing+ snat' d p (PRef _ _ z)+ | show z == (natns++"Z") || show z == "Z" = Just 0+ snat' d p (PApp _ s [PExp {getTm=n}])+ | show s == (natns++"S") || show s == "S",+ Just n' <- snat' (decD d) p n+ = Just $ 1 + n'+ snat' _ _ _ = Nothing bracket outer inner doc | outer > inner = lparen <> doc <> rparen@@ -2155,160 +2177,216 @@ -- Return all names, free or globally bound, in the given term. allNamesIn :: PTerm -> [Name]-allNamesIn tm = nub $ ni [] tm+allNamesIn tm = nub $ ni 0 [] tm where -- TODO THINK added niTacImp, but is it right?- ni env (PRef _ _ n)+ ni 0 env (PRef _ _ n) | not (n `elem` env) = [n]- ni env (PPatvar _ n) = [n]- ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)- ni env (PIfThenElse _ c t f) = ni env c ++ ni env t ++ ni env f- ni env (PLam fc n _ ty sc) = ni env ty ++ ni (n:env) sc- ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc- ni env (PLet _ n _ ty val sc) = ni env ty ++ ni env val ++ ni (n:env) sc- ni env (PHidden tm) = ni env tm- ni env (PRewrite _ l r _) = ni env l ++ ni env r- ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni env r- ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative ns a ls) = concatMap (ni env) ls- ni env (PUnifyLog tm) = ni env tm- ni env (PDisamb _ tm) = ni env tm- ni env (PNoImplicits tm) = ni env tm- ni env _ = []+ ni 0 env (PPatvar _ n) = [n]+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)+ ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env) (map snd os)+ ni 0 env (PIfThenElse _ c t f) = ni 0 env c ++ ni 0 env t ++ ni 0 env f+ ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PLet _ n _ ty val sc) = ni 0 env ty ++ ni 0 env val ++ ni 0 (n:env) sc+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r+ ni 0 env (PAlternative ns a ls) = concatMap (ni 0 env) ls+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm - niTacImp env (TacImp _ _ scr) = ni env scr- niTacImp _ _ = []+ ni i env (PQuasiquote tm ty) = ni (i+1) env tm ++ maybe [] (ni i env) ty+ ni i env (PUnquote tm) = ni (i - 1) env tm + ni i env tm = concatMap (ni i env) (children tm) + niTacImp i env (TacImp _ _ scr) = ni i env scr+ niTacImp _ _ _ = []++ -- Return all names defined in binders in the given term boundNamesIn :: PTerm -> [Name]-boundNamesIn tm = S.toList (ni S.empty tm)+boundNamesIn tm = S.toList (ni 0 S.empty tm) where -- TODO THINK Added niTacImp, but is it right?- ni set (PApp _ f as) = niTms (ni set f) (map getTm as)- ni set (PAppBind _ f as) = niTms (ni set f) (map getTm as)- ni set (PCase _ c os) = niTms (ni set c) (map snd os)- ni set (PIfThenElse _ c t f) = niTms set [c, t, f]- ni set (PLam fc n _ ty sc) = S.insert n $ ni (ni set ty) sc- ni set (PLet fc n nfc ty val sc) = S.insert n $ ni (ni (ni set ty) val) sc- ni set (PPi p n _ ty sc) = niTacImp (S.insert n $ ni (ni set ty) sc) p- ni set (PRewrite _ l r _) = ni (ni set l) r- ni set (PTyped l r) = ni (ni set l) r- ni set (PPair _ _ _ l r) = ni (ni set l) r- ni set (PDPair _ _ _ (PRef _ _ n) t r) = ni (ni set t) r- ni set (PDPair _ _ _ l t r) = ni (ni (ni set l) t) r- ni set (PAlternative ns a as) = niTms set as- ni set (PHidden tm) = ni set tm- ni set (PUnifyLog tm) = ni set tm- ni set (PDisamb _ tm) = ni set tm- ni set (PNoImplicits tm) = ni set tm- ni set _ = set+ ni :: Int -> S.Set Name -> PTerm -> S.Set Name+ ni 0 set (PApp _ f as) = niTms 0 (ni 0 set f) (map getTm as)+ ni 0 set (PAppBind _ f as) = niTms 0 (ni 0 set f) (map getTm as)+ ni 0 set (PCase _ c os) = niTms 0 (ni 0 set c) (map snd os)+ ni 0 set (PIfThenElse _ c t f) = niTms 0 set [c, t, f]+ ni 0 set (PLam fc n _ ty sc) = S.insert n $ ni 0 (ni 0 set ty) sc+ ni 0 set (PLet fc n nfc ty val sc) = S.insert n $ ni 0 (ni 0 (ni 0 set ty) val) sc+ ni 0 set (PPi p n _ ty sc) = niTacImp 0 (S.insert n $ ni 0 (ni 0 set ty) sc) p+ ni 0 set (PRewrite _ l r _) = ni 0 (ni 0 set l) r+ ni 0 set (PTyped l r) = ni 0 (ni 0 set l) r+ ni 0 set (PPair _ _ _ l r) = ni 0 (ni 0 set l) r+ ni 0 set (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 (ni 0 set t) r+ ni 0 set (PDPair _ _ _ l t r) = ni 0 (ni 0 (ni 0 set l) t) r+ ni 0 set (PAlternative ns a as) = niTms 0 set as+ ni 0 set (PHidden tm) = ni 0 set tm+ ni 0 set (PUnifyLog tm) = ni 0 set tm+ ni 0 set (PDisamb _ tm) = ni 0 set tm+ ni 0 set (PNoImplicits tm) = ni 0 set tm - niTms set [] = set- niTms set (x : xs) = niTms (ni set x) xs+ ni i set (PQuasiquote tm ty) = ni (i + 1) set tm `S.union` maybe S.empty (ni i set) ty+ ni i set (PUnquote tm) = ni (i - 1) set tm - niTacImp set (TacImp _ _ scr) = ni set scr- niTacImp set _ = set+ ni i set tm = foldr S.union set (map (ni i set) (children tm)) + niTms :: Int -> S.Set Name -> [PTerm] -> S.Set Name+ niTms i set [] = set+ niTms i set (x : xs) = niTms i (ni i set x) xs++ niTacImp i set (TacImp _ _ scr) = ni i set scr+ niTacImp i set _ = set+ -- Return names which are valid implicits in the given term (type). implicitNamesIn :: [Name] -> IState -> PTerm -> [Name]-implicitNamesIn uvars ist tm = nub $ ni [] tm+implicitNamesIn uvars ist tm + = let (imps, fns) = execState (ni 0 [] tm) ([], []) in+ nub imps \\ nub fns where- ni env (PRef _ _ n)+ addImp n = do (imps, fns) <- get+ put (n : imps, fns)+ addFn n = do (imps, fns) <- get+ put (imps, n: fns)++ notCAF [] = False+ notCAF (PExp _ _ _ _ : _) = True+ notCAF (_ : xs) = notCAF xs++ notHidden (n, _) = case getAccessibility n of+ Hidden -> False+ _ -> True++ getAccessibility n+ = case lookupDefAccExact n False (tt_ctxt ist) of+ Just (n,t) -> t+ _ -> Public++ ni 0 env (PRef _ _ n@(NS _ _)) | not (n `elem` env)- = case lookupTy n (tt_ctxt ist) of- [] -> [n]- _ -> if n `elem` uvars then [n] else []- ni env (PApp _ f@(PRef _ _ n) as)- | n `elem` uvars = ni env f ++ concatMap (ni env) (map getTm as)- | otherwise = concatMap (ni env) (map getTm as)- ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PCase _ c os) = ni env c +++ -- Never implicitly bind if there's a namespace+ = addFn n+ ni 0 env (PRef _ _ n)+ | not (n `elem` env) && implicitable n || n `elem` uvars = addImp n+ ni 0 env (PApp _ f@(PRef _ _ n) as)+ | n `elem` uvars = do ni 0 env f + mapM_ (ni 0 env) (map getTm as)+ | otherwise = do case lookupTy n (tt_ctxt ist) of+ [] -> return ()+ _ -> addFn n+ mapM_ (ni 0 env) (map getTm as)+ ni 0 env (PApp _ f as) = do ni 0 env f + mapM_ (ni 0 env) (map getTm as)+ ni 0 env (PAppBind _ f as) = do ni 0 env f + mapM_ (ni 0 env) (map getTm as)+ ni 0 env (PCase _ c os) = do ni 0 env c -- names in 'os', not counting the names bound in the cases- (nub (concatMap (ni env) (map snd os))- \\ nub (concatMap (ni env) (map fst os)))- ni env (PIfThenElse _ c t f) = concatMap (ni env) [c, t, f]- ni env (PLam fc n _ ty sc) = ni env ty ++ ni (n:env) sc- ni env (PPi p n _ ty sc) = ni env ty ++ ni (n:env) sc- ni env (PRewrite _ l r _) = ni env l ++ ni env r- ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative ns a as) = concatMap (ni env) as- ni env (PHidden tm) = ni env tm- ni env (PUnifyLog tm) = ni env tm- ni env (PDisamb _ tm) = ni env tm- ni env (PNoImplicits tm) = ni env tm- ni env _ = []+ mapM_ (ni 0 env) (map snd os)+ (imps, fns) <- get+ put ([] ,[])+ mapM_ (ni 0 env) (map fst os)+ (impsfst, _) <- get+ put (nub imps \\ nub impsfst, fns)+ ni 0 env (PIfThenElse _ c t f) = mapM_ (ni 0 env) [c, t, f]+ ni 0 env (PLam fc n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc+ ni 0 env (PPi p n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc+ ni 0 env (PRewrite _ l r _) = do ni 0 env l; ni 0 env r+ ni 0 env (PTyped l r) = do ni 0 env l; ni 0 env r+ ni 0 env (PPair _ _ _ l r) = do ni 0 env l; ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = do ni 0 env t; ni 0 (n:env) r+ ni 0 env (PDPair _ _ _ l t r) = do ni 0 env l + ni 0 env t+ ni 0 env r+ ni 0 env (PAlternative ns a as) = mapM_ (ni 0 env) as+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm + ni i env (PQuasiquote tm ty) = do ni (i + 1) env tm+ maybe (return ()) (ni i env) ty+ ni i env (PUnquote tm) = ni (i - 1) env tm++ ni i env tm = mapM_ (ni i env) (children tm)+ -- Return names which are free in the given term. namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name]-namesIn uvars ist tm = nub $ ni [] tm+namesIn uvars ist tm = nub $ ni 0 [] tm where- ni env (PRef _ _ n)+ ni 0 env (PRef _ _ n) | not (n `elem` env) = case lookupTy n (tt_ctxt ist) of [] -> [n] _ -> if n `elem` (map fst uvars) then [n] else []- ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PCase _ c os) = ni env c +++ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)+ ni 0 env (PCase _ c os) = ni 0 env c ++ -- names in 'os', not counting the names bound in the cases- (nub (concatMap (ni env) (map snd os))- \\ nub (concatMap (ni env) (map fst os)))- ni env (PIfThenElse _ c t f) = concatMap (ni env) [c, t, f]- ni env (PLam fc n nfc ty sc) = ni env ty ++ ni (n:env) sc- ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc- ni env (PRewrite _ l r _) = ni env l ++ ni env r- ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative ns a as) = concatMap (ni env) as- ni env (PHidden tm) = ni env tm- ni env (PUnifyLog tm) = ni env tm- ni env (PDisamb _ tm) = ni env tm- ni env (PNoImplicits tm) = ni env tm- ni env _ = []+ (nub (concatMap (ni 0 env) (map snd os))+ \\ nub (concatMap (ni 0 env) (map fst os)))+ ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]+ ni 0 env (PLam fc n nfc ty sc) = ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r+ ni 0 env (PAlternative ns a as) = concatMap (ni 0 env) as+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm - niTacImp env (TacImp _ _ scr) = ni env scr- niTacImp _ _ = []+ ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty+ ni i env (PUnquote tm) = ni (i - 1) env tm + ni i env tm = concatMap (ni i env) (children tm)++ niTacImp i env (TacImp _ _ scr) = ni i env scr+ niTacImp _ _ _ = []+ -- Return which of the given names are used in the given term. usedNamesIn :: [Name] -> IState -> PTerm -> [Name]-usedNamesIn vars ist tm = nub $ ni [] tm+usedNamesIn vars ist tm = nub $ ni 0 [] tm where -- TODO THINK added niTacImp, but is it right?- ni env (PRef _ _ n)+ ni 0 env (PRef _ _ n) | n `elem` vars && not (n `elem` env) = case lookupDefExact n (tt_ctxt ist) of Nothing -> [n] _ -> []- ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)- ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)- ni env (PIfThenElse _ c t f) = concatMap (ni env) [c, t, f]- ni env (PLam fc n _ ty sc) = ni env ty ++ ni (n:env) sc- ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc- ni env (PRewrite _ l r _) = ni env l ++ ni env r- ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative ns a as) = concatMap (ni env) as- ni env (PHidden tm) = ni env tm- ni env (PUnifyLog tm) = ni env tm- ni env (PDisamb _ tm) = ni env tm- ni env (PNoImplicits tm) = ni env tm- ni env _ = []+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)+ ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env) (map snd os)+ ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]+ ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r+ ni 0 env (PAlternative ns a as) = concatMap (ni 0 env) as+ ni 0 env (PHidden tm) = ni 0 env tm+ ni 0 env (PUnifyLog tm) = ni 0 env tm+ ni 0 env (PDisamb _ tm) = ni 0 env tm+ ni 0 env (PNoImplicits tm) = ni 0 env tm - niTacImp env (TacImp _ _ scr) = ni env scr- niTacImp _ _ = []+ ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty+ ni i env (PUnquote tm) = ni (i - 1) env tm++ ni i env tm = concatMap (ni i env) (children tm)++ niTacImp i env (TacImp _ _ scr) = ni i env scr+ niTacImp _ _ _ = [] -- Return the list of inaccessible (= dotted) positions for a name. getErasureInfo :: IState -> Name -> [Int]
src/Idris/Completion.hs view
@@ -87,6 +87,7 @@ , "originalerrors" , "autosolve" , "nobanner"+ , "desugarnats" ] completeConsoleWidth :: CompletionFunc Idris
src/Idris/Core/DeepSeq.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE BangPatterns, ViewPatterns #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.Core.DeepSeq where@@ -15,6 +16,48 @@ rnf NErased = () rnf (SN x1) = rnf x1 `seq` () rnf (SymRef x1) = rnf x1 `seq` ()++instance NFData Context where+ rnf ctxt = rnf (next_tvar ctxt) `seq` rnf (definitions ctxt) `seq` ()++-- | Forcing the contents of a context, for diagnosing and working+-- around space leaks+forceDefCtxt :: Context -> Context+forceDefCtxt (force -> !ctxt) = ctxt++instance NFData NameOutput where+ rnf TypeOutput = ()+ rnf FunOutput = ()+ rnf DataOutput = ()+ rnf MetavarOutput = ()+ rnf PostulateOutput = ()++instance NFData TextFormatting where+ rnf BoldText = ()+ rnf ItalicText = ()+ rnf UnderlineText = ()++instance NFData Ordering where+ rnf LT = ()+ rnf EQ = ()+ rnf GT = ()++instance NFData OutputAnnotation where+ rnf (AnnName x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` ()+ rnf (AnnBoundName x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (AnnConst x1) = rnf x1 `seq` ()+ rnf (AnnData x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (AnnType x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (AnnKeyword) = ()+ rnf (AnnFC x) = rnf x `seq` ()+ rnf (AnnTextFmt x) = rnf x `seq` ()+ rnf (AnnLink x) = rnf x `seq` ()+ rnf (AnnTerm x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (AnnSearchResult x1) = rnf x1 `seq` ()+ rnf (AnnErr x1) = rnf x1 `seq` ()+ rnf (AnnNamespace x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (AnnQuasiquote) = ()+ rnf (AnnAntiquote) = () instance NFData SpecialName where rnf (WhereN x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` ()
src/Idris/Core/Elaborate.hs view
@@ -309,7 +309,7 @@ return $! (instances (fst p)) -- | get auto argument names-get_autos :: Elab' aux [(Name, [Name])]+get_autos :: Elab' aux [(Name, ([FailContext], [Name]))] get_autos = do ES p _ _ <- get return $! (autos (fst p)) @@ -502,9 +502,10 @@ unifyProblems :: Elab' aux () unifyProblems = processTactic' UnifyProblems -defer :: [Name] -> Name -> Elab' aux ()+defer :: [Name] -> Name -> Elab' aux Name defer ds n = do n' <- unique_hole n processTactic' (Defer ds n')+ return n' deferType :: Name -> Raw -> [Name] -> Elab' aux () deferType n ty ns = processTactic' (DeferType n ty ns)
src/Idris/Core/Evaluate.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, BangPatterns, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} @@ -802,12 +802,14 @@ definitions :: Ctxt (Def, Accessibility, Totality, MetaInformation) } deriving Show + -- | The initial empty context initContext = MkContext 0 emptyContext + mapDefCtxt :: (Def -> Def) -> Context -> Context-mapDefCtxt f (MkContext t defs) = MkContext t (mapCtxt f' defs)- where f' (d, a, t, m) = f' (f d, a, t, m)+mapDefCtxt f (MkContext t !defs) = MkContext t (mapCtxt f' defs)+ where f' (!d, a, t, m) = f' (f d, a, t, m) -- | Get the definitions from a context ctxtAlist :: Context -> [(Name, Def)]@@ -818,44 +820,44 @@ addToCtxt :: Name -> Term -> Type -> Context -> Context addToCtxt n tm ty uctxt = let ctxt = definitions uctxt- ctxt' = addDef n (Function ty tm, Public, Unchecked, EmptyMI) ctxt in+ !ctxt' = addDef n (Function ty tm, Public, Unchecked, EmptyMI) ctxt in uctxt { definitions = ctxt' } setAccess :: Name -> Accessibility -> Context -> Context setAccess n a uctxt = let ctxt = definitions uctxt- ctxt' = updateDef n (\ (d, _, t, m) -> (d, a, t, m)) ctxt in+ !ctxt' = updateDef n (\ (d, _, t, m) -> (d, a, t, m)) ctxt in uctxt { definitions = ctxt' } setTotal :: Name -> Totality -> Context -> Context setTotal n t uctxt = let ctxt = definitions uctxt- ctxt' = updateDef n (\ (d, a, _, m) -> (d, a, t, m)) ctxt in+ !ctxt' = updateDef n (\ (d, a, _, m) -> (d, a, t, m)) ctxt in uctxt { definitions = ctxt' } setMetaInformation :: Name -> MetaInformation -> Context -> Context setMetaInformation n m uctxt = let ctxt = definitions uctxt- ctxt' = updateDef n (\ (d, a, t, _) -> (d, a, t, m)) ctxt in+ !ctxt' = updateDef n (\ (d, a, t, _) -> (d, a, t, m)) ctxt in uctxt { definitions = ctxt' } addCtxtDef :: Name -> Def -> Context -> Context addCtxtDef n d c = let ctxt = definitions c- ctxt' = addDef n (d, Public, Unchecked, EmptyMI) $! ctxt in+ !ctxt' = addDef n (d, Public, Unchecked, EmptyMI) $! ctxt in c { definitions = ctxt' } addTyDecl :: Name -> NameType -> Type -> Context -> Context addTyDecl n nt ty uctxt = let ctxt = definitions uctxt- ctxt' = addDef n (TyDecl nt ty, Public, Unchecked, EmptyMI) ctxt in+ !ctxt' = addDef n (TyDecl nt ty, Public, Unchecked, EmptyMI) ctxt in uctxt { definitions = ctxt' } addDatatype :: Datatype Name -> Context -> Context addDatatype (Data n tag ty unique cons) uctxt = let ctxt = definitions uctxt ty' = normalise uctxt [] ty- ctxt' = addCons 0 cons (addDef n- (TyDecl (TCon tag (arity ty')) ty, Public, Unchecked, EmptyMI) ctxt) in+ !ctxt' = addCons 0 cons (addDef n+ (TyDecl (TCon tag (arity ty')) ty, Public, Unchecked, EmptyMI) ctxt) in uctxt { definitions = ctxt' } where addCons tag [] ctxt = ctxt
src/Idris/Core/ProofState.hs view
@@ -38,7 +38,7 @@ injective :: [Name], deferred :: [Name], -- ^ names we'll need to define instances :: [Name], -- ^ instance arguments (for type classes)- autos :: [(Name, [Name])], -- ^ unsolved 'auto' implicits with their holes+ autos :: [(Name, ([FailContext], [Name]))], -- ^ unsolved 'auto' implicits with their holes psnames :: [Name], -- ^ Local names okay to use in proof search previous :: Maybe ProofState, -- ^ for undo context :: Context,@@ -154,7 +154,7 @@ holeName i = sMN i "hole" qshow :: Fails -> String-qshow fs = show (map (\ (x, y, hs, _, _, _, t) -> (t, x, y, hs)) fs)+qshow fs = show (map (\ (x, y, hs, env, _, _, t) -> (t, map fst env, x, y, hs)) fs) match_unify' :: Context -> Env -> (TT Name, Maybe Provenance) -> @@ -218,7 +218,7 @@ ("Trying " ++ show (topx, topy) ++ "\nNormalised " ++ show (normalise ctxt env topx, normalise ctxt env topy) ++- " in " ++ show env +++ " in\n" ++ show env ++ "\nHoles: " ++ show (holes ps) ++ "\nInjective: " ++ show (injective ps) ++ "\n") $@@ -415,7 +415,7 @@ Nothing -> let hs = holes ps in ps { holes = (hs \\ [x]) ++ [x],- autos = (x, refsIn t) : autos ps }+ autos = (x, (while_elaborating ps, refsIn t)) : autos ps } Just _ -> ps) return (Bind x (Hole t) sc) @@ -429,7 +429,8 @@ defer dropped n ctxt env (Bind x (Hole t) (P nt x' ty)) | x == x' = do let env' = filter (\(n, t) -> n `notElem` dropped) env action (\ps -> let hs = holes ps in- ps { holes = hs \\ [x] })+ ps { usedns = n : usedns ps,+ holes = hs \\ [x] }) ps <- get return (Bind n (GHole (length env') (psnames ps) (mkTy (reverse env') t)) (mkApp (P Ref n ty) (map getP (reverse env'))))@@ -904,6 +905,8 @@ getProvenance (CantUnify _ (_, lp) (_, rp) _ _ _) = (lp, rp) getProvenance _ = (Nothing, Nothing) +setReady (x, y, _, env, err, c, at) = (x, y, True, env, err, c, at)+ updateProblems :: ProofState -> [(Name, TT Name)] -> Fails -> ([(Name, TT Name)], Fails) -- updateProblems ctxt [] ps inj holes = ([], ps)@@ -1009,7 +1012,7 @@ computeLet (context ps) n (getProofTerm (pterm ps)) }, "") processTactic UnifyProblems ps- = do let (ns', probs') = updateProblems ps [] (problems ps)+ = do let (ns', probs') = updateProblems ps [] (map setReady (problems ps)) pterm' = updateSolved ns' (pterm ps) traceWhen (unifylog ps) ("(UnifyProblems) Dropping holes: " ++ show (map fst ns')) $ return (ps { pterm = pterm', solved = Nothing, problems = probs',@@ -1020,15 +1023,18 @@ holes = holes ps \\ (map fst ns') }, plog ps) where notIn ns (h, _) = h `notElem` map fst ns processTactic (MatchProblems all) ps- = do let (ns', probs') = matchProblems all ps [] (problems ps)+ = do let (ns', probs') = matchProblems all ps [] (map setReady (problems ps)) (ns'', probs'') = matchProblems all ps ns' probs'- pterm' = updateSolved ns'' (pterm ps)- traceWhen (unifylog ps) ("(MatchProblems) Dropping holes: " ++ show (map fst ns'')) $+ pterm' = orderUpdateSolved ns'' (resetProofTerm (pterm ps))+ traceWhen (unifylog ps) ("(MatchProblems) Dropping holes: " ++ show ns'') $ return (ps { pterm = pterm', solved = Nothing, problems = probs'', previous = Just ps, plog = "", notunified = updateNotunified ns'' (notunified ps), recents = recents ps ++ map fst ns'', holes = holes ps \\ (map fst ns'') }, plog ps)+ where+ orderUpdateSolved [] t = t+ orderUpdateSolved (n : ns) t = orderUpdateSolved ns (updateSolved [n] t) processTactic t ps = case holes ps of [] -> case t of
src/Idris/Core/ProofTerm.hs view
@@ -6,6 +6,7 @@ -} module Idris.Core.ProofTerm(ProofTerm, Goal(..), mkProofTerm, getProofTerm,+ resetProofTerm, updateSolved, updateSolvedTerm, updateSolvedTerm', bound_in, bound_in_term, refocus, updsubst, Hole, RunTactic',@@ -128,6 +129,9 @@ getProofTerm :: ProofTerm -> Term getProofTerm (PT path _ sub ups) = rebuildTerm sub (updateSolvedPath ups path) ++resetProofTerm :: ProofTerm -> ProofTerm+resetProofTerm = mkProofTerm . getProofTerm same :: Eq a => Maybe a -> a -> Bool same Nothing n = True
src/Idris/Core/TT.hs view
@@ -51,6 +51,7 @@ import Control.Applicative (Applicative (..), Alternative) import qualified Control.Applicative as A (Alternative (..))+import Control.DeepSeq (($!!)) import Control.Monad.State.Strict import Control.Monad.Trans.Except (Except (..)) import Debug.Trace@@ -376,6 +377,21 @@ show x ++ ": " ++ show e show (Elaborating what n e) = "Elaborating " ++ what ++ show n ++ ":" ++ show e show (ProofSearchFail e) = "Proof search fail: " ++ show e+ show (InfiniteUnify _ _ _) = "InfiniteUnify"+ show (UnifyScope _ _ _ _) = "UnifyScope"+ show (NonFunctionType _ _) = "NonFunctionType"+ show (NotEquality _ _) = "NotEquality"+ show (TooManyArguments _) = "TooManyArguments"+ show (CantIntroduce _) = "CantIntroduce"+ show (NoSuchVariable _) = "NoSuchVariable"+ show (WithFnType _) = "WithFnType"+ show (NoTypeDecl _) = "NoTypeDecl"+ show (NotInjective _ _ _) = "NotInjective"+ show (CantResolve _ _) = "CantResolve"+ show (InvalidTCArg _ _) = "InvalidTCArg"+ show (CantResolveAlts _) = "CantResolveAlts"+ show (NoValidAlts _) = "NoValidAlts"+ show (IncompleteTerm _) = "IncompleteTerm" show _ = "Error" instance Pretty Err OutputAnnotation where@@ -423,11 +439,11 @@ -- | Names are hierarchies of strings, describing scope (so no danger of -- duplicate names, but need to be careful on lookup).-data Name = UN T.Text -- ^ User-provided name- | NS Name [T.Text] -- ^ Root, namespaces- | MN Int T.Text -- ^ Machine chosen names+data Name = UN !T.Text -- ^ User-provided name+ | NS !Name [T.Text] -- ^ Root, namespaces+ | MN !Int !T.Text -- ^ Machine chosen names | NErased -- ^ Name of something which is never used in scope- | SN SpecialName -- ^ Decorated function names+ | SN !SpecialName -- ^ Decorated function names | SymRef Int -- ^ Reference to IBC file symbol table (used during serialisation) deriving (Eq, Ord, Data, Typeable) @@ -448,7 +464,7 @@ sUN s = UN (txt s) sNS :: Name -> [String] -> Name-sNS n ss = NS n (map txt ss)+sNS n ss = NS n $!! (map txt ss) sMN :: Int -> String -> Name sMN i s = MN i (txt s)@@ -458,15 +474,15 @@ deriving instance NFData Name !-} -data SpecialName = WhereN Int Name Name- | WithN Int Name- | InstanceN Name [T.Text]- | ParentN Name T.Text- | MethodN Name- | CaseN Name- | ElimN Name- | InstanceCtorN Name- | MetaN Name Name+data SpecialName = WhereN !Int !Name !Name+ | WithN !Int !Name+ | InstanceN !Name [T.Text]+ | ParentN !Name !T.Text+ | MethodN !Name+ | CaseN !Name+ | ElimN !Name+ | InstanceCtorN !Name+ | MetaN !Name !Name deriving (Eq, Ord, Data, Typeable) {-! deriving instance Binary SpecialName
src/Idris/Core/Unify.hs view
@@ -8,6 +8,7 @@ import Control.Monad import Control.Monad.State.Strict+import Data.Maybe import Data.List import Debug.Trace @@ -92,31 +93,6 @@ StateT UInfo TC [(Name, TT Name)] - -- This rule is highly dubious... it certainly produces a valid answer- -- but it scares me. However, matching is never guaranteed to give a unique- -- answer, merely a valid one, so perhaps we're okay.- -- In other words: it may vanish without warning some day :)- un names x tm@(App _ (P _ f (Bind fn (Pi _ t _) sc)) a)- | (P (TCon _ _) _ _, _) <- unApply x,- holeIn env f || f `elem` holes- = let n' = uniqueName (sMN 0 "mv") (map fst env) in- checkCycle names (f, Bind n' (Lam t) x)- un names tm@(App _ (P _ f (Bind fn (Pi _ t _) sc)) a) x- | (P (TCon _ _) _ _, _) <- unApply x,- holeIn env f || f `elem` holes- = let n' = uniqueName fn (map fst env) in- checkCycle names (f, Bind n' (Lam t) x)- un names x tm@(App _ (P _ f (Bind fn (Pi _ t _) sc)) a)- | (P (DCon _ _ _) _ _, _) <- unApply x,- holeIn env f || f `elem` holes- = let n' = uniqueName (sMN 0 "mv") (map fst env) in- checkCycle names (f, Bind n' (Lam t) x)- un names tm@(App _ (P _ f (Bind fn (Pi _ t _) sc)) a) x- | (P (DCon _ _ _) _ _, _) <- unApply x,- holeIn env f || f `elem` holes- = let n' = uniqueName fn (map fst env) in- checkCycle names (f, Bind n' (Lam t) x)- un names tx@(P _ x _) tm | tx /= tm && holeIn env x || x `elem` holes = do sc 1; checkCycle names (x, tm)@@ -346,7 +322,7 @@ un :: Bool -> [((Name, Name), TT Name)] -> TT Name -> TT Name -> StateT UInfo TC [(Name, TT Name)]- un = un'+ un = un' env -- un fn names x y -- = let (xf, _) = unApply x -- (yf, _) = unApply y in@@ -354,23 +330,23 @@ -- uplus (un' fn names x y) -- (un' fn names (hnf ctxt env x) (hnf ctxt env y)) - un' :: Bool -> [((Name, Name), TT Name)] -> TT Name -> TT Name ->+ un' :: Env -> Bool -> [((Name, Name), TT Name)] -> TT Name -> TT Name -> StateT UInfo TC [(Name, TT Name)]- un' fn names x y | x == y = return [] -- shortcut- un' fn names topx@(P (DCon _ _ _) x _) topy@(P (DCon _ _ _) y _)+ un' env fn names x y | x == y = return [] -- shortcut+ un' env fn names topx@(P (DCon _ _ _) x _) topy@(P (DCon _ _ _) y _) | x /= y = unifyFail topx topy- un' fn names topx@(P (TCon _ _) x _) topy@(P (TCon _ _) y _)+ un' env fn names topx@(P (TCon _ _) x _) topy@(P (TCon _ _) y _) | x /= y = unifyFail topx topy- un' fn names topx@(P (DCon _ _ _) x _) topy@(P (TCon _ _) y _)+ un' env fn names topx@(P (DCon _ _ _) x _) topy@(P (TCon _ _) y _) = unifyFail topx topy- un' fn names topx@(P (TCon _ _) x _) topy@(P (DCon _ _ _) y _)+ un' env fn names topx@(P (TCon _ _) x _) topy@(P (DCon _ _ _) y _) = unifyFail topx topy- un' fn names topx@(Constant _) topy@(P (TCon _ _) y _)+ un' env fn names topx@(Constant _) topy@(P (TCon _ _) y _) = unifyFail topx topy- un' fn names topx@(P (TCon _ _) x _) topy@(Constant _)+ un' env fn names topx@(P (TCon _ _) x _) topy@(Constant _) = unifyFail topx topy- un' fn bnames tx@(P _ x _) ty@(P _ y _)+ un' env fn bnames tx@(P _ x _) ty@(P _ y _) | (x,y) `elem` map fst bnames || x == y = do sc 1; return [] | injective tx && not (holeIn env y || y `elem` holes) = unifyTmpFail tx ty@@ -385,7 +361,7 @@ where envPos i n ((n',_):env) | n == n' = i envPos i n (_:env) = envPos (i+1) n env envPos _ _ _ = 100000- un' fn bnames xtm@(P _ x _) tm+ un' env fn bnames xtm@(P _ x _) tm | pureTerm tm, holeIn env x || x `elem` holes = do UI s f <- get -- injectivity check@@ -399,7 +375,7 @@ | pureTerm tm, not (injective xtm) && injective tm = do checkCycle bnames (x, tm) unifyTmpFail xtm tm- un' fn bnames tm ytm@(P _ y _)+ un' env fn bnames tm ytm@(P _ y _) | pureTerm tm, holeIn env y || y `elem` holes = do UI s f <- get -- injectivity check@@ -413,62 +389,119 @@ | pureTerm tm, not (injective ytm) && injective tm = do checkCycle bnames (y, tm) unifyTmpFail tm ytm- un' fn bnames (V i) (P _ x _)+ un' env fn bnames (V i) (P _ x _) | length bnames > i, fst ((map fst bnames)!!i) == x || snd ((map fst bnames)!!i) == x = do sc 1; return []- un' fn bnames (P _ x _) (V i)+ un' env fn bnames (P _ x _) (V i) | length bnames > i, fst ((map fst bnames)!!i) == x || snd ((map fst bnames)!!i) == x = do sc 1; return [] - un' fn names topx@(Bind n (Hole t) sc) y = unifyTmpFail topx y- un' fn names x topy@(Bind n (Hole t) sc) = unifyTmpFail x topy+ un' env fn names topx@(Bind n (Hole t) sc) y = unifyTmpFail topx y+ un' env fn names x topy@(Bind n (Hole t) sc) = unifyTmpFail x topy - un' fn bnames appx@(App _ _ _) appy@(App _ _ _)- = unApp fn bnames appx appy+-- Pattern unification rule+ un' env fn bnames tm app@(App _ _ _)+ | (P _ mv _, args) <- unApply app,+ holeIn env mv || mv `elem` holes,+ all rigid args,+ containsOnly (mapMaybe getname args) (mapMaybe getV args) tm+ -- && TODO: tm does not refer to any variables other than those+ -- in 'args' + = -- trace ("PATTERN RULE SOLVE: " ++ show (mv, tm, env, bindLams args (substEnv env tm))) $ + checkCycle bnames (mv, eta [] $ bindLams args (substEnv env tm))+ where rigid (V i) = True+ rigid (P _ t _) = t `elem` map fst env &&+ not (holeIn env t || t `elem` holes)+ rigid _ = False++ getV (V i) = Just i+ getV _ = Nothing++ getname (P _ n _) = Just n+ getname _ = Nothing++ containsOnly args vs (V i) = i `elem` vs+ containsOnly args vs (P Bound n ty) + = n `elem` args && containsOnly args vs ty+ containsOnly args vs (P _ n ty) + = not (holeIn env n || n `elem` holes)+ && containsOnly args vs ty+ containsOnly args vs (App _ f a) + = containsOnly args vs f && containsOnly args vs a+ containsOnly args vs (Bind _ b sc) + = containsOnly args vs (binderTy b) &&+ containsOnly args (0 : map (+1) vs) sc+ containsOnly args vs _ = True++ bindLams [] tm = tm+ bindLams (a : as) tm = bindLam a (bindLams as tm)++ bindLam (V i) tm = Bind (fst (env !! i)) + (Lam (binderTy (snd (env !! i)))) + tm+ bindLam (P _ n ty) tm = Bind n (Lam ty) tm+ bindLam _ tm = error "Can't happen [non rigid bindLam]"++ substEnv [] tm = tm+ substEnv ((n, t) : env) tm + = substEnv env (substV (P Bound n (binderTy t)) tm)++ -- remove any unnecessary lambdas (helps with type class+ -- resolution later).+ eta ks (Bind n (Lam ty) sc) = eta ((n, ty) : ks) sc+ eta ks t = rebind ks t++ rebind ((n, ty) : ks) (App _ f (P _ n' _))+ | n == n' = eta ks f+ rebind ((n, ty) : ks) t = rebind ks (Bind n (Lam ty) t)+ rebind _ t = t++ un' env fn bnames appx@(App _ _ _) appy@(App _ _ _)+ = unApp env fn bnames appx appy -- = uplus (unApp fn bnames appx appy) -- (unifyTmpFail appx appy) -- take the whole lot - un' fn bnames x (Bind n (Lam t) (App _ y (P Bound n' _)))- | n == n' = un' False bnames x y- un' fn bnames (Bind n (Lam t) (App _ x (P Bound n' _))) y- | n == n' = un' False bnames x y- un' fn bnames x (Bind n (Lam t) (App _ y (V 0)))- = un' False bnames x y- un' fn bnames (Bind n (Lam t) (App _ x (V 0))) y- = un' False bnames x y--- un' fn bnames (Bind x (PVar _) sx) (Bind y (PVar _) sy)--- = un' False ((x,y):bnames) sx sy--- un' fn bnames (Bind x (PVTy _) sx) (Bind y (PVTy _) sy)--- = un' False ((x,y):bnames) sx sy+ un' env fn bnames x (Bind n (Lam t) (App _ y (P Bound n' _)))+ | n == n' = un' env False bnames x y+ un' env fn bnames (Bind n (Lam t) (App _ x (P Bound n' _))) y+ | n == n' = un' env False bnames x y+ un' env fn bnames x (Bind n (Lam t) (App _ y (V 0)))+ = un' env False bnames x y+ un' env fn bnames (Bind n (Lam t) (App _ x (V 0))) y+ = un' env False bnames x y+-- un' env fn bnames (Bind x (PVar _) sx) (Bind y (PVar _) sy)+-- = un' env False ((x,y):bnames) sx sy+-- un' env fn bnames (Bind x (PVTy _) sx) (Bind y (PVTy _) sy)+-- = un' env False ((x,y):bnames) sx sy -- f D unifies with t -> D. This is dubious, but it helps with type -- class resolution for type classes over functions. - un' fn bnames (App _ f x) (Bind n (Pi i t k) y)+ un' env fn bnames (App _ f x) (Bind n (Pi i t k) y) | noOccurrence n y && injectiveApp f- = do ux <- un' False bnames x y- uf <- un' False bnames f (Bind (sMN 0 "uv") (Lam (TType (UVar 0)))+ = do ux <- un' env False bnames x y+ uf <- un' env False bnames f (Bind (sMN 0 "uv") (Lam (TType (UVar 0))) (Bind n (Pi i t k) (V 1)))- combine bnames ux uf+ combine env bnames ux uf - un' fn bnames (Bind n (Pi i t k) y) (App _ f x)+ un' env fn bnames (Bind n (Pi i t k) y) (App _ f x) | noOccurrence n y && injectiveApp f- = do ux <- un' False bnames y x- uf <- un' False bnames (Bind (sMN 0 "uv") (Lam (TType (UVar 0)))+ = do ux <- un' env False bnames y x+ uf <- un' env False bnames (Bind (sMN 0 "uv") (Lam (TType (UVar 0))) (Bind n (Pi i t k) (V 1))) f- combine bnames ux uf+ combine env bnames ux uf - un' fn bnames (Bind x bx sx) (Bind y by sy)+ un' env fn bnames (Bind x bx sx) (Bind y by sy) | sameBinder bx by- = do h1 <- uB bnames bx by- h2 <- un' False (((x,y),binderTy bx):bnames) sx sy- combine bnames h1 h2+ = do h1 <- uB env bnames bx by+ h2 <- un' ((x, bx) : env) False (((x,y),binderTy bx):bnames) sx sy+ combine env bnames h1 h2 where sameBinder (Lam _) (Lam _) = True sameBinder (Pi i _ _) (Pi i' _ _) = True sameBinder _ _ = False -- never unify holes/guesses/etc- un' fn bnames x y+ un' env fn bnames x y | OK True <- convEq' ctxt holes x y = do sc 1; return [] | isUniverse x && isUniverse y = do sc 1; return [] | otherwise = do UI s f <- get@@ -480,11 +513,11 @@ else do put (UI s ((x, y, True, env, err, from, Unify) : f)) return [] -- lift $ tfail err - unApp fn bnames appx@(App _ fx ax) appy@(App _ fy ay)+ unApp env fn bnames appx@(App _ fx ax) appy@(App _ fy ay) -- shortcut for the common case where we just want to check the -- arguments are correct | (injectiveApp fx && fx == fy)- = un' False bnames ax ay+ = un' env False bnames ax ay | (injectiveApp fx && injectiveApp fy) || (injectiveApp fx && metavarApp fy && ax == ay) || (injectiveApp fy && metavarApp fx && ax == ay)@@ -493,18 +526,18 @@ -- fail quickly if the heads are disjoint checkHeads headx heady uplus- (do hf <- un' True bnames fx fy+ (do hf <- un' env True bnames fx fy let ax' = hnormalise hf ctxt env (substNames hf ax) let ay' = hnormalise hf ctxt env (substNames hf ay)- ha <- un' False bnames ax' ay'+ ha <- un' env False bnames ax' ay' sc 1- combine bnames hf ha)- (do ha <- un' False bnames ax ay+ combine env bnames hf ha)+ (do ha <- un' env False bnames ax ay let fx' = hnormalise ha ctxt env (substNames ha fx) let fy' = hnormalise ha ctxt env (substNames ha fy)- hf <- un' False bnames fx' fy'+ hf <- un' env False bnames fx' fy' sc 1- combine bnames hf ha)+ combine env bnames hf ha) | otherwise = unifyTmpFail appx appy where hnormalise [] _ _ t = t hnormalise ns ctxt env t = normalise ctxt env t@@ -522,8 +555,8 @@ unArgs as (x : xs) (y : ys) = do let x' = hnormalise as ctxt env (substNames as x) let y' = hnormalise as ctxt env (substNames as y)- as' <- un' False bnames x' y'- vs <- combine bnames as as'+ as' <- un' env False bnames x' y'+ vs <- combine env bnames as as' unArgs vs xs ys numArgs tm = let (f, args) = unApply tm in length args@@ -589,21 +622,22 @@ lift $ tfail err - uB bnames (Let tx vx) (Let ty vy)- = do h1 <- un' False bnames tx ty- h2 <- un' False bnames vx vy+ uB env bnames (Let tx vx) (Let ty vy)+ = do h1 <- un' env False bnames tx ty+ h2 <- un' env False bnames vx vy sc 1- combine bnames h1 h2- uB bnames (Guess tx vx) (Guess ty vy)- = do h1 <- un' False bnames tx ty- h2 <- un' False bnames vx vy+ combine env bnames h1 h2+ uB env bnames (Guess tx vx) (Guess ty vy)+ = do h1 <- un' env False bnames tx ty+ h2 <- un' env False bnames vx vy sc 1- combine bnames h1 h2- uB bnames (Lam tx) (Lam ty) = do sc 1; un' False bnames tx ty- uB bnames (Pi _ tx _) (Pi _ ty _) = do sc 1; un' False bnames tx ty- uB bnames (Hole tx) (Hole ty) = un' False bnames tx ty- uB bnames (PVar tx) (PVar ty) = un' False bnames tx ty- uB bnames x y = do UI s f <- get+ combine env bnames h1 h2+ uB env bnames (Lam tx) (Lam ty) = do sc 1; un' env False bnames tx ty+ uB env bnames (Pi _ tx _) (Pi _ ty _) = do sc 1; un' env False bnames tx ty+ uB env bnames (Hole tx) (Hole ty) = un' env False bnames tx ty+ uB env bnames (PVar tx) (PVar ty) = un' env False bnames tx ty+ uB env bnames x y + = do UI s f <- get let r = recoverable (normalise ctxt env (binderTy x)) (normalise ctxt env (binderTy y)) let err = cantUnify from r (topx, xfrom) (topy, yfrom)@@ -638,20 +672,15 @@ App MaybeHoles (Bind y (Lam ty) (bind (i-1) ns tm)) (P Bound x ty) - combineArgs bnames args = ca [] args where- ca acc [] = return acc- ca acc (x : xs) = do x' <- combine bnames acc x- ca x' xs-- combine bnames as [] = return as- combine bnames as ((n, t) : bs)+ combine env bnames as [] = return as+ combine env bnames as ((n, t) : bs) = case lookup n as of- Nothing -> combine bnames (as ++ [(n,t)]) bs- Just t' -> do ns <- un' False bnames t t'+ Nothing -> combine env bnames (as ++ [(n,t)]) bs+ Just t' -> do ns <- un' env False bnames t t' -- make sure there's n mapping from n in ns let ns' = filter (\ (x, _) -> x/=n) ns sc 1- combine bnames as (ns' ++ bs)+ combine env bnames as (ns' ++ bs) boundVs :: Int -> Term -> [Int] boundVs i (V j) | j < i = []@@ -719,10 +748,14 @@ | (P (DCon _ _ _) _ _, _) <- unApply f = False | (P (TCon _ _) _ _, _) <- unApply f = False | (Constant _) <- f = False+ | TType _ <- f = False+ | UType _ <- f = False recoverable (Bind _ (Pi _ _ _) sc) f | (P (DCon _ _ _) _ _, _) <- unApply f = False | (P (TCon _ _) _ _, _) <- unApply f = False | (Constant _) <- f = False+ | TType _ <- f = False+ | UType _ <- f = False recoverable (Bind _ (Lam _) sc) f = recoverable sc f recoverable f (Bind _ (Lam _) sc) = recoverable f sc recoverable x y = True
src/Idris/Coverage.hs view
@@ -54,16 +54,16 @@ genClauses :: FC -> Name -> [Term] -> [PTerm] -> Idris [PTerm] genClauses fc n xs given = do i <- getIState- let lhs_tms = map (\x -> delab' i x True True) xs+ let lhs_tms = map (\x -> flattenArgs $ delab' i x True True) xs -- if a placeholder was given, don't bother generating cases for it let lhs_tms' = zipWith mergePlaceholders lhs_tms - (map (stripUnmatchable i) given)+ (map (stripUnmatchable i) (map flattenArgs given)) let lhss = map pUnApply lhs_tms' let argss = transpose lhss let all_args = map (genAll i) argss logLvl 5 $ "COVERAGE of " ++ show n- logLvl 5 $ show lhss+ logLvl 5 $ show (lhs_tms, lhss) logLvl 5 $ show (map length argss) ++ "\n" ++ show (map length all_args) logLvl 10 $ show argss ++ "\n" ++ show all_args logLvl 3 $ "Original: \n" ++@@ -89,8 +89,12 @@ | (f, args) <- unApply term = map (\t -> delab' i t True True) args | otherwise = [] - pUnApply (PApp _ _ args) = map getTm args+ pUnApply (PApp _ f args) = map getTm args pUnApply _ = []++ flattenArgs (PApp fc (PApp _ f as) as') + = flattenArgs (PApp fc f (as ++ as'))+ flattenArgs t = t -- Return whether the given clause matches none of the input clauses -- (xs)
src/Idris/DeepSeq.hs view
@@ -6,6 +6,10 @@ import Idris.Docstrings import Idris.Core.TT import Idris.AbsSyntaxTree+import Idris.Colours+import IRTS.Lang (PrimFn(..))+import IRTS.CodegenCommon (OutputType (..))+import Util.DynamicLinker import Control.DeepSeq @@ -18,6 +22,285 @@ instance NFData CT.Options where rnf (CT.Options x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` () +instance NFData ConsoleWidth where+ rnf InfinitelyWide = ()+ rnf (ColsWide x) = rnf x `seq` ()+ rnf AutomaticWidth = ()++instance NFData PrimFn where+ rnf (LPlus x) = rnf x `seq` ()+ rnf (LMinus x) = rnf x `seq` ()+ rnf (LTimes x) = rnf x `seq` ()+ rnf (LUDiv x) = rnf x `seq` ()+ rnf (LSDiv x) = rnf x `seq` ()+ rnf (LURem x) = rnf x `seq` ()+ rnf (LSRem x) = rnf x `seq` ()+ rnf (LAnd x) = rnf x `seq` ()+ rnf (LOr x) = rnf x `seq` ()+ rnf (LXOr x) = rnf x `seq` ()+ rnf (LCompl x) = rnf x `seq` ()+ rnf (LSHL x) = rnf x `seq` ()+ rnf (LLSHR x) = rnf x `seq` ()+ rnf (LASHR x) = rnf x `seq` ()+ rnf (LEq x) = rnf x `seq` ()+ rnf (LLt x) = rnf x `seq` ()+ rnf (LLe x) = rnf x `seq` ()+ rnf (LGt x) = rnf x `seq` ()+ rnf (LGe x) = rnf x `seq` ()+ rnf (LSLt x) = rnf x `seq` ()+ rnf (LSLe x) = rnf x `seq` ()+ rnf (LSGt x) = rnf x `seq` ()+ rnf (LSGe x) = rnf x `seq` ()+ rnf (LSExt x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (LZExt x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (LTrunc x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (LStrConcat) = ()+ rnf (LStrLt) = ()+ rnf (LStrEq) = ()+ rnf (LStrLen) = ()+ rnf (LIntFloat x) = rnf x `seq` ()+ rnf (LFloatInt x) = rnf x `seq` ()+ rnf (LIntStr x) = rnf x `seq` ()+ rnf (LStrInt x) = rnf x `seq` ()+ rnf (LFloatStr) = ()+ rnf (LStrFloat) = ()+ rnf (LChInt x) = rnf x `seq` ()+ rnf (LIntCh x) = rnf x `seq` ()+ rnf (LBitCast x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (LFExp) = ()+ rnf (LFLog) = ()+ rnf (LFSin) = ()+ rnf (LFCos) = ()+ rnf (LFTan) = ()+ rnf (LFASin) = ()+ rnf (LFACos) = ()+ rnf (LFATan) = ()+ rnf (LFSqrt) = ()+ rnf (LFFloor) = ()+ rnf (LFCeil) = ()+ rnf (LFNegate) = ()+ rnf (LStrHead) = ()+ rnf (LStrTail) = ()+ rnf (LStrCons) = ()+ rnf (LStrIndex) = ()+ rnf (LStrRev) = ()+ rnf (LStrSubstr) = ()+ rnf (LReadStr) = ()+ rnf (LWriteStr) = ()+ rnf (LSystemInfo) = ()+ rnf (LFork) = ()+ rnf (LPar) = ()+ rnf (LExternal x) = rnf x `seq` ()+ rnf (LNoOp) = ()++instance NFData SyntaxRules where+ rnf (SyntaxRules xs) = rnf xs `seq` ()++instance NFData DynamicLib where+ rnf (Lib x _) = rnf x `seq` ()+++instance NFData Opt where+ rnf (Filename str) = rnf str `seq` ()+ rnf (Quiet) = ()+ rnf (NoBanner) = ()+ rnf (ColourREPL bool) = rnf bool `seq` ()+ rnf (Idemode) = ()+ rnf (IdemodeSocket) = ()+ rnf (ShowLibs) = ()+ rnf (ShowLibdir) = ()+ rnf (ShowIncs) = ()+ rnf (ShowPkgs) = ()+ rnf (NoBasePkgs) = ()+ rnf (NoPrelude) = ()+ rnf (NoBuiltins) = ()+ rnf (NoREPL) = ()+ rnf (OLogging i) = rnf i `seq` ()+ rnf (Output str) = rnf str `seq` ()+ rnf (Interface) = ()+ rnf (TypeCase) = ()+ rnf (TypeInType) = ()+ rnf (DefaultTotal) = ()+ rnf (DefaultPartial) = ()+ rnf (WarnPartial) = ()+ rnf (WarnReach) = ()+ rnf (EvalTypes) = ()+ rnf (DesugarNats) = ()+ rnf (NoCoverage) = ()+ rnf (ErrContext) = ()+ rnf (ShowImpl) = ()+ rnf (Verbose) = ()+ rnf (Port str) = rnf str `seq` ()+ rnf (IBCSubDir str) = rnf str `seq` ()+ rnf (ImportDir str) = rnf str `seq` ()+ rnf (PkgBuild str) = rnf str `seq` ()+ rnf (PkgInstall str) = rnf str `seq` ()+ rnf (PkgClean str) = rnf str `seq` ()+ rnf (PkgCheck str) = rnf str `seq` ()+ rnf (PkgREPL str) = rnf str `seq` ()+ rnf (PkgMkDoc str) = rnf str `seq` ()+ rnf (PkgTest str) = rnf str `seq` ()+ rnf (PkgIndex fp) = rnf fp `seq` ()+ rnf (WarnOnly) = ()+ rnf (Pkg str) = rnf str `seq` ()+ rnf (BCAsm str) = rnf str `seq` ()+ rnf (DumpDefun str) = rnf str `seq` ()+ rnf (DumpCases str) = rnf str `seq` ()+ rnf (UseCodegen cg) = rnf cg `seq` ()+ rnf (CodegenArgs str) = rnf str `seq` ()+ rnf (OutputTy ot) = rnf ot `seq` ()+ rnf (Extension le) = rnf le `seq` ()+ rnf (InterpretScript str) = rnf str `seq` ()+ rnf (EvalExpr str) = rnf str `seq` ()+ rnf (TargetTriple str) = rnf str `seq` ()+ rnf (TargetCPU str) = rnf str `seq` ()+ rnf (OptLevel i) = rnf i `seq` ()+ rnf (AddOpt o) = rnf o `seq` ()+ rnf (RemoveOpt o) = rnf o `seq` ()+ rnf (Client str) = rnf str `seq` ()+ rnf (ShowOrigErr) = ()+ rnf (AutoWidth) = ()+ rnf (AutoSolve) = ()+ rnf (UseConsoleWidth cw) = rnf cw `seq` ()+ rnf (DumpHighlights) = ()+++instance NFData TIData where+ rnf TIPartial = ()+ rnf (TISolution xs) = rnf xs `seq` ()++instance NFData IOption where+ rnf (IOption+ opt_logLevel+ opt_typecase+ opt_typeintype+ opt_coverage+ opt_showimp+ opt_errContext+ opt_repl+ opt_verbose+ opt_nobanner+ opt_quiet+ opt_codegen+ opt_outputTy+ opt_ibcsubdir+ opt_importdirs+ opt_triple+ opt_cpu+ opt_cmdline+ opt_origerr+ opt_autoSolve+ opt_autoImport+ opt_optimise+ opt_printdepth+ opt_evaltypes+ opt_desugarnats) =+ rnf opt_logLevel+ `seq` rnf opt_typecase+ `seq` rnf opt_typeintype+ `seq` rnf opt_coverage+ `seq` rnf opt_showimp+ `seq` rnf opt_errContext+ `seq` rnf opt_repl+ `seq` rnf opt_verbose+ `seq` rnf opt_nobanner+ `seq` rnf opt_quiet+ `seq` rnf opt_codegen+ `seq` rnf opt_outputTy+ `seq` rnf opt_ibcsubdir+ `seq` rnf opt_importdirs+ `seq` rnf opt_triple+ `seq` rnf opt_cpu+ `seq` rnf opt_cmdline+ `seq` rnf opt_origerr+ `seq` rnf opt_autoSolve+ `seq` rnf opt_autoImport+ `seq` rnf opt_optimise+ `seq` rnf opt_printdepth+ `seq` rnf opt_evaltypes+ `seq` rnf opt_desugarnats+ `seq` ()++instance NFData LanguageExt where+ rnf TypeProviders = ()+ rnf ErrorReflection = ()+ +instance NFData Optimisation where+ rnf PETransform = ()++instance NFData ColourTheme where+ rnf (ColourTheme keywordColour+ boundVarColour+ implicitColour+ functionColour+ typeColour+ dataColour+ promptColour+ postulateColour) =+ rnf keywordColour+ `seq` rnf boundVarColour+ `seq` rnf implicitColour+ `seq` rnf functionColour+ `seq` rnf typeColour+ `seq` rnf dataColour+ `seq` rnf promptColour+ `seq` rnf postulateColour+ `seq` ()++instance NFData IdrisColour where+ rnf (IdrisColour _ x2 x3 x4 x5) = rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` ()++instance NFData OutputType where+ rnf Raw = ()+ rnf Object = ()+ rnf Executable = ()+ rnf MavenProject = ()++instance NFData IBCWrite where+ rnf (IBCFix fixDecl) = rnf fixDecl `seq` ()+ rnf (IBCImp name) = rnf name `seq` ()+ rnf (IBCStatic name) = rnf name `seq` ()+ rnf (IBCClass name) = rnf name `seq` ()+ rnf (IBCInstance b1 b2 n1 n2) = rnf b1 `seq` rnf b2 `seq` rnf n1 `seq` rnf n2 `seq` ()+ rnf (IBCDSL name) = rnf name `seq` ()+ rnf (IBCData name) = rnf name `seq` ()+ rnf (IBCOpt name) = rnf name `seq` ()+ rnf (IBCMetavar name) = rnf name `seq` ()+ rnf (IBCSyntax syntax) = rnf syntax `seq` ()+ rnf (IBCKeyword string) = rnf string `seq` ()+ rnf (IBCImport imp) = rnf imp `seq` ()+ rnf (IBCImportDir filePath) = rnf filePath `seq` ()+ rnf (IBCObj codegen filePath) = rnf codegen `seq` rnf filePath `seq` ()+ rnf (IBCLib codegen string) = rnf codegen `seq` rnf string `seq` ()+ rnf (IBCCGFlag codegen string) = rnf codegen `seq` rnf string `seq` ()+ rnf (IBCDyLib string) = rnf string `seq` ()+ rnf (IBCHeader codegen string) = rnf codegen `seq` rnf string `seq` ()+ rnf (IBCAccess name accessibility) = rnf name `seq` rnf accessibility `seq` ()+ rnf (IBCMetaInformation name metaInformation) = rnf name `seq` rnf metaInformation `seq` ()+ rnf (IBCTotal name totality) = rnf name `seq` rnf totality `seq` ()+ rnf (IBCFlags name fnOpts) = rnf name `seq` rnf fnOpts `seq` ()+ rnf (IBCFnInfo name fnInfo) = rnf name `seq` rnf fnInfo `seq` ()+ rnf (IBCTrans name terms) = rnf name `seq` rnf terms `seq` ()+ rnf (IBCErrRev terms) = rnf terms `seq` ()+ rnf (IBCCG name) = rnf name `seq` ()+ rnf (IBCDoc name) = rnf name `seq` ()+ rnf (IBCCoercion name) = rnf name `seq` ()+ rnf (IBCDef name) = rnf name `seq` ()+ rnf (IBCNameHint names) = rnf names `seq` ()+ rnf (IBCLineApp filePath int pTerm) = rnf filePath `seq` rnf int `seq` rnf pTerm `seq` ()+ rnf (IBCErrorHandler name) = rnf name `seq` ()+ rnf (IBCFunctionErrorHandler n1 n2 n3) = rnf n1 `seq` rnf n2 `seq` rnf n3 `seq` ()+ rnf (IBCPostulate name) = rnf name `seq` ()+ rnf (IBCExtern extern) = rnf extern `seq` ()+ rnf (IBCTotCheckErr fc string) = rnf fc `seq` rnf string `seq` ()+ rnf (IBCParsedRegion fc) = rnf fc `seq` ()+ rnf (IBCModDocs name) = rnf name `seq` ()+ rnf (IBCUsage usage) = rnf usage `seq` ()+ rnf (IBCExport name) = rnf name `seq` ()+ rnf (IBCAutoHint n1 n2) = rnf n1 `seq` rnf n2 `seq` ()+ rnf (IBCRecord x) = rnf x `seq` ()++ instance NFData a => NFData (D.Block a) where rnf (D.Para lines) = rnf lines `seq` () rnf (D.Header i lines) = rnf i `seq` rnf lines `seq` ()@@ -270,7 +553,7 @@ rnf (PNoImplicits x1) = rnf x1 `seq` () rnf (PQuasiquote x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PUnquote x1) = rnf x1 `seq` ()- rnf (PQuoteName x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (PQuoteName x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf (PRunElab x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf (PConstSugar x1 x2) = rnf x1 `seq` rnf x2 `seq` () @@ -346,6 +629,10 @@ = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` () +instance NFData RecordInfo where+ rnf (RI x1 x2 x3)+ = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` ()+ instance NFData OptInfo where rnf (Optimise x1 x2) = rnf x1 `seq` rnf x2 `seq` ()@@ -390,3 +677,18 @@ rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` rnf x8 `seq` rnf x9 `seq` rnf x10 `seq` rnf x11 `seq` rnf x12 `seq` ()++instance NFData OutputMode where+ rnf (RawOutput x) = () -- no instance for Handle, so this is a bit wrong+ rnf (IdeMode x y) = rnf x `seq` ()+++instance NFData IState where+ rnf (IState x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 + x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40+ x41 x42 x43 x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56 x57 x58 x59 x60+ x61 x62 x63 x64 x65 x66 x67 x68 x69 x70 x71 x72 x73)+ = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` rnf x8 `seq` rnf x9 `seq` rnf x10 `seq` () `seq` rnf x11 `seq` rnf x12 `seq` rnf x13 `seq` rnf x14 `seq` rnf x15 `seq` rnf x16 `seq` rnf x17 `seq` rnf x18 `seq` rnf x19 `seq` rnf x20 `seq`+ rnf x21 `seq` rnf x22 `seq` rnf x23 `seq` rnf x24 `seq` rnf x25 `seq` rnf x26 `seq` rnf x27 `seq` rnf x28 `seq` rnf x29 `seq` rnf x30 `seq` rnf x31 `seq` rnf x32 `seq` rnf x33 `seq` rnf x34 `seq` rnf x35 `seq` rnf x36 `seq` rnf x37 `seq` rnf x38 `seq` rnf x39 `seq` rnf x40 `seq`+ rnf x41 `seq` rnf x42 `seq` rnf x43 `seq` rnf x44 `seq` rnf x45 `seq` rnf x46 `seq` rnf x47 `seq` rnf x48 `seq` rnf x49 `seq` rnf x50 `seq` rnf x51 `seq` rnf x52 `seq` rnf x53 `seq` rnf x54 `seq` rnf x55 `seq` rnf x56 `seq` rnf x57 `seq` rnf x58 `seq` rnf x59 `seq` rnf x60 `seq`+ rnf x61 `seq` rnf x62 `seq` rnf x63 `seq` rnf x64 `seq` rnf x65 `seq` rnf x66 `seq` rnf x67 `seq` rnf x68 `seq` rnf x69 `seq` rnf x70 `seq` rnf x71 `seq` rnf x72 `seq` rnf x73 `seq` ()
src/Idris/Delaborate.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-module Idris.Delaborate (annName, bugaddr, delab, delab', delabMV, delabSugared, delabTy, delabTy', fancifyAnnots, pprintDelab, pprintDelabTy, pprintErr, resugar) where+module Idris.Delaborate (annName, bugaddr, delab, delab', delabMV, delabSugared, delabTy, delabTy', fancifyAnnots, pprintDelab, pprintNoDelab, pprintDelabTy, pprintErr, resugar) where -- Convert core TT back into high level syntax, primarily for display -- purposes.@@ -226,6 +226,10 @@ pprintDelab ist tm = annotate (AnnTerm [] tm) (prettyIst ist (delabSugared ist tm)) +pprintNoDelab :: IState -> Term -> Doc OutputAnnotation+pprintNoDelab ist tm = annotate (AnnTerm [] tm)+ (prettyIst ist (delab ist tm))+ -- | Pretty-print the type of some name pprintDelabTy :: IState -> Name -> Doc OutputAnnotation pprintDelabTy i n@@ -355,8 +359,11 @@ pprintErr' i (CantMatch t) = text "Can't match on" <+> annTm t (pprintTerm i (delabSugared i t)) pprintErr' i (IncompleteTerm t) - = align (cat (punctuate (comma <> space) - (map pprintIncomplete (nub $ getMissing [] [] t))))+ = let missing = getMissing [] [] t in+ case missing of+ [] -> text "Incomplete term" <+> annTm t (pprintTerm i (delabSugared i t))+ _ -> align (cat (punctuate (comma <> space) + (map pprintIncomplete (nub $ getMissing [] [] t)))) where pprintIncomplete (tm, arg) | expname arg
src/Idris/Docs.hs view
@@ -41,6 +41,10 @@ [PTerm] -- subclasses [PTerm] -- superclasses (Maybe (FunDoc' d)) -- explicit constructor+ | RecordDoc Name d -- record docs+ (FunDoc' d) -- data constructor docs+ [FunDoc' d] -- projection docs+ [(Name, PTerm, Maybe d)] -- parameters with type and doc | NamedInstanceDoc Name (FunDoc' d) -- name is class | ModDoc [String] -- Module name d@@ -209,6 +213,33 @@ then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty (showDoc ist) md) params) else hsep (punctuate comma (map (prettyName True False params' . fst) params)) +pprintDocs ist (RecordDoc n doc ctor projs params)+ = nest 4 (text "Record" <+> prettyName True (ppopt_impl ppo) [] n <>+ if nullDocstring doc+ then empty+ else line <>+ renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) [])) doc)+ -- Parameters+ <$> (if null params+ then empty+ else line <> nest 4 (text "Parameters:" <$> prettyParameters) <> line)+ -- Constructor+ <$> nest 4 (text "Constructor:" <$> pprintFDWithoutTotality ist False ctor)+ -- Projections+ <$> nest 4 (text "Projections:" <$> vsep (map (pprintFDWithoutTotality ist False) projs))+ where+ ppo = ppOptionIst ist+ infixes = idris_infixes ist++ pNames = [n | (n,_,_) <- params]+ params' = zip pNames (repeat False)++ prettyParameters =+ if any isJust [d | (_,_,d) <- params]+ then vsep (map (\(n,pt,d) -> prettyParam (n,pt) <+> maybe empty (showDoc ist) d) params)+ else hsep (punctuate comma (map prettyParam [(n,pt) | (n,pt,_) <- params]))+ prettyParam (n,pt) = prettyName True False params' n <+> text ":" <+> pprintPTerm ppo params' [] infixes pt+ pprintDocs ist (NamedInstanceDoc _cls doc) = nest 4 (text "Named instance:" <$> pprintFDWithoutTotality ist True doc) @@ -234,6 +265,8 @@ = do i <- getIState docs <- if | Just ci <- lookupCtxtExact n (idris_classes i) -> docClass n ci+ | Just ri <- lookupCtxtExact n (idris_records i)+ -> docRecord n ri | Just ti <- lookupCtxtExact n (idris_datatypes i) -> docData n ti | Just class_ <- classNameForInst i n@@ -295,6 +328,17 @@ = isSubclass pt isSubclass _ = False++docRecord :: Name -> RecordInfo -> Idris Docs+docRecord n ri+ = do i <- getIState+ let docStrings = listToMaybe $ lookupCtxt n $ idris_docstrings i+ docstr = maybe emptyDocstring fst docStrings+ params = map (\(pn,pt) -> (pn, pt, docStrings >>= (lookup (nsroot pn) . snd)))+ (record_parameters ri)+ pdocs <- mapM docFun (record_projections ri)+ ctorDocs <- docFun $ record_constructor ri+ return $ RecordDoc n docstr ctorDocs pdocs params docFun :: Name -> Idris FunDoc docFun n
src/Idris/Elab/Clause.hs view
@@ -162,7 +162,7 @@ simpleCase tcase (UnmatchedCase "Error") reflect CompileTime fc inacc atys pdef erInfo cov <- coverage pmissing <-- if cov && not (hasDefault cs)+ if cov && not (hasDefault pats_raw) then do missing <- genClauses fc n (map getLHS pdef) cs_full -- missing <- genMissing n scargs sc missing' <- filterM (checkPossible info fc True n) missing@@ -291,10 +291,20 @@ depat acc (Bind n (PVar t) sc) = depat (n : acc) (instantiate (P Bound n t) sc) depat acc x = (acc, x) - hasDefault cs | (PClause _ _ last _ _ _ :_) <- reverse cs- , (PApp fn s args) <- last = all ((==Placeholder) . getTm) args++ getPVs (Bind x (PVar _) tm) = let (vs, tm') = getPVs tm+ in (x:vs, tm')+ getPVs tm = ([], tm)++ isPatVar vs (P Bound n _) = n `elem` vs+ isPatVar _ _ = False++ hasDefault cs | (Right (lhs, rhs) : _) <- reverse cs+ , (pvs, tm) <- getPVs (explicitNames lhs)+ , (f, args) <- unApply tm = all (isPatVar pvs) args hasDefault _ = False + getLHS (_, l, _) = l simple_lhs ctxt (Right (x, y)) = Right (normalise ctxt [] x, y)@@ -491,6 +501,8 @@ = t { getTm = PRef NoFC [] n } : addP sc ts addP (Bind n _ sc) (t : ts) = t : addP sc ts addP _ ts = ts+propagateParams i ps t tm@(PApp fc ap args)+ = PApp fc (propagateParams i ps t ap) args propagateParams i ps t (PRef fc hls n) = case lookupCtxt n (idris_implicits i) of [is] -> let ps' = filter (isImplicit is) ps in@@ -543,11 +555,15 @@ let fn_is = case lookupCtxt fname (idris_implicits i) of [t] -> t _ -> []- let params = getParamsInType i [] fn_is (normalise ctxt [] fn_ty)+ let norm_ty = normalise ctxt [] fn_ty+ let params = getParamsInType i [] fn_is norm_ty+ let tcparams = getTCParamsInType i [] fn_is norm_ty+ let lhs = mkLHSapp $ stripLinear i $ stripUnmatchable i $- propagateParams i params fn_ty (addImplPat i lhs_in)+ propagateParams i params norm_ty (addImplPat i lhs_in) -- let lhs = mkLHSapp $ -- propagateParams i params fn_ty (addImplPat i lhs_in)+ logLvl 10 (show (params, fn_ty) ++ " " ++ showTmImpls (addImplPat i lhs_in)) logLvl 5 ("LHS: " ++ show fc ++ " " ++ showTmImpls lhs) logLvl 4 ("Fixed parameters: " ++ show params ++ " from " ++ show lhs_in ++ "\n" ++ show (fn_ty, fn_is))@@ -576,7 +592,8 @@ -- If we're inferring metavariables in the type, don't recheck, -- because we're only doing this to try to work out those metavariables (clhs_c, clhsty) <- if not inf- then recheckC fc id [] lhs_tm+ then recheckC_borrowing False (PEGenerated `notElem` opts)+ [] fc id [] lhs_tm else return (lhs_tm, lhs_ty) let clhs = normalise ctxt [] clhs_c let borrowed = borrowedNames [] clhs@@ -634,7 +651,7 @@ (do pbinds ist lhs_tm -- proof search can use explicitly written names mapM_ addPSname (allNamesIn lhs_in)- mapM_ setinj (nub (params ++ inj))+ mapM_ setinj (nub (tcparams ++ inj)) setNextName (ElabResult _ _ is ctxt' newDecls highlights) <- errAt "right hand side of " fname@@ -678,14 +695,16 @@ logLvl 6 $ " ==> " ++ show (forget rhs') (crhs, crhsty) <- if not inf- then recheckC_borrowing True borrowed fc id [] rhs'+ then recheckC_borrowing True (PEGenerated `notElem` opts)+ borrowed fc id [] rhs' else return (rhs', clhsty) logLvl 6 $ " ==> " ++ showEnvDbg [] crhsty ++ " against " ++ showEnvDbg [] clhsty ctxt <- getContext let constv = next_tvar ctxt case LState.runStateT (convertsC ctxt [] crhsty clhsty) (constv, []) of- OK (_, cs) -> do addConstraints fc cs - logLvl 6 $ "CONSTRAINTS ADDED: " ++ show cs+ OK (_, cs) -> when (PEGenerated `notElem` opts) $ do+ addConstraints fc cs + logLvl 6 $ "CONSTRAINTS ADDED: " ++ show cs ++ "\n" ++ show (clhsty, crhsty) return () Error e -> ierror (At fc (CantUnify False (clhsty, Nothing) (crhsty, Nothing) e [] 0)) i <- getIState
src/Idris/Elab/Record.hs view
@@ -64,6 +64,12 @@ _ -> PDatadecl tyn NoFC tycon [(cdoc, dconsArgDocs, dconName, NoFC, dconTy, fc, [])] elabData info rsyn doc paramDocs fc opts datadecl + -- Keep track of the record+ let parameters = [(n,pt) | (n, _, _, pt) <- params]+ let projections = [n | (n, _, _, _, _) <- fieldsWithName]+ addRecord tyn (RI parameters dconName projections)+ addIBC (IBCRecord tyn)+ when (what /= ETypes) $ do logLvl 1 $ "fieldsWithName " ++ show fieldsWithName logLvl 1 $ "fieldsWIthNameAndDoc " ++ show fieldsWithNameAndDoc
src/Idris/Elab/Term.hs view
@@ -91,7 +91,7 @@ ptm <- get_term resolveTC' True True 10 g fn ist) ivs - when (not pattern) $ solveAutos ist fn True+ when (not pattern) $ solveAutos ist fn False tm <- get_term ctxt <- get_context@@ -104,6 +104,8 @@ "Remaining problems:\n" ++ qshow probs) $ do unify_all; matchProblems True; unifyProblems + when (not pattern) $ solveAutos ist fn True+ probs <- get_probs case probs of [] -> return ()@@ -269,8 +271,9 @@ hs <- get_holes -- If any of the autos use variables which have recently been solved, -- have another go at solving them now.- mapM_ (\(a, ns) -> if any (\n -> n `elem` solved) ns && head hs /= a- then solveAuto ist fn False a+ mapM_ (\(a, (failc, ns)) -> + if any (\n -> n `elem` solved) ns && head hs /= a+ then solveAuto ist fn False (a, failc) else return ()) as itm <- if not pattern then insertImpLam ina t else return t@@ -442,6 +445,7 @@ -- trace (show (map showHd as')) $ ty <- goal case as' of+ [] -> lift $ tfail $ NoValidAlts (map showHd as) [x] -> elab' ina fc x -- If there's options, try now, and if that fails, postpone -- to later.@@ -451,25 +455,31 @@ (do movelast h delayElab 5 $ do hs <- get_holes- when (not (null hs)) $ do+ when (h `elem` hs) $ do focus h as'' <- doPrune as' case as'' of [x] -> elab' ina fc x _ -> tryAll (zip (map (elab' ina fc) as'') (map showHd as'')))- where showHd (PApp _ (PRef _ _ n) _) = n+ where showHd (PApp _ (PRef _ _ (UN l)) [_, _, arg])+ | l == txt "Delay" = showHd (getTm arg)+ showHd (PApp _ (PRef _ _ n) _) = n showHd (PRef _ _ n) = n showHd (PApp _ h _) = showHd h showHd x = NErased -- We probably should do something better than this here doPrune as = - do hnf_compute+ do compute ty <- goal- let (tc, _) = unApply ty+ let (tc, _) = unApply (unDelay ty) env <- get_env return $ pruneByType env tc ist as + unDelay t | (P _ (UN l) _, [_, arg]) <- unApply t,+ l == txt "Lazy'" = unDelay arg+ | otherwise = t+ isAmbiguous (CantResolveAlts _) = delayok isAmbiguous (Elaborating _ _ e) = isAmbiguous e@@ -492,20 +502,21 @@ solveAutos ist fn False) (trySeq' deferr xs) True elab' ina fc (PAlternative ms TryImplicit (orig : alts)) = do env <- get_env+ compute ty <- goal let doelab = elab' ina fc orig tryCatch doelab (\err -> if recoverableErr err then -- trace ("NEED IMPLICIT! " ++ show orig ++ "\n" ++- -- show alts ++ "\n" ++- -- showQuick err) $+ -- show alts ++ "\n" +++ -- showQuick err) $ -- Prune the coercions so that only the ones -- with the right type to fix the error will be tried! case pruneAlts err alts env of [] -> lift $ tfail err- alts' -> - try' (elab' ina fc (PAlternative [] (ExactlyOne False) alts'))+ alts' -> do+ try' (elab' ina fc (PAlternative ms (ExactlyOne False) alts')) (lift $ tfail err) -- take error from original if all fail True else lift $ tfail err)@@ -529,8 +540,8 @@ _ -> filter isLend alts -- special case hack for 'Borrowed' pruneAlts (ElaboratingArg _ _ _ e) alts env = pruneAlts e alts env pruneAlts (At _ e) alts env = pruneAlts e alts env- pruneAlts (NoValidAlts _) alts env = alts- pruneAlts _ alts _ = filter isLend alts+ pruneAlts (NoValidAlts as) alts env = alts+ pruneAlts err alts _ = filter isLend alts hasArg n env ap | isLend ap = True -- special case hack for 'Borrowed' hasArg n env (PApp _ (PRef _ _ a) _) @@ -538,7 +549,8 @@ Just ty -> let args = map snd (getArgTys (normalise (tt_ctxt ist) env ty)) in any (fnIs n) args Nothing -> False- hasArg n _ _ = False+ hasArg n env (PAlternative _ _ as) = any (hasArg n env) as+ hasArg n _ tm = False isLend (PApp _ (PRef _ _ l) _) = l == sNS (sUN "lend") ["Ownership"] isLend _ = False@@ -599,7 +611,6 @@ [] -> False _ -> True bindable (NS _ _) = False- bindable (UN xs) = True bindable n = implicitable n elab' ina _ f@(PInferRef fc hls n) = elab' ina (Just fc) (PApp NoFC f []) elab' ina fc' tm@(PRef fc hls n)@@ -969,7 +980,7 @@ let n' = metavarName (namespace info) n attack psns <- getPSnames- defer unique_used n'+ n' <- defer unique_used n' solve highlightSource nfc (AnnName n' (Just MetavarOutput) Nothing Nothing) elab' ina fc (PProof ts) = do compute; mapM_ (runTac True ist (elabFC info) fn) ts@@ -1045,10 +1056,9 @@ let args' = filter (\(n, _) -> n `notElem` argsDropped) args - cname <- unique_hole' True (mkCaseName fn)- let cname' = mkN cname--- elab' ina fc (PMetavar cname')- attack; defer argsDropped cname'; solve+ attack+ cname' <- defer argsDropped (mkN (mkCaseName fn))+ solve -- if the scrutinee is one of the 'args' in env, we should -- inspect it directly, rather than adding it as a new argument@@ -1192,7 +1202,10 @@ elab' ina fc (PUnquote t) = fail "Found unquote outside of quasiquote"- elab' ina fc (PQuoteName n nfc) =+ elab' ina fc (PQuoteName n False nfc) =+ do fill $ reflectName n+ solve+ elab' ina fc (PQuoteName n True nfc) = do ctxt <- get_context env <- get_env case lookup n env of@@ -1376,7 +1389,7 @@ notImplicitable (PRef _ _ n) | [opts] <- lookupCtxt n (idris_flags ist) = NoImplicit `elem` opts- notImplicitable (PAlternative _ (ExactlyOne _) as) = any notImplicitable as+ notImplicitable (PAlternative _ _ as) = any notImplicitable as -- case is tricky enough without implicit coercions! If they are needed, -- they can go in the branches separately. notImplicitable (PCase _ _ _) = True@@ -1420,9 +1433,11 @@ (PCoerced tm, _) -> tm (_, []) -> t (_, cs) -> PAlternative [] TryImplicit - (t : map (mkCoerce env t) cs)+ (t : map (mkCoerce env t) cs) return t' where+ mkCoerce env (PAlternative ms aty tms) n+ = PAlternative ms aty (map (\t -> mkCoerce env t n) tms) mkCoerce env t n = let fc = maybe (fileFC "Coercion") id (highestFC t) in addImplBound ist (map fst env) (PApp fc (PRef fc [] n) [pexp (PCoerced t)])@@ -1520,6 +1535,8 @@ n `elem` map fst env = Just t | otherwise = locallyBound ts getName (PRef _ _ n) = Just n+ getName (PApp _ (PRef _ _ (UN l)) [_, _, arg]) -- ignore Delays+ | l == txt "Delay" = getName (getTm arg) getName (PApp _ f _) = getName f getName (PHidden t) = getName t getName _ = Nothing@@ -1528,18 +1545,20 @@ pruneByType env (P _ n _) ist as -- if the goal type is polymorphic, keep everything | Nothing <- lookupTyExact n ctxt = as+-- if the goal type is a ?metavariable, keep everything+ | Just _ <- lookup n (idris_metavars ist) = as | otherwise = let asV = filter (headIs True n) as as' = filter (headIs False n) as in case as' of- [] -> case asV of- [] -> as- _ -> asV+ [] -> asV _ -> as' where ctxt = tt_ctxt ist headIs var f (PRef _ _ f') = typeHead var f f'+ headIs var f (PApp _ (PRef _ _ (UN l)) [_, _, arg])+ | l == txt "Delay" = headIs var f (getTm arg) headIs var f (PApp _ (PRef _ _ f') _) = typeHead var f f' headIs var f (PApp _ f' _) = headIs var f f' headIs var f (PPi _ _ _ _ sc) = headIs var f sc@@ -1605,21 +1624,36 @@ "Can't find name" ++ show n -- Try again to solve auto implicits-solveAuto :: IState -> Name -> Bool -> Name -> ElabD ()-solveAuto ist fn ambigok n- = do hs <- get_holes- tm <- get_term- when (n `elem` hs) $ do- focus n- g <- goal- isg <- is_guess -- if it's a guess, we're working on it recursively, so stop- when (not isg) $- proofSearch' ist True ambigok 100 True Nothing fn [] []+solveAuto :: IState -> Name -> Bool -> (Name, [FailContext]) -> ElabD ()+solveAuto ist fn ambigok (n, failc) + = do hs <- get_holes+ when (not (null hs)) $ do+ env <- get_env+ g <- goal+ handleError cantsolve (when (n `elem` hs) $ do+ focus n+ isg <- is_guess -- if it's a guess, we're working on it recursively, so stop+ when (not isg) $+ proofSearch' ist True ambigok 100 True Nothing fn [] [])+ (lift $ Error (addLoc failc+ (CantSolveGoal g (map (\(n, b) -> (n, binderTy b)) env))))+ return ()+ where addLoc (FailContext fc f x : prev) err + = At fc (ElaboratingArg f x + (map (\(FailContext _ f' x') -> (f', x')) prev) err)+ addLoc _ err = err + cantsolve (CantSolveGoal _ _) = True+ cantsolve (InternalMsg _) = True+ cantsolve (At _ e) = cantsolve e+ cantsolve (Elaborating _ _ e) = cantsolve e+ cantsolve (ElaboratingArg _ _ _ e) = cantsolve e+ cantsolve _ = False+ solveAutos :: IState -> Name -> Bool -> ElabD () solveAutos ist fn ambigok = do autos <- get_autos- mapM_ (solveAuto ist fn ambigok) (map fst autos)+ mapM_ (solveAuto ist fn ambigok) (map (\(n, (fc, _)) -> (n, fc)) autos) trivial' ist = trivial (elab ist toplevel ERHS [] (sMN 0 "tac")) ist@@ -2322,6 +2356,7 @@ -- TODO: argument-specific error handlers go here for ElaboratingArg handle e = do ist <- getIState logLvl 2 "Starting error reflection"+ logLvl 5 (show e) let handlers = idris_errorhandlers ist applyHandlers e handlers getFnHandlers :: Name -> Name -> Idris [Name]
src/Idris/Elab/Transform.hs view
@@ -65,7 +65,7 @@ let lhs_ty = getInferType lhs' let newargs = pvars i lhs_tm - (clhs_tm_in, clhs_ty) <- recheckC fc id [] lhs_tm+ (clhs_tm_in, clhs_ty) <- recheckC_borrowing False False [] fc id [] lhs_tm let clhs_tm = renamepats pnames clhs_tm_in logLvl 3 ("Transform LHS " ++ show clhs_tm) logLvl 3 ("Transform type " ++ show clhs_ty)@@ -86,7 +86,7 @@ processTacticDecls info newDecls sendHighlighting highlights - (crhs_tm_in, crhs_ty) <- recheckC fc id [] rhs'+ (crhs_tm_in, crhs_ty) <- recheckC_borrowing False False [] fc id [] rhs' let crhs_tm = renamepats pnames crhs_tm_in logLvl 3 ("Transform RHS " ++ show crhs_tm)
src/Idris/Elab/Type.hs view
@@ -64,6 +64,7 @@ let ty = addImpl (imp_methods syn) i ty' logLvl 5 $ show n ++ " type pre-addimpl " ++ showTmImpls ty'+ logLvl 5 $ show "with methods " ++ show (imp_methods syn) logLvl 2 $ show n ++ " type " ++ show (using syn) ++ "\n" ++ showTmImpls ty (ElabResult tyT' defer is ctxt' newDecls highlights, log) <-
src/Idris/Elab/Utils.hs view
@@ -16,15 +16,16 @@ import Control.Monad.State import Control.Monad import Data.List+import Data.Maybe import qualified Data.Traversable as Traversable import Debug.Trace import qualified Data.Map as Map -recheckC = recheckC_borrowing False []+recheckC = recheckC_borrowing False True [] -recheckC_borrowing uniq_check bs fc mkerr env t+recheckC_borrowing uniq_check addConstrs bs fc mkerr env t = do -- t' <- applyOpts (forget t) (doesn't work, or speed things up...) ctxt <- getContext t' <- case safeForget t of@@ -33,8 +34,8 @@ (tm, ty, cs) <- tclift $ case recheck_borrowing uniq_check bs ctxt env t' t of Error e -> tfail (At fc (mkerr e)) OK x -> return x- logLvl 6 $ "CONSTRAINTS ADDED: " ++ show cs- addConstraints fc cs+ logLvl 6 $ "CONSTRAINTS ADDED: " ++ show (tm, ty, cs)+ when addConstrs $ addConstraints fc cs return (tm, ty) iderr :: Name -> Err -> Err@@ -211,6 +212,24 @@ flex = getFlexInType i env fix t in [x | x <- fix, not (x `elem` flex)] +getTCinj i (Bind n (Pi _ t _) sc) + = getTCinj i t ++ getTCinj i (instantiate (P Bound n t) sc)+getTCinj i ap@(App _ f a)+ | (P _ n _, args) <- unApply ap,+ isTCName n = mapMaybe getInjName args+ | otherwise = []+ where+ isTCName n = case lookupCtxtExact n (idris_classes i) of+ Just _ -> True+ _ -> False+ getInjName t | (P _ x _, _) <- unApply t = Just x+ | otherwise = Nothing+getTCinj _ _ = []++getTCParamsInType :: IState -> [Name] -> [PArg] -> Type -> [Name]+getTCParamsInType i env ps t = let params = getParamsInType i env ps t+ tcs = nub $ getTCinj i t in+ filter (flip elem tcs) params paramNames args env [] = [] paramNames args env (p : ps) | length args > p = case args!!p of
src/Idris/Error.hs view
@@ -147,7 +147,7 @@ warnDisamb ist (PQuasiquote tm goal) = warnDisamb ist tm >> Foldable.mapM_ (warnDisamb ist) goal warnDisamb ist (PUnquote tm) = warnDisamb ist tm-warnDisamb ist (PQuoteName _ _) = return ()+warnDisamb ist (PQuoteName _ _ _) = return () warnDisamb ist (PAs _ _ tm) = warnDisamb ist tm warnDisamb ist (PAppImpl tm _) = warnDisamb ist tm warnDisamb ist (PRunElab _ tm _) = warnDisamb ist tm
src/Idris/IBC.hs view
@@ -40,7 +40,7 @@ import Codec.Archive.Zip ibcVersion :: Word16-ibcVersion = 119+ibcVersion = 120 data IBCFile = IBCFile { ver :: Word16, sourcefile :: FilePath,@@ -50,6 +50,7 @@ ibc_fixes :: ![FixDecl], ibc_statics :: ![(Name, [Bool])], ibc_classes :: ![(Name, ClassInfo)],+ ibc_records :: ![(Name, RecordInfo)], ibc_instances :: ![(Bool, Bool, Name, Name)], ibc_dsls :: ![(Name, DSL)], ibc_datatypes :: ![(Name, TypeInfo)],@@ -93,7 +94,7 @@ !-} initIBC :: IBCFile-initIBC = IBCFile ibcVersion "" [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] [] []+initIBC = IBCFile ibcVersion "" [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] [] [] hasValidIBCVersion :: FilePath -> Idris Bool hasValidIBCVersion fp = do@@ -142,6 +143,7 @@ makeEntry "ibc_fixes" (ibc_fixes i), makeEntry "ibc_statics" (ibc_statics i), makeEntry "ibc_classes" (ibc_classes i),+ makeEntry "ibc_records" (ibc_records i), makeEntry "ibc_instances" (ibc_instances i), makeEntry "ibc_dsls" (ibc_dsls i), makeEntry "ibc_datatypes" (ibc_datatypes i),@@ -234,6 +236,10 @@ = case lookupCtxtExact n (idris_classes i) of Just v -> return f { ibc_classes = (n,v): ibc_classes f } _ -> ifail "IBC write failed"+ibc i (IBCRecord n) f+ = case lookupCtxtExact n (idris_records i) of+ Just v -> return f { ibc_records = (n,v): ibc_records f }+ _ -> ifail "IBC write failed" ibc i (IBCInstance int res n ins) f = return f { ibc_instances = (int, res, n, ins) : ibc_instances f } ibc i (IBCDSL n) f@@ -303,7 +309,7 @@ getEntry :: (Binary b, NFData b) => b -> FilePath -> Archive -> Idris b getEntry alt f a = case findEntryByPath f a of Nothing -> return alt- Just e -> return $ (force . decode . fromEntry) e+ Just e -> return $! (force . decode . fromEntry) e process :: Bool -- ^ Reexporting -> Archive -> FilePath -> Idris ()@@ -324,6 +330,7 @@ pFixes =<< getEntry [] "ibc_fixes" i pStatics =<< getEntry [] "ibc_statics" i pClasses =<< getEntry [] "ibc_classes" i+ pRecords =<< getEntry [] "ibc_records" i pInstances =<< getEntry [] "ibc_instances" i pDSLs =<< getEntry [] "ibc_dsls" i pDatatypes =<< getEntry [] "ibc_datatypes" i@@ -442,6 +449,13 @@ = addDef n c' (idris_classes i) })) cs +pRecords :: [(Name, RecordInfo)] -> Idris ()+pRecords rs = mapM_ (\ (n, r) ->+ do i <- getIState+ putIState (i { idris_records+ = addDef n r (idris_records i) }))+ rs+ pInstances :: [(Bool, Bool, Name, Name)] -> Idris () pInstances cs = mapM_ (\ (i, res, n, ins) -> addInstance i res n ins) cs @@ -1660,9 +1674,10 @@ put x2 PUnquote x1 -> do putWord8 43 put x1- PQuoteName x1 x2 -> do putWord8 44- put x1- put x2+ PQuoteName x1 x2 x3 -> do putWord8 44+ put x1+ put x2+ put x3 PIfThenElse x1 x2 x3 x4 -> do putWord8 45 put x1 put x2@@ -1808,7 +1823,8 @@ return (PUnquote x1) 44 -> do x1 <- get x2 <- get- return (PQuoteName x1 x2)+ x3 <- get+ return (PQuoteName x1 x2 x3) 45 -> do x1 <- get x2 <- get x3 <- get@@ -2129,6 +2145,17 @@ x5 <- get x6 <- get return (CI x1 x2 x3 x4 x5 [] x6)++instance Binary RecordInfo where+ put (RI x1 x2 x3)+ = do put x1+ put x2+ put x3+ get+ = do x1 <- get+ x2 <- get+ x3 <- get+ return (RI x1 x2 x3) instance Binary OptInfo where put (Optimise x1 x2)
src/Idris/IdrisDoc.hs view
@@ -221,6 +221,7 @@ where getFunDocs (FunDoc f) = [f] getFunDocs (DataDoc f fs) = f:fs getFunDocs (ClassDoc _ _ fs _ _ _ _ _) = fs+ getFunDocs (RecordDoc _ _ f fs _) = f:fs getFunDocs (NamedInstanceDoc _ fd) = [fd] getFunDocs (ModDoc _ _) = [] types (FD _ _ args t _) = t:(map second args)@@ -594,6 +595,32 @@ in if (head n') `elem` opChars then '(':(n' ++ ")") else n'++createOtherDoc ist (RecordDoc n doc ctor projs params) = do+ H.dt ! (A.id $ toValue $ show n) $ do+ H.span ! class_ "word" $ do "record"; nbsp+ H.span ! class_ "name type"+ ! title (toValue $ show n)+ $ toHtml $ name $ nsroot n+ H.span ! class_ "type" $ do nbsp ; prettyParameters+ H.dd $ do+ (if nullDocstring doc then Empty else Docstrings.renderHtml doc)+ if not $ null params+ then H.dl $ forM_ params genParam+ else Empty+ H.dl ! class_ "decls" $ createFunDoc ist ctor+ H.dl ! class_ "decls" $ forM_ projs (createFunDoc ist)+ where name (NS n ns) = show (NS (sUN $ name n) ns)+ name n = let n' = show n+ in if (head n') `elem` opChars+ then '(':(n' ++ ")")+ else n'++ genParam (name, pt, docstring) = do+ H.dt $ toHtml $ show (nsroot name)+ H.dd $ maybe nbsp Docstrings.renderHtml docstring++ prettyParameters = toHtml $ unwords [show $ nsroot n | (n,_,_) <- params] createOtherDoc ist (DataDoc fd@(FD n docstring args _ _) fds) = do H.dt ! (A.id $ toValue $ show n) $ do
src/Idris/ParseExpr.hs view
@@ -226,7 +226,8 @@ update ns (PNoImplicits t) = PNoImplicits $ update ns t update ns (PQuasiquote tm mty) = PQuasiquote (update ns tm) (fmap (update ns) mty) update ns (PUnquote t) = PUnquote $ update ns t- update ns (PQuoteName n fc) = uncurry PQuoteName (updateB ns (n, fc))+ update ns (PQuoteName n res fc) = let (n', fc') = (updateB ns (n, fc))+ in PQuoteName n' res fc' update ns (PRunElab fc t nsp) = PRunElab fc (update ns t) nsp update ns (PConstSugar fc t) = PConstSugar fc $ update ns t -- PConstSugar probably can't contain anything substitutable, but it's hard to track@@ -736,15 +737,19 @@ -} namequote :: SyntaxInfo -> IdrisParser PTerm-namequote syn = do startFC <- symbolFC "`{"+namequote syn = do (startFC, res) <-+ try (do fc <- symbolFC "`{{"+ return (fc, False)) <|>+ (do fc <- symbolFC "`{"+ return (fc, True)) (n, nfc) <- fnName- endFC <- symbolFC "}"+ endFC <- if res then symbolFC "}" else symbolFC "}}" mapM_ (uncurry highlightP) [ (startFC, AnnKeyword) , (endFC, AnnKeyword) , (spanFC startFC endFC, AnnQuasiquote) ]- return $ PQuoteName n nfc+ return $ PQuoteName n res nfc <?> "quoted name"
src/Idris/Primitives.hs view
@@ -15,6 +15,8 @@ import Data.Function (on) import qualified Data.Vector.Unboxed as V +import Debug.Trace+ data Prim = Prim { p_name :: Name, p_type :: Type, p_arity :: Int,@@ -165,6 +167,8 @@ (2, LStrIndex) partial, Prim (sUN "prim__strRev") (ty [StrType] StrType) 1 (p_strRev) (1, LStrRev) total,+ Prim (sUN "prim__strSubstr") (ty [AType (ATInt ITNative), AType (ATInt ITNative), StrType] StrType) 3 (p_strSubstr)+ (3, LStrSubstr) total, Prim (sUN "prim__readString") (ty [WorldType] StrType) 1 (p_cantreduce) (1, LReadStr) total, -- total is okay, because we have 'WorldType'@@ -493,7 +497,7 @@ p_floatFloor = p_fPrim (fromInteger . floor) p_floatCeil = p_fPrim (fromInteger . ceiling) -p_strLen, p_strHead, p_strTail, p_strIndex, p_strCons, p_strRev :: [Const] -> Maybe Const+p_strLen, p_strHead, p_strTail, p_strIndex, p_strCons, p_strRev, p_strSubstr :: [Const] -> Maybe Const p_strLen [Str xs] = Just $ I (length xs) p_strLen _ = Nothing p_strHead [Str (x:xs)] = Just $ Ch x@@ -507,6 +511,9 @@ p_strCons _ = Nothing p_strRev [Str xs] = Just $ Str (reverse xs) p_strRev _ = Nothing+p_strSubstr [I offset, I length, Str input] = Just $ Str (take length (drop offset input))+p_strSubstr _ = Nothing+ p_cantreduce :: a -> Maybe b p_cantreduce _ = Nothing
src/Idris/ProofSearch.hs view
@@ -165,12 +165,23 @@ if ambigok || argsok then case lookupCtxt nroot (idris_tyinfodata ist) of [TISolution ts] -> findInferredTy ts- _ -> psRec rec maxDepth [] S.empty- else do ptm <- get_term- autoArg (sUN "auto") -- not enough info in the type yet+ _ -> if ambigok then psRec rec maxDepth [] S.empty+ -- postpone if it fails early in elaboration+ else handleError cantsolve+ (psRec rec maxDepth [] S.empty)+ (autoArg (sUN "auto"))+ else autoArg (sUN "auto") -- not enough info in the type yet where findInferredTy (t : _) = elab (delab ist (toUN t)) + cantsolve (InternalMsg _) = True+ cantsolve (CantSolveGoal _ _) = True+ cantsolve (IncompleteTerm _) = True+ cantsolve (At _ e) = cantsolve e+ cantsolve (Elaborating _ _ e) = cantsolve e+ cantsolve (ElaboratingArg _ _ _ e) = cantsolve e+ cantsolve err = False+ conArgsOK ty = let (f, as) = unApply ty in case f of@@ -206,7 +217,7 @@ | Constant _ <- c = not (n `elem` hs) -- if fa is a metavariable applied to anything, we're not ready to run yet. notHole hs (fa, c)- | (P _ fn _, args) <- unApply fa = fn `notElem` hs+ | (P _ fn _, args@(_:_)) <- unApply fa = fn `notElem` hs notHole _ _ = True inHS hs (P _ n _) = n `elem` hs
src/Idris/Prover.hs view
@@ -127,9 +127,13 @@ _ -> return () elabStep :: ElabState EState -> ElabD a -> Idris (a, ElabState EState)-elabStep st e = case runStateT eCheck st of- OK (a, st') -> return (a, st')- Error a -> ierror a+elabStep st e =+ case runStateT eCheck st of+ OK ((a, ctxt'), ES (ps, est@EState{new_tyDecls = declTodo}) x old) ->+ do setContext ctxt'+ processTacticDecls toplevel declTodo+ return (a, ES (ps, est {new_tyDecls = []}) x old)+ Error a -> ierror a where eCheck = do res <- e matchProblems True unifyProblems@@ -138,7 +142,7 @@ [] -> do tm <- get_term ctxt <- get_context lift $ check ctxt [] (forget tm)- return res+ return (res, ctxt) ((_,_,_,_,e,_,_):_) -> lift $ Error e dumpState :: IState -> [(Name, Type, Term)] -> ProofState -> Idris ()@@ -264,6 +268,7 @@ undoElab prf env st [] = ifail "Nothing to undo" undoElab prf env st (h:hs) = do (prf', env', st') <- undoStep prf env st h return (prf', env', st', hs)+ elabloop :: Name -> Bool -> String -> [String] -> ElabState EState -> [ElabShellHistory] -> Maybe History -> [(Name, Type, Term)] -> Idris (Term, [String]) elabloop fn d prompt prf e prev h env
src/Idris/REPL.hs view
@@ -327,10 +327,13 @@ reverse unused)] runIO . hPutStrLn h $ IdeMode.convSExp "return" good id runIdeModeCommand h id orig fn mods (IdeMode.LoadFile filename toline) =+ -- The $!! here prevents a space leak on reloading.+ -- This isn't a solution - but it's a temporary stopgap.+ -- See issue #2386 do i <- getIState clearErr- putIState (orig { idris_options = idris_options i,- idris_outputmode = (IdeMode id h) })+ putIState $!! orig { idris_options = idris_options i,+ idris_outputmode = (IdeMode id h) } mods <- loadInputs [filename] toline isetPrompt (mkPrompt mods) -- Report either success or failure@@ -490,12 +493,23 @@ if null underNSs && null names then iPrintError "Invalid or empty namespace" else do ist <- getIState- let msg = (IdeMode.SymbolAtom "ok", (underNSs, map (pn ist) names))+ underNs <- mapM pn names+ let msg = (IdeMode.SymbolAtom "ok", (underNSs, underNs)) runIO . hPutStrLn h $ IdeMode.convSExp "return" msg id- where pn ist = displaySpans .- renderPretty 0.9 1000 .- fmap (fancifyAnnots ist True) .- prettyName True True []+ where pn n =+ do ctxt <- getContext+ ist <- getIState+ return $+ displaySpans .+ renderPretty 0.9 1000 .+ fmap (fancifyAnnots ist True) $+ prettyName True False [] n <>+ case lookupTyExact n ctxt of+ Just t ->+ space <> colon <> space <> align (group (pprintDelab ist t))+ Nothing ->+ empty+ runIdeModeCommand h id orig fn modes (IdeMode.TermNormalise bnd tm) = do ctxt <- getContext ist <- getIState@@ -675,17 +689,23 @@ Failure err -> do iputStrLn $ show (fixColour c err) return (Just inputs) Success (Right Reload) ->- do putIState $ orig { idris_options = idris_options i- , idris_colourTheme = idris_colourTheme i- , imported = imported i- }+ -- The $!! here prevents a space leak on reloading.+ -- This isn't a solution - but it's a temporary stopgap.+ -- See issue #2386+ do putIState $!! orig { idris_options = idris_options i+ , idris_colourTheme = idris_colourTheme i+ , imported = imported i+ } clearErr mods <- loadInputs inputs Nothing return (Just mods) Success (Right (Load f toline)) ->- do putIState orig { idris_options = idris_options i- , idris_colourTheme = idris_colourTheme i- }+ -- The $!! here prevents a space leak on reloading.+ -- This isn't a solution - but it's a temporary stopgap.+ -- See issue #2386+ do putIState $!! orig { idris_options = idris_options i+ , idris_colourTheme = idris_colourTheme i+ } clearErr mod <- loadInputs [f] toline return (Just mod)@@ -735,9 +755,9 @@ let args = line ++ [fixName f] runIO $ rawSystem editor args clearErr- putIState $ orig { idris_options = idris_options i- , idris_colourTheme = idris_colourTheme i- }+ putIState $!! orig { idris_options = idris_options i+ , idris_colourTheme = idris_colourTheme i+ } loadInputs [f] Nothing -- clearOrigPats iucheck@@ -788,7 +808,7 @@ logLvl 3 $ "Raw: " ++ show (tm', ty') logLvl 10 $ "Debug: " ++ showEnvDbg [] tm' let tmDoc = pprintDelab ist tm'- tyDoc = pprintDelab ist ty'+ tyDoc = pprintDelab ist ty' iPrintTermWithType tmDoc tyDoc where perhapsForce tm | termSmallerThan 100 tm = force tm | otherwise = tm@@ -1246,6 +1266,9 @@ process fn (SetOpt EvalTypes) = setEvalTypes True process fn (UnsetOpt EvalTypes) = setEvalTypes False +process fn (SetOpt DesugarNats) = setDesugarNats True+process fn (UnsetOpt DesugarNats) = setDesugarNats False+ process fn (SetOpt _) = iPrintError "Not a valid option" process fn (UnsetOpt _) = iPrintError "Not a valid option" process fn (SetColour ty c) = setColour ty c@@ -1499,13 +1522,13 @@ -- If it worked, load the whole thing from all the ibcs together case errSpan inew of Nothing ->- do putIState (ist { idris_tyinfodata = tidata })+ do putIState $!! ist { idris_tyinfodata = tidata } ibcfiles <- mapM findNewIBC (nub (concat (map snd ifiles))) tryLoad True (mapMaybe id ibcfiles) _ -> return () ist <- getIState- putIState (ist { idris_tyinfodata = tidata,- idris_patdefs = patdefs })+ putIState $! ist { idris_tyinfodata = tidata,+ idris_patdefs = patdefs } exports <- findExports case opt getOutput opts of@@ -1549,11 +1572,15 @@ let tidata = idris_tyinfodata inew let patdefs = idris_patdefs inew ok <- noErrors- when ok $ do when (not keepstate) $ putIState ist- ist <- getIState- putIState (ist { idris_tyinfodata = tidata,- idris_patdefs = patdefs })- tryLoad keepstate fs+ when ok $+ -- The $!! here prevents a space leak on reloading.+ -- This isn't a solution - but it's a temporary stopgap.+ -- See issue #2386+ do when (not keepstate) $ putIState $!! ist+ ist <- getIState+ putIState $!! ist { idris_tyinfodata = tidata,+ idris_patdefs = patdefs }+ tryLoad keepstate fs ibc (IBC _ _) = True ibc _ = False
src/Idris/REPLParser.hs view
@@ -260,6 +260,7 @@ <|> do discard (P.symbol "nobanner") ; return NoBanner <|> do discard (P.symbol "warnreach"); return WarnReach <|> do discard (P.symbol "evaltypes"); return EvalTypes+ <|> do discard (P.symbol "desugarnats"); return DesugarNats proofArg :: (Bool -> Int -> Name -> Command) -> String -> P.IdrisParser (Either String Command) proofArg cmd name = do
src/Idris/Reflection.hs view
@@ -7,6 +7,7 @@ import Control.Applicative ((<$>), (<*>), pure) import Control.Monad (liftM, liftM2, liftM4)+import Control.Monad.State.Strict (lift) import Data.Maybe (catMaybes) import Data.List ((\\), findIndex) import qualified Data.Text as T@@ -21,6 +22,7 @@ initEState, pairCon, pairTy) import Idris.Delaborate (delab) + data RErasure = RErased | RNotErased deriving Show data RPlicity = RExplicit | RImplicit | RConstraint deriving Show@@ -351,6 +353,11 @@ | f == reflm "B32" = return $ c reifyTTConstApp f (Constant c@(B64 _)) | f == reflm "B64" = return $ c+reifyTTConstApp f v@(P _ _ _) =+ lift . tfail . Msg $+ "Can't reify the variable " +++ show v +++ " as a constant, because its value is not statically known." reifyTTConstApp f arg = fail ("Unknown reflection constant: " ++ show (f, arg)) reifyArithTy :: Term -> ElabD ArithTy
src/Pkg/Package.hs view
@@ -5,7 +5,8 @@ import System.Directory import System.Exit import System.IO-import System.FilePath ((</>), addTrailingPathSeparator, takeFileName, takeDirectory, normalise)+import System.FilePath ((</>), addTrailingPathSeparator, takeFileName,+ takeDirectory, normalise, addExtension, hasExtension) import System.Directory (createDirectoryIfMissing, copyFile) import Util.System@@ -118,7 +119,7 @@ rmIdx (pkgname pkgdesc) case execout pkgdesc of Nothing -> return ()- Just s -> rmFile $ dir </> s+ Just s -> rmExe $ dir </> s -- | Generate IdrisDoc for package -- TODO: Handle case where module does not contain a matching namespace@@ -231,7 +232,13 @@ rmIdx :: String -> IO () rmIdx p = do let f = pkgIndex p ex <- doesFileExist f- when ex $ rmFile f + when ex $ rmFile f++rmExe :: String -> IO ()+rmExe p = do+ fn <- return $ if isWindows && not (hasExtension p)+ then addExtension p ".exe" else p+ rmFile fn toIBCFile (UN n) = str n ++ ".ibc" toIBCFile (NS n ns) = foldl1' (</>) (reverse (toIBCFile n : map str ns))
+ stack.yaml view
@@ -0,0 +1,6 @@+flags: {}+packages:+- '.'+extra-deps: +- cheapskate-0.1.0.4+resolver: nightly-2015-07-24
test/basic009/expected view
@@ -1,4 +1,13 @@ MAIN-PASS-Faulty.idr:6:7:When checking type of Faulty.fault:-Can't disambiguate name: A.num, B.C.num+Faulty.idr:7:7:When checking right hand side of fault:+Type mismatch between+ 0 = 0 (Type of Refl)+and+ num = 0 (Expected type)++Specifically:+ Type mismatch between+ 0+ and+ num Multiple.idr:3:1:import alias not unique: "X"
+ test/basic014/basic014.idr view
@@ -0,0 +1,44 @@+-- Test pattern unification++import Data.Vect++comp : {A : Type} -> {B : (a : A) -> Type} ->+ {C : (a : A) -> (b : B a) -> Type} ->+ (f : {a : A} -> (b : B a) -> C a b) ->+ (g : (a : A) -> B a) ->+ (a : A) -> C a (g a)+comp f g a = f (g a)++add2 : Nat -> Nat+add2 = comp S S++data Foo = MkFoo+data Bar = MkBar++foo : Foo -> Bar++bar : Bar -> Nat++baz : Foo -> Nat+baz = (comp bar foo)++comp0 : (B : Nat -> Type) -> ((n : Nat) -> B n) -> Int+comp0 _ _ = 0++test00 : Int+test00 = comp0 _ S++comp2 : (B : Nat -> Type) ->+ ((n : Nat) -> (y : B n) -> Int) -> Int+comp2 _ _ = 0++test20 : Int+test20 = comp2 _ dummy+ where+ dummy : (n : Nat) -> Vect n Int -> Int+ dummy _ _ = 0++test03 : Int+test03 = comp0 _ dummy where+ dummy : (n : Nat) -> Int -> Int+ dummy _ = \x => x
+ test/basic014/expected view
+ test/basic014/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris $@ basic014.idr --check+rm -f *.ibc
+ test/basic015/basic015.idr view
@@ -0,0 +1,73 @@+{-+data Nat = Z | S Nat++plus : Nat -> Nat -> Nat+plus Z y = y+plus (S x) y = S (plus x y)+-}++data Vect : Nat -> Type -> Type where+ Nil : Vect Z a+ (::) : a -> Vect k a -> Vect (S k) a++%name Vect xs, ys, zs++append : Vect n a -> Vect m a -> Vect (n + m) a+append [] ys = ys+append (x :: xs) ys = x :: append xs ys+++zipWith : (a -> b -> c) -> Vect n a -> Vect n b -> Vect n c+zipWith f [] ys = []+zipWith f (x :: xs) (y :: ys) = f x y :: zipWith f xs ys++create_empties : Vect m (Vect 0 elem)+create_empties {m = Z} = []+create_empties {m = (S k)} = [] :: create_empties++transpose_helper : (row : Vect m elem) -> (rest_trans : Vect m (Vect k elem)) ->+ Vect m (Vect (S k) elem)+transpose_helper [] [] = []+transpose_helper (rowval :: xs) (restrow :: ys) = (rowval :: restrow) :: transpose_helper xs ys++transpose_vec : Vect n (Vect m elem) -> Vect m (Vect n elem)+transpose_vec [] = create_empties+transpose_vec (row :: rest) = let rest_trans = transpose_vec rest in+ transpose_helper row rest_trans+++++++++------- A main program to read dimensions, generate and tranpose a vector++instance Functor (Vect m) where+ map m [] = []+ map m (x :: xs) = m x :: map m xs++instance Show a => Show (Vect m a) where+ show x = show (toList x)+ where+ toList : Vect m a -> List a+ toList [] = []+ toList (y :: xs) = y :: toList xs++countTo : (m : Nat) -> Vect m Int+countTo Z = []+countTo (S k) = 0 :: map (+1) (countTo k)++mkVect : (n, m : Nat) -> Vect n (Vect m Int)+mkVect Z m = []+mkVect (S k) m = countTo m :: map (map (+ cast m)) (mkVect k m)++main : IO ()+main = do putStr "Rows: "+ let r : Nat = 5 + putStr "Columns: "+ let c : Nat = 6 + printLn (mkVect r c)+ putStrLn "Transposed:"+ printLn (transpose_vec (mkVect r c))
+ test/basic015/expected view
@@ -0,0 +1,3 @@+Rows: Columns: [[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29]]+Transposed:+[[0, 6, 12, 18, 24], [1, 7, 13, 19, 25], [2, 8, 14, 20, 26], [3, 9, 15, 21, 27], [4, 10, 16, 22, 28], [5, 11, 17, 23, 29]]
+ test/basic015/run view
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+idris $@ basic015.idr -o basic015+./basic015+rm -f basic015 *.ibc
test/classes001/ClassName.idr view
@@ -21,7 +21,7 @@ test1 : twiceAString 2 = "22" test1 = Refl -test2 : twiceAString @{badShow} 2 = "hejhej"+test2 : twiceAString @{ClassName.badShow} 2 = "hejhej" test2 = Refl
test/dsl003/DSLPi.idr view
@@ -43,5 +43,5 @@ test3 : Spec [] test3 = ForAll INT . ForAll INT . ItHolds $ Var (FS FZ) === Var FZ -test4 : test2 = test3+test4 : DSLPi.test2 = DSLPi.test3 test4 = Refl
test/effects001/test021.idr view
@@ -23,7 +23,8 @@ testFile : FileIO () () testFile = do True <- open "testFile" Read | False => putStrLn "Error!"- putStrLn (show !readFile)+ fcontents <- readFile+ putStrLn (show fcontents) close putStrLn (show !(Count :- get))
+ test/effects005/categoryLogger.idr view
@@ -0,0 +1,23 @@+import Effects+import Effect.Logging.Category++func : Nat -> Eff () [LOG String]+func x = do+ warn Nil $ unwords ["I do nothing with", show x]+ pure ()++doubleFunc : Nat -> Eff Nat [LOG String]+doubleFunc x = do+ logN 40 ["NumOPS"] $ unwords ["Doing the double with", show x ]+ func x+ pure (x+x)++eMain : Eff Nat [LOG String]+eMain = do+ initLogger ALL ["NumOPS"]+ doubleFunc 3++main : IO ()+main = do+ x <- run eMain+ printLn x
+ test/effects005/defaultLogger.idr view
@@ -0,0 +1,14 @@+import Effects+import Effect.Logging.Default++doubleFunc : Nat -> Eff Nat [LOG]+doubleFunc x = do+ warn $ unwords ["Doing the double with", show x ]+ pure (x+x)++main : IO ()+main = do+ x <- runInit [MkLogRes ALL] (doubleFunc 3)+ printLn x+ y <- run (doubleFunc 4)+ printLn y
− test/effects005/defaultlog.idr
@@ -1,18 +0,0 @@-import Effects-import Effect.Logging.Default--func : Nat -> Eff () [LOG String]-func x = do- log WARN Nil $ unwords ["I do nothing with", show x]- pure ()--doubleFunc : Nat -> Eff Nat [LOG String]-doubleFunc x = do- log WARN ["NumOPS"] $ unwords ["Doing the double with", show x ]- func x- pure (x+x)--main : IO ()-main = do- x <- runInit [(ALL,["NumOPS"])] (doubleFunc 3)- printLn x
test/effects005/expected view
@@ -1,5 +1,5 @@-"3 : Doing the double with 3"+WARN : Doing the double with 3 6 8-"3 : [\"NumOPS\"] : Doing the double with 3"+WARN : ["NumOPS"] : Doing the double with 3 6
test/effects005/run view
@@ -1,6 +1,6 @@ #!/usr/bin/env bash-idris $@ simplelog.idr -o simple -p effects-./simple-idris $@ defaultlog.idr -o default -p effects+idris $@ defaultLogger.idr -o default -p effects ./default-rm -f simple default *.ibc+idris $@ categoryLogger.idr -o category -p effects+./category+rm -f default category *.ibc
− test/effects005/simplelog.idr
@@ -1,14 +0,0 @@-import Effects-import Effect.Logging.Simple--doubleFunc : Nat -> Eff Nat [LOG]-doubleFunc x = do- log WARN $ unwords ["Doing the double with", show x ]- pure (x+x)--main : IO ()-main = do- x <- runInit [ALL] (doubleFunc 3)- printLn x- y <- runInit [OFF] (doubleFunc 4)- printLn y
test/error003/expected view
@@ -1,2 +1,2 @@ ErrorReflection.idr:68:5:When checking right hand side of bad:-DSL type error: (t(503) => t'(504)) doesn't match ()+DSL type error: (t(504) => t'(503)) doesn't match ()
test/error004/expected view
@@ -1,6 +1,6 @@-FunErrTest.idr:35:10:When checking right hand side of badCadr1:-When checking argument cons1 to function FunErrTest.cadr:+FunErrTest.idr:35:17:When checking right hand side of badCadr1:+When checking argument cons2 to function FunErrTest.cadr: Could not prove that [] has at least two elements.-FunErrTest.idr:38:10:When checking right hand side of badCadr2:+FunErrTest.idr:38:17:When checking right hand side of badCadr2: When checking argument cons2 to function FunErrTest.cadr:- Could not prove that tail [1] has at least two elements.+ Could not prove that [] has at least two elements.
test/meta002/Tacs.idr view
@@ -52,7 +52,46 @@ test2 : Nat test2 = %runElab triv +obvious : Elab ()+obvious = do g <- goalType+ case g of+ `(() : Type) =>+ do fill `(() : ())+ solve+ `((~a, ~b) : Type) =>+ do aH <- gensym "a"+ bH <- gensym "b"+ claim aH a+ claim bH b+ fill `(MkPair {A=~a} {B=~b} ~(Var aH) ~(Var bH))+ solve+ focus aH; obvious+ focus bH; obvious+ `(Either ~a ~b) =>+ (do h <- gensym "a"+ claim h a+ fill `(Left {a=~a} {b=~b} ~(Var h))+ solve+ focus h; obvious) <|>+ -- This second h didn't work at one point - this+ -- test makes sure the fix stays fixed. The+ -- uniquification of binder names didn't+ -- appropriately treat quotation.+ (do h <- gensym "a"+ claim h b+ fill `(Right {a=~a} {b=~b} ~(Var h))+ solve+ focus h; obvious) +easy : ()+easy = %runElab obvious+++easy2 : ((), ((), (Either () Void)))+easy2 = %runElab obvious+++ namespace STLC data Ty = UNIT | ARR Ty Ty@@ -254,3 +293,4 @@ -- Tacs.idr line 247 col 14: -- When elaborating right hand side of testElab3: -- Unifying ty and Tacs.STLC.ARR ty t would lead to infinite value+
test/meta002/expected view
@@ -1,3 +1,3 @@-Tacs.idr:251:15:+Tacs.idr:290:15: When checking right hand side of testElab3: Unifying ty and ARR ty t would lead to infinite value
test/primitives001/expected view
@@ -1,6 +1,27 @@ 8-1 ("abc", "123") ("abc", "123") ([1, 2], [3, 4, 5]) ([1, 2], [3, 4, 5])+ello! here's the thing+22+0+用的依赖类+Idris+[]+is 是一个通用+8+is 是一个通用的依赖类型纯函数式编程语言,其类型系统与 Agda 以及 Epigram 相似。+48+Idris 是一个通用的依赖类型纯函+18++0+is is a +8+is is a general-purpose purely functional programming language with dependent types. +85+Idris is a general+18++0
+ test/primitives001/input view
@@ -0,0 +1,2 @@+Idris 是一个通用的依赖类型纯函数式编程语言,其类型系统与 Agda 以及 Epigram 相似。+Idris is a general-purpose purely functional programming language with dependent types.
test/primitives001/run view
@@ -1,4 +1,6 @@ #!/usr/bin/env bash idris $@ test005.idr -o test005 ./test005-rm -f test005 test005.ibc+idris $@ substring.idr -o substring+./substring < input+rm -f test005 substring *.ibc
+ test/primitives001/substring.idr view
@@ -0,0 +1,58 @@+-- This is a test of the substring primitive, both in the Idris+-- evaluator and in some backend. It attempts to exercise that+-- negative indices are equivalent to 0, that it works for mixed+-- single- and multi-byte characters, and that overshooting the end+-- doesn't break things.++-- Single byte test+foo : String+foo = "Hello! here's the thing"++-- The first sentence of the Chinese wikipedia article on Idris (to+-- get mixed single-and-multibyte chars)+firstSentence : String+firstSentence = "Idris 是一个通用的依赖类型纯函数式编程语言,其类型系统与 Agda 以及 Epigram 相似。"++emptyTest : prim__strSubstr 100000 14 Main.firstSentence = ""+emptyTest = Refl++multiTest : prim__strSubstr 10 5 Main.firstSentence = "用的依赖类"+multiTest = Refl++negative : prim__strSubstr (-10) 5 Main.firstSentence = "Idris"+negative = Refl++negativeEnd : prim__strSubstr 0 (-1) Main.firstSentence = ""+negativeEnd = Refl++negativeLength : prim__strSubstr 4 (-4) Main.firstSentence = ""+negativeLength = Refl++main : IO ()+main = do putStrLn $ prim__strSubstr 1 1004 foo+ printLn $ length $ prim__strSubstr 1 1000 foo+ printLn $ length $ prim__strSubstr 1000 2 firstSentence+ putStrLn $ prim__strSubstr 10 5 firstSentence+ putStrLn $ prim__strSubstr (-10) 5 firstSentence+ putStrLn $ "[" ++ prim__strSubstr 0 (-1) firstSentence ++ "]"+ -- Multi-byte dynamic string+ input <- getLine+ putStrLn $ prim__strSubstr 3 8 input+ putStrLn $ show (length (prim__strSubstr 3 8 input))+ putStrLn $ prim__strSubstr 3 8000 input+ putStrLn $ show (length (prim__strSubstr 3 8000 input))+ putStrLn $ prim__strSubstr (-13) 18 input+ putStrLn $ show (length (prim__strSubstr (-13) 18 input))+ putStrLn $ prim__strSubstr 4 (-4) input+ putStrLn $ show (length (prim__strSubstr 4 (-4) input))+ -- Single-byte dynamic string+ input <- getLine+ putStrLn $ prim__strSubstr 3 8 input+ putStrLn $ show (length (prim__strSubstr 3 8 input))+ putStrLn $ prim__strSubstr 3 8000 input+ putStrLn $ show (length (prim__strSubstr 3 8000 input))+ putStrLn $ prim__strSubstr (-13) 18 input+ putStrLn $ show (length (prim__strSubstr (-13) 18 input))+ putStrLn $ prim__strSubstr 4 (-4) input+ putStrLn $ show (length (prim__strSubstr 4 (-4) input))+
test/primitives001/test005.idr view
@@ -8,7 +8,6 @@ main : IO () main = do printLn (abs (-8))- printLn (abs (S Z)) printLn (span isAlpha tstr) printLn (break isDigit tstr) printLn (span (\x => x < 3) tlist)
test/primitives002/run view
@@ -2,8 +2,6 @@ HEAD='module Main -import Data.Floats- strtake : Nat -> String -> String strtake n str = pack (take n (unpack str))
test/proof003/test015.idr view
@@ -106,7 +106,7 @@ -- There is almost certainly an easier proof. I don't care, for now :) Main.adc_lemma_2 = proof {- intro w,v,num0,v1,num1,x,bx,x1,bx1,bit0,b0,bit1,b1,c,bc+ intro v,w,num0,v1,num1,x,bx,x1,bx1,bit0,b0,bit1,b1,c,bc rewrite sym (plusZeroRightNeutral x); rewrite sym (plusZeroRightNeutral v1); rewrite sym (plusZeroRightNeutral (plus (plus x v) v1));
+ test/proofsearch001/expected view
+ test/proofsearch001/proofsearch001.idr view
@@ -0,0 +1,11 @@+%default total++class C a (f : Bool -> Bool) | a where {}+instance C Int Bool.not where {}++foo : C Int g => {auto pf : g True = False} -> Unit+foo = ()++main : IO ()+main = printLn $ foo -- {pf = Refl}+
+ test/proofsearch001/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris $@ --check proofsearch001.idr+rm -f *.ibc
+ test/proofsearch002/Process.idr view
@@ -0,0 +1,443 @@+module Process++import System.Concurrency.Raw+import public Data.List -- public, to get proof search machinery++%access public++-- Process IDs are parameterised by their interface. A request of type+-- 'iface t' will get a response of type 't'+data ProcID : (iface : Type -> Type) -> Type where+ MkPID : Ptr -> ProcID iface++data ServerID : Type where+ MkServer : ProcID iface -> ServerID++implicit MkServer' : ProcID iface -> ServerID+MkServer' = MkServer++data Replied = YesR | NoR++data ReqHandle = MkReqH Nat++-- Current state of a process includes:+-- * the servers it currently has an open connection to+-- * the number of clients it currently has connected+-- * whether it has responded to a request yet++-- Therefore, we can write process types which make clear that a process+-- cannot quit while it is talking to a server, or while it still has clients+-- expecting to communicate with it, or if it has not serviced any requests.+data ProcState : Type where+ MkProcState : (servers : List ServerID) -> + (clients : Nat) ->+ Replied ->+ ProcState ++data Pending : ReqHandle -> List (ReqHandle, Type) -> Type -> Type where+ PendingHere : Pending h ((h, t) :: hs) t+ PendingThere : Pending h hs t -> Pending h ((h', t') :: hs) t++dropPending : (hs : List (ReqHandle, Type)) -> Pending h hs ty -> + List (ReqHandle, Type)+dropPending ((h, t) :: xs) PendingHere = xs+dropPending ((h', t') :: xs) (PendingThere x) + = ((h', t') :: dropPending xs x)++data ConnectedTo : ServerID -> ProcState -> Type where+ IsConnectedTo : Elem p servers -> + ConnectedTo p (MkProcState servers c reply)++data NoClient : ProcState -> Type where+ IsNoClient : NoClient (MkProcState servers 0 reply)++data OneClient : ProcState -> Type where+ IsOneClient : OneClient (MkProcState servers (S k) reply)++data Reply : ProcState -> Type where+ IsReply : Reply (MkProcState s c YesR)++data NoReply : ProcState -> Type where+ IsNoReply : NoReply (MkProcState s c NoR)++{-- Some useful operations on process state --}+newClient : ProcState -> ProcState +newClient (MkProcState servers clients r) + = MkProcState servers (S clients) r++setClients : ProcState -> Nat -> ProcState +setClients (MkProcState servers clients r) k + = MkProcState servers k r++newServer : ProcID iface -> ProcState -> ProcState +newServer p (MkProcState servers clients r) + = MkProcState (MkServer p :: servers) clients r++dropServer : (pid : ProcID iface) -> (p : ProcState) -> + ConnectedTo (MkServer pid) p -> ProcState+dropServer pid (MkProcState servers c r) (IsConnectedTo prf) + = MkProcState (dropElem servers prf) c r++{-+pendingReq : ProcID iface -> (h : ReqHandle) -> iface t -> + ProcState hs -> ProcState ((h, t) :: hs)+pendingReq {t} p h x (MkProcState s c r) = MkProcState s c r++doneReq : ProcState hs -> (p : Pending h hs) -> ProcState (dropPending hs p)+doneReq (MkProcState s c r) p = MkProcState s c r+-}++replied : ProcState -> ProcState +replied (MkProcState servers clients r) + = MkProcState servers clients YesR++resetReplied : ProcState -> ProcState+resetReplied (MkProcState servers clients r) + = MkProcState servers clients NoR++runningServer : Nat -> ProcState+runningServer c = MkProcState [] (S c) NoR++doneServer : ProcState +doneServer = MkProcState [] 0 YesR++init : List ServerID -> ProcState +init s = MkProcState s 0 NoR++{-- Processes themselves.++A process returns some type 'a', responds to requests on the interface+'iface', and has an input and output state.+--}+mutual+ data Process : (a : Type) -> (iface : Type -> Type) -> + List (ReqHandle, Type) -> (a -> List (ReqHandle, Type)) ->+ ProcState -> (a -> ProcState) ->+ Type where+ -- Some plumbing+ Lift' : IO a -> Process a iface hs (const hs) p (const p)+ Pure : a -> Process a iface hs (const hs) p (const p)+ Quit : a -> Process a iface hs (const hs) p (const (resetReplied p))++ bind : Process a iface hs hs' p p' -> + ((x : a) -> Process b iface (hs' x) hs'' (p' x) p'') ->+ Process b iface hs hs'' p p''++ Fork : Process () serveri [] (const []) (runningServer 1) (const doneServer) ->+ Process (ProcID serveri) iface hs (const hs) p (\res => (newServer res p))+ Work : (worker : (pid : ProcID iface) -> Worker [pid] ()) ->+ (waiter : Process t iface hs (const hs) (runningServer 1) (const doneServer)) ->+ Process t iface hs (const hs) p (const p)++ Request : (r : ProcID serveri) -> (x : serveri ty) ->+ {auto connected : ConnectedTo (MkServer r) p} ->+ Process ReqHandle iface + hs (\h => (h, ty) :: hs)+ p (const p)++ GetReply : (h : ReqHandle) ->+ {auto pending : Pending h hs ty} ->+ Process ty iface + hs (const (dropPending hs pending))+ p (const p)++ TimeoutRespond : (timeout : Int) ->+ (def : res) ->+ ({t : Type} -> (x : iface t) -> + Response (t, res) iface hs p) ->+ Process res iface hs (const hs) p (const (replied p))++ Respond : ({t : Type} -> (x : iface t) -> + Response (t, res) iface hs p) ->+ Process res iface hs (const hs) p (const (replied p))++ Connect : (r : ProcID serveri) -> + Process Bool iface + hs (const hs)+ p (\ok => case ok of+ True => newServer r p+ False => p)++ Disconnect : (r : ProcID serveri) ->+ {auto connected : ConnectedTo (MkServer r) p} ->+ Process () iface + hs (const hs)+ p (const (dropServer r p connected))++ CountClients : Process Nat iface hs (const hs) p (\n => setClients p n)++ -- FIXME: The process had better be guaranteed to change the system+ -- state (e.g. finish with a YesR since it starts with a NoR) because+ -- then it can't be used in a Respond, so responding can't loop.+ Loop : Inf (Process t iface hs hs' (resetReplied p) p') -> + Process t iface hs hs' p p'++ -- 'Running a iface' is the type of a process which is currently+ -- responding to requests (i.e. knows it has at least one client connected)+ -- and will not exit unless there are no clients connected+ Running : Type -> (iface : Type -> Type) -> Type+ Running a iface = {k : Nat} -> Process a iface [] (const []) (runningServer k) (const doneServer)++ Response : Type -> (iface : Type -> Type) -> List (ReqHandle, Type) ->+ ProcState -> Type+ Response a iface hs p = Process a iface hs (const hs) p (const p)++ -- 'Program a' is the type of a process which does not respond to any requests+ -- and begins and ends with no connections to any server open.+ Program : Type -> (iface : Type -> Type) -> Type+ Program a iface = Process a iface [] (const []) (init []) (const (init []))++ -- 'Connected s a' is the type of a process which does not respond to any + -- requests and begins and ends with connections to a given server list. + Connected : List ServerID -> Type -> Type+ Connected s a = Process a (const Void) [] (const []) (init s) (const (init s))++ -- 'Worker s a' is the type of a process which does not respond to any + -- requests, and begins with a connection to a server it is to send a+ -- notification to.+ Worker : List ServerID -> Type -> Type+ Worker s a = Process a (const Void) [] (const []) (init s) (const (init []))++implicit +Lift : IO a -> Process a iface hs (const hs) p (const p) +Lift = Lift'+ +%no_implicit -- helps error messages, and speeds things up a bit +%inline -- so that the productivity checker treats 'bind' as a constructor!+(>>=) : Process a iface hs hs' p p' -> + ((x : a) -> Process b iface (hs' x) hs'' (p' x) p'') ->+ Process b iface hs hs'' p p''+(>>=) = bind++TrySend : (proc : ProcID iface) -> iface ty -> + Process (Maybe ty) iface' + hs (const hs)+ (MkProcState s c r) (const (MkProcState s c r))+TrySend pid req = do True <- Connect pid | False => Pure Nothing+ h <- Request pid req+ resp <- GetReply h+ Disconnect pid+ Pure (Just resp)++Send : (proc : ProcID iface) -> iface ty -> + {auto prf : Elem (MkServer proc) s} ->+ Process ty iface'+ hs (const hs)+ (MkProcState s c r) (const (MkProcState s c r))+Send pid req = do h <- Request pid req+ GetReply h++{--- evaluator --}++-- The evaluator keeps track of the number of client connections open,+-- and manages Connect/Disconnect requests by managing them whenever a+-- 'Respond' or 'TimeoutRespond' is encountered.++data MessageQ : (Type -> Type) -> Type where+ ConnectMsg : MessageQ iface+ CloseMsg : MessageQ iface+ RequestMsg : Nat -> iface t -> MessageQ iface++data MessageR : Type -> Type where+ ReplyMsg : Nat -> (ans : ty) -> MessageR ty++data Message : (Type -> Type) -> List (ReqHandle, Type) -> Type where+ MsgQuery : MessageQ iface -> Message iface hs+ MsgReply : (reply : MessageR ty) -> Message iface hs++readMsg : IO (Maybe (Ptr, Message iface hs))+readMsg {iface} {hs} = + do if !checkMsgs+ then do msg <- getMsgWithSender {a = Message iface hs}+ pure (Just msg)+ else pure Nothing++readMsgTimeout : Int -> IO (Maybe (Ptr, Message iface hs))+readMsgTimeout {iface} {hs} i = + do if !(checkMsgsTimeout i)+ then do msg <- getMsgWithSender {a = Message iface hs}+ pure (Just msg)+ else pure Nothing++data RespEnv : List (ReqHandle, Type) -> Type where+ Nil : RespEnv []+ (::) : Maybe ty -> RespEnv hs -> RespEnv ((h, ty) :: hs)++record EvalState (iface : Type -> Type) (hs : List (ReqHandle, Type)) where+ constructor MkEvalState+ queue : List (Ptr, MessageQ iface)+ reply : RespEnv hs + clients : Nat+ nexthandle : Nat++lookup : Pending h hs ty -> RespEnv hs -> Maybe ty+lookup PendingHere (x :: xs) = x +lookup (PendingThere p) (x :: xs) = lookup p xs++dropResp : (pending : Pending h hs ty) -> + RespEnv hs -> RespEnv (dropPending hs pending)+dropResp PendingHere (x :: xs) = xs+dropResp (PendingThere p) (x :: xs) = x :: dropResp p xs++updateReplies : Pending h hs ty -> ty -> RespEnv hs -> RespEnv hs+updateReplies PendingHere msg (x :: xs) = Just msg :: xs+updateReplies (PendingThere p) msg (x :: xs) = x :: updateReplies p msg xs++total+findPending : (h : ReqHandle) -> RespEnv hs -> Maybe (ty ** Pending h hs ty)+findPending {hs = []} k [] = Nothing+findPending {hs = ((MkReqH h, t) :: hs)} (MkReqH k) (x :: xs) with (decEq h k)+ findPending {hs = ((MkReqH h, t) :: hs)} (MkReqH h) (x :: xs) | (Yes Refl) + = Just (t ** PendingHere)+ findPending {hs = ((MkReqH h, t) :: hs)} (MkReqH k) (x :: xs) | (No contra) + = do (ty' ** p') <- findPending (MkReqH k) xs+ Just (ty' ** PendingThere p')++covering+updateQueue : EvalState iface hs -> IO (EvalState iface hs)+updateQueue {iface} {hs} st + = case !(readMsg {iface} {hs}) of+ Nothing => pure st+ Just (pid, MsgQuery msg) => + updateQueue (record { queue = queue st ++ [(pid, msg)] } st)+ Just (pid, MsgReply (ReplyMsg rq ans)) => + case findPending (MkReqH rq) (reply st) of+ Nothing => updateQueue {iface} {hs} st -- can't happen!+ Just (ty ** pend) => + updateQueue (record { reply = updateReplies pend (believe_me ans) (reply st) } st)++-- Keep updating the queue with incoming messages until either we get a +-- RequestMsg, or we reach a timeout.+covering+updateQueueTimeout : Int -> EvalState iface hs -> IO (EvalState iface hs)+updateQueueTimeout {iface} {hs} i st + = case !(readMsgTimeout {iface} {hs} i) of+ Nothing => pure st+ Just (pid, MsgQuery (RequestMsg rq msg)) => + pure (record { queue = queue st ++ [(pid, RequestMsg rq msg)] } st)+ Just (pid, MsgQuery msg) => do+ -- TODO: Why not update client count here too?+ updateQueueTimeout i (record { queue = queue st ++ [(pid, msg)] } st)+ Just (pid, MsgReply (ReplyMsg rq ans)) => + case findPending (MkReqH rq) (reply st) of+ Nothing => updateQueueTimeout i {iface} {hs} st -- can't happen!+ Just (ty ** pend) => + updateQueueTimeout i (record { reply = updateReplies pend (believe_me ans) (reply st) } st)++total+removeReq : List (Ptr, MessageQ iface) -> List (Ptr, MessageQ iface) -> + Maybe (Ptr, (ty ** (Nat, iface ty)), List (Ptr, MessageQ iface))+removeReq acc [] = Nothing+removeReq acc ((pid, RequestMsg rq m) :: xs) = Just (pid, (_ ** (rq, m)), reverse acc ++ xs)+removeReq acc (x :: xs) = removeReq (x :: acc) xs++total+removeConn : Nat ->+ List (Ptr, MessageQ iface) -> List (Ptr, MessageQ iface) -> + (Nat, List (Ptr, MessageQ iface))+removeConn cl acc [] = (cl, reverse acc)+removeConn cl acc ((pid, ConnectMsg) :: xs) + = removeConn (cl + 1) acc xs+removeConn cl acc ((pid, CloseMsg) :: xs) + = removeConn (minus cl 1) acc xs+removeConn cl acc (x :: xs) = removeConn cl (x :: acc) xs++-- Remove the first thing in the event list which is a request, if it+-- exists.+getRequest : EvalState iface hs -> Maybe (Ptr, (ty ** (Nat, iface ty)), EvalState iface hs)+getRequest (MkEvalState queue reply clients nh) + = do (pid, req, queue') <- removeReq [] queue+ return (pid, req, MkEvalState queue' reply clients nh)++countClients : EvalState iface hs -> (Nat, EvalState iface hs)+countClients (MkEvalState queue reply clients nh) + = let (clients', queue') = removeConn clients [] queue in+ (clients', MkEvalState queue' reply clients' nh)++-- sendResponse : Ptr -> +-- (ty -> EvalState iface hs -> IO a) -> +-- (x, ty) -> EvalState iface hs -> +-- IO a+-- sendResponse {iface} {hs} pid k (resp, val) st = do+-- sendToThread pid (MsgReply {hs} {iface} ?prf (ReplyMsg resp))+-- k val st++covering+eval : EvalState iface hs -> + {p : ProcState} -> {p' : ty -> ProcState} ->+ Process ty iface hs hs' p p' ->+ ((res : ty) -> EvalState iface (hs' res) -> IO a) -> IO a+eval st (Lift' x) k = do x' <- x+ k x' st+eval st (Pure x) k = k x st+eval st (Quit x) k = k x st+eval st (bind x f) k = eval st x (\x', st' => eval st' (f x') k)++eval st (Fork proc) k + = do ptr <- fork (eval (MkEvalState [] [] 1 0) proc (\_, _ => pure ()))+ k (MkPID ptr) st ++eval st (Work proc cont) k + = do ptr <- fork (eval (MkEvalState [] [] 0 0) (proc (MkPID prim__vm))+ (\_, _ => pure ()))+ eval (record { clients = clients st + 1 } st) cont k++eval {hs} (MkEvalState q reqs c nh) (Request (MkPID pid) x) k+ = do sendToThread pid (MsgQuery {hs} (RequestMsg nh x))+ k (MkReqH nh) (MkEvalState q (Nothing :: reqs) c (S nh))++eval {p} st (GetReply {pending} h) k + = do -- Need to keep receiving messages until there's a response + -- available+ MkEvalState q reqs c nh <- updateQueue st+ case lookup pending reqs of+ Nothing => do checkMsgsTimeout 1+ eval {p} (MkEvalState q reqs c nh) (GetReply h) k+ Just reply => + k reply (MkEvalState q (dropResp pending reqs) c nh)++eval {iface} {hs} st (TimeoutRespond timeout def f) k + = do st' <- updateQueueTimeout timeout st+ case getRequest st' of+ Nothing => k def st'+ Just (pid, (_ ** (rq, req)), st'') => do + eval st'' (f req) -- (sendResponse pid k) -- ?foo + -- this weirdness works around an erasure bug+ -- which causes a seg fault...+ (\ r, st''' => + case r of+ (resp, val) => do+ sendToThread pid (MsgReply {iface} {hs} (ReplyMsg rq resp))+ k val st''')++eval {iface} {hs} st (Respond f) k + = do st' <- updateQueue st+ case getRequest st' of+ Nothing => eval {iface} st' (Respond f) k+ Just (pid, (_ ** (rq, req)), st'') => do+ eval st'' (f req) (\ (resp, val), st''' => do+ sendToThread pid (MsgReply {iface} {hs} (ReplyMsg rq resp))+ k val st''')++eval {hs} st (Connect {serveri} (MkPID pid)) k + = if pid == prim__vm then k False st else do+ v <- sendToThread pid (MsgQuery {iface=serveri} {hs}+ ConnectMsg)+ -- TODO: Wait for ACK+ k (v == 1) st++eval {hs} st (Disconnect {serveri} (MkPID pid)) k + = do v <- sendToThread pid (MsgQuery {iface=serveri} {hs} + CloseMsg)+ k () st++eval st CountClients k + = do st' <- updateQueue st+ let (cl, st'') = countClients st'+ k cl st''++eval st (Loop x) k = eval st x k++run : Program a iface -> IO a+run p = eval (MkEvalState [] [] 0 0) p (\res, t => pure res)+
+ test/proofsearch002/expected view
+ test/proofsearch002/proofsearch002.idr view
@@ -0,0 +1,51 @@+import Process++import Data.Vect++data Counter : Type -> Type where+ GetIdle : Counter Int+ Append : Vect n a -> Vect m a -> Counter $ Vect (n + m) a++data Maths : Type -> Type where+ Factorial : Nat -> Maths Nat++count_process : Int -> Counter t -> Response (t, Int) Counter [] p+count_process x GetIdle = Pure (x, x)+count_process x (Append xs ys) = Pure (xs ++ ys, x)++countServer : Int -> Running () Counter+countServer secs = do s' <- TimeoutRespond 1 (secs + 1) (count_process secs) + Loop (countServer s')++mathsServer : Running () Maths+mathsServer = do Lift $ putStrLn "Serving maths!"+ TimeoutRespond 5 () (\val => case val of+ Factorial k => + Pure (fact k, ()))+ Loop mathsServer++instance Cast String Nat where+ cast orig = cast (the Integer (cast orig))++-- Start up a couple of servers, send them requests+testProg1 : Program () (const Void)+testProg1 = do -- with Process do + mpid <- Fork mathsServer+ cpid <- Fork (countServer 0)+ putStr "Number1: "+ x1 <- getLine+ putStr "Number2: "+ x2 <- getLine+ + fac1h <- Request mpid (Factorial (cast (trim x1)))+ fac2h <- Request mpid (Factorial (cast (trim x2)))++ fac2 <- GetReply fac2h -- {pending = PendingHere}+ fac1 <- GetReply fac1h -- {pending = PendingHere}++ Disconnect cpid+ Disconnect mpid++main : IO ()+main = run testProg1+
+ test/proofsearch002/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris $@ --check proofsearch002.idr+rm -f *.ibc
+ test/proofsearch003/expected view
+ test/proofsearch003/proofsearch003.idr view
@@ -0,0 +1,34 @@+import Data.Fin++data Wrapper = Wrap (Fin 9)++data Seq : Fin 9 -> Fin 9 -> Type where+ Seq12 : {n : Fin 8} -> Seq (weaken n) (FS n)+ Seq21 : {n : Fin 8} -> Seq (FS n) (weaken n)++class Evil t where+ value : t -> Fin 9++instance Evil Wrapper where+ value (Wrap n) = n++consTest : (Evil t) => (a : t) -> (b : t) -> + {auto p : Seq (value a) (value b)} -> Bool+consTest _ _ = True++-- Fails!+test1 : Bool+test1 = consTest (Wrap 3) (Wrap 4) -- {p = ?foo}++-- Succeeds!+test2 : Bool+test2 = consTest (Wrap 3) (Wrap 4) {p = Seq12}++-- Succeeds!+test3 : Bool+test3 = consTest (Wrap 3) (Wrap 4) {p = (| Seq12, Seq21 |)}++-- Fails!+-- test4 : Bool+-- test4 = consTest (Wrap 3) (Wrap 4) {p = (| Seq21, Seq12 |)}+
+ test/proofsearch003/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris --check proofsearch003.idr +rm -f *.ibc
test/quasiquote006/quasiquote006.idr view
@@ -2,7 +2,7 @@ a : TTName a = `{Nat} -aOK : a = NS (UN "Nat") ["Nat", "Prelude"]+aOK : Main.a = NS (UN "Nat") ["Nat", "Prelude"] aOK = Refl b : TTName@@ -17,5 +17,5 @@ d : TTName d = `{List.(::)} -dOK : d = NS (UN "::") ["List", "Prelude"]+dOK : Main.d = NS (UN "::") ["List", "Prelude"] dOK = Refl
test/reg001/reg001.idr view
@@ -1,9 +1,179 @@+-- Everything here should type check but at some point in the past has+-- not.++import Data.So+import Data.Vect+import Data.Fin+import Control.Isomorphism+ class Functor f => VerifiedFunctor (f : Type -> Type) where- identity : (fa : f a) -> map id fa = fa+ identity : (fa : f a) -> map Basics.id fa = fa data Imp : Type where MkImp : {any : Type} -> any -> Imp testVal : Imp testVal = MkImp (apply id Z)++zfin : Fin 1+zfin = 0++data Infer = MkInf a++foo : Infer+foo = MkInf (the (Fin 1) 0)++isAnyBy : (alpha -> Bool) -> (n : Nat ** Vect n alpha) -> Bool+isAnyBy _ (_ ** Nil) = False+isAnyBy p (_ ** (a :: as)) = p a || isAnyBy p (_ ** as)++filterTagP : (p : alpha -> Bool) ->+ (as : Vect n alpha) ->+ So (isAnyBy p (n ** as)) ->+ (m : Nat ** (Vect m (a : alpha ** So (p a)), So (m > Z)))+filterTagP {n = S m} p (a :: as) q with (p a)+ | True = (_+ **+ ((a ** believe_me Oh)+ ::+ (fst (getProof (filterTagP p as (believe_me Oh)))),+ Oh+ )+ )+ | False = filterTagP p as (believe_me Oh)++vfoldl : (P : Nat -> Type) ->+ ((x : Nat) -> P x -> a -> P (S x)) -> P Z+ -> Vect m a -> P m+vfoldl P cons nil (x :: xs)+ = vfoldl (\k => P (S k)) (\ n => cons (S n)) (cons Z nil x) xs+++total soElim : (C : (b : Bool) -> So b -> Type) ->+ C True Oh ->+ (b : Bool) -> (s : So b) -> (C b s)+soElim C coh True Oh = coh++soFalseElim : So False -> a+soFalseElim x = void (soElim C () False x)+ where+ C : (b : Bool) -> So b -> Type+ C True s = ()+ C False s = Void++soTrue : So b -> b = True+soTrue {b = False} x = soFalseElim x+soTrue {b = True} x = Refl++class Eq alpha => ReflEqEq alpha where+ reflexive_eqeq : (a : alpha) -> So (a == a)++modifyFun : (Eq alpha) =>+ (alpha -> beta) ->+ (alpha, beta) ->+ (alpha -> beta)+modifyFun f (a, b) a' = if a' == a then b else f a'++modifyFunLemma : (ReflEqEq alpha) =>+ (f : alpha -> beta) ->+ (ab : (alpha, beta)) ->+ modifyFun f ab (fst ab) = snd ab+modifyFunLemma f (a,b) =+ rewrite soTrue (reflexive_eqeq a) in Refl+++Matrix : Type -> Nat -> Nat -> Type+Matrix a n m = Vect n (Vect m a)++mytranspose : Matrix a (S n) (S m) -> Matrix a (S m) (S n)+mytranspose ((x:: []) :: []) = [[x]]+mytranspose [x :: y :: xs] = [x] :: (mytranspose [y :: xs])+mytranspose (x :: y :: xs)+ = let tx = mytranspose [x] in+ let ux = mytranspose (y :: xs) in zipWith (++) tx ux++using (A : Type, B : A->Type, C : Type)+ foo2 : ((x:A) -> B x -> C) -> ((x:A ** B x) -> C)+ foo2 f p = f (getWitness p) (getProof p)+++m_add : Maybe (Either Bool Int) -> Maybe (Either Bool Int) ->+ Maybe (Either Bool Int)+m_add x y = do x' <- x -- Extract value from x+ y' <- y -- Extract value from y+ case x' of+ Left _ => Nothing+ Right _ => Nothing++data Ty = TyBool++data Id a = I a++interpTy : Ty -> Type+interpTy TyBool = Id Bool++data Term : Ty -> Type where+ TLit : Bool -> Term TyBool+ TNot : Term TyBool -> Term TyBool++map : (a -> b) -> Id a -> Id b+map f (I x) = I (f x)++interp : Term t -> interpTy t+interp (TLit x) = I x+interp (TNot x) = map not (interp x)++data Result str a = Success str a | Failure String++instance Functor (Result str) where+ map f (Success s x) = Success s (f x)+ map f (Failure e ) = Failure e++ParserT : (Type -> Type) -> Type -> Type -> Type+ParserT m str a = str -> m (Result str a)++ap : Monad m => ParserT m str (a -> b) -> ParserT m str a ->+ ParserT m str b+ap f x = \s => do f' <- f s+ case f' of+ Failure e => (pure (Failure e))+ Success s' g => x s' >>= pure . map g++X : Nat -> Type+X t = (c : Nat ** So (c < 5))++column : X t -> Nat+column = getWitness++data Action = Left | Ahead | Right++admissible : X t -> Action -> Bool+admissible {t} x Ahead = column {t} x == 0 || column {t} x == 4+admissible {t} x Left = column {t} x <= 2+admissible {t} x Right = column {t} x >= 2+++class Set univ where+ member : univ -> univ -> Type++isSubsetOf : Set univ => univ -> univ -> Type+isSubsetOf {univ} a b = (c : univ) -> (member c a) -> (member c b)++class Set univ => HasPower univ where+ Powerset : (a : univ) -> + Sigma univ (\Pa => (c : univ) ->+ (isSubsetOf c a) -> member c Pa)++powerset : HasPower univ => univ -> univ+powerset {univ} a = getWitness (Powerset a)++mapFilter : (alpha -> beta) ->+ (alpha -> Bool) -> + Vect n alpha -> + (n : Nat ** Vect n beta)+mapFilter f p Nil = (_ ** Nil)+mapFilter f p (a :: as) with (p a)+ | True = (_ ** (f a) :: (getProof (mapFilter f p as)))+ | False = mapFilter f p as+
− test/reg005/expected
− test/reg005/reg005.idr
@@ -1,12 +0,0 @@-module reg032--import Data.Fin--zfin : Fin 1-zfin = 0--data Infer = MkInf a--foo : Infer-foo = MkInf (the (Fin 1) 0)-
− test/reg005/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg005.idr --check-rm -f *.ibc
− test/reg009/expected
− test/reg009/reg009.lidr
@@ -1,21 +0,0 @@-> import Data.So-> import Data.Vect--> isAnyBy : (alpha -> Bool) -> (n : Nat ** Vect n alpha) -> Bool-> isAnyBy _ (_ ** Nil) = False-> isAnyBy p (_ ** (a :: as)) = p a || isAnyBy p (_ ** as)--> filterTagP : (p : alpha -> Bool) ->-> (as : Vect n alpha) ->-> So (isAnyBy p (n ** as)) ->-> (m : Nat ** (Vect m (a : alpha ** So (p a)), So (m > Z)))-> filterTagP {n = S m} p (a :: as) q with (p a)-> | True = (_-> **-> ((a ** believe_me Oh)-> ::-> (fst (getProof (filterTagP p as (believe_me Oh)))),-> Oh-> )-> )-> | False = filterTagP p as (believe_me Oh)
− test/reg009/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg009.lidr --check-rm -f reg009 *.ibc
− test/reg011/expected
− test/reg011/reg011.idr
@@ -1,11 +0,0 @@-import Data.Vect--vfoldl : (P : Nat -> Type) ->- ((x : Nat) -> P x -> a -> P (S x)) -> P Z- -> Vect m a -> P m--- vfoldl P cons nil []--- = nil-vfoldl P cons nil (x :: xs)- = vfoldl (\k => P (S k)) (\ n => cons (S n)) (cons Z nil x) xs--- vfoldl P cons nil (x :: xs)--- = vfoldl (\n => P (S n)) (\ n => cons _) (cons _ nil x) xs
− test/reg011/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg011.idr --check-rm -f *.ibc
− test/reg012/expected
− test/reg012/reg012.lidr
@@ -1,36 +0,0 @@-> import Data.So--> total soElim : (C : (b : Bool) -> So b -> Type) ->-> C True Oh ->-> (b : Bool) -> (s : So b) -> (C b s)-> soElim C coh True Oh = coh--> soFalseElim : So False -> a-> soFalseElim x = void (soElim C () False x)-> where-> C : (b : Bool) -> So b -> Type-> C True s = ()-> C False s = Void--> soTrue : So b -> b = True-> soTrue {b = False} x = soFalseElim x-> soTrue {b = True} x = Refl--> class Eq alpha => ReflEqEq alpha where-> reflexive_eqeq : (a : alpha) -> So (a == a)--> modifyFun : (Eq alpha) =>-> (alpha -> beta) ->-> (alpha, beta) ->-> (alpha -> beta)-> modifyFun f (a, b) a' = if a' == a then b else f a'--> modifyFunLemma : (ReflEqEq alpha) =>-> (f : alpha -> beta) ->-> (ab : (alpha, beta)) ->-> modifyFun f ab (fst ab) = snd ab-> modifyFunLemma f (a,b) =-> rewrite soTrue (reflexive_eqeq a) in Refl-- replace {P = \ z => ifThenElse (a == a) b (f a) = ifThenElse z b (f a)}- (soTrue (reflexive_eqeq a)) Refl
− test/reg012/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg012.lidr --check-rm -f *.ibc
− test/reg014/expected
− test/reg014/reg014.idr
@@ -1,14 +0,0 @@-module reg014--import Data.Vect--Matrix : Type -> Nat -> Nat -> Type-Matrix a n m = Vect n (Vect m a)--mytranspose : Matrix a (S n) (S m) -> Matrix a (S m) (S n)-mytranspose ((x:: []) :: []) = [[x]]-mytranspose [x :: y :: xs] = [x] :: (mytranspose [y :: xs])-mytranspose (x :: y :: xs)- = let tx = mytranspose [x] in- let ux = mytranspose (y :: xs) in zipWith (++) tx ux-
− test/reg014/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg014.idr --check-rm -f *.ibc
− test/reg015/expected
− test/reg015/reg015.idr
@@ -1,3 +0,0 @@-using (A : Type, B : A->Type, C : Type)- foo : ((x:A) -> B x -> C) -> ((x:A ** B x) -> C)- foo f p = f (getWitness p) (getProof p)
− test/reg015/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg015.idr --check-rm -f *.ibc
− test/reg019/expected
− test/reg019/reg019.idr
@@ -1,7 +0,0 @@-m_add : Maybe (Either Bool Int) -> Maybe (Either Bool Int) ->- Maybe (Either Bool Int)-m_add x y = do x' <- x -- Extract value from x- y' <- y -- Extract value from y- case x' of- Left _ => Nothing- Right _ => Nothing
− test/reg019/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg019.idr --check-rm -f *.ibc
− test/reg021/expected
− test/reg021/reg021.idr
@@ -1,22 +0,0 @@-module Main--%default total--data Ty = TyBool--data Id a = I a--interpTy : Ty -> Type-interpTy TyBool = Id Bool--data Term : Ty -> Type where- TLit : Bool -> Term TyBool- TNot : Term TyBool -> Term TyBool--map : (a -> b) -> Id a -> Id b-map f (I x) = I (f x)--interp : Term t -> interpTy t-interp (TLit x) = I x-interp (TNot x) = map not (interp x)-
− test/reg021/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg021.idr --check-rm -f *.ibc
− test/reg022/expected
− test/reg022/reg022.idr
@@ -1,18 +0,0 @@-module reg022--data Result str a = Success str a | Failure String--instance Functor (Result str) where- map f (Success s x) = Success s (f x)- map f (Failure e ) = Failure e--ParserT : (Type -> Type) -> Type -> Type -> Type-ParserT m str a = str -> m (Result str a)--ap : Monad m => ParserT m str (a -> b) -> ParserT m str a ->- ParserT m str b-ap f x = \s => do f' <- f s- case f' of- Failure e => (pure (Failure e))- Success s' g => x s' >>= pure . map g-
− test/reg022/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg022.idr --check-rm -f *.ibc
− test/reg026/expected
− test/reg026/reg026.idr
@@ -1,16 +0,0 @@-module Test--import Data.So--X : Nat -> Type-X t = (c : Nat ** So (c < 5))--column : X t -> Nat-column = getWitness--data Action = Left | Ahead | Right--admissible : X t -> Action -> Bool-admissible {t} x Ahead = column {t} x == 0 || column {t} x == 4-admissible {t} x Left = column {t} x <= 2-admissible {t} x Right = column {t} x >= 2
− test/reg026/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg026.idr --check reg026-rm -f *.ibc
− test/reg030/expected
− test/reg030/reg030.idr
@@ -1,15 +0,0 @@-import Control.Isomorphism--class Set univ where- member : univ -> univ -> Type--isSubsetOf : Set univ => univ -> univ -> Type-isSubsetOf {univ} a b = (c : univ) -> (member c a) -> (member c b)--class Set univ => HasPower univ where- Powerset : (a : univ) -> - Sigma univ (\Pa => (c : univ) ->- (isSubsetOf c a) -> member c Pa)--powerset : HasPower univ => univ -> univ-powerset {univ} a = getWitness (Powerset a)
− test/reg030/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg030.idr --check-rm -f *.ibc
− test/reg033/expected
− test/reg033/reg033.idr
@@ -1,12 +0,0 @@-import Data.Vect--mapFilter : (alpha -> beta) ->- (alpha -> Bool) -> - Vect n alpha -> - (n : Nat ** Vect n beta)-mapFilter f p Nil = (_ ** Nil)-mapFilter f p (a :: as) with (p a)- | True = (_ ** (f a) :: (getProof (mapFilter f p as)))- | False = mapFilter f p as--
− test/reg033/run
@@ -1,3 +0,0 @@-#!/usr/bin/env bash-idris $@ reg033.idr --check-rm -f reg033 *.ibc
test/reg041/ott.idr view
@@ -37,6 +37,6 @@ EQ (pi s t) f (pi s' t') g = pi s $ \x => pi s' $ \y => EQ s x s' y ~> EQ (t x) (f x) (t' y) (g y) EQ _ _ _ _ = zero -example : <| (id == id in (two ~> two)) |>+example : <| (Basics.id == Basics.id in (OTT.two ~> OTT.two)) |> example = ?prf
test/reg047/reg047.idr view
@@ -3,7 +3,7 @@ data TTSigma : (A : Type) -> (B : A -> Type) -> Type where sigma : (A : Type) -> (B : A -> Type) -> (a : A) -> B a -> TTSigma A B -data Nat = zero | succ Nat+data Nat = Zero | Succ Nat Id : (A : Type) -> A -> A -> Type Id A = (=) {A = A} {B = A}@@ -11,8 +11,8 @@ IdRefl : (A : Type) -> (a : A) -> Id A a a IdRefl A a = Refl {x = a} -zzz : Id Nat zero zero-zzz = IdRefl Nat zero+zzz : Id Nat Zero Zero+zzz = IdRefl Nat Zero -eep : TTSigma Nat (\ a => Id Nat a zero)-eep = sigma Nat (\ a => Id Nat a zero) zero zzz+eep : TTSigma Nat (\ a => Id Nat a Zero)+eep = sigma Nat (\ a => Id Nat a Zero) Zero zzz
test/reg047/reg047a.idr view
@@ -3,7 +3,7 @@ data TTSigma : (A : Type) -> (B : A -> Type) -> Type where sigma : (A : Type) -> (B : A -> Type) -> (a : A) -> B a -> TTSigma A B -data MNat = zero | succ MNat+data MNat = Zero | Succ MNat Id : (A : Type) -> A -> A -> Type Id = \A,x,y => x = y -- {a = A} {b = A}@@ -11,14 +11,14 @@ IdRefl : (A : Type) -> (a : A) -> Id A a a IdRefl A a = Refl {x = a} -zzzz : Id MNat zero zero-zzzz = IdRefl MNat zero+zzzz : Id MNat Zero Zero+zzzz = IdRefl MNat Zero -eep : TTSigma MNat (\ c => Id MNat c zero)-eep = (sigma MNat (\b => Id MNat b zero) zero zzzz)+eep : TTSigma MNat (\ c => Id MNat c Zero)+eep = (sigma MNat (\b => Id MNat b Zero) Zero zzzz) -eep2 : TTSigma MNat (\ c => Id MNat c zero)-eep2 = (sigma MNat (\b => Id MNat b zero) zero (IdRefl MNat zero))+eep2 : TTSigma MNat (\ c => Id MNat c Zero)+eep2 = (sigma MNat (\b => Id MNat b Zero) Zero (IdRefl MNat Zero))
+ test/totality010/expected view
@@ -0,0 +1,4 @@+totality010.idr:27:1:+Main.evenNotS is not total as there are missing cases+totality010.idr:30:1:+Main.bad is possibly not total due to: Main.evenNotS
+ test/totality010/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris $@ totality010.idr --nocolour --consolewidth 80 --check+rm -f *.ibc
+ test/totality010/totality010.idr view
@@ -0,0 +1,31 @@+%default total++%default total+succNotLTE' : (LTE (S x) x) -> Void+succNotLTE' {x = Z} prf = succNotLTEzero prf+succNotLTE' {x = (S k)} (LTESucc prf) = succNotLTE' prf++succNotLTE : Not (LTE (S x) x)+succNotLTE = succNotLTE'++succNotLTE2 : Not (LTE (S x) x)+succNotLTE2 {x = Z} prf = succNotLTEzero prf+succNotLTE2 {x = (S k)} (LTESucc prf) = succNotLTE prf++-- a defective even-odd definition allows me to prove bottom++mutual+ data Even : Nat -> Type where+ ZeroEven : Even Z+ MkEven : Odd n -> Even (S n)+ MkBad : Even n -> Even (S n)++ data Odd : Nat -> Type where+ MkOdd : Even n -> Odd (S n)++evenNotS : Even n -> Not (Even (S n))+evenNotS MkEven ZeroEven impossible++bad : Void+bad = evenNotS ZeroEven $ MkBad ZeroEven+
test/tutorial006/expected view
@@ -1,5 +1,5 @@ tutorial006a.idr:5:23-25:When checking right hand side of vapp:-When checking argument xs to constructor Data.VectType.Vect.:::+When checking argument xs to constructor Data.Vect.::: Type mismatch between Vect (k + k) a (Type of vapp xs xs) and