lemma-engine 0.6.2

The programming language that means business.
Documentation

Lemma Engine

A programming language that means business

Lemma is a declarative logic language for expressing business rules, contracts, and policies in a way that's both human-readable and machine-executable. Write rules once, audit them easily, and execute them reliably.

Why Lemma?

  • Human-readable - Business logic that looks like the contracts and policies you already write
  • Type-safe - Built-in support for money (usd, eur), mass (kilograms, pounds), length (meters, feet), time (hours, days), percentages, and dates
  • Auditable - Every evaluation provides a complete operation trail showing how decisions were made
  • Composable - Reference other documents and rules to build complex logic from simple pieces
  • Multi-platform - Rust library, CLI tool, HTTP server, WebAssembly for browsers, and Model Context Protocol support

Quick Start

Add to your Cargo.toml:

[dependencies]
lemma-engine = "0.6"

Simple Example

use lemma::Engine;

let mut engine = Engine::new();

engine.add_lemma_code(r#"
    doc compensation
    fact base_salary = 60000 USD
    fact bonus_rate = 10%
    rule bonus = base_salary * bonus_rate
    rule total = base_salary + bonus?
"#, "compensation.lemma")?;

let response = engine.evaluate("compensation", None, None)?;

for result in response.results {
    println!("{}: {}", result.rule_name, result.result.unwrap());
}
// Output:
// bonus: 6000 USD
// total: 66000 USD

Business Rules with Conditionals

use lemma::{Engine, parse_facts};

let mut engine = Engine::new();

engine.add_lemma_code(r#"
    doc shipping
    fact weight = 5 kilogram
    fact destination = "domestic"
    
    rule rate = 10 USD
        unless weight > 10 kilogram then 15 USD
        unless destination = "international" then 25 USD
    
    rule valid = weight <= 30 kilogram
        unless veto "Package too heavy for shipping"
"#, "shipping.lemma")?;

// Override facts at runtime
let facts = parse_facts(&["weight=12 kilogram"])?;
let response = engine.evaluate("shipping", None, Some(facts))?;

JSON Integration

use lemma::{Engine, serializers};

let mut engine = Engine::new();
engine.add_lemma_code(r#"
    doc pricing
    fact base_price = 100 USD
    fact discount = 15%
    rule final_price = base_price * (1 - discount)
"#, "pricing.lemma")?;

// Load facts from JSON
let json = r#"{"base_price": "150 USD", "discount": 0.2}"#;
let doc = engine.get_document("pricing").unwrap();
let facts_str = serializers::from_json(json.as_bytes(), doc, engine.get_all_documents())?;
let facts = lemma::parse_facts(&facts_str.iter().map(|s| s.as_str()).collect::<Vec<_>>())?;

let response = engine.evaluate("pricing", None, Some(facts))?;

Features

Type System

Built-in support for business-critical types:

  • Money: 100 USD, 50 EUR, automatic currency validation
  • Percentages: 15%, 0.5%, works with unit arithmetic
  • Mass: 10 kilogram, 5 pound, automatic conversions
  • Length: 100 meter, 5 feet, 10 mile
  • Time: 2 hour, 30 minute, 1 day
  • Dates: 2024-12-25, 2024-12-25T14:30:00Z, date arithmetic
  • And more: Volume, temperature, pressure, power, energy, frequency, data sizes

Document Composition

engine.add_lemma_code(r#"
    doc employee
    fact name = "Alice"
    fact salary = 70000 USD
    
    doc benefits extends employee
    fact health_coverage = 5000 USD
    rule total_compensation = salary + health_coverage
"#, "benefits.lemma")?;

Audit Trail

Every evaluation returns complete operation records showing how each result was computed:

let response = engine.evaluate("pricing", None, None)?;
for result in &response.results {
    for operation in &result.operations {
        println!("{}", operation);  // Full trace of computation
    }
}

Installation Options

As a Library

cargo add lemma-engine

CLI Tool

cargo install lemma-cli

Then run:

lemma run examples/pricing quantity=10
lemma inspect examples/pricing

WebAssembly

npm install @benrogmans/lemma-engine

HTTP Server

cargo install lemma-cli
lemma server --port 8080

Documentation

Use Cases

  • Employment contracts and compensation calculations
  • Shipping and pricing policies
  • Tax calculations
  • Insurance premium calculations
  • Discount and promotional rules
  • Compliance and validation rules
  • SLA and service level calculations

License

Apache 2.0

Contributing

Contributions welcome! See contributing.md