Commit 1c1ca633 authored by Pietro Abate's avatar Pietro Abate
Browse files

Propagate data structure changes throught the code

parent f2f4c46b
...@@ -8,7 +8,8 @@ true: -traverse ...@@ -8,7 +8,8 @@ true: -traverse
<compile>: include <compile>: include
<schema>: include <schema>: include
<runtime>: include <runtime>: include
<{misc,types,typing,schema,compile,runtime}/*.cmx>: for-pack(Cduce_test) #<{misc,types,typing,schema,compile,runtime}/*.cmx>: for-pack(Cduce_test)
<{misc,types}/*.cmx>: for-pack(Cduce_test)
<{misc,types}/*.cmx>: for-pack(Cduce_boolvar) <{misc,types}/*.cmx>: for-pack(Cduce_boolvar)
<parser/**>: package(ulex), package(netstring), syntax(camlp4o) <parser/**>: package(ulex), package(netstring), syntax(camlp4o)
......
...@@ -17,3 +17,4 @@ Normal ...@@ -17,3 +17,4 @@ Normal
Pretty Pretty
Stats Stats
BoolVar BoolVar
Types
...@@ -29,6 +29,7 @@ sig ...@@ -29,6 +29,7 @@ sig
*) *)
val trivially_disjoint: t -> t -> bool val trivially_disjoint: t -> t -> bool
end end
module type MAKE = functor (X : Custom.T) -> S with type elem = X.t module type MAKE = functor (X : Custom.T) -> S with type elem = X.t
...@@ -53,7 +54,6 @@ struct ...@@ -53,7 +54,6 @@ struct
(* Idea: add a mutable "unique" identifier and set it to (* Idea: add a mutable "unique" identifier and set it to
the minimum of the two when egality ... *) the minimum of the two when egality ... *)
let rec compare a b = let rec compare a b =
if (a == b) then 0 if (a == b) then 0
else match (a,b) with else match (a,b) with
...@@ -77,7 +77,6 @@ struct ...@@ -77,7 +77,6 @@ struct
let compute_hash x p i n = let compute_hash x p i n =
(X.hash x) + 17 * (hash p) + 257 * (hash i) + 16637 * (hash n) (X.hash x) + 17 * (hash p) + 257 * (hash i) + 16637 * (hash n)
let rec check = function let rec check = function
| True | False -> () | True | False -> ()
| Split (h,x,p,i,n) -> | Split (h,x,p,i,n) ->
...@@ -106,7 +105,6 @@ struct ...@@ -106,7 +105,6 @@ struct
Format.fprintf ppf "%i(@[%a,%a,%a@])" Format.fprintf ppf "%i(@[%a,%a,%a@])"
(* X.dump x *) (X.hash x) dump p dump i dump n (* X.dump x *) (X.hash x) dump p dump i dump n
let rec print f ppf = function let rec print f ppf = function
| True -> Format.fprintf ppf "Any" | True -> Format.fprintf ppf "Any"
| False -> Format.fprintf ppf "Empty" | False -> Format.fprintf ppf "Empty"
...@@ -161,7 +159,6 @@ struct ...@@ -161,7 +159,6 @@ struct
let get' x = get' [] [] [] x let get' x = get' [] [] [] x
let compute ~empty ~full ~cup ~cap ~diff ~atom b = let compute ~empty ~full ~cup ~cap ~diff ~atom b =
let rec aux = function let rec aux = function
| True -> full | True -> full
...@@ -179,10 +176,6 @@ struct ...@@ -179,10 +176,6 @@ struct
let split0 x pos ign neg = let split0 x pos ign neg =
Split (compute_hash x pos ign neg, x, pos, ign, neg) Split (compute_hash x pos ign neg, x, pos, ign, neg)
let empty = False let empty = False
let full = True let full = True
......
...@@ -46,7 +46,7 @@ and pexpr = ...@@ -46,7 +46,7 @@ and pexpr =
(* CDuce is a Lambda-calculus ... *) (* CDuce is a Lambda-calculus ... *)
| Var of U.t | Var of U.t
| TVar of U.t | TVar of Types.Vars.V.t
| Apply of pexpr * pexpr | Apply of pexpr * pexpr
| Abstraction of abstr | Abstraction of abstr
......
...@@ -62,7 +62,7 @@ let tuple_queue = ...@@ -62,7 +62,7 @@ let tuple_queue =
List.fold_right (fun x q -> Pair (x, q)) List.fold_right (fun x q -> Pair (x, q))
let char = mknoloc (Internal (Types.char Chars.any)) let char = mknoloc (Internal (Types.char (Types.BoolChars.atom (Custom.Atm Chars.any))))
let string_regexp = Star (Elem char) let string_regexp = Star (Elem char)
let seq_of_string s = let seq_of_string s =
...@@ -298,7 +298,7 @@ EXTEND Gram ...@@ -298,7 +298,7 @@ EXTEND Gram
| e1 = expr; "&&"; e2 = expr -> exp _loc (logical_and e1 e2) | e1 = expr; "&&"; e2 = expr -> exp _loc (logical_and e1 e2)
| e = expr; op = "/"; p = pat LEVEL "simple" -> | e = expr; op = "/"; p = pat LEVEL "simple" ->
(* transform e with <(Atom)>[($$$::t|_)*] -> [$$$] *) (* transform e with <(Atom)>[($$$::t|_)*] -> [$$$] *)
let tag = mk _loc (Internal (Types.atom (Atoms.any))) in let tag = mk _loc (Internal (Types.atom (Types.BoolAtoms.atom (Custom.Atm (Atoms.any))))) in
let att = mk _loc (Internal Types.Record.any) in let att = mk _loc (Internal Types.Record.any) in
let any = mk _loc (Internal Types.any) in let any = mk _loc (Internal Types.any) in
let re = Star(Alt(SeqCapture(noloc,id_dummy,Elem p), Elem any)) in let re = Star(Alt(SeqCapture(noloc,id_dummy,Elem p), Elem any)) in
...@@ -307,7 +307,7 @@ EXTEND Gram ...@@ -307,7 +307,7 @@ EXTEND Gram
exp _loc (Transform (e,[p, Var id_dummy])) exp _loc (Transform (e,[p, Var id_dummy]))
| e = expr; "/@"; a = ident_or_keyword -> | e = expr; "/@"; a = ident_or_keyword ->
(* transform e with <(Atom) {a=$$$}>_ -> [$$$] *) (* transform e with <(Atom) {a=$$$}>_ -> [$$$] *)
let tag = mk _loc (Internal (Types.atom Atoms.any)) in let tag = mk _loc (Internal (Types.atom (Types.BoolAtoms.atom (Custom.Atm (Atoms.any))))) in
let any = mk _loc (Internal Types.any) in let any = mk _loc (Internal Types.any) in
let att = mk _loc (Record let att = mk _loc (Record
(true, [(label a, (true, [(label a,
...@@ -330,7 +330,7 @@ EXTEND Gram ...@@ -330,7 +330,7 @@ EXTEND Gram
set_ref set_ref
(Var stk) (Var stk)
(concat (get_ref (Var stk)) (Pair (Var id_dummy,cst_nil))) in (concat (get_ref (Var stk)) (Pair (Var id_dummy,cst_nil))) in
let tag = mknoloc (Internal (Types.atom (Atoms.any))) in let tag = mknoloc (Internal (Types.atom (Types.BoolAtoms.atom (Custom.Atm (Atoms.any))))) in
let att = mknoloc (Internal Types.Record.any) in let att = mknoloc (Internal Types.Record.any) in
let any = mknoloc (Internal Types.any) in let any = mknoloc (Internal Types.any) in
let re = (SeqCapture(noloc,y,Star(Elem(any)))) in let re = (SeqCapture(noloc,y,Star(Elem(any)))) in
...@@ -403,8 +403,8 @@ EXTEND Gram ...@@ -403,8 +403,8 @@ EXTEND Gram
tag: [ [ a = ident_or_keyword -> exp _loc (Atom (ident a)) ] ]; tag: [ [ a = ident_or_keyword -> exp _loc (Atom (ident a)) ] ];
tag_type: [ tag_type: [
[ "_" -> mk _loc (Internal (Types.atom Atoms.any)) [ "_" -> mk _loc (Internal (Types.atom (Types.BoolAtoms.atom (Custom.Atm (Atoms.any)))))
| "$"; a = ident_or_keyword -> mk _loc (Cst (TVar (ident a))) | "$"; a = ident_or_keyword -> mk _loc (Cst (TVar a))
| a = ident_or_keyword -> mk _loc (Cst (Atom (ident a))) | a = ident_or_keyword -> mk _loc (Cst (Atom (ident a)))
| t = ANY_IN_NS -> mk _loc (NsT (ident t)) | t = ANY_IN_NS -> mk _loc (NsT (ident t))
] ]
...@@ -569,13 +569,13 @@ EXTEND Gram ...@@ -569,13 +569,13 @@ EXTEND Gram
| i = STRING1; "--"; j = STRING1 -> | i = STRING1; "--"; j = STRING1 ->
let i = Chars.V.mk_int (parse_char _loc i) let i = Chars.V.mk_int (parse_char _loc i)
and j = Chars.V.mk_int (parse_char _loc j) in and j = Chars.V.mk_int (parse_char _loc j) in
Elem (mk _loc (Internal (Types.char (Chars.char_class i j)))) Elem (mk _loc (Internal (Types.char (Types.BoolChars.atom (Custom.Atm (Chars.char_class i j))))))
| s = STRING1 -> | s = STRING1 ->
List.fold_right List.fold_right
(fun c accu -> (fun c accu ->
let c = Chars.V.mk_int c in let c = Chars.V.mk_int c in
let c = Chars.atom c in let c = Chars.atom c in
Seq (Elem (mknoloc (Internal (Types.char c))), accu)) Seq (Elem (mknoloc (Internal (Types.char (Types.BoolChars.atom (Custom.Atm c))))), accu))
(seq_of_string s) (seq_of_string s)
Epsilon ] Epsilon ]
| [ e = pat LEVEL "simple" -> Elem e | [ e = pat LEVEL "simple" -> Elem e
...@@ -619,20 +619,20 @@ EXTEND Gram ...@@ -619,20 +619,20 @@ EXTEND Gram
| i = INT ; "--"; j = INT -> | i = INT ; "--"; j = INT ->
let i = Intervals.V.mk i let i = Intervals.V.mk i
and j = Intervals.V.mk j in and j = Intervals.V.mk j in
mk _loc (Internal (Types.interval (Intervals.bounded i j))) mk _loc (Internal (Types.interval (Types.BoolIntervals.atom (Custom.Atm (Intervals.bounded i j)))))
| i = INT -> | i = INT ->
let i = Intervals.V.mk i in let i = Intervals.V.mk i in
mk _loc (Internal (Types.interval (Intervals.atom i))) mk _loc (Internal (Types.interval (Types.BoolIntervals.atom (Custom.Atm (Intervals.atom i)))))
| "*"; "--"; j = INT -> | "*"; "--"; j = INT ->
let j = Intervals.V.mk j in let j = Intervals.V.mk j in
mk _loc (Internal (Types.interval (Intervals.left j))) mk _loc (Internal (Types.interval (Types.BoolIntervals.atom (Custom.Atm (Intervals.left j)))))
| i = INT; "--"; "*" -> | i = INT; "--"; "*" ->
let i = Intervals.V.mk i in let i = Intervals.V.mk i in
mk _loc (Internal (Types.interval (Intervals.right i))) mk _loc (Internal (Types.interval (Types.BoolIntervals.atom (Custom.Atm (Intervals.right i)))))
| i = char -> | i = char ->
mk _loc (Internal (Types.char (Chars.char_class i i))) mk _loc (Internal (Types.char (Types.BoolChars.atom (Custom.Atm (Chars.char_class i i)))))
| i = char ; "--"; j = char -> | i = char ; "--"; j = char ->
mk _loc (Internal (Types.char (Chars.char_class i j))) mk _loc (Internal (Types.char (Types.BoolChars.atom (Custom.Atm (Chars.char_class i j)))))
| "`"; c = tag_type -> c | "`"; c = tag_type -> c
| "("; l = LIST1 pat SEP ","; ")" -> multi_prod _loc l | "("; l = LIST1 pat SEP ","; ")" -> multi_prod _loc l
| "["; r = [ r = regexp -> r | -> Epsilon ]; | "["; r = [ r = regexp -> r | -> Epsilon ];
...@@ -657,8 +657,9 @@ EXTEND Gram ...@@ -657,8 +657,9 @@ EXTEND Gram
(fun c -> (fun c ->
mknoloc (Internal mknoloc (Internal
(Types.char (Types.char
(Types.BoolChars.atom (Custom.Atm (
(Chars.atom (Chars.atom
(Chars.V.mk_int c))))) (Chars.V.mk_int c))))))))
(seq_of_string s) in (seq_of_string s) in
let s = s @ [mknoloc (Internal (Sequence.nil_type))] in let s = s @ [mknoloc (Internal (Sequence.nil_type))] in
multi_prod _loc s multi_prod _loc s
......
...@@ -480,7 +480,7 @@ let int_type (name,min,max) = ...@@ -480,7 +480,7 @@ let int_type (name,min,max) =
| None, None -> | None, None ->
Intervals.any Intervals.any
in in
ignore (primitive name (Types.interval ival) (validate_interval ival name)) ignore (primitive name (Types.interval (Types.BoolIntervals.atom (Custom.Atm ival))) (validate_interval ival name))
let () = let () =
List.iter int_type [ List.iter int_type [
......
...@@ -192,9 +192,8 @@ let simple_union name members = ...@@ -192,9 +192,8 @@ let simple_union name members =
let xsi_nil_atom = Atoms.V.mk (Schema_xml.xsi, Utf8.mk "nil") let xsi_nil_atom = Atoms.V.mk (Schema_xml.xsi, Utf8.mk "nil")
let xsi_nil_type = Types.atom (Atoms.atom xsi_nil_atom) let xsi_nil_type = Types.atom (Types.BoolAtoms.atom (Custom.Atm (Atoms.atom xsi_nil_atom)))
let xsi_nil_label = Ns.Label.mk (Schema_xml.xsi, Utf8.mk "nil") let xsi_nil_label = Ns.Label.mk (Schema_xml.xsi, Utf8.mk "nil")
let merge_attribute_uses l = let merge_attribute_uses l =
List.fold_left (fun (l,a) (l',a') -> (l @ l', a || a')) ([],false) l List.fold_left (fun (l,a) (l',a') -> (l @ l', a || a')) ([],false) l
...@@ -13,7 +13,7 @@ module BoolChars : S = struct ...@@ -13,7 +13,7 @@ module BoolChars : S = struct
let mk_atm c = atom (Custom.Atm (Chars.atom (Chars.V.mk_char c.[0] ))) let mk_atm c = atom (Custom.Atm (Chars.atom (Chars.V.mk_char c.[0] )))
end end
module BoolAtoms = struct module BoolAtoms : S with type bt = Atoms.t = struct
include BoolVar.Make(Atoms) include BoolVar.Make(Atoms)
let mk_var s = atom (Custom.Var s) let mk_var s = atom (Custom.Var s)
let mk_atm s = atom (Custom.Atm (Atoms.atom (Atoms.V.mk_ascii s))) let mk_atm s = atom (Custom.Atm (Atoms.atom (Atoms.V.mk_ascii s)))
...@@ -65,7 +65,7 @@ module BoolPair = BoolVar.Make(Pair) ...@@ -65,7 +65,7 @@ module BoolPair = BoolVar.Make(Pair)
module BoolRec = BoolVar.Make(Rec) module BoolRec = BoolVar.Make(Rec)
*) *)
let boolvar_tests_atoms = [ let atoms_tests = [
"commutativity intersection", BAP.os "atm foo ^ atm bar", BAP.os "atm bar ^ atm foo"; "commutativity intersection", BAP.os "atm foo ^ atm bar", BAP.os "atm bar ^ atm foo";
"commutativity union", BAP.os "atm foo v atm bar", BAP.os "atm bar v atm foo"; "commutativity union", BAP.os "atm foo v atm bar", BAP.os "atm bar v atm foo";
"distributive intersection", BAP.os "(atm foo v atm bar) ^ atm baz", BAP.os "(atm foo ^ atm baz) v (atm bar ^ atm baz)"; "distributive intersection", BAP.os "(atm foo v atm bar) ^ atm baz", BAP.os "(atm foo ^ atm baz) v (atm bar ^ atm baz)";
...@@ -79,25 +79,42 @@ let boolvar_tests_atoms = [ ...@@ -79,25 +79,42 @@ let boolvar_tests_atoms = [
"splitvar atm 1", snd(BoolAtoms.splitvars (BAP.os "var alpha v (atm foo ^ var beta) v var gamma")), BAP.os "atm foo ^ var beta"; "splitvar atm 1", snd(BoolAtoms.splitvars (BAP.os "var alpha v (atm foo ^ var beta) v var gamma")), BAP.os "atm foo ^ var beta";
"splitvar atm 2", snd(BoolAtoms.splitvars (BAP.os "var alpha v atm foo")), BAP.os "atm foo"; "splitvar atm 2", snd(BoolAtoms.splitvars (BAP.os "var alpha v atm foo")), BAP.os "atm foo";
"splitvar vars 2", fst(BoolAtoms.splitvars (BAP.os "var alpha v atm foo")), BAP.os "var alpha"; "splitvar vars 2", fst(BoolAtoms.splitvars (BAP.os "var alpha v atm foo")), BAP.os "var alpha";
];; ];;
let test_boolvar_atoms = let atoms_structure =
"test boolvar atoms" >::: "atoms structure" >:::
List.map (fun (descr, s1,s2) -> List.map (fun (descr, s1,s2) ->
(Printf.sprintf "test %s" descr) >:: (fun _ -> (Printf.sprintf "test %s" descr) >:: (fun _ ->
(*
List.iter (fun f -> f Format.std_formatter ) (BoolAtoms.print "Empty!" s1); List.iter (fun f -> f Format.std_formatter ) (BoolAtoms.print "Empty!" s1);
Format.printf "\n"; Format.printf "\n";
List.iter (fun f -> f Format.std_formatter ) (BoolAtoms.print "Empty!" s2); List.iter (fun f -> f Format.std_formatter ) (BoolAtoms.print "Empty!" s2);
Format.printf "\n"; Format.printf "\n";
*)
assert_equal (BoolAtoms.equal s1 s2) true assert_equal (BoolAtoms.equal s1 s2) true
) )
) boolvar_tests_atoms ) atoms_tests
;;
let atoms_contains =
"atoms contains" >:::
List.map (fun (descr, i, s) ->
(Printf.sprintf "test %s" descr) >:: (fun _ ->
let a = Atoms.V.mk_ascii i in
let t = BAP.os s in
assert_equal (Atoms.contains a (BoolAtoms.get t)) true
)
)
[
"foo in atm foo","foo","atm foo";
"foo in (atm foo v atm bar)","foo","atm foo v atm bar";
"foo in (atm foo v atm bar) ^ ^ var beta","foo","(atm foo v atm bar) ^ var beta";
]
;; ;;
let all = let all =
"all tests" >::: [ "all tests" >::: [
test_boolvar_atoms; atoms_structure;
] ]
let main () = let main () =
......
...@@ -2,7 +2,6 @@ open OUnit ...@@ -2,7 +2,6 @@ open OUnit
(* open Types *) (* open Types *)
let parse_typ s = let parse_typ s =
let st = Stream.of_string s in let st = Stream.of_string s in
let astpat = Parser.pat st in let astpat = Parser.pat st in
......
...@@ -27,15 +27,13 @@ let print_symbolset ns ppf = function ...@@ -27,15 +27,13 @@ let print_symbolset ns ppf = function
include SortedList.FiniteCofiniteMap(Ns.Uri)(SymbolSet) include SortedList.FiniteCofiniteMap(Ns.Uri)(SymbolSet)
let atom l = let atom l = atom (fst (V.value l), l)
atom (fst (V.value l), l)
(* this is to have a uniform signature of all basic types *) (* this is to have a uniform signature of all basic types *)
type elem = V.t type elem = V.t
let full = any let full = any
let contains l t = let contains l t = contains (fst (V.value l), l) t
contains (fst (V.value l), l) t
let single s = match get s with let single s = match get s with
| `Finite [_, SymbolSet.Finite [a]] -> a | `Finite [_, SymbolSet.Finite [a]] -> a
......
...@@ -2,7 +2,7 @@ let (<) : int -> int -> bool = (<) ...@@ -2,7 +2,7 @@ let (<) : int -> int -> bool = (<)
let (>) : int -> int -> bool = (>) let (>) : int -> int -> bool = (>)
let (=) : int -> int -> bool = (=) let (=) : int -> int -> bool = (=)
(* this is the the of the Constructor container *)
module type E = module type E =
sig sig
type elem type elem
...@@ -19,11 +19,14 @@ end ...@@ -19,11 +19,14 @@ end
module type S = module type S =
sig sig
type bt
type elem type elem
include Custom.T include Custom.T
val get: t -> (elem list * elem list) list (* returns the union of all leaves in the BDD *)
val get': t -> (elem list * (elem list) list) list val get: t -> bt
(* val get': t -> (elem list * (elem list) list) list *)
val empty : t val empty : t
val full : t val full : t
...@@ -48,6 +51,7 @@ sig ...@@ -48,6 +51,7 @@ sig
val print: string -> t -> (Format.formatter -> unit) list val print: string -> t -> (Format.formatter -> unit) list
val trivially_disjoint: t -> t -> bool val trivially_disjoint: t -> t -> bool
end end
(* ternary BDD (* ternary BDD
...@@ -77,6 +81,7 @@ struct ...@@ -77,6 +81,7 @@ struct
(* Custom.Atm are containers (Atoms, Chars, Intervals, Pairs ... ) (* Custom.Atm are containers (Atoms, Chars, Intervals, Pairs ... )
* Custom.Var are String * Custom.Var are String
*) *)
type bt = T.t
module X = Custom.Var(T) module X = Custom.Var(T)
type elem = T.t Custom.pairvar type elem = T.t Custom.pairvar
type t = type t =
...@@ -170,35 +175,7 @@ struct ...@@ -170,35 +175,7 @@ struct
| False -> [] | False -> []
| c -> [ fun ppf -> print X.dump ppf c ] | c -> [ fun ppf -> print X.dump ppf c ]
(* XXX : since every path contains 1 Atm, I should be able to (*
* descend on the first path and get a sample from the leaf *)
let rec sample = function
| Split (_,Custom.Var _, p,i,n) ->
begin match sample p with
|Some x -> Some x
|None ->
begin match sample i with
|Some x -> Some x
|None ->
begin match sample n with
|Some x -> Some x
|None -> None
end
end
end
| Split (_,Custom.Atm x, _,_,_) -> Some x
| _ -> None
let rec contains y x =
match x,y with
|True,_ |False,_ -> false
|Split (_,Custom.Var a, p,i,n),Custom.Var b ->
(a == b) || (contains y p) || (contains y i) || (contains y n)
|Split (_,Custom.Atm a, p,i,n),Custom.Atm b ->
((T.cap a b) == T.empty) || (contains y p) || (contains y i) || (contains y n)
|Split (_,_, p,i,n),_ ->
(contains y p) || (contains y i) || (contains y n)
let rec get accu pos neg = function let rec get accu pos neg = function
| True -> (pos,neg) :: accu | True -> (pos,neg) :: accu
| False -> accu | False -> accu
...@@ -210,7 +187,22 @@ struct ...@@ -210,7 +187,22 @@ struct
accu accu
let get x = get [] [] [] x let get x = get [] [] [] x
*)
let rec get accu = function
| True -> accu
| False -> accu
| Split (_,Custom.Atm x, True,False,False) -> x :: accu
| Split (_,Custom.Atm x, _,_,_) -> assert false
| Split (_,Custom.Var x, p,i,n) ->
let accu = get accu p in
let accu = get accu n in
let accu = get accu i in
accu
let get x = List.fold_left T.cup T.empty (get [] x)
(*
let rec get' accu pos neg = function let rec get' accu pos neg = function
| True -> (pos,neg) :: accu | True -> (pos,neg) :: accu
| False -> accu | False -> accu
...@@ -226,6 +218,7 @@ struct ...@@ -226,6 +218,7 @@ struct
aux [x] i aux [x] i
let get' x = get' [] [] [] x let get' x = get' [] [] [] x
*)
let compute ~empty ~full ~cup ~cap ~diff ~atom b = let compute ~empty ~full ~cup ~cap ~diff ~atom b =
let rec aux = function let rec aux = function
......
...@@ -13,7 +13,7 @@ let types = ...@@ -13,7 +13,7 @@ let types =
"Empty", Types.empty; "Empty", Types.empty;
"Any", any; "Any", any;
"Int", int; "Int", int;
"Char", Types.char Chars.any; "Char", Types.char (Types.BoolChars.atom (Custom.Atm ( Chars.any )));
"Byte", char_latin1; "Byte", char_latin1;
"Atom", atom; "Atom", atom;
"Pair", Types.Product.any; "Pair", Types.Product.any;
...@@ -167,7 +167,7 @@ binary_op_cst ">" ...@@ -167,7 +167,7 @@ binary_op_cst ">"
(* I/O *) (* I/O *)