let rec is_ordered l = match l with | a::b::q -> a <= b && is_ordered (b::q) | _ -> true;; let rec is_rev_ordered l = match l with | a::b::q -> a >= b && is_ordered (b::q) | _ -> true;; let rec has_ordering l = match l with | a::b::q -> if a < b then is_ordered (b::q) else if a > b then is_rev_ordered (b::q) else has_ordering (b::q) | _ -> true;; assert (has_ordering [1; 1; 2; 2; 3]);; assert (has_ordering [3; 2; 1; 1]);; assert (not (has_ordering [1; 1; 2; 1]));;