let%expect_test"FunDecl type test"=print_endline(FunDecl.Test.test());[%expect{|[FunDecl([Tag(Rd,AlwaysWr,Ref,In,NOut);Tag(Rd,AlwaysWr,Val,In,NOut)],[Call(S(O),[O]);Write(S(O))])]|}]
let%expect_test"Prog type test"=print_endline(Prog.Test.test());[%expect{|[Prog([],FunDecl([Tag(Rd,NeverWr,Val,In,NOut)],[Write(O);Read(O)]))]|}]
let%expect_test"write eval test 1"=print_endline(write_eval_t1());[%expect{|[St([(S(O),(Tag(NRd,AlwaysWr,Ref,In,NOut),S(O)));(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Bot;Unit],S(S(O)),[])]|}]
let%expect_test"write eval test 2"=print_endline(write_eval_t2());[%expect{|[St([(S(O),(Tag(NRd,AlwaysWr,Ref,In,NOut),S(O)));(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Unit;Bot],S(S(O)),[])]|}]
let%expect_test"call eval test 1"=print_endline(call_eval_t1());[%expect{|[St([(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Bot],S(O),[O])]|}]
let%expect_test"call eval test 2"=print_endline(call_eval_t2());[%expect{|[St([(S(O),(Tag(NRd,AlwaysWr,Ref,In,NOut),S(O)));(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Unit;Bot],S(S(O)),[O])]|}]
let%expect_test"call eval test 3"=print_endline(call_eval_t3());[%expect{|[St([(S(O),(Tag(NRd,AlwaysWr,Ref,In,NOut),S(O)));(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Bot;Unit],S(S(O)),[O])]|}]
let%expect_test"call eval test 4"=print_endline(call_eval_t4());[%expect{|[St([(S(O),(Tag(NRd,AlwaysWr,Ref,In,NOut),S(O)));(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Bot;Bot],S(S(O)),[O])]|}]
let%expect_test"call eval test 5"=print_endline(call_eval_t5());[%expect{|[St([(S(O),(Tag(NRd,AlwaysWr,Ref,In,NOut),S(O)));(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Bot;Bot],S(S(O)),[O])]|}]
let%expect_test"mem_set test 1"=print_endline(mem_set_t1());[%expect{|[St([(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Unit],S(O),[])]|}]
let%expect_test"mem_set test 2"=print_endline(mem_set_t2());[%expect{|[St([(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),O))],[Bot],S(O),[])]|}]
let%expect_test"mem_set test 3"=print_endline(meem_set_t3());[%expect{|[St([(O,(Tag(NRd,AlwaysWr,Ref,In,NOut),S(O)))],[Bot;Unit],S(S(O)),[])]|}]
let%expect_test"synthesis test 1"=print_endline(synt_t1());[%expect{|[Tag(Rd,AlwaysWr,Val,In,NOut);Tag(NRd,AlwaysWr,Val,In,NOut)]|}]
let%expect_test"synthesis test 2"=print_endline(synt_t2());[%expect{|[Tag(NRd,AlwaysWr,Val,In,NOut);Tag(NRd,AlwaysWr,Ref,In,NOut)]|}]
let%expect_test"synthesis test 3"=print_endline(synt_t3());[%expect{|[[Tag(NRd,AlwaysWr,Val,In,NOut);Tag(NRd,AlwaysWr,Val,In,NOut)];[Tag(NRd,AlwaysWr,Ref,In,NOut);Tag(NRd,AlwaysWr,Val,In,NOut)]]|}]
let%expect_test"synthesis test 4"=print_endline(synt_t4());[%expect{|[[Tag(NRd,AlwaysWr,Val,In,NOut)]]|}]