{"id":20606002,"url":"https://github.com/totbwf/muprl","last_synced_at":"2025-07-02T22:33:15.212Z","repository":{"id":87348672,"uuid":"124326535","full_name":"TOTBWF/muprl","owner":"TOTBWF","description":"A small NuPRL style proof assistant","archived":false,"fork":false,"pushed_at":"2019-01-31T03:15:51.000Z","size":113,"stargazers_count":31,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-15T02:39:46.459Z","etag":null,"topics":["computational-type-theory","nuprl","proof-assistant"],"latest_commit_sha":null,"homepage":null,"language":"Haskell","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/TOTBWF.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-03-08T02:44:15.000Z","updated_at":"2025-01-24T16:04:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"b781715c-0ad0-40ae-bbb5-2b77cd1ac343","html_url":"https://github.com/TOTBWF/muprl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/TOTBWF/muprl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TOTBWF%2Fmuprl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TOTBWF%2Fmuprl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TOTBWF%2Fmuprl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TOTBWF%2Fmuprl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TOTBWF","download_url":"https://codeload.github.com/TOTBWF/muprl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TOTBWF%2Fmuprl/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263226877,"owners_count":23433798,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["computational-type-theory","nuprl","proof-assistant"],"created_at":"2024-11-16T09:32:01.694Z","updated_at":"2025-07-02T22:33:15.153Z","avatar_url":"https://github.com/TOTBWF.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MuPRL\nMuPRL is a small, mainly instructional, proof assistant in the style of NuPRL. For a good introduction to Computational Type Theory, see [this](http://www.nuprl.org/documents/Constable/naive.pdf).\n\n# Examples\nLet's try to prove a very simple tautology: \"for every proposition a, a implies a\".\n```\nTheorem i : (a:universe 0) -\u003e (x:a) -\u003e a {\n    id\n}\n```\nIf we try running this, we will get the following message:\n```\nError:\n    Unproved Subgoals:   ⊢ (a:universe 0) -\u003e (x:a) -\u003e a\n```\nTo start, we are going to need to add `(a:universe 0)` and `(x:a)` as hypotheses. For this we can use the `fun/intro` rule.\n\n```\nTheorem i : (a:universe 0) -\u003e (x:a) -\u003e a {\n    rule fun/intro\n}\n```\nThis generates the following subgoals.\n\n```\nUnproved Subgoals:  a:universe 0 ⊢ (x:a) -\u003e a\n                        ⊢ universe 0 = universe 0 in universe 1\n```\nThe first one should be pretty self explanitory, but the second one is a bit more bizzare. It \nessentially is asking us to show that `universe 0` is a valid proposition.\n\nBoth of these subgoals are going to need different rules applied to them. To do this, we can use `[]` to specify which\ngoal we want to apply a rule to, and `;` to sequence.\n\n```\nTheorem i : (a:universe 0) -\u003e (x:a) -\u003e a {\n    rule fun/intro; [rule fun/intro, rule universe/eqtype]\n}\n```\n\n```\nUnproved Subgoals:  a:universe 0, x:a ⊢ a\n                    a:universe 0 ⊢ a = a in universe 0\n```\n\nThe 1st goal should be pretty easy to prove, as it is already in our hypotheses! As for the second one, we can use `eq/intro` to prove it.\n\n```\nTheorem i : (a:universe 0) -\u003e (x:a) -\u003e a {\n    rule fun/intro; [rule fun/intro; [rule assumption, rule eq/intro], rule universe/eqtype]\n}\n```\n\nIf we run this, we get the output `\\a. \\x. x`, which is a program that meets our specification! This means that our proof is complete. However, this seems like quite a lot of busy work for what should be a very simple proof. To remedy this, we can use some more complicated tactics. For starters, we can use the `intro` tactic to automatically select the proper introduction rule for us.\n\n```\nTheorem i : (a:universe 0) -\u003e (x:a) -\u003e a {\n    intro; [intro; [rule assumption, intro], rule universe/eqtype]\n}\n```\n\nAlso, we seem to be applying the `intro` rule quite a few times in a row, so we can use the `*` tactic to run the `intro` tactic repeatedly until it fails.\n\n```\nTheorem i : (a:universe 0) -\u003e (x:a) -\u003e a {\n    *intro; [rule assumption, rule universe/eqtype]\n}\n```\n\n\n# Building\n```\nstack build \u0026\u0026 stack exec muprl\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftotbwf%2Fmuprl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftotbwf%2Fmuprl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftotbwf%2Fmuprl/lists"}