Commit Graph

144 Commits

Author SHA1 Message Date
LunaAmora
69bbdfc382 Update kind2.hvm2 to the latest changes 2024-03-14 09:05:21 -03:00
LunaAmora
f1615e4a6b Add Kind2.hvm2 and cli for choosing the runtime 2024-03-14 08:35:22 -03:00
Victor Taelin
981b8afe90 fix unchecked let 2024-03-14 00:21:21 -03:00
Victor Taelin
b489c148bf equal / refl syntax and stuff 2024-03-13 22:32:30 -03:00
Victor Taelin
3f1cdd2996 cleanup ai interactions 2024-03-13 16:21:24 -03:00
Victor Taelin
d059c82c1f ADTs & match - complete
ADTs can be defined with the syntax:

data Vector T (len: Nat)
| cons (len: Nat) (head: T) (tail: (Vector T len)) : (Vector T (Nat.succ len))
| nil : (Vector T Nat.zero)

Which will convert to the equivalent inductive λ-encoding (via self).

Pattern-matching has the syntax:

match x = expr with (a: A) (b: B) ... {
  ctr0: ret0
  ctr1: ret1
}: motive

The 'with' syntax is used to explicitly move values down the cases,
crating lambdas for them. This linearizes them (which avoids cloning)
and specializes their type w.r.t. the matched value, for proving.

We also allow a shorthand for top-level definitions, as:

foo (a: A) (b: B) ... : R =
  body

This will auto-add lambdas before 'body'. If 'body' is a pattern-match,
the lambdas will be automatically moved down, so this has the effect of
linearizing top-level args, without needing explicit 'with' annotations.
2024-03-13 15:05:52 -03:00
Victor Taelin
0c34404c0b use-declarations with shadowing 2024-03-12 18:01:12 -03:00
Victor Taelin
dc993b5de0 pattern-match syntax 2024-03-12 13:44:49 -03:00
Victor Taelin
24b83350c6 ADT syntax continuation 2024-03-12 11:55:09 -03:00
Victor Taelin
29de8994d2 progress on ADT parsing 2024-03-11 22:45:46 -03:00
Victor Taelin
76320ddb7f initial ADT formatter 2024-03-09 19:16:24 -03:00
Victor Taelin
dc5997bde8 list/nat syntax sugars, reorganizations 2024-03-09 17:59:39 -03:00
Victor Taelin
d617aeac49 cleanup 2024-03-08 19:10:37 -03:00
Victor Taelin
85ad65b026 use-notation
Now, there are two local binders:

let x = ...
use x = ...

The 'let' binder will create a local definition, type-check it, and
assign a name to it. When compiled, it will create 'dup' nodes.

The 'use' binder is just an alias. It will not bind a new variable, and,
when compiled, will create inline copies. Also, for type-checking, it
allows creating aliases that are definitionaly equal for the checker.
2024-03-08 17:39:37 -03:00
Victor Taelin
97015e9390 missing files? 2024-03-07 18:08:04 -03:00
Victor Taelin
f9a5bdb963 mixed checking order for better unification
on the `infer` function, we usually have something like this:

    infer (App f x) ctx =
      infer <- infer f ctx
      case infer of
        All a b -> do
          check x a ctx
          return $ out arg
        otherwise ->
          fail

this causes `x : a` to be happen before `infer (f x)` returns `b x`.
this is generally fine, but, in situations such as dependent
eliminations:

    λx (bool-elim ?A x t f) : (P x)

we really want `(elim ...)` to return `P x` BEFORE we check `t : ?A
true` and `t : ?A false`. that would allow the unification problem `?A x
== P x` to generate the solution `?A = λx (P x)` **before** the `t : ?A
true` check possibly fails.

being able to fill that metavar is very important for Kind2, since that
would allow us to omit motives in pattern-matches. because of that, I
think that the more sensible order is for infer to return its result
first, and then its inner checks occur. this is via a very lightweight
mechanism that consists of a list of suspended checks (`susp`), which we
push to inside `infer`, and fully consume inside `check`.

