%%% Closed Mini-ML Expressions %%% Author: Frank Pfenning closed : exp -> type. %name closed U u. %mode closed +E. % Natural Numbers clo_z : closed z. clo_s : closed (s E) <- closed E. clo_case : closed (case E1 E2 E3) <- closed E1 <- closed E2 <- ({x:exp} closed x -> closed (E3 x)). % Pairs clo_pair : closed (pair E1 E2) <- closed E1 <- closed E2. clo_fst : closed (fst E) <- closed E. clo_snd : closed (snd E) <- closed E. % Functions clo_lam : closed (lam E) <- ({x:exp} closed x -> closed (E x)). clo_app : closed (app E1 E2) <- closed E1 <- closed E2. % Definitions clo_letv : closed (letv E1 E2) <- closed E1 <- ({x:exp} closed x -> closed (E2 x)). clo_letn : closed (letn E1 E2) <- closed E1 <- ({x:exp} closed x -> closed (E2 x)). % Recursion clo_fix : closed (fix E) <- ({x:exp} closed x -> closed (E x)). %block lc : block {x:exp} {u:closed x}. %worlds (lc) (closed E). %terminates E (closed E). %covers closed +E. %total E (closed E). %%% Open Mini-ML Expressions. %%% Warning: one needs to assume that parameters are open! open : exp -> type. %name open V. %mode open +E. % Natural Numbers open_s : open (s E) <- open E. open_case1 : open (case E1 E2 E3) <- open E1. open_case2 : open (case E1 E2 E3) <- open E2. open_case3 : open (case E1 E2 E3) <- ({x:exp} open (E3 x)). % Pairs open_pair1 : open (pair E1 E2) <- open E1. open_pair2 : open (pair E1 E2) <- open E2. open_fst : open (fst E) <- open E. open_snd : open (snd E) <- open E. % Functions open_lam : open (lam E) <- ({x:exp} open (E x)). open_app1 : open (app E1 E2) <- open E1. open_app2 : open (app E1 E2) <- open E2. % Definitions open_letv1 : open (letv E1 E2) <- open E1. open_letv2 : open (letv E1 E2) <- ({x:exp} open (E2 x)). open_letn1 : open (letn E1 E2) <- open E1. open_letn2 : open (letn E1 E2) <- ({x:exp} open (E2 x)). % Recursion open_fix : open (fix E) <- ({x:exp} open (E x)). %block lo : block {x:exp}. %worlds (lo) (open E). %terminates E (open E). % next reports z and #lo_x as missing % %covers open +E.