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}