let lang_subseteq (l1 : lang) (l2 : lang) : bool = match l1, l2 with
  | UnrestrictedUnrestricted -> true
  | UnrestrictedMachine m -> lang_eq Unrestricted (Machine m)
  | Machine m, Unrestricted ->  true
  | Machine m1, Machine m2 -> nfa_subseteq m1 m2
  | _ -> raise (IllegalLangOp "lang_subseteq")