home / skills / plurigrid / asi / lambda-calculus

lambda-calculus skill

/skills/lambda-calculus

This skill analyzes and reduces lambda calculus terms, applying normal, applicative, lazy, and parallel strategies to reveal reductions and encodings.

npx playbooks add skill plurigrid/asi --skill lambda-calculus

Review the files below or copy the command above to add this skill to your agents.

Files (2)
SKILL.md
8.5 KB
---
name: lambda-calculus
description: Lambda Calculus Skill
version: 1.0.0
---


# lambda-calculus Skill


> *"Three rules. Infinite computation. The foundation of all functional programming."*

## Overview

**Lambda Calculus** implements Church's lambda calculus, the mathematical foundation of functional programming. Variables, abstraction, and application - that's all you need.

## GF(3) Role

| Aspect | Value |
|--------|-------|
| Trit | +1 (PLUS) |
| Role | GENERATOR |
| Function | Generates terms and reductions |

## The Three Rules

```
┌─────────────────────────────────────────────────────────────────┐
│                    LAMBDA CALCULUS SYNTAX                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  Term ::= x           Variable                                  │
│        |  λx. Term    Abstraction (function definition)        │
│        |  Term Term   Application (function call)               │
│                                                                 │
│  That's it. Everything else is encoded.                        │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

## β-Reduction

```
The only computation rule:

(λx. M) N  →β  M[x := N]

"Apply function λx.M to argument N by substituting N for x in M"

Example:
(λx. x x) (λy. y)
→β (λy. y) (λy. y)
→β λy. y

```

## Church Encodings

```haskell
-- Booleans
true  = λt. λf. t
false = λt. λf. f
if    = λb. λt. λf. b t f

-- Numbers (Church numerals)
zero  = λf. λx. x
one   = λf. λx. f x
two   = λf. λx. f (f x)
three = λf. λx. f (f (f x))

succ  = λn. λf. λx. f (n f x)
plus  = λm. λn. λf. λx. m f (n f x)
mult  = λm. λn. λf. m (n f)

-- Pairs
pair  = λx. λy. λf. f x y
fst   = λp. p (λx. λy. x)
snd   = λp. p (λx. λy. y)

-- Lists
nil   = λc. λn. n
cons  = λh. λt. λc. λn. c h (t c n)
```

## Fixed Point Combinator

```haskell
-- Y combinator: enables recursion without recursion!
Y = λf. (λx. f (x x)) (λx. f (x x))

-- Y F = F (Y F)
-- This gives us recursion in a language without built-in recursion

-- Example: factorial
fact = Y (λf. λn. if (isZero n) one (mult n (f (pred n))))
```

## Reduction Strategies

```python
class LambdaReducer:
    """Different reduction strategies for lambda calculus."""

    TRIT = 1  # GENERATOR role

    def beta_reduce(self, term: Term, strategy: str) -> Term:
        """
        Reduce term using specified strategy.
        """
        if strategy == 'normal':
            return self.normal_order(term)
        elif strategy == 'applicative':
            return self.applicative_order(term)
        elif strategy == 'lazy':
            return self.call_by_need(term)
        elif strategy == 'parallel':
            return self.parallel_reduce(term)

    def normal_order(self, term: Term) -> Term:
        """
        Leftmost-outermost reduction.
        Always finds normal form if it exists.
        """
        while True:
            redex = self.find_leftmost_outermost(term)
            if redex is None:
                return term  # Normal form
            term = self.reduce_at(term, redex)

    def applicative_order(self, term: Term) -> Term:
        """
        Leftmost-innermost reduction.
        May not terminate even if normal form exists.
        """
        while True:
            redex = self.find_leftmost_innermost(term)
            if redex is None:
                return term
            term = self.reduce_at(term, redex)

    def call_by_need(self, term: Term) -> Term:
        """
        Lazy evaluation with sharing.
        Optimal in many cases.
        """
        return self.lazy_reduce_with_sharing(term)
```

## De Bruijn Indices

```
Named:               De Bruijn:
λx. λy. x y    →    λ. λ. 2 1
λx. λy. y x    →    λ. λ. 1 2
λx. x          →    λ. 1

Index n refers to the variable bound by the nth enclosing λ
No more α-equivalence problems!
```

## Types (Simply Typed Lambda Calculus)

```
Types:  τ ::= α | τ → τ

Typing rules:

Γ, x:τ ⊢ x : τ                          (Var)

Γ, x:σ ⊢ M : τ
─────────────────                       (Abs)
Γ ⊢ λx.M : σ → τ

Γ ⊢ M : σ → τ    Γ ⊢ N : σ
────────────────────────────            (App)
      Γ ⊢ M N : τ
```

## GF(3) Term Classification

```python
class GF3Lambda:
    """Classify lambda terms by GF(3) role."""

    def classify(self, term: Term) -> int:
        """
        GENERATOR (+1): Abstractions (create functions)
        COORDINATOR (0): Applications (route computation)
        VALIDATOR (-1): Variables (consume bindings)
        """
        match term:
            case Var(_):
                return -1  # Consumes a binding
            case Lam(_, body):
                return 1   # Creates a function
            case App(func, arg):
                return 0   # Routes computation

    def verify_conservation(self, term: Term) -> bool:
        """Check GF(3) conservation in term structure."""
        def sum_trits(t):
            match t:
                case Var(_):
                    return -1
                case Lam(_, body):
                    return 1 + sum_trits(body)
                case App(func, arg):
                    return 0 + sum_trits(func) + sum_trits(arg)

        return sum_trits(term) % 3 == 0
