mk: phase 3 — run* / run / reify, 18 new tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 51s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 51s
run.sx: reify-name builds canonical "_.N" symbols; reify-s walks a term left-to-right and assigns each unbound var its index in the discovery order; reify combines the two with two walk* passes. run-n is the runtime defmacro: binds the query var, takes ≤ n stream answers, reifies each. run* and run are sugar around it. First classic miniKanren tests green: (run* q (== q 1)) → (1) (run* q (conde ((== q 1)) ((== q 2)))) → (1 2) (run* q (fresh (x y) (== q (list x y)))) → ((_.0 _.1)) 128/128 cumulative.
This commit is contained in:
@@ -86,15 +86,18 @@ Key semantic mappings:
|
||||
- [x] Tests: basic goal composition, backtracking, interleaving (110 cumulative)
|
||||
|
||||
### Phase 3 — run + reification
|
||||
- [ ] `run*` `goal` → list of all answers (reified)
|
||||
- [ ] `run n` `goal` → list of first n answers
|
||||
- [ ] `reify` `term` `subst` → replace unbound vars with `_0`, `_1`, ... names
|
||||
- [ ] `reify-s` → builds reification substitution for naming unbound vars consistently
|
||||
- [ ] `fresh` with multiple variables: `(fresh (x y z) goal)` sugar
|
||||
- [ ] Query variable conventions: `q` as canonical query variable
|
||||
- [ ] Tests: classic miniKanren programs — `(run* q (== q 1))` → `(1)`,
|
||||
- [x] `run*` `goal` → list of all answers (reified). defmacro: bind q-name as
|
||||
fresh var, conj goals, take all from stream, reify each.
|
||||
- [x] `run n` `goal` → list of first n answers (defmacro; n = -1 means all)
|
||||
- [x] `reify` `term` `subst` → walk* + build reification subst + walk* again
|
||||
- [x] `reify-s` → maps each unbound var (in left-to-right walk order) to a
|
||||
`_.N` symbol via `(make-symbol (str "_." n))`
|
||||
- [x] `fresh` with multiple variables — already shipped Phase 2B.
|
||||
- [x] Query variable conventions: `q` as canonical query variable (matches TRS)
|
||||
- [x] Tests: classic miniKanren programs — `(run* q (== q 1))` → `(1)`,
|
||||
`(run* q (conde ((== q 1)) ((== q 2))))` → `(1 2)`,
|
||||
Peano arithmetic, `appendo` preview
|
||||
`(run* q (fresh (x y) (== q (list x y))))` → `((_.0 _.1))`. Peano +
|
||||
`appendo` deferred to Phase 4.
|
||||
|
||||
### Phase 4 — standard relations
|
||||
- [ ] `appendo` `l` `s` `ls` — list append, runs forwards and backwards
|
||||
@@ -148,6 +151,12 @@ _(none yet)_
|
||||
|
||||
_Newest first._
|
||||
|
||||
- **2026-05-07** — **Phase 3 done** (run + reification): `lib/minikanren/run.sx` (~28 lines).
|
||||
`reify`/`reify-s`/`reify-name` for canonical `_.N` rendering of unbound vars in
|
||||
left-to-right occurrence order; `run*` / `run` / `run-n` defmacros. 18 new tests
|
||||
in `tests/run.sx`, including the **first classic miniKanren tests green**:
|
||||
`(run* q (== q 1))` → `(1)`; `(run* q (fresh (x y) (== q (list x y))))` →
|
||||
`((_.0 _.1))`. 128/128 cumulative.
|
||||
- **2026-05-07** — **Phase 2 piece D + done** (`condu` / `onceo`): `lib/minikanren/condu.sx`.
|
||||
Both are commitment forms: `onceo` is `(stream-take 1 ...)`; `condu` walks clauses
|
||||
and commits the first one whose head produces an answer. 10 tests in `tests/condu.sx`,
|
||||
|
||||
Reference in New Issue
Block a user