{"id":32111993,"url":"https://github.com/dalev/minikanren-typed-racket","last_synced_at":"2026-02-21T03:01:52.150Z","repository":{"id":62424445,"uuid":"296906600","full_name":"dalev/minikanren-typed-racket","owner":"dalev","description":"An implementation of miniKanren in Typed Racket.","archived":false,"fork":false,"pushed_at":"2021-05-03T19:20:28.000Z","size":463,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-07T09:32:57.636Z","etag":null,"topics":["minikanren","racket","typed-racket"],"latest_commit_sha":null,"homepage":"","language":"Racket","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dalev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-19T16:19:08.000Z","updated_at":"2026-01-17T15:24:20.000Z","dependencies_parsed_at":"2022-11-01T18:01:05.422Z","dependency_job_id":null,"html_url":"https://github.com/dalev/minikanren-typed-racket","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dalev/minikanren-typed-racket","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalev%2Fminikanren-typed-racket","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalev%2Fminikanren-typed-racket/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalev%2Fminikanren-typed-racket/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalev%2Fminikanren-typed-racket/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dalev","download_url":"https://codeload.github.com/dalev/minikanren-typed-racket/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalev%2Fminikanren-typed-racket/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29672254,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T00:11:43.526Z","status":"online","status_checked_at":"2026-02-21T02:00:07.432Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["minikanren","racket","typed-racket"],"created_at":"2025-10-20T14:55:01.329Z","updated_at":"2026-02-21T03:01:52.144Z","avatar_url":"https://github.com/dalev.png","language":"Racket","funding_links":[],"categories":[],"sub_categories":[],"readme":"This is a relatively bare-bones version of [miniKanren](http://minikanren.org) implemented in Typed Racket.  The only constraint currently supported is unification (`==`).  We use a fair/interleaved search strategy, consistent with the spirit of miniKanren.\nTo build goals, we support:\n- `(fresh (x ...) goal0 goal ...)`\n- `(conj goal0 goal ...)`\n- `(disj goal0 goal...)`\n- `(conde ([goal0 goal ...] ...))`\n- `(ifte g0 g1 g2)`\n- `(once g)`\n- `fail`\n- `succeed`\n- `(== term0 term1)`\n\nwhere terms are given by the type:\n```\n(define-type Term \n  (U var\n     Number\n     Symbol\n     Null \n     (Pair Term Term)))\n```\nTo obtain a list of solutions, use:\n- `(run N x goal0 goal ...)`\n- `(run N (x ...) goal0 goal ...)`\n- `(run* x goal0 goal ...)` \n- `(run* (x ...) goal0 goal ...)`\n\nwhere `N` is a non-negative integer bounding the number of desired solutions.  If you use `N = #f`, that's equivalent to using `run*`.\n\nThis implementation can only be used by other _Typed_ Racket modules due to \n[restrictions](https://docs.racket-lang.org/ts-guide/caveats.html#%28part._.Macros_and_compile-time_computation%29)\non how macros exported from typed modules can be used.\n\nOn the plus side though, Typed Racket clients do not incur any contract checking overhead that would happen if they instead imported an untyped miniKanren implementation.\n\nWe implement backtracking search using an adaptation of the two-continuation \nbacktracking monad described by Kiselyov et al. in their ICFP 2005 paper \n[Backtracking, Interleaving, and Terminating Monad Transformers](http://homes.sice.indiana.edu/ccshan/logicprog/LogicT-icfp2005.pdf).\n\nSubstitutions are represented using a skew binary random access list, as described in \n[Efficient Representations for Triangular Substitutions](https://www.researchgate.net/publication/238089215_Efficient_representations_for_triangular_substitutions_A_comparison_in_miniKanren).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalev%2Fminikanren-typed-racket","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdalev%2Fminikanren-typed-racket","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalev%2Fminikanren-typed-racket/lists"}