use triton_vm::prelude::*;
fn main() {
let factorial_program = triton_program!(
read_io 1 push 1 call factorial write_io 1 halt
factorial: dup 1 push 0 eq skiz return dup 1 mul swap 1 push -1 add swap 1 recurse
);
let public_input = PublicInput::from([bfe!(1_000)]);
let non_determinism = NonDeterminism::default();
let (stark, claim, proof) =
triton_vm::prove_program(factorial_program, public_input, non_determinism).unwrap();
let verdict = triton_vm::verify(stark, &claim, &proof);
assert!(verdict);
println!("Successfully verified proof.");
let claimed_output = claim.output.iter().map(|o| o.value());
println!("Verifiably correct output: {claimed_output:?}");
let conjectured_security_level = stark.security_level;
println!("Conjectured security level is {conjectured_security_level} bits.");
let upper_bound_of_execution_steps = proof.padded_height().unwrap();
println!("Executing the program took at most {upper_bound_of_execution_steps} cycles.");
}
#[test]
fn factorial() {
main();
}