```

## Interaction Net Compilation

```
Lambda term:        Interaction net:

λx. x              ┌───┐
                   │ λ │
                   └─┬─┘
                     │
                   ┌─┴─┐
                   │ x │
                   └───┘

(λx.x) y           ┌───┐     ┌───┐
                   │ @ │─────│ y │
                   └─┬─┘     └───┘
                     │
                   ┌─┴─┐
                   │ λ │
                   └─┬─┘
                     │
                   ┌─┴─┐
                   │ x │
                   └───┘
```

## GF(3) Triads

```
lambda-calculus (+1) ⊗ interaction-nets (0) ⊗ linear-logic (-1) = 0 ✓
lambda-calculus (+1) ⊗ datalog-fixpoint (0) ⊗ type-checker (-1) = 0 ✓
lambda-calculus (+1) ⊗ hyjax-relational (0) ⊗ narya-proofs (-1) = 0 ✓
```

## Commands

```bash
# Parse and reduce lambda term
just lambda-reduce "(\x. x x) (\y. y)"

# Show reduction steps
just lambda-trace "(λx. λy. x) a b" --strategy normal

# Convert to de Bruijn
just lambda-debruijn "λx. λy. x y"

# Type infer
just lambda-type "λx. λy. x"

# Compile to interaction net
just lambda-to-inet "λf. λx. f (f x)"
```

---

**Skill Name**: lambda-calculus
**Type**: Computation Theory / Foundations
**Trit**: +1 (PLUS - GENERATOR)
**GF(3)**: Generates terms and reductions


## Scientific Skill Interleaving

This skill connects to the K-Dense-AI/claude-scientific-skills ecosystem:

### Graph Theory
- **networkx** [○] via bicomodule
  - Universal graph hub

### Bibliography References

- `general`: 734 citations in bib.duckdb



## SDF Interleaving

This skill connects to **Software Design for Flexibility** (Hanson & Sussman, 2021):

### Primary Chapter: 8. Degeneracy

**Concepts**: redundancy, fallback, multiple strategies, robustness

### GF(3) Balanced Triad

```
lambda-calculus (−) + SDF.Ch8 (−) + [balancer] (−) = 0
```

**Skill Trit**: -1 (MINUS - verification)

### Secondary Chapters

- Ch1: Flexibility through Abstraction
- Ch5: Evaluation
- Ch4: Pattern Matching
- Ch2: Domain-Specific Languages

### Connection Pattern

Degeneracy provides fallbacks. This skill offers redundant strategies.
## Cat# Integration

This skill maps to Cat# = Comod(P) as a bicomodule in the Prof home:

```
Trit: 0 (ERGODIC)
Home: Prof (profunctors/bimodules)
Poly Op: ⊗ (parallel composition)
Kan Role: Adj (adjunction bridge)
```

### GF(3) Naturality

The skill participates in triads where:
```
(-1) + (0) + (+1) ≡ 0 (mod 3)
```

This ensures compositional coherence in the Cat# equipment structure.

Overview

This skill implements Church's lambda calculus as a compact computational engine for term construction, reduction, and encoding. It provides tools for parsing, β-reduction under multiple strategies, De Bruijn conversion, simple typing, and compilation to interaction nets. The implementation emphasizes minimal core rules and composable encodings (booleans, numerals, pairs, lists).

How this skill works

The skill represents terms as variables, abstractions, and applications and performs computation by β-reduction: (λx.M) N → M[x := N]. It offers several reduction strategies (normal/leftmost-outermost, applicative/leftmost-innermost, call-by-need lazy with sharing, and parallel reduction) and utilities to trace reduction steps. Additional modules convert named terms to De Bruijn indices to avoid α-equivalence issues, infer simple types, and compile lambda terms into interaction-net graphs for graph-based reduction.

When to use it

  • Explore fundamental functional computation and reduction behavior experimentally.
  • Prototype Church encodings for booleans, numerals, pairs, and lists.
  • Evaluate and compare reduction strategies and termination behavior.
  • Teach lambda calculus concepts: substitution, De Bruijn indices, and fixed-point combinators.
  • Compile high-level lambda terms into interaction nets for graph-based execution.

Best practices

  • Prefer De Bruijn indices for programmatic manipulation to avoid α-renaming bugs.
  • Use normal-order reduction when you need to guarantee finding a normal form if it exists.
  • Use call-by-need (lazy) with sharing to avoid duplicated work on expensive arguments.
  • Trace reductions with step-by-step mode to debug substitution and bound-variable issues.
  • Type-check terms with the simply-typed module before attempting reductions that assume types.

Example use cases

  • Reduce and trace (λx. x x) (λy. y) to observe self-application and normalization.
  • Encode and manipulate Church numerals, then test succ, plus, and mult implementations.
  • Use the Y combinator to express recursion and implement factorial via encoding and reduction.
  • Convert named lambda expressions to De Bruijn form to programmatically analyze binders.
  • Compile λf. λx. f (f x) into an interaction net and visualize graph reduction steps.

FAQ

Does the skill support recursion?

Yes — recursion is supported via fixed-point combinators such as the Y combinator; use the reduction engine to evaluate recursive encodings.

Which reduction strategy should I choose?

Normal order finds a normal form when one exists; applicative order may be faster for strict evaluation but can fail to terminate; call-by-need balances efficiency and sharing.