A next-gen functional language
Go to file
Felipe G 02c9fb53ef
Merge pull request #419 from developedby/kdl-name-non-capital
feat: Remove capitalized kdl name restriction
2022-11-15 08:43:36 -03:00
.github/workflows Removed useless line in ci 2022-09-26 11:09:39 -03:00
example Add example 2022-09-21 13:05:53 -03:00
src feat: Remove capitalized kdl name restriction 2022-11-15 10:03:11 +01:00
tests feat: Use hash of name instead of random chars for long kdl names 2022-10-26 14:29:46 +02:00
.gitignore Fix version 2022-09-21 13:05:53 -03:00
Cargo.lock feat: Use hash of name instead of random chars for long kdl names 2022-10-26 14:29:46 +02:00
Cargo.toml feat: Use hash of name instead of random chars for long kdl names 2022-10-26 14:29:46 +02:00
CHANGELOG.md Added configuration and some fixes 2022-09-21 13:05:53 -03:00
README.md Fixed a typo in the map function example 2022-10-04 00:45:09 -07:00
rustfmt.toml Code style improvements 2022-09-21 13:05:53 -03:00
SYNTAX.md fix: Remove copy/paste leftover in syntax.md 2022-11-10 17:49:53 +01:00

Kind2

Kind2 is a functional programming language and proof assistant.

It is a complete rewrite of Kind1, based on HVM, a lazy, non-garbage-collected and massively parallel virtual machine. In our benchmarks, its type-checker outperforms every alternative proof assistant by a far margin, and its programs can offer exponential speedups over Haskell's GHC. Kind2 unleashes the inherent parallelism of the Lambda Calculus to become the ultimate programming language of the next century.

Welcome to the inevitable parallel, functional future of computers!

Examples

Pure functions are defined via equations, as in Haskell:

// Applies a function to every element of a list
map <a> <b> (list: List a) (f: a -> b) : List b
map a b Nil              f = Nil
map a b (Cons head tail) f = Cons (f head) (map tail f)

Side-effective programs are written via monadic monads, resembling Rust and TypeScript:

// Prints the double of every number up to a limit
Main : IO (Result () String) {
  ask limit = IO.prompt "Enter limit:"
  for x in (List.range limit) {
    IO.print "{} * 2 = {}" x (Nat.double x)
  }
  return Ok ()
}

Theorems can be proved inductivelly, as in Agda and Idris:

// Black Friday Theorem. Proof that, for every Nat n: n * 2 / 2 == n.
black_friday_theorem (n: Nat) : Equal Nat (Nat.half (Nat.double n)) n
black_friday_theorem Nat.zero     = Equal.refl
black_friday_theorem (Nat.succ n) = Equal.apply (x => Nat.succ x) (black_friday_theorem n)

For more examples, check the Wikind.

Usage

First, install Rust first, then enter:

cargo install kind2

Then, use any of the commands below:

Command Usage Note
Check kind2 check file.kind2 Checks all definitions.
Eval kind2 eval file.kind2 Runs using the type-checker's evaluator.
Run kind2 run file.kind2 Runs using HVM's evaluator, on Rust-mode.
To-HVM kind2 to-hvm file.kind2 Generates a .hvm file. Can then be compiled to C.
To-KDL kind2 to-kdl file.kind2 Generates a .kdl file. Can then be deployed to Kindelia.

Executables can be generated via HVM:

kind2 to-hvm file.kind2
hvm compile file.hvm
clang -O2 file.c -o file
./file