{"id":31827392,"url":"https://github.com/karpeleslab/lambda","last_synced_at":"2025-10-11T18:26:01.077Z","repository":{"id":317283690,"uuid":"1066754399","full_name":"KarpelesLab/lambda","owner":"KarpelesLab","description":null,"archived":false,"fork":false,"pushed_at":"2025-09-30T01:20:08.000Z","size":35,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-09-30T01:21:41.823Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KarpelesLab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-29T23:12:06.000Z","updated_at":"2025-09-30T01:20:12.000Z","dependencies_parsed_at":"2025-09-30T01:36:17.352Z","dependency_job_id":null,"html_url":"https://github.com/KarpelesLab/lambda","commit_stats":null,"previous_names":["karpeleslab/lambda"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/KarpelesLab/lambda","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Flambda","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Flambda/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Flambda/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Flambda/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KarpelesLab","download_url":"https://codeload.github.com/KarpelesLab/lambda/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Flambda/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279008280,"owners_count":26084431,"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","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"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":[],"created_at":"2025-10-11T18:25:57.326Z","updated_at":"2025-10-11T18:26:01.071Z","avatar_url":"https://github.com/KarpelesLab.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lambda Calculus Library\n\nA pure Go implementation of lambda calculus with Church encoding, providing a foundation for functional programming and computational theory exploration.\n\n## Overview\n\nThis library implements the lambda calculus, a formal system for expressing computation based on function abstraction and application. It includes Church encodings for booleans, numbers, and common operations, demonstrating that complex computations can be built from simple lambda expressions.\n\nFor an excellent introduction to lambda calculus, watch [What is PLUS times PLUS?](https://www.youtube.com/watch?v=RcVA8Nj6HEo).\n\n## Installation\n\n```bash\ngo get github.com/KarpelesLab/lambda\n```\n\n## Core Types\n\nThe library provides three main types implementing the `lambda.Object` interface:\n\n- **`Var`** - Variables (e.g., `x`, `y`)\n- **`Abstraction`** - Lambda abstractions (e.g., `λx.x`)\n- **`Application`** - Function applications (e.g., `f x`)\n\n## Basic Usage\n\n### Creating Lambda Terms\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/KarpelesLab/lambda\"\n)\n\nfunc main() {\n    // Identity function: λx.x\n    identity := lambda.Abstraction{\n        Param: \"x\",\n        Body:  lambda.Var{Name: \"x\"},\n    }\n    fmt.Println(identity) // λx.x\n\n    // Apply identity to a variable: (λx.x) y\n    applied := lambda.Application{\n        Func: identity,\n        Arg:  lambda.Var{Name: \"y\"},\n    }\n    fmt.Println(applied) // (λx.x) y\n\n    // β-reduction\n    result, _ := applied.BetaReduce()\n    fmt.Println(result) // y\n}\n```\n\n### Church Numerals\n\nChurch numerals encode natural numbers as lambda functions:\n\n```go\n// Create Church numerals\nzero := lambda.ChurchNumeral(0)   // λf.λx.x\nthree := lambda.ChurchNumeral(3)  // λf.λx.f (f (f x))\n\n// Convert back to integers\nfmt.Println(lambda.ToInt(three))  // 3\n```\n\n### Arithmetic Operations\n\n```go\n// Addition: 2 + 3\ntwo := lambda.ChurchNumeral(2)\nthree := lambda.ChurchNumeral(3)\n\nsum := lambda.Application{\n    Func: lambda.Application{\n        Func: lambda.PLUS,\n        Arg:  two,\n    },\n    Arg: three,\n}\n\n// Reduce to normal form\nfor i := 0; i \u003c 100; i++ {\n    reduced, didReduce := sum.BetaReduce()\n    if !didReduce {\n        break\n    }\n    sum = reduced\n}\n\nfmt.Println(lambda.ToInt(sum)) // 5\n```\n\n### Factorial Example\n\n```go\n// Calculate factorial(3)\nthree := lambda.ChurchNumeral(3)\n\nresult := lambda.Application{\n    Func: lambda.FACTORIAL,\n    Arg:  three,\n}\n\n// Reduce (may take multiple steps)\nfor i := 0; i \u003c 1000; i++ {\n    reduced, didReduce := result.BetaReduce()\n    if !didReduce {\n        break\n    }\n    result = reduced\n}\n\nfmt.Println(lambda.ToInt(result)) // 6\n```\n\n## Built-in Functions\n\n### Boolean Logic\n\n- **`TRUE`** - λx.λy.x\n- **`FALSE`** - λx.λy.y\n- **`AND`** - λp.λq.p q p\n- **`OR`** - λp.λq.p p q\n- **`NOT`** - λp.p FALSE TRUE\n- **`IFTHENELSE`** - λp.λa.λb.p a b\n\n### Arithmetic\n\n- **`SUCC`** - Successor function\n- **`PLUS`** - Addition\n- **`MULT`** - Multiplication\n- **`POW`** - Exponentiation\n- **`SUB`** - Subtraction\n- **`PRED`** - Predecessor (using Φ combinator)\n\n### Predicates\n\n- **`ISZERO`** - Tests if a number is zero\n- **`LEQ`** - Less than or equal comparison\n\n### Pairs and Lists\n\n- **`PAIR`** - Creates a pair\n- **`FIRST`** - Extracts first element\n- **`SECOND`** - Extracts second element\n- **`NIL`** - Empty list\n- **`NULL`** - Tests if list is empty\n\n### Recursion\n\n- **`Y`** - Y combinator for recursion\n- **`FACTORIAL`** - Factorial function (using Y combinator)\n\n## Operations\n\n### α-conversion (Alpha Conversion)\n\nRenames bound variables to avoid name conflicts:\n\n```go\nterm := lambda.Abstraction{\n    Param: \"x\",\n    Body:  lambda.Var{Name: \"x\"},\n}\nrenamed := term.AlphaConvert(\"x\", \"y\") // λx.x → λy.y\n```\n\n### β-reduction (Beta Reduction)\n\nApplies functions to arguments:\n\n```go\n// (λx.x) y → y\nterm := lambda.Application{\n    Func: lambda.Abstraction{Param: \"x\", Body: lambda.Var{Name: \"x\"}},\n    Arg:  lambda.Var{Name: \"y\"},\n}\nresult, reduced := term.BetaReduce()\n// result: y, reduced: true\n```\n\n### η-conversion (Eta Conversion)\n\nSimplifies expressions by removing redundant abstractions:\n\n```go\n// λx.(f x) → f (when x is not free in f)\nterm := lambda.Abstraction{\n    Param: \"x\",\n    Body: lambda.Application{\n        Func: lambda.Var{Name: \"f\"},\n        Arg:  lambda.Var{Name: \"x\"},\n    },\n}\nresult, converted := term.EtaConvert()\n// result: f, converted: true\n```\n\n## Advanced Features\n\n### Capture-Avoiding Substitution\n\nThe library automatically performs α-conversion to prevent variable capture during substitution:\n\n```go\n// (λy.x)[x := y] automatically renames y to avoid capture\nabs := lambda.Abstraction{Param: \"y\", Body: lambda.Var{Name: \"x\"}}\nresult := abs.Substitute(\"x\", lambda.Var{Name: \"y\"})\n// Result is automatically renamed to avoid capture\n```\n\n### Free Variables\n\nCheck which variables are free in an expression:\n\n```go\nterm := lambda.Abstraction{\n    Param: \"x\",\n    Body:  lambda.Var{Name: \"y\"},\n}\nfreeVars := term.FreeVars() // map[string]bool{\"y\": true}\n```\n\n## Examples\n\nSee `lambda_test.go` for comprehensive examples including:\n- Church numeral operations\n- Boolean logic\n- Arithmetic computations\n- Factorial calculation\n- Reduction strategies\n\n## Theory\n\nLambda calculus consists of three basic constructs:\n\n1. **Variables**: `x`, `y`, `z`...\n2. **Abstraction**: `λx.M` (function definition)\n3. **Application**: `M N` (function application)\n\nThese simple constructs are Turing-complete, capable of expressing any computable function.\n\n## References\n\n- [What is PLUS times PLUS? - Lambda Calculus Explained](https://www.youtube.com/watch?v=RcVA8Nj6HEo)\n- Church, A. (1936). \"An Unsolvable Problem of Elementary Number Theory\"\n- Barendregt, H. P. (1984). \"The Lambda Calculus: Its Syntax and Semantics\"\n\n## License\n\nThis library is part of the KarpelesLab suite of tools.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarpeleslab%2Flambda","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarpeleslab%2Flambda","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarpeleslab%2Flambda/lists"}