diff options
| author | Kathy Gray | 2015-06-16 17:00:58 +0100 |
|---|---|---|
| committer | Kathy Gray | 2015-06-16 17:00:58 +0100 |
| commit | 8e84dc526366d3db615d9f5e7e166ae59dd9ff80 (patch) | |
| tree | 356dc86d2298b9d1d6c20c2a5fd81874871ccf96 /src | |
| parent | f54957dfc7c0751d4625c4954f8dffbcf2e5ddb0 (diff) | |
Fix omissions in nexp normalisation causing constraints not to be checked.
Refine types of primitive functions to permit more constraints to be properly checked.
Diffstat (limited to 'src')
| -rw-r--r-- | src/type_internal.ml | 808 |
1 files changed, 412 insertions, 396 deletions
diff --git a/src/type_internal.ml b/src/type_internal.ml index 19c3e288..b1a7ec9f 100644 --- a/src/type_internal.ml +++ b/src/type_internal.ml @@ -135,6 +135,19 @@ type def_envs = { type exp = tannot Ast.exp +(*Nexpression Makers (as built so often)*) + +let mk_nv s = {nexp = Nvar s} +let mk_add n1 n2 = {nexp = Nadd(n1,n2)} +let mk_sub n1 n2 = {nexp = Nsub(n1,n2)} +let mk_mult n1 n2 = {nexp = Nmult(n1,n2)} +let mk_c i = {nexp = Nconst i} +let mk_c_int i = mk_c (big_int_of_int i) +let mk_neg n = {nexp = Nneg n} +let mk_2n n = {nexp = N2n(n, None)} +let mk_2nc n i = {nexp = N2n(n, Some i)} +let mk_pow n i = {nexp = Npow(n, i)} + (*Getters*) let get_index n = @@ -260,14 +273,15 @@ let bounds_to_string b = match b with let rec tannot_to_string = function | NoTyp -> "No tannot" | Base((vars,t),tag,ncs,ef,bv) -> - "Tannot: type = " ^ (t_to_string t) ^ " tag = " ^ tag_to_string tag ^ " constraints = " ^ constraints_to_string ncs ^ " effect = " ^ e_to_string ef ^ "boundv = " ^ bounds_to_string bv + "Tannot: type = " ^ (t_to_string t) ^ " tag = " ^ tag_to_string tag ^ " constraints = " ^ + constraints_to_string ncs ^ " effect = " ^ e_to_string ef ^ "boundv = " ^ bounds_to_string bv | Overload(poly,_,variants) -> "Overloaded: poly = " ^ tannot_to_string poly (* nexp constants, commonly used*) -let n_zero = {nexp = Nconst zero} -let n_one = {nexp = Nconst one} -let n_two = {nexp = Nconst two} +let n_zero = mk_c zero +let n_one = mk_c one +let n_two = mk_c two (*effect functions*) let rec effect_remove_dups = function @@ -413,19 +427,21 @@ let increment_factor n i = let ni = add_big_int i one in if eq_big_int ni zero then n_zero - else {nexp = Nmult({nexp = Nconst ni},n)} - | _ -> {nexp = Nmult({nexp = Nadd(i,n_one)},n)}) + else mk_mult (mk_c ni) n + | _ -> mk_mult (mk_add i n_one) n) | Nmult(n1,n2) -> (match n1.nexp,i.nexp with | Nconst i2,Nconst i -> let ni = add_big_int i i2 in if eq_big_int ni zero then n_zero - else { nexp = Nmult({nexp = Nconst (add_big_int i i2)},n2)} - | _ -> { nexp = Nmult({ nexp = Nadd(n1,i)},n2)}) + else mk_mult (mk_c(add_big_int i i2)) n2 + | _ -> mk_mult (mk_add n1 i) n2) | _ -> let _ = Printf.eprintf "increment_factor failed with %s by %s\n" (n_to_string n) (n_to_string i) in assert false -let negate n = {nexp = Nmult ({nexp = Nconst (big_int_of_int (-1))},n)} +let negate n = match n.nexp with + | Nconst i -> mk_c (mult_int_big_int (-1) i) + | _ -> mk_mult (mk_c_int (-1)) n let rec normalize_nexp n = (*let _ = Printf.eprintf "Working on normalizing %s\n" (n_to_string n) in *) @@ -433,97 +449,109 @@ let rec normalize_nexp n = | Nconst _ | Nvar _ | Nuvar _ | Npos_inf | Nneg_inf -> n | Nneg n -> let n',to_recur,add_neg = (match n.nexp with - | Nconst i -> {nexp = Nconst (mult_int_big_int (-1) i)},false,false - | Nadd(n1,n2) -> {nexp = Nadd(negate n1,negate n2)},true,false - | Nsub(n1,n2) -> {nexp = Nsub(n2,n1) },false,false - | Nneg n -> normalize_nexp n,false,false + | Nconst i -> negate n,false,false + | Nadd(n1,n2) -> mk_add (negate n1) (negate n2),true,false + | Nsub(n1,n2) -> mk_sub n2 n1,true,false + | Nneg n -> n,true,false | _ -> n,true,true) in if to_recur - then begin - let n' = normalize_nexp n' in - match n'.nexp,add_neg with - | Nconst i,true -> {nexp = Nconst (mult_int_big_int (-1) i)} - | _,false -> n' - | _,true -> negate n' - end + then (let n' = normalize_nexp n' in + if add_neg + then negate n' + else n') else n' | Npow(n,i) -> let n' = normalize_nexp n in (match n'.nexp with - | Nconst n -> {nexp = Nconst (pow_i i (int_of_big_int n))} - | _ -> {nexp = Npow(n', i)}) - | N2n(n', Some i) -> n + | Nconst n -> mk_c (pow_i i (int_of_big_int n)) + | _ -> mk_pow n' i) + | N2n(n', Some i) -> n (*Because there is a value for Some, we know this is normalized and n' is constant*) | N2n(n, None) -> let n' = normalize_nexp n in (match n'.nexp with - | Nconst i -> {nexp = N2n(n', Some (two_pow (int_of_big_int i)))} - | _ -> {nexp = N2n(n',None)}) + | Nconst i -> mk_2nc n' (two_pow (int_of_big_int i)) + | _ -> mk_2n n') | Nadd(n1,n2) -> let n1',n2' = normalize_nexp n1, normalize_nexp n2 in (match n1'.nexp,n2'.nexp with | Nneg_inf, Npos_inf | Npos_inf, Nneg_inf -> {nexp = Ninexact } | Npos_inf, _ | _, Npos_inf -> { nexp = Npos_inf } | Nneg_inf, _ | _, Nneg_inf -> { nexp = Nneg_inf } - | Nconst i1, Nconst i2 | Nconst i1, N2n(_,Some i2) | N2n(_,Some i2), Nconst i1 -> {nexp = Nconst (add_big_int i1 i2)} - | Nadd(n11,n12), Nconst _ -> {nexp = Nadd(n11,normalize_nexp {nexp = Nadd(n12,n2')})} - | Nconst _, Nadd(n21,n22) -> {nexp = Nadd(n21,normalize_nexp {nexp = Nadd(n22,n1')})} - | Nconst i, _ -> if (eq_big_int i zero) then n2' else {nexp = Nadd(n2',n1')} - | _, Nconst i -> if (eq_big_int i zero) then n1' else {nexp = Nadd(n1',n2')} - | Nvar _, Nuvar _ | Nvar _, N2n _ | Nuvar _, Npow _ -> {nexp = Nadd (n2',n1')} + | Nconst i1, Nconst i2 | Nconst i1, N2n(_,Some i2) | N2n(_,Some i2), Nconst i1 | N2n(_,Some i1),N2n(_,Some i2) + -> mk_c (add_big_int i1 i2) + | Nadd(n11,n12), Nconst i -> + if (eq_big_int i zero) then n1' else mk_add n11 (normalize_nexp (mk_add n12 n2')) + | Nconst i, Nadd(n21,n22) -> + if (eq_big_int i zero) then n2' else mk_add n21 (normalize_nexp (mk_add n22 n1')) + | Nconst i, _ -> if (eq_big_int i zero) then n2' else mk_add n2' n1' + | _, Nconst i -> if (eq_big_int i zero) then n1' else mk_add n1' n2' + | Nvar _, Nuvar _ | Nvar _, N2n _ | Nuvar _, Npow _ | Nuvar _, N2n _ -> mk_add n2' n1' | Nadd(n11,n12), Nadd(n21,n22) -> (match compare_nexps n11 n21 with - | -1 -> {nexp = Nadd(n11, (normalize_nexp {nexp = Nadd(n12,n2')}))} - | 0 -> normalize_nexp {nexp = Nmult(n_two,n1')} - | _ -> normalize_nexp {nexp = Nadd(n21, { nexp = Nadd(n22,n1') })}) - | N2n(_,Some i1),N2n(_,Some i2) -> {nexp = Nconst (add_big_int i1 i2)} - | N2n(n1,_), N2n(n2,_) -> - (match compare_nexps n1 n2 with - | -1 -> {nexp = Nadd (n2',n1')} - | 0 -> {nexp = N2n((normalize_nexp {nexp = Nadd(n1, n_one)}),None)} - | _ -> { nexp = Nadd (n1',n2')}) - | Npow(n1,i1), Npow (n2,i2) -> - (match compare_nexps n1 n2, compare i1 i2 with - | -1,-1 | 0,-1 -> {nexp = Nadd (n2',n1')} - | 0,0 -> {nexp = Nmult (n_two,n1')} - | _ -> {nexp = Nadd (n1',n2')}) - | N2n(n11,_),Nadd(n21,n22) -> + | -1 -> mk_add n11 (normalize_nexp (mk_add n12 n2')) + | 0 -> + (match compare_nexps n12 n22 with + | -1 -> normalize_nexp (mk_add (mk_mult n_two n11) (mk_add n22 n12)) + | 0 -> normalize_nexp (mk_add (mk_mult n_two n11) (mk_mult n_two n12)) + | _ -> normalize_nexp (mk_add (mk_mult n_two n11) (mk_add n12 n22))) + | _ -> normalize_nexp (mk_add n21 (mk_add n22 n1'))) + | N2n(n11,_), N2n(n21,_) -> + (match compare_nexps n11 n21 with + | -1 -> mk_add n2' n1' + | 0 -> mk_2n (normalize_nexp (mk_add n11 n_one)) + | _ -> mk_add n1' n2') + | Npow(n11,i1), Npow (n21,i2) -> + (match compare_nexps n11 n21, compare i1 i2 with + | -1,-1 | 0,-1 -> mk_add n2' n1' + | 0,0 -> mk_mult n_two n1' + | _ -> mk_add n1' n2') + | N2n(n11,Some i),Nadd(n21,n22) -> + normalize_nexp (mk_add n21 (mk_add n22 (mk_c i))) + | Nadd(n11,n12), N2n(n21,Some i) -> + normalize_nexp (mk_add n11 (mk_add n12 (mk_c i))) + | N2n(n11,None),Nadd(n21,n22) -> (match n21.nexp with | N2n(n211,_) -> (match compare_nexps n11 n211 with - | -1 -> {nexp = Nadd(n1',n2')} - | 0 -> {nexp = Nadd( {nexp = N2n (normalize_nexp {nexp = Nadd(n11, n_one)},None)}, n22)} - | _ -> {nexp = Nadd(n21, (normalize_nexp {nexp = Nadd(n11,n22)}))}) - | _ -> {nexp = Nadd(n1',n2')}) - | Nadd(n11,n12),N2n(n21,_) -> + | -1 -> mk_add n1' n2' + | 0 -> mk_add (mk_2n (normalize_nexp (mk_add n11 n_one))) n22 + | _ -> mk_add n21 (normalize_nexp (mk_add n11 n22))) + | _ -> mk_add n1' n2') + | Nadd(n11,n12),N2n(n21,None) -> (match n11.nexp with | N2n(n111,_) -> (match compare_nexps n111 n21 with - | -1 -> {nexp = Nadd(n11,(normalize_nexp {nexp = Nadd(n2',n12)}))} - | 0 -> {nexp = Nadd( {nexp = N2n (normalize_nexp {nexp = Nadd(n111, n_one)},None)}, n12)} - | _ -> {nexp = Nadd(n2', n1')}) - | _ -> {nexp = Nadd(n2',n1')}) + | -1 -> mk_add n11 (normalize_nexp (mk_add n2' n12)) + | 0 -> mk_add (mk_2n (normalize_nexp (mk_add n111 n_one))) n12 + | _ -> mk_add n2' n1') + | _ -> mk_add n2' n1') | _ -> - match get_var n1', get_var n2' with + (match get_var n1', get_var n2' with | Some(nv1),Some(nv2) -> (match compare_nexps nv1 nv2 with - | -1 -> {nexp = Nadd (n2',n1')} + | -1 -> mk_add n2' n1' | 0 -> increment_factor n1' (get_factor n2') - | _ -> {nexp = Nadd (n1',n2')}) - | Some(nv1),None -> {nexp = Nadd (n2',n1')} - | None,Some(nv2) -> {nexp = Nadd (n1',n2')} + | _ -> mk_add n1' n2') + | Some(nv1),None -> mk_add n2' n1' + | None,Some(nv2) -> mk_add n1' n2' | _ -> (match n1'.nexp,n2'.nexp with | Nadd(n11',n12'), _ -> (match compare_nexps n11' n2' with - | -1 -> {nexp = Nadd(n2',n1')} - | 1 -> { nexp = Nadd(n11', normalize_nexp { nexp = Nadd(n12',n2')}) } - | _ -> let _ = Printf.eprintf "Neither term has var but are the same? %s %s\n" (n_to_string n1') (n_to_string n2') in assert false) + | -1 -> mk_add n2' n1' + | 1 -> mk_add n11' (normalize_nexp (mk_add n12' n2')) + | _ -> let _ = Printf.eprintf "Neither term has var but are the same? %s %s\n" + (n_to_string n1') (n_to_string n2') in assert false) | (_, Nadd(n21',n22')) -> (match compare_nexps n1' n21' with - | -1 -> { nexp = Nadd(n21', normalize_nexp { nexp = Nadd(n1',n22')})} - | 1 -> { nexp = Nadd(n1',n2') } - | _ -> let _ = Printf.eprintf "pattern didn't match unexpextedly here %s %s\n" (n_to_string n1') (n_to_string n2') in assert false) - | _ -> {nexp = Nadd (n1', n2')}) - ) + | -1 -> mk_add n21' (normalize_nexp (mk_add n1' n22')) + | 1 -> mk_add n1' n2' + | _ -> let _ = Printf.eprintf "pattern didn't match unexpextedly here %s %s\n" + (n_to_string n1') (n_to_string n2') in assert false) + | _ -> + (match compare_nexps n1' n2' with + | -1 -> mk_add n2' n1' + | 0 -> normalize_nexp (mk_mult n_two n1') + | _ -> mk_add n1' n2')))) | Nsub(n1,n2) -> let n1',n2' = normalize_nexp n1, normalize_nexp n2 in (*let _ = Printf.eprintf "Normalizing subtraction of %s - %s \n" (n_to_string n1') (n_to_string n2') in*) @@ -531,103 +559,103 @@ let rec normalize_nexp n = | Nneg_inf, Npos_inf | Npos_inf, Nneg_inf -> {nexp = Ninexact } | Npos_inf, _ | _,Nneg_inf -> { nexp = Npos_inf } | Nneg_inf, _ | _,Npos_inf -> { nexp = Nneg_inf } - | Nconst i1, Nconst i2 | Nconst i1, N2n(_,Some i2) | N2n(_,Some i1), Nconst i2 -> + | Nconst i1, Nconst i2 | Nconst i1, N2n(_,Some i2) | N2n(_,Some i1), Nconst i2 | N2n(_,Some i1), N2n(_,Some i2)-> (*let _ = Printf.eprintf "constant subtraction of %s - %s gives %s" (Big_int.string_of_big_int i1) (Big_int.string_of_big_int i2) (Big_int.string_of_big_int (sub_big_int i1 i2)) in*) - {nexp = Nconst (sub_big_int i1 i2)} - | Nadd(n11,n12), Nconst _ -> {nexp = Nadd(n11,normalize_nexp {nexp = Nsub(n12,n2')})} - | Nconst _, Nadd(n21,n22) -> {nexp = Nadd(n21,normalize_nexp {nexp = Nsub(n22,n1')})} - | Nconst i, _ -> if (eq_big_int i zero) then negate n2' else {nexp = Nsub(n1',n2')} - | _, Nconst i -> if (eq_big_int i zero) then n1' else {nexp = Nsub(n1',n2')} - | Nvar _, Nuvar _ | Nvar _, N2n _ | Nuvar _, Npow _ -> {nexp = Nsub (n2',n1')} - | N2n(_,Some i1),N2n(_,Some i2) -> {nexp = Nconst (sub_big_int i1 i2)} - | N2n(n1,_), N2n(n2,_) -> + mk_c (sub_big_int i1 i2) + | Nconst i, _ -> + if (eq_big_int i zero) + then normalize_nexp (negate n2') + else normalize_nexp (mk_add (negate n2') n1') + | _, Nconst i -> + if (eq_big_int i zero) + then n1' + else normalize_nexp (mk_add n1' (mk_c (mult_int_big_int (-1) i))) + | _,_ -> (match compare_nexps n1 n2 with | 0 -> n_zero - | _ -> { nexp = Nsub (n1',n2')}) - | Npow(n1,i1), Npow (n2,i2) -> - (match compare_nexps n1 n2, compare i1 i2 with - | 0,0 -> n_zero - | _ -> {nexp = Nsub (n1',n2')}) - | _ -> {nexp = Nsub(n1',n2')}) + | -1 -> mk_add (negate n2') n1' + | _ -> mk_add n1' (negate n2'))) | Nmult(n1,n2) -> let n1',n2' = normalize_nexp n1, normalize_nexp n2 in (match n1'.nexp,n2'.nexp with | Nneg_inf,Nneg_inf -> {nexp = Npos_inf} - | Nneg_inf, _ | _, Nneg_inf -> {nexp = Nneg_inf} + | Nneg_inf, _ | _, Nneg_inf -> {nexp = Nneg_inf} (*TODO write a is_negative predicate*) | Npos_inf, _ | _, Npos_inf -> {nexp = Npos_inf} - | Nconst i1, Nconst i2 -> {nexp = Nconst (mult_big_int i1 i2)} + | Nconst i1, Nconst i2 -> mk_c (mult_big_int i1 i2) | Nconst i1, N2n(n,Some i2) | N2n(n,Some i2),Nconst i1 -> if eq_big_int i1 two - then { nexp = N2n({nexp = Nadd(n,n_one)},Some (mult_big_int i1 i2)) } - else { nexp = Nconst (mult_big_int i1 i2)} - | (Nmult (_, _), (Nvar _|Npow (_, _)|Nuvar _)) -> {nexp = Nmult(n1',n2')} - | Nvar _, Nuvar _ -> { nexp = Nmult(n2',n1') } - | N2n(n1,Some i1),N2n(n2,Some i2) -> { nexp = N2n (normalize_nexp {nexp = Nadd(n1,n2)},Some(mult_big_int i1 i2)) } - | N2n(n1,_), N2n(n2,_) -> {nexp = N2n (normalize_nexp {nexp = Nadd(n1,n2)}, None)} - | N2n _, Nvar _ | N2n _, Nuvar _ | N2n _, Nmult _ | Nuvar _, N2n _ -> {nexp =Nmult(n2',n1')} - | Nuvar {nindex = i1}, Nuvar {nindex = i2} -> - (match compare i1 i2 with - | 0 -> {nexp = Npow(n1', 2)} - | 1 -> {nexp = Nmult(n1',n2')} - | _ -> {nexp = Nmult(n2',n1')}) - | Nvar i1, Nvar i2 -> - (match compare i1 i2 with - | 0 -> {nexp = Npow(n1', 2)} - | 1 -> {nexp = Nmult(n1',n2')} - | _ -> {nexp = Nmult(n2',n1')}) + then mk_2nc (normalize_nexp (mk_add n n_one)) (mult_big_int i1 i2) + else mk_c (mult_big_int i1 i2) + | Nconst i1, N2n(n,None) | N2n(n,None),Nconst i1 -> + if eq_big_int i1 two + then mk_2n (normalize_nexp (mk_add n n_one)) + else mk_mult (mk_c i1) (mk_2n n) + | (Nmult (_, _), (Nvar _|Npow (_, _)|Nuvar _)) -> mk_mult n1' n2' + | Nvar _, Nuvar _ -> mk_mult n2' n1' + | N2n(n1,Some i1),N2n(n2,Some i2) -> mk_2nc (normalize_nexp (mk_add n1 n2)) (mult_big_int i1 i2) + | N2n(n1,_), N2n(n2,_) -> mk_2n (normalize_nexp (mk_add n1 n2)) + | N2n _, Nvar _ | N2n _, Nuvar _ | N2n _, Nmult _ | Nuvar _, N2n _ -> mk_mult n2' n1' + | Nuvar _, Nuvar _ | Nvar _, Nvar _ -> + (match compare n1' n2' with + | 0 -> mk_pow n1' 2 + | 1 -> mk_mult n1' n2' + | _ -> mk_mult n2' n1') | Npow(n1,i1),Npow(n2,i2) -> (match compare_nexps n1 n2 with - | 0 -> {nexp = Npow(n1,(i1+i2))} - | -1 -> {nexp = Nmult(n2',n1')} - | _ -> {nexp = Nmult(n1',n2')}) - | Nconst _, Nadd(n21,n22) | Nvar _,Nadd(n21,n22) | Nuvar _,Nadd(n21,n22) | N2n _, Nadd(n21,n22) | Npow _,Nadd(n21,n22) | Nmult _, Nadd(n21,n22) -> - normalize_nexp {nexp = Nadd( {nexp = Nmult(n1',n21)}, {nexp = Nmult(n1',n21)})} - | Nadd(n11,n12),Nconst _ | Nadd(n11,n12),Nvar _ | Nadd(n11,n12), Nuvar _ | Nadd(n11,n12), N2n _ | Nadd(n11,n12),Npow _ | Nadd(n11,n12), Nmult _-> - normalize_nexp {nexp = Nadd( {nexp = Nmult(n11,n2')}, {nexp = Nmult(n12,n2')})} - | Nmult(n11,n12), Nconst _ -> {nexp = Nmult({nexp = Nmult(n11,n2')},{nexp = Nmult(n12,n2')})} + | 0 -> mk_pow n1 (i1+i2) + | -1 -> mk_mult n2' n1' + | _ -> mk_mult n1' n2') + | Nconst _, Nadd(n21,n22) | Nvar _,Nadd(n21,n22) | Nuvar _,Nadd(n21,n22) | N2n _, Nadd(n21,n22) + | Npow _,Nadd(n21,n22) | Nmult _, Nadd(n21,n22) -> + normalize_nexp (mk_add (mk_mult n1' n21) (mk_mult n1' n21)) + | Nadd(n11,n12),Nconst _ | Nadd(n11,n12),Nvar _ | Nadd(n11,n12), Nuvar _ | Nadd(n11,n12), N2n _ + | Nadd(n11,n12),Npow _ | Nadd(n11,n12), Nmult _-> + normalize_nexp (mk_add (mk_mult n11 n2') (mk_mult n12 n2')) + | Nmult(n11,n12), Nconst _ -> mk_mult (mk_mult n11 n2') (mk_mult n12 n2') | Nconst i1, _ -> if (eq_big_int i1 zero) then n1' else if (eq_big_int i1 one) then n2' - else { nexp = Nmult(n1',n2') } + else mk_mult n1' n2' | _, Nconst i1 -> if (eq_big_int i1 zero) then n2' else if (eq_big_int i1 one) then n1' - else {nexp = Nmult(n2',n1') } + else mk_mult n2' n1' | Nadd(n11,n12),Nadd(n21,n22) -> - normalize_nexp {nexp = Nadd( {nexp = Nmult(n11,n21)}, - {nexp = Nadd ({nexp = Nmult(n11,n22)}, - {nexp = Nadd({nexp = Nmult(n12,n21)}, - {nexp = Nmult(n12,n22)})})})} - | Nuvar _, Nvar _ | Nmult _, N2n _-> {nexp = Nmult (n1',n2')} + normalize_nexp (mk_add (mk_mult n11 n21) + (mk_add (mk_mult n11 n22) + (mk_add (mk_mult n12 n21) (mk_mult n12 n22)))) + | Nuvar _, Nvar _ | Nmult _, N2n _-> mk_mult n1' n2' | Nuvar _, Nmult(n1,n2) | Nvar _, Nmult(n1,n2) -> (match get_var n1, get_var n2 with | Some(nv1),Some(nv2) -> (match compare_nexps nv1 nv2, n2.nexp with - | 0, Nuvar _ | 0, Nvar _ -> {nexp = Nmult(n1, {nexp = Npow(nv1,2)}) } - | 0, Npow(n2',i) -> {nexp = Nmult(n1, {nexp = Npow (n2',(i+1))})} - | -1, Nuvar _ | -1, Nvar _ -> {nexp = Nmult(n2',n1')} - | _,_ -> {nexp = Nmult(normalize_nexp {nexp = Nmult(n1,n1')},n2)}) - | _ -> {nexp = Nmult(normalize_nexp {nexp = Nmult(n1,n1')},n2)}) + | 0, Nuvar _ | 0, Nvar _ -> mk_mult n1 (mk_pow nv1 2) + | 0, Npow(n2',i) -> mk_mult n1 (mk_pow n2' (i+1)) + | -1, Nuvar _ | -1, Nvar _ -> mk_mult n2' n1' + | _,_ -> mk_mult (normalize_nexp (mk_mult n1 n1')) n2) + | _ -> mk_mult (normalize_nexp (mk_mult n1 n1')) n2) | (Npow (n1, i), (Nvar _ | Nuvar _)) -> (match compare_nexps n1 n2' with - | 0 -> {nexp = Npow(n1,(i+1))} - | _ -> {nexp = Nmult(n1',n2')}) - | (Npow (_, _), N2n (_, _)) | (Nvar _, (N2n (_, _)|Npow (_, _))) | (Nuvar _, Npow (_, _)) -> {nexp = Nmult(n2',n1')} - | (N2n (_, _), Npow (_, _)) -> {nexp = Nmult(n1',n2')} + | 0 -> mk_pow n1 (i+1) + | _ -> mk_mult n1' n2') + | (Npow (_, _), N2n (_, _)) | (Nvar _, (N2n (_, _)|Npow (_, _))) | (Nuvar _, Npow (_, _)) -> mk_mult n2' n1' + | (N2n (_, _), Npow (_, _)) -> mk_mult n1' n2' | Npow(n1,i),Nmult(n21,n22) -> (match get_var n1, get_var n2 with | Some(nv1),Some(nv2) -> (match compare_nexps nv1 nv2,n22.nexp with - | 0, Nuvar _ | 0, Nvar _ -> {nexp = Nmult(n21,{nexp = Npow(n1,i+1)})} - | 0, Npow(_,i2) -> {nexp = Nmult(n21,{nexp=Npow(n1,i+i2)})} - | 1,Npow _ -> {nexp = Nmult(normalize_nexp {nexp = Nmult(n21,n1')},n22)} - | _ -> {nexp = Nmult(n2',n1')}) - | _ -> {nexp = Nmult(normalize_nexp {nexp = Nmult(n1',n21)},n22)}) - | Nmult _ ,Nmult(n21,n22) -> {nexp = Nmult({nexp = Nmult(n21,n1')},{nexp = Nmult(n22,n1')})} - | Nneg _,_ | _,Nneg _ -> let _ = Printf.eprintf "neg case still around %s\n" (n_to_string n) in assert false (* If things are normal, neg should be gone. *) + | 0, Nuvar _ | 0, Nvar _ -> mk_mult n21 (mk_pow n1 (i+1)) + | 0, Npow(_,i2) -> mk_mult n21 (mk_pow n1 (i+i2)) + | 1,Npow _ -> mk_mult (normalize_nexp (mk_mult n21 n1')) n22 + | _ -> mk_mult n2' n1') + | _ -> mk_mult (normalize_nexp (mk_mult n1' n21)) n22) + | Nmult _ ,Nmult(n21,n22) -> mk_mult (mk_mult n21 n1') (mk_mult n22 n1') + | Nneg _,_ | _,Nneg _ -> + let _ = Printf.eprintf "neg case still around %s\n" (n_to_string n) in assert false + (* If things are normal, neg should be gone. *) ) -let int_to_nexp i = {nexp = Nconst (big_int_of_int i)} +let int_to_nexp = mk_c_int let v_count = ref 0 let t_count = ref 0 @@ -1045,10 +1073,10 @@ let rec refine_requires min_lt max_gt id cs = let nat_t = {t = Tapp("range",[TA_nexp n_zero;TA_nexp{nexp = Npos_inf};])} let int_t = {t = Tapp("range",[TA_nexp{nexp=Nneg_inf};TA_nexp{nexp = Npos_inf};])} -let uint8_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp{nexp = N2n({nexp = Nconst (big_int_of_int 8)},Some (big_int_of_int 256))}])} -let uint16_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp{nexp = N2n({nexp = Nconst (big_int_of_int 16)},Some (big_int_of_int 65536))}])} -let uint32_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp{nexp = N2n({nexp = Nconst (big_int_of_int 32)},Some (big_int_of_string "4294967296"))}])} -let uint64_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp{nexp = N2n({nexp = Nconst (big_int_of_int 64)},Some (big_int_of_string "18446744073709551616"))}])} +let uint8_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp (mk_2nc (mk_c_int 8) (big_int_of_int 256))])} +let uint16_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp (mk_2nc (mk_c_int 16) (big_int_of_int 65536))])} +let uint32_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp (mk_2nc (mk_c_int 32) (big_int_of_string "4294967296"))])} +let uint64_t = {t = Tapp("range",[TA_nexp n_zero; TA_nexp (mk_2nc (mk_c_int 64) (big_int_of_string "18446744073709551616"))])} let unit_t = { t = Tid "unit" } let bit_t = {t = Tid "bit" } @@ -1103,20 +1131,15 @@ let mk_ord_params l = List.map (fun i -> (i,{k=K_Ord})) l let mk_tup ts = {t = Ttup ts } let mk_pure_fun arg ret = {t = Tfn (arg,ret,IP_none,pure_e)} -let mk_pure_imp arg ret var = {t = Tfn (arg,ret,IP_length {nexp = Nvar var},pure_e)} - -let mk_nv v = {nexp = Nvar v} -let mk_add n1 n2 = {nexp = Nadd (n1,n2) } -let mk_sub n1 n2 = {nexp = Nsub (n1, n2)} -let mk_mult n1 n2 = {nexp = Nmult(n1,n2) } +let mk_pure_imp arg ret var = {t = Tfn (arg,ret,IP_length (mk_nv var),pure_e)} let mk_range n1 n2 = {t=Tapp("range",[TA_nexp n1;TA_nexp n2])} let mk_atom n1 = {t = Tapp("atom",[TA_nexp n1])} -let mk_vector typ order start size = {t=Tapp("vector",[TA_nexp {nexp=start}; TA_nexp {nexp=size}; TA_ord {order}; TA_typ typ])} +let mk_vector typ order start size = {t=Tapp("vector",[TA_nexp start; TA_nexp size; TA_ord {order}; TA_typ typ])} let mk_bitwise_op name symb arity = let ovar = Ovar "o" in - let vec_typ = mk_vector bit_t ovar (Nvar "n") (Nvar "m") in - let single_bit_vec_typ = mk_vector bit_t ovar (Nvar "n") (Nconst one) in + let vec_typ = mk_vector bit_t ovar (mk_nv "n") (mk_nv "m") in + let single_bit_vec_typ = mk_vector bit_t ovar (mk_nv "n") n_one in let vec_args = Array.to_list (Array.make arity vec_typ) in let single_bit_vec_args = Array.to_list (Array.make arity single_bit_vec_typ) in let bit_args = Array.to_list (Array.make arity bit_t) in @@ -1126,7 +1149,7 @@ let mk_bitwise_op name symb arity = else mk_tup single_bit_vec_args,mk_tup vec_args,mk_tup bit_args, mk_tup gen_args in (symb, Overload(Base(((mk_typ_params ["a"]),mk_pure_fun garg {t=Tvar "a"}), External (Some name),[],pure_e,nob),true, - [Base((["n",{k=K_Nat};"m",{k=K_Nat};"o",{k=K_Ord}], mk_pure_fun varg vec_typ),External (Some name),[],pure_e,nob); + [Base(((mk_nat_params ["n";"m"]@mk_ord_params["o"]), mk_pure_fun varg vec_typ),External (Some name),[],pure_e,nob); Base((["n",{k=K_Nat};"o",{k=K_Ord}],mk_pure_fun svarg bit_t),External(Some (name ^ "_range_bit")),[],pure_e,nob); Base(([],mk_pure_fun barg bit_t),External (Some (name ^ "_bit")),[],pure_e,nob)])) @@ -1142,318 +1165,313 @@ let initial_typ_env = (mk_atom (mk_add (mk_nv "n") (mk_nv "m"))))), External (Some "add"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))), External (Some "add_vec"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_range (mk_nv "q") {nexp = N2n (mk_nv "n",None)}))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_range (mk_nv "q") (mk_2n (mk_nv "n"))))), External (Some "add_vec_vec_range"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "add_vec_range"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "p"),mk_sub {nexp=N2n (mk_nv "m",None)} n_one)], + [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)], pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")); bit_t; bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))), External (Some "add_overflow_vec"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") {nexp = N2n (mk_nv "m",None)})))), + Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))), External (Some "add_vec_range_range"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "p"),mk_sub {nexp=N2n (mk_nv "m",None)} n_one)], + [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)], pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "add_range_vec"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "p"),mk_sub {nexp = N2n (mk_nv "m",None)} n_one)], + [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)], pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") (mk_sub {nexp = N2n (mk_nv "m",None)} n_one))))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_sub (mk_2n (mk_nv "m")) n_one))))), External (Some "add_range_vec_range"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "p"),mk_sub {nexp=N2n (mk_nv "m",None)} n_one)], + [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)], pure_e,nob); Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p"); bit_t]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))), External (Some "add_vec_bit"), [], pure_e,nob); Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])), - (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")))), + (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))), External (Some "add_bit_vec"), [], pure_e,nob); ])); ("+_s",Overload( Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),External (Some "add"),[],pure_e,nob), true, - [Base(((mk_nat_params ["n";"m";"o";"p"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_add (mk_nv "n") (mk_nv "o")) (mk_add (mk_nv "m") (mk_nv "p"))))), + [Base(((mk_nat_params ["n";"m"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")]) + (mk_atom (mk_add (mk_nv "n") (mk_nv "m"))))), External (Some "add_signed"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))), External (Some "add_vec_signed"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_range (mk_nv "q") {nexp = N2n (mk_nv "n",None)}))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_range (mk_nv "q") (mk_2n (mk_nv "n"))))), External (Some "add_vec_vec_range_signed"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "add_vec_range_signed"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "p"),(mk_sub {nexp=N2n (mk_nv "m",None)} n_one))], + [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))], pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")); bit_t; bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))), External (Some "add_overflow_vec_signed"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") {nexp = N2n (mk_nv "m",None)})))), + Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))), External (Some "add_vec_range_range_signed"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "p"),mk_sub {nexp=N2n (mk_nv "m",None)} n_one)], + [LtEq(Specc(Parse_ast.Int("+",None)),Require, (mk_nv "o"),mk_sub (mk_2n (mk_nv "m")) n_one)], pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "add_range_vec_signed"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "p"),(mk_sub {nexp = N2n (mk_nv "m",None)} n_one))], + [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))], pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") {nexp = N2n (mk_nv "m",None)})))), + Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))), External (Some "add_range_vec_range_signed"), - [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "p"),(mk_sub {nexp=N2n (mk_nv "m",None)} n_one))], + [LtEq(Specc(Parse_ast.Int("+",None)),Require,(mk_nv "o"),(mk_sub (mk_2n (mk_nv "m")) n_one))], pure_e,nob); Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p"); bit_t]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))), External (Some "add_vec_bit_signed"), [], pure_e,nob); Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p"); bit_t]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")); bit_t; bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t]))), External (Some "add_overflow_vec_bit_signed"), [], pure_e,nob); Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])), - (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")))), + (mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")))), External (Some "add_bit_vec_signed"), [], pure_e,nob); ])); ("-_s",Overload( Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})), External (Some "minus"),[],pure_e,nob), true, - [Base(((mk_nat_params["n";"m";"o";"p"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_sub (mk_nv "n") (mk_nv "o")) (mk_sub (mk_nv "m") (mk_nv "p"))))), + [Base(((mk_nat_params["n";"m"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")]) + (mk_atom (mk_sub (mk_nv "n") (mk_nv "m"))))), External (Some "minus"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))), External (Some "minus_vec_signed"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "minus_vec_range_signed"), [],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") {nexp = N2n (mk_nv "m",None)})))), + Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))), External (Some "minus_vec_range_range_signed"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "minus_range_vec_signed"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") {nexp = N2n (mk_nv "m",None)})))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))), External (Some "minus_range_vec_range_signed"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")); bit_t; bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))), External (Some "minus_overflow_vec_signed"),[],pure_e,nob); Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p"); bit_t]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")); bit_t; bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t]))), External (Some "minus_overflow_vec_bit_signed"), [], pure_e,nob); ])); ("-",Overload( Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})), External (Some "minus"),[],pure_e,nob), true, - [Base(((mk_nat_params["n";"m";"o";"p"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_sub (mk_nv "n") (mk_nv "o")) (mk_sub (mk_nv "m") (mk_nv "p"))))), + [Base(((mk_nat_params["n";"m"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")]) + (mk_atom (mk_sub (mk_nv "n") (mk_nv "m"))))), External (Some "minus"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")))), External (Some "minus_vec"),[],pure_e,nob); - Base(((mk_nat_params ["m";"n";"o";"p";"q"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_range (mk_nv "m") (mk_nv "q")))), External (Some "minus_vec_vec_range"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), - External (Some "minus_vec_range"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") {nexp = N2n (mk_nv "m",None)})))), + Base(((mk_nat_params ["m";"n";"o";"p"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_atom (mk_nv "m")))), External (Some "minus_vec_vec_range"),[],pure_e,nob); (*Need a bound on m*) + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), + External (Some "minus_vec_range"),[],pure_e,nob); (*Need a bound on o?*) + Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))), External (Some "minus_vec_range_range"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + Base(((mk_nat_params ["n";"m";"o"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "minus_range_vec"),[],pure_e,nob); - Base(((mk_nat_params ["n";"m";"o";"p";])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m");]) - (mk_range (mk_nv "o") (mk_add (mk_nv "p") {nexp = N2n (mk_nv "m",None)})))), + Base(((mk_nat_params ["n";"m";"o";])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m");]) + (mk_range (mk_nv "o") (mk_add (mk_nv "o") (mk_2n (mk_nv "m")))))), External (Some "minus_range_vec_range"),[],pure_e,nob); Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n")); bit_t; bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n")); bit_t; bit_t]))), External (Some "minus_overflow_vec"),[],pure_e,nob); Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p"); bit_t]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")); bit_t; bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p"); bit_t]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "p")); bit_t; bit_t]))), External (Some "minus_overflow_vec_bit"), [], pure_e,nob); ])); ("*",Overload( Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]){t=Tvar "c"})),External (Some "multiply"),[],pure_e,nob), true, - [Base(((mk_nat_params["n";"m";"o";"p"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_mult (mk_nv "n") (mk_nv "o")) (mk_mult (mk_nv "m") (mk_nv "p"))))), + [Base(((mk_nat_params["n";"m"]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")]) + (mk_atom (mk_mult (mk_nv "n") (mk_nv "m"))))), External (Some "multiply"), [],pure_e,nob); - Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nadd (mk_nv "n", mk_nv "n"))))), + Base(((mk_nat_params ["n";"o";"p";"q"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "q") (mk_add (mk_nv "n") (mk_nv "n"))))), External (Some "multiply_vec"), [],pure_e,nob); Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nadd (mk_nv "m", mk_nv "m"))))), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "q") (mk_add (mk_nv "m") (mk_nv "m"))))), External (Some "mult_range_vec"),[],pure_e,nob); Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nadd (mk_nv "m", mk_nv "m"))))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "q") (mk_add (mk_nv "m") (mk_nv "m"))))), External (Some "mult_vec_range"),[],pure_e,nob); ])); ("*_s",Overload( Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]){t=Tvar "c"})),External (Some "multiply"),[],pure_e,nob), true, - [Base(((mk_nat_params["n";"m";"o";"p"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_mult (mk_nv "n") (mk_nv "o")) (mk_mult (mk_nv "m") (mk_nv "p"))))), + [Base(((mk_nat_params["n";"m";]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "n"); mk_atom (mk_nv "m")]) + (mk_atom (mk_mult (mk_nv "n") (mk_nv "m"))))), External (Some "multiply_signed"), [],pure_e,nob); - Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_vector bit_t (Ovar "ord") (Nvar "o") (Nadd (mk_nv "n", mk_nv "n"))))), + Base(((mk_nat_params ["n";"o";"p";"m"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_add (mk_nv "n") (mk_nv "n"))))), External (Some "multiply_vec_signed"), [],pure_e,nob); Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nadd (mk_nv "m", mk_nv "m"))))), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "o"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_add (mk_nv "m") (mk_nv "m"))))), External (Some "mult_range_vec_signed"),[],pure_e,nob); Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_range (mk_nv "o") (mk_nv "p")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nadd (mk_nv "m", mk_nv "m"))))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_atom (mk_nv "o")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_add (mk_nv "m") (mk_nv "m"))))), External (Some "mult_vec_range_signed"),[],pure_e,nob); - Base(((mk_nat_params ["n";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nadd (mk_nv "n", mk_nv "n"))); + Base(((mk_nat_params ["n";"o";"p";"m"])@(mk_ord_params ["ord"]), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_add (mk_nv "n") (mk_nv "n"))); bit_t;bit_t]))), External (Some "mult_overflow_vec_signed"), [],pure_e,nob); ])); ("**", - Base(((mk_nat_params ["o";"p"]), - (mk_pure_fun (mk_tup [(mk_range n_two n_two); - (mk_range (mk_nv "o") (mk_nv "p"))]) - (mk_range {nexp =N2n ((mk_nv "o"), None)} {nexp = N2n ((mk_nv "p"), None)}))), + Base(((mk_nat_params ["o"]), + (mk_pure_fun (mk_tup [(mk_atom n_two); (mk_atom (mk_nv "o"))]) + (mk_atom (mk_2n (mk_nv "o"))))), External (Some "power"), [],pure_e,nob)); ("mod", Overload( Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})), External (Some "mod"),[],pure_e,nob), true, - [Base(((mk_nat_params["n";"m";"o";"p"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); mk_range (mk_nv "p") (mk_nv "o")]) + [Base(((mk_nat_params["n";"o";]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "n") ; mk_atom (mk_nv "o")]) (mk_range n_zero (mk_sub (mk_nv "o") n_one)))), External (Some "mod"),[GtEq(Specc(Parse_ast.Int("mod",None)),Require,(mk_nv "o"),n_one)],pure_e,nob); Base(((mk_nat_params["n";"m";"o"])@(mk_ord_params["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); mk_range n_one (mk_nv "o")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "mod_vec_range"), [GtEq(Specc(Parse_ast.Int("mod",None)),Require,(mk_nv "o"),n_one);],pure_e,nob); Base(((mk_nat_params["n";"m"])@(mk_ord_params["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "mod_vec"),[],pure_e,nob)])); ("quot", Overload( Base(((mk_typ_params ["a";"b";"c"]), (mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "b"}]) {t=Tvar "c"})),External (Some "quot"),[],pure_e,nob), true, - [Base(((mk_nat_params["n";"m";"o";"p";"q";"r"]), - (mk_pure_fun (mk_tup [mk_range (mk_nv "n") (mk_nv "m"); mk_range (mk_nv "o") (mk_nv "p")]) - (mk_range (mk_nv "q") (mk_nv "r")))), - External (Some "quot"),[GtEq(Specc(Parse_ast.Int("quot",None)),Require,(mk_nv "o"),n_one); + [Base(((mk_nat_params["n";"m";"o";]), + (mk_pure_fun (mk_tup [mk_atom (mk_nv "n");mk_atom (mk_nv "m")]) + (mk_atom (mk_nv "o")))), + External (Some "quot"),[GtEq(Specc(Parse_ast.Int("quot",None)),Require,(mk_nv "m"),n_one); LtEq(Specc(Parse_ast.Int("quot",None)),Guarantee, - (mk_mult (mk_nv "p") (mk_nv "r")),(mk_nv "m"))], + (mk_mult (mk_nv "n") (mk_nv "o")),(mk_nv "m"))], pure_e,nob); Base(((mk_nat_params["n";"m";"p";"q"])@(mk_ord_params["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "q")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "quot_vec"),[GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")], pure_e,nob); Base(((mk_nat_params["n";"m";"p";"q"])@(mk_ord_params["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "q")]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")); bit_t;bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")); bit_t;bit_t]))), External (Some "quot_overflow_vec"), [GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")], pure_e,nob)])); @@ -1470,26 +1488,26 @@ let initial_typ_env = LtEq(Specc(Parse_ast.Int("quot",None)),Guarantee,(mk_mult (mk_nv "p") (mk_nv "r")),mk_nv "m")], pure_e,nob); Base(((mk_nat_params["n";"m";"p";"q"])@(mk_ord_params["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "q")]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")]) + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "quot_vec_signed"), [GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")],pure_e,nob); Base(((mk_nat_params["n";"m";"p";"q"])@(mk_ord_params["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "q")]) - (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")); bit_t;bit_t]))), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "q")]) + (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")); bit_t;bit_t]))), External (Some "quot_overflow_vec_signed"), [GtEq(Specc(Parse_ast.Int("quot",None)),Require, mk_nv "m", mk_nv "q")],pure_e,nob); ])); ("length", Base((["a",{k=K_Typ}]@(mk_nat_params["n";"m"])@(mk_ord_params["ord"]), - (mk_pure_fun (mk_vector {t=Tvar "a"} (Ovar "ord") (Nvar "n") (Nvar "m")) - (mk_range (mk_nv "m") (mk_nv "m")))), + (mk_pure_fun (mk_vector {t=Tvar "a"} (Ovar "ord") (mk_nv "n") (mk_nv "m")) + (mk_atom (mk_nv "m")))), External (Some "length"),[],pure_e,nob)); (* incorrect types for typechecking processed sail code; do we care? *) ("mask",Base(((mk_typ_params ["a"])@(mk_nat_params["n";"m";"o";"p"])@(mk_ord_params["ord"]), - (mk_pure_imp (mk_vector {t=Tvar "a"} (Ovar "ord") (Nvar "n") (Nvar "m")) - (mk_vector {t=Tvar "a"} (Ovar "ord") (Nvar "p") (Nvar "o")) "o")), + (mk_pure_imp (mk_vector {t=Tvar "a"} (Ovar "ord") (mk_nv "n") (mk_nv "m")) + (mk_vector {t=Tvar "a"} (Ovar "ord") (mk_nv "p") (mk_nv "o")) "o")), External (Some "mask"), [GtEq(Specc(Parse_ast.Int("mask",None)),Guarantee, (mk_nv "m"), (mk_nv "o"))],pure_e,nob)); (*TODO These should be IP_start *) @@ -1510,18 +1528,18 @@ let initial_typ_env = (* == : bit['n] * [|'o;'p|] -> bit_t *) Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), (mk_pure_fun (mk_tup [mk_range (mk_nv "o") (mk_nv "p"); - mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")]) + mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")]) bit_t)), External (Some "eq_range_vec"), [Eq(Specc(Parse_ast.Int("==",None)),mk_add (mk_nv "o") (mk_nv "p"),{nexp=N2n (mk_nv "m",None)})], pure_e,nob); (* == : [|'o;'p|] * bit['n] -> bit_t *) Base(((mk_nat_params ["n";"m";"o";"p"])@(mk_ord_params ["ord"]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); mk_range (mk_nv "o") (mk_nv "p")]) bit_t)), External (Some "eq_vec_range"), - [Eq(Specc(Parse_ast.Int("==",None)),mk_add (mk_nv "o") (mk_nv "p"),{nexp=N2n (mk_nv "m",None)})], + [Eq(Specc(Parse_ast.Int("==",None)),mk_add (mk_nv "o") (mk_nv "p"),mk_2n (mk_nv "m"))], pure_e,nob); Base((["a",{k=K_Typ}],(mk_pure_fun (mk_tup [{t=Tvar "a"};{t=Tvar "a"}]) bit_t)), External (Some "eq"),[],pure_e,nob)])); @@ -1539,11 +1557,11 @@ let initial_typ_env = LtEq(Specc(Parse_ast.Int("<",None)),Guarantee, mk_add (mk_nv "m") n_one, mk_nv "p")*)], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "lt_vec"),[],pure_e,nob); Base(((mk_nat_params ["n";"m";"o";"p"]@["ord",{k=K_Ord}]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); mk_range (mk_nv "o") (mk_nv "p")]) bit_t)), External (Some "lt_vec_range"), [], pure_e, nob); ])); @@ -1559,8 +1577,8 @@ let initial_typ_env = LtEq(Specc(Parse_ast.Int("<_s",None)),Guarantee, mk_add (mk_nv "m") n_one, mk_nv "p")], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "lt_vec_signed"),[],pure_e,nob); ])); ("<_u", @@ -1575,8 +1593,8 @@ let initial_typ_env = LtEq(Specc(Parse_ast.Int("<_u",None)),Guarantee, mk_add (mk_nv "m") n_one, mk_nv "p")], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "lt_vec_unsigned"),[],pure_e,nob); ])); (">", @@ -1591,11 +1609,11 @@ let initial_typ_env = GtEq(Specc(Parse_ast.Int(">",None)),Guarantee, mk_nv "m", mk_add (mk_nv "p") n_one)], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "gt_vec"),[],pure_e,nob); Base(((mk_nat_params ["n";"m";"o";"p"]@["ord",{k=K_Ord}]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m"); + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m"); mk_range (mk_nv "o") (mk_nv "p")]) bit_t)), External (Some "gt_vec_range"), [], pure_e, nob); ])); @@ -1611,8 +1629,8 @@ let initial_typ_env = GtEq(Specc(Parse_ast.Int(">_s",None)),Guarantee, mk_nv "m", mk_add (mk_nv "p") n_one)], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "gt_vec_signed"),[],pure_e,nob); ])); (">_u", @@ -1627,8 +1645,8 @@ let initial_typ_env = GtEq(Specc(Parse_ast.Int(">_s",None)),Guarantee, mk_nv "m", mk_add (mk_nv "p") n_one)], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "gt_vec_unsigned"),[],pure_e,nob); ])); ("<=", @@ -1643,8 +1661,8 @@ let initial_typ_env = LtEq(Specc(Parse_ast.Int("<=",None)),Guarantee,mk_nv "m",mk_nv "p")], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "lteq_vec"),[],pure_e,nob); ])); ("<=_s", @@ -1659,8 +1677,8 @@ let initial_typ_env = LtEq(Specc(Parse_ast.Int("<=",None)),Guarantee,mk_nv "m",mk_nv "p")], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@["ord",{k=K_Ord}]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "lteq_vec_signed"),[],pure_e,nob); ])); (">=", @@ -1675,8 +1693,8 @@ let initial_typ_env = GtEq(Specc(Parse_ast.Int(">=",None)),Guarantee, mk_nv "m", mk_nv "p")], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "gteq_vec"),[],pure_e,nob); ])); (">=_s", @@ -1691,13 +1709,13 @@ let initial_typ_env = GtEq(Specc(Parse_ast.Int(">=_s",None)),Guarantee, mk_nv "m", mk_nv "p")], pure_e,nob); Base((((mk_nat_params ["n";"o";"p"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "n"); - mk_vector bit_t (Ovar "ord") (Nvar "p") (Nvar "n")]) bit_t)), + (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (mk_nv "o") (mk_nv "n"); + mk_vector bit_t (Ovar "ord") (mk_nv "p") (mk_nv "n")]) bit_t)), External (Some "gteq_vec_signed"),[],pure_e,nob); ])); ("is_one",Base(([],(mk_pure_fun bit_t bit_t)),External (Some "is_one"),[],pure_e,nob)); ("signed",Base((mk_nat_params["n";"m";"o"]@[("ord",{k=K_Ord})], - (mk_pure_fun (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")) + (mk_pure_fun (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")) (mk_atom (mk_nv "o")))), External (Some "signed"), [(GtEq(Specc(Parse_ast.Int("signed",None)),Guarantee, @@ -1705,35 +1723,35 @@ let initial_typ_env = (LtEq(Specc(Parse_ast.Int("signed",None)),Guarantee, mk_nv "o", mk_sub {nexp = N2n(mk_nv "m",None)} n_one));],pure_e,nob)); ("unsigned",Base((mk_nat_params["n";"m";"o"]@[("ord",{k=K_Ord})], - (mk_pure_fun (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")) + (mk_pure_fun (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")) (mk_atom (mk_nv "o")))), External (Some "unsigned"), [(GtEq(Specc(Parse_ast.Int("unsigned",None)),Guarantee, mk_nv "o", n_zero)); (LtEq(Specc(Parse_ast.Int("unsigned",None)),Guarantee, - mk_nv "o", mk_sub {nexp = N2n(mk_nv "m",None)} n_one));],pure_e,nob)); + mk_nv "o", mk_sub (mk_2n (mk_nv "m")) n_one));],pure_e,nob)); mk_bitwise_op "bitwise_not" "~" 1; mk_bitwise_op "bitwise_or" "|" 2; mk_bitwise_op "bitwise_xor" "^" 2; mk_bitwise_op "bitwise_and" "&" 2; ("^^",Base((mk_nat_params ["n"], (mk_pure_fun (mk_tup [bit_t;mk_atom (mk_nv "n")]) - (mk_vector bit_t Oinc (Nconst zero) (Nvar "n")))), + (mk_vector bit_t Oinc (mk_c zero) (mk_nv "n")))), External (Some "duplicate"),[],pure_e,nob)); ("<<",Base((((mk_nat_params ["n";"m"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")); + (mk_pure_fun (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")); (mk_range n_zero (mk_nv "m"))]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "bitwise_leftshift"),[],pure_e,nob)); (">>",Base((((mk_nat_params ["n";"m"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")); + (mk_pure_fun (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")); (mk_range n_zero (mk_nv "m"))]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "bitwise_rightshift"),[],pure_e,nob)); ("<<<",Base((((mk_nat_params ["n";"m"])@[("ord",{k=K_Ord})]), - (mk_pure_fun (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")); + (mk_pure_fun (mk_tup [(mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")); (mk_range n_zero (mk_nv "m"))]) - (mk_vector bit_t (Ovar "ord") (Nvar "n") (Nvar "m")))), + (mk_vector bit_t (Ovar "ord") (mk_nv "n") (mk_nv "m")))), External (Some "bitwise_rotate"),[],pure_e,nob)); ] @@ -1770,15 +1788,16 @@ and n_subst s_env n = | Nvar i -> (match Envmap.apply s_env i with | Some(TA_nexp n1) -> n1 - | _ -> { nexp = Nvar i }) + | _ -> mk_nv i) | Nuvar _ -> new_n() | Nconst _ | Npos_inf | Nneg_inf -> n - | N2n(n1,i) -> { nexp = N2n (n_subst s_env n1,i) } - | Npow(n1,i) -> { nexp = Npow (n_subst s_env n1,i) } - | Nneg n1 -> { nexp = Nneg (n_subst s_env n1) } - | Nadd(n1,n2) -> { nexp = Nadd(n_subst s_env n1,n_subst s_env n2) } - | Nsub(n1,n2) -> {nexp = Nsub(n_subst s_env n1,n_subst s_env n2) } - | Nmult(n1,n2) -> { nexp = Nmult(n_subst s_env n1,n_subst s_env n2) } + | N2n(n1,None) -> mk_2n (n_subst s_env n1) + | N2n(n1,Some(i)) -> n + | Npow(n1,i) -> mk_pow (n_subst s_env n1) i + | Nneg n1 -> mk_neg (n_subst s_env n1) + | Nadd(n1,n2) -> mk_add (n_subst s_env n1) (n_subst s_env n2) + | Nsub(n1,n2) -> mk_sub (n_subst s_env n1) (n_subst s_env n2) + | Nmult(n1,n2) -> mk_mult(n_subst s_env n1) (n_subst s_env n2) and o_subst s_env o = match o.order with | Ovar i -> (match Envmap.apply s_env i with @@ -1873,7 +1892,7 @@ and n_remove_unifications s_env n = | Nuvar nu -> let n' = match nu.nsubst with | None -> n - | _ -> resolve_nsubst n; n in + | _ -> ignore (resolve_nsubst n); n in (match n'.nexp with | Nuvar _ -> (*let _ = Printf.eprintf "nuvar is before turning into var %s\n" (n_to_string n') in*) @@ -2679,13 +2698,10 @@ let rec simple_constraint_check in_env cs = then None else eq_to_zero ok_to_set n1' n2') in - (match contains_in_vars in_env n1, contains_in_vars in_env n2 with - | _,_ -> - let _ = reduce_n_unifications n1; reduce_n_unifications n2 in - (match check_eq true n1 n2 with - | None -> (check cs) - | Some(c) -> c::(check cs)) - | _ -> (Eq(co,n1,n2)::(check cs))) + let _ = reduce_n_unifications n1; reduce_n_unifications n2 in + (match check_eq true n1 n2 with + | None -> (check cs) + | Some(c) -> c::(check cs)) | GtEq(co,enforce,n1,n2)::cs -> (*let _ = Printf.eprintf ">= check, about to normalize_nexp of %s, %s\n" (n_to_string n1) (n_to_string n2) in *) let n1',n2' = normalize_nexp n1,normalize_nexp n2 in @@ -2696,7 +2712,7 @@ let rec simple_constraint_check in_env cs = then check cs else eq_error (get_c_loc co) ("Type constraint mismatch: constraint of " ^ n_to_string n1 ^ " >= " ^ n_to_string n2 ^ " arising from here requires " ^ string_of_big_int i1 ^ " to be greater than or equal to " ^ string_of_big_int i2) - | Npos_inf, _ | Npos_inf, Npos_inf | _, Nneg_inf | Nneg_inf, Nneg_inf -> check cs + | Npos_inf, _ | _, Nneg_inf -> check cs | Ninexact, _ | _, Ninexact -> check cs | Nconst _ ,Npos_inf -> eq_error (get_c_loc co) ("Type constraint mismatch: constraint arising from here requires " ^ (n_to_string n1') ^ " to be greater than or equal to infinity") @@ -2722,7 +2738,7 @@ let rec simple_constraint_check in_env cs = then check cs else eq_error (get_c_loc co) ("Type constraint mismatch: constraint arising from here requires " ^ string_of_big_int i1 ^ " to be less than or equal to " ^ string_of_big_int i2) - | _, Npos_inf | Npos_inf, Npos_inf | Nneg_inf, _ | Nneg_inf, Nneg_inf -> check cs + | _, Npos_inf | Nneg_inf, _ -> check cs (*| Npos_inf, Nconst _ -> eq_error (get_c_loc co) ("Type constraint mismatch: constraint arising from here requires infinity to be less than or equal to " ^ (n_to_string n2'))*) | _,_ -> LtEq(co,enforce,n1',n2')::(check cs)) |
