let%expect_test"FunDecl type test"=print_endline(FunDecl.Test.test());[%expect{|[FunDecl([Tag(Rd,Wr,Ref,In,NOut);Tag(Rd,Wr,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,NWr,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,Wr,Ref,In,NOut),S(O)));(O,(Tag(NRd,Wr,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,Wr,Ref,In,NOut),S(O)));(O,(Tag(NRd,Wr,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,Wr,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,Wr,Ref,In,NOut),S(O)));(O,(Tag(NRd,Wr,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,Wr,Ref,In,NOut),S(O)));(O,(Tag(NRd,Wr,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,Wr,Ref,In,NOut),S(O)));(O,(Tag(NRd,Wr,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,Wr,Ref,In,NOut),S(O)));(O,(Tag(NRd,Wr,Ref,In,NOut),O))],[Bot;Bot],S(S(O)),[O])]|}]
let%expect_test"prog eval test 5"=print_endline(prog_eval_t5());[%expect{|[St([],[],O,[O])]|}]
let%expect_test"prog eval test 6"=print_endline(prog_eval_t6());[%expect{|[]|}]
let%expect_test"synthesis test 1"=print_endline(synt_t1());[%expect{|[Tag(Rd,Wr,Val,In,NOut);Tag(NRd,Wr,Val,In,NOut)]|}]
let%expect_test"synthesis test 2"=print_endline(synt_t2());[%expect{|[Tag(NRd,Wr,Val,In,NOut);Tag(NRd,Wr,Ref,In,NOut)]|}]
let%expect_test"synthesis test 3"=print_endline(synt_t3());[%expect{|[[Tag(NRd,Wr,Val,In,NOut);Tag(NRd,Wr,Val,In,NOut)];[Tag(NRd,Wr,Ref,In,NOut);Tag(NRd,Wr,Val,In,NOut)]]|}]
let%expect_test"synthesis test 4"=print_endline(synt_t4());[%expect{|[[Tag(NRd,Wr,Val,In,NOut)]]|}]
let%expect_test"synthesis test 5"=print_endline(synt_t5());[%expect{|[[Val;Val];[Val;Ref];[Ref;Val];[Ref;Ref]]|}]
let%expect_test"synthesis test 6"=print_endline(synt_t6());[%expect{|[[Val;Val];[Val;Ref];[Ref;Ref];[Ref;Val]]|}]
let%expect_test"synthesis test 7"=print_endline(synt_t7());[%expect{|[[Val;Val];[Ref;Val]]|}]
let%expect_test"synthesis test 8"=print_endline(synt_t8());[%expect{|[[Val;Val];[Val;Ref]]|}]
let%expect_test"synthesis test 9"=print_endline(synt_t9());[%expect{|[[Val;Ref];[Val;Val]]|}]