2026-03-29 15:32:35 +00:00
open Tests_f
open Synthesizer
open Relational
2026-05-08 12:06:53 +00:00
(* - basic var tests *)
let % expect_test " prog eval test: empty " = print_endline ( prog_eval_t_empty () ) ;
2026-05-09 17:29:54 +00:00
[ % expect { | [ StEnv ( MemEnv ( [] , O ) , TypesEnv ( [] , [] ) , ValsEnv ( [] , [] ) , VisitedEnv ( [] ) ) ] | } ]
2026-05-08 12:06:53 +00:00
let % expect_test " prog eval test: simple var " = print_endline ( prog_eval_t_simple_var () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( O ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , MayWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , MayWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [] ) ) ] | } ]
2026-05-08 12:06:53 +00:00
let % expect_test " simple var, forbidden read " = print_endline ( prog_eval_t_simple_var_fbd_rd () ) ;
[ % expect { | [] | } ]
let % expect_test " simple vars, no read & read " = print_endline ( prog_eval_t_simple_vars_fbd_rd_rd () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ UnitV ( ZeroMV , OneRV , ZeroWV ) ; UnitV ( BotMV , ZeroRV , ZeroWV ) ] , S ( S ( O ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , MayWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , MayWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [] ) ) ] | } ]
2026-05-08 12:06:53 +00:00
let % expect_test " simple var, write " = print_endline ( prog_eval_t_simple_var_wr () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ UnitV ( ZeroMV , TopRV , OneWV ) ] , S ( O ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [] ) ) ] | } ]
2026-05-08 12:06:53 +00:00
let % expect_test " simple var, forbidden write " = print_endline ( prog_eval_t_simple_var_fbd_wr () ) ;
[ % expect { | [] | } ]
let % expect_test " simple var, write & read " = print_endline ( prog_eval_t_simple_var_wr_rd () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ UnitV ( ZeroMV , TopRV , OneWV ) ] , S ( O ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [] ) ) ] | } ]
2026-05-08 12:06:53 +00:00
(* - basic call tests *)
let % expect_test " simple call with read " = print_endline ( prog_eval_t_simple_call_rd () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ ReadS ( VarP ( O ) ) ] ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( O ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , UnitT ( Rd , NeverWr ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , NeverWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , UnitT ( Rd , NeverWr ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , NeverWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ ReadS ( VarP ( O ) ) ] ) ) ] | } ]
2026-05-06 16:57:14 +00:00
2026-05-08 14:50:36 +00:00
let % expect_test " simple call with ref read " = print_endline ( prog_eval_t_simple_call_rd_ref () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ ReadS ( DerefP ( VarP ( O ) ) ) ] ) ; RefV ( O ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( S ( O ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , NeverWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , NeverWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ ReadS ( DerefP ( VarP ( O ) ) ) ] ) ) ] | } ]
2026-05-08 14:50:36 +00:00
let % expect_test " simple call with write " = print_endline ( prog_eval_t_simple_call_wr () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ; RefV ( O ) ; UnitV ( BotMV , ZeroRV , ZeroWV ) ] , S ( S ( S ( O ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ) ] | } ]
2026-05-08 15:58:44 +00:00
let % expect_test " simple call with read after write " = print_endline ( prog_eval_t_simple_call_wr_rd () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( WriteS ( DerefP ( VarP ( O ) ) ) , ReadS ( DerefP ( VarP ( O ) ) ) ) ] ) ; RefV ( O ) ; UnitV ( BotMV , ZeroRV , ZeroWV ) ] , S ( S ( S ( O ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , MayWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , MayWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , MayWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ SeqS ( WriteS ( DerefP ( VarP ( O ) ) ) , ReadS ( DerefP ( VarP ( O ) ) ) ) ] ) ) ] | } ]
2026-05-08 15:58:44 +00:00
let % expect_test " simple call with forbidden write " = print_endline ( prog_eval_t_simple_call_fbd_wr () ) ;
[ % expect { | [] | } ]
let % expect_test " simple call with write to ref " = print_endline ( prog_eval_t_simple_call_ref_wr () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ; RefV ( O ) ; UnitV ( BotMV , TopRV , OneWV ) ] , S ( S ( S ( O ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ) ] | } ]
2026-05-08 15:58:44 +00:00
let % expect_test " simple call with forbidden write to ref " = print_endline ( prog_eval_t_simple_call_ref_fbd_wr () ) ;
[ % expect { | [] | } ]
2026-05-08 14:50:36 +00:00
2026-05-09 14:35:21 +00:00
let % expect_test " simple call with write to ref with fix " = print_endline ( prog_eval_t_simple_call_ref_wr_with_fix () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ; RefV ( O ) ; UnitV ( ZeroMV , TopRV , OneWV ) ] , S ( S ( S ( O ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( NRd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ) ] | } ]
2026-05-09 14:35:21 +00:00
let % expect_test " call inside call " = print_endline ( prog_eval_t_call_in_call () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( CallS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , [ PathE ( VarP ( O ) ) ] ) , WriteS ( DerefP ( VarP ( O ) ) ) ) ] ) ; FunV ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ; RefV ( O ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( S ( S ( O ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ WriteS ( DerefP ( VarP ( O ) ) ) ; SeqS ( CallS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , [ PathE ( VarP ( O ) ) ] ) , WriteS ( DerefP ( VarP ( O ) ) ) ) ] ) ) ] | } ]
2026-05-09 17:29:54 +00:00
let % expect_test " call inside call, recursive " = print_endline ( prog_eval_t_call_in_call_rec () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( CallS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , [ PathE ( VarP ( O ) ) ] ) , WriteS ( DerefP ( VarP ( O ) ) ) ) ] ) ; RefV ( O ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( S ( O ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ SeqS ( CallS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , [ PathE ( VarP ( O ) ) ] ) , WriteS ( DerefP ( VarP ( O ) ) ) ) ] ) ) ] | } ]
2026-05-09 14:35:21 +00:00
let % expect_test " call to fix after call " = print_endline ( prog_eval_t_fix_call_after_call () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ; FunV ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ; RefV ( O ) ; UnitV ( ZeroMV , TopRV , OneWV ) ] , S ( S ( S ( S ( O ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , Out ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , Out ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ WriteS ( DerefP ( VarP ( O ) ) ) ] ) ) ] | } ]
2026-05-09 14:35:21 +00:00
let % expect_test " simple call with global variable usage " = print_endline ( prog_eval_t_call_with_glob_usage () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( WriteS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , ReadS ( DerefP ( VarP ( O ) ) ) ) ] ) ; RefV ( O ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( S ( O ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ SeqS ( WriteS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , ReadS ( DerefP ( VarP ( O ) ) ) ) ] ) ) ] | } ]
2026-05-09 14:35:21 +00:00
let % expect_test " simple call with read & write (2 args) " = print_endline ( prog_eval_t_call_with_rd_wr_2_args () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( ReadS ( DerefP ( VarP ( O ) ) ) , WriteS ( DerefP ( VarP ( S ( O ) ) ) ) ) ] ) ; RefV ( S ( S ( O ) ) ) ; UnitV ( BotMV , TopRV , OneWV ) ; RefV ( O ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( S ( S ( S ( O ) ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( O ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( O ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ SeqS ( ReadS ( DerefP ( VarP ( O ) ) ) , WriteS ( DerefP ( VarP ( S ( O ) ) ) ) ) ] ) ) ] | } ]
2026-05-09 15:22:11 +00:00
let % expect_test " simple call with different arguments modifiers, copy " = print_endline ( prog_eval_t_call_with_dif_mods_cp () ) ;
2026-05-15 10:06:42 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( ReadS ( DerefP ( VarP ( S ( O ) ) ) ) , SeqS ( ReadS ( DerefP ( VarP ( S ( S ( S ( O ) ) ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( O ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( S ( O ) ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( S ( S ( O ) ) ) ) ) ) , SkipS ) ) ) ) ) ] ) ; RefV ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; UnitV ( ZeroMV , OneRV , OneWV ) ; RefV ( S ( S ( S ( S ( O ) ) ) ) ) ; UnitV ( ZeroMV , TopRV , OneWV ) ; RefV ( S ( S ( O ) ) ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ; RefV ( O ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( NIn , NOut ) , RefT ( Cp , UnitT ( NRd , NeverWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , AlwaysWr ) ) ) ; ( Mode ( NIn , Out ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( Mode ( In , Out ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( NIn , NOut ) , RefT ( Cp , UnitT ( NRd , NeverWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , AlwaysWr ) ) ) ; ( Mode ( NIn , Out ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( Mode ( In , Out ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( O ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( O ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( O ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( O ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ SeqS ( ReadS ( DerefP ( VarP ( S ( O ) ) ) ) , SeqS ( ReadS ( DerefP ( VarP ( S ( S ( S ( O ) ) ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( O ) ) ) ) , SeqS ( Wr
2026-05-09 15:22:11 +00:00
let % expect_test " simple call with different arguments modifiers, ref " = print_endline ( prog_eval_t_call_with_dif_mods_rf () ) ;
2026-05-15 10:06:42 +00:00
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( ReadS ( DerefP ( VarP ( S ( O ) ) ) ) , SeqS ( ReadS ( DerefP ( VarP ( S ( S ( S ( O ) ) ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( S ( O ) ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( S ( S ( O ) ) ) ) ) ) , SkipS ) ) ) ) ] ) ; RefV ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; UnitV ( ZeroMV , OneRV , OneWV ) ; RefV ( S ( S ( S ( S ( O ) ) ) ) ) ; UnitV ( ZeroMV , TopRV , OneWV ) ; RefV ( S ( S ( O ) ) ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ; RefV ( O ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] , S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( NIn , NOut ) , RefT ( Rf , UnitT ( NRd , NeverWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ; ( Mode ( NIn , Out ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( Mode ( In , Out ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( NIn , NOut ) , RefT ( Rf , UnitT ( NRd , NeverWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ; ( Mode ( NIn , Out ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( Mode ( In , Out ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( O ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( O ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( O ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( O ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( O ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ SeqS ( ReadS ( DerefP ( VarP ( S ( O ) ) ) ) , SeqS ( ReadS ( DerefP ( VarP ( S ( S ( S ( O ) ) ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( S ( O ) ) ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( S ( S ( S ( O ) ) ) ) ) ) ,
2026-05-09 14:35:21 +00:00
2026-05-09 15:48:28 +00:00
(* - basic synthesis tests *)
let % expect_test " simple synthesis test " = print_endline ( prog_cp_cap_synt_t_simple_call_ref_wr () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ Cp ; Rf ] | } ]
2026-05-09 15:48:28 +00:00
let % expect_test " simple synthesis test, no read write caps constraints " = print_endline ( prog_cp_cap_synt_t_simple_call_ref_wr' () ) ;
2026-05-15 10:06:42 +00:00
[ % expect { | [ Cp ; Rf ] | } ]
2026-05-09 15:48:28 +00:00
let % expect_test " simple synthesis test, reference forbidden write " = print_endline ( prog_cp_cap_synt_t_simple_call_ref_fbd_wr () ) ;
[ % expect { | [ Cp ] | } ]
let % expect_test " simple synthesis test, reference forbidden write, no read write caps constraints " = print_endline ( prog_cp_cap_synt_t_simple_call_ref_fbd_wr' () ) ;
2026-05-14 21:48:48 +00:00
[ % expect { | [ Cp ] | } ]
2026-05-12 17:06:51 +00:00
2026-05-15 10:06:42 +00:00
(* - presentation tests *)
let % expect_test " presentation test 1 (simple types), eval " = print_endline ( prog_eval_t_presentation_simple_tp () ) ;
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ ReadS ( DerefP ( VarP ( O ) ) ) ] ) ; FunV ( [ SeqS ( WriteS ( DerefP ( VarP ( O ) ) ) , SeqS ( ChoiceS ( WriteS ( DerefP ( VarP ( S ( O ) ) ) ) , WriteS ( DerefP ( VarP ( O ) ) ) ) , SeqS ( ReadS ( DerefP ( VarP ( O ) ) ) , SeqS ( ReadS ( DerefP ( VarP ( S ( O ) ) ) ) , SkipS ) ) ) ) ] ) ; FunV ( [ ChoiceS ( WriteS ( DerefP ( VarP ( O ) ) ) , SkipS ) ] ) ; FunV ( [ SeqS ( ReadS ( DerefP ( VarP ( O ) ) ) , SeqS ( WriteS ( DerefP ( VarP ( O ) ) ) , SeqS ( ReadS ( DerefP ( VarP ( S ( O ) ) ) ) , SkipS ) ) ) ] ) ; RefV ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ; RefV ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ; UnitV ( ZeroMV , TopRV , OneWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ; RefV ( S ( S ( S ( S ( O ) ) ) ) ) ; UnitV ( BotMV , OneRV , OneWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ; RefV ( S ( O ) ) ; UnitV ( BotMV , OneRV , OneWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ] , S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , MayWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , MayWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( NRd , AlwaysWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( Rd , MayWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Cp , UnitT ( NRd , MayWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( Mode ( In , NOut ) , RefT ( Rf , UnitT ( Rd , NeverWr ) ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , RefT ( Rf , UnitT ( Rd , AlwaysWr ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S
let % expect_test " presentation test 1 (simple types), synt " = print_endline ( prog_synt_t_presentation_simple_tp () ) ;
[ % expect { | [ [ Cp ; Cp ; Cp ; Cp ; Cp ; Cp ] ; [ Cp ; Cp ; Cp ; Cp ; Cp ; Rf ] ; [ Cp ; Cp ; Cp ; Rf ; Cp ; Cp ] ; [ Cp ; Cp ; Cp ; Rf ; Cp ; Rf ] ; [ Cp ; Rf ; Cp ; Cp ; Cp ; Cp ] ; [ Cp ; Rf ; Cp ; Cp ; Cp ; Rf ] ; [ Cp ; Rf ; Cp ; Rf ; Cp ; Cp ] ; [ Cp ; Rf ; Cp ; Rf ; Cp ; Rf ] ; [ Rf ; Cp ; Cp ; Cp ; Cp ; Cp ] ; [ Rf ; Rf ; Cp ; Cp ; Cp ; Cp ] ; [ Rf ; Cp ; Cp ; Cp ; Cp ; Rf ] ; [ Rf ; Rf ; Cp ; Cp ; Cp ; Rf ] ; [ Rf ; Cp ; Cp ; Rf ; Cp ; Cp ] ; [ Rf ; Rf ; Cp ; Rf ; Cp ; Cp ] ; [ Rf ; Cp ; Cp ; Rf ; Cp ; Rf ] ; [ Rf ; Rf ; Cp ; Rf ; Cp ; Rf ] ] | } ]
2026-05-15 11:41:59 +00:00
let % expect_test " presentation test 2 (complex types), eval " = print_endline ( prog_eval_t_presentation_complex_tp () ) ;
[ % expect { | [ StEnv ( MemEnv ( [ FunV ( [ SeqS ( SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , S ( O ) ) ) , SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , S ( O ) ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , O ) ) , S ( O ) ) ) , SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , O ) ) , S ( O ) ) ) , SkipS ) ) ) ) ) ) , SeqS ( WriteS ( DerefP ( AccessP ( VarP ( O ) , S ( S ( O ) ) ) ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , S ( O ) ) ) , SeqS ( ReadS ( DerefP ( AccessP ( VarP ( O ) , S ( S ( O ) ) ) ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , O ) ) , O ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , O ) ) , S ( O ) ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , O ) ) , S ( S ( O ) ) ) ) , SkipS ) ) ) ) ) ) ) ) ] ) ; TupleV ( [ RefV ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ; RefV ( S ( S ( S ( S ( O ) ) ) ) ) ; RefV ( S ( S ( S ( O ) ) ) ) ] ) ; TupleV ( [ UnitV ( ZeroMV , OneRV , ZeroWV ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] ) ; TupleV ( [ UnitV ( ZeroMV , OneRV , ZeroWV ) ; UnitV ( ZeroMV , OneRV , ZeroWV ) ] ) ; UnitV ( ZeroMV , TopRV , OneWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ; TupleV ( [ UnitV ( ZeroMV , ZeroRV , ZeroWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ] ) ; TupleV ( [ UnitV ( ZeroMV , ZeroRV , ZeroWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ; UnitV ( ZeroMV , ZeroRV , ZeroWV ) ] ) ] , S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , TupleT ( [ RefT ( Cp , TupleT ( [ UnitT ( Rd , NeverWr ) ; UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , NeverWr ) ] ) ) ; RefT ( Cp , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ] ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , TupleT ( [ RefT ( Cp , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; RefT ( Cp , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; RefT ( Cp , UnitT ( Rd , AlwaysWr ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In , NOut ) , TupleT ( [ RefT ( Cp , TupleT ( [ UnitT ( Rd , NeverWr ) ; UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , NeverWr ) ] ) ) ; RefT ( Cp , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; RefT ( Cp , UnitT ( NRd , AlwaysWr ) ) ] ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , TupleT ( [ RefT ( Cp , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; RefT ( Cp , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; RefT ( Cp , UnitT ( Rd , AlwaysWr ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , UnitT ( Rd , AlwaysWr ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , TupleT ( [ UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ; UnitT ( Rd , AlwaysWr ) ] ) ) ] ) , ValsEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] , [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) , S ( S ( O ) ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) , S ( O ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) , O ) ] ) , VisitedEnv ( [ SeqS ( SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , S ( O ) ) ) , SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( Var
2026-05-15 10:06:42 +00:00
2026-05-15 11:41:59 +00:00
let % expect_test " presentation test 2 (complex types), esynt " = print_endline ( prog_synt_t_presentation_complex_tp () ) ;
[ % expect { | [ [ Cp ; Cp ; Cp ] ; [ Cp ; Cp ; Rf ] ; [ Cp ; Rf ; Cp ] ; [ Cp ; Rf ; Rf ] ] | } ]
2026-05-15 10:06:42 +00:00
2026-05-12 17:06:51 +00:00
(* - complex test: send example *)
2026-05-14 21:48:48 +00:00
(* TODO: correct tags ( at least rw ) *)
(* let%expect_test "complex test: send" = print_endline ( prog_eval_compl_test_send ( ) ) ; *)
(* [%expect {| [StEnv ( MemEnv ( [FunV ( [SeqS ( WriteS ( AccessP ( VarP ( O ) , S ( S ( S ( S ( O ) ) ) ) ) ) , SeqS ( CallS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , [PathE ( VarP ( O ) ) ] ) , SeqS ( CallS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , [PathE ( VarP ( O ) ) ] ) , SeqS ( CallS ( VarP ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , [PathE ( VarP ( O ) ) ] ) , SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , S ( O ) ) ) , ChoiceS ( ReadS ( AccessP ( DerefP ( AccessP ( DerefP ( AccessP ( VarP ( O ) , O ) ) , O ) ) , O ) ) , ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) ) ) ) ) ) ) ) ] ) ; FunV ( [SeqS ( ChoiceS ( SeqS ( WriteS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( S ( O ) ) ) ) , O ) ) , SeqS ( ReadS ( DerefP ( AccessP ( VarP ( O ) , S ( S ( S ( O ) ) ) ) ) ) , SeqS ( WriteS ( DerefP ( AccessP ( VarP ( O ) , S ( S ( S ( O ) ) ) ) ) ) , ReadS ( AccessP ( DerefP ( AccessP ( DerefP ( AccessP ( VarP ( O ) , O ) ) , S ( O ) ) ) , O ) ) ) ) ) , SkipS ) , SeqS ( WriteS ( AccessP ( VarP ( O ) , S ( S ( S ( S ( O ) ) ) ) ) ) , ReadS ( AccessP ( VarP ( O ) , S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ] ) ; FunV ( [SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( S ( O ) ) ) ) , O ) ) , SeqS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , S ( O ) ) ) ) ) ] ) ; FunV ( [ChoiceS ( ReadS ( AccessP ( DerefP ( AccessP ( VarP ( O ) , S ( O ) ) ) , O ) ) , SkipS ) ] ) ; TupleV ( [RefV ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ; RefV ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ; RefV ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ; RefV ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ; ZeroV] ) ; TupleV ( [RefV ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ; RefV ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ] ) ; TupleV ( [ZeroV; ZeroV] ) ; TupleV ( [ZeroV; ZeroV; ZeroV] ) ; TupleV ( [ZeroV; ZeroV; ZeroV] ) ; TupleV ( [ZeroV; ZeroV] ) ; ZeroV; ZeroV; TupleV ( [ZeroV; ZeroV] ) ; TupleV ( [ZeroV; ZeroV; ZeroV] ) ; TupleV ( [RefV ( S ( S ( S ( O ) ) ) ) ; RefV ( S ( S ( O ) ) ) ] ) ; TupleV ( [ZeroV; ZeroV] ) ; TupleV ( [ZeroV; ZeroV; ZeroV] ) ; TupleV ( [ZeroV; ZeroV; ZeroV] ) ; TupleV ( [ZeroV; ZeroV] ) ], S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , TypesEnv ( [ ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In, NOut ) , TupleT ( [RefT ( Cp, TupleT ( [RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, UnitT ( Rd, AlwaysWr ) ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In, NOut ) , TupleT ( [RefT ( Cp, TupleT ( [RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, UnitT ( Rd, AlwaysWr ) ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In, NOut ) , TupleT ( [RefT ( Cp, TupleT ( [RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, UnitT ( Rd, AlwaysWr ) ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ] ) ) ; ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( S ( O ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) , FunT ( [ ( Mode ( In, NOut ) , TupleT ( [RefT ( Cp, TupleT ( [RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ] ) ) ; RefT ( Cp, TupleT ( [UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ; UnitT ( Rd, AlwaysWr ) ] ) ) ; RefT ( Cp, Tuple
(* TODO: slow *)
(* let%expect_test "complex test: send" = print_endline ( prog_synt_compl_test_send ( ) ) ; *)
(* [%expect {| [[Rf; Cp; Cp; Cp; Cp; Cp]; [Cp; Cp; Cp; Cp; Cp; Cp]] |}] *)
2026-05-12 17:06:51 +00:00
2026-05-14 21:48:48 +00:00
(* let%expect_test "complex test: send" = print_endline ( prog_synt_compl_test_send ( ) ) ; *)
(* [%expect {| [[Rf; Cp; Cp; Cp; Cp; Cp]; [Cp; Cp; Cp; Cp; Cp; Cp]] |}] (* TODO: FIXME *) *)
2026-05-12 17:06:51 +00:00
(* TODO *)