{"id":26256464,"url":"https://github.com/groupoid/leslie","last_synced_at":"2025-10-09T19:08:44.484Z","repository":{"id":280817402,"uuid":"943273503","full_name":"groupoid/leslie","owner":"groupoid","description":"Верифікатор розподілених у просторі і часі протоколів TLA+","archived":false,"fork":false,"pushed_at":"2025-03-05T13:34:52.000Z","size":0,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-05T13:40:15.909Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://leslie.groupoid.space/","language":"OCaml","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/groupoid.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-05T12:49:15.000Z","updated_at":"2025-03-05T13:34:56.000Z","dependencies_parsed_at":"2025-03-05T13:40:19.439Z","dependency_job_id":"ff295a12-79f7-4aa8-b1ca-2aa225ee58f1","html_url":"https://github.com/groupoid/leslie","commit_stats":null,"previous_names":["groupoid/leslie"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupoid%2Fleslie","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupoid%2Fleslie/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupoid%2Fleslie/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupoid%2Fleslie/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/groupoid","download_url":"https://codeload.github.com/groupoid/leslie/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243475365,"owners_count":20296714,"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":[],"created_at":"2025-03-13T20:18:12.084Z","updated_at":"2025-10-09T19:08:39.460Z","avatar_url":"https://github.com/groupoid.png","language":"OCaml","funding_links":[],"categories":[],"sub_categories":[],"readme":"Leslie: TLA+\n============\n\n\u003cimg src=\"https://leslie.groupoid.space/img/Leslie_Lamport.jpg\"\u003e\n\nLeslie is a formally specified language implemented in OCaml, featuring a statically typed subset\nof TLA+ with primitive types (`Int`, `Bool`, `String`), basic arithmetic `+`, comprehensive comparison\noperators `\u003c`, `=`, `\u003e`, `\u003c=`, `\u003e=`, logical connectives `/\\`, `\\/`, `\\lnot`, `=\u003e`,\nset operations `\\in`, `\\cup`, `\\subseteq`, literal sets), function constructs (application and lambda expressions),\nrecord operations, a nondeterministic choice operator `CHOOSE`, a modular action system (next-state assignments,\nstuttering, `UNCHANGED`, `ENABLED`, conjunction), and a recursive temporal logic system `[]`, `\u003c\u003e`, `~\u003e`,\nsupported by a Hindley-Milner-style type inference mechanism, though it omits TLA+’s full\narithmetic suite, advanced set operations, quantifiers, fairness conditions, and module-level declarations.\n\nFeatures\n--------\n\n* Core TLA+ constructs `sets`, `functions`, `records`.\n* Temporal operators `[]`, `\u003c\u003e`, `~\u003e`.\n* Primed variables and actions with stuttering subscripts `[A]_v`.\n* Comparison operators (`\u003c`, `=`, `\u003e`, `\u003c=`, `\u003e=`).\n* `UNCHANGED`, `ENABLED`, `CHOOSE`.\n\nSyntax\n------\n\n```\ntype expr =\n  | EInt of int\n  | EBool of bool\n  | EString of string\n  | EVar of string\n  | EIn of expr * expr\n  | EUnion of expr * expr\n  | ESubset of expr * expr\n  | EIntersect of expr * expr\n  | EMinus of expr * expr\n  | EPowerset of expr\n  | EFun of string * expr * expr\n  | EApp of expr * expr\n  | ERec of (string * expr) list\n  | EField of expr * string\n  | EAnd of expr * expr\n  | EOr of expr * expr\n  | ENot of expr\n  | EImply of expr * expr\n  | EPlus of expr * expr\n  | ESet of expr list\n  | ELess of expr * expr\n  | EEq of expr * expr\n  | EGreater of expr * expr\n  | ELessEq of expr * expr\n  | EGreaterEq of expr * expr\n  | EChoose of string * expr * expr\n  | EForall of string * expr * expr\n  | EExists of string * expr * expr\n```\n\n```\ntype action =\n  | ANext of string * expr\n  | AUnchanged of string list\n  | AEnabled of action\n  | AConj of action * action\n  | AExpr of expr\n  | AStutter of action * string list\n```\n\n```\ntype temporal =\n  | TAlways of temporal\n  | TEventually of temporal\n  | TLeadsTo of temporal * temporal\n  | TAction of action\n```\n\nTests\n-----\n\n```\nTest '1 \\in {1, 2, 3}': Bool\nTest '([x \\in {1, 2} |-\u003e x + 1])[2]': Int\nTest '[a |-\u003e 1, b |-\u003e TRUE].b': Bool\nTest 'TRUE /\\ (1 \\in {1})': Bool\nTest '1 + TRUE': Type error - Type mismatch\nTest '([x \\in {1, 2} |-\u003e x + 1])[\"hello\"]': Type error - Type mismatch\nTest '[]TRUE': Formula\nTest '\u003c\u003e(1 \\in {1, 2})': Formula\nTest '[]1': Type error - Type mismatch\nTest '\u003c\u003e(x + 1)': Type error - Type mismatch\nTest '(1 \\in {1}) ~\u003e TRUE': Formula\nTest '1 ~\u003e TRUE': Type error - Type mismatch\nTest 'x' = x + 1': Bool\nTest '[x' = x + 1]_x': Bool\nTest 'x \u003c 2': Bool\nTest 'x = x'': Bool\nTest 'x \u003c TRUE': Type error - Type mismatch\nTest '[](x \u003c 2)': Formula\nTest '[x' = x + 1]_y': Type error - Primed variable x not in action variables y\nTest '[y' = x + 1]_{x,y}': Bool\nTest 'x \u003e 2': Bool\nTest 'x \u003c= y': Bool\nTest 'x \u003e= 1': Bool\nTest 'x \u003e TRUE': Type error - Type mismatch\nTest 'UNCHANGED \u003c\u003cx\u003e\u003e': Bool\nTest 'UNCHANGED \u003c\u003cx, y\u003e\u003e': Bool\nTest 'UNCHANGED \u003c\u003cz\u003e\u003e': Type error - Unbound variable in UNCHANGED: z\nTest '[UNCHANGED \u003c\u003cx\u003e\u003e]_x': Bool\nTest '{1} \\subseteq {1, 2}': Bool\nTest '{1} \\subseteq 1': Type error - Type mismatch\nTest 'TRUE \\/ FALSE': Bool\nTest '1 \\/ 2': Type error - Type mismatch\nTest '\\lnot TRUE': Bool\nTest '\\lnot 1': Type error - Type mismatch\nTest 'TRUE =\u003e FALSE': Bool\nTest 'x =\u003e 1': Type error - Type mismatch\nTest 'ENABLED (x' = x + 1)': Bool\nTest 'CHOOSE x \\in {1, 2}: x \u003e 0': Int\nTest 'CHOOSE x \\in {1, 2}: TRUE': Int\nTest 'CHOOSE x \\in {1, 2}: x': Type error - Type mismatch\nTest 'CHOOSE x \\in 1: x \u003e 0': Type error - Type mismatch\nTest '{1, 2} \\cap {2, 3}': Set(Set(Int))\nTest '{1, 2} \\ {2}': Set(Set(Int))\nTest 'POWERSET {1, 2}': Set(Set(Int))\nTest '{1} \\cap 1': Type error - Type mismatch\nTest '\\A x \\in {1, 2}: x \u003e 0': Bool\nTest '\\E x \\in {1, 2}: x \u003e 0': Bool\nTest '\\A x \\in {1, 2}: x': Type error - Type mismatch\nTest 'WF_x(x' = x + 1)': Formula\nTest 'SF_{x,y}(y' = x)': Formula\n```\n\nAuthor\n------\n\n* Namdak Tonpa\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgroupoid%2Fleslie","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgroupoid%2Fleslie","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgroupoid%2Fleslie/lists"}