#[prob]
fn coin(observations: Vec<bool>) -> f64 {
    let weight = sample!(uniform(0., 1.));
    for o in &observations {
        observe!(bernoulli(weight), o);
    }
    weight
}

#[prob]
fn flip() -> bool {
    sample!(bernoulli(0.5))
}
#[prob]
fn example10() -> f64 {
    let x = sample!(uniform(0., 10.));
    let y = if sample!(flip()) {
        sample!(normal(0., 1.))
    } else {
        sample!(uniform(-1., 1.))
    };
    x + y
}
#[prob] translates ordinary function into probabilistic program
Fn(Trace) → (Trace, f64, T) for type T of samplessample! & observe! read and modify trace