church_encoding/
church_encoding.rs

1//! Church encoding
2
3use lamcalc::{lambda, Error};
4
5fn main() -> Result<(), Error> {
6    let zero = lambda!(s. (z. z));
7    let suc = lambda!(n. s. z. s (n s z));
8    let plus = lambda!(n. m. n {suc} m).simplify()?.to_owned(); 
9
10    let mut nats = vec![zero];
11    for i in 1..10 {
12        let sx = lambda!({suc} {nats[i - 1]}).simplify()?.to_owned();
13        nats.push(sx);
14    }
15
16    let sum = lambda!({plus} {nats[4]} {nats[3]}).simplify()?.to_owned();
17    assert_eq!(sum, nats[7]);
18
19    Ok(())
20}