aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/math
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/test/lux/math')
-rw-r--r--stdlib/source/test/lux/math/logic/continuous.lux186
-rw-r--r--stdlib/source/test/lux/math/logic/fuzzy.lux454
-rw-r--r--stdlib/source/test/lux/math/modular.lux148
-rw-r--r--stdlib/source/test/lux/math/modulus.lux88
-rw-r--r--stdlib/source/test/lux/math/number.lux188
-rw-r--r--stdlib/source/test/lux/math/number/complex.lux336
-rw-r--r--stdlib/source/test/lux/math/number/frac.lux616
-rw-r--r--stdlib/source/test/lux/math/number/i16.lux44
-rw-r--r--stdlib/source/test/lux/math/number/i32.lux44
-rw-r--r--stdlib/source/test/lux/math/number/i64.lux368
-rw-r--r--stdlib/source/test/lux/math/number/i8.lux44
-rw-r--r--stdlib/source/test/lux/math/number/int.lux410
-rw-r--r--stdlib/source/test/lux/math/number/nat.lux230
-rw-r--r--stdlib/source/test/lux/math/number/ratio.lux166
-rw-r--r--stdlib/source/test/lux/math/number/rev.lux304
15 files changed, 1813 insertions, 1813 deletions
diff --git a/stdlib/source/test/lux/math/logic/continuous.lux b/stdlib/source/test/lux/math/logic/continuous.lux
index 6b313d6a8..b4d9993d5 100644
--- a/stdlib/source/test/lux/math/logic/continuous.lux
+++ b/stdlib/source/test/lux/math/logic/continuous.lux
@@ -1,17 +1,17 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- [abstract
- [monad {"+" do}]
- [\\specification
- ["$[0]" monoid]]]
- [math
- ["[0]" random]
- [number
- ["r" rev]]]]]
- [\\library
- ["[0]" /]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ [abstract
+ [monad {"+" do}]
+ [\\specification
+ ["$[0]" monoid]]]
+ [math
+ ["[0]" random]
+ [number
+ ["r" rev]]]]]
+ [\\library
+ ["[0]" /]])
(def: .public test
Test
@@ -20,96 +20,96 @@
[left random.rev
mid random.rev
right random.rev]
- (`` ($_ _.and
- (~~ (template [<monoid>]
- [(_.for [<monoid>]
- ($monoid.spec r.= <monoid> random.rev))]
-
- [/.disjunction]
- [/.conjunction]
- ))
-
- (_.cover [/.true /.false]
- (let [true=max!
- (r.= /.false (++ /.true))
+ (`` (all _.and
+ (~~ (template [<monoid>]
+ [(_.for [<monoid>]
+ ($monoid.spec r.= <monoid> random.rev))]
+
+ [/.disjunction]
+ [/.conjunction]
+ ))
+
+ (_.cover [/.true /.false]
+ (let [true=max!
+ (r.= /.false (++ /.true))
- false=min!
- (r.= /.true (-- /.false))]
- (and true=max!
- false=min!)))
- (_.cover [/.or]
- (let [identity!
- (r.= left (/.or /.false left))
+ false=min!
+ (r.= /.true (-- /.false))]
+ (and true=max!
+ false=min!)))
+ (_.cover [/.or]
+ (let [identity!
+ (r.= left (/.or /.false left))
- annihilation!
- (r.= /.true (/.or /.true left))
-
- idempotence!
- (r.= left (/.or left left))
-
- associativity!
- (r.= ($_ /.or left mid right)
- (_$ /.or left mid right))]
- (and identity!
annihilation!
+ (r.= /.true (/.or /.true left))
+
idempotence!
- associativity!
- (let [l|r (/.or left right)]
- (and (r.>= left l|r)
- (r.>= right l|r))))))
- (_.cover [/.and]
- (let [identity!
- (r.= left (/.and /.true left))
+ (r.= left (/.or left left))
- annihilation!
- (r.= /.false (/.and /.false left))
-
- idempotence!
- (r.= left (/.and left left))
+ associativity!
+ (r.= (all /.or left mid right)
+ (.left /.or left mid right))]
+ (and identity!
+ annihilation!
+ idempotence!
+ associativity!
+ (let [l|r (/.or left right)]
+ (and (r.>= left l|r)
+ (r.>= right l|r))))))
+ (_.cover [/.and]
+ (let [identity!
+ (r.= left (/.and /.true left))
- associativity!
- (r.= ($_ /.and left mid right)
- (_$ /.and left mid right))]
- (and identity!
annihilation!
+ (r.= /.false (/.and /.false left))
+
idempotence!
- associativity!
- (let [l&r (/.and left right)]
- (and (r.<= left l&r)
- (r.<= right l&r))))))
- (_.cover [/.not]
- (let [inverses!
- (and (r.= /.false (/.not /.true))
- (r.= /.true (/.not /.false)))
+ (r.= left (/.and left left))
- double_negation!
- (r.= left (/.not (/.not left)))
+ associativity!
+ (r.= (all /.and left mid right)
+ (.left /.and left mid right))]
+ (and identity!
+ annihilation!
+ idempotence!
+ associativity!
+ (let [l&r (/.and left right)]
+ (and (r.<= left l&r)
+ (r.<= right l&r))))))
+ (_.cover [/.not]
+ (let [inverses!
+ (and (r.= /.false (/.not /.true))
+ (r.= /.true (/.not /.false)))
- de_morgan!
- (and (r.= (/.not (/.or left right))
- (/.and (/.not left) (/.not right)))
- (r.= (/.not (/.and left right))
- (/.or (/.not left) (/.not right))))]
- (and inverses!
double_negation!
- de_morgan!)))
- (_.cover [/.implies]
- (let [modus_tollens!
- (r.= (/.implies right left)
- (/.implies (/.not left) (/.not right)))]
- (and modus_tollens!)))
- (_.cover [/.=]
- (let [trivial!
- (and (r.= /.true (/.= /.true /.true))
- (r.= /.true (/.= /.false /.false))
+ (r.= left (/.not (/.not left)))
+
+ de_morgan!
+ (and (r.= (/.not (/.or left right))
+ (/.and (/.not left) (/.not right)))
+ (r.= (/.not (/.and left right))
+ (/.or (/.not left) (/.not right))))]
+ (and inverses!
+ double_negation!
+ de_morgan!)))
+ (_.cover [/.implies]
+ (let [modus_tollens!
+ (r.= (/.implies right left)
+ (/.implies (/.not left) (/.not right)))]
+ (and modus_tollens!)))
+ (_.cover [/.=]
+ (let [trivial!
+ (and (r.= /.true (/.= /.true /.true))
+ (r.= /.true (/.= /.false /.false))
- (r.= /.false (/.= /.true /.false)))
+ (r.= /.false (/.= /.true /.false)))
- common!
- (and (r.>= left
- (/.= left left))
- (r.>= right
- (/.= right right)))]
- (and trivial!
- common!)))
- )))))
+ common!
+ (and (r.>= left
+ (/.= left left))
+ (r.>= right
+ (/.= right right)))]
+ (and trivial!
+ common!)))
+ )))))
diff --git a/stdlib/source/test/lux/math/logic/fuzzy.lux b/stdlib/source/test/lux/math/logic/fuzzy.lux
index a79d72805..d954d22e7 100644
--- a/stdlib/source/test/lux/math/logic/fuzzy.lux
+++ b/stdlib/source/test/lux/math/logic/fuzzy.lux
@@ -27,12 +27,12 @@
Test
(do random.monad
[sample random.rev]
- ($_ _.and
- (_.cover [/.empty]
- (r.= //.false (/.empty sample)))
- (_.cover [/.full]
- (r.= //.true (/.full sample)))
- )))
+ (all _.and
+ (_.cover [/.empty]
+ (r.= //.false (/.empty sample)))
+ (_.cover [/.full]
+ (r.= //.true (/.full sample)))
+ )))
(def: simple
Test
@@ -46,40 +46,40 @@
.let [bottom (r.min threshold_0 threshold_1)
top (r.max threshold_0 threshold_1)]]
- ($_ _.and
- (_.cover [/.gradient]
- (let [ascending!
- (let [set (/.gradient bottom top)]
- (and (r.= //.false (set bottom))
- (r.= //.true (set top))
- (let [membership (set sample)]
- (cond (r.<= bottom sample)
- (r.= //.false membership)
-
- (r.>= top sample)
- (r.= //.true membership)
-
- (r.> //.false membership)))))
-
- descending!
- (let [set (/.gradient top bottom)]
- (and (r.= //.true (set bottom))
- (r.= //.false (set top))
- (let [membership (set sample)]
- (cond (r.<= bottom sample)
- (r.= //.true membership)
-
- (r.>= top sample)
- (r.= //.false membership)
-
- (r.> //.false membership)))))]
- (and ascending!
- descending!)))
- (_.cover [/.membership]
- (let [set (/.gradient bottom top)]
- (r.= (set sample)
- (/.membership set sample))))
- )))
+ (all _.and
+ (_.cover [/.gradient]
+ (let [ascending!
+ (let [set (/.gradient bottom top)]
+ (and (r.= //.false (set bottom))
+ (r.= //.true (set top))
+ (let [membership (set sample)]
+ (cond (r.<= bottom sample)
+ (r.= //.false membership)
+
+ (r.>= top sample)
+ (r.= //.true membership)
+
+ (r.> //.false membership)))))
+
+ descending!
+ (let [set (/.gradient top bottom)]
+ (and (r.= //.true (set bottom))
+ (r.= //.false (set top))
+ (let [membership (set sample)]
+ (cond (r.<= bottom sample)
+ (r.= //.true membership)
+
+ (r.>= top sample)
+ (r.= //.false membership)
+
+ (r.> //.false membership)))))]
+ (and ascending!
+ descending!)))
+ (_.cover [/.membership]
+ (let [set (/.gradient bottom top)]
+ (r.= (set sample)
+ (/.membership set sample))))
+ )))
(def: composition
Test
@@ -100,68 +100,68 @@
.let [bottom_set (/.gradient bottom middle_bottom)
top_set (/.gradient middle_top top)]]
- ($_ _.and
- (_.cover [/.union]
- (let [set (/.gradient bottom top)]
- (and (r.= (/.membership set sample)
- (/.membership (/.union /.empty set) sample))
- (r.= (/.membership /.full sample)
- (/.membership (/.union /.full set) sample))
-
- (r.>= (/.membership bottom_set sample)
- (/.membership (/.union bottom_set top_set) sample))
- (r.>= (/.membership top_set sample)
- (/.membership (/.union bottom_set top_set) sample)))))
- (_.cover [/.intersection]
- (let [set (/.gradient bottom top)]
- (and (r.= (/.membership /.empty sample)
- (/.membership (/.intersection /.empty set) sample))
- (r.= (/.membership set sample)
- (/.membership (/.intersection /.full set) sample))
-
- (r.<= (/.membership bottom_set sample)
- (/.membership (/.intersection bottom_set top_set) sample))
- (r.<= (/.membership top_set sample)
- (/.membership (/.intersection bottom_set top_set) sample)))))
- (_.cover [/.complement]
- (let [set (/.gradient bottom top)
-
- trivial!
- (and (r.= (/.membership /.full sample)
- (/.membership (/.complement /.empty) sample))
- (r.= (/.membership /.empty sample)
- (/.membership (/.complement /.full) sample)))
-
- common!
- (and (r.>= (/.membership set sample)
- (/.membership (/.union set (/.complement set)) sample))
- (r.<= (/.membership set sample)
- (/.membership (/.intersection set (/.complement set)) sample)))
-
- de_morgan!
- (and (r.= (/.membership (/.complement (/.union bottom_set top_set))
- sample)
- (/.membership (/.intersection (/.complement bottom_set) (/.complement top_set))
- sample))
- (r.= (/.membership (/.complement (/.intersection bottom_set top_set))
- sample)
- (/.membership (/.union (/.complement bottom_set) (/.complement top_set))
- sample)))]
- (and trivial!
+ (all _.and
+ (_.cover [/.union]
+ (let [set (/.gradient bottom top)]
+ (and (r.= (/.membership set sample)
+ (/.membership (/.union /.empty set) sample))
+ (r.= (/.membership /.full sample)
+ (/.membership (/.union /.full set) sample))
+
+ (r.>= (/.membership bottom_set sample)
+ (/.membership (/.union bottom_set top_set) sample))
+ (r.>= (/.membership top_set sample)
+ (/.membership (/.union bottom_set top_set) sample)))))
+ (_.cover [/.intersection]
+ (let [set (/.gradient bottom top)]
+ (and (r.= (/.membership /.empty sample)
+ (/.membership (/.intersection /.empty set) sample))
+ (r.= (/.membership set sample)
+ (/.membership (/.intersection /.full set) sample))
+
+ (r.<= (/.membership bottom_set sample)
+ (/.membership (/.intersection bottom_set top_set) sample))
+ (r.<= (/.membership top_set sample)
+ (/.membership (/.intersection bottom_set top_set) sample)))))
+ (_.cover [/.complement]
+ (let [set (/.gradient bottom top)
+
+ trivial!
+ (and (r.= (/.membership /.full sample)
+ (/.membership (/.complement /.empty) sample))
+ (r.= (/.membership /.empty sample)
+ (/.membership (/.complement /.full) sample)))
+
common!
- de_morgan!)))
- (_.cover [/.difference]
- (let [set (/.gradient bottom top)]
- (and (r.= (/.membership set sample)
- (/.membership (/.difference /.empty set) sample))
- (r.= (/.membership /.empty sample)
- (/.membership (/.difference /.full set) sample))
-
- (r.<= (/.membership top_set sample)
- (/.membership (/.difference bottom_set top_set) sample))
- (r.<= (/.membership bottom_set sample)
- (/.membership (/.difference bottom_set top_set) sample)))))
- )))
+ (and (r.>= (/.membership set sample)
+ (/.membership (/.union set (/.complement set)) sample))
+ (r.<= (/.membership set sample)
+ (/.membership (/.intersection set (/.complement set)) sample)))
+
+ de_morgan!
+ (and (r.= (/.membership (/.complement (/.union bottom_set top_set))
+ sample)
+ (/.membership (/.intersection (/.complement bottom_set) (/.complement top_set))
+ sample))
+ (r.= (/.membership (/.complement (/.intersection bottom_set top_set))
+ sample)
+ (/.membership (/.union (/.complement bottom_set) (/.complement top_set))
+ sample)))]
+ (and trivial!
+ common!
+ de_morgan!)))
+ (_.cover [/.difference]
+ (let [set (/.gradient bottom top)]
+ (and (r.= (/.membership set sample)
+ (/.membership (/.difference /.empty set) sample))
+ (r.= (/.membership /.empty sample)
+ (/.membership (/.difference /.full set) sample))
+
+ (r.<= (/.membership top_set sample)
+ (/.membership (/.difference bottom_set top_set) sample))
+ (r.<= (/.membership bottom_set sample)
+ (/.membership (/.difference bottom_set top_set) sample)))))
+ )))
(def: geometric
Test
@@ -181,111 +181,111 @@
_
{.#None}))))]
- ($_ _.and
- (_.cover [/.triangle]
- (let [reference (/.triangle bottom middle_bottom top)
-
- irrelevant_order!
- (list.every? (function (_ set)
- (r.= (/.membership reference sample)
- (/.membership set sample)))
- (list (/.triangle bottom top middle_bottom)
- (/.triangle middle_bottom bottom top)
- (/.triangle middle_bottom top bottom)
- (/.triangle top bottom middle_bottom)
- (/.triangle top middle_bottom bottom)))
-
- middle_maximum!
- (r.= //.true (/.membership reference middle_bottom))
-
- boundary_minima!
- (and (r.= //.false (/.membership reference bottom))
- (r.= //.false (/.membership reference top)))
-
- inside_range!
- (bit#= (r.> //.false (/.membership reference sample))
- (and (r.> bottom sample)
- (r.< top sample)))
-
- outside_range!
- (bit#= (r.= //.false (/.membership reference sample))
- (or (r.<= bottom sample)
- (r.>= top sample)))]
- (and irrelevant_order!
+ (all _.and
+ (_.cover [/.triangle]
+ (let [reference (/.triangle bottom middle_bottom top)
+
+ irrelevant_order!
+ (list.every? (function (_ set)
+ (r.= (/.membership reference sample)
+ (/.membership set sample)))
+ (list (/.triangle bottom top middle_bottom)
+ (/.triangle middle_bottom bottom top)
+ (/.triangle middle_bottom top bottom)
+ (/.triangle top bottom middle_bottom)
+ (/.triangle top middle_bottom bottom)))
+
middle_maximum!
+ (r.= //.true (/.membership reference middle_bottom))
+
boundary_minima!
+ (and (r.= //.false (/.membership reference bottom))
+ (r.= //.false (/.membership reference top)))
+
inside_range!
- outside_range!)))
- (_.cover [/.trapezoid]
- (let [reference (/.trapezoid bottom middle_bottom middle_top top)
-
- irrelevant_order!
- (list.every? (function (_ set)
- (r.= (/.membership reference sample)
- (/.membership set sample)))
- (let [r0 bottom
- r1 middle_bottom
- r2 middle_top
- r3 top]
- (list (/.trapezoid r0 r1 r2 r3)
- (/.trapezoid r0 r1 r3 r2)
- (/.trapezoid r0 r2 r1 r3)
- (/.trapezoid r0 r2 r3 r1)
- (/.trapezoid r0 r3 r1 r2)
- (/.trapezoid r0 r3 r2 r1)
-
- (/.trapezoid r1 r0 r2 r3)
- (/.trapezoid r1 r0 r3 r2)
- (/.trapezoid r1 r2 r0 r3)
- (/.trapezoid r1 r2 r3 r0)
- (/.trapezoid r1 r3 r0 r2)
- (/.trapezoid r1 r3 r2 r0)
-
- (/.trapezoid r2 r0 r1 r3)
- (/.trapezoid r2 r0 r3 r1)
- (/.trapezoid r2 r1 r0 r3)
- (/.trapezoid r2 r1 r3 r0)
- (/.trapezoid r2 r3 r0 r1)
- (/.trapezoid r2 r3 r1 r0)
-
- (/.trapezoid r3 r0 r1 r2)
- (/.trapezoid r3 r0 r2 r1)
- (/.trapezoid r3 r1 r0 r2)
- (/.trapezoid r3 r1 r2 r0)
- (/.trapezoid r3 r2 r0 r1)
- (/.trapezoid r3 r2 r1 r0)
- )))
-
- middle_maxima!
- (and (r.= //.true (/.membership reference middle_bottom))
- (r.= //.true (/.membership reference middle_top)))
-
- boundary_minima!
- (and (r.= //.false (/.membership reference bottom))
- (r.= //.false (/.membership reference top)))
-
- inside_range!
- (bit#= (r.> //.false (/.membership reference sample))
- (and (r.> bottom sample)
- (r.< top sample)))
-
- outside_range!
- (bit#= (r.= //.false (/.membership reference sample))
- (or (r.<= bottom sample)
- (r.>= top sample)))
-
-
- inside_inner_range!
- (bit#= (r.= //.true (/.membership reference sample))
- (and (r.<= middle_top sample)
- (r.>= middle_bottom sample)))]
- (and irrelevant_order!
+ (bit#= (r.> //.false (/.membership reference sample))
+ (and (r.> bottom sample)
+ (r.< top sample)))
+
+ outside_range!
+ (bit#= (r.= //.false (/.membership reference sample))
+ (or (r.<= bottom sample)
+ (r.>= top sample)))]
+ (and irrelevant_order!
+ middle_maximum!
+ boundary_minima!
+ inside_range!
+ outside_range!)))
+ (_.cover [/.trapezoid]
+ (let [reference (/.trapezoid bottom middle_bottom middle_top top)
+
+ irrelevant_order!
+ (list.every? (function (_ set)
+ (r.= (/.membership reference sample)
+ (/.membership set sample)))
+ (let [r0 bottom
+ r1 middle_bottom
+ r2 middle_top
+ r3 top]
+ (list (/.trapezoid r0 r1 r2 r3)
+ (/.trapezoid r0 r1 r3 r2)
+ (/.trapezoid r0 r2 r1 r3)
+ (/.trapezoid r0 r2 r3 r1)
+ (/.trapezoid r0 r3 r1 r2)
+ (/.trapezoid r0 r3 r2 r1)
+
+ (/.trapezoid r1 r0 r2 r3)
+ (/.trapezoid r1 r0 r3 r2)
+ (/.trapezoid r1 r2 r0 r3)
+ (/.trapezoid r1 r2 r3 r0)
+ (/.trapezoid r1 r3 r0 r2)
+ (/.trapezoid r1 r3 r2 r0)
+
+ (/.trapezoid r2 r0 r1 r3)
+ (/.trapezoid r2 r0 r3 r1)
+ (/.trapezoid r2 r1 r0 r3)
+ (/.trapezoid r2 r1 r3 r0)
+ (/.trapezoid r2 r3 r0 r1)
+ (/.trapezoid r2 r3 r1 r0)
+
+ (/.trapezoid r3 r0 r1 r2)
+ (/.trapezoid r3 r0 r2 r1)
+ (/.trapezoid r3 r1 r0 r2)
+ (/.trapezoid r3 r1 r2 r0)
+ (/.trapezoid r3 r2 r0 r1)
+ (/.trapezoid r3 r2 r1 r0)
+ )))
+
middle_maxima!
+ (and (r.= //.true (/.membership reference middle_bottom))
+ (r.= //.true (/.membership reference middle_top)))
+
boundary_minima!
+ (and (r.= //.false (/.membership reference bottom))
+ (r.= //.false (/.membership reference top)))
+
inside_range!
+ (bit#= (r.> //.false (/.membership reference sample))
+ (and (r.> bottom sample)
+ (r.< top sample)))
+
outside_range!
- inside_inner_range!)))
- ))))
+ (bit#= (r.= //.false (/.membership reference sample))
+ (or (r.<= bottom sample)
+ (r.>= top sample)))
+
+
+ inside_inner_range!
+ (bit#= (r.= //.true (/.membership reference sample))
+ (and (r.<= middle_top sample)
+ (r.>= middle_bottom sample)))]
+ (and irrelevant_order!
+ middle_maxima!
+ boundary_minima!
+ inside_range!
+ outside_range!
+ inside_inner_range!)))
+ ))))
(def: discrete
Test
@@ -294,15 +294,15 @@
.let [under? (n.< threshold)
set (set.of_list n.hash (list threshold))]
sample random.nat]
- ($_ _.and
- (_.cover [/.of_predicate]
- (bit#= (r.= //.true (/.membership (/.of_predicate under?) sample))
- (under? sample)))
- (_.cover [/.of_set]
- (and (r.= //.true (/.membership (/.of_set set) threshold))
- (bit#= (r.= //.true (/.membership (/.of_set set) sample))
- (set.member? set sample))))
- )))
+ (all _.and
+ (_.cover [/.of_predicate]
+ (bit#= (r.= //.true (/.membership (/.of_predicate under?) sample))
+ (under? sample)))
+ (_.cover [/.of_set]
+ (and (r.= //.true (/.membership (/.of_set set) threshold))
+ (bit#= (r.= //.true (/.membership (/.of_set set) sample))
+ (set.member? set sample))))
+ )))
(def: gradient
(Random [[Rev Rev] (Fuzzy Rev)])
@@ -323,14 +323,14 @@
[[_ set] ..gradient
threshold random.rev
sample random.rev]
- ($_ _.and
- (_.cover [/.predicate]
- (bit#= (not ((/.predicate threshold set) sample))
- (r.< threshold (/.membership set sample))))
- (_.cover [/.cut]
- (bit#= (r.= //.false (/.membership (/.cut threshold set) sample))
- (r.< threshold (/.membership set sample))))
- )))
+ (all _.and
+ (_.cover [/.predicate]
+ (bit#= (not ((/.predicate threshold set) sample))
+ (r.< threshold (/.membership set sample))))
+ (_.cover [/.cut]
+ (bit#= (r.= //.false (/.membership (/.cut threshold set) sample))
+ (r.< threshold (/.membership set sample))))
+ )))
(def: .public test
Test
@@ -344,14 +344,14 @@
(def: (= left right)
(r.= (left sample)
(right sample)))))]]
- ($_ _.and
- (_.for [/.functor]
- ($contravariant.spec equivalence fuzzy /.functor))
-
- ..trivial
- ..simple
- ..composition
- ..geometric
- ..discrete
- ..threshold
- ))))
+ (all _.and
+ (_.for [/.functor]
+ ($contravariant.spec equivalence fuzzy /.functor))
+
+ ..trivial
+ ..simple
+ ..composition
+ ..geometric
+ ..discrete
+ ..threshold
+ ))))
diff --git a/stdlib/source/test/lux/math/modular.lux b/stdlib/source/test/lux/math/modular.lux
index 243603132..535ba1048 100644
--- a/stdlib/source/test/lux/math/modular.lux
+++ b/stdlib/source/test/lux/math/modular.lux
@@ -47,78 +47,78 @@
($//.random +1,000,000))
subject (..random subject##%)
another (..random subject##%)]
- (`` ($_ _.and
- (_.for [/.equivalence /.=]
- ($equivalence.spec /.equivalence (..random subject##%)))
- (_.for [/.order /.<]
- ($order.spec /.order (..random subject##%)))
- (~~ (template [<composite> <monoid>]
- [(_.for [<monoid> <composite>]
- ($monoid.spec /.equivalence (<monoid> subject##%) (..random subject##%)))]
-
- [/.+ /.addition]
- [/.* /.multiplication]
- ))
- (_.for [/.codec]
- ($codec.spec /.equivalence (/.codec subject##%) (..random subject##%)))
+ (`` (all _.and
+ (_.for [/.equivalence /.=]
+ ($equivalence.spec /.equivalence (..random subject##%)))
+ (_.for [/.order /.<]
+ ($order.spec /.order (..random subject##%)))
+ (~~ (template [<composite> <monoid>]
+ [(_.for [<monoid> <composite>]
+ ($monoid.spec /.equivalence (<monoid> subject##%) (..random subject##%)))]
+
+ [/.+ /.addition]
+ [/.* /.multiplication]
+ ))
+ (_.for [/.codec]
+ ($codec.spec /.equivalence (/.codec subject##%) (..random subject##%)))
- (_.cover [/.incorrect_modulus]
- (case (|> param
- (# (/.codec param##%) encoded)
- (# (/.codec subject##%) decoded))
- {try.#Failure error}
- (exception.match? /.incorrect_modulus error)
-
- {try.#Success _}
- false))
- (_.cover [/.modulus]
- (and (type#= (type_of (/.modulus subject))
- (type_of (/.modulus subject)))
- (not (type#= (type_of (/.modulus subject))
- (type_of (/.modulus param))))))
- (_.cover [/.modular /.value]
- (/.= subject
- (/.modular (/.modulus subject) (/.value subject))))
- (_.cover [/.>]
- (bit#= (/.> another subject)
- (/.< subject another)))
- (_.cover [/.<= /.>=]
- (bit#= (/.<= another subject)
- (/.>= subject another)))
- (_.cover [/.-]
- (let [zero (/.modular (/.modulus subject) +0)]
- (and (/.= zero
- (/.- subject subject))
- (/.= subject
- (/.- zero subject)))))
- (_.cover [/.inverse]
- (let [one (/.modular (/.modulus subject) +1)
- co_prime? (i.co_prime? (//.divisor (/.modulus subject))
- (/.value subject))]
- (case (/.inverse subject)
- {.#Some subject^-1}
- (and co_prime?
- (|> subject
- (/.* subject^-1)
- (/.= one)))
-
- {.#None}
- (not co_prime?))))
- (_.cover [/.adapter]
- (<| (try.else false)
- (do try.monad
- [copy##% (//.modulus (//.divisor subject##%))
- adapt (/.adapter subject##% copy##%)]
- (in (|> subject
- /.value
- (/.modular copy##%)
- adapt
- (/.= subject))))))
- (_.cover [/.moduli_are_not_equal]
- (case (/.adapter subject##% param##%)
- {try.#Failure error}
- (exception.match? /.moduli_are_not_equal error)
-
- {try.#Success _}
- false))
- )))))
+ (_.cover [/.incorrect_modulus]
+ (case (|> param
+ (# (/.codec param##%) encoded)
+ (# (/.codec subject##%) decoded))
+ {try.#Failure error}
+ (exception.match? /.incorrect_modulus error)
+
+ {try.#Success _}
+ false))
+ (_.cover [/.modulus]
+ (and (type#= (type_of (/.modulus subject))
+ (type_of (/.modulus subject)))
+ (not (type#= (type_of (/.modulus subject))
+ (type_of (/.modulus param))))))
+ (_.cover [/.modular /.value]
+ (/.= subject
+ (/.modular (/.modulus subject) (/.value subject))))
+ (_.cover [/.>]
+ (bit#= (/.> another subject)
+ (/.< subject another)))
+ (_.cover [/.<= /.>=]
+ (bit#= (/.<= another subject)
+ (/.>= subject another)))
+ (_.cover [/.-]
+ (let [zero (/.modular (/.modulus subject) +0)]
+ (and (/.= zero
+ (/.- subject subject))
+ (/.= subject
+ (/.- zero subject)))))
+ (_.cover [/.inverse]
+ (let [one (/.modular (/.modulus subject) +1)
+ co_prime? (i.co_prime? (//.divisor (/.modulus subject))
+ (/.value subject))]
+ (case (/.inverse subject)
+ {.#Some subject^-1}
+ (and co_prime?
+ (|> subject
+ (/.* subject^-1)
+ (/.= one)))
+
+ {.#None}
+ (not co_prime?))))
+ (_.cover [/.adapter]
+ (<| (try.else false)
+ (do try.monad
+ [copy##% (//.modulus (//.divisor subject##%))
+ adapt (/.adapter subject##% copy##%)]
+ (in (|> subject
+ /.value
+ (/.modular copy##%)
+ adapt
+ (/.= subject))))))
+ (_.cover [/.moduli_are_not_equal]
+ (case (/.adapter subject##% param##%)
+ {try.#Failure error}
+ (exception.match? /.moduli_are_not_equal error)
+
+ {try.#Success _}
+ false))
+ )))))
diff --git a/stdlib/source/test/lux/math/modulus.lux b/stdlib/source/test/lux/math/modulus.lux
index fbb7bd563..71dd3b81b 100644
--- a/stdlib/source/test/lux/math/modulus.lux
+++ b/stdlib/source/test/lux/math/modulus.lux
@@ -1,22 +1,22 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- ["[0]" meta]
- [abstract
- [monad {"+" do}]]
- [control
- ["[0]" try]
- ["[0]" exception]]
- [math
- ["[0]" random {"+" Random}]
- [number
- ["i" int]]]
- [macro
- [syntax {"+" syntax:}]
- ["[0]" code]]]]
- [\\library
- ["[0]" /]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ ["[0]" meta]
+ [abstract
+ [monad {"+" do}]]
+ [control
+ ["[0]" try]
+ ["[0]" exception]]
+ [math
+ ["[0]" random {"+" Random}]
+ [number
+ ["i" int]]]
+ [macro
+ [syntax {"+" syntax:}]
+ ["[0]" code]]]]
+ [\\library
+ ["[0]" /]])
(syntax: (|divisor| [])
(do meta.monad
@@ -39,30 +39,30 @@
[divisor random.int
modulus (..random +1,000,000)
dividend random.int]
- ($_ _.and
- (_.cover [/.modulus /.divisor]
- (case (/.modulus divisor)
- {try.#Success modulus}
- (i.= divisor (/.divisor modulus))
-
- {try.#Failure error}
- (i.= +0 divisor)))
- (_.cover [/.zero_cannot_be_a_modulus]
- (case (/.modulus +0)
- {try.#Failure error}
- (exception.match? /.zero_cannot_be_a_modulus error)
+ (all _.and
+ (_.cover [/.modulus /.divisor]
+ (case (/.modulus divisor)
+ {try.#Success modulus}
+ (i.= divisor (/.divisor modulus))
+
+ {try.#Failure error}
+ (i.= +0 divisor)))
+ (_.cover [/.zero_cannot_be_a_modulus]
+ (case (/.modulus +0)
+ {try.#Failure error}
+ (exception.match? /.zero_cannot_be_a_modulus error)
- {try.#Success modulus}
- false))
- (_.cover [/.literal]
- (with_expansions [<divisor> (|divisor|)]
- (i.= <divisor> (/.divisor (/.literal <divisor>)))))
- (_.cover [/.=]
- (with_expansions [<divisor> (|divisor|)]
- (/.= (/.literal <divisor>)
- (/.literal <divisor>))))
- (_.cover [/.congruent?]
- (and (/.congruent? modulus dividend dividend)
- (or (not (/.congruent? modulus dividend (++ dividend)))
- (i.= +1 (/.divisor modulus)))))
- ))))
+ {try.#Success modulus}
+ false))
+ (_.cover [/.literal]
+ (with_expansions [<divisor> (|divisor|)]
+ (i.= <divisor> (/.divisor (/.literal <divisor>)))))
+ (_.cover [/.=]
+ (with_expansions [<divisor> (|divisor|)]
+ (/.= (/.literal <divisor>)
+ (/.literal <divisor>))))
+ (_.cover [/.congruent?]
+ (and (/.congruent? modulus dividend dividend)
+ (or (not (/.congruent? modulus dividend (++ dividend)))
+ (i.= +1 (/.divisor modulus)))))
+ ))))
diff --git a/stdlib/source/test/lux/math/number.lux b/stdlib/source/test/lux/math/number.lux
index beaa84aa6..94df83848 100644
--- a/stdlib/source/test/lux/math/number.lux
+++ b/stdlib/source/test/lux/math/number.lux
@@ -1,28 +1,28 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- [control
- ["[0]" try]]
- [data
- ["[0]" text]]]]
- [\\library
- ["[0]" /
- ["n" nat]
- ["i" int]
- ["r" rev]
- ["f" frac]]]
- ["[0]" / "_"
- ["[1][0]" i8]
- ["[1][0]" i16]
- ["[1][0]" i32]
- ["[1][0]" i64]
- ["[1][0]" nat]
- ["[1][0]" int]
- ["[1][0]" rev]
- ["[1][0]" frac]
- ["[1][0]" ratio]
- ["[1][0]" complex]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ [control
+ ["[0]" try]]
+ [data
+ ["[0]" text]]]]
+ [\\library
+ ["[0]" /
+ ["n" nat]
+ ["i" int]
+ ["r" rev]
+ ["f" frac]]]
+ ["[0]" / "_"
+ ["[1][0]" i8]
+ ["[1][0]" i16]
+ ["[1][0]" i32]
+ ["[1][0]" i64]
+ ["[1][0]" nat]
+ ["[1][0]" int]
+ ["[1][0]" rev]
+ ["[1][0]" frac]
+ ["[1][0]" ratio]
+ ["[1][0]" complex]])
(def: clean_commas
(-> Text Text)
@@ -31,73 +31,73 @@
(def: .public test
Test
(<| (_.covering /._)
- ($_ _.and
- (_.cover [/.bin]
- (`` (and (~~ (template [<=> <codec> <number>]
- [(case (# <codec> decoded (..clean_commas <number>))
- {try.#Success actual}
- (<=> (/.bin <number>) actual)
-
- {try.#Failure error}
- false)]
-
- [n.= n.binary "11,00,10,01"]
-
- [i.= i.binary "+11,00,10,01"]
- [i.= i.binary "-11,00,10,01"]
-
- [r.= r.binary ".11,00,10,01"]
-
- [f.= f.binary "+11,00.10,01"]
- [f.= f.binary "-11,00.10,01"]
- )))))
- (_.cover [/.oct]
- (`` (and (~~ (template [<=> <codec> <number>]
- [(case (# <codec> decoded (..clean_commas <number>))
- {try.#Success actual}
- (<=> (/.oct <number>) actual)
-
- {try.#Failure error}
- false)]
-
- [n.= n.octal "615,243"]
-
- [i.= i.octal "+615,243"]
- [i.= i.octal "-615,243"]
-
- [r.= r.octal ".615,243"]
-
- [f.= f.octal "+61,52.43"]
- [f.= f.octal "-61,52.43"]
- )))))
- (_.cover [/.hex]
- (`` (and (~~ (template [<=> <codec> <number>]
- [(case (# <codec> decoded (..clean_commas <number>))
- {try.#Success actual}
- (<=> (/.hex <number>) actual)
-
- {try.#Failure error}
- false)]
-
- [n.= n.hex "dead,BEEF"]
-
- [i.= i.hex "+dead,BEEF"]
- [i.= i.hex "-dead,BEEF"]
-
- [r.= r.hex ".dead,BEEF"]
-
- [f.= f.hex "+dead,BE.EF"]
- [f.= f.hex "-dead,BE.EF"]
- )))))
-
- /i8.test
- /i16.test
- /i32.test
- /i64.test
- /nat.test
- /int.test
- /rev.test
- /frac.test
- /ratio.test
- /complex.test
- )))
+ (all _.and
+ (_.cover [/.bin]
+ (`` (and (~~ (template [<=> <codec> <number>]
+ [(case (# <codec> decoded (..clean_commas <number>))
+ {try.#Success actual}
+ (<=> (/.bin <number>) actual)
+
+ {try.#Failure error}
+ false)]
+
+ [n.= n.binary "11,00,10,01"]
+
+ [i.= i.binary "+11,00,10,01"]
+ [i.= i.binary "-11,00,10,01"]
+
+ [r.= r.binary ".11,00,10,01"]
+
+ [f.= f.binary "+11,00.10,01"]
+ [f.= f.binary "-11,00.10,01"]
+ )))))
+ (_.cover [/.oct]
+ (`` (and (~~ (template [<=> <codec> <number>]
+ [(case (# <codec> decoded (..clean_commas <number>))
+ {try.#Success actual}
+ (<=> (/.oct <number>) actual)
+
+ {try.#Failure error}
+ false)]
+
+ [n.= n.octal "615,243"]
+
+ [i.= i.octal "+615,243"]
+ [i.= i.octal "-615,243"]
+
+ [r.= r.octal ".615,243"]
+
+ [f.= f.octal "+61,52.43"]
+ [f.= f.octal "-61,52.43"]
+ )))))
+ (_.cover [/.hex]
+ (`` (and (~~ (template [<=> <codec> <number>]
+ [(case (# <codec> decoded (..clean_commas <number>))
+ {try.#Success actual}
+ (<=> (/.hex <number>) actual)
+
+ {try.#Failure error}
+ false)]
+
+ [n.= n.hex "dead,BEEF"]
+
+ [i.= i.hex "+dead,BEEF"]
+ [i.= i.hex "-dead,BEEF"]
+
+ [r.= r.hex ".dead,BEEF"]
+
+ [f.= f.hex "+dead,BE.EF"]
+ [f.= f.hex "-dead,BE.EF"]
+ )))))
+
+ /i8.test
+ /i16.test
+ /i32.test
+ /i64.test
+ /nat.test
+ /int.test
+ /rev.test
+ /frac.test
+ /ratio.test
+ /complex.test
+ )))
diff --git a/stdlib/source/test/lux/math/number/complex.lux b/stdlib/source/test/lux/math/number/complex.lux
index 7bdc17274..a705bbb0e 100644
--- a/stdlib/source/test/lux/math/number/complex.lux
+++ b/stdlib/source/test/lux/math/number/complex.lux
@@ -49,78 +49,78 @@
(do random.monad
[real ..dimension
imaginary ..dimension]
- ($_ _.and
- (_.cover [/.complex]
- (and (let [r+i (/.complex real imaginary)]
- (and (f.= real (the /.#real r+i))
- (f.= imaginary (the /.#imaginary r+i))))
- (let [r+i (/.complex real)]
- (and (f.= real (the /.#real r+i))
- (f.= +0.0 (the /.#imaginary r+i))))))
- (_.cover [/.approximately?]
- (/.approximately? ..margin_of_error
- (/.complex real imaginary)
- (/.complex real imaginary)))
- (_.cover [/.not_a_number?]
- (and (/.not_a_number? (/.complex f.not_a_number imaginary))
- (/.not_a_number? (/.complex real f.not_a_number))))
- )))
+ (all _.and
+ (_.cover [/.complex]
+ (and (let [r+i (/.complex real imaginary)]
+ (and (f.= real (the /.#real r+i))
+ (f.= imaginary (the /.#imaginary r+i))))
+ (let [r+i (/.complex real)]
+ (and (f.= real (the /.#real r+i))
+ (f.= +0.0 (the /.#imaginary r+i))))))
+ (_.cover [/.approximately?]
+ (/.approximately? ..margin_of_error
+ (/.complex real imaginary)
+ (/.complex real imaginary)))
+ (_.cover [/.not_a_number?]
+ (and (/.not_a_number? (/.complex f.not_a_number imaginary))
+ (/.not_a_number? (/.complex real f.not_a_number))))
+ )))
(def: constant
Test
(do random.monad
[sample ..random
dimension ..dimension]
- ($_ _.and
- (_.cover [/.zero]
- (/.= /.zero (/.* /.zero sample)))
- (_.cover [/.+one]
- (/.= sample (/.* /.+one sample)))
- (_.cover [/.-one]
- (and (/.= /.zero
- (/.+ sample
- (/.* /.-one sample)))
- (/.= sample (/.* /.-one (/.* /.-one sample)))))
- (_.cover [/.i]
- (and (/.= (/.complex +0.0 dimension)
- (/.* /.i (/.complex dimension)))
- (/.= (/.* /.-one sample)
- (/.* /.i (/.* /.i sample)))))
- )))
+ (all _.and
+ (_.cover [/.zero]
+ (/.= /.zero (/.* /.zero sample)))
+ (_.cover [/.+one]
+ (/.= sample (/.* /.+one sample)))
+ (_.cover [/.-one]
+ (and (/.= /.zero
+ (/.+ sample
+ (/.* /.-one sample)))
+ (/.= sample (/.* /.-one (/.* /.-one sample)))))
+ (_.cover [/.i]
+ (and (/.= (/.complex +0.0 dimension)
+ (/.* /.i (/.complex dimension)))
+ (/.= (/.* /.-one sample)
+ (/.* /.i (/.* /.i sample)))))
+ )))
(def: absolute_value&argument
Test
(do random.monad
[real ..dimension
imaginary ..dimension]
- ($_ _.and
- (_.cover [/.abs]
- (let [normal!
- (let [r+i (/.complex real imaginary)]
- (and (f.>= (f.abs real) (/.abs r+i))
- (f.>= (f.abs imaginary) (/.abs r+i))))
+ (all _.and
+ (_.cover [/.abs]
+ (let [normal!
+ (let [r+i (/.complex real imaginary)]
+ (and (f.>= (f.abs real) (/.abs r+i))
+ (f.>= (f.abs imaginary) (/.abs r+i))))
- not_a_number!
- (and (f.not_a_number? (/.abs (/.complex f.not_a_number imaginary)))
- (f.not_a_number? (/.abs (/.complex real f.not_a_number))))
-
- infinity!
- (and (f.= f.positive_infinity (/.abs (/.complex f.positive_infinity imaginary)))
- (f.= f.positive_infinity (/.abs (/.complex real f.positive_infinity)))
- (f.= f.positive_infinity (/.abs (/.complex f.negative_infinity imaginary)))
- (f.= f.positive_infinity (/.abs (/.complex real f.negative_infinity))))]
- (and normal!
not_a_number!
- infinity!)))
- ... https://en.wikipedia.org/wiki/Argument_(complex_analysis)#Identities
- (_.cover [/.argument]
- (let [sample (/.complex real imaginary)]
- (or (/.= /.zero sample)
- (/.approximately? ..margin_of_error
- sample
- (/.*' (/.abs sample)
- (/.exp (/.* /.i (/.complex (/.argument sample)))))))))
- )))
+ (and (f.not_a_number? (/.abs (/.complex f.not_a_number imaginary)))
+ (f.not_a_number? (/.abs (/.complex real f.not_a_number))))
+
+ infinity!
+ (and (f.= f.positive_infinity (/.abs (/.complex f.positive_infinity imaginary)))
+ (f.= f.positive_infinity (/.abs (/.complex real f.positive_infinity)))
+ (f.= f.positive_infinity (/.abs (/.complex f.negative_infinity imaginary)))
+ (f.= f.positive_infinity (/.abs (/.complex real f.negative_infinity))))]
+ (and normal!
+ not_a_number!
+ infinity!)))
+ ... https://en.wikipedia.org/wiki/Argument_(complex_analysis)#Identities
+ (_.cover [/.argument]
+ (let [sample (/.complex real imaginary)]
+ (or (/.= /.zero sample)
+ (/.approximately? ..margin_of_error
+ sample
+ (/.*' (/.abs sample)
+ (/.exp (/.* /.i (/.complex (/.argument sample)))))))))
+ )))
(def: number
Test
@@ -128,81 +128,81 @@
[x ..random
y ..random
factor ..dimension]
- ($_ _.and
- (_.cover [/.+]
- (let [z (/.+ y x)]
- (and (/.= z
- (/.complex (f.+ (the /.#real y)
- (the /.#real x))
- (f.+ (the /.#imaginary y)
- (the /.#imaginary x)))))))
- (_.cover [/.-]
- (let [normal!
- (let [z (/.- y x)]
- (and (/.= z
- (/.complex (f.- (the /.#real y)
- (the /.#real x))
- (f.- (the /.#imaginary y)
- (the /.#imaginary x))))))
+ (all _.and
+ (_.cover [/.+]
+ (let [z (/.+ y x)]
+ (and (/.= z
+ (/.complex (f.+ (the /.#real y)
+ (the /.#real x))
+ (f.+ (the /.#imaginary y)
+ (the /.#imaginary x)))))))
+ (_.cover [/.-]
+ (let [normal!
+ (let [z (/.- y x)]
+ (and (/.= z
+ (/.complex (f.- (the /.#real y)
+ (the /.#real x))
+ (f.- (the /.#imaginary y)
+ (the /.#imaginary x))))))
- inverse!
- (and (|> x (/.+ y) (/.- y) (/.approximately? ..margin_of_error x))
- (|> x (/.- y) (/.+ y) (/.approximately? ..margin_of_error x)))]
- (and normal!
- inverse!)))
- (_.cover [/.* /./]
- (|> x (/.* y) (/./ y) (/.approximately? ..margin_of_error x)))
- (_.cover [/.*' /./']
- (|> x (/.*' factor) (/./' factor) (/.approximately? ..margin_of_error x)))
- (_.cover [/.%]
- (let [rem (/.% y x)
- quotient (|> x (/.- rem) (/./ y))
- floored (|> quotient
- (revised /.#real f.floor)
- (revised /.#imaginary f.floor))]
- (/.approximately? +0.000000000001
- x
- (|> quotient (/.* y) (/.+ rem)))))
- )))
+ inverse!
+ (and (|> x (/.+ y) (/.- y) (/.approximately? ..margin_of_error x))
+ (|> x (/.- y) (/.+ y) (/.approximately? ..margin_of_error x)))]
+ (and normal!
+ inverse!)))
+ (_.cover [/.* /./]
+ (|> x (/.* y) (/./ y) (/.approximately? ..margin_of_error x)))
+ (_.cover [/.*' /./']
+ (|> x (/.*' factor) (/./' factor) (/.approximately? ..margin_of_error x)))
+ (_.cover [/.%]
+ (let [rem (/.% y x)
+ quotient (|> x (/.- rem) (/./ y))
+ floored (|> quotient
+ (revised /.#real f.floor)
+ (revised /.#imaginary f.floor))]
+ (/.approximately? +0.000000000001
+ x
+ (|> quotient (/.* y) (/.+ rem)))))
+ )))
(def: conjugate&reciprocal&signum&negation
Test
(do random.monad
[x ..random]
- ($_ _.and
- (_.cover [/.conjugate]
- (let [cx (/.conjugate x)]
- (and (f.= (the /.#real x)
- (the /.#real cx))
- (f.= (f.opposite (the /.#imaginary x))
- (the /.#imaginary cx)))))
- (_.cover [/.reciprocal]
- (let [reciprocal!
- (|> x (/.* (/.reciprocal x)) (/.approximately? ..margin_of_error /.+one))
-
- own_inverse!
- (|> x /.reciprocal /.reciprocal (/.approximately? ..margin_of_error x))]
- (and reciprocal!
- own_inverse!)))
- (_.cover [/.signum]
- ... Absolute value of signum is always root_2(2), 1 or 0.
- (let [signum_abs (|> x /.signum /.abs)]
- (or (f.= +0.0 signum_abs)
- (f.= +1.0 signum_abs)
- (f.= (f.pow +0.5 +2.0) signum_abs))))
- (_.cover [/.opposite]
- (let [own_inverse!
- (let [there (/.opposite x)
- back_again (/.opposite there)]
- (and (not (/.= there x))
- (/.= back_again x)))
+ (all _.and
+ (_.cover [/.conjugate]
+ (let [cx (/.conjugate x)]
+ (and (f.= (the /.#real x)
+ (the /.#real cx))
+ (f.= (f.opposite (the /.#imaginary x))
+ (the /.#imaginary cx)))))
+ (_.cover [/.reciprocal]
+ (let [reciprocal!
+ (|> x (/.* (/.reciprocal x)) (/.approximately? ..margin_of_error /.+one))
+
+ own_inverse!
+ (|> x /.reciprocal /.reciprocal (/.approximately? ..margin_of_error x))]
+ (and reciprocal!
+ own_inverse!)))
+ (_.cover [/.signum]
+ ... Absolute value of signum is always root_2(2), 1 or 0.
+ (let [signum_abs (|> x /.signum /.abs)]
+ (or (f.= +0.0 signum_abs)
+ (f.= +1.0 signum_abs)
+ (f.= (f.pow +0.5 +2.0) signum_abs))))
+ (_.cover [/.opposite]
+ (let [own_inverse!
+ (let [there (/.opposite x)
+ back_again (/.opposite there)]
+ (and (not (/.= there x))
+ (/.= back_again x)))
- absolute!
- (f.= (/.abs x)
- (/.abs (/.opposite x)))]
- (and own_inverse!
- absolute!)))
- )))
+ absolute!
+ (f.= (/.abs x)
+ (/.abs (/.opposite x)))]
+ (and own_inverse!
+ absolute!)))
+ )))
(def: (trigonometric_symmetry forward backward angle)
(-> (-> /.Complex /.Complex) (-> /.Complex /.Complex) /.Complex Bit)
@@ -213,45 +213,45 @@
Test
(do [! random.monad]
[angle ..angle]
- ($_ _.and
- (_.cover [/.sin /.asin]
- (trigonometric_symmetry /.sin /.asin angle))
- (_.cover [/.cos /.acos]
- (trigonometric_symmetry /.cos /.acos angle))
- (_.cover [/.tan /.atan]
- (trigonometric_symmetry /.tan /.atan angle)))))
+ (all _.and
+ (_.cover [/.sin /.asin]
+ (trigonometric_symmetry /.sin /.asin angle))
+ (_.cover [/.cos /.acos]
+ (trigonometric_symmetry /.cos /.acos angle))
+ (_.cover [/.tan /.atan]
+ (trigonometric_symmetry /.tan /.atan angle)))))
(def: hyperbolic
Test
(do [! random.monad]
[angle ..angle]
- ($_ _.and
- (_.cover [/.sinh]
- (/.approximately? ..margin_of_error
- (|> angle (/.* /.i) /.sin (/.* /.i) (/.* /.-one))
- (/.sinh angle)))
- (_.cover [/.cosh]
- (/.approximately? ..margin_of_error
- (|> angle (/.* /.i) /.cos)
- (/.cosh angle)))
- (_.cover [/.tanh]
- (/.approximately? ..margin_of_error
- (|> angle (/.* /.i) /.tan (/.* /.i) (/.* /.-one))
- (/.tanh angle)))
- )))
+ (all _.and
+ (_.cover [/.sinh]
+ (/.approximately? ..margin_of_error
+ (|> angle (/.* /.i) /.sin (/.* /.i) (/.* /.-one))
+ (/.sinh angle)))
+ (_.cover [/.cosh]
+ (/.approximately? ..margin_of_error
+ (|> angle (/.* /.i) /.cos)
+ (/.cosh angle)))
+ (_.cover [/.tanh]
+ (/.approximately? ..margin_of_error
+ (|> angle (/.* /.i) /.tan (/.* /.i) (/.* /.-one))
+ (/.tanh angle)))
+ )))
(def: exponentiation&logarithm
Test
(do random.monad
[x ..random]
- ($_ _.and
- (_.cover [/.pow /.root_2]
- (|> x (/.pow (/.complex +2.0)) /.root_2 (/.approximately? ..margin_of_error x)))
- (_.cover [/.pow']
- (|> x (/.pow' +2.0) (/.pow' +0.5) (/.approximately? ..margin_of_error x)))
- (_.cover [/.log /.exp]
- (|> x /.log /.exp (/.approximately? ..margin_of_error x)))
- )))
+ (all _.and
+ (_.cover [/.pow /.root_2]
+ (|> x (/.pow (/.complex +2.0)) /.root_2 (/.approximately? ..margin_of_error x)))
+ (_.cover [/.pow']
+ (|> x (/.pow' +2.0) (/.pow' +0.5) (/.approximately? ..margin_of_error x)))
+ (_.cover [/.log /.exp]
+ (|> x /.log /.exp (/.approximately? ..margin_of_error x)))
+ )))
(def: root
Test
@@ -268,17 +268,17 @@
Test
(<| (_.covering /._)
(_.for [/.Complex])
- ($_ _.and
- (_.for [/.= /.equivalence]
- ($equivalence.spec /.equivalence ..random))
+ (all _.and
+ (_.for [/.= /.equivalence]
+ ($equivalence.spec /.equivalence ..random))
- ..construction
- ..constant
- ..absolute_value&argument
- ..number
- ..conjugate&reciprocal&signum&negation
- ..trigonometry
- ..hyperbolic
- ..exponentiation&logarithm
- ..root
- )))
+ ..construction
+ ..constant
+ ..absolute_value&argument
+ ..number
+ ..conjugate&reciprocal&signum&negation
+ ..trigonometry
+ ..hyperbolic
+ ..exponentiation&logarithm
+ ..root
+ )))
diff --git a/stdlib/source/test/lux/math/number/frac.lux b/stdlib/source/test/lux/math/number/frac.lux
index 22f56af05..66334e80c 100644
--- a/stdlib/source/test/lux/math/number/frac.lux
+++ b/stdlib/source/test/lux/math/number/frac.lux
@@ -34,91 +34,91 @@
Test
(do random.monad
[sample random.safe_frac]
- ($_ _.and
- (_.cover [/.biggest]
- (/.<= /.biggest sample))
- (_.cover [/.positive_infinity]
- (/.< /.positive_infinity sample))
- (_.cover [/.smallest]
- (bit#= (/.positive? sample)
- (/.>= /.smallest sample)))
- (_.cover [/.negative_infinity]
- (/.> /.negative_infinity sample))
- (_.cover [/.not_a_number /.not_a_number?]
- (and (/.not_a_number? /.not_a_number)
- (not (or (/.= /.not_a_number sample)
- (/.not_a_number? sample)))))
- )))
+ (all _.and
+ (_.cover [/.biggest]
+ (/.<= /.biggest sample))
+ (_.cover [/.positive_infinity]
+ (/.< /.positive_infinity sample))
+ (_.cover [/.smallest]
+ (bit#= (/.positive? sample)
+ (/.>= /.smallest sample)))
+ (_.cover [/.negative_infinity]
+ (/.> /.negative_infinity sample))
+ (_.cover [/.not_a_number /.not_a_number?]
+ (and (/.not_a_number? /.not_a_number)
+ (not (or (/.= /.not_a_number sample)
+ (/.not_a_number? sample)))))
+ )))
(def: predicate
Test
(do [! random.monad]
[sample ..random
shift (# ! each /.abs ..random)]
- ($_ _.and
- (_.cover [/.negative?]
- (bit#= (/.negative? sample)
- (/.< +0.0 sample)))
- (_.cover [/.positive?]
- (bit#= (/.positive? sample)
- (/.> +0.0 sample)))
- (_.cover [/.zero?]
- (bit#= (/.zero? sample)
- (/.= +0.0 sample)))
- (_.cover [/.approximately?]
- (and (/.approximately? /.smallest sample sample)
- (/.approximately? (/.+ +1.0 shift) sample (/.+ shift sample))))
- (_.cover [/.number?]
- (and (not (/.number? /.not_a_number))
- (not (/.number? /.positive_infinity))
- (not (/.number? /.negative_infinity))
- (/.number? sample)))
- )))
+ (all _.and
+ (_.cover [/.negative?]
+ (bit#= (/.negative? sample)
+ (/.< +0.0 sample)))
+ (_.cover [/.positive?]
+ (bit#= (/.positive? sample)
+ (/.> +0.0 sample)))
+ (_.cover [/.zero?]
+ (bit#= (/.zero? sample)
+ (/.= +0.0 sample)))
+ (_.cover [/.approximately?]
+ (and (/.approximately? /.smallest sample sample)
+ (/.approximately? (/.+ +1.0 shift) sample (/.+ shift sample))))
+ (_.cover [/.number?]
+ (and (not (/.number? /.not_a_number))
+ (not (/.number? /.positive_infinity))
+ (not (/.number? /.negative_infinity))
+ (/.number? sample)))
+ )))
(def: conversion
Test
- ($_ _.and
- (do [! random.monad]
- [expected (# ! each (n.% 1,000,000) random.nat)]
- (_.cover [/.nat]
- (|> expected n.frac /.nat (n.= expected))))
- (do [! random.monad]
- [expected (# ! each (i.% +1,000,000) random.int)]
- (_.cover [/.int]
- (|> expected i.frac /.int (i.= expected))))
- (do [! random.monad]
- [expected (# ! each (|>> (i64.left_shifted 52) .rev)
- random.nat)]
- (_.cover [/.rev]
- (|> expected r.frac /.rev (r.= expected))))
- ))
+ (all _.and
+ (do [! random.monad]
+ [expected (# ! each (n.% 1,000,000) random.nat)]
+ (_.cover [/.nat]
+ (|> expected n.frac /.nat (n.= expected))))
+ (do [! random.monad]
+ [expected (# ! each (i.% +1,000,000) random.int)]
+ (_.cover [/.int]
+ (|> expected i.frac /.int (i.= expected))))
+ (do [! random.monad]
+ [expected (# ! each (|>> (i64.left_shifted 52) .rev)
+ random.nat)]
+ (_.cover [/.rev]
+ (|> expected r.frac /.rev (r.= expected))))
+ ))
(def: signature
Test
- (`` ($_ _.and
- (_.for [/.equivalence /.=]
- ($equivalence.spec /.equivalence random.safe_frac))
- (_.for [/.hash]
- ($hash.spec /.hash random.frac))
- (_.for [/.order /.<]
- ($order.spec /.order random.safe_frac))
- (~~ (template [<composite> <monoid>]
- [(_.for [<monoid> <composite>]
- ($monoid.spec /.equivalence <monoid> ..random))]
+ (`` (all _.and
+ (_.for [/.equivalence /.=]
+ ($equivalence.spec /.equivalence random.safe_frac))
+ (_.for [/.hash]
+ ($hash.spec /.hash random.frac))
+ (_.for [/.order /.<]
+ ($order.spec /.order random.safe_frac))
+ (~~ (template [<composite> <monoid>]
+ [(_.for [<monoid> <composite>]
+ ($monoid.spec /.equivalence <monoid> ..random))]
- [/.+ /.addition]
- [/.* /.multiplication]
+ [/.+ /.addition]
+ [/.* /.multiplication]
- [/.min /.minimum]
- [/.max /.maximum]
- ))
- (~~ (template [<codec>]
- [(_.for [<codec>]
- ($codec.spec /.equivalence <codec> random.safe_frac))]
+ [/.min /.minimum]
+ [/.max /.maximum]
+ ))
+ (~~ (template [<codec>]
+ [(_.for [<codec>]
+ ($codec.spec /.equivalence <codec> random.safe_frac))]
- [/.binary] [/.octal] [/.decimal] [/.hex]
- ))
- )))
+ [/.binary] [/.octal] [/.decimal] [/.hex]
+ ))
+ )))
(with_expansions [<jvm> (these (ffi.import: java/lang/Double
"[1]::[0]"
@@ -138,253 +138,253 @@
(def: test|math
Test
- ($_ _.and
- (do [! random.monad]
- [.let [~= (/.approximately? ..margin_of_error)]
- angle (|> random.safe_frac (# ! each (/.* /.tau)))]
- ($_ _.and
- (_.cover [/.sin /.asin]
- (trigonometric_symmetry /.sin /.asin angle))
- (_.cover [/.cos /.acos]
- (trigonometric_symmetry /.cos /.acos angle))
- (_.cover [/.tan /.atan]
- (trigonometric_symmetry /.tan /.atan angle))
- (_.cover [/.tau]
- (and (and (~= +0.0 (/.sin /.tau))
- (~= +1.0 (/.cos /.tau)))
- (and (~= +0.0 (/.sin (/./ +2.0 /.tau)))
- (~= -1.0 (/.cos (/./ +2.0 /.tau))))
- (and (~= +1.0 (/.sin (/./ +4.0 /.tau)))
- (~= +0.0 (/.cos (/./ +4.0 /.tau))))
- (and (~= -1.0 (/.sin (/.* +3.0 (/./ +4.0 /.tau))))
- (~= +0.0 (/.cos (/.* +3.0 (/./ +4.0 /.tau)))))
- (let [x2+y2 (/.+ (/.pow +2.0 (/.sin angle))
- (/.pow +2.0 (/.cos angle)))]
- (~= +1.0 x2+y2))))
- (_.cover [/.pi]
- (~= (/./ +2.0 /.tau) /.pi))
- ))
- (do [! random.monad]
- [sample (|> random.safe_frac (# ! each (/.* +1000.0)))]
- ($_ _.and
- (_.cover [/.ceil]
- (let [ceil'd (/.ceil sample)]
- (and (|> ceil'd /.int i.frac (/.= ceil'd))
- (/.>= sample ceil'd)
- (/.<= +1.0 (/.- sample ceil'd)))))
- (_.cover [/.floor]
- (let [floor'd (/.floor sample)]
- (and (|> floor'd /.int i.frac (/.= floor'd))
- (/.<= sample floor'd)
- (/.<= +1.0 (/.- floor'd sample)))))
- (_.cover [/.round]
- (let [round'd (/.round sample)]
- (and (|> round'd /.int i.frac (/.= round'd))
- (/.<= +1.0 (/.abs (/.- sample round'd))))))
- (_.cover [/.root_2]
- (let [sample (/.abs sample)]
+ (all _.and
+ (do [! random.monad]
+ [.let [~= (/.approximately? ..margin_of_error)]
+ angle (|> random.safe_frac (# ! each (/.* /.tau)))]
+ (all _.and
+ (_.cover [/.sin /.asin]
+ (trigonometric_symmetry /.sin /.asin angle))
+ (_.cover [/.cos /.acos]
+ (trigonometric_symmetry /.cos /.acos angle))
+ (_.cover [/.tan /.atan]
+ (trigonometric_symmetry /.tan /.atan angle))
+ (_.cover [/.tau]
+ (and (and (~= +0.0 (/.sin /.tau))
+ (~= +1.0 (/.cos /.tau)))
+ (and (~= +0.0 (/.sin (/./ +2.0 /.tau)))
+ (~= -1.0 (/.cos (/./ +2.0 /.tau))))
+ (and (~= +1.0 (/.sin (/./ +4.0 /.tau)))
+ (~= +0.0 (/.cos (/./ +4.0 /.tau))))
+ (and (~= -1.0 (/.sin (/.* +3.0 (/./ +4.0 /.tau))))
+ (~= +0.0 (/.cos (/.* +3.0 (/./ +4.0 /.tau)))))
+ (let [x2+y2 (/.+ (/.pow +2.0 (/.sin angle))
+ (/.pow +2.0 (/.cos angle)))]
+ (~= +1.0 x2+y2))))
+ (_.cover [/.pi]
+ (~= (/./ +2.0 /.tau) /.pi))
+ ))
+ (do [! random.monad]
+ [sample (|> random.safe_frac (# ! each (/.* +1000.0)))]
+ (all _.and
+ (_.cover [/.ceil]
+ (let [ceil'd (/.ceil sample)]
+ (and (|> ceil'd /.int i.frac (/.= ceil'd))
+ (/.>= sample ceil'd)
+ (/.<= +1.0 (/.- sample ceil'd)))))
+ (_.cover [/.floor]
+ (let [floor'd (/.floor sample)]
+ (and (|> floor'd /.int i.frac (/.= floor'd))
+ (/.<= sample floor'd)
+ (/.<= +1.0 (/.- floor'd sample)))))
+ (_.cover [/.round]
+ (let [round'd (/.round sample)]
+ (and (|> round'd /.int i.frac (/.= round'd))
+ (/.<= +1.0 (/.abs (/.- sample round'd))))))
+ (_.cover [/.root_2]
+ (let [sample (/.abs sample)]
+ (|> sample
+ /.root_2
+ (/.pow +2.0)
+ (/.approximately? ..margin_of_error sample))))
+ (_.cover [/.root_3]
(|> sample
- /.root_2
- (/.pow +2.0)
- (/.approximately? ..margin_of_error sample))))
- (_.cover [/.root_3]
- (|> sample
- /.root_3
- (/.pow +3.0)
- (/.approximately? ..margin_of_error sample)))
- ))
- (do [! random.monad]
- [.let [~= (/.approximately? ..margin_of_error)]
- sample (# ! each (/.* +10.0) random.safe_frac)
- power (# ! each (|>> (n.% 10) ++ n.frac) random.nat)]
- ($_ _.and
- (_.cover [/.exp /.log]
- (|> sample /.exp /.log (/.approximately? +0.000000000000001 sample)))
- (_.cover [/.e]
- (~= +1.0 (/.log /.e)))
- (_.cover [/.pow /.log_by]
- (let [sample (/.abs sample)]
- (|> sample
- (/.pow power)
- (/.log_by sample)
- (~= power))))
- ))
- (do [! random.monad]
- [.let [~= (/.approximately? ..margin_of_error)]
- angle (# ! each (/.* /.tau) random.safe_frac)
- sample (# ! each /.abs random.safe_frac)
- big (# ! each (/.* +1,000,000,000.00) random.safe_frac)]
- (template.let [(odd! <function>)
- [(_.cover [<function>]
- (~= (/.opposite (<function> angle))
- (<function> (/.opposite angle))))]
+ /.root_3
+ (/.pow +3.0)
+ (/.approximately? ..margin_of_error sample)))
+ ))
+ (do [! random.monad]
+ [.let [~= (/.approximately? ..margin_of_error)]
+ sample (# ! each (/.* +10.0) random.safe_frac)
+ power (# ! each (|>> (n.% 10) ++ n.frac) random.nat)]
+ (all _.and
+ (_.cover [/.exp /.log]
+ (|> sample /.exp /.log (/.approximately? +0.000000000000001 sample)))
+ (_.cover [/.e]
+ (~= +1.0 (/.log /.e)))
+ (_.cover [/.pow /.log_by]
+ (let [sample (/.abs sample)]
+ (|> sample
+ (/.pow power)
+ (/.log_by sample)
+ (~= power))))
+ ))
+ (do [! random.monad]
+ [.let [~= (/.approximately? ..margin_of_error)]
+ angle (# ! each (/.* /.tau) random.safe_frac)
+ sample (# ! each /.abs random.safe_frac)
+ big (# ! each (/.* +1,000,000,000.00) random.safe_frac)]
+ (template.let [(odd! <function>)
+ [(_.cover [<function>]
+ (~= (/.opposite (<function> angle))
+ (<function> (/.opposite angle))))]
- (even! <function>)
- [(_.cover [<function>]
- (~= (<function> angle)
- (<function> (/.opposite angle))))]
+ (even! <function>)
+ [(_.cover [<function>]
+ (~= (<function> angle)
+ (<function> (/.opposite angle))))]
- (inverse! <left> <right> <input>)
- [(_.cover [<left> <right>]
- (~= (<right> <input>)
- (<left> (/./ <input> +1.0))))]]
- ($_ _.and
- (odd! /.sinh)
- (even! /.cosh)
- (odd! /.tanh)
- (odd! /.coth)
- (even! /.sech)
- (odd! /.csch)
+ (inverse! <left> <right> <input>)
+ [(_.cover [<left> <right>]
+ (~= (<right> <input>)
+ (<left> (/./ <input> +1.0))))]]
+ (all _.and
+ (odd! /.sinh)
+ (even! /.cosh)
+ (odd! /.tanh)
+ (odd! /.coth)
+ (even! /.sech)
+ (odd! /.csch)
- (inverse! /.acosh /.asech sample)
- (inverse! /.asinh /.acsch sample)
- (inverse! /.atanh /.acoth big)
- )))
- (do [! random.monad]
- [x (# ! each (|>> (/.* +10.0) /.abs) random.safe_frac)
- y (# ! each (|>> (/.* +10.0) /.abs) random.safe_frac)]
- (_.cover [/.hypotenuse]
- (let [h (/.hypotenuse x y)]
- (and (/.>= x h)
- (/.>= y h)))))
- (do [! random.monad]
- [.let [~= (/.approximately? ..margin_of_error)
- tau/4 (/./ +4.0 /.tau)]
- x (# ! each (/.* tau/4) random.safe_frac)
- y (# ! each (/.* tau/4) random.safe_frac)]
- (_.cover [/.atan_2]
- (let [expected (/.atan_2 x y)
- actual (if (/.> +0.0 x)
- (/.atan (/./ x y))
- (if (/.< +0.0 y)
- (/.- /.pi (/.atan (/./ x y)))
- (/.+ /.pi (/.atan (/./ x y)))))]
- (and (~= expected actual)
- (~= tau/4 (/.atan_2 +0.0 (/.abs y)))
- (~= (/.opposite tau/4) (/.atan_2 +0.0 (/.opposite (/.abs y))))
- (/.not_a_number? (/.atan_2 +0.0 +0.0))))))
- (do [! random.monad]
- [of (# ! each (|>> (n.% 10) ++) random.nat)]
- (_.cover [/.factorial]
- (and (n.= 1 (/.factorial 0))
- (|> (/.factorial of) (n.% of) (n.= 0)))))
- ))
+ (inverse! /.acosh /.asech sample)
+ (inverse! /.asinh /.acsch sample)
+ (inverse! /.atanh /.acoth big)
+ )))
+ (do [! random.monad]
+ [x (# ! each (|>> (/.* +10.0) /.abs) random.safe_frac)
+ y (# ! each (|>> (/.* +10.0) /.abs) random.safe_frac)]
+ (_.cover [/.hypotenuse]
+ (let [h (/.hypotenuse x y)]
+ (and (/.>= x h)
+ (/.>= y h)))))
+ (do [! random.monad]
+ [.let [~= (/.approximately? ..margin_of_error)
+ tau/4 (/./ +4.0 /.tau)]
+ x (# ! each (/.* tau/4) random.safe_frac)
+ y (# ! each (/.* tau/4) random.safe_frac)]
+ (_.cover [/.atan_2]
+ (let [expected (/.atan_2 x y)
+ actual (if (/.> +0.0 x)
+ (/.atan (/./ x y))
+ (if (/.< +0.0 y)
+ (/.- /.pi (/.atan (/./ x y)))
+ (/.+ /.pi (/.atan (/./ x y)))))]
+ (and (~= expected actual)
+ (~= tau/4 (/.atan_2 +0.0 (/.abs y)))
+ (~= (/.opposite tau/4) (/.atan_2 +0.0 (/.opposite (/.abs y))))
+ (/.not_a_number? (/.atan_2 +0.0 +0.0))))))
+ (do [! random.monad]
+ [of (# ! each (|>> (n.% 10) ++) random.nat)]
+ (_.cover [/.factorial]
+ (and (n.= 1 (/.factorial 0))
+ (|> (/.factorial of) (n.% of) (n.= 0)))))
+ ))
(def: .public test
Test
(<| (_.covering /._)
(_.for [.Frac])
- ($_ _.and
- (do random.monad
- [left random.safe_frac
- right random.safe_frac]
- ($_ _.and
- (_.cover [/.>]
- (bit#= (/.> left right)
- (/.< right left)))
- (_.cover [/.<= /.>=]
- (bit#= (/.<= left right)
- (/.>= right left)))
- ))
- (do random.monad
- [sample random.safe_frac]
- ($_ _.and
- (_.cover [/.-]
- (and (/.= +0.0 (/.- sample sample))
- (/.= sample (/.- +0.0 sample))
- (/.= (/.opposite sample)
- (/.- sample +0.0))))
- (_.cover [/./]
- (and (/.= +1.0 (/./ sample sample))
- (/.= sample (/./ +1.0 sample))))
- (_.cover [/.abs]
- (bit#= (/.> sample (/.abs sample))
- (/.negative? sample)))
- (_.cover [/.signum]
- (/.= (/.abs sample)
- (/.* (/.signum sample) sample)))
- ))
- (do random.monad
- [left (random.only (|>> (/.= +0.0) not)
- ..random)
- right ..random]
- ($_ _.and
- (_.cover [/.%]
- (let [rem (/.% left right)
- div (|> right (/.- rem) (/./ left))]
- (/.= right
- (|> div (/.* left) (/.+ rem)))))
- (_.cover [/./%]
- (let [[div rem] (/./% left right)]
- (and (/.= div (/./ left right))
- (/.= rem (/.% left right)))))
- (_.cover [/.mod]
- (or (and (/.= +0.0 (/.% left right))
- (/.= +0.0 (/.mod left right)))
- (and (/.= (/.signum left)
- (/.signum (/.mod left right)))
- (/.= (/.signum right)
- (/.signum (/.% left right)))
- (if (/.= (/.signum left) (/.signum right))
- (/.= (/.% left right)
- (/.mod left right))
- (/.= (/.+ left (/.% left right))
- (/.mod left right))))))
- ))
- (with_expansions [<jvm> ($_ _.and
- (let [test (is (-> Frac Bit)
- (function (_ value)
- (n.= (.nat (ffi.of_long (java/lang/Double::doubleToRawLongBits (ffi.as_double value))))
- (/.bits value))))]
+ (all _.and
+ (do random.monad
+ [left random.safe_frac
+ right random.safe_frac]
+ (all _.and
+ (_.cover [/.>]
+ (bit#= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit#= (/.<= left right)
+ (/.>= right left)))
+ ))
+ (do random.monad
+ [sample random.safe_frac]
+ (all _.and
+ (_.cover [/.-]
+ (and (/.= +0.0 (/.- sample sample))
+ (/.= sample (/.- +0.0 sample))
+ (/.= (/.opposite sample)
+ (/.- sample +0.0))))
+ (_.cover [/./]
+ (and (/.= +1.0 (/./ sample sample))
+ (/.= sample (/./ +1.0 sample))))
+ (_.cover [/.abs]
+ (bit#= (/.> sample (/.abs sample))
+ (/.negative? sample)))
+ (_.cover [/.signum]
+ (/.= (/.abs sample)
+ (/.* (/.signum sample) sample)))
+ ))
+ (do random.monad
+ [left (random.only (|>> (/.= +0.0) not)
+ ..random)
+ right ..random]
+ (all _.and
+ (_.cover [/.%]
+ (let [rem (/.% left right)
+ div (|> right (/.- rem) (/./ left))]
+ (/.= right
+ (|> div (/.* left) (/.+ rem)))))
+ (_.cover [/./%]
+ (let [[div rem] (/./% left right)]
+ (and (/.= div (/./ left right))
+ (/.= rem (/.% left right)))))
+ (_.cover [/.mod]
+ (or (and (/.= +0.0 (/.% left right))
+ (/.= +0.0 (/.mod left right)))
+ (and (/.= (/.signum left)
+ (/.signum (/.mod left right)))
+ (/.= (/.signum right)
+ (/.signum (/.% left right)))
+ (if (/.= (/.signum left) (/.signum right))
+ (/.= (/.% left right)
+ (/.mod left right))
+ (/.= (/.+ left (/.% left right))
+ (/.mod left right))))))
+ ))
+ (with_expansions [<jvm> (all _.and
+ (let [test (is (-> Frac Bit)
+ (function (_ value)
+ (n.= (.nat (ffi.of_long (java/lang/Double::doubleToRawLongBits (ffi.as_double value))))
+ (/.bits value))))]
+ (do random.monad
+ [sample random.frac]
+ (_.cover [/.bits]
+ (and (test sample)
+ (test /.biggest)
+ (test /.smallest)
+ (test /.not_a_number)
+ (test /.positive_infinity)
+ (test /.negative_infinity)))))
(do random.monad
- [sample random.frac]
- (_.cover [/.bits]
- (and (test sample)
- (test /.biggest)
- (test /.smallest)
- (test /.not_a_number)
- (test /.positive_infinity)
- (test /.negative_infinity)))))
- (do random.monad
- [sample random.i64]
- (_.cover [/.of_bits]
- (let [expected (ffi.of_double (java/lang/Double::longBitsToDouble (ffi.as_long sample)))
- actual (/.of_bits sample)]
- (or (/.= expected actual)
- (and (/.not_a_number? expected)
- (/.not_a_number? actual))))))
- )]
- (for @.old <jvm>
- @.jvm <jvm>
- (let [test (is (-> Frac Bit)
- (function (_ expected)
- (let [actual (|> expected /.bits /.of_bits)]
- (or (/.= expected actual)
- (and (/.not_a_number? expected)
- (/.not_a_number? actual))))))]
- (do random.monad
- [sample random.frac]
- (_.cover [/.bits /.of_bits]
- (and (test sample)
- (test /.biggest)
- (test /.smallest)
- (test /.not_a_number)
- (test /.positive_infinity)
- (test /.negative_infinity)))))))
- (do random.monad
- [expected random.safe_frac]
- (_.cover [/.opposite]
- (let [subtraction!
- (/.= +0.0 (/.+ (/.opposite expected) expected))
+ [sample random.i64]
+ (_.cover [/.of_bits]
+ (let [expected (ffi.of_double (java/lang/Double::longBitsToDouble (ffi.as_long sample)))
+ actual (/.of_bits sample)]
+ (or (/.= expected actual)
+ (and (/.not_a_number? expected)
+ (/.not_a_number? actual))))))
+ )]
+ (for @.old <jvm>
+ @.jvm <jvm>
+ (let [test (is (-> Frac Bit)
+ (function (_ expected)
+ (let [actual (|> expected /.bits /.of_bits)]
+ (or (/.= expected actual)
+ (and (/.not_a_number? expected)
+ (/.not_a_number? actual))))))]
+ (do random.monad
+ [sample random.frac]
+ (_.cover [/.bits /.of_bits]
+ (and (test sample)
+ (test /.biggest)
+ (test /.smallest)
+ (test /.not_a_number)
+ (test /.positive_infinity)
+ (test /.negative_infinity)))))))
+ (do random.monad
+ [expected random.safe_frac]
+ (_.cover [/.opposite]
+ (let [subtraction!
+ (/.= +0.0 (/.+ (/.opposite expected) expected))
- inverse!
- (|> expected /.opposite /.opposite (/.= expected))]
- (and subtraction!
- inverse!))))
+ inverse!
+ (|> expected /.opposite /.opposite (/.= expected))]
+ (and subtraction!
+ inverse!))))
- ..constant
- ..predicate
- ..conversion
- ..signature
- ..test|math
- )))
+ ..constant
+ ..predicate
+ ..conversion
+ ..signature
+ ..test|math
+ )))
diff --git a/stdlib/source/test/lux/math/number/i16.lux b/stdlib/source/test/lux/math/number/i16.lux
index b8d99c061..8321376d8 100644
--- a/stdlib/source/test/lux/math/number/i16.lux
+++ b/stdlib/source/test/lux/math/number/i16.lux
@@ -1,18 +1,18 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- [abstract
- [monad {"+" do}]
- [\\specification
- ["$[0]" equivalence]]]
- [math
- ["[0]" random {"+" Random}]]]]
- [\\library
- ["[0]" /
- ["/[1]" // "_"
- ["i" int]
- ["[1][0]" i64]]]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ [abstract
+ [monad {"+" do}]
+ [\\specification
+ ["$[0]" equivalence]]]
+ [math
+ ["[0]" random {"+" Random}]]]]
+ [\\library
+ ["[0]" /
+ ["/[1]" // "_"
+ ["i" int]
+ ["[1][0]" i64]]]])
(def: .public random
(Random /.I16)
@@ -28,11 +28,11 @@
.int
++)]
expected (# ! each (i.% limit) random.int)]
- ($_ _.and
- (_.for [/.equivalence]
- ($equivalence.spec /.equivalence ..random))
-
- (_.cover [/.i16 /.i64 /.width]
- (let [actual (|> expected .i64 /.i16 /.i64)]
- (# //i64.equivalence = expected actual)))
- ))))
+ (all _.and
+ (_.for [/.equivalence]
+ ($equivalence.spec /.equivalence ..random))
+
+ (_.cover [/.i16 /.i64 /.width]
+ (let [actual (|> expected .i64 /.i16 /.i64)]
+ (# //i64.equivalence = expected actual)))
+ ))))
diff --git a/stdlib/source/test/lux/math/number/i32.lux b/stdlib/source/test/lux/math/number/i32.lux
index 4d44e5d24..ed7e88201 100644
--- a/stdlib/source/test/lux/math/number/i32.lux
+++ b/stdlib/source/test/lux/math/number/i32.lux
@@ -1,18 +1,18 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- [abstract
- [monad {"+" do}]
- [\\specification
- ["$[0]" equivalence]]]
- [math
- ["[0]" random {"+" Random}]]]]
- [\\library
- ["[0]" /
- ["/[1]" // "_"
- ["i" int]
- ["[1][0]" i64]]]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ [abstract
+ [monad {"+" do}]
+ [\\specification
+ ["$[0]" equivalence]]]
+ [math
+ ["[0]" random {"+" Random}]]]]
+ [\\library
+ ["[0]" /
+ ["/[1]" // "_"
+ ["i" int]
+ ["[1][0]" i64]]]])
(def: .public random
(Random /.I32)
@@ -28,11 +28,11 @@
.int
++)]
expected (# ! each (i.% limit) random.int)]
- ($_ _.and
- (_.for [/.equivalence]
- ($equivalence.spec /.equivalence ..random))
-
- (_.cover [/.i32 /.i64 /.width]
- (let [actual (|> expected .i64 /.i32 /.i64)]
- (# //i64.equivalence = expected actual)))
- ))))
+ (all _.and
+ (_.for [/.equivalence]
+ ($equivalence.spec /.equivalence ..random))
+
+ (_.cover [/.i32 /.i64 /.width]
+ (let [actual (|> expected .i64 /.i32 /.i64)]
+ (# //i64.equivalence = expected actual)))
+ ))))
diff --git a/stdlib/source/test/lux/math/number/i64.lux b/stdlib/source/test/lux/math/number/i64.lux
index ec6b56f7e..805c212b1 100644
--- a/stdlib/source/test/lux/math/number/i64.lux
+++ b/stdlib/source/test/lux/math/number/i64.lux
@@ -23,51 +23,51 @@
(do [! random.monad]
[pattern random.nat
idx (# ! each (n.% /.width) random.nat)]
- ($_ _.and
- (_.cover [/.one? /.one]
- (if (/.one? idx pattern)
- (#= pattern (/.one idx pattern))
- (not (#= pattern (/.one idx pattern)))))
- (_.cover [/.zero? /.zero]
- (if (/.zero? idx pattern)
- (#= pattern (/.zero idx pattern))
- (not (#= pattern (/.zero idx pattern)))))
- (_.cover [/.flipped]
- (#= (/.flipped idx pattern)
- (if (/.one? idx pattern)
- (/.zero idx pattern)
- (/.one idx pattern))))
- (_.cover [/.bit]
- (bit#= (/.zero? idx pattern)
- (#= /.false (/.and (/.bit idx) pattern))))
- )))
+ (all _.and
+ (_.cover [/.one? /.one]
+ (if (/.one? idx pattern)
+ (#= pattern (/.one idx pattern))
+ (not (#= pattern (/.one idx pattern)))))
+ (_.cover [/.zero? /.zero]
+ (if (/.zero? idx pattern)
+ (#= pattern (/.zero idx pattern))
+ (not (#= pattern (/.zero idx pattern)))))
+ (_.cover [/.flipped]
+ (#= (/.flipped idx pattern)
+ (if (/.one? idx pattern)
+ (/.zero idx pattern)
+ (/.one idx pattern))))
+ (_.cover [/.bit]
+ (bit#= (/.zero? idx pattern)
+ (#= /.false (/.and (/.bit idx) pattern))))
+ )))
(def: shift
Test
(do [! random.monad]
[pattern random.nat]
- ($_ _.and
- (do !
- [idx (# ! each (|>> (n.% (-- /.width)) ++) random.nat)]
- (_.cover [/.left_shifted /.right_shifted]
- (let [nullity!
- (and (#= pattern (/.left_shifted 0 pattern))
- (#= pattern (/.right_shifted 0 pattern)))
+ (all _.and
+ (do !
+ [idx (# ! each (|>> (n.% (-- /.width)) ++) random.nat)]
+ (_.cover [/.left_shifted /.right_shifted]
+ (let [nullity!
+ (and (#= pattern (/.left_shifted 0 pattern))
+ (#= pattern (/.right_shifted 0 pattern)))
- idempotency!
- (and (#= pattern (/.left_shifted /.width pattern))
- (#= pattern (/.right_shifted /.width pattern)))
-
- movement!
- (let [shift (n.- idx /.width)]
- (#= (/.and (/.mask idx) pattern)
- (|> pattern
- (/.left_shifted shift)
- (/.right_shifted shift))))]
- (and nullity!
idempotency!
- movement!))))
- )))
+ (and (#= pattern (/.left_shifted /.width pattern))
+ (#= pattern (/.right_shifted /.width pattern)))
+
+ movement!
+ (let [shift (n.- idx /.width)]
+ (#= (/.and (/.mask idx) pattern)
+ (|> pattern
+ (/.left_shifted shift)
+ (/.right_shifted shift))))]
+ (and nullity!
+ idempotency!
+ movement!))))
+ )))
(def: mask
Test
@@ -76,47 +76,47 @@
[pattern random.nat
idx (# ! each (n.% /.width) random.nat)
signed random.int]
- ($_ _.and
- (_.cover [/.sign]
- (bit#= (#= (.i64 0) (/.and /.sign signed))
- (i.positive? signed)))
- (_.cover [/.mask]
- (let [mask (/.mask idx)
- idempotency! (#= (/.and mask pattern)
- (/.and mask (/.and mask pattern)))
+ (all _.and
+ (_.cover [/.sign]
+ (bit#= (#= (.i64 0) (/.and /.sign signed))
+ (i.positive? signed)))
+ (_.cover [/.mask]
+ (let [mask (/.mask idx)
+ idempotency! (#= (/.and mask pattern)
+ (/.and mask (/.and mask pattern)))
- limit (++ (.nat mask))
- limit! (if (n.< limit pattern)
- (#= pattern (/.and mask pattern))
- (n.< limit (/.and mask pattern)))
+ limit (++ (.nat mask))
+ limit! (if (n.< limit pattern)
+ (#= pattern (/.and mask pattern))
+ (n.< limit (/.and mask pattern)))
- empty! (#= /.false (/.mask 0))
- full! (#= /.true (/.mask /.width))]
- (and idempotency!
- limit!
+ empty! (#= /.false (/.mask 0))
+ full! (#= /.true (/.mask /.width))]
+ (and idempotency!
+ limit!
- empty!
- full!)))
- (do !
- [size (# ! each (n.% /.width) random.nat)
- .let [spare (n.- size /.width)]
- offset (# ! each (n.% spare) random.nat)]
- (_.cover [/.region]
- (case size
- 0 (#= /.false (/.region offset size))
- _ (#= (|> pattern
- ... NNNNYYYYNNNN
- (/.right_shifted offset)
- ... ____NNNNYYYY
- (/.left_shifted spare)
- ... YYYY________
- (/.right_shifted spare)
- ... ________YYYY
- (/.left_shifted offset)
- ... ____YYYY____
- )
- (/.and (/.region offset size) pattern)))))
- ))))
+ empty!
+ full!)))
+ (do !
+ [size (# ! each (n.% /.width) random.nat)
+ .let [spare (n.- size /.width)]
+ offset (# ! each (n.% spare) random.nat)]
+ (_.cover [/.region]
+ (case size
+ 0 (#= /.false (/.region offset size))
+ _ (#= (|> pattern
+ ... NNNNYYYYNNNN
+ (/.right_shifted offset)
+ ... ____NNNNYYYY
+ (/.left_shifted spare)
+ ... YYYY________
+ (/.right_shifted spare)
+ ... ________YYYY
+ (/.left_shifted offset)
+ ... ____YYYY____
+ )
+ (/.and (/.region offset size) pattern)))))
+ ))))
(def: sub
Test
@@ -139,25 +139,25 @@
(-> (-> I64 (I64 size)) (Random (I64 size))))
(function (_ narrow)
(# random.functor each narrow random.i64)))]]
- ($_ _.and
- ($equivalence.spec (# sub sub_equivalence) (random (# sub narrow)))
- (_.cover [/.sub]
- (let [actual (|> expected .i64 (# sub narrow) (# sub wide))]
- (#= expected actual)))
- ))))))
+ (all _.and
+ ($equivalence.spec (# sub sub_equivalence) (random (# sub narrow)))
+ (_.cover [/.sub]
+ (let [actual (|> expected .i64 (# sub narrow) (# sub wide))]
+ (#= expected actual)))
+ ))))))
(def: signature
Test
- ($_ _.and
- (_.for [/.equivalence]
- ($equivalence.spec /.equivalence random.i64))
- (_.for [/.hash]
- ($hash.spec /.hash random.i64))
- (_.for [/.disjunction]
- ($monoid.spec n.equivalence /.disjunction random.nat))
- (_.for [/.conjunction]
- ($monoid.spec n.equivalence /.conjunction random.nat))
- ))
+ (all _.and
+ (_.for [/.equivalence]
+ ($equivalence.spec /.equivalence random.i64))
+ (_.for [/.hash]
+ ($hash.spec /.hash random.i64))
+ (_.for [/.disjunction]
+ ($monoid.spec n.equivalence /.disjunction random.nat))
+ (_.for [/.conjunction]
+ ($monoid.spec n.equivalence /.conjunction random.nat))
+ ))
(def: .public test
Test
@@ -166,100 +166,100 @@
(do [! random.monad]
[pattern random.nat
idx (# ! each (n.% /.width) random.nat)]
- ($_ _.and
- (_.cover [/.width /.bits_per_byte /.bytes_per_i64]
- (and (n.= /.bytes_per_i64
- (n./ /.bits_per_byte /.width))
- (n.= /.bits_per_byte
- (n./ /.bytes_per_i64 /.width))))
- (_.cover [/.false]
- (n.= 0 (/.ones /.false)))
- (_.cover [/.or]
- (and (#= /.true (/.or /.true pattern))
- (#= pattern (/.or /.false pattern))))
- (_.cover [/.true]
- (n.= /.width (/.ones /.true)))
- (_.cover [/.and]
- (and (#= pattern (/.and /.true pattern))
- (#= /.false (/.and /.false pattern))))
- (_.cover [/.not]
- (and (#= /.false
- (/.and pattern
- (/.not pattern)))
- (#= /.true
- (/.or pattern
- (/.not pattern)))))
- (_.cover [/.xor]
- (and (#= /.true
- (/.xor pattern
- (/.not pattern)))
- (#= /.false
- (/.xor pattern
- pattern))))
- (_.cover [/.ones]
- (let [zero&one!
- (if (/.one? idx pattern)
- (n.= (-- (/.ones pattern)) (/.ones (/.zero idx pattern)))
- (n.= (++ (/.ones pattern)) (/.ones (/.one idx pattern))))
-
- complementarity!
- (n.= /.width
- (n.+ (/.ones pattern)
- (/.ones (/.not pattern))))]
- (and zero&one!
- complementarity!)))
- (_.cover [/.left_rotated /.right_rotated]
- (let [false!
- (and (#= /.false (/.left_rotated idx /.false))
- (#= /.false (/.right_rotated idx /.false)))
-
- true!
- (and (#= /.true (/.left_rotated idx /.true))
- (#= /.true (/.right_rotated idx /.true)))
-
- inverse!
- (and (|> pattern
- (/.left_rotated idx)
- (/.right_rotated idx)
- (#= pattern))
- (|> pattern
- (/.right_rotated idx)
- (/.left_rotated idx)
- (#= pattern)))
+ (all _.and
+ (_.cover [/.width /.bits_per_byte /.bytes_per_i64]
+ (and (n.= /.bytes_per_i64
+ (n./ /.bits_per_byte /.width))
+ (n.= /.bits_per_byte
+ (n./ /.bytes_per_i64 /.width))))
+ (_.cover [/.false]
+ (n.= 0 (/.ones /.false)))
+ (_.cover [/.or]
+ (and (#= /.true (/.or /.true pattern))
+ (#= pattern (/.or /.false pattern))))
+ (_.cover [/.true]
+ (n.= /.width (/.ones /.true)))
+ (_.cover [/.and]
+ (and (#= pattern (/.and /.true pattern))
+ (#= /.false (/.and /.false pattern))))
+ (_.cover [/.not]
+ (and (#= /.false
+ (/.and pattern
+ (/.not pattern)))
+ (#= /.true
+ (/.or pattern
+ (/.not pattern)))))
+ (_.cover [/.xor]
+ (and (#= /.true
+ (/.xor pattern
+ (/.not pattern)))
+ (#= /.false
+ (/.xor pattern
+ pattern))))
+ (_.cover [/.ones]
+ (let [zero&one!
+ (if (/.one? idx pattern)
+ (n.= (-- (/.ones pattern)) (/.ones (/.zero idx pattern)))
+ (n.= (++ (/.ones pattern)) (/.ones (/.one idx pattern))))
- nullity!
- (and (|> pattern
- (/.left_rotated 0)
- (#= pattern))
- (|> pattern
- (/.right_rotated 0)
- (#= pattern)))
+ complementarity!
+ (n.= /.width
+ (n.+ (/.ones pattern)
+ (/.ones (/.not pattern))))]
+ (and zero&one!
+ complementarity!)))
+ (_.cover [/.left_rotated /.right_rotated]
+ (let [false!
+ (and (#= /.false (/.left_rotated idx /.false))
+ (#= /.false (/.right_rotated idx /.false)))
- futility!
- (and (|> pattern
- (/.left_rotated /.width)
- (#= pattern))
- (|> pattern
- (/.right_rotated /.width)
- (#= pattern)))]
- (and false!
true!
+ (and (#= /.true (/.left_rotated idx /.true))
+ (#= /.true (/.right_rotated idx /.true)))
+
inverse!
+ (and (|> pattern
+ (/.left_rotated idx)
+ (/.right_rotated idx)
+ (#= pattern))
+ (|> pattern
+ (/.right_rotated idx)
+ (/.left_rotated idx)
+ (#= pattern)))
+
nullity!
- futility!)))
- (_.cover [/.reversed]
- (and (|> pattern /.reversed /.reversed (#= pattern))
- (or (|> pattern /.reversed (#= pattern) not)
- (let [high (/.and (hex "FFFFFFFF00000000")
- pattern)
- low (/.and (hex "00000000FFFFFFFF")
- pattern)]
- (#= (/.reversed high)
- low)))))
-
- ..bit
- ..shift
- ..mask
- ..sub
- ..signature
- ))))
+ (and (|> pattern
+ (/.left_rotated 0)
+ (#= pattern))
+ (|> pattern
+ (/.right_rotated 0)
+ (#= pattern)))
+
+ futility!
+ (and (|> pattern
+ (/.left_rotated /.width)
+ (#= pattern))
+ (|> pattern
+ (/.right_rotated /.width)
+ (#= pattern)))]
+ (and false!
+ true!
+ inverse!
+ nullity!
+ futility!)))
+ (_.cover [/.reversed]
+ (and (|> pattern /.reversed /.reversed (#= pattern))
+ (or (|> pattern /.reversed (#= pattern) not)
+ (let [high (/.and (hex "FFFFFFFF00000000")
+ pattern)
+ low (/.and (hex "00000000FFFFFFFF")
+ pattern)]
+ (#= (/.reversed high)
+ low)))))
+
+ ..bit
+ ..shift
+ ..mask
+ ..sub
+ ..signature
+ ))))
diff --git a/stdlib/source/test/lux/math/number/i8.lux b/stdlib/source/test/lux/math/number/i8.lux
index 6e20a2117..3994b5433 100644
--- a/stdlib/source/test/lux/math/number/i8.lux
+++ b/stdlib/source/test/lux/math/number/i8.lux
@@ -1,18 +1,18 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- [abstract
- [monad {"+" do}]
- [\\specification
- ["$[0]" equivalence]]]
- [math
- ["[0]" random {"+" Random}]]]]
- [\\library
- ["[0]" /
- ["/[1]" // "_"
- ["i" int]
- ["[1][0]" i64]]]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ [abstract
+ [monad {"+" do}]
+ [\\specification
+ ["$[0]" equivalence]]]
+ [math
+ ["[0]" random {"+" Random}]]]]
+ [\\library
+ ["[0]" /
+ ["/[1]" // "_"
+ ["i" int]
+ ["[1][0]" i64]]]])
(def: .public random
(Random /.I8)
@@ -28,11 +28,11 @@
.int
++)]
expected (# ! each (i.% limit) random.int)]
- ($_ _.and
- (_.for [/.equivalence]
- ($equivalence.spec /.equivalence ..random))
-
- (_.cover [/.i8 /.i64 /.width]
- (let [actual (|> expected .i64 /.i8 /.i64)]
- (# //i64.equivalence = expected actual)))
- ))))
+ (all _.and
+ (_.for [/.equivalence]
+ ($equivalence.spec /.equivalence ..random))
+
+ (_.cover [/.i8 /.i64 /.width]
+ (let [actual (|> expected .i64 /.i8 /.i64)]
+ (# //i64.equivalence = expected actual)))
+ ))))
diff --git a/stdlib/source/test/lux/math/number/int.lux b/stdlib/source/test/lux/math/number/int.lux
index 4a6b893f4..9265507e7 100644
--- a/stdlib/source/test/lux/math/number/int.lux
+++ b/stdlib/source/test/lux/math/number/int.lux
@@ -25,230 +25,230 @@
(def: signature
Test
- (`` ($_ _.and
- (_.for [/.equivalence /.=]
- ($equivalence.spec /.equivalence random.int))
- (_.for [/.hash]
- ($hash.spec /.hash random.int))
- (_.for [/.order /.<]
- ($order.spec /.order random.int))
- (_.for [/.enum]
- ($enum.spec /.enum random.int))
- (_.for [/.interval]
- ($interval.spec /.interval random.int))
- (~~ (template [<monoid>]
- [(_.for [<monoid>]
- ($monoid.spec /.equivalence <monoid> random.int))]
-
- [/.addition]
- [/.multiplication]
+ (`` (all _.and
+ (_.for [/.equivalence /.=]
+ ($equivalence.spec /.equivalence random.int))
+ (_.for [/.hash]
+ ($hash.spec /.hash random.int))
+ (_.for [/.order /.<]
+ ($order.spec /.order random.int))
+ (_.for [/.enum]
+ ($enum.spec /.enum random.int))
+ (_.for [/.interval]
+ ($interval.spec /.interval random.int))
+ (~~ (template [<monoid>]
+ [(_.for [<monoid>]
+ ($monoid.spec /.equivalence <monoid> random.int))]
+
+ [/.addition]
+ [/.multiplication]
- [/.minimum]
- [/.maximum]
- ))
- (~~ (template [<codec>]
- [(_.for [<codec>]
- ($codec.spec /.equivalence <codec> random.int))]
+ [/.minimum]
+ [/.maximum]
+ ))
+ (~~ (template [<codec>]
+ [(_.for [<codec>]
+ ($codec.spec /.equivalence <codec> random.int))]
- [/.binary] [/.octal] [/.decimal] [/.hex]
- ))
- )))
+ [/.binary] [/.octal] [/.decimal] [/.hex]
+ ))
+ )))
(def: predicate
Test
(do [! random.monad]
[sample random.int]
- ($_ _.and
- (_.cover [/.negative?]
- (bit#= (/.negative? sample)
- (/.< +0 sample)))
- (_.cover [/.positive?]
- (bit#= (/.positive? sample)
- (/.> +0 sample)))
- (_.cover [/.zero?]
- (bit#= (/.zero? sample)
- (/.= +0 sample)))
- (_.cover [/.even? /.odd?]
- (bit#= (/.even? sample)
- (not (/.odd? sample))))
- )))
+ (all _.and
+ (_.cover [/.negative?]
+ (bit#= (/.negative? sample)
+ (/.< +0 sample)))
+ (_.cover [/.positive?]
+ (bit#= (/.positive? sample)
+ (/.> +0 sample)))
+ (_.cover [/.zero?]
+ (bit#= (/.zero? sample)
+ (/.= +0 sample)))
+ (_.cover [/.even? /.odd?]
+ (bit#= (/.even? sample)
+ (not (/.odd? sample))))
+ )))
(def: .public test
Test
(<| (_.covering /._)
(_.for [.Int])
(let [(open "/#[0]") /.interval])
- ($_ _.and
- (do random.monad
- [sample random.int
- left random.int
- right random.int]
- ($_ _.and
- (_.cover [/.+]
- (and (/.= (/.+ left right)
- (/.+ right left))
- (/.= sample (/.+ +0 sample))))
- (_.cover [/.-]
- (and (/.= +0 (/.- sample sample))
- (/.= sample (/.- +0 sample))
- (/.= (/.opposite sample)
- (/.- sample +0))
- (/.= /#bottom
- (/.- /#bottom +0))))
- (_.cover [/.*]
- (and (/.= (/.* left right)
- (/.* right left))
- (/.= sample (/.* +1 sample))
- (/.= /#bottom
- (/.* -1 /#bottom))))
- (_.cover [/./]
- (and (/.= +1 (/./ sample sample))
- (/.= sample (/./ +1 sample))
- (/.= /#bottom
- (/./ -1 /#bottom))))
- (_.cover [/.abs]
- (bit#= (/.> sample (/.abs sample))
- (/.negative? sample)))
- (_.cover [/.signum]
- (/.= (/.abs sample)
- (/.* (/.signum sample) sample)))
- (_.cover [/.min]
- (and (/.= (/.min left right)
- (/.min right left))
- (/.= sample
- (/.min /#top sample))
- (/.= /#bottom
- (/.min /#bottom sample))))
- (_.cover [/.max]
- (and (/.= (/.max left right)
- (/.max right left))
- (/.= /#top
- (/.max /#top sample))
- (/.= sample
- (/.max /#bottom sample))))
- ))
- (do random.monad
- [left random.int
- right random.int]
- ($_ _.and
- (_.cover [/.>]
- (bit#= (/.> left right)
- (/.< right left)))
- (_.cover [/.<= /.>=]
- (bit#= (/.<= left right)
- (/.>= right left)))
- ))
- (do random.monad
- [left (random.only (|>> (/.= +0) not)
- random.int)
- right random.int]
- ($_ _.and
- (_.cover [/.%]
- (let [rem (/.% left right)
- div (|> right (/.- rem) (/./ left))]
- (/.= right
- (|> div (/.* left) (/.+ rem)))))
- (_.cover [/./%]
- (let [[div rem] (/./% left right)]
- (and (/.= div (/./ left right))
- (/.= rem (/.% left right)))))
- (_.cover [/.mod]
- (and (/.= (/.signum left)
- (/.signum (/.mod left right)))
- (/.= (/.signum right)
- (/.signum (/.% left right)))
- (if (/.= (/.signum left) (/.signum right))
- (/.= (/.% left right)
- (/.mod left right))
- (or (and (/.= +0 (/.% left right))
- (/.= +0 (/.mod left right)))
- (/.= (/.+ left (/.% left right))
- (/.mod left right))))))
- ))
- (do [! random.monad]
- [.let [random (|> random.int
- (# ! each (/.% +1,000))
- (random.only (|>> (/.= +0) not)))]
- left random
- right random]
- ($_ _.and
- (_.cover [/.gcd]
- (let [gcd (/.gcd left right)]
- (and (/.= +0 (/.% gcd left))
- (/.= +0 (/.% gcd right)))))
- (_.cover [/.extended_gcd]
- (let [[[left_k right_k] gcd] (/.extended_gcd left right)
+ (all _.and
+ (do random.monad
+ [sample random.int
+ left random.int
+ right random.int]
+ (all _.and
+ (_.cover [/.+]
+ (and (/.= (/.+ left right)
+ (/.+ right left))
+ (/.= sample (/.+ +0 sample))))
+ (_.cover [/.-]
+ (and (/.= +0 (/.- sample sample))
+ (/.= sample (/.- +0 sample))
+ (/.= (/.opposite sample)
+ (/.- sample +0))
+ (/.= /#bottom
+ (/.- /#bottom +0))))
+ (_.cover [/.*]
+ (and (/.= (/.* left right)
+ (/.* right left))
+ (/.= sample (/.* +1 sample))
+ (/.= /#bottom
+ (/.* -1 /#bottom))))
+ (_.cover [/./]
+ (and (/.= +1 (/./ sample sample))
+ (/.= sample (/./ +1 sample))
+ (/.= /#bottom
+ (/./ -1 /#bottom))))
+ (_.cover [/.abs]
+ (bit#= (/.> sample (/.abs sample))
+ (/.negative? sample)))
+ (_.cover [/.signum]
+ (/.= (/.abs sample)
+ (/.* (/.signum sample) sample)))
+ (_.cover [/.min]
+ (and (/.= (/.min left right)
+ (/.min right left))
+ (/.= sample
+ (/.min /#top sample))
+ (/.= /#bottom
+ (/.min /#bottom sample))))
+ (_.cover [/.max]
+ (and (/.= (/.max left right)
+ (/.max right left))
+ (/.= /#top
+ (/.max /#top sample))
+ (/.= sample
+ (/.max /#bottom sample))))
+ ))
+ (do random.monad
+ [left random.int
+ right random.int]
+ (all _.and
+ (_.cover [/.>]
+ (bit#= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit#= (/.<= left right)
+ (/.>= right left)))
+ ))
+ (do random.monad
+ [left (random.only (|>> (/.= +0) not)
+ random.int)
+ right random.int]
+ (all _.and
+ (_.cover [/.%]
+ (let [rem (/.% left right)
+ div (|> right (/.- rem) (/./ left))]
+ (/.= right
+ (|> div (/.* left) (/.+ rem)))))
+ (_.cover [/./%]
+ (let [[div rem] (/./% left right)]
+ (and (/.= div (/./ left right))
+ (/.= rem (/.% left right)))))
+ (_.cover [/.mod]
+ (and (/.= (/.signum left)
+ (/.signum (/.mod left right)))
+ (/.= (/.signum right)
+ (/.signum (/.% left right)))
+ (if (/.= (/.signum left) (/.signum right))
+ (/.= (/.% left right)
+ (/.mod left right))
+ (or (and (/.= +0 (/.% left right))
+ (/.= +0 (/.mod left right)))
+ (/.= (/.+ left (/.% left right))
+ (/.mod left right))))))
+ ))
+ (do [! random.monad]
+ [.let [random (|> random.int
+ (# ! each (/.% +1,000))
+ (random.only (|>> (/.= +0) not)))]
+ left random
+ right random]
+ (all _.and
+ (_.cover [/.gcd]
+ (let [gcd (/.gcd left right)]
+ (and (/.= +0 (/.% gcd left))
+ (/.= +0 (/.% gcd right)))))
+ (_.cover [/.extended_gcd]
+ (let [[[left_k right_k] gcd] (/.extended_gcd left right)
- same_gcd!
- (/.= gcd
- (/.gcd left right))
-
- bezout_identity!
- (/.= gcd
- (/.+ (/.* left_k left)
- (/.* right_k right)))]
- (and same_gcd!
- bezout_identity!)))
- (_.cover [/.co_prime?]
- (bit#= (/.= +1 (/.gcd left right))
- (/.co_prime? left right)))
- (_.cover [/.lcm]
- (let [lcm (/.lcm left right)]
- (and (/.= +0 (/.% left lcm))
- (/.= +0 (/.% right lcm)))))
- ))
- (do random.monad
- [expected random.int]
- (_.cover [/.opposite]
- (let [subtraction!
- (/.= +0 (/.+ (/.opposite expected) expected))
+ same_gcd!
+ (/.= gcd
+ (/.gcd left right))
+
+ bezout_identity!
+ (/.= gcd
+ (/.+ (/.* left_k left)
+ (/.* right_k right)))]
+ (and same_gcd!
+ bezout_identity!)))
+ (_.cover [/.co_prime?]
+ (bit#= (/.= +1 (/.gcd left right))
+ (/.co_prime? left right)))
+ (_.cover [/.lcm]
+ (let [lcm (/.lcm left right)]
+ (and (/.= +0 (/.% left lcm))
+ (/.= +0 (/.% right lcm)))))
+ ))
+ (do random.monad
+ [expected random.int]
+ (_.cover [/.opposite]
+ (let [subtraction!
+ (/.= +0 (/.+ (/.opposite expected) expected))
- inverse!
- (|> expected /.opposite /.opposite (/.= expected))]
- (and subtraction!
- inverse!))))
- (do [! random.monad]
- [expected (# ! each (/.% +1,000,000) random.int)
- sample random.int]
- (_.cover [/.frac]
- (and (|> expected /.frac f.int (/.= expected))
- (f.number? (/.frac sample)))))
- (do [! random.monad]
- [pattern random.int
- idx (# ! each (n.% i64.width) random.nat)]
- (_.cover [/.right_shifted]
- (let [nullity!
- (/.= pattern (/.right_shifted 0 pattern))
+ inverse!
+ (|> expected /.opposite /.opposite (/.= expected))]
+ (and subtraction!
+ inverse!))))
+ (do [! random.monad]
+ [expected (# ! each (/.% +1,000,000) random.int)
+ sample random.int]
+ (_.cover [/.frac]
+ (and (|> expected /.frac f.int (/.= expected))
+ (f.number? (/.frac sample)))))
+ (do [! random.monad]
+ [pattern random.int
+ idx (# ! each (n.% i64.width) random.nat)]
+ (_.cover [/.right_shifted]
+ (let [nullity!
+ (/.= pattern (/.right_shifted 0 pattern))
- idempotency!
- (/.= pattern (/.right_shifted i64.width pattern))
-
- sign_mask (i64.left_shifted (-- i64.width) 1)
- mantissa_mask (-- (i64.left_shifted (n.- idx i64.width) 1))
- co_mantissa_mask (i64.not mantissa_mask)
-
- sign_preservation!
- (/.= (i64.and sign_mask pattern)
- (i64.and sign_mask (/.right_shifted idx pattern)))
+ idempotency!
+ (/.= pattern (/.right_shifted i64.width pattern))
- mantissa_parity!
- (/.= (i64.and mantissa_mask (i64.right_shifted idx pattern))
- (i64.and mantissa_mask (/.right_shifted idx pattern)))
+ sign_mask (i64.left_shifted (-- i64.width) 1)
+ mantissa_mask (-- (i64.left_shifted (n.- idx i64.width) 1))
+ co_mantissa_mask (i64.not mantissa_mask)
- co_mantissa_disparity!
- (or (n.= 0 idx)
- (and (/.= +0 (i64.and co_mantissa_mask (i64.right_shifted idx pattern)))
- (/.= (if (/.< +0 pattern)
- (.int co_mantissa_mask)
- +0)
- (i64.and co_mantissa_mask (/.right_shifted idx pattern)))))]
- (and nullity!
- idempotency!
sign_preservation!
+ (/.= (i64.and sign_mask pattern)
+ (i64.and sign_mask (/.right_shifted idx pattern)))
+
mantissa_parity!
+ (/.= (i64.and mantissa_mask (i64.right_shifted idx pattern))
+ (i64.and mantissa_mask (/.right_shifted idx pattern)))
+
co_mantissa_disparity!
- ))))
+ (or (n.= 0 idx)
+ (and (/.= +0 (i64.and co_mantissa_mask (i64.right_shifted idx pattern)))
+ (/.= (if (/.< +0 pattern)
+ (.int co_mantissa_mask)
+ +0)
+ (i64.and co_mantissa_mask (/.right_shifted idx pattern)))))]
+ (and nullity!
+ idempotency!
+ sign_preservation!
+ mantissa_parity!
+ co_mantissa_disparity!
+ ))))
- ..predicate
- ..signature
- )))
+ ..predicate
+ ..signature
+ )))
diff --git a/stdlib/source/test/lux/math/number/nat.lux b/stdlib/source/test/lux/math/number/nat.lux
index f236a7aa6..05c248337 100644
--- a/stdlib/source/test/lux/math/number/nat.lux
+++ b/stdlib/source/test/lux/math/number/nat.lux
@@ -1,132 +1,132 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- [abstract
- [monad {"+" do}]
- [\\specification
- ["$[0]" equivalence]
- ["$[0]" hash]
- ["$[0]" order]
- ["$[0]" enum]
- ["$[0]" interval]
- ["$[0]" monoid]
- ["$[0]" codec]]]
- [data
- ["[0]" bit ("[1]#[0]" equivalence)]]
- [math
- ["[0]" random]]]]
- [\\library
- ["[0]" /
- [//
- ["f" frac]]]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ [abstract
+ [monad {"+" do}]
+ [\\specification
+ ["$[0]" equivalence]
+ ["$[0]" hash]
+ ["$[0]" order]
+ ["$[0]" enum]
+ ["$[0]" interval]
+ ["$[0]" monoid]
+ ["$[0]" codec]]]
+ [data
+ ["[0]" bit ("[1]#[0]" equivalence)]]
+ [math
+ ["[0]" random]]]]
+ [\\library
+ ["[0]" /
+ [//
+ ["f" frac]]]])
(def: signature
Test
- (`` ($_ _.and
- (_.for [/.equivalence /.=]
- ($equivalence.spec /.equivalence random.nat))
- (_.for [/.hash]
- ($hash.spec /.hash random.nat))
- (_.for [/.order /.<]
- ($order.spec /.order random.nat))
- (_.for [/.enum]
- ($enum.spec /.enum random.nat))
- (_.for [/.interval]
- ($interval.spec /.interval random.nat))
- (~~ (template [<composite> <monoid>]
- [(_.for [<monoid> <composite>]
- ($monoid.spec /.equivalence <monoid> random.nat))]
-
- [/.+ /.addition]
- [/.* /.multiplication]
+ (`` (all _.and
+ (_.for [/.equivalence /.=]
+ ($equivalence.spec /.equivalence random.nat))
+ (_.for [/.hash]
+ ($hash.spec /.hash random.nat))
+ (_.for [/.order /.<]
+ ($order.spec /.order random.nat))
+ (_.for [/.enum]
+ ($enum.spec /.enum random.nat))
+ (_.for [/.interval]
+ ($interval.spec /.interval random.nat))
+ (~~ (template [<composite> <monoid>]
+ [(_.for [<monoid> <composite>]
+ ($monoid.spec /.equivalence <monoid> random.nat))]
+
+ [/.+ /.addition]
+ [/.* /.multiplication]
- [/.min /.minimum]
- [/.max /.maximum]
- ))
- (~~ (template [<codec>]
- [(_.for [<codec>]
- ($codec.spec /.equivalence <codec> random.nat))]
+ [/.min /.minimum]
+ [/.max /.maximum]
+ ))
+ (~~ (template [<codec>]
+ [(_.for [<codec>]
+ ($codec.spec /.equivalence <codec> random.nat))]
- [/.binary] [/.octal] [/.decimal] [/.hex]
- ))
- )))
+ [/.binary] [/.octal] [/.decimal] [/.hex]
+ ))
+ )))
(def: predicate
Test
(do [! random.monad]
[sample random.nat]
- ($_ _.and
- (_.cover [/.even? /.odd?]
- (bit#= (/.even? sample)
- (not (/.odd? sample))))
- )))
+ (all _.and
+ (_.cover [/.even? /.odd?]
+ (bit#= (/.even? sample)
+ (not (/.odd? sample))))
+ )))
(def: .public test
Test
(<| (_.covering /._)
(_.for [.Nat])
- ($_ _.and
- (do random.monad
- [sample random.nat]
- ($_ _.and
- (_.cover [/.-]
- (and (/.= 0 (/.- sample sample))
- (/.= sample (/.- 0 sample))))
- (_.cover [/./]
- (and (/.= 1 (/./ sample sample))
- (/.= sample (/./ 1 sample))))
- ))
- (do random.monad
- [left random.nat
- right random.nat]
- ($_ _.and
- (_.cover [/.>]
- (bit#= (/.> left right)
- (/.< right left)))
- (_.cover [/.<= /.>=]
- (bit#= (/.<= left right)
- (/.>= right left)))
- ))
- (do random.monad
- [left (random.only (|>> (/.= 0) not)
- random.nat)
- right random.nat]
- ($_ _.and
- (_.cover [/.%]
- (let [rem (/.% left right)
- div (|> right (/.- rem) (/./ left))]
- (/.= right
- (|> div (/.* left) (/.+ rem)))))
- (_.cover [/./%]
- (let [[div rem] (/./% left right)]
- (and (/.= div (/./ left right))
- (/.= rem (/.% left right)))))
- ))
- (do [! random.monad]
- [.let [random (# ! each (|>> (/.% 1,000) ++) random.nat)]
- left random
- right random]
- ($_ _.and
- (_.cover [/.gcd]
- (let [gcd (/.gcd left right)]
- (and (/.= 0 (/.% gcd left))
- (/.= 0 (/.% gcd right)))))
- (_.cover [/.co_prime?]
- (bit#= (/.= 1 (/.gcd left right))
- (/.co_prime? left right)))
- (_.cover [/.lcm]
- (let [lcm (/.lcm left right)]
- (and (/.= 0 (/.% left lcm))
- (/.= 0 (/.% right lcm)))))
- ))
- (do [! random.monad]
- [expected (# ! each (/.% 1,000,000) random.nat)
- sample random.nat]
- (_.cover [/.frac]
- (and (|> expected /.frac f.nat (/.= expected))
- (f.number? (/.frac sample)))))
+ (all _.and
+ (do random.monad
+ [sample random.nat]
+ (all _.and
+ (_.cover [/.-]
+ (and (/.= 0 (/.- sample sample))
+ (/.= sample (/.- 0 sample))))
+ (_.cover [/./]
+ (and (/.= 1 (/./ sample sample))
+ (/.= sample (/./ 1 sample))))
+ ))
+ (do random.monad
+ [left random.nat
+ right random.nat]
+ (all _.and
+ (_.cover [/.>]
+ (bit#= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit#= (/.<= left right)
+ (/.>= right left)))
+ ))
+ (do random.monad
+ [left (random.only (|>> (/.= 0) not)
+ random.nat)
+ right random.nat]
+ (all _.and
+ (_.cover [/.%]
+ (let [rem (/.% left right)
+ div (|> right (/.- rem) (/./ left))]
+ (/.= right
+ (|> div (/.* left) (/.+ rem)))))
+ (_.cover [/./%]
+ (let [[div rem] (/./% left right)]
+ (and (/.= div (/./ left right))
+ (/.= rem (/.% left right)))))
+ ))
+ (do [! random.monad]
+ [.let [random (# ! each (|>> (/.% 1,000) ++) random.nat)]
+ left random
+ right random]
+ (all _.and
+ (_.cover [/.gcd]
+ (let [gcd (/.gcd left right)]
+ (and (/.= 0 (/.% gcd left))
+ (/.= 0 (/.% gcd right)))))
+ (_.cover [/.co_prime?]
+ (bit#= (/.= 1 (/.gcd left right))
+ (/.co_prime? left right)))
+ (_.cover [/.lcm]
+ (let [lcm (/.lcm left right)]
+ (and (/.= 0 (/.% left lcm))
+ (/.= 0 (/.% right lcm)))))
+ ))
+ (do [! random.monad]
+ [expected (# ! each (/.% 1,000,000) random.nat)
+ sample random.nat]
+ (_.cover [/.frac]
+ (and (|> expected /.frac f.nat (/.= expected))
+ (f.number? (/.frac sample)))))
- ..predicate
- ..signature
- )))
+ ..predicate
+ ..signature
+ )))
diff --git a/stdlib/source/test/lux/math/number/ratio.lux b/stdlib/source/test/lux/math/number/ratio.lux
index d9c1c1ba8..a5af79e0b 100644
--- a/stdlib/source/test/lux/math/number/ratio.lux
+++ b/stdlib/source/test/lux/math/number/ratio.lux
@@ -38,90 +38,90 @@
Test
(<| (_.covering /._)
(_.for [/.Ratio])
- (`` ($_ _.and
- (_.for [/.equivalence /.=]
- ($equivalence.spec /.equivalence ..random))
- (_.for [/.order /.<]
- ($order.spec /.order ..random))
- (~~ (template [<composite> <monoid>]
- [(_.for [<monoid> <composite>]
- ($monoid.spec /.equivalence <monoid> ..random))]
+ (`` (all _.and
+ (_.for [/.equivalence /.=]
+ ($equivalence.spec /.equivalence ..random))
+ (_.for [/.order /.<]
+ ($order.spec /.order ..random))
+ (~~ (template [<composite> <monoid>]
+ [(_.for [<monoid> <composite>]
+ ($monoid.spec /.equivalence <monoid> ..random))]
- [/.+ /.addition]
- [/.* /.multiplication]
- ))
- (_.for [/.codec]
- ($codec.spec /.equivalence /.codec ..random))
+ [/.+ /.addition]
+ [/.* /.multiplication]
+ ))
+ (_.for [/.codec]
+ ($codec.spec /.equivalence /.codec ..random))
- (do random.monad
- [.let [(open "#[0]") /.equivalence]
- denom/0 ..part
- denom/1 ..part]
- (_.cover [/.ratio]
- (#= (/.ratio 0 denom/0)
- (/.ratio 0 denom/1))))
- (do random.monad
- [numerator ..part
- denominator (random.only (|>> (n#= 1) not)
- ..part)]
- (_.cover [/.nat]
- (let [only_numerator!
- (|> (/.ratio numerator)
- /.nat
- (maybe#each (n#= numerator))
- (maybe.else false))
+ (do random.monad
+ [.let [(open "#[0]") /.equivalence]
+ denom/0 ..part
+ denom/1 ..part]
+ (_.cover [/.ratio]
+ (#= (/.ratio 0 denom/0)
+ (/.ratio 0 denom/1))))
+ (do random.monad
+ [numerator ..part
+ denominator (random.only (|>> (n#= 1) not)
+ ..part)]
+ (_.cover [/.nat]
+ (let [only_numerator!
+ (|> (/.ratio numerator)
+ /.nat
+ (maybe#each (n#= numerator))
+ (maybe.else false))
- denominator_1!
- (|> (/.ratio numerator 1)
- /.nat
- (maybe#each (n#= numerator))
- (maybe.else false))
-
- with_denominator!
- (case (/.nat (/.ratio numerator denominator))
- {.#Some factor}
- (and (n.= 0 (n.% denominator numerator))
- (n.= numerator (n.* factor denominator)))
-
- {.#None}
- (not (n.= 0 (n.% denominator numerator))))]
- (and only_numerator!
denominator_1!
- with_denominator!))))
- (do random.monad
- [sample ..random]
- ($_ _.and
- (_.cover [/.-]
- (and (/.= (/.ratio 0) (/.- sample sample))
- (/.= sample (/.- (/.ratio 0) sample))))
- (_.cover [/./]
- (and (/.= (/.ratio 1) (/./ sample sample))
- (/.= sample (/./ (/.ratio 1) sample))))
- (_.cover [/.reciprocal]
- (/.= (/.ratio 1)
- (/.* sample (/.reciprocal sample))))
- ))
- (do random.monad
- [left (random.only (|>> (/.= (/.ratio 0)) not)
- ..random)
- right ..random]
- (_.cover [/.%]
- (let [rem (/.% left right)
- div (|> right (/.- rem) (/./ left))]
- (and (/.= right
- (|> div (/.* left) (/.+ rem)))
- (case (/.nat div)
- {.#Some _} true
- {.#None} false)))))
- (do random.monad
- [left ..random
- right ..random]
- ($_ _.and
- (_.cover [/.>]
- (bit#= (/.> left right)
- (/.< right left)))
- (_.cover [/.<= /.>=]
- (bit#= (/.<= left right)
- (/.>= right left)))
- ))
- ))))
+ (|> (/.ratio numerator 1)
+ /.nat
+ (maybe#each (n#= numerator))
+ (maybe.else false))
+
+ with_denominator!
+ (case (/.nat (/.ratio numerator denominator))
+ {.#Some factor}
+ (and (n.= 0 (n.% denominator numerator))
+ (n.= numerator (n.* factor denominator)))
+
+ {.#None}
+ (not (n.= 0 (n.% denominator numerator))))]
+ (and only_numerator!
+ denominator_1!
+ with_denominator!))))
+ (do random.monad
+ [sample ..random]
+ (all _.and
+ (_.cover [/.-]
+ (and (/.= (/.ratio 0) (/.- sample sample))
+ (/.= sample (/.- (/.ratio 0) sample))))
+ (_.cover [/./]
+ (and (/.= (/.ratio 1) (/./ sample sample))
+ (/.= sample (/./ (/.ratio 1) sample))))
+ (_.cover [/.reciprocal]
+ (/.= (/.ratio 1)
+ (/.* sample (/.reciprocal sample))))
+ ))
+ (do random.monad
+ [left (random.only (|>> (/.= (/.ratio 0)) not)
+ ..random)
+ right ..random]
+ (_.cover [/.%]
+ (let [rem (/.% left right)
+ div (|> right (/.- rem) (/./ left))]
+ (and (/.= right
+ (|> div (/.* left) (/.+ rem)))
+ (case (/.nat div)
+ {.#Some _} true
+ {.#None} false)))))
+ (do random.monad
+ [left ..random
+ right ..random]
+ (all _.and
+ (_.cover [/.>]
+ (bit#= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit#= (/.<= left right)
+ (/.>= right left)))
+ ))
+ ))))
diff --git a/stdlib/source/test/lux/math/number/rev.lux b/stdlib/source/test/lux/math/number/rev.lux
index 88473533d..7fe3c86dd 100644
--- a/stdlib/source/test/lux/math/number/rev.lux
+++ b/stdlib/source/test/lux/math/number/rev.lux
@@ -1,167 +1,167 @@
(.using
- [library
- [lux "*"
- ["_" test {"+" Test}]
- [abstract
- [monad {"+" do}]
- [\\specification
- ["$[0]" equivalence]
- ["$[0]" hash]
- ["$[0]" order]
- ["$[0]" enum]
- ["$[0]" interval]
- ["$[0]" monoid]
- ["$[0]" codec]]]
- [data
- ["[0]" bit ("[1]#[0]" equivalence)]]
- [math
- ["[0]" random]]]]
- [\\library
- ["[0]" /
- [// {"+" hex}
- ["n" nat]
- ["f" frac]
- ["[0]" i64 ("[1]#[0]" hash)]]]])
+ [library
+ [lux "*"
+ ["_" test {"+" Test}]
+ [abstract
+ [monad {"+" do}]
+ [\\specification
+ ["$[0]" equivalence]
+ ["$[0]" hash]
+ ["$[0]" order]
+ ["$[0]" enum]
+ ["$[0]" interval]
+ ["$[0]" monoid]
+ ["$[0]" codec]]]
+ [data
+ ["[0]" bit ("[1]#[0]" equivalence)]]
+ [math
+ ["[0]" random]]]]
+ [\\library
+ ["[0]" /
+ [// {"+" hex}
+ ["n" nat]
+ ["f" frac]
+ ["[0]" i64 ("[1]#[0]" hash)]]]])
(def: signature
Test
- (`` ($_ _.and
- (_.for [/.equivalence /.=]
- ($equivalence.spec /.equivalence random.rev))
- (_.for [/.hash]
- ($hash.spec /.hash random.rev))
- (_.for [/.order /.<]
- ($order.spec /.order random.rev))
- (_.for [/.enum]
- ($enum.spec /.enum random.rev))
- (_.for [/.interval]
- ($interval.spec /.interval random.rev))
- (~~ (template [<composite> <monoid>]
- [(_.for [<monoid> <composite>]
- ($monoid.spec /.equivalence <monoid> random.rev))]
+ (`` (all _.and
+ (_.for [/.equivalence /.=]
+ ($equivalence.spec /.equivalence random.rev))
+ (_.for [/.hash]
+ ($hash.spec /.hash random.rev))
+ (_.for [/.order /.<]
+ ($order.spec /.order random.rev))
+ (_.for [/.enum]
+ ($enum.spec /.enum random.rev))
+ (_.for [/.interval]
+ ($interval.spec /.interval random.rev))
+ (~~ (template [<composite> <monoid>]
+ [(_.for [<monoid> <composite>]
+ ($monoid.spec /.equivalence <monoid> random.rev))]
- [/.+ /.addition]
+ [/.+ /.addition]
- [/.min /.minimum]
- [/.max /.maximum]
- ))
- (~~ (template [<codec>]
- [(_.for [<codec>]
- ($codec.spec /.equivalence <codec> random.rev))]
+ [/.min /.minimum]
+ [/.max /.maximum]
+ ))
+ (~~ (template [<codec>]
+ [(_.for [<codec>]
+ ($codec.spec /.equivalence <codec> random.rev))]
- [/.binary] [/.octal] [/.decimal] [/.hex]
- ))
- )))
+ [/.binary] [/.octal] [/.decimal] [/.hex]
+ ))
+ )))
(def: .public test
Test
(<| (_.covering /._)
(_.for [.Rev])
- (`` ($_ _.and
- (~~ (template [<half> <whole>]
- [(_.cover [<half>]
- (/.= <whole>
- (/.+ <half> <half>)))]
+ (`` (all _.and
+ (~~ (template [<half> <whole>]
+ [(_.cover [<half>]
+ (/.= <whole>
+ (/.+ <half> <half>)))]
- [/./1 (-- /./1)]
- [/./2 .0]
- [/./4 /./2]
- [/./8 /./4]
- [/./16 /./8]
- [/./32 /./16]
- [/./64 /./32]
- [/./128 /./64]
- [/./256 /./128]
- [/./512 /./256]
- [/./1024 /./512]
- [/./2048 /./1024]
- [/./4096 /./2048]
- ))
- (do random.monad
- [sample random.rev]
- (_.cover [/.-]
- (and (/.= .0 (/.- sample sample))
- (/.= sample (/.- .0 sample)))))
- (do [! random.monad]
- [left random.rev
- right random.rev]
- (_.cover [/.*]
- (and (/.< left (/.* left right))
- (/.< right (/.* left right)))))
- (do [! random.monad]
- [.let [dividend (# ! each (i64.and (hex "FFFF"))
- random.rev)
- divisor (# ! each (|>> (i64.and (hex "F"))
- (i64.or (hex "1"))
- (i64.right_rotated 8)
- .rev)
- random.nat)]
- dividend (random.only (/.> .0) dividend)
- divisor/0 divisor
- divisor/1 (random.only (|>> (/.= divisor/0) not)
- divisor)
- scale (# ! each (|>> (n.% 10) ++)
- random.nat)]
- ($_ _.and
- (_.cover [/./]
- (bit#= (/.< divisor/0 divisor/1)
- (/.> (/./ divisor/0 dividend) (/./ divisor/1 dividend))))
- (_.cover [/.%]
- (# i64.equivalence =
- (.i64 (n.% (.nat divisor/0) (.nat dividend)))
- (.i64 (/.% divisor/0 dividend))))
- (_.cover [/.up /.down]
- (let [symmetry!
- (|> dividend
- (/.up scale)
- (/.down scale)
- (/.= dividend))
+ [/./1 (-- /./1)]
+ [/./2 .0]
+ [/./4 /./2]
+ [/./8 /./4]
+ [/./16 /./8]
+ [/./32 /./16]
+ [/./64 /./32]
+ [/./128 /./64]
+ [/./256 /./128]
+ [/./512 /./256]
+ [/./1024 /./512]
+ [/./2048 /./1024]
+ [/./4096 /./2048]
+ ))
+ (do random.monad
+ [sample random.rev]
+ (_.cover [/.-]
+ (and (/.= .0 (/.- sample sample))
+ (/.= sample (/.- .0 sample)))))
+ (do [! random.monad]
+ [left random.rev
+ right random.rev]
+ (_.cover [/.*]
+ (and (/.< left (/.* left right))
+ (/.< right (/.* left right)))))
+ (do [! random.monad]
+ [.let [dividend (# ! each (i64.and (hex "FFFF"))
+ random.rev)
+ divisor (# ! each (|>> (i64.and (hex "F"))
+ (i64.or (hex "1"))
+ (i64.right_rotated 8)
+ .rev)
+ random.nat)]
+ dividend (random.only (/.> .0) dividend)
+ divisor/0 divisor
+ divisor/1 (random.only (|>> (/.= divisor/0) not)
+ divisor)
+ scale (# ! each (|>> (n.% 10) ++)
+ random.nat)]
+ (all _.and
+ (_.cover [/./]
+ (bit#= (/.< divisor/0 divisor/1)
+ (/.> (/./ divisor/0 dividend) (/./ divisor/1 dividend))))
+ (_.cover [/.%]
+ (# i64.equivalence =
+ (.i64 (n.% (.nat divisor/0) (.nat dividend)))
+ (.i64 (/.% divisor/0 dividend))))
+ (_.cover [/.up /.down]
+ (let [symmetry!
+ (|> dividend
+ (/.up scale)
+ (/.down scale)
+ (/.= dividend))
- discrete_division!
- (/.= (/.% (.rev scale) dividend)
- (/.- (|> dividend
- (/.down scale)
- (/.up scale))
- dividend))]
- (and symmetry!
- discrete_division!)))
- (_.cover [/.ratio]
- (|> dividend
- (/.up scale)
- (/.ratio dividend)
- (n.= scale)))
- ))
- (do [! random.monad]
- [dividend random.rev
- divisor (random.only (|>> (/.= .0) not)
- random.rev)]
- (_.cover [/./%]
- (let [[quotient remainder] (/./% divisor dividend)]
- (and (/.= (/./ divisor dividend) quotient)
- (/.= (/.% divisor dividend) remainder)))))
- (do random.monad
- [left random.rev
- right random.rev]
- ($_ _.and
- (_.cover [/.>]
- (bit#= (/.> left right)
- (/.< right left)))
- (_.cover [/.<= /.>=]
- (bit#= (/.<= left right)
- (/.>= right left)))
- ))
- (do random.monad
- [sample random.nat]
- (_.cover [/.reciprocal]
- (/.= (/.reciprocal sample)
- (|> sample /.reciprocal .nat /.reciprocal .nat /.reciprocal))))
- (do [! random.monad]
- [expected (# ! each (|>> f.abs (f.% +1.0))
- random.safe_frac)
- sample random.rev]
- (_.cover [/.frac]
- (and (|> expected f.rev /.frac (f.= expected))
- (f.number? (/.frac sample)))))
+ discrete_division!
+ (/.= (/.% (.rev scale) dividend)
+ (/.- (|> dividend
+ (/.down scale)
+ (/.up scale))
+ dividend))]
+ (and symmetry!
+ discrete_division!)))
+ (_.cover [/.ratio]
+ (|> dividend
+ (/.up scale)
+ (/.ratio dividend)
+ (n.= scale)))
+ ))
+ (do [! random.monad]
+ [dividend random.rev
+ divisor (random.only (|>> (/.= .0) not)
+ random.rev)]
+ (_.cover [/./%]
+ (let [[quotient remainder] (/./% divisor dividend)]
+ (and (/.= (/./ divisor dividend) quotient)
+ (/.= (/.% divisor dividend) remainder)))))
+ (do random.monad
+ [left random.rev
+ right random.rev]
+ (all _.and
+ (_.cover [/.>]
+ (bit#= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit#= (/.<= left right)
+ (/.>= right left)))
+ ))
+ (do random.monad
+ [sample random.nat]
+ (_.cover [/.reciprocal]
+ (/.= (/.reciprocal sample)
+ (|> sample /.reciprocal .nat /.reciprocal .nat /.reciprocal))))
+ (do [! random.monad]
+ [expected (# ! each (|>> f.abs (f.% +1.0))
+ random.safe_frac)
+ sample random.rev]
+ (_.cover [/.frac]
+ (and (|> expected f.rev /.frac (f.= expected))
+ (f.number? (/.frac sample)))))
- ..signature
- ))))
+ ..signature
+ ))))