sig
  type name = Nam of string
  module Face :
    sig
      type elt = Link.name
      type t
      val add : Link.Face.elt -> Link.Face.t -> Link.Face.t
      val cardinal : Link.Face.t -> int
      val choose : Link.Face.t -> Link.Face.elt option
      val compare : Link.Face.t -> Link.Face.t -> int
      val diff : Link.Face.t -> Link.Face.t -> Link.Face.t
      val elements : Link.Face.t -> Link.Face.elt list
      val empty : Link.Face.t
      val equal : Link.Face.t -> Link.Face.t -> bool
      val exists : (Link.Face.elt -> bool) -> Link.Face.t -> bool
      val filter : (Link.Face.elt -> bool) -> Link.Face.t -> Link.Face.t
      val fold : (Link.Face.elt -> '-> 'a) -> Link.Face.t -> '-> 'a
      val for_all : (Link.Face.elt -> bool) -> Link.Face.t -> bool
      val inter : Link.Face.t -> Link.Face.t -> Link.Face.t
      val is_empty : Link.Face.t -> bool
      val iter : (Link.Face.elt -> unit) -> Link.Face.t -> unit
      val max_elt : Link.Face.t -> Link.Face.elt option
      val mem : Link.Face.elt -> Link.Face.t -> bool
      val min_elt : Link.Face.t -> Link.Face.elt option
      val partition :
        (Link.Face.elt -> bool) -> Link.Face.t -> Link.Face.t * Link.Face.t
      val remove : Link.Face.elt -> Link.Face.t -> Link.Face.t
      val singleton : Link.Face.elt -> Link.Face.t
      val split :
        Link.Face.elt -> Link.Face.t -> Link.Face.t * bool * Link.Face.t
      val subset : Link.Face.t -> Link.Face.t -> bool
      val union : Link.Face.t -> Link.Face.t -> Link.Face.t
    end
  module Ports :
    sig
      type t
      val choose : Link.Ports.t -> (int * int) option
      val compare :
        (int -> int -> int) -> Link.Ports.t -> Link.Ports.t -> int
      val empty : Link.Ports.t
      val equal :
        (int -> int -> bool) -> Link.Ports.t -> Link.Ports.t -> bool
      val filter : (int -> int -> bool) -> Link.Ports.t -> Link.Ports.t
      val fold : (int -> int -> '-> 'b) -> Link.Ports.t -> '-> 'b
      val is_empty : Link.Ports.t -> bool
      val max_binding : Link.Ports.t -> (int * int) option
      val min_binding : Link.Ports.t -> (int * int) option
      val to_string : Link.Ports.t -> string
      val of_nodes : Nodes.t -> Link.Ports.t
      val types : Link.Ports.t -> Nodes.t -> string list
      val to_IntSet : Link.Ports.t -> IntSet.t
      val apply : Iso.t -> Link.Ports.t -> Link.Ports.t
      val arity : Link.Ports.t -> int -> int option
      val compat_list :
        Link.Ports.t ->
        Link.Ports.t -> Nodes.t -> Nodes.t -> Cnf.lit list list
      val offset : Link.Ports.t -> int -> Link.Ports.t
      val add : int -> Link.Ports.t -> Link.Ports.t
      val sum : Link.Ports.t -> Link.Ports.t -> Link.Ports.t
      val cardinal : Link.Ports.t -> int
    end
  type edg = { i : Link.Face.t; o : Link.Face.t; p : Link.Ports.t; }
  module Lg :
    sig
      type elt = Link.edg
      type t
      val empty : Link.Lg.t
      val is_empty : Link.Lg.t -> bool
      val mem : Link.Lg.elt -> Link.Lg.t -> bool
      val add : Link.Lg.elt -> Link.Lg.t -> Link.Lg.t
      val singleton : Link.Lg.elt -> Link.Lg.t
      val remove : Link.Lg.elt -> Link.Lg.t -> Link.Lg.t
      val union : Link.Lg.t -> Link.Lg.t -> Link.Lg.t
      val inter : Link.Lg.t -> Link.Lg.t -> Link.Lg.t
      val diff : Link.Lg.t -> Link.Lg.t -> Link.Lg.t
      val compare : Link.Lg.t -> Link.Lg.t -> int
      val equal : Link.Lg.t -> Link.Lg.t -> bool
      val subset : Link.Lg.t -> Link.Lg.t -> bool
      val iter : (Link.Lg.elt -> unit) -> Link.Lg.t -> unit
      val fold : (Link.Lg.elt -> '-> 'a) -> Link.Lg.t -> '-> 'a
      val for_all : (Link.Lg.elt -> bool) -> Link.Lg.t -> bool
      val exists : (Link.Lg.elt -> bool) -> Link.Lg.t -> bool
      val filter : (Link.Lg.elt -> bool) -> Link.Lg.t -> Link.Lg.t
      val partition :
        (Link.Lg.elt -> bool) -> Link.Lg.t -> Link.Lg.t * Link.Lg.t
      val cardinal : Link.Lg.t -> int
      val elements : Link.Lg.t -> Link.Lg.elt list
      val min_elt : Link.Lg.t -> Link.Lg.elt
      val max_elt : Link.Lg.t -> Link.Lg.elt
      val choose : Link.Lg.t -> Link.Lg.elt
      val split : Link.Lg.elt -> Link.Lg.t -> Link.Lg.t * bool * Link.Lg.t
    end
  val parse_face : string list -> Link.Face.t
  val string_of_face : Link.Face.t -> string
  val to_string : Link.Lg.t -> string
  val of_string : string -> Link.Lg.t
  val json_of_link : Link.Lg.t -> string
  val json_of_link_f : Link.Lg.t -> Base.JSON.json_node
  val parse : links:string list -> nodes:string -> Link.Lg.t * Nodes.t
  val get_dot : Link.Lg.t -> string * string * string * string
  val inner : Link.Lg.t -> Link.Face.t
  val outer : Link.Lg.t -> Link.Face.t
  val apply : Iso.t -> Link.Lg.t -> Link.Lg.t
  val elementary_sub : inner:Link.Face.t -> outer:Link.Face.t -> Link.Lg.t
  val elementary_ion : Link.Face.t -> Link.Lg.t
  val elementary_id : Link.Face.t -> Link.Lg.t
  val id_empty : Link.Lg.t
  exception NAMES_ALREADY_DEFINED of (Link.Face.t * Link.Face.t)
  exception FACES_MISMATCH of (Link.Face.t * Link.Face.t)
  val tens : Link.Lg.t -> Link.Lg.t -> int -> Link.Lg.t
  val ppar : Link.Lg.t -> Link.Lg.t -> int -> Link.Lg.t
  val comp : Link.Lg.t -> Link.Lg.t -> int -> Link.Lg.t
  val is_id : Link.Lg.t -> bool
  val is_mono : Link.Lg.t -> bool
  val is_epi : Link.Lg.t -> bool
  val is_ground : Link.Lg.t -> bool
  val is_guard : Link.Lg.t -> bool
  val max_ports : Link.Lg.t -> int
  val cardinal_ports : Link.Lg.t -> int list
  val closed_edges : Link.Lg.t -> int
  val closed_edges_iso : Link.Lg.t -> Link.Lg.t * Iso.t
  val norm : Link.Lg.t -> Link.Lg.t * Link.Lg.t
  val decomp :
    target:Link.Lg.t ->
    pattern:Link.Lg.t ->
    i_e:Iso.t ->
    i_c:Iso.t -> i_d:Iso.t -> Fun.t -> Link.Lg.t * Link.Lg.t * Link.Lg.t
  val prime_components : Link.Lg.t -> Iso.t list -> Link.Lg.t list
  exception NOT_TOTAL
  val match_edges :
    target:Link.Lg.t ->
    pattern:Link.Lg.t ->
    n_t:Nodes.t ->
    n_p:Nodes.t -> Cnf.clause list * IntSet.t * Cnf.clause list
  val match_ports :
    target:Link.Lg.t ->
    pattern:Link.Lg.t ->
    n_t:Nodes.t -> n_p:Nodes.t -> Cnf.clause list -> Cnf.clause list list
  val match_peers :
    target:Link.Lg.t ->
    pattern:Link.Lg.t ->
    n_t:Nodes.t ->
    n_p:Nodes.t ->
    int * int * Cnf.clause list list * (int * int) list * Cnf.clause list *
    Iso.t * Iso.t
  val match_list_eq :
    Link.Lg.t ->
    Link.Lg.t -> Nodes.t -> Nodes.t -> Cnf.clause list * Cnf.clause list
  val match_ports_eq :
    Link.Lg.t ->
    Link.Lg.t ->
    Nodes.t -> Nodes.t -> Cnf.clause list -> Cnf.clause list list
end