From 5a2dd4a7e8a6857e8cf32b6fe1524f04962c54cb Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Mon, 25 Mar 2024 23:54:19 +0100 Subject: Add support for context-dependent imports / generics --- std/Number/Unary.bruijn | 126 ++++++++++++------------------------------------ 1 file changed, 32 insertions(+), 94 deletions(-) (limited to 'std/Number/Unary.bruijn') diff --git a/std/Number/Unary.bruijn b/std/Number/Unary.bruijn index bb3ef44..ae54c19 100644 --- a/std/Number/Unary.bruijn +++ b/std/Number/Unary.bruijn @@ -25,16 +25,25 @@ zero? [0 [(+0u)] true] ⧗ Unary → Boolean :test (=?(+0u)) (true) :test (=?(+42u)) (false) -# adds 1 to a unary number -inc [[[1 (2 1 0)]]] ⧗ Unary → Unary +# returns remainder of integer division +mod [[[[3 &k (3 [3 [[[0 (2 (5 1)) 1]]] [1] 1] [1]) ki]]]] ⧗ Unary → Unary → Unary -++‣ inc +…%… mod -:test (++(+0u)) ((+1u)) -:test (++(+1u)) ((+2u)) -:test (++(+42u)) ((+43u)) +:test ((+10u) % (+3u)) ((+1u)) +:test ((+3u) % (+5u)) ((+3u)) + +# returns true if the number is even (remainder mod 2 == 0) +even? [=?(0 % (+2u))] ⧗ Unary → Boolean + +=²?‣ even? + +:test (=²?(+0u)) (true) +:test (=²?(+1u)) (false) +:test (=²?(+41u)) (false) +:test (=²?(+42u)) (true) -# subs 1 from a unary number +# subtracts 1 from a unary number dec [[[extract (2 inc const)]]] ⧗ Unary → Unary extract &i inc [&(0 2)] @@ -46,6 +55,15 @@ dec [[[extract (2 inc const)]]] ⧗ Unary → Unary :test (--(+1u)) ((+0u)) :test (--(+42u)) ((+41u)) +# adds 1 to a unary number +inc [[[1 (2 1 0)]]] ⧗ Unary → Unary + +++‣ inc + +:test (++(+0u)) ((+1u)) +:test (++(+1u)) ((+2u)) +:test (++(+42u)) ((+43u)) + # adds two unary numbers add [[[[3 1 (2 1 0)]]]] ⧗ Unary → Unary → Unary @@ -54,7 +72,7 @@ add [[[[3 1 (2 1 0)]]]] ⧗ Unary → Unary → Unary :test ((+0u) + (+2u)) ((+2u)) :test ((+5u) + (+3u)) ((+8u)) -# subs two unary numbers +# subtracts two unary numbers sub [[0 dec 1]] ⧗ Unary → Unary → Unary …-… sub @@ -62,27 +80,8 @@ sub [[0 dec 1]] ⧗ Unary → Unary → Unary :test ((+2u) - (+2u)) ((+0u)) :test ((+5u) - (+3u)) ((+2u)) -# returns true if number is less than or equal to other number -le? zero? ∘∘ sub ⧗ Unary → Unary → Boolean - -…≤?… le? - -:test ((+1u) ≤? (+2u)) (true) -:test ((+2u) ≤? (+2u)) (true) -:test ((+3u) ≤? (+2u)) (false) - -# returns true if number is greater than or equal to other number -ge? \le? ⧗ Unary → Unary → Boolean - -…≥?… ge? - -:test ((+1u) ≥? (+2u)) (false) -:test ((+2u) ≥? (+2u)) (true) -:test ((+3u) ≥? (+2u)) (true) - # returns true if number is greater than other number -# larger numbers should be second argument (performance) -gt? not! ∘∘ le? ⧗ Unary → Unary → Boolean +gt? not! ∘∘ (zero? ∘∘ sub) ⧗ Unary → Unary → Boolean …>?… gt? @@ -90,16 +89,6 @@ gt? not! ∘∘ le? ⧗ Unary → Unary → Boolean :test ((+2u) >? (+2u)) (false) :test ((+3u) >? (+2u)) (true) -# returns true if number is less than other number -# smaller numbers should be second argument (performance) -lt? \gt? ⧗ Unary → Unary → Boolean - -…b, -1 if a… compare - -<=>‣ &compare - -# muls two unary numbers +# multiplies two unary numbers mul …∘… ⧗ Unary → Unary → Unary …⋅… mul @@ -160,39 +131,6 @@ div [[[[3 t [1] (3 [3 t [3 (0 1)] i] 0)]]]] ⧗ Unary → Unary → Unary div* [z rec ++0] ⧗ Unary → Unary → Unary rec [[[[[[=?0 ((+0u) 2 1) (2 (5 0 3 2 1))] (3 - 2)]]]]] -# returns remainder of integer division -mod [[[[3 &k (3 [3 [[[0 (2 (5 1)) 1]]] [1] 1] [1]) ki]]]] ⧗ Unary → Unary → Unary - -…%… mod - -:test ((+10u) % (+3u)) ((+1u)) -:test ((+3u) % (+5u)) ((+3u)) - -# slower mod (more obvious impl) -mod* [[1 &[[(0 ⋀? (2 ≤? 1)) case-rec case-end]] (1 : true) k]] ⧗ Unary → Unary → Unary - case-rec (1 - 3) : true - case-end 1 : false - -# returns true if the number is even (remainder mod 2 == 0) -even? [=?(0 % (+2u))] ⧗ Unary → Boolean - -=²?‣ even? - -:test (=²?(+0u)) (true) -:test (=²?(+1u)) (false) -:test (=²?(+41u)) (false) -:test (=²?(+42u)) (true) - -# returns true if the number is odd (remainder mod 2 == 1) -odd? ¬‣ ∘ even? ⧗ Unary → Boolean - -≠²?‣ odd? - -:test (≠²?(+0u)) (false) -:test (≠²?(+1u)) (true) -:test (≠²?(+41u)) (true) -:test (≠²?(+42u)) (false) - # exponentiates two unary number # doesn't give correct results for x^0 pow* [[1 0]] ⧗ Unary → Unary → Unary -- cgit v1.2.3