(* * Copyright 2021 Damien Guichard * * Licensed under the EUPL-1.2-or-later *) module type Hierarchy = sig type t val make : string -> t val make_child_of : string -> t -> t val print : t -> unit end module type Graph = sig type concept (* = Hierarchy.t *) type entity = | EntityC of concept (* concept *) | EntityR of concept * string (* concept & referent *) | EntityI of concept * int (* concept & integer *) | EntityF of concept * float (* concept & float *) | EntityS of concept * string (* concept & string *) type role (* = Hierarchy.t *) type label (* = string *) val no_label : label type edge1 = private { mutable r1: role; mutable arg: entity; arg_lab: label; } type edge2 = private { mutable r2: role; mutable src: entity; src_lab: label; mutable dst: entity; dst_lab: label; } type edge3 = private { mutable r3: role; mutable tic: entity; tic_lab: label; mutable tac: entity; tac_lab: label; mutable toe: entity; toe_lab: label; } type edge4 = private { mutable r4: role; mutable ga: entity; ga_lab: label; mutable bu: entity; bu_lab: label; mutable zo: entity; zo_lab: label; mutable meu: entity; meu_lab: label; } val star1 : role -> entity -> label -> edge1 val star2 : role -> entity -> label -> entity -> label -> edge2 val star3 : role -> entity -> label -> entity -> label -> entity -> label -> edge3 val star4 : role -> entity -> label -> entity -> label -> entity -> label -> entity -> label -> edge4 type graph val make : unit -> graph val insert1 : edge1 -> graph -> unit val insert2 : edge2 -> graph -> unit val insert3 : edge3 -> graph -> unit val insert4 : edge4 -> graph -> unit (* vertices *) type vertex = | Vertex | Argument of edge1 | Source of edge2 | Destination of edge2 | Tic of edge3 | Tac of edge3 | Toe of edge3 | Ga of edge4 | Bu of edge4 | Zo of edge4 | Meu of edge4 (* insert roles *) type insert = | Insert0 | Insert1 of edge1 * insert | Insert2 of edge2 * insert | Insert3 of edge3 * insert | Insert4 of edge4 * insert (* insert all *) val insert_all : insert -> graph -> unit (* select roles *) type select = | Select0 | Select1 of edge1 * vertex * select | Select2 of edge2 * vertex * vertex * select | Select3 of edge3 * vertex * vertex * vertex * select | Select4 of edge4 * vertex * vertex * vertex * vertex * select (* select all *) val select_all : (unit -> unit) -> select -> graph -> unit end