this is a middle-ground between checking in order (from left-to-right)
and a more complex suspension mechanism (involving dependency graphs).
with this simple solution, we're able to use metavars inside the motive
of dependent eliminations, greatly reducing the need for annotations in
practical code.
2024-03-06 22:29:33 -03:00
Victor Taelin
edbaf3048d simplified unification algorithm 2024-03-06 20:01:32 -03:00
Victor Taelin
c8bf072145 working hs 2024-03-06 11:35:17 -03:00
Victor Taelin
b2eb7610f4 fix type error, re-add qbool matchers 2024-03-01 23:31:05 -03:00
Victor Taelin
3baa0e392e revert kind2.hvm1 2024-03-01 23:18:30 -03:00
Victor Taelin
c3882799b3 initial haskell port, for type-checking
since hvm is untyped, it is hard to spot type errors, and debugging is
still not very mature, so I'll keep a haskell view of kind2 to debug
2024-03-01 23:11:05 -03:00
Victor Taelin
e849d16aee auto formatter 2024-03-01 20:40:31 -03:00
Victor Taelin
21dd404798 reorganize repo, split files 2024-03-01 14:30:11 -03:00
Victor Taelin
10da6d2afb fix obliterate 2024-03-01 12:21:43 -03:00
Victor Taelin
9ef466ee48 remove check.hvm1 2024-03-01 12:21:26 -03:00
Victor Taelin
36e53b7800 fix error 2024-03-01 12:21:11 -03:00
Victor Taelin
37f9c47e98 improve errors 2024-03-01 12:13:31 -03:00
Victor Taelin
fdbc3d013c move pretty-printing to rust-side; hvm1 just outputs serialized messages 2024-03-01 11:57:40 -03:00
Victor Taelin
a0d2eecf24 hole syntax just underscore 2024-02-29 21:48:42 -03:00
Victor Taelin
2cd7b5261a printing polishments, checkpoint 2024-02-29 19:21:48 -03:00
Victor Taelin
86651018e5 improvements 2024-02-29 18:45:40 -03:00
Victor Taelin
b4a49abab7 separate metas for unification and holes for inspection; bugfixes 2024-02-29 17:30:20 -03:00
Victor Taelin
03ba63a233 initial bidirectional unifier 2024-02-29 14:00:34 -03:00
Victor Taelin
5f12049dec Revert "wip"
This reverts commit 4fd07958bc.
2024-02-26 23:10:29 -03:00
Victor Taelin
51b65d581f Revert "fixes"
This reverts commit 0ea8ff35c4.
2024-02-26 23:10:25 -03:00
Victor Taelin
0ea8ff35c4 fixes 2024-02-26 23:09:34 -03:00
Victor Taelin
4fd07958bc wip 2024-02-26 21:57:05 -03:00
Victor Taelin
9a6ffc9a81 fix txt reducer 2024-02-25 21:17:09 -03:00
Victor Taelin
06e2991e59 typo 2024-02-25 20:53:25 -03:00
Victor Taelin
c8fd9e54d5 improved equality - check docs/equality.md 2024-02-25 19:46:44 -03:00
Victor Taelin
6dbe738b4c Working Rust CLI! Pretty errors. Many improvements 2024-02-24 20:50:01 -03:00
Victor Taelin
ee3c1550d9 initial port from ts to rust 2024-02-23 22:19:24 -03:00
Victor Taelin
bcf7fd28b9 giving up on bootstrapping due to parser perf
initially, I wanted Kind2 to be bootstrapped, but I'm facing
difficulties, because pure hvm parser is still much slower than the
typescript parser; a few seconds vs instant to parse the entire
codebase. I think HVM2 will need to have proper immutable strings (i.e.,
nodes that expand as if they were cons-strings, but are stored as
buffers) before it can have fast parsers. as such, I'm making the
decision to NOT bootstrap it now. that is a tough decision becase,
honestly, if we don't do it as soon as possible in the development
process, it is very unlikely we'll ever do it. but the tech isn't ready
for it, and we need to move forward, so, that's the only solution.

as such, I'll be rewritting the typescript to Rust, and we'll have a
very similar design to former Kind2, with Rust doing the parsing, IO and
error reporting, and a checker.hvm1 / checker.hvm2 file doing the actual
type-checking (and HOAS-based type-level evaluation).

also, I believe we'll not even generate .hvm from a .kind bootstrap.
while losing types is significant, being able to manually edit the HVM
is very helpful to debugging, it simplifies and accelerates the
development process and removes many complications that are bought by
bootstrapping
2024-02-23 14:28:04 -03:00
Victor Taelin
cc0bffb22c recursive Kind2 file loader works now...
someone acquired debt today
2024-02-22 23:43:20 -03:00
Victor Taelin
ab98950f50 wip 2024-02-22 21:31:53 -03:00
Victor Taelin
dd47b11576
Merge pull request #2 from Derenash/master
Add Binary Balanced Tree
2024-02-22 17:01:41 -03:00
Victor Taelin
f3451e442b WIP - breaking; will update after the map merge 2024-02-22 17:01:05 -03:00
Victor Taelin
e4b262f9d1 many things 2024-02-21 22:10:51 -03:00
Derenash
3f1828cb0a add extra lines to test6 for merge facility 2024-02-21 12:21:03 -03:00
Derenash
0f7ebfe06d deleting and commenting few U60 files 2024-02-21 12:18:31 -03:00