on master help sign in
18 files changed+426−220
since splitsnapshots
unifiedsplit
.travis.yml+30−12 INSTALL.md+11−2 docs/effects/introduction.rst+2−1 docs/reference/misc.rst+5−5 idris.cabal+26−8 libs/base/Control/Isomorphism.idr+20−23 libs/contrib/Control/Algebra/Laws.idr+128−80 libs/contrib/Data/List/Extra.idr−46 libs/contrib/Data/List/Reverse.idr+99 libs/contrib/contrib.ipkg+1−1 libs/prelude/Prelude/Nat.idr+14−23 src/Idris/Core/TT.hs+1−1 src/Idris/Parser/Stack.hs+13−1 stack-11.22.yaml+21 stack-12.26.yaml+20 stack-15.3.yaml+17 stack-15.4.yaml+17 stack.yaml+1−17
.travis.yml+30−12
@@ -8,19 +8,37 @@ env:
88
99matrix:
1010 include:
11− - env: CABALVER="2.4" GHCVER="8.6.5" STACKVER="15.3" STYLISH=YES
11+ - env: CABALVER="2.4" GHCVER="8.6.5" STACKVER="15.4" STYLISH=YES
1212 addons: {apt: {packages: [cabal-install-2.4,ghc-8.6.5,hscolour], sources: [hvr-ghc]}}
13− - env: CABALVER="3.0" GHCVER="8.8.2" TESTS="lib_doc doc"
14− compiler: ": #GHC 8.8.2"
15− addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.2,cppcheck,hscolour,libffi-dev], sources: [hvr-ghc]}}
16− - env: CABALVER="3.0" GHCVER="8.8.2" TESTS="test_js"
17− compiler: ": #GHC 8.8.2"
18− addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.2,cppcheck,hscolour,libffi-dev], sources: [hvr-ghc]}}
19− - env: CABALVER="3.0" GHCVER="8.8.2" TESTS="test_c"
20− compiler: ": #GHC 8.8.2"
21− addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.2,cppcheck,hscolour,libffi-dev], sources: [hvr-ghc]}}
22− - env: CABALVER="3.0" GHCVER="8.8.2" IDRIS2=YES
23− addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.2], sources: [hvr-ghc]}}
13+ - env: CABALVER="2.4" GHCVER="8.2.2" TESTS="lib_doc doc"
14+ compiler: ": #GHC 8.2.2"
15+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.2.2,cppcheck,hscolour], sources: [hvr-ghc]}}
16+ - env: CABALVER="2.4" GHCVER="8.2.2" TESTS="test_js"
17+ compiler: ": #GHC 8.2.2"
18+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.2.2,cppcheck,hscolour], sources: [hvr-ghc]}}
19+ - env: CABALVER="2.4" GHCVER="8.2.2" TESTS="test_c"
20+ compiler: ": #GHC 8.2.2"
21+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.2.2,cppcheck,hscolour], sources: [hvr-ghc]}}
22+ - env: CABALVER="2.4" GHCVER="8.4.4" TESTS="lib_doc doc"
23+ compiler: ": #GHC 8.4.4"
24+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.4.4,cppcheck,hscolour], sources: [hvr-ghc]}}
25+ - env: CABALVER="2.4" GHCVER="8.4.4" TESTS="test_js"
26+ compiler: ": #GHC 8.4.4"
27+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.4.4,cppcheck,hscolour], sources: [hvr-ghc]}}
28+ - env: CABALVER="2.4" GHCVER="8.4.4" TESTS="test_c"
29+ compiler: ": #GHC 8.4.4"
30+ addons: {apt: {packages: [cabal-install-2.4,ghc-8.4.4,cppcheck,hscolour], sources: [hvr-ghc]}}
31+ - env: CABALVER="3.0" GHCVER="8.8.3" TESTS="lib_doc doc"
32+ compiler: ": #GHC 8.8.3"
33+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3,cppcheck,hscolour], sources: [hvr-ghc]}}
34+ - env: CABALVER="3.0" GHCVER="8.8.3" TESTS="test_js"
35+ compiler: ": #GHC 8.8.3"
36+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3,cppcheck,hscolour], sources: [hvr-ghc]}}
37+ - env: CABALVER="3.0" GHCVER="8.8.3" TESTS="test_c"
38+ compiler: ": #GHC 8.8.3"
39+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3,cppcheck,hscolour], sources: [hvr-ghc]}}
40+ - env: CABALVER="3.0" GHCVER="8.8.3" IDRIS2=YES
41+ addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.3], sources: [hvr-ghc]}}
2442 fast-finish: true
2543
2644cache:
INSTALL.md+11−2
@@ -130,7 +130,8 @@ PKG_CONFIG_PATH=/usr/local/opt/libffi/lib/pkgconfig stack build
130130## Issue with GHC on Ubuntu/Fedora
131131
132132There is an upstream issue with GHC on some Ubuntu and Fedora machines.
133−The issue is that for GHC versions greater than 8.4.X linking to libFFI is broken.
133+The issue is that for GHC versions greater than 8.4.X linking to libFFI uses the version of libFFI shipped with GHC, instead of the system version.
134+
134135See the following GHC issue page for more information:
135136
136137 <https://gitlab.haskell.org/ghc/ghc/issues/15397>
@@ -141,4 +142,12 @@ Specifically, one will see an error message along the lines of:
141142
142143> error while loading shared libraries: libffi.so.7: cannot open shared object file: No such file or directory
143144
144−We have supplied an alternative stack configuration file (`stack-alt.yaml`) that will use a version of GHC prior to the upstream issue being introduced.
145+A workround for this bug is to override the used libffi version (this is what we use on CI):
146+
147+```bash
148+export LD_PRELOAD=/opt/ghc/${GHCVER}/lib/ghc-${GHCVER}/rts/libffi.so.7
149+```
150+
151+## GHC 8.6
152+
153+For reasons that haven't been investigated building the Idris compiler with GHC 8.6 leads to a compiler which doesn't pass test.
docs/effects/introduction.rst+2−1
@@ -17,7 +17,8 @@ exceptions, and verified resource management.
1717This tutorial assumes familiarity with pure programming in Idris,
1818as described in Sections 1–6 of the main tutorial [1]_. The examples
1919presented are tested with Idris and can be found in the
20−examples directory of the Idris repository.
20+examples directory of the Idris repository. The ``-p effects`` flag
21+is needed when starting Idris.
2122
2223Consider, for example, the following introductory function which
2324illustrates the kind of properties which can be expressed in the type
docs/reference/misc.rst+5−5
@@ -115,11 +115,11 @@ Here is an example:
115115 import Syntax.PreorderReasoning
116116 multThree : (a, b, c : Nat) -> a * b * c = c * a * b
117117 multThree a b c =
118− (a * b * c) ={ sym (multAssociative a b c) }=
119− (a * (b * c)) ={ cong (multCommutative b c) }=
120− (a * (c * b)) ={ multAssociative a c b }=
121− (a * c * b) ={ cong {f = (* b)} (multCommutative a c) }=
122− (c * a * b) QED
118+ (a * b * c) ={ sym (multAssociative a b c) }=
119+ (a * (b * c)) ={ cong (multCommutative b c) }=
120+ (a * (c * b)) ={ multAssociative a c b }=
121+ (a * c * b) ={ cong {f = (* b)} (multCommutative a c) }=
122+ (c * a * b) QED
123123
124124Note that the parentheses are required -- only a simple expression can
125125be on the left of ``={ }=`` or ``QED``. Also, when using preorder
idris.cabal+26−8
@@ -46,12 +46,19 @@ Build-type: Custom
4646
4747Tested-With: GHC == 7.10.3, GHC == 8.0.1
4848
49+-- NOTE: due to https://github.com/haskell/cabal/issues/6125 the use of ** is
50+-- heavily discouraged.
4951Data-files: idrisdoc/styles.css
50− jsrts/**/*.js
52+ jsrts/jsbn/*.js
53+ jsrts/*.js
5154 jsrts/jsbn/LICENSE
5255 rts/Makefile
53− rts/**/*.c
54− rts/**/*.h
56+ rts/*.c
57+ rts/seL4/*.c
58+ rts/arduino/*.c
59+ rts/windows/*.c
60+ rts/windows/*.h
61+ rts/*.h
5562 rts/seL4/CMakeLists.txt
5663 rts/seL4/README.md
5764
@@ -64,8 +71,13 @@ Extra-doc-files:
6471 RELEASE-CHECKS.md
6572 idris-tutorial.pdf
6673 man/idris.1
67− samples/**/*.idr
68− samples/**/*.lidr
74+ samples/effects/*.idr
75+ samples/misc/*.idr
76+ samples/tutorial/*.idr
77+ samples/ST/*.idr
78+ samples/ST/Graphics/*.idr
79+ samples/ST/Net/*.idr
80+ samples/misc/*.lidr
6981
7082-- extra-source-files is generated by Setup.hs using `git --ls-files`.
7183Extra-source-files:
@@ -79,8 +91,14 @@ Extra-source-files:
7991 win-release.sh
8092
8193 benchmarks/*.pl
82− benchmarks/**/*.idr
83− benchmarks/**/*.ipkg
94+ benchmarks/fasta/*.idr
95+ benchmarks/fasta/*.ipkg
96+ benchmarks/pidigits/*.idr
97+ benchmarks/pidigits/*.ipkg
98+ benchmarks/quasigroups/*.idr
99+ benchmarks/quasigroups/*.ipkg
100+ benchmarks/trivial/*.idr
101+ benchmarks/trivial/*.ipkg
84102 benchmarks/quasigroups/board
85103
86104 icons/*.png
@@ -320,7 +338,7 @@ Library
320338 , fingertree >= 0.1.4.1 && < 0.2
321339 , haskeline >= 0.7 && < 0.8
322340 , ieee754 >= 0.7 && < 0.9
323− , megaparsec >= 8 && < 9
341+ , megaparsec >= 7.0.4 && < 9
324342 , mtl >= 2.1 && < 2.3
325343 , network >= 2.7 && < 3.1.2
326344 , optparse-applicative >= 0.13 && < 0.16
libs/base/Control/Isomorphism.idr+20−23
@@ -17,21 +17,22 @@ record Iso a b where
1717
1818-- Isomorphism properties
1919
20−||| Isomorphism is Reflexive
20+||| Isomorphism is reflexive
2121isoRefl : Iso a a
22−isoRefl = MkIso id id (\x => Refl) (\x => Refl)
22+isoRefl = MkIso id id (\_ => Refl) (\_ => Refl)
2323
2424||| Isomorphism is transitive
2525isoTrans : Iso a b -> Iso b c -> Iso a c
2626isoTrans (MkIso to from toFrom fromTo) (MkIso to' from' toFrom' fromTo') =
27− MkIso (\x => to' (to x))
28− (\y => from (from' y))
29− (\y => (to' (to (from (from' y)))) ={ cong (toFrom (from' y)) }=
30− (to' (from' y)) ={ toFrom' y }=
31− y QED)
32− (\x => (from (from' (to' (to x)))) ={ cong (fromTo' (to x)) }=
33− (from (to x)) ={ fromTo x }=
34− x QED)
27+ MkIso xto xfrom xtoFrom xfromTo where
28+ xto : a -> c
29+ xto = to' . to
30+ xfrom : c -> a
31+ xfrom = from . from'
32+ xtoFrom : (z : c) -> xto (xfrom z) = z
33+ xtoFrom z = rewrite toFrom $ from' z in toFrom' z
34+ xfromTo : (x : a) -> xfrom (xto x) = x
35+ xfromTo x = rewrite fromTo' (to x) in fromTo x
3536
3637Category Iso where
3738 id = isoRefl
@@ -99,8 +100,7 @@ eitherBotRight = isoTrans eitherComm eitherBotLeft
99100
100101||| Isomorphism is a congruence with regards to disjunction
101102eitherCong : Iso a a' -> Iso b b' -> Iso (Either a b) (Either a' b')
102−eitherCong {a = a} {a' = a'} {b = b} {b' = b'}
103− (MkIso to from toFrom fromTo)
103+eitherCong (MkIso to from toFrom fromTo)
104104 (MkIso to' from' toFrom' fromTo') =
105105 MkIso (eitherMap to to') (eitherMap from from') ok1 ok2
106106 where eitherMap : (c -> c') -> (d -> d') -> Either c d -> Either c' d'
@@ -143,9 +143,7 @@ pairAssoc = MkIso to from ok1 ok2
143143
144144||| Conjunction with truth is a no-op
145145pairUnitRight : Iso (a, ()) a
146−pairUnitRight = MkIso fst (\x => (x, ())) (\x => Refl) ok
147− where ok : (x : (a, ())) -> (fst x, ()) = x
148− ok (x, ()) = Refl
146+pairUnitRight = MkIso fst (\x => (x, ())) (\_ => Refl) (\(_, ()) => Refl)
149147
150148||| Conjunction with truth is a no-op
151149pairUnitLeft : Iso ((), a) a
@@ -161,8 +159,7 @@ pairBotRight = isoTrans pairComm pairBotLeft
161159
162160||| Isomorphism is a congruence with regards to conjunction
163161pairCong : Iso a a' -> Iso b b' -> Iso (a, b) (a', b')
164−pairCong {a = a} {a' = a'} {b = b} {b' = b'}
165− (MkIso to from toFrom fromTo)
162+pairCong (MkIso to from toFrom fromTo)
166163 (MkIso to' from' toFrom' fromTo') =
167164 MkIso to'' from'' iso1 iso2
168165 where to'' : (a, b) -> (a', b')
@@ -205,7 +202,7 @@ distribLeft = MkIso to from toFrom fromTo
205202
206203||| Products distribute over sums
207204distribRight : Iso (a, Either b c) (Either (a, b) (a, c))
208−distribRight {a} {b} {c} = (pairComm `isoTrans` distribLeft) `isoTrans` eitherCong pairComm pairComm
205+distribRight = (pairComm `isoTrans` distribLeft) `isoTrans` eitherCong pairComm pairComm
209206
210207
211208-- Enable preorder reasoning syntax over isomorphisms
@@ -222,7 +219,7 @@ step a iso1 iso2 = isoTrans iso1 iso2
222219-- Isomorphisms over Maybe
223220||| Isomorphism is a congruence with respect to Maybe
224221maybeCong : Iso a b -> Iso (Maybe a) (Maybe b)
225−maybeCong {a} {b} (MkIso to from toFrom fromTo) = MkIso (map to) (map from) ok1 ok2
222+maybeCong (MkIso to from toFrom fromTo) = MkIso (map to) (map from) ok1 ok2
226223 where ok1 : (y : Maybe b) -> map to (map from y) = y
227224 ok1 Nothing = Refl
228225 ok1 (Just x) = (Just (to (from x))) ={ cong (toFrom x) }= (Just x) QED
@@ -253,7 +250,7 @@ maybeVoidUnit = (Maybe Void) ={ maybeEither }=
253250 () QED
254251
255252eitherMaybeLeftMaybe : Iso (Either (Maybe a) b) (Maybe (Either a b))
256−eitherMaybeLeftMaybe {a} {b} =
253+eitherMaybeLeftMaybe =
257254 (Either (Maybe a) b) ={ eitherCongLeft maybeEither }=
258255 (Either (Either a ()) b) ={ eitherAssoc }=
259256 (Either a (Either () b)) ={ eitherCongRight eitherComm }=
@@ -263,7 +260,7 @@ eitherMaybeLeftMaybe {a} {b} =
263260
264261
265262eitherMaybeRightMaybe : Iso (Either a (Maybe b)) (Maybe (Either a b))
266−eitherMaybeRightMaybe {a} {b} =
263+eitherMaybeRightMaybe =
267264 (Either a (Maybe b)) ={ eitherComm }=
268265 (Either (Maybe b) a) ={ eitherMaybeLeftMaybe }=
269266 (Maybe (Either b a)) ={ maybeCong eitherComm }=
@@ -288,8 +285,8 @@ maybeIsoS = MkIso forth back fb bf
288285 fb (FS x) = Refl
289286
290287finZeroBot : Iso (Fin 0) Void
291−finZeroBot = MkIso (\x => void (uninhabited x))
292− (\x => void x)
288+finZeroBot = MkIso (void . uninhabited)
289+ void
293290 (\x => void x)
294291 (\x => void (uninhabited x))
295292
libs/contrib/Control/Algebra/Laws.idr+128−80
@@ -6,98 +6,146 @@ import Interfaces.Verified
66
77%access export
88
9−||| A prof that -0 = 0 in any verified group.
10−inverseNeutralIsNeutral : VerifiedGroup t => inverse (the t A.neutral) = A.neutral
9+||| -(-x) = x in any verified group.
10+inverseSquaredIsIdentity : VerifiedGroup t => (x : t) ->
11+ inverse (inverse x) = x
12+inverseSquaredIsIdentity x =
13+ let
14+ ix = inverse x
15+ iix = inverse ix
16+ in
17+ rewrite sym $ monoidNeutralIsNeutralR iix in
18+ rewrite sym $ groupInverseIsInverseL x in
19+ rewrite sym $ semigroupOpIsAssociative x ix iix in
20+ rewrite groupInverseIsInverseL ix in
21+ monoidNeutralIsNeutralL x
22+
23+||| -0 = 0 in any verified group.
24+inverseNeutralIsNeutral : VerifiedGroup t =>
25+ inverse (the t A.neutral) = A.neutral
1126inverseNeutralIsNeutral {t} =
12− let zero = the t neutral
13− step1 = cong {f = (<+> inverse zero)} (the (zero = zero) Refl)
14− step2 = replace {P = \x => zero <+> inverse zero = x} (groupInverseIsInverseL zero) step1
15− in
16− replace {P = \x => x = neutral} (monoidNeutralIsNeutralR $ inverse zero) step2
27+ let e = the t neutral in
28+ rewrite sym $ cong {f = inverse} (groupInverseIsInverseL e) in
29+ rewrite monoidNeutralIsNeutralR $ inverse e in
30+ inverseSquaredIsIdentity e
1731
18−||| A proof that -(-x) = x in any verified group.
19−inverseSquaredIsIdentity : VerifiedGroup t => (x : t) -> inverse (inverse x) = x
20−inverseSquaredIsIdentity {t} x =
21− let zero = the t neutral
22− step1 = cong {f = (x <+>)} (groupInverseIsInverseL (inverse x))
23− step2 = replace {P = \r => r = x <+> neutral} (semigroupOpIsAssociative x (inverse x) (inverse $ inverse x)) step1
24− step3 = replace {P = \r => r <+> inverse (inverse x) = x <+> neutral} (groupInverseIsInverseL x) step2
25− step4 = replace {P = \r => r = x <+> neutral} (monoidNeutralIsNeutralR (inverse $ inverse x)) step3
26− in
27− replace {P = \r => inverse (inverse x) = r} (monoidNeutralIsNeutralL x) step4
32+||| -(x + y) = -y + -x in any verified group.
33+inverseOfSum : VerifiedGroup t => (l, r : t) ->
34+ inverse (l <+> r) = inverse r <+> inverse l
35+inverseOfSum {t} l r =
36+ let
37+ e = the t neutral
38+ il = inverse l
39+ ir = inverse r
40+ sum = l <+> r
41+ ilr = inverse sum
42+ iril = ir <+> il
43+ ile = il <+> e
44+ in
45+ -- expand
46+ rewrite sym $ monoidNeutralIsNeutralR ilr in
47+ rewrite sym $ groupInverseIsInverseR r in
48+ rewrite sym $ monoidNeutralIsNeutralL ir in
49+ rewrite sym $ groupInverseIsInverseR l in
50+ -- shuffle
51+ rewrite semigroupOpIsAssociative ir il l in
52+ rewrite sym $ semigroupOpIsAssociative iril l r in
53+ rewrite sym $ semigroupOpIsAssociative iril sum ilr in
54+ -- contract
55+ rewrite sym $ monoidNeutralIsNeutralL il in
56+ rewrite groupInverseIsInverseL sum in
57+ rewrite sym $ semigroupOpIsAssociative (ir <+> ile) l ile in
58+ rewrite semigroupOpIsAssociative l il e in
59+ rewrite groupInverseIsInverseL l in
60+ rewrite monoidNeutralIsNeutralL e in
61+ Refl
2862
29−||| A proof that -(x + y) = -x - y in any verified abelian group.
30−inverseDistributesOverGroupOp : VerifiedAbelianGroup t => (l, r : t) -> inverse (l <+> r) = inverse l <+> inverse r
31−inverseDistributesOverGroupOp {t} l r =
32− let step1 = replace {P = \x => x = neutral} (sym $ groupInverseIsInverseL (l <+> r)) $ the (the t neutral = neutral) Refl
33− step2 = cong {f = ((inverse r) <+>) . ((inverse l) <+>)} step1
34− step3 = replace {P = \x => inverse r <+> (inverse l <+> (l <+> r <+> inverse (l <+> r))) = inverse r <+> x} (monoidNeutralIsNeutralL (inverse l)) step2
35− step4 = replace {P = \x => x = inverse r <+> inverse l} (semigroupOpIsAssociative (inverse r) (inverse l) (l <+> r <+> inverse (l <+> r))) step3
36− step5 = replace {P = \x => x = inverse r <+> inverse l} (semigroupOpIsAssociative (inverse r <+> inverse l) (l <+> r) (inverse (l <+> r))) step4
37− step6 = replace {P = \x => x <+> inverse (l <+> r) = inverse r <+> inverse l} (semigroupOpIsAssociative (inverse r <+> inverse l) l r) step5
38− step7 = replace {P = \x => x <+> r <+> inverse (l <+> r) = inverse r <+> inverse l} (sym $ semigroupOpIsAssociative (inverse r) (inverse l) l) step6
39− step8 = replace {P = \x => inverse r <+> x <+> r <+> inverse (l <+> r) = inverse r <+> inverse l} (groupInverseIsInverseR l) step7
40− step9 = replace {P = \x => x <+> r <+> inverse (l <+> r) = inverse r <+> inverse l} (monoidNeutralIsNeutralL (inverse r)) step8
41− step10 = replace {P = \x => x <+> inverse (l <+> r) = inverse r <+> inverse l} (groupInverseIsInverseR r) step9
42− step11 = replace {P = \x => x = inverse r <+> inverse l} (monoidNeutralIsNeutralR (inverse (l <+> r))) step10
43− in
44− replace {P = \x => inverse (l <+> r) = x} (abelianGroupOpIsCommutative (inverse r) (inverse l)) step11
63+||| -(x + y) = -x + -y in any verified abelian group.
64+inverseDistributesOverGroupOp : VerifiedAbelianGroup t => (l, r : t) ->
65+ inverse (l <+> r) = inverse l <+> inverse r
66+inverseDistributesOverGroupOp l r =
67+ rewrite abelianGroupOpIsCommutative (inverse l) (inverse r) in
68+ inverseOfSum l r
4569
46−||| A proof that anything multiplied by zero yields zero back.
47−multNeutralAbsorbingL : VerifiedRingWithUnity t => (r : t) -> A.neutral <.> r = A.neutral
48−multNeutralAbsorbingL r =
49− let step1 = the (unity <.> r = r) (ringWithUnityIsUnityR r)
50− step2 = replace {P = \x => x <.> r = r} (sym $ monoidNeutralIsNeutralR unity) step1
51− step3 = replace {P = \x => x = r} (ringOpIsDistributiveR neutral unity r) step2
52− step4 = replace {P = \x => neutral <.> r <+> x = r} (ringWithUnityIsUnityR r) step3
53− step5 = cong {f = \x => x <+> inverse r} step4
54− step6 = replace {P = \x => x = r <+> inverse r} (sym $ semigroupOpIsAssociative (neutral <.> r) r (inverse r)) step5
55− step7 = replace {P = \x => neutral <.> r <+> x = x} (groupInverseIsInverseL r) step6
56− in
57− replace {P = \x => x = neutral} (monoidNeutralIsNeutralL (neutral <.> r)) step7
70+||| Anything multiplied by zero yields zero back in a verified ring.
71+multNeutralAbsorbingL : VerifiedRing t => (r : t) ->
72+ A.neutral <.> r = A.neutral
73+multNeutralAbsorbingL {t} r =
74+ let
75+ e = the t neutral
76+ ir = inverse r
77+ exr = e <.> r
78+ iexr = inverse exr
79+ in
80+ rewrite sym $ monoidNeutralIsNeutralR exr in
81+ rewrite sym $ groupInverseIsInverseR exr in
82+ rewrite sym $ semigroupOpIsAssociative iexr exr ((iexr <+> exr) <.> r) in
83+ rewrite groupInverseIsInverseR exr in
84+ rewrite sym $ ringOpIsDistributiveR e e r in
85+ rewrite monoidNeutralIsNeutralR e in
86+ groupInverseIsInverseR exr
5887
59−||| A proof that anything multiplied by zero yields zero back.
60−multNeutralAbsorbingR : VerifiedRingWithUnity t => (l : t) -> l <.> A.neutral = A.neutral
61−multNeutralAbsorbingR l =
62− let step1 = the (l <.> unity = l) (ringWithUnityIsUnityL l)
63− step2 = replace {P = \x => l <.> x = l} (sym $ monoidNeutralIsNeutralR unity) step1
64− step3 = replace {P = \x => x = l} (ringOpIsDistributiveL l neutral unity) step2
65− step4 = replace {P = \x => l <.> neutral <+> x = l} (ringWithUnityIsUnityL l) step3
66− step5 = cong {f = \x => x <+> inverse l} step4
67− step6 = replace {P = \x => x = l <+> inverse l} (sym $ semigroupOpIsAssociative (l <.> neutral) l (inverse l)) step5
68− step7 = replace {P = \x => l <.> neutral <+> x = x} (groupInverseIsInverseL l) step6
69− in
70− replace {P = \x => x = neutral} (monoidNeutralIsNeutralL (l <.> neutral)) step7
88+||| Anything multiplied by zero yields zero back in a verified ring.
89+multNeutralAbsorbingR : VerifiedRing t => (l : t) ->
90+ l <.> A.neutral = A.neutral
91+multNeutralAbsorbingR {t} l =
92+ let
93+ e = the t neutral
94+ il = inverse l
95+ lxe = l <.> e
96+ ilxe = inverse lxe
97+ in
98+ rewrite sym $ monoidNeutralIsNeutralL lxe in
99+ rewrite sym $ groupInverseIsInverseL lxe in
100+ rewrite semigroupOpIsAssociative (l <.> (lxe <+> ilxe)) lxe ilxe in
101+ rewrite groupInverseIsInverseL lxe in
102+ rewrite sym $ ringOpIsDistributiveL l e e in
103+ rewrite monoidNeutralIsNeutralL e in
104+ groupInverseIsInverseL lxe
71105
72−||| A proof that inverse operator can be extracted before multiplication
106+||| Inverse operator can be extracted before multiplication.
73107||| (-x)y = -(xy)
74−multInverseInversesL : VerifiedRingWithUnity t => (l, r : t) -> inverse l <.> r = inverse (l <.> r)
108+multInverseInversesL : VerifiedRing t => (l, r : t) ->
109+ inverse l <.> r = inverse (l <.> r)
75110multInverseInversesL l r =
76− let step1 = replace {P = \x => x <.> r = neutral} (sym $ groupInverseIsInverseL l) (multNeutralAbsorbingL r)
77− step2 = replace {P = \x => x = neutral} (ringOpIsDistributiveR l (inverse l) r) step1
78− step3 = cong {f = ((inverse (l <.> r)) <+>)} step2
79− step4 = replace {P = \x => inverse (l <.> r) <+> (l <.> r <+> inverse l <.> r) = x} (monoidNeutralIsNeutralL (inverse (l <.> r))) step3
80− step5 = replace {P = \x => x = inverse (l <.> r)} (semigroupOpIsAssociative (inverse (l <.> r)) (l <.> r) (inverse l <.> r)) step4
81− step6 = replace {P = \x => x <+> inverse l <.> r = inverse (l <.> r)} (groupInverseIsInverseR (l <.> r)) step5
82− in
83− replace {P = \x => x = inverse (l <.> r)} (monoidNeutralIsNeutralR (inverse l <.> r)) step6
111+ let
112+ il = inverse l
113+ lxr = l <.> r
114+ ilxr = il <.> r
115+ i_lxr = inverse lxr
116+ in
117+ rewrite sym $ monoidNeutralIsNeutralR ilxr in
118+ rewrite sym $ groupInverseIsInverseR lxr in
119+ rewrite sym $ semigroupOpIsAssociative i_lxr lxr ilxr in
120+ rewrite sym $ ringOpIsDistributiveR l il r in
121+ rewrite groupInverseIsInverseL l in
122+ rewrite multNeutralAbsorbingL r in
123+ monoidNeutralIsNeutralL i_lxr
84124
85−||| A proof that inverse operator can be extracted before multiplication
125+||| Inverse operator can be extracted before multiplication.
86126||| x(-y) = -(xy)
87−multInverseInversesR : VerifiedRingWithUnity t => (l, r : t) -> l <.> inverse r = inverse (l <.> r)
127+multInverseInversesR : VerifiedRing t => (l, r : t) ->
128+ l <.> inverse r = inverse (l <.> r)
88129multInverseInversesR l r =
89− let step1 = replace {P = \x => l <.> x = neutral} (sym $ groupInverseIsInverseL r) (multNeutralAbsorbingR l)
90− step2 = replace {P = \x => x = neutral} (ringOpIsDistributiveL l r (inverse r)) step1
91− step3 = cong {f = ((inverse (l <.> r)) <+>)} step2
92− step4 = replace {P = \x => inverse (l <.> r) <+> (l <.> r <+> l <.> inverse r) = x} (monoidNeutralIsNeutralL (inverse (l <.> r))) step3
93− step5 = replace {P = \x => x = inverse (l <.> r)} (semigroupOpIsAssociative (inverse (l <.> r)) (l <.> r) (l <.> inverse r)) step4
94− step6 = replace {P = \x => x <+> l <.> inverse r = inverse (l <.> r)} (groupInverseIsInverseR (l <.> r)) step5
95− in
96− replace {P = \x => x = inverse (l <.> r)} (monoidNeutralIsNeutralR (l <.> inverse r)) step6
130+ let
131+ ir = inverse r
132+ lxr = l <.> r
133+ lxir = l <.> ir
134+ ilxr = inverse lxr
135+ in
136+ rewrite sym $ monoidNeutralIsNeutralL lxir in
137+ rewrite sym $ groupInverseIsInverseL lxr in
138+ rewrite semigroupOpIsAssociative lxir lxr ilxr in
139+ rewrite sym $ ringOpIsDistributiveL l ir r in
140+ rewrite groupInverseIsInverseR r in
141+ rewrite multNeutralAbsorbingR l in
142+ monoidNeutralIsNeutralR ilxr
97143
98−||| A proof that multiplication of inverses is the same as multiplication of original
99−||| elements. (-x)(-y) = xy
100−multNegativeByNegativeIsPositive : VerifiedRingWithUnity t => (l, r : t) -> inverse l <.> inverse r = l <.> r
144+||| Multiplication of inverses is the same as multiplication of
145+||| original elements.
146+||| (-x)(-y) = xy
147+multNegativeByNegativeIsPositive : VerifiedRing t => (l, r : t) ->
148+ inverse l <.> inverse r = l <.> r
101149multNegativeByNegativeIsPositive l r =
102150 rewrite multInverseInversesR (inverse l) r in
103151 rewrite sym $ multInverseInversesL (inverse l) r in
libs/contrib/Data/List/Extra.idrdeleted−46
@@ -1,46 +0,0 @@
1−module Data.List.Extra
2−
3−%default total
4−%access export
5−
6−||| The final segment of the accumulator is the final segment of the result.
7−reverseOntoAcc : (xs, ys, zs : List a) ->
8− reverseOnto (ys ++ zs) xs = (reverseOnto ys xs) ++ zs
9−reverseOntoAcc [] _ _ = Refl
10−reverseOntoAcc (x :: xs) (ys) (zs) = reverseOntoAcc xs (x :: ys) zs
11−
12−||| Serves as a specification for reverseOnto.
13−reverseOntoSpec : (xs, ys : List a) -> reverseOnto xs ys = reverse ys ++ xs
14−reverseOntoSpec xs ys = reverseOntoAcc ys [] xs
15−
16−||| The reverse of an empty list is an empty list. Together with reverseCons,
17−||| serves as a specification for reverse.
18−reverseNil : reverse [] = []
19−reverseNil = Refl
20−
21−||| The reverse of a cons is the reverse of the tail followed by the head.
22−||| Together with reverseNil serves as a specification for reverse.
23−reverseCons : (x : a) -> (xs : List a) -> reverse (x::xs) = reverse xs ++ [x]
24−reverseCons x xs = reverseOntoSpec [x] xs
25−
26−||| Reversing an append is appending reversals backwards.
27−reverseAppend : (xs, ys : List a) ->
28− reverse (xs ++ ys) = reverse ys ++ reverse xs
29−reverseAppend [] ys = sym (appendNilRightNeutral (reverse ys))
30−reverseAppend (x :: xs) ys =
31− rewrite reverseCons x (xs ++ ys) in
32− rewrite reverseAppend xs ys in
33− rewrite reverseCons x xs in
34− sym $ appendAssociative (reverse ys) (reverse xs) [x]
35−
36−||| Reversing a singleton list is a no-op.
37−reverseSingletonId : (x : a) -> reverse [x] = [x]
38−reverseSingletonId _ = Refl
39−
40−||| Reversing a reverse gives the original.
41−reverseReverseId : (xs : List a) -> reverse (reverse xs) = xs
42−reverseReverseId [] = Refl
43−reverseReverseId (x :: xs) =
44− rewrite reverseCons x xs in
45− rewrite reverseAppend (reverse xs) [x] in
46− cong $ reverseReverseId xs
libs/contrib/Data/List/Reverse.idrnew file+99
@@ -0,0 +1,99 @@
1+||| Properties of the reverse function.
2+module Data.List.Reverse
3+
4+%default total
5+%access export
6+
7+||| The final segment of the accumulator is the final segment of the result.
8+reverseOntoAcc : (xs, ys, zs : List a) ->
9+ reverseOnto (ys ++ zs) xs = (reverseOnto ys xs) ++ zs
10+reverseOntoAcc [] _ _ = Refl
11+reverseOntoAcc (x :: xs) (ys) (zs) = reverseOntoAcc xs (x :: ys) zs
12+
13+||| Serves as a specification for reverseOnto.
14+reverseOntoSpec : (xs, ys : List a) -> reverseOnto xs ys = reverse ys ++ xs
15+reverseOntoSpec xs ys = reverseOntoAcc ys [] xs
16+
17+||| The reverse of an empty list is an empty list. Together with reverseCons,
18+||| serves as a specification for reverse.
19+reverseNil : reverse [] = []
20+reverseNil = Refl
21+
22+||| The reverse of a cons is the reverse of the tail followed by the head.
23+||| Together with reverseNil serves as a specification for reverse.
24+reverseCons : (x : a) -> (xs : List a) -> reverse (x::xs) = reverse xs ++ [x]
25+reverseCons x xs = reverseOntoSpec [x] xs
26+
27+||| Reversing an append is appending reversals backwards.
28+reverseAppend : (xs, ys : List a) ->
29+ reverse (xs ++ ys) = reverse ys ++ reverse xs
30+reverseAppend [] ys = sym (appendNilRightNeutral (reverse ys))
31+reverseAppend (x :: xs) ys =
32+ rewrite reverseCons x (xs ++ ys) in
33+ rewrite reverseAppend xs ys in
34+ rewrite reverseCons x xs in
35+ sym $ appendAssociative (reverse ys) (reverse xs) [x]
36+
37+||| A recursive definition of reverse.
38+reverseRec : List a -> List a
39+reverseRec [] = []
40+reverseRec (x :: xs) = reverseRec xs ++ [x]
41+
42+||| The iterative and recursive defintions of reverse are the same.
43+reverseEquiv : (xs : List a) -> reverseRec xs = reverse xs
44+reverseEquiv [] = Refl
45+reverseEquiv (x :: xs) =
46+ rewrite reverseEquiv xs in
47+ rewrite reverseAppend [x] xs in
48+ Refl
49+
50+||| Reversing a singleton list is a no-op.
51+reverseSingletonId : (x : a) -> reverse [x] = [x]
52+reverseSingletonId _ = Refl
53+
54+||| Reversing a reverse gives the original.
55+reverseReverseId : (xs : List a) -> reverse (reverse xs) = xs
56+reverseReverseId [] = Refl
57+reverseReverseId (x :: xs) =
58+ rewrite reverseCons x xs in
59+ rewrite reverseAppend (reverse xs) [x] in
60+ cong $ reverseReverseId xs
61+
62+||| Reversing onto preserves list length.
63+reverseOntoLength : (xs, acc : List a) ->
64+ length $ reverseOnto acc xs = length acc + length xs
65+reverseOntoLength [] acc = rewrite plusZeroRightNeutral (length acc) in Refl
66+reverseOntoLength (x :: xs) acc =
67+ rewrite reverseOntoLength xs (x :: acc) in
68+ plusSuccRightSucc (length acc) (length xs)
69+
70+||| Reversing preserves list length.
71+reverseLength : (xs : List a) -> length $ reverse xs = length xs
72+reverseLength xs = reverseOntoLength xs []
73+
74+||| Equal reversed lists are equal.
75+reverseEqual : (xs, ys : List a) -> reverse xs = reverse ys -> xs = ys
76+reverseEqual xs ys prf =
77+ rewrite sym $ reverseReverseId xs in
78+ rewrite prf in
79+ reverseReverseId ys
80+
81+||| Do geese see God?
82+data Palindrome : (xs : List a) -> Type where
83+ Empty : Palindrome []
84+ Single : Palindrome [_]
85+ Multi : Palindrome xs -> Palindrome $ [x] ++ xs ++ [x]
86+
87+||| A Palindrome reversed is itself.
88+palindromeReverse : (xs : List a) -> Palindrome xs -> reverse xs = xs
89+palindromeReverse [] Empty = Refl
90+palindromeReverse [_] Single = Refl
91+palindromeReverse ([x] ++ ys ++ [x]) (Multi pf) =
92+ rewrite reverseAppend ([x] ++ ys) [x] in
93+ rewrite reverseAppend [x] ys in
94+ rewrite palindromeReverse ys pf in
95+ Refl
96+
97+||| Only Palindromes are equal to their own reverse.
98+postulate -- This is a tough one. Any takers?
99+reversePalindrome : (xs : List a) -> reverse xs = xs -> Palindrome xs
libs/contrib/contrib.ipkg+1−1
@@ -43,7 +43,7 @@ modules = CFFI
4343 , Data.Heap
4444 , Data.IOArray
4545 , Data.List.Zipper
46− , Data.List.Extra
46+ , Data.List.Reverse
4747
4848 , Data.Matrix
4949 , Data.Matrix.Algebraic
libs/prelude/Prelude/Nat.idr+14−23
@@ -557,26 +557,21 @@ multCommutative (S left) right =
557557 rewrite multRightSuccPlus right left in
558558 Refl
559559
560−total multDistributesOverPlusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
561− left * (centre + right) = (left * centre) + (left * right)
562−multDistributesOverPlusRight Z centre right = Refl
563−multDistributesOverPlusRight (S left) centre right =
564− let inductiveHypothesis = multDistributesOverPlusRight left centre right in
565− rewrite inductiveHypothesis in
566− rewrite plusAssociative (plus centre (mult left centre)) right (mult left right) in
567− rewrite sym (plusAssociative centre (mult left centre) right) in
568− rewrite plusCommutative (mult left centre) right in
569− rewrite plusAssociative centre right (mult left centre) in
570− rewrite plusAssociative (plus centre right) (mult left centre) (mult left right) in
571− Refl
572−
573560total multDistributesOverPlusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
574561 (left + centre) * right = (left * right) + (centre * right)
575−multDistributesOverPlusLeft left centre right =
576− rewrite multCommutative (left + centre) right in
577− rewrite multCommutative left right in
578− rewrite multCommutative centre right in
579− multDistributesOverPlusRight right left centre
562+multDistributesOverPlusLeft Z centre right = Refl
563+multDistributesOverPlusLeft (S k) centre right =
564+ rewrite multDistributesOverPlusLeft k centre right in
565+ rewrite plusAssociative right (k * right) (centre * right) in
566+ Refl
567+
568+total multDistributesOverPlusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
569+ left * (centre + right) = (left * centre) + (left * right)
570+multDistributesOverPlusRight left centre right =
571+ rewrite multCommutative left (centre + right) in
572+ rewrite multCommutative left centre in
573+ rewrite multCommutative left right in
574+ multDistributesOverPlusLeft centre right left
580575
581576total multAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) ->
582577 left * (centre * right) = (left * centre) * right
@@ -588,11 +583,7 @@ multAssociative (S left) centre right =
588583 Refl
589584
590585total multOneLeftNeutral : (right : Nat) -> 1 * right = right
591−multOneLeftNeutral Z = Refl
592−multOneLeftNeutral (S right) =
593− let inductiveHypothesis = multOneLeftNeutral right in
594− rewrite inductiveHypothesis in
595− Refl
586+multOneLeftNeutral right = plusZeroRightNeutral right
596587
597588total multOneRightNeutral : (left : Nat) -> left * 1 = left
598589multOneRightNeutral left = rewrite multCommutative left 1 in multOneLeftNeutral left
src/Idris/Core/TT.hs+1−1
@@ -325,7 +325,7 @@ bindTC x k = case x of
325325instance Monad TC where
326326 return x = OK x
327327 x >>= k = bindTC x k
328−#if !(MIN_VERSION_base(4,12,0))
328+#if !(MIN_VERSION_base(4,13,0))
329329 fail = Fail.fail
330330#endif
331331
src/Idris/Parser/Stack.hs+13−1
@@ -5,7 +5,7 @@ Description : Idris parser stack and its primitives.
55License : BSD3
66Maintainer : The Idris Community.
77-}
8−{-# LANGUAGE ConstraintKinds, FlexibleContexts, MultiParamTypeClasses #-}
8+{-# LANGUAGE CPP, ConstraintKinds, FlexibleContexts, MultiParamTypeClasses #-}
99module Idris.Parser.Stack
1010 ( -- * Parsing
1111 Parser(..)
@@ -77,12 +77,20 @@ parseErrorOffset = P.errorOffset . parseError
7777instance Message ParseError where
7878 messageExtent err = sourcePositionFC pos
7979 where
80+#if MIN_VERSION_megaparsec(8,0,0)
8081 P.PosState {P.pstateSourcePos = pos} =
8182 P.reachOffsetNoLine (parseErrorOffset err) (parseErrorPosState err)
83+#else
84+ (pos, _) = P.reachOffsetNoLine (parseErrorOffset err) (parseErrorPosState err)
85+#endif
8286 messageText = PP.text . init . P.parseErrorTextPretty . parseError
8387 messageSource err = Just sline
8488 where
89+#if MIN_VERSION_megaparsec(8,0,0)
8590 (sline, _) = P.reachOffset (parseErrorOffset err) (parseErrorPosState err)
91+#else
92+ (_, sline, _) = P.reachOffset (parseErrorOffset err) (parseErrorPosState err)
93+#endif
8694
8795-- | A fully formatted parse error, with caret and bar, etc.
8896prettyError :: ParseError -> String
@@ -90,7 +98,11 @@ prettyError = P.errorBundlePretty . unParseError
9098
9199{- * Mark and restore -}
92100
101+#if MIN_VERSION_megaparsec(8,0,0)
93102type Mark = P.State String Void
103+#else
104+type Mark = P.State String
105+#endif
94106
95107-- | Retrieve the parser state so we can restart from this point later.
96108mark :: Parsing m => m Mark
stack-11.22.yamlnew file+21
@@ -0,0 +1,21 @@
1+#recheck extra-deps next on resolver or cabal file change
2+resolver: lts-11.22
3+
4+extra-deps:
5+- cheapskate-0.1.1.2
6+- megaparsec-7.0.5
7+- Cabal-2.4.1.0
8+- network-3.1.1.1
9+- parser-combinators-1.0.0
10+
11+flags:
12+ idris:
13+ FFI: true
14+ GMP: true
15+
16+ghc-options:
17+ idris: -fwarn-unused-imports -fwarn-unused-binds
18+
19+nix:
20+ enable: false
21+ shell-file: stack-shell.nix
stack-12.26.yamlnew file+20
@@ -0,0 +1,20 @@
1+#recheck extra-deps next on resolver or cabal file change
2+resolver: lts-12.26
3+
4+extra-deps:
5+- cheapskate-0.1.1.2
6+- megaparsec-7.0.5
7+- Cabal-2.4.1.0
8+- network-3.1.1.1
9+
10+flags:
11+ idris:
12+ FFI: true
13+ GMP: true
14+
15+ghc-options:
16+ idris: -fwarn-unused-imports -fwarn-unused-binds
17+
18+nix:
19+ enable: false
20+ shell-file: stack-shell.nix
stack-15.3.yamlnew file+17
@@ -0,0 +1,17 @@
1+#recheck extra-deps next on resolver or cabal file change
2+resolver: lts-15.3
3+
4+extra-deps:
5+- cheapskate-0.1.1.2
6+
7+flags:
8+ idris:
9+ FFI: true
10+ GMP: true
11+
12+ghc-options:
13+ idris: -fwarn-unused-imports -fwarn-unused-binds
14+
15+nix:
16+ enable: false
17+ shell-file: stack-shell.nix
stack-15.4.yamlnew file+17
@@ -0,0 +1,17 @@
1+#recheck extra-deps next on resolver or cabal file change
2+resolver: lts-15.4
3+
4+extra-deps:
5+- cheapskate-0.1.1.2
6+
7+flags:
8+ idris:
9+ FFI: true
10+ GMP: true
11+
12+ghc-options:
13+ idris: -fwarn-unused-imports -fwarn-unused-binds
14+
15+nix:
16+ enable: false
17+ shell-file: stack-shell.nix
stack.yamlmode 100644 → 120000+1−17
@@ -1,17 +0,0 @@
1−#recheck extra-deps next on resolver or cabal file change
2−resolver: lts-15.3
3−
4−extra-deps:
5−- cheapskate-0.1.1.2
6−
7−flags:
8− idris:
9− FFI: true
10− GMP: true
11−
12−ghc-options:
13− idris: -fwarn-unused-imports -fwarn-unused-binds
14−
15−nix:
16− enable: false
17− shell-file: stack-shell.nix
@@ -0,0 +1 @@
1+stack-15.4.yaml