A ternary probabilistic programming language for modeling uncertainty
betlang is a Domain-Specific Language (DSL) for probabilistic programming built on Racket. Its core primitive is the ternary bet - a choice between three values with associated probabilities. This simple yet powerful concept enables elegant expression of complex probabilistic models.
-
Ternary Bets:
(bet A B C)- randomly select one of three values -
Weighted Probabilities:
(bet/weighted '(A 5) '(B 3) '(C 2))- non-uniform distributions -
Conditional Bets: Make decisions based on predicates
-
Lazy Evaluation: Only compute the selected branch
-
Composition Operators: Chain, compose, and combine bets
-
Statistical Utilities: Probability estimation, entropy, expected values
-
Descriptive statistics: mean, median, mode, variance, standard deviation
-
Correlation and covariance analysis
-
Statistical tests: chi-square, Kolmogorov-Smirnov
-
Resampling methods: bootstrap, jackknife
-
Time series: moving averages, exponential smoothing
-
Monte Carlo simulation utilities
-
Discrete: uniform, Bernoulli, binomial, geometric, Poisson, categorical, multinomial
-
Continuous: normal, exponential, gamma, beta, chi-square, Student’s t
-
Advanced: Weibull, Pareto, Cauchy, Laplace, Dirichlet
-
Stochastic Processes: random walks, Brownian motion, Lévy flights
-
Conjugate priors (Beta-Binomial, Normal-Normal)
-
MCMC: Metropolis-Hastings, Gibbs sampling
-
Importance sampling and rejection sampling
-
Approximate Bayesian Computation (ABC)
-
Credible intervals and Bayes factors
-
Posterior predictive distributions
-
Simulated annealing
-
Genetic algorithms
-
Particle swarm optimization
-
Evolutionary strategies
-
Cross-entropy method
-
Hill climbing and random search
-
Ternary search
-
Stratified sampling
-
Latin hypercube sampling
-
Quasi-random sequences (Sobol, Halton)
-
Sequential Monte Carlo (particle filters)
-
Hamiltonian Monte Carlo
-
Slice sampling
-
Variance reduction techniques
-
Discrete-time Markov chains
-
Transition matrix learning
-
Stationary distribution estimation
-
Hidden Markov Models (Viterbi)
-
Text generation with Markov chains
-
Monadic operations: pure, bind, join
-
Error handling: try, retry, fallback
-
Performance: memoization, caching, throttling
-
Logical operations: and, or, xor
-
Advanced composition patterns
-
Comprehensive help system (
:help) -
Session statistics tracking (
:stats) -
Command history (
:history) -
Built-in examples (
:examples) -
Error handling and pretty-printing
-
Persistent logging
-
Comprehensive bet analysis
-
Strategy comparison
-
Convergence analysis
-
Text-based histograms
-
Probability reports
-
Entropy analysis over time
-
Stock price simulation (GBM)
-
Option pricing (Black-Scholes Monte Carlo)
-
Value at Risk (VaR) calculation
-
Credit risk modeling
-
Interest rate simulation
-
Portfolio optimization
-
Bond pricing
-
Market crash scenarios
-
10+ complete examples
-
Pi estimation
-
Buffon’s needle
-
Monte Carlo integration
-
European option pricing
-
Random walk analysis
-
Percolation simulation
-
Variance reduction techniques
-
Rock-paper-scissors tournaments
-
Prisoner’s dilemma
-
Matching pennies
-
Battle of the sexes
-
Hawk-dove evolutionary dynamics
-
All-pay auctions
-
Skip lists
-
Bloom filters
-
HyperLogLog cardinality estimation
-
Count-Min sketch
-
Reservoir sampling
-
Cuckoo hashing
-
Treaps
Start the REPL:
racket repl/shell.rktTry some bets:
betlang> (bet 1 2 3)
2
betlang> (bet 'heads 'tails 'edge)
heads
betlang> (bet/weighted '(common 7) '(uncommon 2) '(rare 1))
common
betlang> (bet-parallel 10 'win 'draw 'lose)
(win lose win draw win win lose draw win win)= Financial modeling
racket examples/finance.rkt
= Monte Carlo simulations
racket examples/monte-carlo.rkt
= Game theory
racket examples/game-theory.rkt
= Tutorial
racket examples/basic-tutorial.rkt-
[Tutorial](docs/tutorial.md) - Comprehensive tutorial from basics to advanced
-
[Semantics](docs/semantics.md) - Formal language semantics
-
[API Reference](docs/api-reference.md) - Complete API documentation
-
[Architecture](docs/architecture.md) - Project structure
-
[CLAUDE.md](CLAUDE.md) - AI assistant context
betlang embraces the ternary principle - fundamental operations involve three choices. This design:
-
Models three-way decisions naturally (win/draw/lose, yes/no/maybe)
-
Provides richer expressiveness than binary choices
-
Creates interesting emergent probabilistic properties
-
Inspired by musical ternary form (A-B-A)
-
Quantitative Finance: Option pricing, risk analysis, portfolio optimization
-
Statistical Modeling: Bayesian inference, hypothesis testing
-
Machine Learning: Probabilistic classification, sampling methods
-
Simulation: Monte Carlo methods, agent-based modeling
-
Game Theory: Strategic decision-making, evolutionary dynamics
-
Data Science: Resampling, bootstrapping, statistical analysis
-
Research: Probabilistic programming, stochastic processes
-
Lines of Code: 6,000+
-
Libraries: 10+
-
Functions: 180+
-
Examples: 8 comprehensive example files
-
Documentation: 2,000+ lines
-
Test Cases: 25+
Contributions are welcome! Please ensure: - Code follows Racket conventions - New features align with ternary philosophy - Tests are included - Documentation is updated
If you use betlang in research, please cite:
@software{betlang2025,
title={betlang: A Ternary Probabilistic Programming Language},
author={betlang Contributors},
year={2025},
url={https://github.com/hyperpolymath/betlang}
}