Skip to main content

Inductive data structures for Python

Project description

inductive

inductive is a Python library that defines inductive data structures such as Peano numbers and linked lists.

[!CAUTION] It is still in early development.

A missing puzzle piece

Despite being very useful, Python does not have a built-in unsigned integer data type. Futhermore, it does not provide the ability to refine the existing int type by disallowing negative numbers - at least, not in a way that static type checkers like mypy or pyright can pick up. And yet, natural numbers come up on many occasions, such as counting or ordering, or in mundane programming tasks.

[!TIP] If you have ever created your own sequence type, and defined __len__, you are probably aware that you get a runtime error if it returns an integer below 0.

Fortunately for us, over the years, the language's type system has become powerful enough to be able to encode inductive types.

Inductive types

The idea goes as following: you start from something, like a pink ball - in our case, the number 0 - to which you add a box where you can put the ball, or another box of the same kind - for natural numbers, this is the successor function. Then, you put the ball in a box, which itself is inside another box, and so on: you now have a number. What is its value? Simply count how many boxes you need to open to get to the ball.

A pink ball surrounded by three boxes. The whole setup corresponds to the number 3.

Temporary mouse-drawn thingy until I find a better analogy 😆

Another way to think of it (and maybe even a better one!) is through recursive functions, except that instead of returning values, it creates inhabitants of the type in a way that can understood statically.

What does it give us?

This way, we are able to represent natural numbers in a type-safe way! If a value is of type Nat, you know it cannot be negative, which is sometimes a nice guarantee to have as aforementioned. Also, this is very similar to the Peano axioms, which gives us very nice mathematical properties.

However, this does not come without sacrificing some practicality: there is, as of writing this, no way to make the numeric literals have the type Nat instead of the built-in int. We still enjoy operators such as + or * thanks to their corresponding magic methods, but we will have to use functions to convert literals to our natural number type.

But why stop here?

...We don't!

With the type statement added in Python 3.12 and structural pattern matching with match/case in 3.10, the language unlocked a lot of power at the type level. The latter, especially, is the best friend of inductive types ; and Nat is not the only one that is very useful!

Especially, I'm looking forward adding linked lists, inductive sets, trees, other numeric types that fit very well this little world.

[!IMPORTANT] For now, only Nat is implemented, but it's just a matter of time before the others get added too 😄

inductive also provides a submodule builtins which goal is to override existing built-ins to use better suited types: for example, len is replaced by length, which returns a Nat, more appropriated since len can never return a negative number.

Where does this idea come from?

More specifically, this library is heavily inspired by the proof assistant Rocq (previously known as Coq) and its programming language Gallina, which are based on a type theory called calculus of constructions, and more recently on its variant called PCUIC (predicative calculus of cumulative inductive constructions).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

inductive-0.0.1.post1.tar.gz (59.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

inductive-0.0.1.post1-py3-none-any.whl (9.3 kB view details)

Uploaded Python 3

File details

Details for the file inductive-0.0.1.post1.tar.gz.

File metadata

  • Download URL: inductive-0.0.1.post1.tar.gz
  • Upload date:
  • Size: 59.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for inductive-0.0.1.post1.tar.gz
Algorithm Hash digest
SHA256 fff7522d6be2f747a48b1713f60a157bf52916e715e91839f693941f7c8acb2a
MD5 71370e3fc51131922eb4655e67f464d6
BLAKE2b-256 6c3591163c832e010772064dd6c9d67952f2e185e1aec895e5512dbf33cca865

See more details on using hashes here.

File details

Details for the file inductive-0.0.1.post1-py3-none-any.whl.

File metadata

File hashes

Hashes for inductive-0.0.1.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 1d38604e910295d54bbd832c5e0bcc7c06a880052fd6f724dc2fdf90cab0a906
MD5 e9c4d44756d7a1043092e3b546aaf527
BLAKE2b-256 5ff51dbb637acfdb3736cd12af3127783c4baa6846d77c22c285a1fd50006f6f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page