GLIB_015

index · ← PRVECT_4 · INTEGR25 →
:: About Graph Sums
::  by Sebastian Koch
::
:: Received November 30, 2021
:: Copyright (c) 2021-2026 Association of Mizar Users
::           (Stowarzyszenie Uzytkownikow Mizara, Bialystok, Poland).
:: This code can be distributed under the GNU General Public Licence
:: version 3.0 or later, or the Creative Commons Attribution-ShareAlike
:: License version 3.0 or later, subject to the binding interpretation
:: detailed in file COPYING.interpretation.
:: See COPYING.GPL and COPYING.CC-BY-SA for the full text of these
:: licenses, or see http://www.gnu.org/licenses/gpl.html and
:: http://creativecommons.org/licenses/by-sa/3.0/.

environ

 vocabularies NUMBERS, FINSET_1, RELAT_1, FUNCT_1, XBOOLE_0, TARSKI, SUBSET_1,
      FINSEQ_1, NAT_1, FUNCT_4, FUNCOP_1, ZFMISC_1, CARD_1, ARYTM_3, CARD_2,
      ORDINAL2, XXREAL_0, PBOOLE, XCMPLX_0, RELAT_2, PARTFUN1, WELLORD1,
      RING_3, FUNCT_2, MCART_1, TREES_1, WAYBEL_0, MOD_4, FUNCT_7, GLIB_015,
      MSUALG_6, EQREL_1, ABIAN, TAXONOM2, GLIB_000, GLIB_001, GLIB_002, CHORD,
      SCMYCIEL, SIMPLEX0, GLIB_009, GLIB_006, GLIB_007, GLIB_010, GLIB_012,
      GLIB_013, GLIB_014;
 notations TARSKI, XBOOLE_0, ENUMSET1, XTUPLE_0, ZFMISC_1, SUBSET_1, RELAT_1,
      FUNCT_1, ORDINAL1, RELSET_1, PARTFUN1, MCART_1, FUNCT_2, DOMAIN_1,
      FUNCT_3, FUNCOP_1, FUNCT_4, ORDINAL2, FINSET_1, CARD_1, PBOOLE, CARD_3,
      NUMBERS, XCMPLX_0, XXREAL_0, NAT_1, CARD_2, FINSEQ_1, EQREL_1, FINSEQ_4,
      FUNCT_7, ABIAN, GLIB_000, TAXONOM2, COMPUT_1, GLIB_001, GLIB_002, CHORD,
      AOFA_I00, GLIB_006, GLIB_007, GLIB_008, GLIB_009, GLIB_010, GLIBPRE0,
      GLIB_012, GLIB_013, GLIB_014, GLIBPRE1;
 constructors DOMAIN_1, FUNCT_4, XXREAL_0, NAT_1, NAT_D, BINOP_2, CARD_2,
      FINSEQ_4, PBOOLE, ORDINAL3, WELLORD2, PARTFUN1, RELSET_1, FUNCT_3,
      FUNCT_7, GLIB_000, GLIB_001, GLIB_002, CHORD, GLIB_007, GLIB_008,
      GLIB_009, GLIB_010, GLIB_012, GLIB_013, GLIB_014, GLIBPRE0, GLIB_006,
      MCART_1, COMPUT_1, EQREL_1, ABIAN, CARD_3, TAXONOM2, AOFA_I00, PARTFUN2,
      ORDINAL1, FINSET_1, QC_LANG1, CQC_LANG, GLIBPRE1;
 registrations XBOOLE_0, SUBSET_1, RELAT_1, FUNCT_1, ORDINAL1, FUNCOP_1,
      FINSET_1, XREAL_0, NAT_1, CARD_1, FINSEQ_1, FINSEQ_4, FUNCT_2, PARTFUN1,
      RELSET_1, FUNCT_3, FUNCT_7, XTUPLE_0, COMPUT_1, INT_1, PRE_POLY,
      GLIB_000, GLIB_002, CHORD, GLIB_008, GLIB_009, GLIB_006, GLIBPRE0,
      GLIB_010, GLIB_012, GLIB_013, GLIB_014, ABIAN, CARD_3, EQREL_1, GLIBPRE1;
 requirements ARITHM, BOOLE, NUMERALS, REAL, SUBSET;
 definitions GLIB_010;
 equalities GLIB_000;
 theorems FUNCOP_1, ORDINAL1, FUNCT_1, TARSKI, RELSET_1, GLIB_010, GLIB_001,
      GLIB_000, PARTFUN1, RELAT_1, XBOOLE_1, FUNCT_2, GLIB_012, GLIB_013,
      GLIB_014, CARD_1, GLIBPRE0, ZFMISC_1, ENUMSET1, XBOOLE_0, FUNCT_3,
      XTUPLE_0, XREGULAR, GLIB_002, GLIB_008, FINSEQ_1, FUNCT_7, GLIB_009,
      COMPUT_1, GLIB_007, FUNCT_4, GLIB_006, MCART_1, DICKSON, TOPGEN_2,
      EQREL_1, CHORD, CARD_2, TAXONOM2, FINSEQ_2, CALCUL_1, GLIBPRE1;
 schemes FUNCT_1, PBOOLE, GLIB_009;

begin :: Replacing Vertices and Edges

Lm1:
  for X, Y being set, f being Function of X, Y
  for V being ManySortedSet of Y, E being one-to-one ManySortedSet of X
  holds V*f*(E") is Function of rng E, rng V
proof
  let X, Y be set, f be Function of X, Y;
  let V being ManySortedSet of Y, E be one-to-one ManySortedSet of X;
  per cases;
  suppose A1: Y <> {};
    rng f c= Y;
    then A2: rng f c= dom V by PARTFUN1:def 2;
    rng(E") = dom E by FUNCT_1:33
      .= X by PARTFUN1:def 2
      .= dom f by A1, PARTFUN1:def 2
      .= dom(V*f) by A2, RELAT_1:27;
    then A3: dom(V*f*(E")) = dom(E") by RELAT_1:27
      .= rng E by FUNCT_1:33;
    A4: rng(V*f*(E")) c= rng(V*f) by RELAT_1:26;
    rng(V*f) c= rng V by RELAT_1:26;
    hence thesis by A3, A4, XBOOLE_1:1, FUNCT_2:2;
  end;
  suppose Y = {};
    then A5: V*f = {} & rng V = {};
    then A6: V*f*(E") = {};
    then dom(V*f*(E")) = {} & rng(V*f*(E")) = {};
    then dom(V*f*(E")) c= rng E & rng(V*f*(E")) c= rng V by XBOOLE_1:2;
    then reconsider g = V*f*(E") as PartFunc of rng E, rng V by RELSET_1:4;
    g is quasi_total by A5, A6, FUNCT_2:def 1;
    hence thesis;
  end;
end;

definition
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  func replaceVerticesEdges(V,E) -> plain _Graph means
  :Def1:
  ex S,T being Function of rng E, rng V
  st S = V*(the_Source_of G)*(E") & T = V*(the_Target_of G)*(E") &
    it = createGraph(rng V,rng E,S,T);
  existence
  proof
    reconsider S = V*(the_Source_of G)*(E") as Function of rng E, rng V by Lm1;
    reconsider T = V*(the_Target_of G)*(E") as Function of rng E, rng V by Lm1;
    take createGraph(rng V,rng E,S,T), S,T;
    thus thesis;
  end;
  uniqueness;
end;

definition
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  func replaceVertices(V) -> plain _Graph equals
  replaceVerticesEdges(V,id the_Edges_of G);
  coherence;
end;

definition
  let G be _Graph, E be one-to-one ManySortedSet of the_Edges_of G;
  func replaceEdges(E) -> plain _Graph equals
  replaceVerticesEdges(id the_Vertices_of G, E);
  coherence;
end;

theorem Th1:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  holds the_Vertices_of replaceVerticesEdges(V,E) = rng V &
    the_Edges_of replaceVerticesEdges(V,E) = rng E &
    the_Source_of replaceVerticesEdges(V,E) = V*(the_Source_of G)*(E") &
    the_Target_of replaceVerticesEdges(V,E) = V*(the_Target_of G)*(E")
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  consider S,T being Function of rng E, rng V such that
    A1: S = V*(the_Source_of G)*(E") & T = V*(the_Target_of G)*(E") and
    A2: replaceVerticesEdges(V,E) = createGraph(rng V,rng E,S,T) by Def1;
  thus thesis by A1, A2;
end;

theorem Th2:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  holds the_Vertices_of replaceVertices(V) = rng V &
    the_Edges_of replaceVertices(V) = the_Edges_of G &
    the_Source_of replaceVertices(V) = V*(the_Source_of G) &
    the_Target_of replaceVertices(V) = V*(the_Target_of G)
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  thus the_Vertices_of replaceVertices(V) = rng V by Th1;
  rng id the_Edges_of G = the_Edges_of G;
  hence the_Edges_of replaceVertices(V) = the_Edges_of G by Th1;
  A1: (id the_Edges_of G)" = id the_Edges_of G by FUNCT_1:45;
  dom(V*(the_Source_of G)) c= the_Edges_of G;
  then V*(the_Source_of G) = V*(the_Source_of G)*((id the_Edges_of G)")
    by A1, RELAT_1:51;
  hence the_Source_of replaceVertices(V) = V*(the_Source_of G) by Th1;
  dom(V*(the_Target_of G)) c= the_Edges_of G;
  then V*(the_Target_of G) = V*(the_Target_of G)*((id the_Edges_of G)")
    by A1, RELAT_1:51;
  hence the_Target_of replaceVertices(V) = V*(the_Target_of G) by Th1;
end;

theorem Th3:
  for G being _Graph
  for E being one-to-one ManySortedSet of the_Edges_of G
  holds the_Vertices_of replaceEdges(E) = the_Vertices_of G &
    the_Edges_of replaceEdges(E) = rng E &
    the_Source_of replaceEdges(E) = (the_Source_of G)*(E") &
    the_Target_of replaceEdges(E) = (the_Target_of G)*(E")
proof
  let G be _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  rng id the_Vertices_of G = the_Vertices_of G;
  hence the_Vertices_of replaceEdges(E) = the_Vertices_of G by Th1;
  thus the_Edges_of replaceEdges(E) = rng E by Th1;
  rng((the_Source_of G)*(E")) c= the_Vertices_of G;
  then (the_Source_of G)*(E")
     = (id the_Vertices_of G)*((the_Source_of G)*(E")) by RELAT_1:53
    .= (id the_Vertices_of G)*(the_Source_of G)*(E") by RELAT_1:36;
  hence the_Source_of replaceEdges(E) = (the_Source_of G)*(E") by Th1;
  rng((the_Target_of G)*(E")) c= the_Vertices_of G;
  then (the_Target_of G)*(E")
     = (id the_Vertices_of G)*((the_Target_of G)*(E")) by RELAT_1:53
    .= (id the_Vertices_of G)*(the_Target_of G)*(E") by RELAT_1:36;
  hence the_Target_of replaceEdges(E) = (the_Target_of G)*(E") by Th1;
end;

theorem Th4:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e DJoins v,w,G
  holds E.e DJoins V.v,V.w,replaceVerticesEdges(V,E)
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  A1: dom V = the_Vertices_of G & dom E = the_Edges_of G by PARTFUN1:def 2;
  let e,v,w be object;
  assume A2: e DJoins v,w,G;
  then A3: e in the_Edges_of G by GLIB_000:def 14;
  then A4: e in dom the_Source_of G & e in dom the_Target_of G
    by FUNCT_2:def 1;
  E.e in rng E by A1, A3, FUNCT_1:3;
  then A5: E.e in dom(E") & E.e in the_Edges_of replaceVerticesEdges(V,E)
    by Th1, FUNCT_1:33;
  A6: V.v = V.((the_Source_of G).e) by A2, GLIB_000:def 14
    .= (V*(the_Source_of G)).e by A4, FUNCT_1:13
    .= (V*(the_Source_of G)).(E".(E.e)) by A1, A3, FUNCT_1:34
    .= (V*(the_Source_of G)*(E")).(E.e) by A5, FUNCT_1:13
    .= (the_Source_of replaceVerticesEdges(V,E)).(E.e) by Th1;
  V.w = V.((the_Target_of G).e) by A2, GLIB_000:def 14
    .= (V*(the_Target_of G)).e by A4, FUNCT_1:13
    .= (V*(the_Target_of G)).(E".(E.e)) by A1, A3, FUNCT_1:34
    .= (V*(the_Target_of G)*(E")).(E.e) by A5, FUNCT_1:13
    .= (the_Target_of replaceVerticesEdges(V,E)).(E.e) by Th1;
  hence E.e DJoins V.v,V.w,replaceVerticesEdges(V,E)
    by A5, A6, GLIB_000:def 14;
end;

theorem Th5:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for e,v,w being object st e DJoins v,w,G
  holds e DJoins V.v,V.w,replaceVertices(V)
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let e,v,w be object;
  assume A1: e DJoins v,w,G;
  (id the_Edges_of G).e DJoins V.v,V.w,replaceVertices(V) by A1, Th4;
  hence thesis by A1, FUNCT_1:18, GLIB_000:def 14;
end;

theorem Th6:
  for G being _Graph, E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e DJoins v,w,G
  holds E.e DJoins v,w,replaceEdges(E)
proof
  let G be _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let e,v,w be object;
  assume A1: e DJoins v,w,G;
  then e Joins v,w,G by GLIB_000:16;
  then A2: v in the_Vertices_of G & w in the_Vertices_of G by GLIB_000:13;
  E.e DJoins (id the_Vertices_of G).v,(id the_Vertices_of G).w,
    replaceEdges(E) by A1, Th4;
  then E.e DJoins v,(id the_Vertices_of G).w,replaceEdges(E) by A2, FUNCT_1:18;
  hence thesis by A2, FUNCT_1:18;
end;

theorem
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e Joins v,w,G
  holds E.e Joins V.v,V.w,replaceVerticesEdges(V,E)
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let e,v,w be object;
  assume e Joins v,w,G;
  then per cases by GLIB_000:16;
  suppose e DJoins v,w,G;
    then E.e DJoins V.v,V.w,replaceVerticesEdges(V,E) by Th4;
    hence thesis by GLIB_000:16;
  end;
  suppose e DJoins w,v,G;
    then E.e DJoins V.w,V.v,replaceVerticesEdges(V,E) by Th4;
    hence thesis by GLIB_000:16;
  end;
end;

theorem
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for e,v,w being object st e Joins v,w,G
  holds e Joins V.v,V.w,replaceVertices(V)
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let e,v,w be object;
  assume e Joins v,w,G;
  then per cases by GLIB_000:16;
  suppose e DJoins v,w,G;
    then e DJoins V.v,V.w,replaceVertices(V) by Th5;
    hence thesis by GLIB_000:16;
  end;
  suppose e DJoins w,v,G;
    then e DJoins V.w,V.v,replaceVertices(V) by Th5;
    hence thesis by GLIB_000:16;
  end;
end;

theorem
  for G being _Graph, E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e Joins v,w,G
  holds E.e Joins v,w,replaceEdges(E)
proof
  let G be _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let e,v,w be object;
  assume e Joins v,w,G;
  then per cases by GLIB_000:16;
  suppose e DJoins v,w,G;
    then E.e DJoins v,w,replaceEdges(E) by Th6;
    hence thesis by GLIB_000:16;
  end;
  suppose e DJoins w,v,G;
    then E.e DJoins w,v,replaceEdges(E) by Th6;
    hence thesis by GLIB_000:16;
  end;
end;

theorem Th10:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e in dom E & v in dom V & w in dom V &
    E.e DJoins V.v,V.w,replaceVerticesEdges(V,E)
  holds e DJoins v,w,G
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let e,v,w be object;
  assume A1: e in dom E & v in dom V & w in dom V;
  then A2: e in the_Edges_of G;
  assume A3: E.e DJoins V.v,V.w,replaceVerticesEdges(V,E);
  E.e in rng E by A1, FUNCT_1:3;
  then A4: E.e in dom(E") by FUNCT_1:33;
  A5: e in dom the_Source_of G & e in dom the_Target_of G by A2, FUNCT_2:def 1;
  (the_Source_of G).e in the_Vertices_of G &
    (the_Target_of G).e in the_Vertices_of G by A1, FUNCT_2:5;
  then A6: (the_Source_of G).e in dom V &
    (the_Target_of G).e in dom V by PARTFUN1:def 2;
  V.v = (the_Source_of replaceVerticesEdges(V,E)).(E.e) by A3, GLIB_000:def 14
    .= (V*(the_Source_of G)*(E")).(E.e) by Th1
    .= (V*(the_Source_of G)).(E".(E.e)) by A4, FUNCT_1:13
    .= (V*(the_Source_of G)).e by A1, FUNCT_1:34
    .= V.((the_Source_of G).e) by A5, FUNCT_1:13;
  then A7: v = (the_Source_of G).e by A1, A6, FUNCT_1:def 4;
  V.w = (the_Target_of replaceVerticesEdges(V,E)).(E.e) by A3, GLIB_000:def 14
    .= (V*(the_Target_of G)*(E")).(E.e) by Th1
    .= (V*(the_Target_of G)).(E".(E.e)) by A4, FUNCT_1:13
    .= (V*(the_Target_of G)).e by A1, FUNCT_1:34
    .= V.((the_Target_of G).e) by A5, FUNCT_1:13;
  then w = (the_Target_of G).e by A1, A6, FUNCT_1:def 4;
  hence e DJoins v,w,G by A1, A7, GLIB_000:def 14;
end;

theorem Th11:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for e,v,w being object
  st v in dom V & w in dom V & e DJoins V.v,V.w,replaceVertices(V)
  holds e DJoins v,w,G
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let e,v,w be object;
  assume A1: v in dom V & w in dom V & e DJoins V.v,V.w,replaceVertices(V);
  then e in the_Edges_of replaceVertices(V) by GLIB_000:def 14;
  then A2: e in the_Edges_of G by Th2;
  then A3: e in dom id the_Edges_of G;
  (id the_Edges_of G).e = e by A2, FUNCT_1:18;
  hence e DJoins v,w,G by A1, A3, Th10;
end;

theorem Th12:
  for G being _Graph, E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e in dom E & E.e DJoins v,w,replaceEdges(E)
  holds e DJoins v,w,G
proof
  let G be _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let e,v,w be object;
  assume A1: e in dom E & E.e DJoins v,w,replaceEdges(E);
  then E.e Joins v,w,replaceEdges(E) by GLIB_000:16;
  then v in the_Vertices_of replaceEdges(E) &
    w in the_Vertices_of replaceEdges(E) by GLIB_000:13;
  then A2: v in the_Vertices_of G & w in the_Vertices_of G by Th3;
  then A3: v in dom id the_Vertices_of G & w in dom id the_Vertices_of G;
  (id the_Vertices_of G).v = v & (id the_Vertices_of G).w = w
    by A2, FUNCT_1:18;
  hence e DJoins v,w,G by A1, A3, Th10;
end;

theorem
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e in dom E & v in dom V & w in dom V &
    E.e Joins V.v,V.w,replaceVerticesEdges(V,E)
  holds e Joins v,w,G
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let e,v,w be object;
  assume A1: e in dom E & v in dom V & w in dom V;
  assume E.e Joins V.v,V.w,replaceVerticesEdges(V,E);
  then per cases by GLIB_000:16;
  suppose E.e DJoins V.v,V.w,replaceVerticesEdges(V,E);
    then e DJoins v,w,G by A1, Th10;
    hence thesis by GLIB_000:16;
  end;
  suppose E.e DJoins V.w,V.v,replaceVerticesEdges(V,E);
    then e DJoins w,v,G by A1, Th10;
    hence thesis by GLIB_000:16;
  end;
end;

theorem
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for e,v,w being object st v in dom V & w in dom V &
    e Joins V.v,V.w,replaceVertices(V)
  holds e Joins v,w,G
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let e,v,w be object;
  assume A1: v in dom V & w in dom V;
  assume e Joins V.v,V.w,replaceVertices(V);
  then per cases by GLIB_000:16;
  suppose e DJoins V.v,V.w,replaceVertices(V);
    then e DJoins v,w,G by A1, Th11;
    hence thesis by GLIB_000:16;
  end;
  suppose e DJoins V.w,V.v,replaceVertices(V);
    then e DJoins w,v,G by A1, Th11;
    hence thesis by GLIB_000:16;
  end;
end;

theorem
  for G being _Graph, E being one-to-one ManySortedSet of the_Edges_of G
  for e,v,w being object st e in dom E & E.e Joins v,w,replaceEdges(E)
  holds e Joins v,w,G
proof
  let G be _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let e,v,w be object;
  assume A1: e in dom E;
  assume E.e Joins v,w,replaceEdges(E);
  then per cases by GLIB_000:16;
  suppose E.e DJoins v,w,replaceEdges(E);
    then e DJoins v,w,G by A1, Th12;
    hence thesis by GLIB_000:16;
  end;
  suppose E.e DJoins w,v,replaceEdges(E);
    then e DJoins w,v,G by A1, Th12;
    hence thesis by GLIB_000:16;
  end;
end;

theorem Th16:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  ex F being PGraphMapping of G, replaceVerticesEdges(V,E)
  st F_V = V & F_E = E & F is Disomorphism
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  the_Vertices_of replaceVerticesEdges(V,E) = rng V &
    the_Vertices_of G = dom V by Th1, PARTFUN1:def 2;
  then reconsider f = V as Function of the_Vertices_of G,
    the_Vertices_of replaceVerticesEdges(V,E) by FUNCT_2:1;
  the_Edges_of replaceVerticesEdges(V,E) = rng E &
    the_Edges_of G = dom E by Th1, PARTFUN1:def 2;
  then reconsider g = E as Function of the_Edges_of G,
    the_Edges_of replaceVerticesEdges(V,E) by FUNCT_2:1;
  :: properties of PGM
  now
    hereby
      let e be object;
      set v = (the_Source_of G).e, w = (the_Target_of G).e;
      assume e in dom g;
      then A1: e Joins v,w,G by GLIB_000:def 13;
      dom f = the_Vertices_of G by PARTFUN1:def 2;
      hence v in dom f & w in dom f by A1, GLIB_000:13;
    end;
    let e,v,w be object;
    assume e in dom g & v in dom f & w in dom f;
    assume e DJoins v,w,G;
    hence g.e DJoins f.v,f.w,replaceVerticesEdges(V,E) by Th4;
  end;
  then reconsider F = [f,g] as
    directed PGraphMapping of G, replaceVerticesEdges(V,E) by GLIB_010:30;
  take F;
  the_Vertices_of G = dom F_V & the_Edges_of G = dom F_E by PARTFUN1:def 2;
  then A2: F is total by GLIB_010:def 11;
  the_Vertices_of replaceVerticesEdges(V,E) = rng F_V &
    the_Edges_of replaceVerticesEdges(V,E) = rng F_E by Th1;
  then A3: F is onto by GLIB_010:def 12;
  F_V is one-to-one & F_E is one-to-one;
  then F is one-to-one by GLIB_010:def 13;
  hence thesis by A2, A3;
end;

theorem Th17:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  holds replaceVerticesEdges(V,E) is G-Disomorphic
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
    A1: F_V = V & F_E = E & F is Disomorphism by Th16;
  thus thesis by A1, GLIB_010:def 24;
end;

:: clusterings (from Disomorphic)

registration
  let G be loopless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> loopless;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:89;
  end;
end;

registration
  let G be loopless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> loopless;
  coherence;
end;

registration
  let G be loopless _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> loopless;
  coherence;
end;

registration
  let G be non loopless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non loopless;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:89;
  end;
end;

registration
  let G be non loopless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non loopless;
  coherence;
end;

registration
  let G be non loopless _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non loopless;
  coherence;
end;

registration
  let G be non-multi _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non-multi;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:89;
  end;
end;

registration
  let G be non-multi _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non-multi;
  coherence;
end;

registration
  let G be non-multi _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non-multi;
  coherence;
end;

registration
  let G be non non-multi _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non non-multi;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:89;
  end;
end;

registration
  let G be non non-multi _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non non-multi;
  coherence;
end;

registration
  let G be non non-multi _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non non-multi;
  coherence;
end;

registration
  let G be non-Dmulti _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non-Dmulti;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:90; :: # TODO correct GLIB_010:90
  end;
end;

registration
  let G be non-Dmulti _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non-Dmulti;
  coherence;
end;

registration
  let G be non-Dmulti _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non-Dmulti;
  coherence;
end;

registration
  let G be non non-Dmulti _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non non-Dmulti;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:90;
  end;
end;

registration
  let G be non non-Dmulti _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non non-Dmulti;
  coherence;
end;

registration
  let G be non non-Dmulti _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non non-Dmulti;
  coherence;
end;

registration
  let G be simple _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> simple;
  coherence;
end;

registration
  let G be simple _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> simple;
  coherence;
end;

registration
  let G be simple _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> simple;
  coherence;
end;

registration
  let G be Dsimple _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> Dsimple;
  coherence;
end;

registration
  let G be Dsimple _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> Dsimple;
  coherence;
end;

registration
  let G be Dsimple _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> Dsimple;
  coherence;
end;

registration
  let G be _trivial _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> _trivial;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:89;
  end;
end;

registration
  let G be _trivial _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> _trivial;
  coherence;
end;

registration
  let G be _trivial _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> _trivial;
  coherence;
end;

registration
  let G be non _trivial _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non _trivial;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:89;
  end;
end;

registration
  let G be non _trivial _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non _trivial;
  coherence;
end;

registration
  let G be non _trivial _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non _trivial;
  coherence;
end;

registration
  let G be vertex-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> vertex-finite;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:15;
  end;
end;

registration
  let G be vertex-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> vertex-finite;
  coherence;
end;

registration
  let G be vertex-finite _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> vertex-finite;
  coherence;
end;

registration
  let G be non vertex-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non vertex-finite;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:15;
  end;
end;

registration
  let G be non vertex-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non vertex-finite;
  coherence;
end;

registration
  let G be non vertex-finite _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non vertex-finite;
  coherence;
end;

registration
  let G be edge-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> edge-finite;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:15;
  end;
end;

registration
  let G be edge-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> edge-finite;
  coherence;
end;

registration
  let G be edge-finite _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> edge-finite;
  coherence;
end;

registration
  let G be non edge-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non edge-finite;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:15;
  end;
end;

registration
  let G be non edge-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non edge-finite;
  coherence;
end;

registration
  let G be non edge-finite _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non edge-finite;
  coherence;
end;

registration
  let G be finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> finite;
  coherence;
end;

registration
  let G be finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> finite;
  coherence;
end;

registration
  let G be finite _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> finite;
  coherence;
end;

registration
  let G be acyclic _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> acyclic;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:140;
  end;
end;

registration
  let G be acyclic _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> acyclic;
  coherence;
end;

registration
  let G be acyclic _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> acyclic;
  coherence;
end;

registration
  let G be non acyclic _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non acyclic;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:140;
  end;
end;

registration
  let G be non acyclic _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non acyclic;
  coherence;
end;

registration
  let G be non acyclic _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non acyclic;
  coherence;
end;

registration
  let G be connected _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> connected;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:140;
  end;
end;

registration
  let G be connected _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> connected;
  coherence;
end;

registration
  let G be connected _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> connected;
  coherence;
end;

registration
  let G be non connected _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non connected;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:140;
  end;
end;

registration
  let G be non connected _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non connected;
  coherence;
end;

registration
  let G be non connected _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non connected;
  coherence;
end;

registration
  let G be Tree-like _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> Tree-like;
  coherence;
end;

registration
  let G be Tree-like _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> Tree-like;
  coherence;
end;

registration
  let G be Tree-like _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> Tree-like;
  coherence;
end;

registration
  let G be chordal _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> chordal;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:140;
  end;
end;

registration
  let G be chordal _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> chordal;
  coherence;
end;

registration
  let G be chordal _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> chordal;
  coherence;
end;

:: clustering for non chordal graphs will be done after existence clustering
:: registration
  :: let G be non chordal _Graph;
  :: let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  :: let E be one-to-one ManySortedSet of the_Edges_of G;
  :: cluster replaceVerticesEdges(V,E) -> non chordal;
  :: coherence;
:: end;
::
:: registration
  :: let G be non chordal _Graph;
  :: let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  :: cluster replaceVertices(V) -> non chordal;
  :: coherence;
:: end;
::
:: registration
  :: let G be non chordal _Graph;
  :: let E be one-to-one ManySortedSet of the_Edges_of G;
  :: cluster replaceEdges(E) -> non chordal;
  :: coherence;
:: end;

registration
  let G be edgeless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> edgeless;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_010:89;
  end;
end;

registration
  let G be edgeless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> edgeless;
  coherence;
end;

registration
  let G be edgeless _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> edgeless;
  coherence;
end;

registration
  let G be non edgeless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non edgeless;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1;
  end;
end;

registration
  let G be non edgeless _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non edgeless;
  coherence;
end;

registration
  let G be non edgeless _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non edgeless;
  coherence;
end;

registration
  let G be loopfull _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> loopfull;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_012:10;
  end;
end;

registration
  let G be loopfull _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> loopfull;
  coherence;
end;

registration
  let G be loopfull _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> loopfull;
  coherence;
end;

registration
  let G be non loopfull _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non loopfull;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_012:10;
  end;
end;

registration
  let G be non loopfull _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non loopfull;
  coherence;
end;

registration
  let G be non loopfull _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non loopfull;
  coherence;
end;

registration
  let G be locally-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> locally-finite;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:34;
  end;
end;

registration
  let G be locally-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> locally-finite;
  coherence;
end;

registration
  let G be locally-finite _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> locally-finite;
  coherence;
end;

registration
  let G be non locally-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> non locally-finite;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:34;
  end;
end;

registration
  let G be non locally-finite _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> non locally-finite;
  coherence;
end;

registration
  let G be non locally-finite _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> non locally-finite;
  coherence;
end;

registration
  let c be non zero Cardinal, G be c-vertex _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> c-vertex;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:22;
  end;
end;

registration
  let c be non zero Cardinal, G be c-vertex _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> c-vertex;
  coherence;
end;

registration
  let c be non zero Cardinal, G be c-vertex _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> c-vertex;
  coherence;
end;

registration
  let c be Cardinal, G be c-edge _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceVerticesEdges(V,E) -> c-edge;
  coherence
  proof
    consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
      A1: F_V = V & F_E = E & F is Disomorphism by Th16;
    thus thesis by A1, GLIB_013:22;
  end;
end;

registration
  let c be Cardinal, G be c-edge _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  cluster replaceVertices(V) -> c-edge;
  coherence;
end;

registration
  let c be Cardinal, G be c-edge _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  cluster replaceEdges(E) -> c-edge;
  coherence;
end;

theorem Th18:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  for W1 being Walk of G ex W2 being Walk of replaceVerticesEdges(V,E)
  st V*(W1.vertexSeq()) = W2.vertexSeq() & E*(W1.edgeSeq()) = W2.edgeSeq()
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
    A1: F_V = V & F_E = E & F is Disomorphism by Th16;
  reconsider F as non empty PGraphMapping of G,replaceVerticesEdges(V,E) by A1;
  let W1 be Walk of G;
  reconsider W1 as F-defined Walk of G by A1, GLIB_010:121;
  take F.:W1;
  thus thesis by A1, GLIB_010:def 37;
end;

theorem
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for W1 being Walk of G ex W2 being Walk of replaceVertices(V)
  st V*(W1.vertexSeq()) = W2.vertexSeq() & W1.edgeSeq() = W2.edgeSeq()
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let W1 be Walk of G;
  consider W2 being Walk of replaceVertices(V) such that
    A1: V*(W1.vertexSeq()) = W2.vertexSeq() and
    A2: (id the_Edges_of G)*(W1.edgeSeq()) = W2.edgeSeq() by Th18;
  take W2;
  rng(W1.edgeSeq()) c= the_Edges_of G;
  hence thesis by A1, A2, RELAT_1:53;
end;

theorem
  for G being _Graph, E being one-to-one ManySortedSet of the_Edges_of G
  for W1 being Walk of G ex W2 being Walk of replaceEdges(E)
  st W1.vertexSeq() = W2.vertexSeq() & E*(W1.edgeSeq()) = W2.edgeSeq()
proof
  let G be _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let W1 be Walk of G;
  consider W2 being Walk of replaceEdges(E) such that
    A1: (id the_Vertices_of G)*(W1.vertexSeq()) = W2.vertexSeq() and
    A2: E*(W1.edgeSeq()) = W2.edgeSeq() by Th18;
  take W2;
  rng(W1.vertexSeq()) c= the_Vertices_of G;
  hence thesis by A1, A2, RELAT_1:53;
end;

theorem Th21:
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for E being one-to-one ManySortedSet of the_Edges_of G
  for W2 being Walk of replaceVerticesEdges(V,E) ex W1 being Walk of G
  st V*(W1.vertexSeq()) = W2.vertexSeq() & E*(W1.edgeSeq()) = W2.edgeSeq()
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  consider F being PGraphMapping of G, replaceVerticesEdges(V,E) such that
    A1: F_V = V & F_E = E & F is Disomorphism by Th16;
  reconsider F as non empty one-to-one PGraphMapping of
    G,replaceVerticesEdges(V,E) by A1;
  let W2 be Walk of replaceVerticesEdges(V,E);
  reconsider W2 as F-valued Walk of replaceVerticesEdges(V,E)
    by A1, GLIB_010:122;
  take F"W2;
  thus thesis by A1, GLIB_010:def 39;
end;

theorem
  for G being _Graph
  for V being non empty one-to-one ManySortedSet of the_Vertices_of G
  for W2 being Walk of replaceVertices(V) ex W1 being Walk of G
  st V*(W1.vertexSeq()) = W2.vertexSeq() & W1.edgeSeq() = W2.edgeSeq()
proof
  let G be _Graph;
  let V be non empty one-to-one ManySortedSet of the_Vertices_of G;
  let W2 be Walk of replaceVertices(V);
  consider W1 being Walk of G such that
    A1: V*(W1.vertexSeq()) = W2.vertexSeq() and
    A2: (id the_Edges_of G)*(W1.edgeSeq()) = W2.edgeSeq() by Th21;
  take W1;
  rng(W1.edgeSeq()) c= the_Edges_of G;
  hence thesis by A1, A2, RELAT_1:53;
end;

theorem
  for G being _Graph, E being one-to-one ManySortedSet of the_Edges_of G
  for W2 being Walk of replaceEdges(E) ex W1 being Walk of G
  st W1.vertexSeq() = W2.vertexSeq() & E*(W1.edgeSeq()) = W2.edgeSeq()
proof
  let G be _Graph;
  let E be one-to-one ManySortedSet of the_Edges_of G;
  let W2 be Walk of replaceEdges(E);
  consider W1 being Walk of G such that
    A1: (id the_Vertices_of G)*(W1.vertexSeq()) = W2.vertexSeq() and
    A2: E*(W1.edgeSeq()) = W2.edgeSeq() by Th21;
  take W1;
  rng(W1.vertexSeq()) c= the_Vertices_of G;
  hence thesis by A1, A2, RELAT_1:53;
end;

begin :: Graph selectors of Graph-yielding Functions

definition
  let F be Graph-yielding Function;
  func the_Vertices_of F -> Function means
  :Def4:
  dom it = dom F &
    for x being object st x in dom F
    ex G being _Graph st G = F.x & it.x = the_Vertices_of G;
  existence
  proof
    defpred P[object,object] means
      ex G being _Graph st G = F.$1 & $2 = the_Vertices_of G;
    A1: for x,y1,y2 being object st x in dom F & P[x,y1] & P[x,y2]
      holds y1 = y2;
    A2: for x being object st x in dom F ex y being object st P[x,y]
    proof
      let x be object;
      assume x in dom F;
      then reconsider G = F.x as _Graph by GLIB_000:def 53;
      take the_Vertices_of G, G;
      thus thesis;
    end;
    consider f being Function such that
      A3: dom f = dom F & for x being object st x in dom F holds P[x,f.x]
      from FUNCT_1:sch 2(A1,A2);
    take f;
    thus thesis by A3;
  end;
  uniqueness
  proof
    let f1, f2 be Function;
    assume that
      A4: dom f1 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f1.x = the_Vertices_of G and
      A5: dom f2 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f2.x = the_Vertices_of G;
    now
      let x be object;
      assume A6: x in dom f1;
      then consider G1 being _Graph such that
        A7: G1 = F.x & f1.x = the_Vertices_of G1 by A4;
      consider G2 being _Graph such that
        A8: G2 = F.x & f2.x = the_Vertices_of G2 by A4, A5, A6;
      thus f1.x = f2.x by A7, A8;
    end;
    hence thesis by A4, A5, FUNCT_1:2;
  end;
  func the_Edges_of F -> Function means
  :Def5:
  dom it = dom F &
    for x being object st x in dom F
    ex G being _Graph st G = F.x & it.x = the_Edges_of G;
  existence
  proof
    defpred P[object,object] means
      ex G being _Graph st G = F.$1 & $2 = the_Edges_of G;
    A9: for x,y1,y2 being object st x in dom F & P[x,y1] & P[x,y2]
      holds y1 = y2;
    A10: for x being object st x in dom F ex y being object st P[x,y]
    proof
      let x be object;
      assume x in dom F;
      then reconsider G = F.x as _Graph by GLIB_000:def 53;
      take the_Edges_of G, G;
      thus thesis;
    end;
    consider f being Function such that
      A11: dom f = dom F & for x being object st x in dom F holds P[x,f.x]
      from FUNCT_1:sch 2(A9,A10);
    take f;
    thus thesis by A11;
  end;
  uniqueness
  proof
    let f1, f2 be Function;
    assume that
      A12: dom f1 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f1.x = the_Edges_of G and
      A13: dom f2 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f2.x = the_Edges_of G;
    now
      let x be object;
      assume A14: x in dom f1;
      then consider G1 being _Graph such that
        A15: G1 = F.x & f1.x = the_Edges_of G1 by A12;
      consider G2 being _Graph such that
        A16: G2 = F.x & f2.x = the_Edges_of G2 by A12, A13, A14;
      thus f1.x = f2.x by A15, A16;
    end;
    hence thesis by A12, A13, FUNCT_1:2;
  end;
  func the_Source_of F -> Function means
  :Def6:
  dom it = dom F &
    for x being object st x in dom F
    ex G being _Graph st G = F.x & it.x = the_Source_of G;
  existence
  proof
    defpred P[object,object] means
      ex G being _Graph st G = F.$1 & $2 = the_Source_of G;
    A17: for x,y1,y2 being object st x in dom F & P[x,y1] & P[x,y2]
      holds y1 = y2;
    A18: for x being object st x in dom F ex y being object st P[x,y]
    proof
      let x be object;
      assume x in dom F;
      then reconsider G = F.x as _Graph by GLIB_000:def 53;
      take the_Source_of G, G;
      thus thesis;
    end;
    consider f being Function such that
      A19: dom f = dom F & for x being object st x in dom F holds P[x,f.x]
      from FUNCT_1:sch 2(A17,A18);
    take f;
    thus thesis by A19;
  end;
  uniqueness
  proof
    let f1, f2 be Function;
    assume that
      A20: dom f1 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f1.x = the_Source_of G and
      A21: dom f2 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f2.x = the_Source_of G;
    now
      let x be object;
      assume A22: x in dom f1;
      then consider G1 being _Graph such that
        A23: G1 = F.x & f1.x = the_Source_of G1 by A20;
      consider G2 being _Graph such that
        A24: G2 = F.x & f2.x = the_Source_of G2 by A20, A21, A22;
      thus f1.x = f2.x by A23, A24;
    end;
    hence thesis by A20, A21, FUNCT_1:2;
  end;
  func the_Target_of F -> Function means
  :Def7:
  dom it = dom F &
    for x being object st x in dom F
    ex G being _Graph st G = F.x & it.x = the_Target_of G;
  existence
  proof
    defpred P[object,object] means
      ex G being _Graph st G = F.$1 & $2 = the_Target_of G;
    A25: for x,y1,y2 being object st x in dom F & P[x,y1] & P[x,y2]
      holds y1 = y2;
    A26: for x being object st x in dom F ex y being object st P[x,y]
    proof
      let x be object;
      assume x in dom F;
      then reconsider G = F.x as _Graph by GLIB_000:def 53;
      take the_Target_of G, G;
      thus thesis;
    end;
    consider f being Function such that
      A27: dom f = dom F & for x being object st x in dom F holds P[x,f.x]
      from FUNCT_1:sch 2(A25,A26);
    take f;
    thus thesis by A27;
  end;
  uniqueness
  proof
    let f1, f2 be Function;
    assume that
      A28: dom f1 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f1.x = the_Target_of G and
      A29: dom f2 = dom F & for x being object st x in dom F
        ex G being _Graph st G = F.x & f2.x = the_Target_of G;
    now
      let x be object;
      assume A30: x in dom f1;
      then consider G1 being _Graph such that
        A31: G1 = F.x & f1.x = the_Target_of G1 by A28;
      consider G2 being _Graph such that
        A32: G2 = F.x & f2.x = the_Target_of G2 by A28, A29, A30;
      thus f1.x = f2.x by A31, A32;
    end;
    hence thesis by A28, A29, FUNCT_1:2;
  end;
end;

registration
  let F be Graph-yielding Function;
  cluster the_Source_of F -> Function-yielding;
  coherence
  proof
    now
      let x be object;
      assume x in dom the_Source_of F;
      then x in dom F by Def6;
      then consider G being _Graph such that
        A1: G = F.x & (the_Source_of F).x = the_Source_of G by Def6;
      thus (the_Source_of F).x is Function by A1;
    end;
    hence thesis by FUNCOP_1:def 6;
  end;
  cluster the_Target_of F -> Function-yielding;
  coherence
  proof
    now
      let x be object;
      assume x in dom the_Target_of F;
      then x in dom F by Def7;
      then consider G being _Graph such that
        A2: G = F.x & (the_Target_of F).x = the_Target_of G by Def7;
      thus (the_Target_of F).x is Function by A2;
    end;
    hence thesis by FUNCOP_1:def 6;
  end;
end;

registration
  let F be empty Graph-yielding Function;
  cluster the_Vertices_of F -> empty;
  coherence
  proof
    dom F = dom the_Vertices_of F by Def4;
    hence thesis;
  end;
  cluster the_Edges_of F -> empty;
  coherence
  proof
    dom F = dom the_Edges_of F by Def5;
    hence thesis;
  end;
  cluster the_Source_of F -> empty;
  coherence
  proof
    dom F = dom the_Source_of F by Def6;
    hence thesis;
  end;
  cluster the_Target_of F -> empty;
  coherence
  proof
    dom F = dom the_Target_of F by Def7;
    hence thesis;
  end;
end;

registration
  let F be non empty Graph-yielding Function;
  cluster the_Vertices_of F -> non empty;
  coherence
  proof
    dom F = dom the_Vertices_of F by Def4;
    hence thesis;
  end;
  cluster the_Edges_of F -> non empty;
  coherence
  proof
    dom F = dom the_Edges_of F by Def5;
    hence thesis;
  end;
  cluster the_Source_of F -> non empty;
  coherence
  proof
    dom F = dom the_Source_of F by Def6;
    hence thesis;
  end;
  cluster the_Target_of F -> non empty;
  coherence
  proof
    dom F = dom the_Target_of F by Def7;
    hence thesis;
  end;
end;

registration
  let F be Graph-yielding Function;
  cluster the_Vertices_of F -> non-empty;
  coherence
  proof
    now
      let x be object;
      assume x in dom the_Vertices_of F;
      then x in dom F by Def4;
      then consider G being _Graph such that
        A1: G = F.x & (the_Vertices_of F).x = the_Vertices_of G by Def4;
      thus (the_Vertices_of F).x is non empty by A1;
    end;
    hence thesis by FUNCT_1:def 9;
  end;
end;

definition
  let F be non empty Graph-yielding Function;
  redefine func the_Vertices_of F means  :: redefines the_Vertices_of (GLIB_015, definition)
  :Def8:
  dom it = dom F &
    for x being Element of dom F holds it.x = the_Vertices_of (F.x);
  compatibility
  proof
    let f be Function;
    hereby
      assume A1: f = the_Vertices_of F;
      hence dom f = dom F by Def4;
      let x be Element of dom F;
      consider G being _Graph such that
        A2: G = F.x & f.x = the_Vertices_of G by A1, Def4;
      thus f.x = the_Vertices_of(F.x) by A2;
    end;
    assume A3: dom f = dom F &
      for x being Element of dom F holds f.x = the_Vertices_of (F.x);
    now
      let x be object;
      assume x in dom F;
      then reconsider x0 = x as Element of dom F;
      reconsider G = F.x0 as _Graph;
      take G;
      thus G = F.x & f.x = the_Vertices_of G by A3;
    end;
    hence thesis by A3, Def4;
  end;
  redefine func the_Edges_of F means  :: redefines the_Edges_of (GLIB_015, definition)
  :Def9:
  dom it = dom F &
    for x being Element of dom F holds it.x = the_Edges_of (F.x);
  compatibility
  proof
    let f be Function;
    hereby
      assume A4: f = the_Edges_of F;
      hence dom f = dom F by Def5;
      let x be Element of dom F;
      consider G being _Graph such that
        A5: G = F.x & f.x = the_Edges_of G by A4, Def5;
      thus f.x = the_Edges_of(F.x) by A5;
    end;
    assume A6: dom f = dom F &
      for x being Element of dom F holds f.x = the_Edges_of (F.x);
    now
      let x be object;
      assume x in dom F;
      then reconsider x0 = x as Element of dom F;
      reconsider G = F.x0 as _Graph;
      take G;
      thus G = F.x & f.x = the_Edges_of G by A6;
    end;
    hence thesis by A6, Def5;
  end;
  redefine func the_Source_of F means  :: redefines the_Source_of (GLIB_015, definition)
  dom it = dom F &
    for x being Element of dom F holds it.x = the_Source_of (F.x);
  compatibility
  proof
    let f be Function;
    hereby
      assume A7: f = the_Source_of F;
      hence dom f = dom F by Def6;
      let x be Element of dom F;
      consider G being _Graph such that
        A8: G = F.x & f.x = the_Source_of G by A7, Def6;
      thus f.x = the_Source_of(F.x) by A8;
    end;
    assume A9: dom f = dom F &
      for x being Element of dom F holds f.x = the_Source_of (F.x);
    now
      let x be object;
      assume x in dom F;
      then reconsider x0 = x as Element of dom F;
      reconsider G = F.x0 as _Graph;
      take G;
      thus G = F.x & f.x = the_Source_of G by A9;
    end;
    hence thesis by A9, Def6;
  end;
  redefine func the_Target_of F means  :: redefines the_Target_of (GLIB_015, definition)
  dom it = dom F &
    for x being Element of dom F holds it.x = the_Target_of (F.x);
  compatibility
  proof
    let f be Function;
    hereby
      assume A10: f = the_Target_of F;
      hence dom f = dom F by Def7;
      let x be Element of dom F;
      consider G being _Graph such that
        A11: G = F.x & f.x = the_Target_of G by A10, Def7;
      thus f.x = the_Target_of(F.x) by A11;
    end;
    assume A12: dom f = dom F &
      for x being Element of dom F holds f.x = the_Target_of (F.x);
    now
      let x be object;
      assume x in dom F;
      then reconsider x0 = x as Element of dom F;
      reconsider G = F.x0 as _Graph;
      take G;
      thus G = F.x & f.x = the_Target_of G by A12;
    end;
    hence thesis by A12, Def7;
  end;
end;

theorem
  for F being Graph-yielding Function
  holds the_Vertices_of rng F = rng the_Vertices_of F
proof
  let F be Graph-yielding Function;
  now
    let z be object;
    hereby
      assume z in the_Vertices_of rng F;
      then consider G1 being _Graph such that
        A1: G1 in rng F & z = the_Vertices_of G1 by GLIB_014:def 14;
      consider x being object such that
        A2: x in dom F & G1 = F.x by A1, FUNCT_1:def 3;
      consider G2 being _Graph such that
        A3: G2 = F.x & (the_Vertices_of F).x = the_Vertices_of G2 by A2, Def4;
      x in dom the_Vertices_of F by A2, Def4;
      hence z in rng the_Vertices_of F by A1, A2, A3, FUNCT_1:3;
    end;
    assume z in rng the_Vertices_of F;
    then consider x being object such that
      A4: x in dom the_Vertices_of F & z = (the_Vertices_of F).x
      by FUNCT_1:def 3;
    A5: x in dom F by A4, Def4;
    then consider G1 being _Graph such that
      A6: G1 = F.x & (the_Vertices_of F).x = the_Vertices_of G1 by Def4;
    G1 in rng F by A5, A6, FUNCT_1:3;
    hence z in the_Vertices_of rng F by A4, A6, GLIB_014:def 14;
  end;
  hence thesis by TARSKI:2;
end;

theorem
  for F being Graph-yielding Function
  holds the_Edges_of rng F = rng the_Edges_of F
proof
  let F be Graph-yielding Function;
  now
    let z be object;
    hereby
      assume z in the_Edges_of rng F;
      then consider G1 being _Graph such that
        A1: G1 in rng F & z = the_Edges_of G1 by GLIB_014:def 15;
      consider x being object such that
        A2: x in dom F & G1 = F.x by A1, FUNCT_1:def 3;
      consider G2 being _Graph such that
        A3: G2 = F.x & (the_Edges_of F).x = the_Edges_of G2 by A2, Def5;
      x in dom the_Edges_of F by A2, Def5;
      hence z in rng the_Edges_of F by A1, A2, A3, FUNCT_1:3;
    end;
    assume z in rng the_Edges_of F;
    then consider x being object such that
      A4: x in dom the_Edges_of F & z = (the_Edges_of F).x
      by FUNCT_1:def 3;
    A5: x in dom F by A4, Def5;
    then consider G1 being _Graph such that
      A6: G1 = F.x & (the_Edges_of F).x = the_Edges_of G1 by Def5;
    G1 in rng F by A5, A6, FUNCT_1:3;
    hence z in the_Edges_of rng F by A4, A6, GLIB_014:def 15;
  end;
  hence thesis by TARSKI:2;
end;

theorem
  for F being Graph-yielding Function
  holds the_Source_of rng F = rng the_Source_of F
proof
  let F be Graph-yielding Function;
  now
    let z be object;
    hereby
      assume z in the_Source_of rng F;
      then consider G1 being _Graph such that
        A1: G1 in rng F & z = the_Source_of G1 by GLIB_014:def 16;
      consider x being object such that
        A2: x in dom F & G1 = F.x by A1, FUNCT_1:def 3;
      consider G2 being _Graph such that
        A3: G2 = F.x & (the_Source_of F).x = the_Source_of G2 by A2, Def6;
      x in dom the_Source_of F by A2, Def6;
      hence z in rng the_Source_of F by A1, A2, A3, FUNCT_1:3;
    end;
    assume z in rng the_Source_of F;
    then consider x being object such that
      A4: x in dom the_Source_of F & z = (the_Source_of F).x
      by FUNCT_1:def 3;
    A5: x in dom F by A4, Def6;
    then consider G1 being _Graph such that
      A6: G1 = F.x & (the_Source_of F).x = the_Source_of G1 by Def6;
    G1 in rng F by A5, A6, FUNCT_1:3;
    hence z in the_Source_of rng F by A4, A6, GLIB_014:def 16;
  end;
  hence thesis by TARSKI:2;
end;

theorem
  for F being Graph-yielding Function
  holds the_Target_of rng F = rng the_Target_of F
proof
  let F be Graph-yielding Function;
  now
    let z be object;
    hereby
      assume z in the_Target_of rng F;
      then consider G1 being _Graph such that
        A1: G1 in rng F & z = the_Target_of G1 by GLIB_014:def 17;
      consider x being object such that
        A2: x in dom F & G1 = F.x by A1, FUNCT_1:def 3;
      consider G2 being _Graph such that
        A3: G2 = F.x & (the_Target_of F).x = the_Target_of G2 by A2, Def7;
      x in dom the_Target_of F by A2, Def7;
      hence z in rng the_Target_of F by A1, A2, A3, FUNCT_1:3;
    end;
    assume z in rng the_Target_of F;
    then consider x being object such that
      A4: x in dom the_Target_of F & z = (the_Target_of F).x
      by FUNCT_1:def 3;
    A5: x in dom F by A4, Def7;
    then consider G1 being _Graph such that
      A6: G1 = F.x & (the_Target_of F).x = the_Target_of G1 by Def7;
    G1 in rng F by A5, A6, FUNCT_1:3;
    hence z in the_Target_of rng F by A4, A6, GLIB_014:def 17;
  end;
  hence thesis by TARSKI:2;
end;

begin :: Isomorphisms between Graph-membered Sets or Graph-yielding Functions

definition
  let S1, S2 be Graph-membered set;
  pred S1, S2 are_Disomorphic means
  ex f being one-to-one Function st dom f = S1 & rng f = S2 &
    for G being _Graph st G in S1 holds f.G is G-Disomorphic _Graph;
  reflexivity
  proof
    let S be Graph-membered set;
    take id S;
    thus dom id S = S & rng id S = S;
    let G be _Graph;
    assume G in S;
    then (id S).G = G by FUNCT_1:18;
    hence thesis by GLIB_010:53;
  end;
  symmetry
  proof
    let S1, S2 be Graph-membered set;
    given f being one-to-one Function such that
      A1: dom f = S1 & rng f = S2 and
      A2: for G being _Graph st G in S1 holds f.G is G-Disomorphic _Graph;
    take f";
    thus dom(f") = S2 & rng(f") = S1 by A1, FUNCT_1:33;
    let G be _Graph;
    assume G in S2;
    then consider G0 being object such that
      A3: G0 in dom f & f.G0 = G by A1, FUNCT_1:def 3;
    reconsider G0 as _Graph by A1, A3;
    G is G0-Disomorphic by A1, A2, A3;
    then G0 is G-Disomorphic by GLIB_010:96;
    hence thesis by A3, FUNCT_1:34;
  end;
  pred S1, S2 are_isomorphic means
  ex f being one-to-one Function st dom f = S1 & rng f = S2 &
    for G being _Graph st G in S1 holds f.G is G-isomorphic _Graph;
  reflexivity
  proof
    let S be Graph-membered set;
    take id S;
    thus dom id S = S & rng id S = S;
    let G be _Graph;
    assume G in S;
    then (id S).G = G by FUNCT_1:18;
    hence thesis by GLIB_010:53;
  end;
  symmetry
  proof
    let S1, S2 be Graph-membered set;
    given f being one-to-one Function such that
      A4: dom f = S1 & rng f = S2 and
      A5: for G being _Graph st G in S1 holds f.G is G-isomorphic _Graph;
    take f";
    thus dom(f") = S2 & rng(f") = S1 by A4, FUNCT_1:33;
    let G be _Graph;
    assume G in S2;
    then consider G0 being object such that
      A6: G0 in dom f & f.G0 = G by A4, FUNCT_1:def 3;
    reconsider G0 as _Graph by A4, A6;
    G is G0-isomorphic by A4, A5, A6;
    then G0 is G-isomorphic by GLIB_010:95;
    hence thesis by A6, FUNCT_1:34;
  end;
end;

theorem
  for S1, S2, S3 being Graph-membered set
  st S1, S2 are_Disomorphic & S2, S3 are_Disomorphic
  holds S1, S3 are_Disomorphic
proof
  let S1, S2, S3 be Graph-membered set;
  assume S1, S2 are_Disomorphic;
  then consider f being one-to-one Function such that
    A1: dom f = S1 & rng f = S2 and
    A2: for G being _Graph st G in S1 holds f.G is G-Disomorphic _Graph;
  assume S2, S3 are_Disomorphic;
  then consider g being one-to-one Function such that
    A3: dom g = S2 & rng g = S3 and
    A4: for G being _Graph st G in S2 holds g.G is G-Disomorphic _Graph;
  take g*f;
  thus dom(g*f) = S1 by A1, A3, RELAT_1:27;
  thus rng(g*f) = S3 by A1, A3, RELAT_1:28;
  let G be _Graph;
  assume A5: G in S1;
  then reconsider G9 = f.G as G-Disomorphic _Graph by A2;
  G9 in rng f by A1, A5, FUNCT_1:def 3;
  then g.G9 is G9-Disomorphic _Graph by A1, A4;
  hence thesis by A1, A5, FUNCT_1:13;
end;

theorem
  for S1, S2, S3 being Graph-membered set
  st S1, S2 are_isomorphic & S2, S3 are_isomorphic
  holds S1, S3 are_isomorphic
proof
  let S1, S2, S3 be Graph-membered set;
  assume S1, S2 are_isomorphic;
  then consider f being one-to-one Function such that
    A1: dom f = S1 & rng f = S2 and
    A2: for G being _Graph st G in S1 holds f.G is G-isomorphic _Graph;
  assume S2, S3 are_isomorphic;
  then consider g being one-to-one Function such that
    A3: dom g = S2 & rng g = S3 and
    A4: for G being _Graph st G in S2 holds g.G is G-isomorphic _Graph;
  take g*f;
  thus dom(g*f) = S1 by A1, A3, RELAT_1:27;
  thus rng(g*f) = S3 by A1, A3, RELAT_1:28;
  let G be _Graph;
  assume A5: G in S1;
  then reconsider G9 = f.G as G-isomorphic _Graph by A2;
  G9 in rng f by A1, A5, FUNCT_1:def 3;
  then g.G9 is G9-isomorphic _Graph by A1, A4;
  hence thesis by A1, A5, FUNCT_1:13;
end;

theorem
  for S1, S2 being Graph-membered set st S1, S2 are_Disomorphic
  holds S1, S2 are_isomorphic
proof
  let S1, S2 be Graph-membered set;
  assume S1, S2 are_Disomorphic;
  then consider f being one-to-one Function such that
    A1: dom f = S1 & rng f = S2 and
    A2: for G being _Graph st G in S1 holds f.G is G-Disomorphic _Graph;
  take f;
  thus thesis by A1, A2;
end;

theorem
  for S1, S2 being Graph-membered set st S1, S2 are_Disomorphic
  holds card S1 = card S2 by CARD_1:70;

theorem
  for S1, S2 being Graph-membered set st S1, S2 are_isomorphic
  holds card S1 = card S2 by CARD_1:70;

theorem
  for S1, S2 being empty Graph-membered set holds S1, S2 are_Disomorphic;

theorem
  for G1, G2 being _Graph
  holds {G1}, {G2} are_Disomorphic iff G2 is G1-Disomorphic
proof
  let G1, G2 be _Graph;
  hereby
    assume {G1}, {G2} are_Disomorphic;
    then consider f being one-to-one Function such that
      A1: dom f = {G1} & rng f = {G2} and
      A2: for G being _Graph st G in {G1} holds f.G is G-Disomorphic _Graph;
    A3: f = {G1} --> G2 by A1, FUNCOP_1:9;
    G1 in {G1} by TARSKI:def 1;
    then f.G1 is G1-Disomorphic _Graph & f.G1 = G2 by A2, A3, FUNCOP_1:7;
    hence G2 is G1-Disomorphic;
  end;
  assume A4: G2 is G1-Disomorphic;
  reconsider f = G1 .--> G2 as one-to-one Function;
  take f;
  f = {G1} --> G2 by FUNCOP_1:def 9;
  hence dom f = {G1} & rng f = {G2} by FUNCOP_1:8;
  let G be _Graph;
  assume G in {G1};
  then G = G1 by TARSKI:def 1;
  hence f.G is G-Disomorphic _Graph by A4, FUNCOP_1:72;
end;

theorem
  for G1, G2 being _Graph
  holds {G1}, {G2} are_isomorphic iff G2 is G1-isomorphic
proof
  let G1, G2 be _Graph;
  hereby
    assume {G1}, {G2} are_isomorphic;
    then consider f being one-to-one Function such that
      A1: dom f = {G1} & rng f = {G2} and
      A2: for G being _Graph st G in {G1} holds f.G is G-isomorphic _Graph;
    A3: f = {G1} --> G2 by A1, FUNCOP_1:9;
    G1 in {G1} by TARSKI:def 1;
    then f.G1 is G1-isomorphic _Graph & f.G1 = G2 by A2, A3, FUNCOP_1:7;
    hence G2 is G1-isomorphic;
  end;
  assume A4: G2 is G1-isomorphic;
  reconsider f = G1 .--> G2 as one-to-one Function;
  take f;
  f = {G1} --> G2 by FUNCOP_1:def 9;
  hence dom f = {G1} & rng f = {G2} by FUNCOP_1:8;
  let G be _Graph;
  assume G in {G1};
  then G = G1 by TARSKI:def 1;
  hence f.G is G-isomorphic _Graph by A4, FUNCOP_1:72;
end;

theorem
  for S1, S2 being Graph-membered set st S1,S2 are_isomorphic holds
    (S1 is empty implies S2 is empty) &
    (S1 is loopless implies S2 is loopless) &
    (S1 is non-multi implies S2 is non-multi) &
    (S1 is simple implies S2 is simple) &
    (S1 is acyclic implies S2 is acyclic) &
    (S1 is connected implies S2 is connected) &
    (S1 is Tree-like implies S2 is Tree-like) &
    (S1 is chordal implies S2 is chordal) &
    (S1 is edgeless implies S2 is edgeless) &
    (S1 is loopfull implies S2 is loopfull)
proof
  let S1, S2 be Graph-membered set;
  assume S1,S2 are_isomorphic;
  then consider f being one-to-one Function such that
    A1: dom f = S1 & rng f = S2 and
    A2: for G being _Graph st G in S1 holds f.G is G-isomorphic _Graph;
  hereby
    assume S1 is empty;
    then f = {}  by A1;
    hence S2 is empty by A1;
  end;
  hereby
    assume A3: S1 is loopless;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A4: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A4;
      G2 is G1-isomorphic by A1, A2, A4;
      then consider G being PGraphMapping of G1, G2 such that
        A5: G is isomorphism by GLIB_010:def 23;
      thus G2 is loopless by A1, A3, A4, A5, GLIB_010:89;
    end;
    hence S2 is loopless by GLIB_014:def 3;
  end;
  hereby
    assume A6: S1 is non-multi;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A7: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A7;
      G2 is G1-isomorphic by A1, A2, A7;
      then consider G being PGraphMapping of G1, G2 such that
        A8: G is isomorphism by GLIB_010:def 23;
      thus G2 is non-multi by A1, A6, A7, A8, GLIB_010:89;
    end;
    hence S2 is non-multi by GLIB_014:def 4;
  end;
  hereby
    assume A9: S1 is simple;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A10: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A10;
      G2 is G1-isomorphic by A1, A2, A10;
      then consider G being PGraphMapping of G1, G2 such that
        A11: G is isomorphism by GLIB_010:def 23;
      thus G2 is simple by A1, A9, A10, A11, GLIB_010:89;
    end;
    hence S2 is simple by GLIB_014:def 6;
  end;
  hereby
    assume A12: S1 is acyclic;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A13: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A13;
      G2 is G1-isomorphic by A1, A2, A13;
      then consider G being PGraphMapping of G1, G2 such that
        A14: G is isomorphism by GLIB_010:def 23;
      thus G2 is acyclic by A1, A12, A13, A14, GLIB_010:140;
    end;
    hence S2 is acyclic by GLIB_014:def 8;
  end;
  hereby
    assume A15: S1 is connected;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A16: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A16;
      G2 is G1-isomorphic by A1, A2, A16;
      then consider G being PGraphMapping of G1, G2 such that
        A17: G is isomorphism by GLIB_010:def 23;
      thus G2 is connected by A1, A15, A16, A17, GLIB_010:140;
    end;
    hence S2 is connected by GLIB_014:def 9;
  end;
  hereby
    assume A18: S1 is Tree-like;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A19: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A19;
      G2 is G1-isomorphic by A1, A2, A19;
      then consider G being PGraphMapping of G1, G2 such that
        A20: G is isomorphism by GLIB_010:def 23;
      G2 is connected acyclic by A1, A18, A19, A20, GLIB_010:140;
      hence G2 is Tree-like;
    end;
    hence S2 is Tree-like by GLIB_014:def 10;
  end;
  hereby
    assume A21: S1 is chordal;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A22: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A22;
      G2 is G1-isomorphic by A1, A2, A22;
      then consider G being PGraphMapping of G1, G2 such that
        A23: G is isomorphism by GLIB_010:def 23;
      thus G2 is chordal by A1, A21, A22, A23, GLIB_010:140;
    end;
    hence S2 is chordal by GLIB_014:def 11;
  end;
  hereby
    assume A24: S1 is edgeless;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A25: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A25;
      G2 is G1-isomorphic by A1, A2, A25;
      then consider G being PGraphMapping of G1, G2 such that
        A26: G is isomorphism by GLIB_010:def 23;
      thus G2 is edgeless by A1, A24, A25, A26, GLIB_010:89;
    end;
    hence S2 is edgeless by GLIB_014:def 12;
  end;
  hereby
    assume A27: S1 is loopfull;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A28: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A28;
      G2 is G1-isomorphic by A1, A2, A28;
      then consider G being PGraphMapping of G1, G2 such that
        A29: G is isomorphism by GLIB_010:def 23;
      thus G2 is loopfull by A1, A27, A28, A29, GLIB_012:10;
    end;
    hence S2 is loopfull by GLIB_014:def 13;
  end;
end;

theorem
  for S1, S2 being Graph-membered set st S1,S2 are_Disomorphic holds
    (S1 is non-Dmulti implies S2 is non-Dmulti) &
    (S1 is Dsimple implies S2 is Dsimple)
proof
  let S1, S2 be Graph-membered set;
  assume S1,S2 are_Disomorphic;
  then consider f being one-to-one Function such that
    A1: dom f = S1 & rng f = S2 and
    A2: for G being _Graph st G in S1 holds f.G is G-Disomorphic _Graph;
  hereby
    assume A3: S1 is non-Dmulti;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A4: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A4;
      G2 is G1-Disomorphic by A1, A2, A4;
      then consider G being PGraphMapping of G1, G2 such that
        A5: G is Disomorphism by GLIB_010:def 24;
      thus G2 is non-Dmulti by A1, A3, A4, A5, GLIB_010:90;
    end;
    hence S2 is non-Dmulti by GLIB_014:def 5;
  end;
  hereby
    assume A6: S1 is Dsimple;
    now
      let G2 be _Graph;
      assume G2 in S2;
      then consider G1 being object such that
        A7: G1 in dom f & f.G1 = G2 by A1, FUNCT_1:def 3;
      reconsider G1 as _Graph by A1, A7;
      G2 is G1-Disomorphic by A1, A2, A7;
      then consider G being PGraphMapping of G1, G2 such that
        A8: G is Disomorphism by GLIB_010:def 24;
      thus G2 is Dsimple by A1, A6, A7, A8, GLIB_010:90;
    end;
    hence S2 is Dsimple by GLIB_014:def 7;
  end;
end;

definition
  let F1, F2 being Graph-yielding Function;
  pred F1, F2 are_Disomorphic means
  ex p being one-to-one Function st dom p = dom F1 & rng p = dom F2 &
    for x being object st x in dom F1
    ex G1, G2 being _Graph st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
  reflexivity
  proof
    let F be Graph-yielding Function;
    reconsider p = id dom F as one-to-one Function;
    take p;
    thus dom p = dom F & rng p = dom F;
    let x be object;
    assume A1: x in dom F;
    then reconsider G = F.x as _Graph by GLIB_000:def 53;
    take G,G;
    thus G = F.x;
    thus G = F.(p.x) by A1, FUNCT_1:18;
    thus G is G-Disomorphic by GLIB_010:53;
  end;
  symmetry
  proof
    let F1, F2 be Graph-yielding Function;
    given p being one-to-one Function such that
      A2: dom p = dom F1 & rng p = dom F2 and
      A3: for x being object st x in dom F1 ex G1, G2 being _Graph
        st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
    take p";
    thus dom(p") = dom F2 & rng(p") = dom F1 by A2, FUNCT_1:33;
    let y be object;
    assume y in dom F2;
    then consider x being object such that
      A4: x in dom p & p.x = y by A2, FUNCT_1:def 3;
    consider G1, G2 being _Graph such that
      A5: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic by A2, A3, A4;
    take G2, G1;
    thus G2 = F2.y by A4, A5;
    thus G1 = F1.(p".y) by A4, A5, FUNCT_1:34;
    thus G1 is G2-Disomorphic by A5, GLIB_010:96;
  end;
  pred F1, F2 are_isomorphic means
  ex p being one-to-one Function st dom p = dom F1 & rng p = dom F2 &
    for x being object st x in dom F1
    ex G1, G2 being _Graph st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
  reflexivity
  proof
    let F be Graph-yielding Function;
    reconsider p = id dom F as one-to-one Function;
    take p;
    thus dom p = dom F & rng p = dom F;
    let x be object;
    assume A6: x in dom F;
    then reconsider G = F.x as _Graph by GLIB_000:def 53;
    take G,G;
    thus G = F.x;
    thus G = F.(p.x) by A6, FUNCT_1:18;
    thus G is G-isomorphic by GLIB_010:53;
  end;
  symmetry
  proof
    let F1, F2 be Graph-yielding Function;
    given p being one-to-one Function such that
      A7: dom p = dom F1 & rng p = dom F2 and
      A8: for x being object st x in dom F1 ex G1, G2 being _Graph
        st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
    take p";
    thus dom(p") = dom F2 & rng(p") = dom F1 by A7, FUNCT_1:33;
    let y be object;
    assume y in dom F2;
    then consider x being object such that
      A9: x in dom p & p.x = y by A7, FUNCT_1:def 3;
    consider G1, G2 being _Graph such that
      A10: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic by A7, A8, A9;
    take G2, G1;
    thus G2 = F2.y by A9, A10;
    thus G1 = F1.(p".y) by A9, A10, FUNCT_1:34;
    thus G1 is G2-isomorphic by A10, GLIB_010:95;
  end;
end;

theorem Th38:
  for F1, F2 being non empty Graph-yielding Function st dom F1 = dom F2 &
    for x1 being Element of dom F1, x2 being Element of dom F2 st x1 = x2
    holds F2.x2 is F1.x1-Disomorphic
  holds F1, F2 are_Disomorphic
proof
  let F1, F2 be non empty Graph-yielding Function;
  assume A1: dom F1 = dom F2;
  assume A2: for x1 being Element of dom F1, x2 being Element of dom F2
    st x1 = x2 holds F2.x2 is F1.x1-Disomorphic;
  reconsider p = id dom F1 as one-to-one Function;
  take p;
  thus dom p = dom F1 & rng p = dom F2 by A1;
  let x be object;
  assume A3: x in dom F1;
  then reconsider G1 = F1.x as _Graph;
  reconsider G2 = F2.x as _Graph by A1, A3;
  take G1, G2;
  thus G1 = F1.x & G2 = F2.(p.x) by A3, FUNCT_1:18;
  thus G2 is G1-Disomorphic by A1, A2, A3;
end;

theorem
  for F1, F2 being non empty Graph-yielding Function st dom F1 = dom F2 &
    for x1 being Element of dom F1, x2 being Element of dom F2 st x1 = x2
    holds F2.x2 is F1.x1-isomorphic
  holds F1, F2 are_isomorphic
proof
  let F1, F2 be non empty Graph-yielding Function;
  assume A1: dom F1 = dom F2;
  assume A2: for x1 being Element of dom F1, x2 being Element of dom F2
    st x1 = x2 holds F2.x2 is F1.x1-isomorphic;
  reconsider p = id dom F1 as one-to-one Function;
  take p;
  thus dom p = dom F1 & rng p = dom F2 by A1;
  let x be object;
  assume A3: x in dom F1;
  then reconsider G1 = F1.x as _Graph;
  reconsider G2 = F2.x as _Graph by A1, A3;
  take G1, G2;
  thus G1 = F1.x & G2 = F2.(p.x) by A3, FUNCT_1:18;
  thus G2 is G1-isomorphic by A1, A2, A3;
end;

theorem Th40:
  for F1, F2, F3 being Graph-yielding Function
  st F1, F2 are_Disomorphic & F2, F3 are_Disomorphic
  holds F1, F3 are_Disomorphic
proof
  let F1, F2, F3 be Graph-yielding Function;
  assume F1, F2 are_Disomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    A2: for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
  assume F2, F3 are_Disomorphic;
  then consider q being one-to-one Function such that
    A3: dom q = dom F2 & rng q = dom F3 and
    A4: for x being object st x in dom F2 ex G2, G3 being _Graph
      st G2 = F2.x & G3 = F3.(q.x) & G3 is G2-Disomorphic;
  take q*p;
  dom(q*p) = dom p & rng(q*p) = rng q by A1, A3, RELAT_1:27, RELAT_1:28;
  hence A5: dom(q*p) = dom F1 & rng(q*p) = dom F3 by A1, A3;
  let x be object;
  assume x in dom F1;
  then A6: x in dom p & p.x in dom q by A5, FUNCT_1:11;
  then consider G1, G2 be _Graph such that
    A7: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic by A1, A2;
  consider G9,G3 being _Graph such that
    A8: G9 = F2.(p.x) & G3 = F3.(q.(p.x)) & G3 is G9-Disomorphic by A3, A4, A6;
  take G1, G3;
  thus G1 = F1.x by A7;
  thus G3 = F3.((q*p).x) by A6, A8, FUNCT_1:13;
  thus thesis by A7, A8;
end;

theorem Th41:
  for F1, F2, F3 being Graph-yielding Function
  st F1, F2 are_isomorphic & F2, F3 are_isomorphic
  holds F1, F3 are_isomorphic
proof
  let F1, F2, F3 be Graph-yielding Function;
  assume F1, F2 are_isomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    A2: for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
  assume F2, F3 are_isomorphic;
  then consider q being one-to-one Function such that
    A3: dom q = dom F2 & rng q = dom F3 and
    A4: for x being object st x in dom F2 ex G2, G3 being _Graph
      st G2 = F2.x & G3 = F3.(q.x) & G3 is G2-isomorphic;
  take q*p;
  dom(q*p) = dom p & rng(q*p) = rng q by A1, A3, RELAT_1:27, RELAT_1:28;
  hence A5: dom(q*p) = dom F1 & rng(q*p) = dom F3 by A1, A3;
  let x be object;
  assume x in dom F1;
  then A6: x in dom p & p.x in dom q by A5, FUNCT_1:11;
  then consider G1, G2 be _Graph such that
    A7: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic by A1, A2;
  consider G9,G3 being _Graph such that
    A8: G9 = F2.(p.x) & G3 = F3.(q.(p.x)) & G3 is G9-isomorphic by A3, A4, A6;
  take G1, G3;
  thus G1 = F1.x by A7;
  thus G3 = F3.((q*p).x) by A6, A8, FUNCT_1:13;
  thus thesis by A7, A8;
end;

theorem Th42:
  for F1, F2 being Graph-yielding Function
  st F1, F2 are_Disomorphic holds F1, F2 are_isomorphic
proof
  let F1, F2 be Graph-yielding Function;
  assume F1, F2 are_Disomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    A2: for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
  take p;
  thus dom p = dom F1 & rng p = dom F2 by A1;
  let x be object;
  assume x in dom F1;
  then consider G1, G2 being _Graph such that
    A3: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic by A2;
  take G1, G2;
  thus thesis by A3;
end;

:: might require Proof outside this article
theorem
  for F1, F2 being empty Graph-yielding Function
  holds F1, F2 are_Disomorphic & F1, F2 are_isomorphic;

theorem
  for F1, F2 being Graph-yielding Function
  st F1, F2 are_Disomorphic holds card F1 = card F2
proof
  let F1, F2 be Graph-yielding Function;
  assume F1, F2 are_Disomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
  thus card F1 = card dom F1 by CARD_1:62
    .= card dom F2 by A1, CARD_1:70
    .= card F2 by CARD_1:62;
end;

theorem
  for F1, F2 being Graph-yielding Function
  st F1, F2 are_isomorphic holds card F1 = card F2
proof
  let F1, F2 be Graph-yielding Function;
  assume F1, F2 are_isomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
  thus card F1 = card dom F1 by CARD_1:62
    .= card dom F2 by A1, CARD_1:70
    .= card F2 by CARD_1:62;
end;

theorem
  for G1, G2 being _Graph, x,y being object
  holds x .--> G1, y .--> G2 are_Disomorphic iff G2 is G1-Disomorphic
proof
  let G1, G2 be _Graph, x,y be object;
  hereby
    assume x .--> G1, y .--> G2 are_Disomorphic;
    then consider p being one-to-one Function such that
      A1: dom p = dom(x .--> G1) & rng p = dom(y .--> G2) and
      A2: for z being object st z in dom(x .--> G1) ex G3, G4 being _Graph
        st G3 = (x .--> G1).z & G4 = (y .--> G2).(p.z) & G4 is G3-Disomorphic;
    dom p = dom{[x,G1]} & rng p = dom{[y,G2]} by A1, FUNCT_4:82;
    then dom p = {x} & rng p = {y} by RELAT_1:9;
    then A3: p = x .--> y by FUNCT_4:112;
    dom(x .--> G1) = dom{[x,G1]} by FUNCT_4:82
      .= {x} by RELAT_1:9;
    then x in dom(x .--> G1) by TARSKI:def 1;
    then consider G3, G4 being _Graph such that
      A4: G3 = (x .--> G1).x & G4 = (y .--> G2).(p.x) & G4 is G3-Disomorphic
      by A2;
    A5: G3 = G1 by A4, FUNCOP_1:72;
    G4 = (y .--> G2).y by A3, A4, FUNCOP_1:72
      .= G2 by FUNCOP_1:72;
    hence G2 is G1-Disomorphic by A4, A5;
  end;
  assume A6: G2 is G1-Disomorphic;
  take p = x .--> y;
  thus dom p = dom{[x,y]} by FUNCT_4:82
    .= {x} by RELAT_1:9
    .= dom{[x,G1]} by RELAT_1:9
    .= dom(x .--> G1) by FUNCT_4:82;
  p = {x} --> y by FUNCOP_1:def 9;
  hence rng p = {y} by FUNCOP_1:8
    .= dom{[y,G2]} by RELAT_1:9
    .= dom(y .--> G2) by FUNCT_4:82;
  let z be object;
  assume z in dom(x .--> G1);
  then A7: z = x by TARSKI:def 1;
  take G1, G2;
  thus G1 = (x .--> G1).z by A7, FUNCOP_1:72;
  thus G2 = (y .--> G2).y by FUNCOP_1:72
    .= (y .--> G2).(p.z) by A7, FUNCOP_1:72;
  thus thesis by A6;
end;

theorem
  for G1, G2 being _Graph, x,y being object
  holds x .--> G1, y .--> G2 are_isomorphic iff G2 is G1-isomorphic
proof
  let G1, G2 be _Graph, x,y be object;
  hereby
    assume x .--> G1, y .--> G2 are_isomorphic;
    then consider p being one-to-one Function such that
      A1: dom p = dom(x .--> G1) & rng p = dom(y .--> G2) and
      A2: for z being object st z in dom(x .--> G1) ex G3, G4 being _Graph
        st G3 = (x .--> G1).z & G4 = (y .--> G2).(p.z) & G4 is G3-isomorphic;
    dom p = dom{[x,G1]} & rng p = dom{[y,G2]} by A1, FUNCT_4:82;
    then dom p = {x} & rng p = {y} by RELAT_1:9;
    then A3: p = x .--> y by FUNCT_4:112;
    dom(x .--> G1) = dom{[x,G1]} by FUNCT_4:82
      .= {x} by RELAT_1:9;
    then x in dom(x .--> G1) by TARSKI:def 1;
    then consider G3, G4 being _Graph such that
      A4: G3 = (x .--> G1).x & G4 = (y .--> G2).(p.x) & G4 is G3-isomorphic
      by A2;
    A5: G3 = G1 by A4, FUNCOP_1:72;
    G4 = (y .--> G2).y by A3, A4, FUNCOP_1:72
      .= G2 by FUNCOP_1:72;
    hence G2 is G1-isomorphic by A4, A5;
  end;
  assume A6: G2 is G1-isomorphic;
  take p = x .--> y;
  thus dom p = dom{[x,y]} by FUNCT_4:82
    .= {x} by RELAT_1:9
    .= dom{[x,G1]} by RELAT_1:9
    .= dom(x .--> G1) by FUNCT_4:82;
  p = {x} --> y by FUNCOP_1:def 9;
  hence rng p = {y} by FUNCOP_1:8
    .= dom{[y,G2]} by RELAT_1:9
    .= dom(y .--> G2) by FUNCT_4:82;
  let z be object;
  assume z in dom(x .--> G1);
  then A7: z = x by TARSKI:def 1;
  take G1, G2;
  thus G1 = (x .--> G1).z by A7, FUNCOP_1:72;
  thus G2 = (y .--> G2).y by FUNCOP_1:72
    .= (y .--> G2).(p.z) by A7, FUNCOP_1:72;
  thus thesis by A6;
end;

theorem Th48:
  for F1, F2 being Graph-yielding Function st F1, F2 are_isomorphic holds
    (F1 is empty implies F2 is empty) &
    (F1 is loopless implies F2 is loopless) &
    (F1 is non-multi implies F2 is non-multi) &
    (F1 is simple implies F2 is simple) &
    (F1 is acyclic implies F2 is acyclic) &
    (F1 is connected implies F2 is connected) &
    (F1 is Tree-like implies F2 is Tree-like) &
    (F1 is chordal implies F2 is chordal) &
    (F1 is edgeless implies F2 is edgeless) &
    (F1 is loopfull implies F2 is loopfull)
proof
  let F1, F2 be Graph-yielding Function;
  assume F1,F2 are_isomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    A2: for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
  hereby
    assume F1 is empty;
    then p = {} by A1;
    hence F2 is empty by A1;
  end;
  hereby
    assume A3: F1 is loopless;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A4: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A5: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A4;
      take G2;
      thus F2.x = G2 by A4, A5;
      consider G9 being _Graph such that
        A6: F1.x0 = G9 & G9 is loopless by A1, A3, A4, GLIB_000:def 59;
      thus G2 is loopless by A5, A6;
    end;
    hence F2 is loopless by GLIB_000:def 59;
  end;
  hereby
    assume A7: F1 is non-multi;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A8: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A9: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A8;
      take G2;
      thus F2.x = G2 by A8, A9;
      consider G9 being _Graph such that
        A10: F1.x0 = G9 & G9 is non-multi by A1, A7, A8, GLIB_000:def 62;
      consider G being PGraphMapping of G1, G2 such that
        A11: G is isomorphism by A9, GLIB_010:def 23;
      thus G2 is non-multi by A9, A10, A11, GLIB_010:89;
    end;
    hence F2 is non-multi by GLIB_000:def 62;
  end;
  hereby
    assume A12: F1 is simple;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A13: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A14: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A13;
      take G2;
      thus F2.x = G2 by A13, A14;
      consider G9 being _Graph such that
        A15: F1.x0 = G9 & G9 is simple by A1, A12, A13, GLIB_000:def 64;
      consider G being PGraphMapping of G1, G2 such that
        A16: G is isomorphism by A14, GLIB_010:def 23;
      thus G2 is simple by A14, A15, A16, GLIB_010:89;
    end;
    hence F2 is simple by GLIB_000:def 64;
  end;
  hereby
    assume A17: F1 is acyclic;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A18: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A19: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A18;
      take G2;
      thus F2.x = G2 by A18, A19;
      consider G9 being _Graph such that
        A20: F1.x0 = G9 & G9 is acyclic by A1, A17, A18, GLIB_002:def 13;
      consider G being PGraphMapping of G1, G2 such that
        A21: G is isomorphism by A19, GLIB_010:def 23;
      thus G2 is acyclic by A19, A20, A21, GLIB_010:140;
    end;
    hence F2 is acyclic by GLIB_002:def 13;
  end;
  hereby
    assume A22: F1 is connected;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A23: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A24: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A23;
      take G2;
      thus F2.x = G2 by A23, A24;
      consider G9 being _Graph such that
        A25: F1.x0 = G9 & G9 is connected by A1, A22, A23, GLIB_002:def 12;
      consider G being PGraphMapping of G1, G2 such that
        A26: G is isomorphism by A24, GLIB_010:def 23;
      thus G2 is connected by A24, A25, A26, GLIB_010:140;
    end;
    hence F2 is connected by GLIB_002:def 12;
  end;
  hereby
    assume A27: F1 is Tree-like;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A28: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A29: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A28;
      take G2;
      thus F2.x = G2 by A28, A29;
      consider G9 being _Graph such that
        A30: F1.x0 = G9 & G9 is Tree-like by A1, A27, A28, GLIB_002:def 14;
      consider G being PGraphMapping of G1, G2 such that
        A31: G is isomorphism by A29, GLIB_010:def 23;
      G2 is connected acyclic by A29, A30, A31, GLIB_010:140;
      hence G2 is Tree-like;
    end;
    hence F2 is Tree-like by GLIB_002:def 14;
  end;
  hereby
    assume A32: F1 is chordal;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A33: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A34: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A33;
      take G2;
      thus F2.x = G2 by A33, A34;
      consider G9 being _Graph such that
        A35: F1.x0 = G9 & G9 is chordal by A1, A32, A33, GLIBPRE0:def 4;
      consider G being PGraphMapping of G1, G2 such that
        A36: G is isomorphism by A34, GLIB_010:def 23;
      thus G2 is chordal by A34, A35, A36, GLIB_010:140;
    end;
    hence F2 is chordal by GLIBPRE0:def 4;
  end;
  hereby
    assume A37: F1 is edgeless;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A38: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A39: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A38;
      take G2;
      thus F2.x = G2 by A38, A39;
      consider G9 being _Graph such that
        A40: F1.x0 = G9 & G9 is edgeless by A1, A37, A38, GLIB_008:def 2;
      consider G being PGraphMapping of G1, G2 such that
        A41: G is isomorphism by A39, GLIB_010:def 23;
      thus G2 is edgeless by A39, A40, A41, GLIB_010:89;
    end;
    hence F2 is edgeless by GLIB_008:def 2;
  end;
  hereby
    assume A42: F1 is loopfull;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A43: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A44: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-isomorphic by A1, A2, A43;
      take G2;
      thus F2.x = G2 by A43, A44;
      consider G9 being _Graph such that
        A45: F1.x0 = G9 & G9 is loopfull by A1, A42, A43, GLIB_012:def 2;
      consider G being PGraphMapping of G1, G2 such that
        A46: G is isomorphism by A44, GLIB_010:def 23;
      thus G2 is loopfull by A44, A45, A46, GLIB_012:10;
    end;
    hence F2 is loopfull by GLIB_012:def 2;
  end;
end;

theorem Th49:
  for F1, F2 being Graph-yielding Function st F1, F2 are_Disomorphic holds
    (F1 is non-Dmulti implies F2 is non-Dmulti) &
    (F1 is Dsimple implies F2 is Dsimple)
proof
  let F1, F2 be Graph-yielding Function;
  assume F1,F2 are_Disomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    A2: for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
  hereby
    assume A3: F1 is non-Dmulti;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A4: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A5: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-Disomorphic by A1, A2, A4;
      take G2;
      thus F2.x = G2 by A4, A5;
      consider G9 being _Graph such that
        A6: F1.x0 = G9 & G9 is non-Dmulti by A1, A3, A4, GLIB_000:def 63;
      consider G being PGraphMapping of G1, G2 such that
        A7: G is Disomorphism by A5, GLIB_010:def 24;
      thus G2 is non-Dmulti by A5, A6, A7, GLIB_010:90;
    end;
    hence F2 is non-Dmulti by GLIB_000:def 63;
  end;
  hereby
    assume A8: F1 is Dsimple;
    now
      let x be object;
      assume x in dom F2;
      then consider x0 being object such that
        A9: x0 in dom p & p.x0 = x by A1, FUNCT_1:def 3;
      consider G1, G2 being _Graph such that
        A10: G1 = F1.x0 & G2 = F2.(p.x0) & G2 is G1-Disomorphic by A1, A2, A9;
      take G2;
      thus F2.x = G2 by A9, A10;
      consider G9 being _Graph such that
        A11: F1.x0 = G9 & G9 is Dsimple by A1, A8, A9, GLIB_000:def 65;
      consider G being PGraphMapping of G1, G2 such that
        A12: G is Disomorphism by A10, GLIB_010:def 24;
      thus G2 is Dsimple by A10, A11, A12, GLIB_010:90;
    end;
    hence F2 is Dsimple by GLIB_000:def 65;
  end;
end;

definition
  let I be set, F1, F2 being Graph-yielding ManySortedSet of I;
  redefine pred F1, F2 are_Disomorphic means  :: redefines are_Disomorphic (GLIB_015, definition)
  ex p being Permutation of I st
  for x being object st x in I
  ex G1, G2 being _Graph st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
  compatibility
  proof
    hereby
      assume F1, F2 are_Disomorphic;
      then consider p being one-to-one Function such that
        A1: dom p = dom F1 & rng p = dom F2 and
        A2: for x being object st x in dom F1 ex G1, G2 being _Graph
          st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
      A3: dom p = I & rng p = I by A1, PARTFUN1:def 2;
      then reconsider p as one-to-one Function of I,I by FUNCT_2:1;
      p is onto by A3, FUNCT_2:def 3;
      then reconsider p as Permutation of I;
      take p;
      let x be object;
      assume x in I;
      then x in dom F1 by PARTFUN1:def 2;
      then consider G1, G2 being _Graph such that
        A4: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic by A2;
      take G1, G2;
      thus G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic by A4;
    end;
    given p being Permutation of I such that
      A5: for x being object st x in I ex G1, G2 being _Graph
        st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
    reconsider p as one-to-one Function;
    take p;
    thus dom p = I by PARTFUN1:def 2
      .= dom F1 by PARTFUN1:def 2;
    thus rng p = I by FUNCT_2:def 3
      .= dom F2 by PARTFUN1:def 2;
    let x be object;
    assume x in dom F1;
    hence thesis by A5;
  end;
  reflexivity
  proof
    let F be Graph-yielding ManySortedSet of I;
    reconsider p = id I as Permutation of I;
    take p;
    let x be object;
    assume A6: x in I;
    then x in dom F by PARTFUN1:def 2;
    then reconsider G = F.x as _Graph by GLIB_000:def 53;
    take G, G;
    thus thesis by A6, FUNCT_1:18, GLIB_010:53;
  end;
  symmetry
  proof
    let F1, F2 be Graph-yielding ManySortedSet of I;
    assume ex p being Permutation of I st
      for x being object st x in I ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
    then consider p being Permutation of I such that
      A7: for x being object st x in I ex G1, G2 being _Graph
        st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
    reconsider q = p" as Permutation of I;
    take q;
    let y be object;
    assume y in I;
    then A8: y in dom q by FUNCT_2:def 1;
    then q.y in rng q by FUNCT_1:3;
    then consider G1, G2 being _Graph such that
      A9: G1 = F1.(q.y) & G2 = F2.(p.(q.y)) & G2 is G1-Disomorphic by A7;
    take G2, G1;
    y in rng p by A8, FUNCT_1:33;
    hence G2 = F2.y by A9, FUNCT_1:35;
    thus thesis by A9, GLIB_010:96;
  end;
  redefine pred F1, F2 are_isomorphic means  :: redefines are_isomorphic (GLIB_015, definition)
  ex p being Permutation of I st
  for x being object st x in I
  ex G1, G2 being _Graph st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
  compatibility
  proof
    hereby
      assume F1, F2 are_isomorphic;
      then consider p being one-to-one Function such that
        A10: dom p = dom F1 & rng p = dom F2 and
        A11: for x being object st x in dom F1 ex G1, G2 being _Graph
          st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
      A12: dom p = I & rng p = I by A10, PARTFUN1:def 2;
      then reconsider p as one-to-one Function of I,I by FUNCT_2:1;
      p is onto by A12, FUNCT_2:def 3;
      then reconsider p as Permutation of I;
      take p;
      let x be object;
      assume x in I;
      then x in dom F1 by PARTFUN1:def 2;
      then consider G1, G2 being _Graph such that
        A13: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic by A11;
      take G1, G2;
      thus G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic by A13;
    end;
    given p being Permutation of I such that
      A14: for x being object st x in I ex G1, G2 being _Graph
        st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
    reconsider p as one-to-one Function;
    take p;
    thus dom p = I by PARTFUN1:def 2
      .= dom F1 by PARTFUN1:def 2;
    thus rng p = I by FUNCT_2:def 3
      .= dom F2 by PARTFUN1:def 2;
    let x be object;
    assume x in dom F1;
    hence thesis by A14;
  end;
  reflexivity
  proof
    let F be Graph-yielding ManySortedSet of I;
    reconsider p = id I as Permutation of I;
    take p;
    let x be object;
    assume A15: x in I;
    then x in dom F by PARTFUN1:def 2;
    then reconsider G = F.x as _Graph by GLIB_000:def 53;
    take G, G;
    thus thesis by A15, FUNCT_1:18, GLIB_010:53;
  end;
  symmetry
  proof
    let F1, F2 be Graph-yielding ManySortedSet of I;
    assume ex p being Permutation of I st
      for x being object st x in I ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
    then consider p being Permutation of I such that
      A16: for x being object st x in I ex G1, G2 being _Graph
        st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
    reconsider q = p" as Permutation of I;
    take q;
    let y be object;
    assume y in I;
    then A17: y in dom q by FUNCT_2:def 1;
    then q.y in rng q by FUNCT_1:3;
    then consider G1, G2 being _Graph such that
      A18: G1 = F1.(q.y) & G2 = F2.(p.(q.y)) & G2 is G1-isomorphic by A16;
    take G2, G1;
    y in rng p by A17, FUNCT_1:33;
    hence G2 = F2.y by A18, FUNCT_1:35;
    thus thesis by A18, GLIB_010:95;
  end;
end;

begin :: Distinguishing the Vertex and Edge Sets of several Graphs from each other

definition
  let S being Graph-membered set;
  attr S is vertex-disjoint means
  :Def18:
  for G1, G2 being _Graph st G1 in S & G2 in S & G1 <> G2
  holds the_Vertices_of G1 misses the_Vertices_of G2;
  attr S is edge-disjoint means
  :Def19:
  for G1, G2 being _Graph st G1 in S & G2 in S & G1 <> G2
  holds the_Edges_of G1 misses the_Edges_of G2;
end;

:: might require Proof outside this article
theorem
  for S being Graph-membered set holds S is vertex-disjoint edge-disjoint iff
    for G1, G2 being _Graph st G1 in S & G2 in S & G1 <> G2
    holds the_Vertices_of G1 misses the_Vertices_of G2 &
      the_Edges_of G1 misses the_Edges_of G2;

registration
  cluster trivial -> vertex-disjoint edge-disjoint for Graph-membered set;
  coherence by ZFMISC_1:def 10;
  cluster edgeless -> edge-disjoint for Graph-membered set;
  coherence
  proof
    let S be Graph-membered set;
    assume A1: S is edgeless;
    let G1, G2 be _Graph;
    assume G1 in S & G2 in S & G1 <> G2;
    then the_Edges_of G1 = {} & the_Edges_of G2 = {} by A1;
    hence thesis by XBOOLE_1:65;
  end;
  cluster edge-disjoint -> \/-tolerating for Graph-membered set;
  coherence
  proof
    let S be Graph-membered set;
    assume A2: S is edge-disjoint;
    now
      let G1, G2 be _Graph;
      assume A3: G1 in S & G2 in S;
      per cases;
      suppose G1 = G2;
        hence G1 tolerates G2;
      end;
      suppose G1 <> G2;
        then the_Edges_of G1 misses the_Edges_of G2 by A2, A3;
        hence G1 tolerates G2 by GLIB_014:12;
      end;
    end;
    hence thesis by GLIB_014:def 23;
  end;
  cluster vertex-disjoint \/-tolerating -> edge-disjoint
    for Graph-membered set;
  coherence
  proof
    let S be Graph-membered set;
    assume A4: S is vertex-disjoint \/-tolerating;
    let G1, G2 be _Graph;
    assume A5: G1 in S & G2 in S & G1 <> G2;
    the_Edges_of G1 /\ the_Edges_of G2 = {}
    proof
      assume the_Edges_of G1 /\ the_Edges_of G2 <> {};
      then consider e being object such that
        A6: e in the_Edges_of G1 /\ the_Edges_of G2 by XBOOLE_0:def 1;
      set v1 = (the_Source_of G1).e, w1 = (the_Target_of G1).e;
      set v2 = (the_Source_of G2).e, w2 = (the_Target_of G2).e;
      e in the_Edges_of G1 & e in the_Edges_of G2 by A6, XBOOLE_0:def 4;
      then A7: e DJoins v1,w1,G1 & e DJoins v2,w2,G2 by GLIB_000:def 14;
      G1 tolerates G2 by A4, A5, GLIB_014:def 23;
      then A8: v1 = v2 by A7, GLIB_014:17;
      e Joins v1,w1,G1 & e Joins v2,w2,G2 by A7, GLIB_000:16;
      then v1 in the_Vertices_of G1 & v2 in the_Vertices_of G2 by GLIB_000:13;
      hence contradiction by A4, A5, A8, XBOOLE_0:3;
    end;
    hence thesis by XBOOLE_0:def 7;
  end;
end;

registration
  let G be _Graph;
  cluster {G} -> vertex-disjoint edge-disjoint;
  coherence;
end;

theorem
  for G1, G2 being _Graph holds {G1, G2} is vertex-disjoint
    iff G1 = G2 or the_Vertices_of G1 misses the_Vertices_of G2
proof
  let G1, G2 be _Graph;
  hereby
    assume A1: {G1, G2} is vertex-disjoint;
    assume A2: G1 <> G2;
    G1 in {G1, G2} & G2 in {G1, G2} by TARSKI:def 2;
    hence the_Vertices_of G1 misses the_Vertices_of G2 by A1, A2;
  end;
  assume G1 = G2 or the_Vertices_of G1 misses the_Vertices_of G2;
  then per cases;
  suppose G1 = G2;
    then {G1, G2} = {G1} by ENUMSET1:29;
    hence thesis;
  end;
  suppose A3: the_Vertices_of G1 misses the_Vertices_of G2;
    let G3, G4 be _Graph;
    assume G3 in {G1,G2} & G4 in {G1,G2} & G3 <> G4;
    then (G3=G1 or G3=G2) & (G4=G1 or G4=G2) & G3 <> G4 by TARSKI:def 2;
    hence thesis by A3;
  end;
end;

theorem
  for G1, G2 being _Graph holds {G1, G2} is edge-disjoint
    iff G1 = G2 or the_Edges_of G1 misses the_Edges_of G2
proof
  let G1, G2 be _Graph;
  hereby
    assume A1: {G1, G2} is edge-disjoint;
    assume A2: G1 <> G2;
    G1 in {G1, G2} & G2 in {G1, G2} by TARSKI:def 2;
    hence the_Edges_of G1 misses the_Edges_of G2 by A1, A2;
  end;
  assume G1 = G2 or the_Edges_of G1 misses the_Edges_of G2;
  then per cases;
  suppose G1 = G2;
    then {G1, G2} = {G1} by ENUMSET1:29;
    hence thesis;
  end;
  suppose A3: the_Edges_of G1 misses the_Edges_of G2;
    let G3, G4 be _Graph;
    assume G3 in {G1,G2} & G4 in {G1,G2} & G3 <> G4;
    then (G3=G1 or G3=G2) & (G4=G1 or G4=G2) & G3 <> G4 by TARSKI:def 2;
    hence thesis by A3;
  end;
end;

registration
  cluster non empty \/-tolerating vertex-disjoint edge-disjoint acyclic
    simple Dsimple loopless non-multi non-Dmulti for Graph-membered set;
  existence
  proof
    take {the Tree-like _Graph};
    thus thesis;
  end;
end;

:: note that the other direction does not work,
:: for example take S = {G,H} with G == H <> G
registration
  let S be vertex-disjoint Graph-membered set;
  cluster the_Vertices_of S -> mutually-disjoint;
  coherence
  proof
    now
      let x,y be set;
      assume x in the_Vertices_of S;
      then consider G being _Graph such that
        A1: G in S & x = the_Vertices_of G by GLIB_014:def 14;
      assume y in the_Vertices_of S;
      then consider H being _Graph such that
        A2: H in S & y = the_Vertices_of H by GLIB_014:def 14;
      assume x <> y;
      then H <> G by A1, A2;
      hence x misses y by A1, A2, Def18;
    end;
    hence the_Vertices_of S is mutually-disjoint by TAXONOM2:def 5;
  end;
end;

registration
  let S be edge-disjoint Graph-membered set;
  cluster the_Edges_of S -> mutually-disjoint;
  coherence
  proof
    now
      let x,y be set;
      assume x in the_Edges_of S;
      then consider G being _Graph such that
        A1: G in S & x = the_Edges_of G by GLIB_014:def 15;
      assume y in the_Edges_of S;
      then consider H being _Graph such that
        A2: H in S & y = the_Edges_of H by GLIB_014:def 15;
      assume x <> y;
      then H <> G by A1, A2;
      hence x misses y by A1, A2, Def19;
    end;
    hence the_Edges_of S is mutually-disjoint by TAXONOM2:def 5;
  end;
end;

registration
  let S be vertex-disjoint Graph-membered set;
  cluster -> vertex-disjoint for Subset of S;
  coherence by Def18;
end;

registration
  let S1 be vertex-disjoint Graph-membered set;
  let S2 be set;
  cluster S1 /\ S2 -> vertex-disjoint;
  coherence
  proof
    S1 /\ S2 c= S1 by XBOOLE_1:17;
    hence thesis;
  end;
  cluster S1 \ S2 -> vertex-disjoint;
  coherence;
end;

registration
  let S be edge-disjoint Graph-membered set;
  cluster -> edge-disjoint for Subset of S;
  coherence by Def19;
end;

registration
  let S1 be edge-disjoint Graph-membered set;
  let S2 be set;
  cluster S1 /\ S2 -> edge-disjoint;
  coherence
  proof
    S1 /\ S2 c= S1 by XBOOLE_1:17;
    hence thesis;
  end;
  cluster S1 \ S2 -> edge-disjoint;
  coherence;
end;

theorem
  for S1, S2 being Graph-membered set st S1 \/ S2 is vertex-disjoint
  holds S1 is vertex-disjoint & S2 is vertex-disjoint
proof
  let S1, S2 be Graph-membered set;
  assume A1: S1 \/ S2 is vertex-disjoint;
  hereby
    let G1, G2 be _Graph;
    assume G1 in S1 & G2 in S1 & G1 <> G2;
    then G1 in S1 \/ S2 & G2 in S1 \/ S2 & G1 <> G2 by XBOOLE_0:def 3;
    hence the_Vertices_of G1 misses the_Vertices_of G2 by A1;
  end;
  let G1, G2 be _Graph;
  assume G1 in S2 & G2 in S2 & G1 <> G2;
  then G1 in S1 \/ S2 & G2 in S1 \/ S2 & G1 <> G2 by XBOOLE_0:def 3;
  hence the_Vertices_of G1 misses the_Vertices_of G2 by A1;
end;

theorem
  for S1, S2 being Graph-membered set st S1 \/ S2 is edge-disjoint
  holds S1 is edge-disjoint & S2 is edge-disjoint
proof
  let S1, S2 be Graph-membered set;
  assume A1: S1 \/ S2 is edge-disjoint;
  hereby
    let G1, G2 be _Graph;
    assume G1 in S1 & G2 in S1 & G1 <> G2;
    then G1 in S1 \/ S2 & G2 in S1 \/ S2 & G1 <> G2 by XBOOLE_0:def 3;
    hence the_Edges_of G1 misses the_Edges_of G2 by A1;
  end;
  let G1, G2 be _Graph;
  assume G1 in S2 & G2 in S2 & G1 <> G2;
  then G1 in S1 \/ S2 & G2 in S1 \/ S2 & G1 <> G2 by XBOOLE_0:def 3;
  hence the_Edges_of G1 misses the_Edges_of G2 by A1;
end;

theorem Th55:
  for S1, S2 being vertex-disjoint GraphUnionSet
  for G1 being (GraphUnion of S1), G2 being GraphUnion of S2
  st S1,S2 are_Disomorphic holds G2 is G1-Disomorphic
proof
  let S1, S2 be vertex-disjoint GraphUnionSet, G1 be GraphUnion of S1;
  let G2 be GraphUnion of S2;
  assume S1,S2 are_Disomorphic;
  :: first get a function that associates each graph of S1 with an Disomorphism
  then consider h being one-to-one Function such that
    A1: dom h = S1 & rng h = S2 and
    A2: for G being _Graph st G in S1 holds h.G is G-Disomorphic _Graph;
  h is S1-defined by A1, RELAT_1:def 18;
  then reconsider h as ManySortedSet of S1 by A1, PARTFUN1:def 2;
  for x being object st x in dom h holds h.x is _Graph by A2;
  then reconsider h as Graph-yielding ManySortedSet of S1 by GLIB_000:def 53;
  defpred P0[object,object] means
    ex G being Element of S1, F being PGraphMapping of G, h.G
    st $1 = G & $2 = F & F is Disomorphism;
  A3: for G being Element of S1 ex F being object st P0[G,F]
  proof
    let G be Element of S1;
    h.G is G-Disomorphic by A2;
    then consider F being PGraphMapping of G, h.G such that
      A4: F is Disomorphism by GLIB_010:def 24;
    take F,G,F;
    thus thesis by A4;
  end;
  consider H being ManySortedSet of S1 such that
    A5: for G being Element of S1 holds P0[G,H.G] from PBOOLE:sch 6(A3);
  A6: for G being Element of S1 ex F being PGraphMapping of G, h.G st
    H.G = F & F is Disomorphism
  proof
    let G be Element of S1;
    consider G9 being Element of S1, F being PGraphMapping of G9, h.G9
      such that A7: G = G9 & H.G = F & F is Disomorphism by A5;
    thus thesis by A7;
  end;
  :: construct the vertex and edge mappings
  set V = rng pr1 H, E = rng pr2 H;
  for y being object st y in V holds y is Function
  proof
    let y be object;
    assume y in V;
    then consider x being object such that
      A8: x in dom pr1 H & (pr1 H).x = y by FUNCT_1:def 3;
    A9: x in dom H by A8, MCART_1:def 12;
    then reconsider x as Element of S1;
    consider F being PGraphMapping of x, h.x such that
      A10: H.x = F & F is Disomorphism by A6;
    y = F_V by A8, A9, A10, MCART_1:def 12;
    hence thesis;
  end;
  then reconsider V as functional set by FUNCT_1:def 13;
  for f1, f2 being Function st f1 in V & f2 in V holds f1 tolerates f2
  proof
    let f1, f2 be Function;
    assume A11: f1 in V & f2 in V;
    then consider x1 being object such that
      A12: x1 in dom pr1 H & (pr1 H).x1 = f1 by FUNCT_1:def 3;
    A13: x1 in dom H by A12, MCART_1:def 12;
    then reconsider x1 as Element of S1;
    consider F1 being PGraphMapping of x1, h.x1 such that
      A14: H.x1 = F1 & F1 is Disomorphism by A6;
    A15: f1 = F1_V by A12, A13, A14, MCART_1:def 12;
    then A16: dom f1 = the_Vertices_of x1 by A14, GLIB_010:def 11;
    consider x2 being object such that
      A17: x2 in dom pr1 H & (pr1 H).x2 = f2 by A11, FUNCT_1:def 3;
    A18: x2 in dom H by A17, MCART_1:def 12;
    then reconsider x2 as Element of S1;
    consider F2 being PGraphMapping of x2, h.x2 such that
      A19: H.x2 = F2 & F2 is Disomorphism by A6;
    A20: f2 = F2_V by A17, A18, A19, MCART_1:def 12;
    then A21: dom f2 = the_Vertices_of x2 by A19, GLIB_010:def 11;
    per cases;
    suppose x1 = x2;
      then F1 = F2 by A14, A19;
      hence thesis by A15, A20;
    end;
    suppose x1 <> x2;
      then dom f1 misses dom f2 by A16, A21, Def18;
      hence thesis by PARTFUN1:56;
    end;
  end;
  then reconsider V as functional compatible set by COMPUT_1:def 1;
  for y being object st y in E holds y is Function
  proof
    let y be object;
    assume y in E;
    then consider x being object such that
      A22: x in dom pr2 H & (pr2 H).x = y by FUNCT_1:def 3;
    A23: x in dom H by A22, MCART_1:def 13;
    then reconsider x as Element of S1;
    consider F being PGraphMapping of x, h.x such that
      A24: H.x = F & F is Disomorphism by A6;
    y = F_E by A22, A23, A24, MCART_1:def 13;
    hence thesis;
  end;
  then reconsider E as functional set by FUNCT_1:def 13;
  for g1, g2 being Function st g1 in E & g2 in E holds g1 tolerates g2
  proof
    let f1, f2 be Function;
    assume A25: f1 in E & f2 in E;
    then consider x1 being object such that
      A26: x1 in dom pr2 H & (pr2 H).x1 = f1 by FUNCT_1:def 3;
    A27: x1 in dom H by A26, MCART_1:def 13;
    then reconsider x1 as Element of S1;
    consider F1 being PGraphMapping of x1, h.x1 such that
      A28: H.x1 = F1 & F1 is Disomorphism by A6;
    A29: f1 = F1_E by A26, A27, A28, MCART_1:def 13;
    then A30: dom f1 = the_Edges_of x1 by A28, GLIB_010:def 11;
    consider x2 being object such that
      A31: x2 in dom pr2 H & (pr2 H).x2 = f2 by A25, FUNCT_1:def 3;
    A32: x2 in dom H by A31, MCART_1:def 13;
    then reconsider x2 as Element of S1;
    consider F2 being PGraphMapping of x2, h.x2 such that
      A33: H.x2 = F2 & F2 is Disomorphism by A6;
    A34: f2 = F2_E by A31, A32, A33, MCART_1:def 13;
    then A35: dom f2 = the_Edges_of x2 by A33, GLIB_010:def 11;
    per cases;
    suppose x1 = x2;
      then F1 = F2 by A28, A33;
      hence thesis by A29, A34;
    end;
    suppose x1 <> x2;
      then dom f1 misses dom f2 by A30, A35, Def19;
      hence thesis by PARTFUN1:56;
    end;
  end;
  then reconsider E as functional compatible set by COMPUT_1:def 1;
  set f = union V, g = union E;
  :: show that dom f = V(G1)
  now
    let x be object;
    hereby
      assume x in dom union V;
      then [x,(union V).x] in union V by FUNCT_1:1;
      then consider y being set such that
        A36: [x,(union V).x] in y & y in V by TARSKI:def 4;
      consider z being object such that
        A37: z in dom pr1 H & (pr1 H).z = y by A36, FUNCT_1:def 3;
      A38: z in dom H by A37, MCART_1:def 12;
      then reconsider z as Element of S1;
      take Y = the_Vertices_of z;
      consider F being PGraphMapping of z,h.z such that
        A39: H.z = F & F is Disomorphism by A6;
      y = F_V by A37, A38, A39, MCART_1:def 12;
      then x in dom F_V by A36, FUNCT_1:1;
      hence x in Y;
      thus Y in the_Vertices_of S1 by GLIB_014:def 14;
    end;
    given Y being set such that
      A40: x in Y & Y in the_Vertices_of S1;
    consider z being _Graph such that
      A41: z in S1 & Y = the_Vertices_of z by A40, GLIB_014:def 14;
    reconsider z as Element of S1 by A41;
    consider F being PGraphMapping of z,h.z such that
      A42: H.z = F & F is Disomorphism by A6;
    A43: z in dom H by A41, PARTFUN1:def 2;
    x in dom F_V by A40, A41, A42, GLIB_010:def 11;
    then [x,F_V.x] in F_V by FUNCT_1:1;
    then A44: [x,F_V.x] in (pr1 H).z by A42, A43, MCART_1:def 12;
    z in dom pr1 H by A43, MCART_1:def 12;
    then (pr1 H).z in rng pr1 H by FUNCT_1:3;
    then [x,F_V.x] in union V by A44, TARSKI:def 4; :: V = rng pr1 H
    hence x in dom union V by FUNCT_1:1;
  end;
  then A45: dom f = union the_Vertices_of S1 by TARSKI:def 4
    .= the_Vertices_of G1 by GLIB_014:def 25;
  :: show that rng f = V(G2)
  now
    let y be object;
    hereby
      assume y in rng union V;
      then consider x being object such that
        A46: x in dom union V & (union V).x = y by FUNCT_1:def 3;
      [x,y] in union V by A46, FUNCT_1:1;
      then consider Z being set such that
        A47: [x,y] in Z & Z in V by TARSKI:def 4;
      consider z being object such that
        A48: z in dom pr1 H & (pr1 H).z = Z by A47, FUNCT_1:def 3;
      A49: z in dom H by A48, MCART_1:def 12;
      then reconsider z as Element of S1;
      h.z in rng h by A1, FUNCT_1:3;
      then reconsider G = h.z as Element of S2 by A1;
      consider F being PGraphMapping of z,G such that
        A50: H.z = F & F is Disomorphism by A6;
      take Y = the_Vertices_of G;
      Z = F_V by A48, A49, A50, MCART_1:def 12;
      then y in rng F_V by A47, XTUPLE_0:def 13;
      hence y in Y;
      thus Y in the_Vertices_of S2 by GLIB_014:def 14;
    end;
    given Y being set such that
      A51: y in Y & Y in the_Vertices_of S2;
    consider G being _Graph such that
      A52: G in S2 & Y = the_Vertices_of G by A51, GLIB_014:def 14;
    consider z being object such that
      A53: z in dom h & h.z = G by A1, A52, FUNCT_1:def 3;
    reconsider z as Element of S1 by A53;
    consider F being PGraphMapping of z,G such that
      A54: H.z = F & F is Disomorphism by A6, A53;
    y in rng F_V by A51, A52, A54, GLIB_010:def 12;
    then consider x being object such that
      A55: x in dom F_V & F_V.x = y by FUNCT_1:def 3;
    z in S1;
    then A56: z in dom H by PARTFUN1:def 2;
    A57: F_V = (pr1 H).z by A54, A56, MCART_1:def 12;
    z in dom pr1 H by A56, MCART_1:def 12;
    then A58: (pr1 H).z in rng pr1 H by FUNCT_1:3;
    [x,y] in (pr1 H).z by A55, A57, FUNCT_1:1;
    then [x,y] in union V by A58, TARSKI:def 4; :: V = rng pr1 H
    hence y in rng union V by XTUPLE_0:def 13;
  end;
  then A59: rng f = union the_Vertices_of S2 by TARSKI:def 4
    .= the_Vertices_of G2 by GLIB_014:def 25;
  then reconsider f as Function of the_Vertices_of G1, the_Vertices_of G2
    by A45, FUNCT_2:1;
  :: show that dom g = E(G1)
  now
    let x be object;
    hereby
      assume x in dom union E;
      then [x,(union E).x] in union E by FUNCT_1:1;
      then consider y being set such that
        A60: [x,(union E).x] in y & y in E by TARSKI:def 4;
      consider z being object such that
        A61: z in dom pr2 H & (pr2 H).z = y by A60, FUNCT_1:def 3;
      A62: z in dom H by A61, MCART_1:def 13;
      then reconsider z as Element of S1;
      take Y = the_Edges_of z;
      consider F being PGraphMapping of z,h.z such that
        A63: H.z = F & F is Disomorphism by A6;
      y = F_E by A61, A62, A63, MCART_1:def 13;
      then x in dom F_E by A60, FUNCT_1:1;
      hence x in Y;
      thus Y in the_Edges_of S1 by GLIB_014:def 15;
    end;
    given Y being set such that
      A64: x in Y & Y in the_Edges_of S1;
    consider z being _Graph such that
      A65: z in S1 & Y = the_Edges_of z by A64, GLIB_014:def 15;
    reconsider z as Element of S1 by A65;
    consider F being PGraphMapping of z,h.z such that
      A66: H.z = F & F is Disomorphism by A6;
    A67: z in dom H by A65, PARTFUN1:def 2;
    x in dom F_E by A64, A65, A66, GLIB_010:def 11;
    then [x,F_E.x] in F_E by FUNCT_1:1;
    then A68: [x,F_E.x] in (pr2 H).z by A66, A67, MCART_1:def 13;
    z in dom pr2 H by A67, MCART_1:def 13;
    then (pr2 H).z in rng pr2 H by FUNCT_1:3;
    then [x,F_E.x] in union E by A68, TARSKI:def 4; :: E = rng pr2 H
    hence x in dom union E by FUNCT_1:1;
  end;
  then A69: dom g = union the_Edges_of S1 by TARSKI:def 4
    .= the_Edges_of G1 by GLIB_014:def 25;
  :: show that rng g = E(G2)
  now
    let y be object;
    hereby
      assume y in rng union E;
      then consider x being object such that
        A70: x in dom union E & (union E).x = y by FUNCT_1:def 3;
      [x,y] in union E by A70, FUNCT_1:1;
      then consider Z being set such that
        A71: [x,y] in Z & Z in E by TARSKI:def 4;
      consider z being object such that
        A72: z in dom pr2 H & (pr2 H).z = Z by A71, FUNCT_1:def 3;
      A73: z in dom H by A72, MCART_1:def 13;
      then reconsider z as Element of S1;
      h.z in rng h by A1, FUNCT_1:3;
      then reconsider G = h.z as Element of S2 by A1;
      consider F being PGraphMapping of z,G such that
        A74: H.z = F & F is Disomorphism by A6;
      take Y = the_Edges_of G;
      Z = F_E by A72, A73, A74, MCART_1:def 13;
      then y in rng F_E by A71, XTUPLE_0:def 13;
      hence y in Y;
      thus Y in the_Edges_of S2 by GLIB_014:def 15;
    end;
    given Y being set such that
      A75: y in Y & Y in the_Edges_of S2;
    consider G being _Graph such that
      A76: G in S2 & Y = the_Edges_of G by A75, GLIB_014:def 15;
    consider z being object such that
      A77: z in dom h & h.z = G by A1, A76, FUNCT_1:def 3;
    reconsider z as Element of S1 by A77;
    consider F being PGraphMapping of z,G such that
      A78: H.z = F & F is Disomorphism by A6, A77;
    y in rng F_E by A75, A76, A78, GLIB_010:def 12;
    then consider x being object such that
      A79: x in dom F_E & F_E.x = y by FUNCT_1:def 3;
    z in S1;
    then A80: z in dom H by PARTFUN1:def 2;
    A81: F_E = (pr2 H).z by A78, A80, MCART_1:def 13;
    z in dom pr2 H by A80, MCART_1:def 13;
    then A82: (pr2 H).z in rng pr2 H by FUNCT_1:3;
    [x,y] in (pr2 H).z by A79, A81, FUNCT_1:1;
    then [x,y] in union E by A82, TARSKI:def 4; :: E = rng pr2 H
    hence y in rng union E by XTUPLE_0:def 13;
  end;
  then A83: rng g = union the_Edges_of S2 by TARSKI:def 4
    .= the_Edges_of G2 by GLIB_014:def 25;
  then reconsider g as Function of the_Edges_of G1, the_Edges_of G2
    by A69, FUNCT_2:1;
  :: show f is one-to-one
  now
    let f1 be Function;
    assume f1 in V;
    then consider z1 being object such that
      A84: z1 in dom pr1 H & (pr1 H).z1 = f1 by FUNCT_1:def 3;
    A85: z1 in dom H by A84, MCART_1:def 12;
    then reconsider z1 as Element of S1;
    consider F1 being PGraphMapping of z1,h.z1 such that
      A86: H.z1 = F1 & F1 is Disomorphism by A6;
    A87: f1 = F1_V by A84, A85, A86, MCART_1:def 12;
    hence f1 is one-to-one by A86;
    let f2 be Function;
    assume A88: f2 in V & f1 <> f2;
    then consider z2 being object such that
      A89: z2 in dom pr1 H & (pr1 H).z2 = f2 by FUNCT_1:def 3;
    A90: z2 in dom H by A89, MCART_1:def 12;
    then reconsider z2 as Element of S1;
    consider F2 being PGraphMapping of z2,h.z2 such that
      A91: H.z2 = F2 & F2 is Disomorphism by A6;
    A92: f2 = F2_V by A89, A90, A91, MCART_1:def 12;
    then z1 <> z2 by A86, A87, A88, A91;
    then A93: h.z1 <> h.z2 by A1, FUNCT_1:def 4;
    h.z1 in S2 & h.z2 in S2 by A1, FUNCT_1:3;
    then the_Vertices_of h.z1 misses the_Vertices_of h.z2 by A93, Def18;
    then rng F1_V misses the_Vertices_of h.z2 by A86, GLIB_010:def 12;
    hence rng f1 misses rng f2 by A87, A91, A92, GLIB_010:def 12;
  end;
  then A94: f is one-to-one by GLIBPRE1:16;
  :: show g is one-to-one
  now
    let g1 be Function;
    assume g1 in E;
    then consider z1 being object such that
      A95: z1 in dom pr2 H & (pr2 H).z1 = g1 by FUNCT_1:def 3;
    A96: z1 in dom H by A95, MCART_1:def 13;
    then reconsider z1 as Element of S1;
    consider F1 being PGraphMapping of z1,h.z1 such that
      A97: H.z1 = F1 & F1 is Disomorphism by A6;
    A98: g1 = F1_E by A95, A96, A97, MCART_1:def 13;
    hence g1 is one-to-one by A97;
    let g2 be Function;
    assume A99: g2 in E & g1 <> g2;
    then consider z2 being object such that
      A100: z2 in dom pr2 H & (pr2 H).z2 = g2 by FUNCT_1:def 3;
    A101: z2 in dom H by A100, MCART_1:def 13;
    then reconsider z2 as Element of S1;
    consider F2 being PGraphMapping of z2,h.z2 such that
      A102: H.z2 = F2 & F2 is Disomorphism by A6;
    A103: g2 = F2_E by A100, A101, A102, MCART_1:def 13;
    then z1 <> z2 by A97, A98, A99, A102;
    then A104: h.z1 <> h.z2 by A1, FUNCT_1:def 4;
    h.z1 in S2 & h.z2 in S2 by A1, FUNCT_1:3;
    then the_Edges_of h.z1 misses the_Edges_of h.z2 by A104, Def19;
    then rng F1_E misses the_Edges_of h.z2 by A97, GLIB_010:def 12;
    hence rng g1 misses rng g2 by A98, A102, A103, GLIB_010:def 12;
  end;
  then A105: g is one-to-one by GLIBPRE1:16;
  :: verify the Disomorphism
  now
    hereby
      let e be object;
      assume e in dom g;
      then [e,g.e] in g by FUNCT_1:1;
      then consider Y being set such that
        A106: [e,g.e] in Y & Y in E by TARSKI:def 4;
      consider z being object such that
        A107: z in dom pr2 H & (pr2 H).z = Y by A106, FUNCT_1:def 3;
      A108: z in dom H by A107, MCART_1:def 13;
      then reconsider z as Element of S1;
      consider F being PGraphMapping of z,h.z such that
        A109: H.z = F & F is Disomorphism by A6;
      Y = F_E by A107, A108, A109, MCART_1:def 13;
      then A110: e in dom F_E by A106, FUNCT_1:1;
      then A111: (the_Source_of z).e in dom F_V &
        (the_Target_of z).e in dom F_V by GLIB_010:5;
      A112: e in the_Edges_of z & e is set by A110;
      set v = (the_Source_of G1).e, w = (the_Target_of G1).e;
      z is Subgraph of G1 by GLIB_014:21;
      then A113: v in dom F_V & w in dom F_V by A111, A112, GLIB_000:def 32;
      A114: F_V = (pr1 H).z by A108, A109, MCART_1:def 12;
      z in dom pr1 H by A108, MCART_1:def 12;
      then A115: F_V in V by A114, FUNCT_1:def 3; :: V = rng pr1 H
      [v,F_V.v] in F_V & [w,F_V.w] in F_V by A113, FUNCT_1:1;
      then [v,F_V.v] in f & [w,F_V.w] in f by A115, TARSKI:def 4;
      hence v in dom f & w in dom f by FUNCT_1:1;
    end;
    let e,v,w be object;
    assume e in dom g & v in dom f & w in dom f;
    assume e DJoins v,w,G1;
    then consider z being Element of S1 such that
      A116: e DJoins v,w,z by GLIBPRE1:116;
    consider F being PGraphMapping of z,h.z such that
      A117: H.z = F & F is Disomorphism by A6;
    e in the_Edges_of z by A116, GLIB_000:def 14;
    then A118: e in dom F_E by A117, GLIB_010:def 11;
    e Joins v,w,z by A116, GLIB_000:16;
    then v in the_Vertices_of z & w in the_Vertices_of z by GLIB_000:13;
    then A119: v in dom F_V & w in dom F_V by A117, GLIB_010:def 11;
    then A120: F_E.e DJoins F_V.v,F_V.w,h.z
      by A116, A117, A118, GLIB_010:def 14;
    h.z in S2 by A1, FUNCT_1:3;
    then A121: h.z is Subgraph of G2 by GLIB_014:21;
    A122: F_E.e DJoins F_V.v,F_V.w,G2 by A120, A121, GLIB_000:72;
    z in S1;
    then A123: z in dom H by PARTFUN1:def 2;
    then z in dom pr1 H by MCART_1:def 12;
    then A124: (pr1 H).z in V by FUNCT_1:3;
    z in dom pr2 H by A123, MCART_1:def 13;
    then A125: (pr2 H).z in E by FUNCT_1:3;
    F_V = (pr1 H).z by A117, A123, MCART_1:def 12;
    then A126: F_V.v = f.v & F_V.w = f.w by A119, A124, COMPUT_1:13;
    F_E = (pr2 H).z by A117, A123, MCART_1:def 13;
    then F_E.e = g.e by A118, A125, COMPUT_1:13;
    hence g.e DJoins f.v,f.w,G2 by A126, A122;
  end;
  then reconsider F = [f,g] as directed PGraphMapping of G1, G2
    by GLIB_010:30;
  F_V = f & F_E = g;
  then A127: F is one-to-one by A94, A105, GLIB_010:def 13;
  F_V = f & F_E = g;
  then F is total onto by A45, A59, A69, A83, GLIB_010:def 11, GLIB_010:def 12;
  hence thesis by A127, GLIB_010:def 24;
end;

theorem Th56:
  for S1, S2 being vertex-disjoint GraphUnionSet
  for G1 being (GraphUnion of S1), G2 being GraphUnion of S2
  st S1,S2 are_isomorphic
  ex S3 being vertex-disjoint GraphUnionSet, E being Subset of the_Edges_of G2,
    G3 being GraphUnion of S3
  st S1,S3 are_Disomorphic & G3 is reverseEdgeDirections of G2, E
proof
  let S1, S2 be vertex-disjoint GraphUnionSet;
  let G1 be (GraphUnion of S1), G2 be GraphUnion of S2;
  assume S1,S2 are_isomorphic;
  :: first get a function that associates each graph of S1 with an isomorphism
  then consider h being one-to-one Function such that
    A1: dom h = S1 & rng h = S2 and
    A2: for G being _Graph st G in S1 holds h.G is G-isomorphic _Graph;
  reconsider h as ManySortedSet of S1 by A1, RELAT_1:def 18, PARTFUN1:def 2;
  for x being object st x in dom h holds h.x is _Graph by A2;
  then reconsider h as Graph-yielding ManySortedSet of S1 by GLIB_000:def 53;
  defpred P0[object,object] means
    ex G being Element of S1, F being PGraphMapping of G, h.G
    st $1 = G & $2 = F & F is isomorphism;
  A3: for G being Element of S1 ex F being object st P0[G,F]
  proof
    let G be Element of S1;
    h.G is G-isomorphic by A2;
    then consider F being PGraphMapping of G, h.G such that
      A4: F is isomorphism by GLIB_010:def 23;
    take F,G,F;
    thus thesis by A4;
  end;
  consider H being ManySortedSet of S1 such that
    A5: for G being Element of S1 holds P0[G,H.G] from PBOOLE:sch 6(A3);
  A6: for G being Element of S1 ex F being PGraphMapping of G, h.G st
    H.G = F & F is isomorphism
  proof
    let G be Element of S1;
    consider G9 being Element of S1, F being PGraphMapping of G9, h.G9
      such that A7: G = G9 & H.G = F & F is isomorphism by A5;
    thus thesis by A7;
  end;
  :: associate every graph with the set of edges to be changed
  defpred P1[object,object] means
    ex G being Element of S1, E being Subset of the_Edges_of h.G
    st $1 = G & $2 = E & for G9 being reverseEdgeDirections of h.G, E
    ex F being PGraphMapping of G,G9 st F = H.G & F is Disomorphism;
  A8: for G being Element of S1 ex E being object st P1[G,E]
  proof
    let G be Element of S1;
    consider F0 being PGraphMapping of G, h.G such that
      A9: H.G = F0 & F0 is isomorphism by A6;
    F0_E is one-to-one by A9;
    then consider E being Subset of the_Edges_of h.G such that
      A10: for G9 being reverseEdgeDirections of h.G, E
        ex F being PGraphMapping of G, G9 st F = F0 & F is directed &
          (F0 is weak_SG-embedding implies F is weak_SG-embedding) &
          (F0 is strong_SG-embedding implies F is strong_SG-embedding) &
          (F0 is isomorphism implies F is isomorphism) by GLIBPRE0:87;
    take E,G,E;
    thus G = G & E = E;
    let G9 be reverseEdgeDirections of h.G, E;
    consider F being PGraphMapping of G, G9 such that
      A11: F = F0 & F is directed and
      (F0 is weak_SG-embedding implies F is weak_SG-embedding) &
      (F0 is strong_SG-embedding implies F is strong_SG-embedding) and
      A12: F0 is isomorphism implies F is isomorphism by A10;
    take F;
    thus thesis by A9, A11, A12;
  end;
  consider A being ManySortedSet of S1 such that
    A13: for G being Element of S1 holds P1[G,A.G] from PBOOLE:sch 6(A8);
  A14: for G being Element of S1 holds A.G is Subset of the_Edges_of h.G
  proof
    let G be Element of S1;
    consider G0 being Element of S1, E0 being Subset of the_Edges_of h.G0
      such that A15: G = G0 & A.G = E0 and
      for G9 being reverseEdgeDirections of h.G0, E0
      ex F being PGraphMapping of G0,G9 st F = H.G0 & F is Disomorphism by A13;
    thus thesis by A15;
  end;
  A16: for G being Element of S1, G9 being reverseEdgeDirections of h.G, A.G
    ex F being PGraphMapping of G,G9 st F = H.G & F is Disomorphism
  proof
    let G be Element of S1;
    consider G0 being Element of S1, E0 being Subset of the_Edges_of h.G0
      such that A17: G = G0 & A.G = E0 and
      A18: for G9 being reverseEdgeDirections of h.G0, E0
      ex F being PGraphMapping of G0,G9 st F = H.G0 & F is Disomorphism by A13;
    thus thesis by A17, A18;
  end;
  :: associate every graph with a graph with the appropriate edges reversed
  deffunc P2(Element of S1) = the reverseEdgeDirections of h.$1, A.$1;
  consider B being ManySortedSet of S1 such that
    A19: for G being Element of S1 holds B.G = P2(G) from PBOOLE:sch 5;
  now
    let x be object;
    assume x in dom B;
    then reconsider G = x as Element of S1;
    B.G = the reverseEdgeDirections of h.G, A.G by A19;
    hence B.x is _Graph;
  end;
  then reconsider B as Graph-yielding ManySortedSet of S1 by GLIB_000:def 53;
  :: rng B is the needed set S3, confirm properties
  now
    let x1, x2 be object;
    assume A20: x1 in dom B & x2 in dom B & B.x1 = B.x2;
    then reconsider H1 = x1 as Element of S1;
    reconsider H2 = x2 as Element of S1 by A20;
    H1 in S1 & H2 in S1;
    then A21: x1 in dom h & x2 in dom h by A1;
    then A22: h.x1 in S2 & h.x2 in S2 by A1, FUNCT_1:3;
    B.H1 = the reverseEdgeDirections of h.H1, A.H1 by A19;
    then A23: the_Vertices_of B.H1 = the_Vertices_of h.H1 by GLIB_007:4;
    B.H2 = the reverseEdgeDirections of h.H2, A.H2 by A19;
    then the_Vertices_of h.H1 = the_Vertices_of h.H2 by A20, A23, GLIB_007:4;
    hence x1 = x2 by A21, A22, Def18, FUNCT_1:def 4;
  end;
  then A24: B is one-to-one by FUNCT_1:def 4;
  now
    let H3, H4 be _Graph;
    assume A25: H3 in rng B & H4 in rng B & H3 <> H4;
    then consider H1 being object such that
      A26: H1 in dom B & B.H1 = H3 by FUNCT_1:def 3;
    consider H2 being object such that
      A27: H2 in dom B & B.H2 = H4 by A25, FUNCT_1:def 3;
    reconsider H1, H2 as Element of S1 by A26, A27;
    B.H1 = the reverseEdgeDirections of h.H1, A.H1 by A19;
    then A28: the_Vertices_of B.H1 = the_Vertices_of h.H1 by GLIB_007:4;
    B.H2 = the reverseEdgeDirections of h.H2, A.H2 by A19;
    then A29: the_Vertices_of B.H2 = the_Vertices_of h.H2 by GLIB_007:4;
    A30: h.H1 in S2 & h.H2 in S2 by A1, FUNCT_1:3;
    H1 <> H2 by A25, A26, A27;
    then h.H1 <> h.H2 by A1, FUNCT_1:def 4;
    then the_Vertices_of h.H1 misses the_Vertices_of h.H2 by A30, Def18;
    hence the_Vertices_of H3 misses the_Vertices_of H4 by A26, A27, A28, A29;
  end;
  then A31: rng B is vertex-disjoint;
  now
    let H3, H4 be _Graph;
    assume A32: H3 in rng B & H4 in rng B & H3 <> H4;
    then consider H1 being object such that
      A33: H1 in dom B & B.H1 = H3 by FUNCT_1:def 3;
    consider H2 being object such that
      A34: H2 in dom B & B.H2 = H4 by A32, FUNCT_1:def 3;
    reconsider H1, H2 as Element of S1 by A33, A34;
    B.H1 = the reverseEdgeDirections of h.H1, A.H1 by A19;
    then A35: the_Edges_of B.H1 = the_Edges_of h.H1 by GLIB_007:4;
    B.H2 = the reverseEdgeDirections of h.H2, A.H2 by A19;
    then A36: the_Edges_of B.H2 = the_Edges_of h.H2 by GLIB_007:4;
    A37: h.H1 in S2 & h.H2 in S2 by A1, FUNCT_1:3;
    H1 <> H2 by A32, A33, A34;
    then h.H1 <> h.H2 by A1, FUNCT_1:def 4;
    then the_Edges_of h.H1 misses the_Edges_of h.H2 by A37, Def19;
    hence the_Edges_of H3 misses the_Edges_of H4 by A33, A34, A35, A36;
  end;
  then A38: rng B is edge-disjoint;
  dom B = S1 by PARTFUN1:def 2;
  then B is non empty;
  then reconsider S3 = rng B as vertex-disjoint GraphUnionSet by A31, A38;
  for y being object st y in union rng A holds y in the_Edges_of G2
  proof
    let y be object;
    assume y in union rng A;
    then consider Y being set such that
      A39: y in Y & Y in rng A by TARSKI:def 4;
    consider x being object such that
      A40: x in dom A & A.x = Y by A39, FUNCT_1:def 3;
    reconsider x as Element of S1 by A40;
    consider G0 being Element of S1, E0 being Subset of the_Edges_of h.G0
      such that A41: x = G0 & A.x = E0 and
      for G9 being reverseEdgeDirections of h.G0, E0
      ex F being PGraphMapping of G0,G9 st F = H.G0 & F is Disomorphism by A13;
    y in E0 by A39, A40, A41;
    then A42: y in the_Edges_of h.x by A41;
    h.x in S2 by A1, FUNCT_1:3;
    then h.x is Subgraph of G2 by GLIB_014:21;
    then the_Edges_of h.x c= the_Edges_of G2 by GLIB_000:def 32;
    hence thesis by A42;
  end;
  then reconsider E = union rng A as Subset of the_Edges_of G2 by TARSKI:def 3;
  take S3, E, G3 = the GraphUnion of S3;
  now
    reconsider f = B as one-to-one Function by A24;
    take f;
    thus dom f = S1 & rng f = S3 by PARTFUN1:def 2;
    let G be _Graph;
    assume G in S1;
    then reconsider G0 = G as Element of S1;
    B.G0 = the reverseEdgeDirections of h.G0, A.G0 by A19;
    then consider F being PGraphMapping of G,B.G0 such that
      A43: F = H.G0 & F is Disomorphism by A16;
    thus f.G is G-Disomorphic _Graph by A43, GLIB_010:def 24;
  end;
  hence S1, S3 are_Disomorphic;
  :: reverseEdgeDirections properties
  now
    now
      let x be object;
      hereby
        assume x in the_Vertices_of S2;
        then consider G being _Graph such that
          A44: G in S2 & x = the_Vertices_of G by GLIB_014:def 14;
        consider z being object such that
          A45: z in dom h & h.z = G by A1, A44, FUNCT_1:def 3;
        reconsider z as Element of S1 by A45;
        z in dom B by A1, A45, PARTFUN1:def 2;
        then A46: B.z in rng B by FUNCT_1:3;
        B.z = the reverseEdgeDirections of h.z, A.z by A19;
        then the_Vertices_of B.z = x by A44, A45, GLIB_007:4;
        hence x in the_Vertices_of rng B by A46, GLIB_014:def 14;
      end;
      assume x in the_Vertices_of rng B;
      then consider G being _Graph such that
        A47: G in rng B & x = the_Vertices_of G by GLIB_014:def 14;
      consider z being object such that
        A48: z in dom B & B.z = G by A47, FUNCT_1:def 3;
      reconsider z as Element of S1 by A48;
      A49: h.z in S2 by A1, FUNCT_1:3;
      B.z = the reverseEdgeDirections of h.z, A.z by A19;
      then the_Vertices_of h.z = x by A47, A48, GLIB_007:4;
      hence x in the_Vertices_of S2 by A49, GLIB_014:def 14;
    end;
    then A50: the_Vertices_of S2 = the_Vertices_of rng B by TARSKI:2;
    thus the_Vertices_of G3 = union the_Vertices_of rng B
        by GLIB_014:def 25
      .= the_Vertices_of G2 by A50, GLIB_014:def 25;
    now
      let x be object;
      hereby
        assume x in the_Edges_of S2;
        then consider G being _Graph such that
          A51: G in S2 & x = the_Edges_of G by GLIB_014:def 15;
        consider z being object such that
          A52: z in dom h & h.z = G by A1, A51, FUNCT_1:def 3;
        reconsider z as Element of S1 by A52;
        z in dom B by A1, A52, PARTFUN1:def 2;
        then A53: B.z in rng B by FUNCT_1:3;
        B.z = the reverseEdgeDirections of h.z, A.z by A19;
        then the_Edges_of B.z = x by A51, A52, GLIB_007:4;
        hence x in the_Edges_of rng B by A53, GLIB_014:def 15;
      end;
      assume x in the_Edges_of rng B;
      then consider G being _Graph such that
        A54: G in rng B & x = the_Edges_of G by GLIB_014:def 15;
      consider z being object such that
        A55: z in dom B & B.z = G by A54, FUNCT_1:def 3;
      reconsider z as Element of S1 by A55;
      A56: h.z in S2 by A1, FUNCT_1:3;
      B.z = the reverseEdgeDirections of h.z, A.z by A19;
      then the_Edges_of h.z = x by A54, A55, GLIB_007:4;
      hence x in the_Edges_of S2 by A56, GLIB_014:def 15;
    end;
    then A57: the_Edges_of S2 = the_Edges_of rng B by TARSKI:2;
    thus A58: the_Edges_of G3 = union the_Edges_of rng B by GLIB_014:def 25
      .= the_Edges_of G2 by A57, GLIB_014:def 25;
    A59: dom the_Source_of G3 = the_Edges_of G3 by FUNCT_2:def 1
      .= the_Edges_of G2 \/ (the_Edges_of G2 /\ E) by A58, XBOOLE_1:22
      .= dom the_Source_of G2 \/ (the_Edges_of G2 /\ E) by FUNCT_2:def 1
      .= dom the_Source_of G2 \/ (dom the_Target_of G2 /\ E) by FUNCT_2:def 1
      .= dom the_Source_of G2 \/ (dom((the_Target_of G2)|E)) by RELAT_1:61
      .= dom(the_Source_of G2 +* ((the_Target_of G2) | E)) by FUNCT_4:def 1;
    now
      let x be object;
      assume x in dom the_Source_of G3;
      then x in the_Edges_of G3;
      then x in union the_Edges_of rng B by GLIB_014:def 25;
      then consider X be set such that
        A60: x in X & X in the_Edges_of rng B by TARSKI:def 4;
      consider G being _Graph such that
        A61: G in rng B & X = the_Edges_of G by A60, GLIB_014:def 15;
      consider z being object such that
        A62: z in dom B & B.z = G by A61, FUNCT_1:def 3;
      reconsider z as Element of S1 by A62;
      A63: z in dom h by A1;
      A64: h.z in S2 by A1, FUNCT_1:3;
      B.z in rng B by A62, FUNCT_1:3;
      then A65: the_Source_of B.z in the_Source_of rng B by GLIB_014:def 16;
      A66: B.z = the reverseEdgeDirections of h.z, A.z by A19;
      A67: A.z is Subset of the_Edges_of h.z by A14;
      A68: the_Source_of h.z in the_Source_of S2 by A64, GLIB_014:def 16;
      A69: the_Target_of h.z in the_Target_of S2 by A64, GLIB_014:def 17;
      A70: x in dom the_Source_of B.z by A60, A61, A62, FUNCT_2:def 1;
      A71: the_Edges_of B.z = the_Edges_of h.z by A66, GLIB_007:4;
      then A72: x in dom the_Source_of h.z by A60, A61, A62, FUNCT_2:def 1;
      A73: x in dom the_Target_of h.z by A60, A61, A62, A71, FUNCT_2:def 1;
      per cases;
      suppose A74: not x in A.z;
        then not x in the_Edges_of h.z /\ A.z by TARSKI:def 3, XBOOLE_1:17;
        then not x in dom the_Target_of h.z /\ A.z by FUNCT_2:def 1;
        then A75: not x in dom((the_Target_of h.z) | (A.z)) by RELAT_1:61;
        not x in E
        proof
          assume x in E;
          then consider Y being set such that
            A76: x in Y & Y in rng A by TARSKI:def 4;
          consider z9 being object such that
            A77: z9 in dom A & A.z9 = Y by A76, FUNCT_1:def 3;
          reconsider z9 as Element of S1 by A77;
          A78: x in A.z9 by A76, A77;
          A.z9 is Subset of the_Edges_of h.z9 by A14;
          then A79: x in the_Edges_of h.z9 by A78;
          A80: z9 in dom h by A1;
          A81: h.z9 in S2 by A1, FUNCT_1:3;
          the_Edges_of h.z = the_Edges_of G by A62, A66, GLIB_007:4;
          then x in the_Edges_of h.z by A60, A61;
          then the_Edges_of h.z meets the_Edges_of h.z9 by A79, XBOOLE_0:3;
          then z = z9 by A63, A64, A80, A81, Def19, FUNCT_1:def 4;
          hence contradiction by A74, A78;
        end;
        then not x in the_Edges_of G2 /\ E by TARSKI:def 3, XBOOLE_1:17;
        then not x in dom the_Target_of G2 /\ E by FUNCT_2:def 1;
        then A82: not x in dom((the_Target_of G2) | E) by RELAT_1:61;
        thus (the_Source_of G3).x
           = (union the_Source_of S3).x by GLIB_014:def 25
          .= (the_Source_of B.z).x by A65, A70, COMPUT_1:13
          .= ((the_Source_of h.z) +* ((the_Target_of h.z) | (A.z))).x
            by A66, A67, GLIB_007:def 1
          .= (the_Source_of h.z).x by A75, FUNCT_4:11
          .= (union the_Source_of S2).x by A68, A72, COMPUT_1:13
          .= (the_Source_of G2).x by GLIB_014:def 25
          .= (the_Source_of G2 +* ((the_Target_of G2) | E)).x
            by A82, FUNCT_4:11;
      end;
      suppose A83: x in A.z;
        then x in the_Edges_of h.z /\ A.z by A67, XBOOLE_1:28;
        then x in dom the_Target_of h.z /\ A.z by FUNCT_2:def 1;
        then A84: x in dom((the_Target_of h.z) | (A.z)) by RELAT_1:61;
        z in S1;
        then z in dom A by PARTFUN1:def 2;
        then A.z in rng A by FUNCT_1:3;
        then A85: x in E by A83, TARSKI:def 4;
        then x in the_Edges_of G2 /\ E by XBOOLE_1:28;
        then x in dom the_Target_of G2 /\ E by FUNCT_2:def 1;
        then A86: x in dom((the_Target_of G2) | E) by RELAT_1:61;
        thus (the_Source_of G3).x
           = (union the_Source_of S3).x by GLIB_014:def 25
          .= (the_Source_of B.z).x by A65, A70, COMPUT_1:13
          .= ((the_Source_of h.z) +* ((the_Target_of h.z) | (A.z))).x
            by A66, A67, GLIB_007:def 1
          .= ((the_Target_of h.z) | (A.z)).x by A84, FUNCT_4:13
          .= (the_Target_of h.z).x by A83, FUNCT_1:49
          .= (union the_Target_of S2).x by A69, A73, COMPUT_1:13
          .= (the_Target_of G2).x by GLIB_014:def 25
          .= ((the_Target_of G2) | E).x by A85, FUNCT_1:49
          .= (the_Source_of G2 +* ((the_Target_of G2) | E)).x
            by A86, FUNCT_4:13;
      end;
    end;
    hence the_Source_of G3 = the_Source_of G2 +* ((the_Target_of G2) | E)
      by A59, FUNCT_1:2;
    A87: dom the_Target_of G3 = the_Edges_of G3 by FUNCT_2:def 1
      .= the_Edges_of G2 \/ (the_Edges_of G2 /\ E) by A58, XBOOLE_1:22
      .= dom the_Target_of G2 \/ (the_Edges_of G2 /\ E) by FUNCT_2:def 1
      .= dom the_Target_of G2 \/ (dom the_Source_of G2 /\ E) by FUNCT_2:def 1
      .= dom the_Target_of G2 \/ (dom((the_Source_of G2)|E)) by RELAT_1:61
      .= dom(the_Target_of G2 +* ((the_Source_of G2) | E)) by FUNCT_4:def 1;
    now
      let x be object;
      assume x in dom the_Target_of G3;
      then x in the_Edges_of G3;
      then x in union the_Edges_of rng B by GLIB_014:def 25;
      then consider X be set such that
        A88: x in X & X in the_Edges_of rng B by TARSKI:def 4;
      consider G being _Graph such that
        A89: G in rng B & X = the_Edges_of G by A88, GLIB_014:def 15;
      consider z being object such that
        A90: z in dom B & B.z = G by A89, FUNCT_1:def 3;
      reconsider z as Element of S1 by A90;
      A91: z in dom h by A1;
      A92: h.z in S2 by A1, FUNCT_1:3;
      B.z in rng B by A90, FUNCT_1:3;
      then A93: the_Target_of B.z in the_Target_of rng B by GLIB_014:def 17;
      A94: B.z = the reverseEdgeDirections of h.z, A.z by A19;
      A95: A.z is Subset of the_Edges_of h.z by A14;
      A96: the_Target_of h.z in the_Target_of S2 by A92, GLIB_014:def 17;
      A97: the_Source_of h.z in the_Source_of S2 by A92, GLIB_014:def 16;
      A98: x in dom the_Target_of B.z by A88, A89, A90, FUNCT_2:def 1;
      A99: the_Edges_of B.z = the_Edges_of h.z by A94, GLIB_007:4;
      then A100: x in dom the_Target_of h.z by A88, A89, A90, FUNCT_2:def 1;
      A101: x in dom the_Source_of h.z by A88, A89, A90, A99, FUNCT_2:def 1;
      per cases;
      suppose A102: not x in A.z;
        then not x in the_Edges_of h.z /\ A.z by TARSKI:def 3, XBOOLE_1:17;
        then not x in dom the_Source_of h.z /\ A.z by FUNCT_2:def 1;
        then A103: not x in dom((the_Source_of h.z) | (A.z)) by RELAT_1:61;
        not x in E
        proof
          assume x in E;
          then consider Y being set such that
            A104: x in Y & Y in rng A by TARSKI:def 4;
          consider z9 being object such that
            A105: z9 in dom A & A.z9 = Y by A104, FUNCT_1:def 3;
          reconsider z9 as Element of S1 by A105;
          A106: x in A.z9  by A104, A105;
          A.z9 is Subset of the_Edges_of h.z9 by A14;
          then A107: x in the_Edges_of h.z9 by A106;
          A108: z9 in dom h by A1;
          A109: h.z9 in S2 by A1, FUNCT_1:3;
          the_Edges_of h.z = the_Edges_of G by A90, A94, GLIB_007:4;
          then x in the_Edges_of h.z by A88, A89;
          then the_Edges_of h.z meets the_Edges_of h.z9 by A107, XBOOLE_0:3;
          then z = z9 by A91, A92, A108, A109, Def19, FUNCT_1:def 4;
          hence contradiction by A102, A106;
        end;
        then not x in the_Edges_of G2 /\ E by TARSKI:def 3, XBOOLE_1:17;
        then not x in dom the_Source_of G2 /\ E by FUNCT_2:def 1;
        then A110: not x in dom((the_Source_of G2) | E) by RELAT_1:61;
        thus (the_Target_of G3).x
           = (union the_Target_of S3).x by GLIB_014:def 25
          .= (the_Target_of B.z).x by A93, A98, COMPUT_1:13
          .= ((the_Target_of h.z) +* ((the_Source_of h.z) | (A.z))).x
            by A94, A95, GLIB_007:def 1
          .= (the_Target_of h.z).x by A103, FUNCT_4:11
          .= (union the_Target_of S2).x by A96, A100, COMPUT_1:13
          .= (the_Target_of G2).x by GLIB_014:def 25
          .= (the_Target_of G2 +* ((the_Source_of G2) | E)).x
            by A110, FUNCT_4:11;
      end;
      suppose A111: x in A.z;
        then x in the_Edges_of h.z /\ A.z by A95, XBOOLE_1:28;
        then x in dom the_Source_of h.z /\ A.z by FUNCT_2:def 1;
        then A112: x in dom((the_Source_of h.z) | (A.z)) by RELAT_1:61;
        z in S1;
        then z in dom A by PARTFUN1:def 2;
        then A.z in rng A by FUNCT_1:3;
        then A113: x in E by A111, TARSKI:def 4;
        then x in the_Edges_of G2 /\ E by XBOOLE_1:28;
        then x in dom the_Source_of G2 /\ E by FUNCT_2:def 1;
        then A114: x in dom((the_Source_of G2) | E) by RELAT_1:61;
        thus (the_Target_of G3).x
           = (union the_Target_of S3).x by GLIB_014:def 25
          .= (the_Target_of B.z).x by A93, A98, COMPUT_1:13
          .= ((the_Target_of h.z) +* ((the_Source_of h.z) | (A.z))).x
            by A94, A95, GLIB_007:def 1
          .= ((the_Source_of h.z) | (A.z)).x by A112, FUNCT_4:13
          .= (the_Source_of h.z).x by A111, FUNCT_1:49
          .= (union the_Source_of S2).x by A97, A101, COMPUT_1:13
          .= (the_Source_of G2).x by GLIB_014:def 25
          .= ((the_Source_of G2) | E).x by A113, FUNCT_1:49
          .= (the_Target_of G2 +* ((the_Source_of G2) | E)).x
            by A114, FUNCT_4:13;
      end;
    end;
    hence the_Target_of G3 = the_Target_of G2 +* ((the_Source_of G2) | E)
      by A87, FUNCT_1:2;
  end;
  hence G3 is reverseEdgeDirections of G2, E by GLIB_007:def 1;
end;

theorem Th57:
  for S1, S2 being vertex-disjoint GraphUnionSet
  for G1 being (GraphUnion of S1), G2 being GraphUnion of S2
  st S1,S2 are_isomorphic holds G2 is G1-isomorphic
proof
  let S1, S2 be vertex-disjoint GraphUnionSet, G1 be GraphUnion of S1;
  let G2 be GraphUnion of S2;
  assume S1,S2 are_isomorphic;
  then consider S3 being vertex-disjoint GraphUnionSet,
      E being Subset of the_Edges_of G2, G3 being GraphUnion of S3 such that
    A1: S1,S3 are_Disomorphic and
    A2: G3 is reverseEdgeDirections of G2, E by Th56;
  A3: G3 is G1-Disomorphic by A1, Th55;
  G3 is G2-isomorphic by A2, GLIBPRE0:78;
  then G2 is G3-isomorphic by GLIB_010:95;
  hence thesis by A3;
end;

theorem Th58:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S
  for W being Walk of G ex H being Element of S st W is Walk of H
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  defpred P[Walk of G] means ex H being Element of S st $1 is Walk of H;
  A1: for W being trivial Walk of G holds P[W]
  proof
    let W be trivial Walk of G;
    consider v being Vertex of G such that
      A2: W = G.walkOf(v) by GLIB_001:128;
    the_Vertices_of G = union the_Vertices_of S by GLIB_014:def 25;
    then consider X being set such that
      A3: v in X & X in the_Vertices_of S by TARSKI:def 4;
    consider H being _Graph such that
      A4: H in S & X = the_Vertices_of H by A3, GLIB_014:def 14;
    reconsider H as Element of S by A4;
    take H;
    reconsider w = v as Vertex of H by A3, A4;
    W = <* w *> by A2, GLIB_001:def 4
      .= H.walkOf(w) by GLIB_001:def 4;
    hence thesis;
  end;
  A5: for W being Walk of G, e being object
    st e in W.last().edgesInOut() & P[W] holds P[W.addEdge(e)]
  proof
    let W be Walk of G, e be object;
    assume A6: e in W.last().edgesInOut() & P[W];
    then consider H being Element of S such that
      A7: W is Walk of H;
    reconsider H9 = H as Subgraph of G by GLIB_014:21;
    reconsider W9 = W as Walk of H9 by A7;
    A8: W.last() = W9.last() by GLIB_001:16;
    e Joins W.last(),W.last().adj(e),G by A6, GLIB_000:67;
    then consider H0 being Element of S such that
      A9: e Joins W.last(),W.last().adj(e),H0 by GLIBPRE1:117;
    W9.last() in the_Vertices_of H0 by A8, A9, GLIB_000:13;
    then the_Vertices_of H meets the_Vertices_of H0 by XBOOLE_0:3;
    then e Joins W9.last(),W.last().adj(e),H9 by A8, A9, Def18;
    then e in W9.last().edgesInOut() by GLIB_000:62;
    then W.addEdge(e) = W9.addEdge(e) by GLIB_001:174;
    hence thesis;
  end;
  for W being Walk of G holds P[W] from GLIB_009:sch 1(A1,A5);
  hence thesis;
end;

theorem Th59:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S
  st G is connected ex H being _Graph st S = {H}
proof
  let S be vertex-disjoint GraphUnionSet, G being GraphUnion of S;
  assume A1: G is connected;
  set v = the Vertex of G;
  the_Vertices_of G = union the_Vertices_of S by GLIB_014:def 25;
  then consider X being set such that
    A2: v in X & X in the_Vertices_of S by TARSKI:def 4;
  consider H being _Graph such that
    A3: H in S & X = the_Vertices_of H by A2, GLIB_014:def 14;
  take H;
  now
    let x be object;
    assume x in the_Vertices_of G;
    then reconsider w = x as Vertex of G;
    consider W being Walk of G such that
      A4: W is_Walk_from v,w by A1, GLIB_002:def 1;
    consider H9 being Element of S such that
      A5: W is Walk of H9 by Th58;
    reconsider W9 = W as Walk of H9 by A5;
    W9 is_Walk_from v,w by A4, GLIB_001:19;
    then A6: v is Vertex of H9 & w is Vertex of H9 by GLIB_001:18;
    then the_Vertices_of H meets the_Vertices_of H9 by A2, A3, XBOOLE_0:3;
    then H = H9 by A3, Def18;
    hence x in the_Vertices_of H by A6;
  end;
  then A7: the_Vertices_of G c= the_Vertices_of H by TARSKI:def 3;
  now
    let Y be object;
    assume Y in S;
    then reconsider H9 = Y as Element of S;
    set w = the Vertex of H9;
    H9 is Subgraph of G by GLIB_014:21;
    then the_Vertices_of H9 c= the_Vertices_of G by GLIB_000:def 32;
    then w in the_Vertices_of G by TARSKI:def 3;
    then the_Vertices_of H meets the_Vertices_of H9 by A7, XBOOLE_0:3;
    then Y = H by A3, Def18;
    hence Y in {H} by TARSKI:def 1;
  end;
  hence thesis by TARSKI:def 3, ZFMISC_1:33;
end;

theorem Th60:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S holds
    (S is non-multi iff G is non-multi) &
    (S is non-Dmulti iff G is non-Dmulti) &
    (S is acyclic iff G is acyclic)
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  :: non-multi
  hereby
    assume A1: S is non-multi;
    now
      let e1,e2,v1,v2 be object;
      assume A2: e1 Joins v1,v2,G & e2 Joins v1,v2,G;
      then consider H1 being Element of S such that
        A3: e1 Joins v1,v2,H1 by GLIBPRE1:117;
      consider H2 being Element of S such that
        A4: e2 Joins v1,v2,H2 by A2, GLIBPRE1:117;
      v1 in the_Vertices_of H1 & v1 in the_Vertices_of H2
        by A3, A4, GLIB_000:13;
      then e2 Joins v1,v2,H1 by A4, Def18, XBOOLE_0:3;
      hence e1 = e2 by A1, A3, GLIB_000:def 20;
    end;
    hence G is non-multi by GLIB_000:def 20;
  end;
  hereby
    assume A5: G is non-multi;
    now
      let H be _Graph;
      assume H in S;
      then H is Subgraph of G by GLIB_014:21;
      hence H is non-multi by A5;
    end;
    hence S is non-multi by GLIB_014:def 4;
  end;
  :: non-Dmulti
  hereby
    assume A6: S is non-Dmulti;
    now
      let e1,e2,v1,v2 be object;
      assume A7: e1 DJoins v1,v2,G & e2 DJoins v1,v2,G;
      then consider H1 being Element of S such that
        A8: e1 DJoins v1,v2,H1 by GLIBPRE1:116;
      consider H2 being Element of S such that
        A9: e2 DJoins v1,v2,H2 by A7, GLIBPRE1:116;
      e1 Joins v1,v2,H1 & e2 Joins v1,v2,H2 by A8, A9, GLIB_000:16;
      then v1 in the_Vertices_of H1 & v1 in the_Vertices_of H2
        by GLIB_000:13;
      then e2 DJoins v1,v2,H1 by A9, Def18, XBOOLE_0:3;
      hence e1 = e2 by A6, A8, GLIB_000:def 21;
    end;
    hence G is non-Dmulti by GLIB_000:def 21;
  end;
  hereby
    assume A10: G is non-Dmulti;
    now
      let H be _Graph;
      assume H in S;
      then H is Subgraph of G by GLIB_014:21;
      hence H is non-Dmulti by A10;
    end;
    hence S is non-Dmulti by GLIB_014:def 5;
  end;
  :: acyclic
  hereby
    assume A11: S is acyclic;
    assume G is non acyclic;
    then consider W being Walk of G such that
      A12: W is Cycle-like by GLIB_002:def 2;
    consider H being Element of S such that
      A13: W is Walk of H by Th58;
    reconsider W9 = W as Walk of H by A13;
    W9 is Cycle-like by A12, GLIB_006:24;
    hence contradiction by A11, GLIB_002:def 2;
  end;
  hereby
    assume A14: G is acyclic;
    now
      let H be _Graph;
      assume H in S;
      then H is Subgraph of G by GLIB_014:21;
      hence H is acyclic by A14;
    end;
    hence S is acyclic by GLIB_014:def 8;
  end;
end;

theorem
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S holds
    (S is simple iff G is simple) &
    (S is Dsimple iff G is Dsimple)
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  hereby
    assume S is simple;
    then G is loopless non-multi by Th60;
    hence G is simple;
  end;
  hereby
    assume G is simple;
    then G is loopless non-multi;
    then S is loopless non-multi by Th60, GLIB_014:23;
    hence S is simple;
  end;
  hereby
    assume S is Dsimple;
    then G is loopless non-Dmulti by Th60;
    hence G is Dsimple;
  end;
  hereby
    assume G is Dsimple;
    then S is loopless non-Dmulti by Th60, GLIB_014:23;
    hence S is Dsimple;
  end;
end;

registration
  let S be vertex-disjoint non-multi GraphUnionSet;
  cluster -> non-multi for GraphUnion of S;
  coherence by Th60;
end;

registration
  let S be vertex-disjoint non-Dmulti GraphUnionSet;
  cluster -> non-Dmulti for GraphUnion of S;
  coherence by Th60;
end;

registration
  let S be vertex-disjoint simple GraphUnionSet;
  cluster -> simple for GraphUnion of S;
  coherence;
end;

registration
  let S be vertex-disjoint Dsimple GraphUnionSet;
  cluster -> Dsimple for GraphUnion of S;
  coherence;
end;

registration
  let S be vertex-disjoint acyclic GraphUnionSet;
  cluster -> acyclic for GraphUnion of S;
  coherence by Th60;
end;

theorem Th62:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S
  for H being Element of S holds H is inducedSubgraph of G, the_Vertices_of H
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  let H be Element of S;
  A1: H is Subgraph of G by GLIB_014:21;
  then A2: the_Vertices_of H is non empty Subset of the_Vertices_of G
    by GLIB_000:def 32;
  now
    let x be object;
    hereby
      set v = (the_Source_of H).x, w = (the_Target_of H).x;
      assume x in the_Edges_of H;
      then A3: x Joins v,w,H by GLIB_000:def 13;
      then A4: v in the_Vertices_of H & w in the_Vertices_of H by GLIB_000:13;
      x Joins v,w,G by A1, A3, GLIB_000:72;
      hence x in G.edgesBetween(the_Vertices_of H) by A4, GLIB_000:32;
    end;
    set v = (the_Source_of G).x, w = (the_Target_of G).x;
    assume x in G.edgesBetween(the_Vertices_of H);
    then A5: v in the_Vertices_of H & x in the_Edges_of G by GLIB_000:31;
    then x Joins v,w,G by GLIB_000:def 13;
    then consider H9 being Element of S such that
      A6: x Joins v,w,H9 by GLIBPRE1:117;
    v in the_Vertices_of H9 by A6, GLIB_000:13;
    then H = H9 by A5, Def18, XBOOLE_0:3;
    hence x in the_Edges_of H by A6, GLIB_000:def 13;
  end;
  then the_Edges_of H = G.edgesBetween(the_Vertices_of H) by TARSKI:2;
  hence thesis by A1, A2, GLIB_000:def 37;
end;

theorem Th63:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S holds
    (S is chordal iff G is chordal) &
    (S is loopfull iff G is loopfull)
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  :: chordal
  hereby
    assume A1: S is chordal;
    now
      let W be Walk of G;
      assume A2: W.length() > 3 & W is Cycle-like;
      now
        consider H being Element of S such that
          A3: W is Walk of H by Th58;
        reconsider W9 = W as Walk of H by A3;
        W9.length() > 3 & W9 is Cycle-like by A2, GLIB_001:114, GLIB_006:24;
        then W9 is chordal by A1, CHORD:def 11;
        then consider m, n being odd Nat such that
          A4: m+2 < n & n <= len W9 & W9.m <> W9.n and
          A5: ex e being object st e Joins W9.m,W9.n,H and
          A6: for f being object st f in W9.edges()
            holds not f Joins W9.m,W9.n,H by CHORD:def 10;
        take m, n;
        thus m+2 < n & n <= len W & W.m <> W.n by A4;
        hereby
          consider e being object such that
            A7: e Joins W9.m,W9.n,H by A5;
          take e;
          H is Subgraph of G by GLIB_014:21;
          hence e Joins W.m,W.n,G by A7, GLIB_000:72;
        end;
        let f be object;
        assume A8: f in W.edges();
        W.edges() = rng W.edgeSeq() by GLIB_001:def 17
          .= rng W9.edgeSeq() by GLIB_001:86
          .= W9.edges() by GLIB_001:def 17;
        then A9: not f Joins W9.m,W9.n,H by A6, A8;
        assume f Joins W.m,W.n,G;
        then consider H9 being Element of S such that
          A10: f Joins W.m,W.n,H9 by GLIBPRE1:117;
        A11: W.n in the_Vertices_of H9 by A10, GLIB_000:13;
        n is odd Element of NAT by ORDINAL1:def 12;
        then W9.n in the_Vertices_of H by A4, GLIB_001:7;
        then H = H9 by A11, Def18, XBOOLE_0:3;
        hence contradiction by A9, A10;
      end;
      hence W is chordal by CHORD:def 10;
    end;
    hence G is chordal by CHORD:def 11;
  end;
  hereby
    assume A12: G is chordal;
    now
      let H be _Graph;
      assume H in S;
      then H is inducedSubgraph of G, the_Vertices_of H by Th62;
      hence H is chordal by A12;
    end;
    hence S is chordal by GLIB_014:def 11;
  end;
  :: loopfull
  thus S is loopfull implies G is loopfull;
  hereby
    assume A13: G is loopfull;
    now
      let H be _Graph;
      assume A14: H in S;
      now
        let v be Vertex of H;
        H is Subgraph of G by A14, GLIB_014:21;
        then the_Vertices_of H c= the_Vertices_of G by GLIB_000:def 32;
        then reconsider w = v as Vertex of G by TARSKI:def 3;
        consider e being object such that
          A15: e Joins w,w,G by A13, GLIB_012:def 1;
        consider H9 being Element of S such that
          A16: e Joins w,w,H9 by A15, GLIBPRE1:117;
        take e;
        w in the_Vertices_of H9 by A16, GLIB_000:13;
        then H = H9 by A14, Def18, XBOOLE_0:3;
        hence e Joins v,v,H by A16;
      end;
      hence H is loopfull by GLIB_012:def 1;
    end;
    hence S is loopfull by GLIB_014:def 13;
  end;
end;

theorem Th64:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S
  for H being Element of S, v being Vertex of G, w being Vertex of H
  st v = w holds G.reachableFrom(v) = H.reachableFrom(w)
proof
  let S be vertex-disjoint GraphUnionSet, G being GraphUnion of S;
  let H be Element of S, v be Vertex of G, w being Vertex of H;
  assume A1: v = w;
  H is Subgraph of G by GLIB_014:21;
  then A2: H.reachableFrom(w) c= G.reachableFrom(v) by A1, GLIB_002:14;
  now
    let x be object;
    assume x in G.reachableFrom(v);
    then consider W being Walk of G such that
      A3: W is_Walk_from v,x by GLIB_002:def 5;
    consider H9 being Element of S such that
      A4: W is Walk of H9 by Th58;
    reconsider W9 = W as Walk of H9 by A4;
    A5: W9 is_Walk_from v,x by A3, GLIB_001:19;
    then v is Vertex of H9 & x is Vertex of H9 by GLIB_001:18;
    then the_Vertices_of H meets the_Vertices_of H9 by A1, XBOOLE_0:3;
    then reconsider W0 = W9 as Walk of H by Def18;
    W0 is_Walk_from w,x by A1, A5, GLIB_001:19;
    hence x in H.reachableFrom(w) by GLIB_002:def 5;
  end;
  then G.reachableFrom(v) c= H.reachableFrom(w) by TARSKI:def 3;
  hence thesis by A2, XBOOLE_0:def 10;
end;

theorem Th65:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S
  holds G.componentSet()
    = union the set of all H.componentSet() where H is Element of S
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  now
    let x be object;
    hereby
      assume x in G.componentSet();
      then consider v being Vertex of G such that
        A1: x = G.reachableFrom(v) by GLIB_002:def 8;
      the_Vertices_of G = union the_Vertices_of S by GLIB_014:def 25;
      then consider X being set such that
        A2: v in X & X in the_Vertices_of S by TARSKI:def 4;
      consider H9 being _Graph such that
        A3: H9 in S & X = the_Vertices_of H9 by A2, GLIB_014:def 14;
      reconsider w = v as Vertex of H9 by A2, A3;
      H9.reachableFrom(w) = x by A1, A3, Th64;
      then A4: x in H9.componentSet() by GLIB_002:def 8;
      H9.componentSet() in the set of all H.componentSet()
        where H is Element of S by A3;
      hence x in union the set of all H.componentSet() where H is Element of S
        by A4, TARSKI:def 4;
    end;
    assume x in union the set of all H.componentSet() where H is Element of S;
    then consider X being set such that
      A5: x in X & X in the set of all H.componentSet() where H is Element of S
      by TARSKI:def 4;
    consider H being Element of S such that
      A6: X = H.componentSet() by A5;
    consider w being Vertex of H such that
      A7: x = H.reachableFrom(w) by A5, A6, GLIB_002:def 8;
    H is Subgraph of G by GLIB_014:21;
    then the_Vertices_of H c= the_Vertices_of G by GLIB_000:def 32;
    then reconsider v = w as Vertex of G by TARSKI:def 3;
    x = G.reachableFrom(v) by A7, Th64;
    hence x in G.componentSet() by GLIB_002:def 8;
  end;
  hence thesis by TARSKI:2;
end;

theorem Th66:
  for S being vertex-disjoint non empty Graph-membered set
  holds the set of all H.componentSet() where H is Element of S
    is mutually-disjoint
proof
  let S be vertex-disjoint non empty Graph-membered set;
  set M = the set of all H.componentSet() where H is Element of S;
  now
    let x,y be set;
    assume x in M;
    then consider H1 being Element of S such that
      A1: x = H1.componentSet();
    assume y in M;
    then consider H2 being Element of S such that
      A2: y = H2.componentSet();
    assume A3: x <> y;
    assume x meets y;
    then consider z being object such that
      A4: z in H1.componentSet() & z in H2.componentSet()
      by A1, A2, XBOOLE_0:3;
    reconsider z as set by TARSKI:1;
    A5: the_Vertices_of H1 misses the_Vertices_of H2 by A1, A2, A3, Def18;
    z c= the_Vertices_of H1 /\ the_Vertices_of H2 by A4, XBOOLE_1:19;
    then z c= {} by A5, XBOOLE_0:def 7;
    hence contradiction by A4;
  end;
  hence thesis by TAXONOM2:def 5;
end;

Lm2:
  for S being vertex-disjoint non empty Graph-membered set
  holds card S = card the set of all H.componentSet() where H is Element of S
proof
  let S be vertex-disjoint non empty Graph-membered set;
  deffunc F(Element of S) = $1.componentSet();
  consider f being ManySortedSet of S such that
    A1: for H being Element of S holds f.H = F(H) from PBOOLE:sch 5;
  A2: dom f = S by PARTFUN1:def 2;
  set M = the set of all H.componentSet() where H is Element of S;
  now
    let y be object;
    hereby
      assume y in rng f;
      then consider x being object such that
        A3: x in dom f & f.x = y by FUNCT_1:def 3;
      reconsider x as Element of S by A3;
      y = x.componentSet() by A1, A3;
      hence y in M;
    end;
    assume y in M;
    then consider H being Element of S such that
      A4: y = H.componentSet();
    f.H in rng f by A2, FUNCT_1:3;
    hence y in rng f by A1, A4;
  end;
  then A5: rng f = M by TARSKI:2;
  now
    let x1,x2 be object;
    assume A6: x1 in dom f & x2 in dom f & f.x1 = f.x2;
    then reconsider H1 = x1, H2 = x2 as Element of S;
    set V = the Element of H1.componentSet();
    f.x1 = H1.componentSet() & f.x2 = H2.componentSet() by A1;
    then V in H1.componentSet() & V in H2.componentSet() by A6;
    then A7: V c= the_Vertices_of H1 /\ the_Vertices_of H2 by XBOOLE_1:19;
    the_Vertices_of H1 /\ the_Vertices_of H2 <> {} by A7;
    hence x1 = x2 by Def18, XBOOLE_0:def 7;
  end;
  hence thesis by A2, A5, FUNCT_1:def 4, CARD_1:70;
end;

theorem Th67:
  for S being non empty connected Graph-membered set
  holds the set of all H.componentSet() where H is Element of S
    = SmallestPartition the_Vertices_of S
proof
  let S be non empty connected Graph-membered set;
  set M1 = the set of all H.componentSet() where H is Element of S;
  set M2 = the set of all {X} where X is Element of the_Vertices_of S;
  now
    let x be object;
    hereby
      assume x in M1;
      then consider H being Element of S such that
        A1: x = H.componentSet();
      A2: x = {the_Vertices_of H} by A1, GLIB_002:25;
      the_Vertices_of H in the_Vertices_of S by GLIB_014:def 14;
      hence x in M2 by A2;
    end;
    assume x in M2;
    then consider X being Element of the_Vertices_of S such that
      A3: x = {X};
    consider H being _Graph such that
      A4: H in S & X = the_Vertices_of H by GLIB_014:def 14;
    reconsider H as Element of S by A4;
    x = H.componentSet() by A3, A4, GLIB_002:25;
    hence x in M1;
  end;
  then M1 = M2 by TARSKI:2;
  hence thesis by EQREL_1:37;
end;

:: this is probably somewhere
Lm3:
  for X being non empty set holds 1 c= card X
proof
  let X be non empty set;
  assume not 1 c= card X;
  then card X in {0} by ORDINAL1:16, CARD_1:49;
  hence contradiction by TARSKI:def 1;
end;

theorem Th68:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S
  holds card S c= G.numComponents()
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  set M = the set of all H.componentSet() where H is Element of S;
  now
    thus M is mutually-disjoint by Th66;
    thus card S c= card M by Lm2;
    let Y be set;
    assume Y in M;
    then consider H being Element of S such that
      A1: Y = H.componentSet();
    thus 1 c= card Y by A1, Lm3;
  end;
  then (card S)*`1 c= card union M by GLIBPRE1:15;
  then card S c= card union M by CARD_2:21;
  then card S c= card G.componentSet() by Th65;
  hence thesis by GLIB_002:def 9;
end;

theorem Th69:
  for S being vertex-disjoint GraphUnionSet, G being GraphUnion of S
  st S is connected holds card S = G.numComponents()
proof
  let S be vertex-disjoint GraphUnionSet, G be GraphUnion of S;
  assume A1: S is connected;
  thus card S
     = card the set of all H.componentSet() where H is Element of S by Lm2
    .= card SmallestPartition the_Vertices_of S by A1, Th67
    .= card the_Vertices_of S by TOPGEN_2:12
    .= card union SmallestPartition the_Vertices_of S by EQREL_1:def 4
    .= card union the set of all H.componentSet() where H is Element of S
      by A1, Th67
    .= card G.componentSet() by Th65
    .= G.numComponents() by GLIB_002:def 9;
end;

definition
  let F be Graph-yielding Function;
  attr F is vertex-disjoint means
  :Def20:
  for x1,x2 being object st x1 in dom F & x2 in dom F & x1 <> x2
  ex G1, G2 being _Graph st G1 = F.x1 & G2 = F.x2 &
    the_Vertices_of G1 misses the_Vertices_of G2;
  attr F is edge-disjoint means
  :Def21:
  for x1,x2 being object st x1 in dom F & x2 in dom F & x1 <> x2
  ex G1, G2 being _Graph st G1 = F.x1 & G2 = F.x2 &
    the_Edges_of G1 misses the_Edges_of G2;
end;

:: note that edge-disjoint -> one-to-one doesn't hold because of edgeless graphs
registration
  cluster trivial -> vertex-disjoint edge-disjoint for Graph-yielding Function;
  coherence by ZFMISC_1:def 10;
  cluster vertex-disjoint -> one-to-one for Graph-yielding Function;
  coherence
  proof
    let F be Graph-yielding Function;
    assume A1: F is vertex-disjoint;
    now
      let x1, x2 be object;
      assume A2: x1 in dom F & x2 in dom F & F.x1 = F.x2;
      assume x1 <> x2;
      then consider G1, G2 being _Graph such that
        A3: G1 = F.x1 & G2 = F.x2 &
          the_Vertices_of G1 misses the_Vertices_of G2 by A1, A2;
      thus contradiction by A2, A3;
    end;
    hence thesis by FUNCT_1:def 4;
  end;
end;

definition
  let F be non empty Graph-yielding Function;
  redefine attr F is vertex-disjoint means  :: redefines vertex-disjoint (GLIB_015, definition)
  :Def22:
  for x1,x2 being Element of dom F st x1 <> x2
  holds the_Vertices_of (F.x1) misses the_Vertices_of (F.x2);
  compatibility
  proof
    hereby
      assume A1: F is vertex-disjoint;
      let x1,x2 be Element of dom F;
      assume x1 <> x2;
      then consider G1, G2 being _Graph such that
        A2: G1 = F.x1 & G2 = F.x2 &
          the_Vertices_of G1 misses the_Vertices_of G2 by A1;
      thus the_Vertices_of (F.x1) misses the_Vertices_of (F.x2) by A2;
    end;
    assume A3: for x1,x2 being Element of dom F st x1 <> x2
      holds the_Vertices_of (F.x1) misses the_Vertices_of (F.x2);
    let x1,x2 being object;
    assume A4: x1 in dom F & x2 in dom F & x1 <> x2;
    then reconsider y1 = x1, y2 = x2 as Element of dom F;
    take F.y1, F.y2;
    thus thesis by A3, A4;
  end;
  redefine attr F is edge-disjoint means  :: redefines edge-disjoint (GLIB_015, definition)
  :Def23:
  for x1,x2 being Element of dom F st x1 <> x2
  holds the_Edges_of (F.x1) misses the_Edges_of (F.x2);
  compatibility
  proof
    hereby
      assume A5: F is edge-disjoint;
      let x1,x2 be Element of dom F;
      assume x1 <> x2;
      then consider G1, G2 being _Graph such that
        A6: G1 = F.x1 & G2 = F.x2 &
          the_Edges_of G1 misses the_Edges_of G2 by A5;
      thus the_Edges_of (F.x1) misses the_Edges_of (F.x2) by A6;
    end;
    assume A7: for x1,x2 being Element of dom F st x1 <> x2
      holds the_Edges_of (F.x1) misses the_Edges_of (F.x2);
    let x1,x2 being object;
    assume A8: x1 in dom F & x2 in dom F & x1 <> x2;
    then reconsider y1 = x1, y2 = x2 as Element of dom F;
    take F.y1, F.y2;
    thus thesis by A7, A8;
  end;
end;

theorem Th70:
  for F being non empty Graph-yielding Function holds F is vertex-disjoint iff
    for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Vertices_of F).x1 misses (the_Vertices_of F).x2
proof
  let F be non empty Graph-yielding Function;
  hereby
    assume A1: F is vertex-disjoint;
    let x1, x2 be Element of dom F;
    assume A2: x1 <> x2;
    (the_Vertices_of F).x1 = the_Vertices_of(F.x1) &
      (the_Vertices_of F).x2 = the_Vertices_of(F.x2) by Def8;
    hence (the_Vertices_of F).x1 misses (the_Vertices_of F).x2 by A1, A2;
  end;
  assume A3: for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Vertices_of F).x1 misses (the_Vertices_of F).x2;
  let x1,x2 being Element of dom F;
  assume A4: x1 <> x2;
  (the_Vertices_of F).x1 = the_Vertices_of(F.x1) &
    (the_Vertices_of F).x2 = the_Vertices_of(F.x2) by Def8;
  hence the_Vertices_of (F.x1) misses the_Vertices_of (F.x2) by A3, A4;
end;

theorem Th71:
  for F being non empty Graph-yielding Function holds F is edge-disjoint iff
    for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Edges_of F).x1 misses (the_Edges_of F).x2
proof
  let F be non empty Graph-yielding Function;
  hereby
    assume A1: F is edge-disjoint;
    let x1, x2 be Element of dom F;
    assume A2: x1 <> x2;
    (the_Edges_of F).x1 = the_Edges_of(F.x1) &
      (the_Edges_of F).x2 = the_Edges_of(F.x2) by Def9;
    hence (the_Edges_of F).x1 misses (the_Edges_of F).x2 by A1, A2;
  end;
  assume A3: for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Edges_of F).x1 misses (the_Edges_of F).x2;
  let x1,x2 being Element of dom F;
  assume A4: x1 <> x2;
  (the_Edges_of F).x1 = the_Edges_of(F.x1) &
    (the_Edges_of F).x2 = the_Edges_of(F.x2) by Def9;
  hence the_Edges_of (F.x1) misses the_Edges_of (F.x2) by A3, A4;
end;

:: might need Proof outside this article
theorem
  for F being non empty Graph-yielding Function
  holds F is vertex-disjoint edge-disjoint iff
    for x1,x2 being Element of dom F st x1 <> x2
    holds the_Vertices_of(F.x1) misses the_Vertices_of(F.x2) &
      the_Edges_of(F.x1) misses the_Edges_of(F.x2);

theorem Th73:
  for F being non empty Graph-yielding Function
  holds F is vertex-disjoint edge-disjoint iff
    for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Vertices_of F).x1 misses (the_Vertices_of F).x2 &
      (the_Edges_of F).x1 misses (the_Edges_of F).x2
proof
  let F be non empty Graph-yielding Function;
  thus F is vertex-disjoint edge-disjoint implies
    for x1,x2 being Element of dom F st x1 <> x2 holds
      (the_Vertices_of F).x1 misses (the_Vertices_of F).x2 &
      (the_Edges_of F).x1 misses (the_Edges_of F).x2 by Th70, Th71;
  assume A1: for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Vertices_of F).x1 misses (the_Vertices_of F).x2 &
      (the_Edges_of F).x1 misses (the_Edges_of F).x2;
  then for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Vertices_of F).x1 misses (the_Vertices_of F).x2;
  hence F is vertex-disjoint by Th70;
  for x1,x2 being Element of dom F st x1 <> x2
    holds (the_Edges_of F).x1 misses (the_Edges_of F).x2 by A1;
  hence F is edge-disjoint by Th71;
end;

registration
  let x be object, G be _Graph;
  cluster x .--> G -> vertex-disjoint edge-disjoint;
  coherence
  proof
    x .--> G = {[x,G]} by FUNCT_4:82;
    hence thesis;
  end;
end;

registration
  let G be _Graph;
  cluster <* G *> -> vertex-disjoint edge-disjoint;
  coherence;
end;

registration
  cluster non empty vertex-disjoint edge-disjoint for Graph-yielding Function;
  existence
  proof
    take <* the _Graph *>;
    thus thesis;
  end;
end;

registration
  let F be vertex-disjoint Graph-yielding Function;
  cluster rng F -> vertex-disjoint;
  coherence
  proof
    let G1, G2 be _Graph;
    assume A1: G1 in rng F & G2 in rng F & G1 <> G2;
    then consider x1 being object such that
      A2: x1 in dom F & F.x1 = G1 by FUNCT_1:def 3;
    consider x2 being object such that
      A3: x2 in dom F & F.x2 = G2 by A1, FUNCT_1:def 3;
    consider G3, G4 being _Graph such that
      A4: G3 = F.x1 & G4 = F.x2 & the_Vertices_of G3 misses the_Vertices_of G4
      by A1, A2, A3, Def20;
    thus the_Vertices_of G1 misses the_Vertices_of G2 by A2, A3, A4;
  end;
end;

registration
  let F be edge-disjoint Graph-yielding Function;
  cluster rng F -> edge-disjoint;
  coherence
  proof
    let G1, G2 be _Graph;
    assume A1: G1 in rng F & G2 in rng F & G1 <> G2;
    then consider x1 being object such that
      A2: x1 in dom F & F.x1 = G1 by FUNCT_1:def 3;
    consider x2 being object such that
      A3: x2 in dom F & F.x2 = G2 by A1, FUNCT_1:def 3;
    consider G3, G4 being _Graph such that
      A4: G3 = F.x1 & G4 = F.x2 & the_Edges_of G3 misses the_Edges_of G4
      by A1, A2, A3, Def21;
    thus the_Edges_of G1 misses the_Edges_of G2 by A2, A3, A4;
  end;
end;

theorem Th74:
  for F1, F2 being non empty one-to-one Graph-yielding Function
  st F1, F2 are_Disomorphic holds rng F1, rng F2 are_Disomorphic
proof
  let F1, F2 be non empty one-to-one Graph-yielding Function;
  assume F1, F2 are_Disomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    A2: for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic;
  reconsider f = F2*p*(F1") as one-to-one Function;
  take f;
  A3: dom(F2*p) = dom p by A1, RELAT_1:27
    .= rng(F1") by A1, FUNCT_1:33;
  hence dom f = dom(F1") by RELAT_1:27
    .= rng F1 by FUNCT_1:33;
  thus rng f = rng(F2*p) by A3, RELAT_1:28
    .= rng F2  by A1, RELAT_1:28;
  let G be _Graph;
  assume G in rng F1;
  then consider x being object such that
    A4: x in dom F1 & F1.x = G by FUNCT_1:def 3;
  consider G1, G2 being _Graph such that
    A5: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-Disomorphic by A2, A4;
  F1.x in rng F1 by A4, FUNCT_1:3;
  then A6: G in dom(F1") by A4, FUNCT_1:33;
  then G in dom f by A3, RELAT_1:27;
  then A7: G in dom(F2*(p*(F1"))) by RELAT_1:36;
  G2 = F2.(p.(F1".(F1.x))) by A4, A5, FUNCT_1:34
    .= F2.((p*(F1")).G) by A4, A6, FUNCT_1:13
    .= (F2*(p*(F1"))).G by A7, FUNCT_1:12
    .= f.G by RELAT_1:36;
  hence f.G is G-Disomorphic _Graph by A4, A5;
end;

theorem Th75:
  for F1, F2 being non empty one-to-one Graph-yielding Function
  st F1, F2 are_isomorphic holds rng F1, rng F2 are_isomorphic
proof
  let F1, F2 be non empty one-to-one Graph-yielding Function;
  assume F1, F2 are_isomorphic;
  then consider p being one-to-one Function such that
    A1: dom p = dom F1 & rng p = dom F2 and
    A2: for x being object st x in dom F1 ex G1, G2 being _Graph
      st G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic;
  reconsider f = F2*p*(F1") as one-to-one Function;
  take f;
  A3: dom(F2*p) = dom p by A1, RELAT_1:27
    .= rng(F1") by A1, FUNCT_1:33;
  hence dom f = dom(F1") by RELAT_1:27
    .= rng F1 by FUNCT_1:33;
  thus rng f = rng(F2*p) by A3, RELAT_1:28
    .= rng F2  by A1, RELAT_1:28;
  let G be _Graph;
  assume G in rng F1;
  then consider x being object such that
    A4: x in dom F1 & F1.x = G by FUNCT_1:def 3;
  consider G1, G2 being _Graph such that
    A5: G1 = F1.x & G2 = F2.(p.x) & G2 is G1-isomorphic by A2, A4;
  F1.x in rng F1 by A4, FUNCT_1:3;
  then A6: G in dom(F1") by A4, FUNCT_1:33;
  then G in dom f by A3, RELAT_1:27;
  then A7: G in dom(F2*(p*(F1"))) by RELAT_1:36;
  G2 = F2.(p.(F1".(F1.x))) by A4, A5, FUNCT_1:34
    .= F2.((p*(F1")).G) by A4, A6, FUNCT_1:13
    .= (F2*(p*(F1"))).G by A7, FUNCT_1:12
    .= f.G by RELAT_1:36;
  hence f.G is G-isomorphic _Graph by A4, A5;
end;

theorem
  for G1, G2 being _Graph holds <* G1, G2 *> is vertex-disjoint iff
    the_Vertices_of G1 misses the_Vertices_of G2
proof
  let G1, G2 be _Graph;
  set F = <* G1, G2 *>;
  hereby
    assume A1: F is vertex-disjoint;
    1 in {1,2} & 2 in {1,2} by TARSKI:def 2;
    then reconsider x1 = 1, x2 = 2 as Element of dom F by FINSEQ_1:92;
    the_Vertices_of (F.x1) misses the_Vertices_of (F.x2) by A1;
    then the_Vertices_of G1 misses the_Vertices_of (F.x2);
    hence the_Vertices_of G1 misses the_Vertices_of G2;
  end;
  assume A2: the_Vertices_of G1 misses the_Vertices_of G2;
  let x1, x2 be Element of dom F;
  assume A3: x1 <> x2;
  x1 in dom F & x2 in dom F;
  then x1 in {1,2} & x2 in {1,2} by FINSEQ_1:92;
  then (x1 = 1 or x1 = 2) & (x2 = 1 or x2 = 2) by TARSKI:def 2;
  then per cases by A3;
  suppose x1 = 1 & x2 = 2;
    then F.x1 = G1 & F.x2 = G2;
    hence thesis by A2;
  end;
  suppose x1 = 2 & x2 = 1;
    then F.x2 = G1 & F.x1 = G2;
    hence thesis by A2;
  end;
end;

theorem
  for G1, G2 being _Graph holds <* G1, G2 *> is edge-disjoint iff
    the_Edges_of G1 misses the_Edges_of G2
proof
  let G1, G2 be _Graph;
  set F = <* G1, G2 *>;
  hereby
    assume A1: F is edge-disjoint;
    1 in {1,2} & 2 in {1,2} by TARSKI:def 2;
    then reconsider x1 = 1, x2 = 2 as Element of dom F by FINSEQ_1:92;
    the_Edges_of (F.x1) misses the_Edges_of (F.x2) by A1;
    then the_Edges_of G1 misses the_Edges_of (F.x2);
    hence the_Edges_of G1 misses the_Edges_of G2;
  end;
  assume A2: the_Edges_of G1 misses the_Edges_of G2;
  let x1, x2 be Element of dom F;
  assume A3: x1 <> x2;
  x1 in dom F & x2 in dom F;
  then x1 in {1,2} & x2 in {1,2} by FINSEQ_1:92;
  then (x1 = 1 or x1 = 2) & (x2 = 1 or x2 = 2) by TARSKI:def 2;
  then per cases by A3;
  suppose x1 = 1 & x2 = 2;
    then F.x1 = G1 & F.x2 = G2;
    hence thesis by A2;
  end;
  suppose x1 = 2 & x2 = 1;
    then F.x2 = G1 & F.x1 = G2;
    hence thesis by A2;
  end;
end;

begin :: Distinguishing the Range of a Graph-yielding Function

definition
  let f be Function, x be object;
  func renameElementsDistinctlyFunc(f,x) -> ManySortedSet of f.x equals
  <: f.x --> [f,x], id(f.x) :>;
  coherence
  proof
    dom <: f.x --> [f,x], id(f.x) :>
       = dom(f.x --> [f,x]) /\ dom id(f.x) by FUNCT_3:def 7
      .= f.x;
    hence thesis by PARTFUN1:def 2, RELAT_1:def 18;
  end;
end;

theorem Th78:
  for f being Function, x, y being object st x in dom f & y in f.x
  holds renameElementsDistinctlyFunc(f,x).y = [f,x,y]
proof
  let f be Function, x, y be object;
  assume A1: x in dom f & y in f.x;
  then y in dom renameElementsDistinctlyFunc(f,x) by PARTFUN1:def 2;
  hence renameElementsDistinctlyFunc(f,x).y
     = [ (f.x --> [f,x]).y, id(f.x).y ] by FUNCT_3:def 7
    .= [ [f,x], id(f.x).y ] by A1, FUNCOP_1:7
    .= [ [f,x], y ] by A1, FUNCT_1:18
    .= [f,x,y] by XTUPLE_0:def 4;
end;

theorem Th79:
  for f being Function, x, z being object
  st x in dom f & z in rng renameElementsDistinctlyFunc(f,x)
  ex y being object st y in f.x & z = [f,x,y]
proof
  let f be Function, x, z be object;
  assume A1: x in dom f & z in rng renameElementsDistinctlyFunc(f,x);
  then consider y being object such that
    A2: y in dom renameElementsDistinctlyFunc(f,x) and
    A3: renameElementsDistinctlyFunc(f,x).y = z by FUNCT_1:def 3;
  take y;
  thus y in f.x by A2;
  hence thesis by A1, A3, Th78;
end;

theorem Th80:
  for f being Function, x being object
  holds rng renameElementsDistinctlyFunc(f,x) = [: {[f,x]}, f.x :]
proof
  let f be Function, x be object;
  per cases;
  suppose A1: x in dom f;
    now
      let z be object;
      hereby
        assume z in rng renameElementsDistinctlyFunc(f,x);
        then consider y being object such that
          A2: y in f.x & z = [f,x,y] by A1, Th79;
        A3: [f,x] in {[f,x]} by TARSKI:def 1;
        z = [[f,x],y] by A2, XTUPLE_0:def 4;
        hence z in [: {[f,x]}, f.x :] by A2, A3, ZFMISC_1:def 2;
      end;
      assume z in [: {[f,x]}, f.x :];
      then consider z1,y being object such that
        A4: z1 in {[f,x]} & y in f.x & z = [z1,y] by ZFMISC_1:def 2;
      z1 = [f,x] by A4, TARSKI:def 1;
      then A5: z = [f,x,y] by A4, XTUPLE_0:def 4;
      y in dom renameElementsDistinctlyFunc(f,x) by A4, PARTFUN1:def 2;
      then renameElementsDistinctlyFunc(f,x).y in
        rng renameElementsDistinctlyFunc(f,x) by FUNCT_1:3;
      hence z in rng renameElementsDistinctlyFunc(f,x) by A1, A4, A5, Th78;
    end;
    hence thesis by TARSKI:2;
  end;
  suppose not x in dom f;
    then f.x = {} by FUNCT_1:def 2;
    then A6: dom renameElementsDistinctlyFunc(f,x) = {} &
      [: {[f,x]}, f.x :] = {} by ZFMISC_1:90;
    then renameElementsDistinctlyFunc(f,x) = {};
    hence thesis by A6;
  end;
end;

theorem
  for f being Function, x1, x2 being object
  holds rng renameElementsDistinctlyFunc(f,x1) misses f.x2
proof
  let f be Function, x1, x2 be object;
  per cases;
  suppose A1: x1 in dom f & x2 in dom f;
    rng renameElementsDistinctlyFunc(f,x1) /\ f.x2 = {}
    proof
      assume rng renameElementsDistinctlyFunc(f,x1) /\ f.x2 <> {};
      then consider z being object such that
        A2: z in rng renameElementsDistinctlyFunc(f,x1) /\ f.x2
        by XBOOLE_0:def 1;
      A3: z in rng renameElementsDistinctlyFunc(f,x1) by A2, XBOOLE_0:def 4;
      consider y being object such that
        A4: y in f.x1 & z = [f,x1,y] by A1, A3, Th79;
      reconsider X1 = z, X4 = [x2,f.x2], X7 = [f,x1], X9 = [[f,x1],y]
        as set by TARSKI:1;
      A5: z in f.x2 by A2, XBOOLE_0:def 4;
      A6: f.x2 in {x2,f.x2} by TARSKI:def 2;
      {x2,f.x2} in {{x2,f.x2},{x2}} by TARSKI:def 2;
      then A7: {x2,f.x2} in X4 by TARSKI:def 5;
      A8: [x2,f.x2] in f by A1, FUNCT_1:1;
      A9: f in {f} by TARSKI:def 1;
      {f} in {{f,x1},{f}} by TARSKI:def 2;
      then A10: {f} in X7 by TARSKI:def 5;
      A11: [f,x1] in {[f,x1]} by TARSKI:def 1;
      {[f,x1]} in {{[f,x1],y},{[f,x1]}} by TARSKI:def 2;
      then {[f,x1]} in X9 by TARSKI:def 5;
      then {[f,x1]} in X1 by A4, XTUPLE_0:def 4;
      hence contradiction by A5, A6, A7, A8, A9, A10, A11, GLIBPRE1:2;
    end;
    hence thesis by XBOOLE_0:def 7;
  end;
  suppose not x1 in dom f;
    then f.x1 = {} by FUNCT_1:def 2;
    then {} = rng renameElementsDistinctlyFunc(f,x1);
    hence thesis by XBOOLE_1:65;
  end;
  suppose not x2 in dom f;
    then f.x2 = {} by FUNCT_1:def 2;
    hence thesis by XBOOLE_1:65;
  end;
end;

theorem Th82:
  for f being Function, x1, x2 being object st x1 <> x2
  holds rng renameElementsDistinctlyFunc(f,x1) misses
    rng renameElementsDistinctlyFunc(f,x2)
proof
  let f be Function, x1, x2 be object;
  assume A1: x1 <> x2;
  per cases;
  suppose A2: x1 in dom f & x2 in dom f;
    rng renameElementsDistinctlyFunc(f,x1) /\
      rng renameElementsDistinctlyFunc(f,x2) = {}
    proof
      assume rng renameElementsDistinctlyFunc(f,x1) /\
        rng renameElementsDistinctlyFunc(f,x2) <> {};
      then consider z being object such that
        A3: z in rng renameElementsDistinctlyFunc(f,x1) /\
          rng renameElementsDistinctlyFunc(f,x2) by XBOOLE_0:def 1;
      A4: z in rng renameElementsDistinctlyFunc(f,x1) &
        z in rng renameElementsDistinctlyFunc(f,x2) by A3, XBOOLE_0:def 4;
      then consider y1 being object such that
        A5: y1 in f.x1 & z = [f,x1,y1] by A2, Th79;
      consider y2 being object such that
        A6: y2 in f.x2 & z = [f,x2,y2] by A2, A4, Th79;
      thus contradiction by A1, A5, A6, XTUPLE_0:3;
    end;
    hence thesis by XBOOLE_0:def 7;
  end;
  suppose not x1 in dom f or not x2 in dom f;
    then f.x1 = {} or f.x2 = {} by FUNCT_1:def 2;
    then renameElementsDistinctlyFunc(f,x1) = {} or
      renameElementsDistinctlyFunc(f,x2) = {};
    then rng renameElementsDistinctlyFunc(f,x1) = {} or
      rng renameElementsDistinctlyFunc(f,x2) = {};
    hence thesis by XBOOLE_1:65;
  end;
end;

registration
  let f be Function, x be object;
  cluster renameElementsDistinctlyFunc(f,x) -> one-to-one;
  coherence;
end;

registration
  let f be empty Function, x be object;
  cluster renameElementsDistinctlyFunc(f,x) -> empty;
  coherence;
end;

registration
  let f be non empty non-empty Function, x be Element of dom f;
  cluster renameElementsDistinctlyFunc(f,x) -> non empty;
  coherence
  proof
    [: {[f,x]}, f.x :] is non empty;
    then rng renameElementsDistinctlyFunc(f,x) is non empty by Th80;
    hence thesis;
  end;
end;

registration
  let F be non empty Graph-yielding Function, x be Element of dom F;
  cluster renameElementsDistinctlyFunc(the_Vertices_of F,x)
    -> non empty (the_Vertices_of (F.x))-defined;
  coherence
  proof
    reconsider x0 = x as Element of dom the_Vertices_of F by Def4;
    renameElementsDistinctlyFunc(the_Vertices_of F,x0) is non empty;
    hence renameElementsDistinctlyFunc(the_Vertices_of F,x) is non empty;
    (the_Vertices_of F).x = (the_Vertices_of (F.x)) by Def8;
    hence thesis;
  end;
  cluster renameElementsDistinctlyFunc(the_Edges_of F,x)
    -> (the_Edges_of (F.x))-defined;
  coherence
  proof
    (the_Edges_of F).x = (the_Edges_of (F.x)) by Def9;
    hence thesis;
  end;
end;

registration
  let F be non empty Graph-yielding Function, x be Element of dom F;
  cluster renameElementsDistinctlyFunc(the_Vertices_of F,x)
    -> total for (the_Vertices_of (F.x))-defined Function;
  coherence
  proof
    (the_Vertices_of F).x = (the_Vertices_of (F.x)) by Def8;
    hence thesis;
  end;
  cluster renameElementsDistinctlyFunc(the_Edges_of F,x)
    -> total for (the_Edges_of (F.x))-defined Function;
  coherence
  proof
    (the_Edges_of F).x = (the_Edges_of (F.x)) by Def9;
    hence thesis;
  end;
end;

definition
  let F be non empty Graph-yielding Function;
  :: canonical distinction of the graph yielding function
  func canGFDistinction(F) -> Graph-yielding Function means
  :Def25:
  dom it = dom F & for x being Element of dom F holds
    it.x = replaceVerticesEdges(
      renameElementsDistinctlyFunc(the_Vertices_of F,x),
      renameElementsDistinctlyFunc(the_Edges_of F,x));
  existence
  proof
    deffunc G(object) = replaceVerticesEdges(
      renameElementsDistinctlyFunc(the_Vertices_of F,In($1,dom F)),
      renameElementsDistinctlyFunc(the_Edges_of F,In($1,dom F)));
    consider g being Function such that
      A1: dom g = dom F and
      A2: for x being Element of dom F holds g.x = G(x) from FUNCT_1:sch 4;
    now
      let x be object;
      assume x in dom g;
      then g.x = G(x) by A1, A2;
      hence g.x is _Graph;
    end;
    then reconsider g as Graph-yielding Function by GLIB_000:def 53;
    take g;
    thus dom g = dom F by A1;
    let x be Element of dom F;
    In(x,dom F) = x;
    hence g.x = replaceVerticesEdges(
        renameElementsDistinctlyFunc(the_Vertices_of F,x),
        renameElementsDistinctlyFunc(the_Edges_of F,x)) by A2;
  end;
  uniqueness
  proof
    let G1, G2 be Graph-yielding Function;
    assume that
      A3: dom G1 = dom F & for x being Element of dom F holds
        G1.x = replaceVerticesEdges(
          renameElementsDistinctlyFunc(the_Vertices_of F,x),
          renameElementsDistinctlyFunc(the_Edges_of F,x)) and
      A4: dom G2 = dom F & for x being Element of dom F holds
        G2.x = replaceVerticesEdges(
          renameElementsDistinctlyFunc(the_Vertices_of F,x),
          renameElementsDistinctlyFunc(the_Edges_of F,x));
    now
      let z be object;
      assume z in dom G1;
      then reconsider x = z as Element of dom F by A3;
      thus G1.z = replaceVerticesEdges(
          renameElementsDistinctlyFunc(the_Vertices_of F,x),
          renameElementsDistinctlyFunc(the_Edges_of F,x)) by A3
        .= G2.z by A4;
    end;
    hence thesis by A3, A4, FUNCT_1:2;
  end;
end;

registration
  let F be non empty Graph-yielding Function;
  cluster canGFDistinction(F) -> non empty;
  coherence
  proof
    dom F = dom canGFDistinction(F) by Def25;
    hence canGFDistinction(F) is non empty;
  end;
end;

registration
  let F be non empty Graph-yielding Function;
  cluster canGFDistinction(F) -> plain;
  coherence
  proof
    now
      let x9 be Element of dom canGFDistinction F;
      reconsider x = x9 as Element of dom F by Def25;
      (canGFDistinction F).x = replaceVerticesEdges(
        renameElementsDistinctlyFunc(the_Vertices_of F,x),
        renameElementsDistinctlyFunc(the_Edges_of F,x)) by Def25;
      hence (canGFDistinction F).x9 is plain;
    end;
    hence thesis by GLIBPRE0:def 2;
  end;
end;

theorem Th83:
  for F being non empty Graph-yielding Function, x being Element of dom F
  holds (the_Vertices_of canGFDistinction F).x
    = [: {[the_Vertices_of F,x]}, (the_Vertices_of F).x :]
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  reconsider x9 = x as Element of dom canGFDistinction F by Def25;
  thus (the_Vertices_of canGFDistinction F).x
     = the_Vertices_of ((canGFDistinction F).x9) by Def8
    .= the_Vertices_of replaceVerticesEdges(
        renameElementsDistinctlyFunc(the_Vertices_of F,x),
        renameElementsDistinctlyFunc(the_Edges_of F,x)) by Def25
    .= rng renameElementsDistinctlyFunc(the_Vertices_of F,x) by Th1
    .= [: {[the_Vertices_of F,x]}, (the_Vertices_of F).x :] by Th80;
end;

theorem Th84:
  for F being non empty Graph-yielding Function, x being Element of dom F
  holds (the_Edges_of canGFDistinction F).x
    = [: {[the_Edges_of F,x]}, (the_Edges_of F).x :]
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  reconsider x9 = x as Element of dom canGFDistinction F by Def25;
  thus (the_Edges_of canGFDistinction F).x
     = the_Edges_of ((canGFDistinction F).x9) by Def9
    .= the_Edges_of replaceVerticesEdges(
        renameElementsDistinctlyFunc(the_Vertices_of F,x),
        renameElementsDistinctlyFunc(the_Edges_of F,x)) by Def25
    .= rng renameElementsDistinctlyFunc(the_Edges_of F,x) by Th1
    .= [: {[the_Edges_of F,x]}, (the_Edges_of F).x :] by Th80;
end;

registration
  let F be non empty Graph-yielding Function;
  cluster canGFDistinction(F) -> vertex-disjoint edge-disjoint;
  coherence
  proof
    now
      let x1, x2 be Element of dom canGFDistinction F;
      x1 in dom canGFDistinction F & x2 in dom canGFDistinction F;
      then A1: x1 in dom F & x2 in dom F by Def25;
      assume A2: x1 <> x2;
      A3: (the_Vertices_of canGFDistinction F).x1
         = [: {[the_Vertices_of F,x1]}, (the_Vertices_of F).x1 :] by A1, Th83
        .= rng renameElementsDistinctlyFunc(the_Vertices_of F,x1) by Th80;
      (the_Vertices_of canGFDistinction F).x2
         = [: {[the_Vertices_of F,x2]}, (the_Vertices_of F).x2 :] by A1, Th83
        .= rng renameElementsDistinctlyFunc(the_Vertices_of F,x2) by Th80;
      hence (the_Vertices_of canGFDistinction F).x1 misses
        (the_Vertices_of canGFDistinction F).x2 by A2, A3, Th82;
    end;
    hence canGFDistinction(F) is vertex-disjoint by Th70;
    now
      let x1, x2 be Element of dom canGFDistinction F;
      x1 in dom canGFDistinction F & x2 in dom canGFDistinction F;
      then A4: x1 in dom F & x2 in dom F by Def25;
      assume A5: x1 <> x2;
      A6: (the_Edges_of canGFDistinction F).x1
         = [: {[the_Edges_of F,x1]}, (the_Edges_of F).x1 :] by A4, Th84
        .= rng renameElementsDistinctlyFunc(the_Edges_of F,x1) by Th80;
      (the_Edges_of canGFDistinction F).x2
         = [: {[the_Edges_of F,x2]}, (the_Edges_of F).x2 :] by A4, Th84
        .= rng renameElementsDistinctlyFunc(the_Edges_of F,x2) by Th80;
      hence (the_Edges_of canGFDistinction F).x1 misses
        (the_Edges_of canGFDistinction F).x2 by A5, A6, Th82;
    end;
    hence canGFDistinction(F) is edge-disjoint by Th71;
  end;
end;

theorem Th85:
  for F being non empty Graph-yielding Function, x being Element of dom F
  for x9 being Element of dom canGFDistinction F st x = x9
  ex G being PGraphMapping of F.x,(canGFDistinction F).x9
  st G_V = renameElementsDistinctlyFunc(the_Vertices_of F,x) &
    G_E = renameElementsDistinctlyFunc(the_Edges_of F,x) &
    G is Disomorphism
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  let x9 be Element of dom canGFDistinction F;
  assume x = x9;
  then (canGFDistinction F).x9
     = replaceVerticesEdges(
        renameElementsDistinctlyFunc(the_Vertices_of F,x),
        renameElementsDistinctlyFunc(the_Edges_of F,x)) by Def25;
  hence thesis by Th16;
end;

theorem Th86:
  for F being non empty Graph-yielding Function, x being Element of dom F
  for x9 being Element of dom canGFDistinction F st x = x9
  holds (canGFDistinction F).x9 is F.x-Disomorphic
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  let x9 be Element of dom canGFDistinction F;
  assume x = x9;
  then consider G being PGraphMapping of F.x,(canGFDistinction F).x9 such that
    G_V = renameElementsDistinctlyFunc(the_Vertices_of F,x) &
    G_E = renameElementsDistinctlyFunc(the_Edges_of F,x) and
    A1: G is Disomorphism by Th85;
  thus thesis by A1, GLIB_010:def 24;
end;

theorem Th87:
  for F being non empty Graph-yielding Function
  holds F,canGFDistinction(F) are_Disomorphic
proof
  let F be non empty Graph-yielding Function;
  A1: dom F = dom canGFDistinction F by Def25;
  for x being Element of dom F, x9 being Element of dom canGFDistinction F
    st x = x9 holds (canGFDistinction F).x9 is F.x-Disomorphic by Th86;
  hence thesis by A1, Th38;
end;

theorem Th88:
  for F1, F2 being non empty Graph-yielding Function st F1, F2 are_Disomorphic
  holds canGFDistinction(F1),canGFDistinction(F2) are_Disomorphic
proof
  let F1, F2 be non empty Graph-yielding Function;
  assume A1: F1,F2 are_Disomorphic;
  canGFDistinction(F1),F1 are_Disomorphic by Th87;
  then A2: canGFDistinction(F1),F2 are_Disomorphic by A1, Th40;
  F2,canGFDistinction(F2) are_Disomorphic by Th87;
  hence thesis by A2, Th40;
end;

theorem Th89:
  for F1, F2 being non empty Graph-yielding Function st F1, F2 are_isomorphic
  holds canGFDistinction(F1),canGFDistinction(F2) are_isomorphic
proof
  let F1, F2 be non empty Graph-yielding Function;
  assume A1: F1,F2 are_isomorphic;
  canGFDistinction(F1),F1 are_isomorphic by Th42, Th87;
  then A2: canGFDistinction(F1),F2 are_isomorphic by A1, Th41;
  F2,canGFDistinction(F2) are_isomorphic by Th42, Th87;
  hence thesis by A2, Th41;
end;

theorem Th90:
  for F being non empty Graph-yielding Function, x being Element of dom F
  for x9 being Element of dom canGFDistinction(F)
  for v,e,w being object st x = x9
  holds e DJoins v,w,F.x implies [the_Edges_of F,x,e] DJoins
    [the_Vertices_of F,x,v],[the_Vertices_of F,x,w],(canGFDistinction F).x9
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  let x9 be Element of dom canGFDistinction(F), v,e,w be object;
  assume x = x9;
  then consider G being PGraphMapping of F.x,(canGFDistinction F).x9 such that
    A1: G_V = renameElementsDistinctlyFunc(the_Vertices_of F,x) and
    A2: G_E = renameElementsDistinctlyFunc(the_Edges_of F,x) and
    A3: G is Disomorphism by Th85;
  assume A4: e DJoins v,w,F.x;
  then e Joins v,w,F.x by GLIB_000:16;
  then A5: e in the_Edges_of F.x & v is Vertex of F.x & w is Vertex of F.x
    by GLIB_000:13, GLIB_000:def 13;
  dom G_V = the_Vertices_of(F.x) & dom G_E = the_Edges_of(F.x)
    by A3, GLIB_010:def 11;
  then A6: G_E.e DJoins G_V.v,G_V.w,(canGFDistinction F).x9
    by A3, A4, A5, GLIB_010:def 14;
  dom F = dom the_Vertices_of F & dom F = dom the_Edges_of F by Def4, Def5;
  then A7: x in dom the_Vertices_of F & x in dom the_Edges_of F;
  (the_Vertices_of F).x = the_Vertices_of F.x by Def8;
  then A8: v in (the_Vertices_of F).x & w in (the_Vertices_of F).x by A5;
  e in (the_Edges_of F).x by A5, Def9;
  then [the_Edges_of F,x,e] DJoins G_V.v,G_V.w,(canGFDistinction F).x9
    by A2, A6, A7, Th78;
  then [the_Edges_of F,x,e] DJoins
    [the_Vertices_of F,x,v],G_V.w,(canGFDistinction F).x9
    by A1, A7, A8, Th78;
  hence thesis by A1, A7, A8, Th78;
end;

theorem Th91:
  for F being non empty Graph-yielding Function, x being Element of dom F
  for x9 being Element of dom canGFDistinction(F)
  for v,e,w being object st x = x9
  holds e Joins v,w,F.x implies [the_Edges_of F,x,e] Joins
    [the_Vertices_of F,x,v],[the_Vertices_of F,x,w],(canGFDistinction F).x9
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  let x9 be Element of dom canGFDistinction(F), v,e,w be object;
  assume A1: x = x9;
  assume e Joins v,w,F.x;
  then per cases by GLIB_000:16;
  suppose e DJoins v,w,F.x;
    then [the_Edges_of F,x,e] DJoins [the_Vertices_of F,x,v],
      [the_Vertices_of F,x,w],(canGFDistinction F).x9 by A1, Th90;
    hence thesis by GLIB_000:16;
  end;
  suppose e DJoins w,v,F.x;
    then [the_Edges_of F,x,e] DJoins [the_Vertices_of F,x,w],
      [the_Vertices_of F,x,v],(canGFDistinction F).x9 by A1, Th90;
    hence thesis by GLIB_000:16;
  end;
end;

theorem Th92:
  for F being non empty Graph-yielding Function, x being Element of dom F
  for x9 being Element of dom canGFDistinction(F)
  for v9,e9,w9 being object st x = x9 & e9 DJoins v9,w9,(canGFDistinction F).x9
  ex v,e,w being object st e DJoins v,w,F.x &
    e9 = [the_Edges_of F,x,e] & v9 = [the_Vertices_of F,x,v] &
    w9 = [the_Vertices_of F,x,w]
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  let x9 be Element of dom canGFDistinction(F), v9,e9,w9 be object;
  assume A1: x = x9;
  then consider G being PGraphMapping of F.x,(canGFDistinction F).x9 such that
    A2: G_V = renameElementsDistinctlyFunc(the_Vertices_of F,x) and
    A3: G_E = renameElementsDistinctlyFunc(the_Edges_of F,x) and
    A4: G is Disomorphism by Th85;
  assume A5: e9 DJoins v9,w9,(canGFDistinction F).x9;
  then A6: e9 Joins v9,w9,(canGFDistinction F).x9 by GLIB_000:16;
  A7: the_Vertices_of (canGFDistinction F).x9
     = (the_Vertices_of canGFDistinction F).x by A1, Def8
    .= [: {[the_Vertices_of F,x]}, (the_Vertices_of F).x :] by Th83
    .= rng renameElementsDistinctlyFunc(the_Vertices_of F,x) by Th80;
  x in dom F;
  then A8: x in dom the_Vertices_of F & x in dom the_Edges_of F by Def4, Def5;
  v9 in the_Vertices_of (canGFDistinction F).x9 by A6, GLIB_000:13;
  then consider v being object such that
    A9: v in (the_Vertices_of F).x & v9 = [the_Vertices_of F,x,v]
    by A7, A8, Th79;
  w9 in the_Vertices_of (canGFDistinction F).x9 by A6, GLIB_000:13;
  then consider w being object such that
    A10: w in (the_Vertices_of F).x & w9 = [the_Vertices_of F,x,w]
    by A7, A8, Th79;
  A11: the_Edges_of (canGFDistinction F).x9
     = (the_Edges_of canGFDistinction F).x by A1, Def9
    .= [: {[the_Edges_of F,x]}, (the_Edges_of F).x :] by Th84
    .= rng renameElementsDistinctlyFunc(the_Edges_of F,x) by Th80;
  e9 in the_Edges_of (canGFDistinction F).x9 by A6, GLIB_000:def 13;
  then consider e being object such that
    A12: e in (the_Edges_of F).x & e9 = [the_Edges_of F,x,e]
    by A8, A11, Th79;
  take v,e,w;
  the_Edges_of(F.x) = (the_Edges_of F).x &
    the_Vertices_of(F.x) = (the_Vertices_of F).x by Def8, Def9;
  then dom G_E = (the_Edges_of F).x & dom G_V = (the_Vertices_of F).x
    by A4, GLIB_010:def 11;
  then A13: e in dom G_E & v in dom G_V & w in dom G_V by A9, A10, A12;
  G_E.e DJoins v9,w9,(canGFDistinction F).x9 by A3, A5, A8, A12, Th78;
  then G_E.e DJoins G_V.v,w9,(canGFDistinction F).x9 by A2, A8, A9, Th78;
  then G_E.e DJoins G_V.v,G_V.w,(canGFDistinction F).x9 by A2, A8, A10, Th78;
  hence e DJoins v,w,F.x by A4, A13, GLIB_010:def 17;
  thus thesis by A9, A10, A12;
end;

theorem Th93:
  for F being non empty Graph-yielding Function, x being Element of dom F
  for x9 being Element of dom canGFDistinction(F)
  for v9,e9,w9 being object st x = x9 & e9 Joins v9,w9,(canGFDistinction F).x9
  ex v,e,w being object st e Joins v,w,F.x &
    e9 = [the_Edges_of F,x,e] & v9 = [the_Vertices_of F,x,v] &
    w9 = [the_Vertices_of F,x,w]
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  let x9 be Element of dom canGFDistinction(F), v9,e9,w9 be object;
  assume A1: x = x9 & e9 Joins v9,w9,(canGFDistinction F).x9;
  then per cases by GLIB_000:16;
  suppose e9 DJoins v9,w9,(canGFDistinction F).x9;
    then consider v,e,w being object such that
      A2: e DJoins v,w,F.x & e9 = [the_Edges_of F,x,e] &
        v9 =[the_Vertices_of F,x,v] & w9 =[the_Vertices_of F,x,w] by A1, Th92;
    take v,e,w;
    thus thesis by A2, GLIB_000:16;
  end;
  suppose e9 DJoins w9,v9,(canGFDistinction F).x9;
    then consider w,e,v being object such that
      A3: e DJoins w,v,F.x & e9 = [the_Edges_of F,x,e] &
        w9 =[the_Vertices_of F,x,w] & v9 =[the_Vertices_of F,x,v] by A1, Th92;
    take v,e,w;
    thus thesis by A3, GLIB_000:16;
  end;
end;

registration
  let F be non empty loopless Graph-yielding Function;
  cluster canGFDistinction(F) -> loopless;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non loopless Graph-yielding Function;
  cluster canGFDistinction(F) -> non loopless;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non-multi Graph-yielding Function;
  cluster canGFDistinction(F) -> non-multi;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non non-multi Graph-yielding Function;
  cluster canGFDistinction(F) -> non non-multi;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non-Dmulti Graph-yielding Function;
  cluster canGFDistinction(F) -> non-Dmulti;
  coherence
  proof
    F,canGFDistinction(F) are_Disomorphic by Th87;
    hence thesis by Th49;
  end;
end;

registration
  let F be non empty non non-Dmulti Graph-yielding Function;
  cluster canGFDistinction(F) -> non non-Dmulti;
  coherence
  proof
    F,canGFDistinction(F) are_Disomorphic by Th87;
    hence thesis by Th49;
  end;
end;

registration
  let F be non empty simple Graph-yielding Function;
  cluster canGFDistinction(F) -> simple;
  coherence;
end;

registration
  let F be non empty Dsimple Graph-yielding Function;
  cluster canGFDistinction(F) -> Dsimple;
  coherence;
end;

registration
  let F be non empty acyclic Graph-yielding Function;
  cluster canGFDistinction(F) -> acyclic;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non acyclic Graph-yielding Function;
  cluster canGFDistinction(F) -> non acyclic;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty connected Graph-yielding Function;
  cluster canGFDistinction(F) -> connected;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non connected Graph-yielding Function;
  cluster canGFDistinction(F) -> non connected;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty Tree-like Graph-yielding Function;
  cluster canGFDistinction(F) -> Tree-like;
  coherence;
end;

registration
  let F be non empty edgeless Graph-yielding Function;
  cluster canGFDistinction(F) -> edgeless;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non edgeless Graph-yielding Function;
  cluster canGFDistinction(F) -> non edgeless;
  coherence
  proof
    F,canGFDistinction(F) are_isomorphic by Th42, Th87;
    hence thesis by Th48;
  end;
end;

definition
  let F be non empty Graph-yielding Function, z be Element of dom F;
  func canGFDistinction(F,z) -> Graph-yielding Function equals
  canGFDistinction(F) +* (z,F.z | _GraphSelectors);
  coherence
  proof
    now
      let x be object;
      assume x in dom(canGFDistinction(F) +* (z,F.z | _GraphSelectors));
      then A1: x in dom canGFDistinction(F) by FUNCT_7:30;
      z in dom F;
      then A2: z in dom canGFDistinction(F) by Def25;
      per cases;
      suppose x = z;
        hence (canGFDistinction(F) +* (z,F.z | _GraphSelectors)).x is _Graph
          by A2, FUNCT_7:31;
      end;
      suppose x <> z;
        then (canGFDistinction(F) +* (z,F.z | _GraphSelectors)).x
          = (canGFDistinction F).x by FUNCT_7:32;
        hence (canGFDistinction(F) +* (z,F.z | _GraphSelectors)).x is _Graph
          by A1;
      end;
    end;
    hence thesis by GLIB_000:def 53;
  end;
end;

registration
  let F be non empty Graph-yielding Function, z be Element of dom F;
  cluster canGFDistinction(F,z) -> non empty;
  coherence;
end;

theorem Th94:
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds dom F = dom canGFDistinction(F,z)
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  thus dom F = dom canGFDistinction F by Def25
    .= dom canGFDistinction(F,z) by FUNCT_7:30;
end;

theorem Th95:
  for F being non empty Graph-yielding Function, z being Element of dom F
  for G being Graph-yielding Function
  holds G = canGFDistinction(F,z) iff dom G = dom F &
      G.z = F.z | _GraphSelectors &
    for x being Element of dom F st x <> z
    holds G.x = replaceVerticesEdges(
      renameElementsDistinctlyFunc(the_Vertices_of F,x),
      renameElementsDistinctlyFunc(the_Edges_of F,x))
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  let G be Graph-yielding Function;
  z in dom F;
  then A1: z in dom canGFDistinction(F) by Def25;
  hereby
    assume A2: G = canGFDistinction(F,z);
    hence dom G = dom canGFDistinction(F) by FUNCT_7:30
      .= dom F by Def25;
    thus G.z = F.z | _GraphSelectors by A1, A2, FUNCT_7:31;
    let x be Element of dom F;
    assume A3: x <> z;
    thus G.x = (canGFDistinction F).x by A2, A3, FUNCT_7:32
      .= replaceVerticesEdges(
        renameElementsDistinctlyFunc(the_Vertices_of F,x),
        renameElementsDistinctlyFunc(the_Edges_of F,x)) by Def25;
  end;
  assume that
    A4: dom G = dom F & G.z = F.z | _GraphSelectors and
    A5: for x being Element of dom F st x <> z
      holds G.x = replaceVerticesEdges(
        renameElementsDistinctlyFunc(the_Vertices_of F,x),
        renameElementsDistinctlyFunc(the_Edges_of F,x));
  A6: dom G = dom canGFDistinction F by A4, Def25
    .= dom canGFDistinction(F,z) by FUNCT_7:30;
  for x being object st x in dom G holds G.x = canGFDistinction(F,z).x
  proof
    let x be object;
    assume A7: x in dom G;
    per cases;
    suppose x = z;
      hence G.x = canGFDistinction(F,z).x by A1, A4, FUNCT_7:31;
    end;
    suppose A8: x <> z;
      reconsider x0 = x as Element of dom F by A4, A7;
      thus G.x = replaceVerticesEdges(
          renameElementsDistinctlyFunc(the_Vertices_of F,x0),
          renameElementsDistinctlyFunc(the_Edges_of F,x0)) by A5, A8
        .= (canGFDistinction F).x by Def25
        .= canGFDistinction(F,z).x by A8, FUNCT_7:32;
    end;
  end;
  hence thesis by A6, FUNCT_1:2;
end;

theorem Th96:
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds canGFDistinction(F,z).z = F.z | _GraphSelectors
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  dom F = dom canGFDistinction F by Def25;
  hence canGFDistinction(F,z).z = F.z | _GraphSelectors by FUNCT_7:31;
end;

registration
  let F being non empty Graph-yielding Function, z being Element of dom F;
  cluster canGFDistinction(F,z) -> plain;
  coherence
  proof
    now
      let x9 be Element of dom canGFDistinction(F,z);
      per cases;
      suppose A1: x9 <> z;
        x9 in dom canGFDistinction(F,z);
        then x9 in dom F by Th94;
        then reconsider x = x9 as Element of dom canGFDistinction F by Def25;
        canGFDistinction(F,z).x9 = (canGFDistinction F).x by A1, FUNCT_7:32;
        hence canGFDistinction(F,z).x9 is plain;
      end;
      suppose x9 = z;
        hence canGFDistinction(F,z).x9 is plain by Th96;
      end;
    end;
    hence thesis by GLIBPRE0:def 2;
  end;
end;

theorem Th97:
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds (the_Vertices_of canGFDistinction(F,z)).z = (the_Vertices_of F).z
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  A1: F.z == F.z | _GraphSelectors by GLIB_000:128;
  reconsider z9 = z as Element of dom canGFDistinction(F,z) by Th94;
  thus (the_Vertices_of canGFDistinction(F,z)).z
     = the_Vertices_of (canGFDistinction(F,z).z9) by Def8
    .= the_Vertices_of (F.z | _GraphSelectors) by Th96
    .= the_Vertices_of (F.z) by A1, GLIB_000:def 34
    .= (the_Vertices_of F).z by Def8;
end;

theorem Th98:
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  st x <> z holds (the_Vertices_of canGFDistinction(F,z)).x
    = (the_Vertices_of canGFDistinction F).x
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  assume A1: x <> z;
  reconsider x1 = x as Element of dom canGFDistinction(F) by Def25;
  reconsider x2 = x as Element of dom canGFDistinction(F,z) by Th95;
  thus (the_Vertices_of canGFDistinction(F,z)).x
     = the_Vertices_of(canGFDistinction(F,z).x2) by Def8
    .= the_Vertices_of((canGFDistinction F).x1) by A1, FUNCT_7:32
    .= (the_Vertices_of canGFDistinction F).x by Def8;
end;

theorem
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds the_Vertices_of canGFDistinction(F,z)
    = (the_Vertices_of canGFDistinction F) +* (z, the_Vertices_of (F.z))
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  A1: dom the_Vertices_of canGFDistinction(F,z)
     = dom canGFDistinction(F,z) by Def4
    .= dom canGFDistinction(F) by FUNCT_7:30;
  then A2: dom the_Vertices_of canGFDistinction(F,z)
     = dom the_Vertices_of canGFDistinction(F) by Def4
    .= dom((the_Vertices_of canGFDistinction F) +* (z, the_Vertices_of (F.z)))
      by FUNCT_7:30;
  now
    let x be object;
    assume x in dom the_Vertices_of canGFDistinction(F,z);
    then reconsider x0 = x as Element of dom F by A1, Def25;
    per cases;
    suppose A3: x = z;
      z in dom F;
      then z in dom canGFDistinction(F) by Def25;
      then A4: z in dom the_Vertices_of canGFDistinction F by Def4;
      thus (the_Vertices_of canGFDistinction(F,z)).x
         = (the_Vertices_of F).z by A3, Th97
        .= the_Vertices_of (F.z) by Def8
        .= ((the_Vertices_of canGFDistinction F)+*(z,the_Vertices_of (F.z))).x
          by A3, A4, FUNCT_7:31;
    end;
    suppose A5: x <> z;
      hence (the_Vertices_of canGFDistinction(F,z)).x
         = (the_Vertices_of canGFDistinction F).x0 by Th98
        .= ((the_Vertices_of canGFDistinction F)+*(z,the_Vertices_of (F.z))).x
          by A5, FUNCT_7:32;
    end;
  end;
  hence thesis by A2, FUNCT_1:2;
end;

theorem Th100:
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds (the_Edges_of canGFDistinction(F,z)).z = (the_Edges_of F).z
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  A1: F.z == F.z | _GraphSelectors by GLIB_000:128;
  reconsider z9 = z as Element of dom canGFDistinction(F,z) by Th94;
  thus (the_Edges_of canGFDistinction(F,z)).z
     = the_Edges_of (canGFDistinction(F,z).z9) by Def9
    .= the_Edges_of (F.z | _GraphSelectors) by Th96
    .= the_Edges_of (F.z) by A1, GLIB_000:def 34
    .= (the_Edges_of F).z by Def9;
end;

theorem Th101:
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  st x <> z holds (the_Edges_of canGFDistinction(F,z)).x
    = (the_Edges_of canGFDistinction F).x
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  assume A1: x <> z;
  reconsider x1 = x as Element of dom canGFDistinction(F) by Def25;
  reconsider x2 = x as Element of dom canGFDistinction(F,z) by Th95;
  thus (the_Edges_of canGFDistinction(F,z)).x
     = the_Edges_of(canGFDistinction(F,z).x2) by Def9
    .= the_Edges_of((canGFDistinction F).x1) by A1, FUNCT_7:32
    .= (the_Edges_of canGFDistinction F).x by Def9;
end;

theorem
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds (the_Edges_of canGFDistinction(F,z))
    = (the_Edges_of canGFDistinction F) +* (z, the_Edges_of (F.z))
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  A1: dom the_Edges_of canGFDistinction(F,z)
     = dom canGFDistinction(F,z) by Def5
    .= dom canGFDistinction(F) by FUNCT_7:30;
  then A2: dom the_Edges_of canGFDistinction(F,z)
     = dom the_Edges_of canGFDistinction(F) by Def5
    .= dom((the_Edges_of canGFDistinction F) +* (z, the_Edges_of (F.z)))
      by FUNCT_7:30;
  now
    let x be object;
    assume x in dom the_Edges_of canGFDistinction(F,z);
    then reconsider x0 = x as Element of dom F by A1, Def25;
    per cases;
    suppose A3: x = z;
      z in dom F;
      then z in dom canGFDistinction(F) by Def25;
      then A4: z in dom the_Edges_of canGFDistinction F by Def5;
      thus (the_Edges_of canGFDistinction(F,z)).x
         = (the_Edges_of F).z by A3, Th100
        .= the_Edges_of (F.z) by Def9
        .= ((the_Edges_of canGFDistinction F)+*(z,the_Edges_of (F.z))).x
          by A3, A4, FUNCT_7:31;
    end;
    suppose A5: x <> z;
      hence (the_Edges_of canGFDistinction(F,z)).x
         = (the_Edges_of canGFDistinction F).x0 by Th101
        .= ((the_Edges_of canGFDistinction F)+*(z,the_Edges_of (F.z))).x
          by A5, FUNCT_7:32;
    end;
  end;
  hence thesis by A2, FUNCT_1:2;
end;

Lm4:
  for F being non empty Graph-yielding Function, x,y being Element of dom F
  holds [: {[the_Vertices_of F,x]}, (the_Vertices_of F).x :]
    misses the_Vertices_of (F.y)
proof
  let F be non empty Graph-yielding Function, x,y being Element of dom F;
  [:{[the_Vertices_of F,x]},(the_Vertices_of F).x :]/\the_Vertices_of(F.y) = {}
  proof
    assume A1: [: {[the_Vertices_of F,x]}, (the_Vertices_of F).x :]
      /\ the_Vertices_of (F.y) <> {};
    set z = the Element of [: {[the_Vertices_of F,x]}, (the_Vertices_of F).x :]
      /\ the_Vertices_of (F.y);
    A2: z in [: {[the_Vertices_of F,x]}, (the_Vertices_of F).x :] &
      z in the_Vertices_of (F.y) by A1, XBOOLE_0:def 4;
    then consider a,b being object such that
      A3: a in {[the_Vertices_of F,x]} & b in (the_Vertices_of F).x & z=[a,b]
        by ZFMISC_1:def 2;
    A4: a = [the_Vertices_of F, x] by A3, TARSKI:def 1;
    reconsider Z = z, A = a, M = [y,the_Vertices_of (F.y)] as set by TARSKI:1;
    A5: the_Vertices_of (F.y) in {y,the_Vertices_of (F.y)} by TARSKI:def 2;
    {y,the_Vertices_of (F.y)} in {{y,the_Vertices_of (F.y)},{y}}
      by TARSKI:def 2;
    then A6: {y,the_Vertices_of (F.y)} in M by TARSKI:def 5;
    A7: the_Vertices_of (F.y) = (the_Vertices_of F).y by Def8;
    dom F = dom the_Vertices_of F by Def4;
    then A8: [y,the_Vertices_of (F.y)] in the_Vertices_of F by A7, FUNCT_1:1;
    A9: the_Vertices_of F in {the_Vertices_of F} by TARSKI:def 1;
    {the_Vertices_of F} in {{the_Vertices_of F,x},{the_Vertices_of F}}
      by TARSKI:def 2;
    then A10: {the_Vertices_of F} in A by A4, TARSKI:def 5;
    A11: a in {a} by A3, A4;
    {a} in {{a,b},{a}} by TARSKI:def 2;
    then A12: {a} in Z by A3, TARSKI:def 5;
    thus contradiction by A2, A5, A6, A8, A9, A10, A11, A12, GLIBPRE1:2;
  end;
  hence thesis by XBOOLE_0:def 7;
end;

Lm5:
  for F being non empty Graph-yielding Function, x,y being Element of dom F
  holds [: {[the_Edges_of F,x]}, (the_Edges_of F).x :]
    misses the_Edges_of (F.y)
proof
  let F be non empty Graph-yielding Function, x,y being Element of dom F;
  [: {[the_Edges_of F,x]}, (the_Edges_of F).x :] /\ the_Edges_of(F.y) = {}
  proof
    assume A1: [: {[the_Edges_of F,x]}, (the_Edges_of F).x :]
      /\ the_Edges_of (F.y) <> {};
    set z = the Element of [: {[the_Edges_of F,x]}, (the_Edges_of F).x :]
      /\ the_Edges_of (F.y);
    A2: z in [: {[the_Edges_of F,x]}, (the_Edges_of F).x :] &
      z in the_Edges_of (F.y) by A1, XBOOLE_0:def 4;
    then consider a,b being object such that
      A3: a in {[the_Edges_of F,x]} & b in (the_Edges_of F).x & z=[a,b]
        by ZFMISC_1:def 2;
    A4: a = [the_Edges_of F, x] by A3, TARSKI:def 1;
    reconsider Z = z, A = a, M = [y,the_Edges_of (F.y)] as set by TARSKI:1;
    A5: the_Edges_of (F.y) in {y,the_Edges_of (F.y)} by TARSKI:def 2;
    {y,the_Edges_of (F.y)} in {{y,the_Edges_of (F.y)},{y}}
      by TARSKI:def 2;
    then A6: {y,the_Edges_of (F.y)} in M by TARSKI:def 5;
    A7: the_Edges_of (F.y) = (the_Edges_of F).y by Def9;
    dom F = dom the_Edges_of F by Def5;
    then A8: [y,the_Edges_of (F.y)] in the_Edges_of F by A7, FUNCT_1:1;
    A9: the_Edges_of F in {the_Edges_of F} by TARSKI:def 1;
    {the_Edges_of F} in {{the_Edges_of F,x},{the_Edges_of F}}
      by TARSKI:def 2;
    then A10: {the_Edges_of F} in A by A4, TARSKI:def 5;
    A11: a in {a} by A3, A4;
    {a} in {{a,b},{a}} by TARSKI:def 2;
    then A12: {a} in Z by A3, TARSKI:def 5;
    thus contradiction by A2, A5, A6, A8, A9, A10, A11, A12, GLIBPRE1:2;
  end;
  hence thesis by XBOOLE_0:def 7;
end;

registration
  let F be non empty Graph-yielding Function, z being Element of dom F;
  cluster canGFDistinction(F,z) -> vertex-disjoint edge-disjoint;
  coherence
  proof
    now
      set G = canGFDistinction F, H = canGFDistinction(F,z);
      let y1,y2 be Element of dom H;
      y1 in dom H & y2 in dom H;
      then A1: y1 in dom G & y2 in dom G by FUNCT_7:30;
      then reconsider x1=y1, x2=y2 as Element of dom F by Def25;
      assume A2: y1 <> y2;
      per cases;
      suppose A3: x1 <> z & x2 <> z;
        A4: (the_Vertices_of G).x1 misses (the_Vertices_of G).x2 &
          (the_Edges_of G).x1 misses (the_Edges_of G).x2 by A1, A2, Th73;
        then (the_Vertices_of H).x1 misses (the_Vertices_of G).x2 by A3, Th98;
        hence (the_Vertices_of H).y1 misses (the_Vertices_of H).y2 by A3, Th98
;
        (the_Edges_of H).x1 misses (the_Edges_of G).x2 by A3, A4, Th101;
        hence (the_Edges_of H).y1 misses (the_Edges_of H).y2 by A3, Th101;
      end;
      suppose A5: x1 = z;
        then A6: (the_Vertices_of H).x1 = (the_Vertices_of F).x1 by Th97
          .= the_Vertices_of (F.x1) by Def8;
        (the_Vertices_of H).x2 = (the_Vertices_of G).x2 by A2, A5, Th98
          .= [: {[the_Vertices_of F,x2]}, (the_Vertices_of F).x2 :] by Th83;
        hence (the_Vertices_of H).y1 misses (the_Vertices_of H).y2 by A6, Lm4;
        A7: (the_Edges_of H).x1 = (the_Edges_of F).x1 by A5, Th100
          .= the_Edges_of (F.x1) by Def9;
        (the_Edges_of H).x2 = (the_Edges_of G).x2 by A2, A5, Th101
          .= [: {[the_Edges_of F,x2]}, (the_Edges_of F).x2 :] by Th84;
        hence (the_Edges_of H).y1 misses (the_Edges_of H).y2 by A7, Lm5;
      end;
      suppose A8: x2 = z;
        then A9: (the_Vertices_of H).x2 = (the_Vertices_of F).x2 by Th97
          .= the_Vertices_of (F.x2) by Def8;
        (the_Vertices_of H).x1 = (the_Vertices_of G).x1 by A2, A8, Th98
          .= [: {[the_Vertices_of F,x1]}, (the_Vertices_of F).x1 :] by Th83;
        hence (the_Vertices_of H).y1 misses (the_Vertices_of H).y2 by A9, Lm4;
        A10: (the_Edges_of H).x2 = (the_Edges_of F).x2 by A8, Th100
          .= the_Edges_of (F.x2) by Def9;
        (the_Edges_of H).x1 = (the_Edges_of G).x1 by A2, A8, Th101
          .= [: {[the_Edges_of F,x1]}, (the_Edges_of F).x1 :] by Th84;
        hence (the_Edges_of H).y1 misses (the_Edges_of H).y2 by A10, Lm5;
      end;
    end;
    hence thesis by Th73;
  end;
end;

theorem Th103:
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  for x9 being Element of dom canGFDistinction(F,z) st x <> z & x = x9
  ex G being PGraphMapping of F.x,(canGFDistinction(F,z)).x9
  st G_V = renameElementsDistinctlyFunc(the_Vertices_of F,x) &
    G_E = renameElementsDistinctlyFunc(the_Edges_of F,x) &
    G is Disomorphism
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  let x9 be Element of dom canGFDistinction(F,z);
  assume A1: x <> z & x = x9;
  reconsider x8 = x9 as Element of dom canGFDistinction F by FUNCT_7:30;
  consider G0 being PGraphMapping of F.x, (canGFDistinction F).x8 such that
    A2: G0_V = renameElementsDistinctlyFunc(the_Vertices_of F,x) &
      G0_E = renameElementsDistinctlyFunc(the_Edges_of F,x) and
    A3: G0 is Disomorphism by A1, Th85;
  A4: (canGFDistinction F).x8 = canGFDistinction(F,z).x9 by A1, FUNCT_7:32;
  then reconsider G = G0 as PGraphMapping of F.x,(canGFDistinction(F,z)).x9;
  take G;
  thus thesis by A2, A3, A4;
end;

theorem Th104:
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  for x9 being Element of dom canGFDistinction(F,z) st x = x9
  holds (canGFDistinction(F,z)).x9 is F.x-Disomorphic
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  let x9 be Element of dom canGFDistinction(F,z);
  assume A1: x = x9;
  per cases;
  suppose x = z;
    then canGFDistinction(F,z).x = F.x | _GraphSelectors by Th96;
    hence thesis by A1, GLIB_000:128, GLIBPRE0:76;
  end;
  suppose x <> z;
    then consider G being PGraphMapping of F.x,(canGFDistinction(F,z)).x9
      such that G_V = renameElementsDistinctlyFunc(the_Vertices_of F,x) &
      G_E = renameElementsDistinctlyFunc(the_Edges_of F,x) and
      A2: G is Disomorphism by A1, Th103;
    thus thesis by A2, GLIB_010:def 24;
  end;
end;

theorem Th105:
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds F,canGFDistinction(F,z) are_Disomorphic
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  A1: dom F = dom canGFDistinction F by Def25
    .= dom canGFDistinction(F,z) by FUNCT_7:30;
  for x being Element of dom F, x9 being Element of dom canGFDistinction(F,z)
    st x = x9 holds (canGFDistinction(F,z)).x9 is F.x-Disomorphic by Th104;
  hence thesis by A1, Th38;
end;

theorem Th106:
  for F being non empty Graph-yielding Function, z being Element of dom F
  holds canGFDistinction(F),canGFDistinction(F,z) are_Disomorphic
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  A1: canGFDistinction F, F are_Disomorphic by Th87;
  F, canGFDistinction(F,z) are_Disomorphic by Th105;
  hence thesis by A1, Th40;
end;

theorem
  for F1, F2 being non empty Graph-yielding Function
  for z1 being Element of dom F1, z2 being Element of dom F2
  st F1, F2 are_Disomorphic
  holds canGFDistinction(F1,z1),canGFDistinction(F2,z2) are_Disomorphic
proof
  let F1, F2 be non empty Graph-yielding Function;
  let z1 be Element of dom F1, z2 be Element of dom F2;
  assume A1: F1,F2 are_Disomorphic;
  canGFDistinction(F1,z1), F1 are_Disomorphic by Th105;
  then A2: canGFDistinction(F1,z1), F2 are_Disomorphic by A1, Th40;
  F2, canGFDistinction(F2,z2) are_Disomorphic by Th105;
  hence thesis by A2, Th40;
end;

theorem
  for F being non empty Graph-yielding Function, z being Element of dom F
  for z9 being Element of dom canGFDistinction(F,z)
  for v,e,w being object st z = z9
  holds e DJoins v,w,F.z iff e DJoins v,w,canGFDistinction(F,z).z9
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  let z9 be Element of dom canGFDistinction(F,z), v,e,w be object;
  assume A1: z = z9;
  F.z == F.z | _GraphSelectors by GLIB_000:128;
  then F.z == canGFDistinction(F,z).z9 by A1, Th96;
  hence thesis by GLIB_000:88;
end;

theorem
  for F being non empty Graph-yielding Function, z being Element of dom F
  for z9 being Element of dom canGFDistinction(F,z)
  for v,e,w being object st z = z9
  holds e Joins v,w,F.z iff e Joins v,w,canGFDistinction(F,z).z9
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  let z9 be Element of dom canGFDistinction(F,z), v,e,w be object;
  assume A1: z = z9;
  F.z == F.z | _GraphSelectors by GLIB_000:128;
  then F.z == canGFDistinction(F,z).z9 by A1, Th96;
  hence thesis by GLIB_000:88;
end;

theorem
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  for x9 being Element of dom canGFDistinction(F,z)
  for v,e,w being object st x <> z & x = x9
  holds e DJoins v,w,F.x implies [the_Edges_of F,x,e] DJoins
    [the_Vertices_of F,x,v],[the_Vertices_of F,x,w],(canGFDistinction(F,z)).x9
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  let x9 be Element of dom canGFDistinction(F,z), v,e,w be object;
  assume A1: x <> z & x = x9;
  reconsider x8 = x9 as Element of dom canGFDistinction F by FUNCT_7:30;
  (canGFDistinction(F,z)).x9 = (canGFDistinction F).x8 by A1, FUNCT_7:32;
  hence thesis by A1, Th90;
end;

theorem
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  for x9 being Element of dom canGFDistinction(F,z)
  for v,e,w being object st x <> z & x = x9
  holds e Joins v,w,F.x implies [the_Edges_of F,x,e] Joins
    [the_Vertices_of F,x,v],[the_Vertices_of F,x,w],(canGFDistinction(F,z)).x9
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  let x9 be Element of dom canGFDistinction(F,z), v,e,w be object;
  assume A1: x <> z & x = x9;
  reconsider x8 = x9 as Element of dom canGFDistinction F by FUNCT_7:30;
  (canGFDistinction(F,z)).x9 = (canGFDistinction F).x8 by A1, FUNCT_7:32;
  hence thesis by A1, Th91;
end;

theorem
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  for x9 being Element of dom canGFDistinction(F,z)
  for v9,e9,w9 being object
  st x <> z & x = x9 & e9 DJoins v9,w9,(canGFDistinction(F,z)).x9
  ex v,e,w being object st e DJoins v,w,F.x &
    e9 = [the_Edges_of F,x,e] & v9 = [the_Vertices_of F,x,v] &
    w9 = [the_Vertices_of F,x,w]
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  let x9 be Element of dom canGFDistinction(F,z), v9,e9,w9 be object;
  assume A1: x <> z & x = x9 & e9 DJoins v9,w9,(canGFDistinction(F,z)).x9;
  reconsider x8 = x9 as Element of dom canGFDistinction F by FUNCT_7:30;
  (canGFDistinction(F,z)).x9 = (canGFDistinction F).x8 by A1, FUNCT_7:32;
  hence thesis by A1, Th92;
end;

theorem
  for F being non empty Graph-yielding Function, x,z being Element of dom F
  for x9 being Element of dom canGFDistinction(F,z)
  for v9,e9,w9 being object
  st x <> z & x = x9 & e9 Joins v9,w9,(canGFDistinction(F,z)).x9
  ex v,e,w being object st e Joins v,w,F.x &
    e9 = [the_Edges_of F,x,e] & v9 = [the_Vertices_of F,x,v] &
    w9 = [the_Vertices_of F,x,w]
proof
  let F be non empty Graph-yielding Function, x,z be Element of dom F;
  let x9 be Element of dom canGFDistinction(F,z), v9,e9,w9 be object;
  assume A1: x <> z & x = x9 & e9 Joins v9,w9,(canGFDistinction(F,z)).x9;
  reconsider x8 = x9 as Element of dom canGFDistinction F by FUNCT_7:30;
  (canGFDistinction(F,z)).x9 = (canGFDistinction F).x8 by A1, FUNCT_7:32;
  hence thesis by A1, Th93;
end;

registration
  let F be non empty loopless Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> loopless;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non loopless Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non loopless;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non-multi Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non-multi;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non non-multi Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non non-multi;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non-Dmulti Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non-Dmulti;
  coherence
  proof
    F,canGFDistinction(F,z) are_Disomorphic by Th105;
    hence thesis by Th49;
  end;
end;

registration
  let F be non empty non non-Dmulti Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non non-Dmulti;
  coherence
  proof
    F,canGFDistinction(F,z) are_Disomorphic by Th105;
    hence thesis by Th49;
  end;
end;

registration
  let F be non empty simple Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> simple;
  coherence;
end;

registration
  let F be non empty Dsimple Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> Dsimple;
  coherence;
end;

registration
  let F be non empty acyclic Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> acyclic;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non acyclic Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non acyclic;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty connected Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> connected;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non connected Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non connected;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty Tree-like Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> Tree-like;
  coherence;
end;

registration
  let F be non empty edgeless Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> edgeless;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

registration
  let F be non empty non edgeless Graph-yielding Function;
  let z be Element of dom F;
  cluster canGFDistinction(F,z) -> non edgeless;
  coherence
  proof
    F,canGFDistinction(F,z) are_isomorphic by Th42, Th105;
    hence thesis by Th48;
  end;
end;

theorem Th114:
  for G2, H being _Graph, F being PGraphMapping of G2, H
  st F is directed weak_SG-embedding
  ex G1 being Supergraph of G2 st G1 is H-Disomorphic
proof
  :: The basic idea is to replace the vertices of edges
  :: in H that correspond to G2 by the actual vertices and edges of G2.
  :: However, H could contain actual vertices and edges of G2 in other places,
  :: so we have to relabel the vertices and edges of H, too.
  let G2, H be _Graph, F be PGraphMapping of G2, H;
  assume A1: F is directed weak_SG-embedding;
  then reconsider F as one-to-one PGraphMapping of G2, H;
  :: construct the vertex map
  set c = the_Vertices_of H --> the_Vertices_of G2;
  set V = <: c, id the_Vertices_of H :> +* F_V";
  A2: dom <: c, id the_Vertices_of H :>
     = dom c /\ dom id the_Vertices_of H by FUNCT_3:def 7
    .= (the_Vertices_of H) /\ the_Vertices_of H;
  dom(F_V") = rng F_V by FUNCT_1:33;
  then A3: dom(F_V") c= the_Vertices_of H;
  A4: dom V = (the_Vertices_of H) \/ dom(F_V") by A2, FUNCT_4:def 1
    .= the_Vertices_of H by A3, XBOOLE_1:12;
  then reconsider V as ManySortedSet of the_Vertices_of H
    by RELAT_1:def 18, PARTFUN1:def 2;
  A5: V is non empty by A4;
  A6: rng(<: c, id the_Vertices_of H :>) /\ rng(F_V") = {}
  proof
    assume A7: rng(<: c, id the_Vertices_of H :>) /\ rng(F_V") <> {};
    set y = the Element of rng(<: c, id the_Vertices_of H :>) /\ rng(F_V");
    reconsider Y = y as set;
    A8: y in rng(<: c, id the_Vertices_of H :>) & y in rng(F_V")
      by A7, XBOOLE_0:def 4;
    then consider x being object such that
      A9: x in dom <: c, id the_Vertices_of H :> and
      A10: <: c, id the_Vertices_of H :>.x = y by FUNCT_1:def 3;
    A11: y = [c.x,(id the_Vertices_of H).x] by A9, A10, FUNCT_3:def 7
      .= [c.x,x] by A9, FUNCT_1:18
      .= [the_Vertices_of G2,x] by A9, FUNCOP_1:7;
    y in dom F_V by A8, FUNCT_1:33;
    then A12: y in the_Vertices_of G2;
    A13: the_Vertices_of G2 in {the_Vertices_of G2} by TARSKI:def 1;
    {the_Vertices_of G2} in {{the_Vertices_of G2,x},{the_Vertices_of G2}}
      by TARSKI:def 2;
    then {the_Vertices_of G2} in Y by A11, TARSKI:def 5;
    hence contradiction by A12, A13, XREGULAR:7;
  end;
  reconsider V as non empty one-to-one ManySortedSet of the_Vertices_of H
    by A5, A6, FUNCT_4:92, XBOOLE_0:def 7;
  :: construct the edge map
  set d = the_Edges_of H --> the_Edges_of G2;
  set E = <: d, id the_Edges_of H :> +* F_E";
  A14: dom <: d, id the_Edges_of H :>
     = dom d /\ dom id the_Edges_of H by FUNCT_3:def 7
    .= (the_Edges_of H) /\ the_Edges_of H;
  dom(F_E") = rng F_E by FUNCT_1:33;
  then A15: dom(F_E") c= the_Edges_of H;
  dom E = (the_Edges_of H) \/ dom(F_E") by A14, FUNCT_4:def 1
    .= the_Edges_of H by A15, XBOOLE_1:12;
  then reconsider E as ManySortedSet of the_Edges_of H
    by RELAT_1:def 18, PARTFUN1:def 2;
  A16: rng(<: d, id the_Edges_of H :>) /\ rng(F_E") = {}
  proof
    assume A17: rng(<: d, id the_Edges_of H :>) /\ rng(F_E") <> {};
    set y = the Element of rng(<: d, id the_Edges_of H :>) /\ rng(F_E");
    reconsider Y = y as set;
    A18: y in rng(<: d, id the_Edges_of H :>) & y in rng(F_E")
      by A17, XBOOLE_0:def 4;
    then consider x being object such that
      A19: x in dom <: d, id the_Edges_of H :> and
      A20: <: d, id the_Edges_of H :>.x = y by FUNCT_1:def 3;
    A21: x in the_Edges_of H by A14, A19;
    A22: y = [d.x,(id the_Edges_of H).x] by A19, A20, FUNCT_3:def 7
      .= [d.x,x] by A21, FUNCT_1:18
      .= [the_Edges_of G2,x] by A21, FUNCOP_1:7;
    A23: y in dom F_E by A18, FUNCT_1:33;
    A24: the_Edges_of G2 in {the_Edges_of G2} by TARSKI:def 1;
    {the_Edges_of G2} in {{the_Edges_of G2,x},{the_Edges_of G2}}
      by TARSKI:def 2;
    then {the_Edges_of G2} in Y by A22, TARSKI:def 5;
    hence contradiction by A23, A24, XREGULAR:7;
  end;
  reconsider E as one-to-one ManySortedSet of the_Edges_of H
    by A16, FUNCT_4:92, XBOOLE_0:def 7;
  :: show that the graph with vertices and edges replaced is a supergraph of G2
  set G1 = replaceVerticesEdges(V,E);
  now
    the_Vertices_of G2 = dom(F_V) by A1, GLIB_010:def 11
      .= rng(F_V") by FUNCT_1:33;
    then the_Vertices_of G2 c= rng V by FUNCT_4:18;
    hence the_Vertices_of G2 c= the_Vertices_of G1 by Th1;
    the_Edges_of G2 = dom(F_E) by A1, GLIB_010:def 11
      .= rng(F_E") by FUNCT_1:33;
    then the_Edges_of G2 c= rng E by FUNCT_4:18;
    hence the_Edges_of G2 c= the_Edges_of G1 by Th1;
    let e be set;
    assume A25: e in the_Edges_of G2;
    then A26: e in dom the_Source_of G2 by FUNCT_2:def 1;
    A27: e in dom the_Target_of G2 by A25, FUNCT_2:def 1;
    A28: e in dom(F_E) by A1, A25, GLIB_010:def 11;
    then A29: e in rng(F_E") by FUNCT_1:33;
    then e in rng E by TARSKI:def 3, FUNCT_4:18;
    then A30: e in dom(E") by FUNCT_1:33;
    A31: dom F_V = dom id rng(F_V") by FUNCT_1:33;
    A32: (the_Source_of G2).e in dom id rng(F_V") by A28, A31, GLIB_010:5;
    A33: (the_Target_of G2).e in dom id rng(F_V") by A28, A31, GLIB_010:5;
    thus (the_Source_of G2).e
       = (id rng(F_V")).((the_Source_of G2).e) by A32, FUNCT_1:18
      .= (V*F_V"").((the_Source_of G2).e) by GLIBPRE1:9
      .= (V*F_V""*(the_Source_of G2)).e by A26, FUNCT_1:13
      .= (V*F_V*(the_Source_of G2)).e by FUNCT_1:43
      .= (V*(F_V*((the_Source_of G2)|the_Edges_of G2))).e by RELAT_1:36
      .= (V*(F_V*((the_Source_of G2)|dom F_E))).e by A1, GLIB_010:def 11
      .= (V*((the_Source_of H)*F_E)).e by A1, GLIB_010:14
      .= ((V*the_Source_of H)*F_E).e by RELAT_1:36
      .= (V*the_Source_of H).(F_E.e) by A28, FUNCT_1:13
      .= (V*the_Source_of H).((F_E")".e) by FUNCT_1:43
      .= (V*the_Source_of H).((E"|rng(F_E")).e) by GLIBPRE1:7
      .= (V*the_Source_of H).(E".e) by A29, FUNCT_1:49
      .= (V*(the_Source_of H)*(E")).e by A30, FUNCT_1:13
      .= (the_Source_of G1).e by Th1;
    thus (the_Target_of G2).e
       = (id rng(F_V")).((the_Target_of G2).e) by A33, FUNCT_1:18
      .= (V*F_V"").((the_Target_of G2).e) by GLIBPRE1:9
      .= (V*F_V""*(the_Target_of G2)).e by A27, FUNCT_1:13
      .= (V*F_V*(the_Target_of G2)).e by FUNCT_1:43
      .= (V*(F_V*((the_Target_of G2)|the_Edges_of G2))).e by RELAT_1:36
      .= (V*(F_V*((the_Target_of G2)|dom F_E))).e by A1, GLIB_010:def 11
      .= (V*((the_Target_of H)*F_E)).e by A1, GLIB_010:14
      .= ((V*the_Target_of H)*F_E).e by RELAT_1:36
      .= (V*the_Target_of H).(F_E.e) by A28, FUNCT_1:13
      .= (V*the_Target_of H).((F_E")".e) by FUNCT_1:43
      .= (V*the_Target_of H).((E"|rng(F_E")).e) by GLIBPRE1:7
      .= (V*the_Target_of H).(E".e) by A29, FUNCT_1:49
      .= (V*(the_Target_of H)*(E")).e by A30, FUNCT_1:13
      .= (the_Target_of G1).e by Th1;
  end;
  then reconsider G1 as Supergraph of G2 by GLIB_006:def 9;
  take G1;
  thus thesis by Th17;
end;

theorem
  for G2, H being _Graph, F being PGraphMapping of G2, H
  st F is weak_SG-embedding ex G1 being Supergraph of G2 st G1 is H-isomorphic
proof
  let G2, H be _Graph, F be PGraphMapping of G2, H;
  assume A1: F is weak_SG-embedding;
  then reconsider F as one-to-one PGraphMapping of G2, H;
  F"_E is one-to-one;
  then consider E being Subset of the_Edges_of G2 such that
    A2: for G4 being reverseEdgeDirections of G2, E
      ex F9 being PGraphMapping of H, G4 st F9 = F" & F9 is directed &
        (F" is non empty  implies F9 is non empty) &
        (F" is total implies F9 is total) &
        (F" is one-to-one implies F9 is one-to-one) &
        (F" is onto implies F9 is onto) &
        (F" is semi-continuous implies F9 is semi-continuous) &
        (F" is continuous implies F9 is continuous) by GLIBPRE0:86;
  set G4 = the reverseEdgeDirections of G2, E;
  consider F9 being PGraphMapping of H, G4 such that
    A3: F9 = F" & F9 is directed and
    (F" is non empty  implies F9 is non empty) &
    (F" is total implies F9 is total) and
     A4: (F" is one-to-one implies F9 is one-to-one) and
     A5: (F" is onto implies F9 is onto) and
    (F" is semi-continuous implies F9 is semi-continuous) &
    (F" is continuous implies F9 is continuous) by A2;
  reconsider F9 as one-to-one PGraphMapping of H, G4 by A4;
  A6: F9 is onto by A1, A5, GLIB_010:71;
  then F9" is total by GLIB_010:72;
  then A7: F9" is weak_SG-embedding;
  F9 is Dcontinuous by A3, A6;
  then F9" is semi-Dcontinuous;
  then consider G3 being Supergraph of G4 such that
    A8: G3 is H-Disomorphic by A7, Th114;
  set G1 = the reverseEdgeDirections of G3, E;
  A9: G2 is reverseEdgeDirections of G4, E by GLIB_007:3;
  the_Edges_of G4 = the_Edges_of G2 by GLIB_007:4;
  then reconsider G1 as Supergraph of G2 by A9, GLIBPRE0:50;
  take G1;
  G1 is G3-isomorphic & G3 is H-isomorphic by A8, GLIBPRE0:78;
  hence thesis;
end;

begin :: The Sum of Graphs

definition
  let F be non empty Graph-yielding Function;
  mode GraphSum of F -> _Graph means
  :Def27:
  ex G9 being GraphUnion of rng canGFDistinction(F) st it is G9-Disomorphic;
  existence
  proof
    take G9 = the GraphUnion of rng canGFDistinction(F);
    G9 is G9-Disomorphic by GLIB_010:53;
    hence thesis;
  end;
end;

theorem Th116:
  for F being non empty Graph-yielding Function, S being GraphSum of F
  for G9 being GraphUnion of rng canGFDistinction(F)
  holds S is G9-Disomorphic
proof
  let F be non empty Graph-yielding Function, S be GraphSum of F;
  let G9 be GraphUnion of rng canGFDistinction(F);
  consider G8 being GraphUnion of rng canGFDistinction(F) such that
    A1: S is G8-Disomorphic by Def27;
  G8 is G9-Disomorphic by GLIB_014:22, GLIBPRE0:76;
  hence thesis by A1;
end;

theorem Th117:
  for F1, F2 being non empty Graph-yielding Function
  for S1 being GraphSum of F1, S2 being GraphSum of F2
  st F1, F2 are_Disomorphic holds S2 is S1-Disomorphic
proof
  let F1, F2 be non empty Graph-yielding Function;
  let S1 be GraphSum of F1, S2 be GraphSum of F2;
  set C1 = canGFDistinction(F1), C2 = canGFDistinction(F2);
  set T1 = (the GraphUnion of rng C1), T2 = the GraphUnion of rng C2;
  assume F1,F2 are_Disomorphic;
  then rng C1, rng C2 are_Disomorphic by Th74, Th88;
  then A1: T2 is T1-Disomorphic by Th55;
  A2: S1 is T1-Disomorphic & S2 is T2-Disomorphic by Th116;
  then T1 is S1-Disomorphic by GLIB_010:96;
  hence thesis by A1, A2;
end;

theorem
  for F1, F2 being non empty Graph-yielding Function
  for S1 being GraphSum of F1, S2 being GraphSum of F2
  st F1, F2 are_isomorphic holds S2 is S1-isomorphic
proof
  let F1, F2 be non empty Graph-yielding Function;
  let S1 be GraphSum of F1, S2 be GraphSum of F2;
  set C1 = canGFDistinction(F1), C2 = canGFDistinction(F2);
  set T1 = (the GraphUnion of rng C1), T2 = the GraphUnion of rng C2;
  assume F1,F2 are_isomorphic;
  then C1, C2 are_isomorphic by Th89;
  then A1: T2 is T1-isomorphic by Th57, Th75;
  A2: S1 is T1-Disomorphic & S2 is T2-Disomorphic by Th116;
  then S1 is T1-isomorphic;
  then T1 is S1-isomorphic by GLIB_010:95;
  hence thesis by A1, A2;
end;

theorem
  for F being non empty Graph-yielding Function, S1, S2 being GraphSum of F
  holds S2 is S1-Disomorphic by Th117;

:: theorem
::   for F, G being non empty Graph-yielding Function, R being GraphUnionSet
::   for S being GraphUnion of R
::   st R = rng G & G,canGFDistinction(F) are_Disomorphic
::   holds S is GraphSum of F;

theorem Th120:
  for x being object, G being _Graph, S being GraphSum of x .--> G
  holds S is G-Disomorphic
proof
  let x be object, G be _Graph, S be GraphSum of x .--> G;
  x in {x} by TARSKI:def 1;
  then x in dom{[x,G]} by RELAT_1:9;
  then reconsider x0 = x as Element of dom(x .--> G) by FUNCT_4:82;
  set H = replaceVerticesEdges(
    renameElementsDistinctlyFunc(the_Vertices_of (x .--> G),x0),
    renameElementsDistinctlyFunc(the_Edges_of (x .--> G),x0));
  A1: (canGFDistinction(x .--> G)).x = H by Def25;
  dom canGFDistinction(x .--> G) = dom (x .--> G) by Def25
    .= dom{[x,G]} by FUNCT_4:82
    .= {x} by RELAT_1:9;
  then canGFDistinction(x .--> G) = x .--> H by A1, DICKSON:1;
  then A2: rng canGFDistinction(x .--> G) = {H} by FUNCOP_1:88;
  consider G9 being GraphUnion of rng canGFDistinction(x .--> G) such that
    A3: S is G9-Disomorphic by Def27;
  H is ((x .--> G).x0)-Disomorphic & (x .--> G).x = G by Th17, FUNCOP_1:72;
  then A4: H is G-Disomorphic;
  G9 == H by A2, GLIB_014:24;
  then G9 is H-Disomorphic by GLIBPRE0:76;
  then G9 is G-Disomorphic by A4;
  hence S is G-Disomorphic by A3;
end;

theorem
  for F being non empty Graph-yielding Function, S being GraphSum of F
  st S is connected
  ex x being object, G being connected _Graph st F = x .--> G
proof
  let F be non empty Graph-yielding Function, S be GraphSum of F;
  assume A1: S is connected;
  consider G9 being GraphUnion of rng canGFDistinction F such that
    A2: S is G9-Disomorphic by Def27;
  consider M being PGraphMapping of G9, S such that
    A3: M is Disomorphism by A2, GLIB_010:def 24;
  G9 is connected by A1, A3, GLIB_010:140;
  then consider H being _Graph such that
    A4: rng canGFDistinction F = {H} by Th59;
  consider x being object such that
    A5: canGFDistinction F = x .--> H by A4, GLIBPRE1:4;
  A6: {x} = dom{[x,H]} by RELAT_1:9
    .= dom canGFDistinction F by A5, FUNCT_4:82
    .= dom F by Def25;
  then reconsider x0 = x as Element of dom F by TARSKI:def 1;
  A7: F = x .--> F.x0 by A6, DICKSON:1;
  then S is F.x0-Disomorphic by Th120;
  then consider M being PGraphMapping of F.x0,S such that
    A8: M is Disomorphism by GLIB_010:def 24;
  reconsider G = F.x0 as connected _Graph by A1, A8, GLIB_010:140;
  take x, G;
  thus thesis by A7;
end;

registration
  let X be non empty set;
  cluster non empty vertex-disjoint edge-disjoint
    for Graph-yielding ManySortedSet of X;
  existence
  proof
    set G = the _Graph, f = canGFDistinction(X --> G);
    A1: dom f = dom(X --> G) by Def25
      .= X;
    then reconsider f as X-defined Function by RELAT_1:def 18;
    reconsider f as Graph-yielding ManySortedSet of X by A1, PARTFUN1:def 2;
    take f;
    thus thesis;
  end;
end;

theorem
  for F being non empty Graph-yielding Function, x being Element of dom F
  for S being GraphSum of F
  ex M being PGraphMapping of F.x,S st M is strong_SG-embedding
proof
  let F be non empty Graph-yielding Function, x be Element of dom F;
  let S be GraphSum of F;
  set C = canGFDistinction F;
  consider G9 being GraphUnion of rng C such that
    A1: S is G9-Disomorphic by Def27;
  consider M1 being PGraphMapping of G9, S such that
    A2: M1 is Disomorphism by A1, GLIB_010:def 24;
  set H = replaceVerticesEdges(
    renameElementsDistinctlyFunc(the_Vertices_of F,x),
    renameElementsDistinctlyFunc(the_Edges_of F,x));
  set V = the_Vertices_of H;
  x in dom F;
  then H = C.x & x in dom C by Def25;
  then H in rng C by FUNCT_1:3;
  then reconsider H as inducedSubgraph of G9, V by Th62;
  A3: M1 | H is strong_SG-embedding by A2, GLIB_010:58;
  H is F.x-Disomorphic by Th17;
  then consider M2 being PGraphMapping of F.x,H such that
    A4: M2 is Disomorphism by GLIB_010:def 24;
  take (M1 | H) * M2;
  thus thesis by A3, A4, GLIB_010:108;
end;

:: This is a possible generalization of the preceeding theorem.
:: :: A graph sum can be divided into its (direct, not isomorphic) parts.
:: theorem
  :: for F1 being non empty Graph-yielding Function, S being GraphSum of F1
  :: ex F2 being non empty vertex-disjoint edge-disjoint
    :: Graph-yielding ManySortedSet of dom F1
  :: st S is GraphUnion of rng F2 &
    :: for x being Element of dom F1 holds F2.x is F1.x-Disomorphic
:: proof
  :: let F1 be non empty Graph-yielding Function, S be GraphSum of F1;
  :: :: construct function from dom F1 to a Disomorphism from F1.x to GFD(F1).x |H1
  :: :: construct function from dom F1 to injection from GFD(F1).x into G9 |H2
  :: :: the Disomorphism from G9 to S |F
  :: :: set F2.x = rng (F*(H2.x)*(H1.x))
  :: :: show F2.x is Disomorphism from F1.x to F2.x
  :: :: show F2 is vertex-disjoint
  :: :: show F2 is edge-disjoint
  :: :: show S is GraphUnion
  :: thus thesis;
:: end;

theorem Th123:
  for F being non empty Graph-yielding Function, z being Element of dom F
  ex S being GraphSum of F st S is Supergraph of F.z &
    S is GraphUnion of rng canGFDistinction(F,z)
proof
  let F be non empty Graph-yielding Function, z be Element of dom F;
  set S = the GraphUnion of rng canGFDistinction(F,z);
  set G9 = the GraphUnion of rng canGFDistinction(F);
  set G0 = F.z | _GraphSelectors;
  canGFDistinction(F), canGFDistinction(F,z) are_Disomorphic by Th106;
  then S is G9-Disomorphic by Th55, Th74;
  then reconsider S as GraphSum of F by Def27;
  take S;
  z in dom F;
  then z in dom canGFDistinction(F,z) by Th94;
  then canGFDistinction(F,z).z in rng canGFDistinction(F,z) by FUNCT_1:3;
  then G0 in rng canGFDistinction(F,z) by Th95;
  then A1: G0 is Subgraph of S by GLIB_014:21;
  G0 == F.z by GLIB_000:128;
  then F.z is Subgraph of S by A1, GLIB_000:92;
  hence thesis by GLIB_006:57;
end;

theorem Th124:
  for F being non empty Graph-yielding Function, S being GraphSum of F holds
    (F is loopless iff S is loopless) &
    (F is non-multi iff S is non-multi) &
    (F is non-Dmulti iff S is non-Dmulti) &
    (F is simple iff S is simple) &
    (F is Dsimple iff S is Dsimple) &
    (F is chordal iff S is chordal) &
    (F is edgeless iff S is edgeless) &
    (F is loopfull iff S is loopfull)
proof
  let F be non empty Graph-yielding Function, S be GraphSum of F;
  consider G9 being GraphUnion of rng canGFDistinction(F) such that
    A1: S is G9-Disomorphic by Def27;
  consider H being PGraphMapping of G9, S such that
    A2: H is Disomorphism by A1, GLIB_010:def 24;
  F, canGFDistinction(F) are_Disomorphic by Th87;
  then A3: F, canGFDistinction(F) are_isomorphic by Th42;
  :: loopless
  thus A4: F is loopless implies S is loopless by A2, GLIB_010:89;
  thus A5: S is loopless implies F is loopless
  proof
    assume S is loopless;
    then G9 is loopless by A2, GLIB_010:89;
    then rng canGFDistinction(F) is loopless by GLIB_014:23;
    hence F is loopless by GLIB_014:3;
  end;
  :: non-multi
  thus A6: F is non-multi implies S is non-multi by A2, GLIB_010:89;
  thus A7: S is non-multi implies F is non-multi
  proof
    assume S is non-multi;
    then G9 is non-multi by A2, GLIB_010:89;
    then rng canGFDistinction(F) is non-multi by Th60;
    hence F is non-multi by GLIB_014:3;
  end;
  :: non-Dmulti
  thus A8: F is non-Dmulti implies S is non-Dmulti by A2, GLIB_010:90;
  thus A9: S is non-Dmulti implies F is non-Dmulti
  proof
    assume S is non-Dmulti;
    then G9 is non-Dmulti by A2, GLIB_010:90;
    then rng canGFDistinction(F) is non-Dmulti by Th60;
    hence F is non-Dmulti by GLIB_014:3;
  end;
  :: simple
  thus F is simple implies S is simple by A4, A6;
  thus S is simple implies F is simple by A5, A7;
  :: Dsimple
  thus F is Dsimple implies S is Dsimple by A4, A8;
  thus S is Dsimple implies F is Dsimple by A5, A9;
  :: chordal
  hereby
    assume F is chordal;
    then canGFDistinction(F) is chordal by A3, Th48;
    then G9 is chordal by Th63;
    hence S is chordal by A2, GLIB_010:140;
  end;
  hereby
    assume S is chordal;
    then G9 is chordal by A2, GLIB_010:140;
    then rng canGFDistinction(F) is chordal by Th63;
    then canGFDistinction(F) is chordal by GLIB_014:3;
    hence F is chordal by A3, Th48;
  end;
  :: edgeless
  thus F is edgeless implies S is edgeless by A2, GLIB_010:89;
  hereby
    assume S is edgeless;
    then G9 is edgeless by A2, GLIB_010:89;
    then rng canGFDistinction(F) is edgeless by GLIB_014:23;
    hence F is edgeless by GLIB_014:3;
  end;
  :: loopfull
  hereby
    assume F is loopfull;
    then canGFDistinction(F) is loopfull by A3, Th48;
    then rng canGFDistinction(F) is loopfull;
    hence S is loopfull by A2, GLIB_012:10;
  end;
  hereby
    assume S is loopfull;
    then G9 is loopfull by A2, GLIB_012:10;
    then rng canGFDistinction(F) is loopfull by Th63;
    then canGFDistinction(F) is loopfull by GLIB_014:3;
    hence F is loopfull by A3, Th48;
  end;
end;

registration
  let F be non empty loopless Graph-yielding Function;
  cluster -> loopless for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty non loopless Graph-yielding Function;
  cluster -> non loopless for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty non-Dmulti Graph-yielding Function;
  cluster -> non-Dmulti for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty non non-Dmulti Graph-yielding Function;
  cluster -> non non-Dmulti for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty non-multi Graph-yielding Function;
  cluster -> non-multi for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty non non-multi Graph-yielding Function;
  cluster -> non non-multi for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty simple Graph-yielding Function;
  cluster -> simple for GraphSum of F;
  coherence;
end;

registration
  let F be non empty Dsimple Graph-yielding Function;
  cluster -> Dsimple for GraphSum of F;
  coherence;
end;

registration
  let F be non empty edgeless Graph-yielding Function;
  cluster -> edgeless for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty non edgeless Graph-yielding Function;
  cluster -> non edgeless for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty loopfull Graph-yielding Function;
  cluster -> loopfull for GraphSum of F;
  coherence by Th124;
end;

registration
  let F be non empty non loopfull Graph-yielding Function;
  cluster -> non loopfull for GraphSum of F;
  coherence by Th124;
end;

theorem Th125:
  for F being non empty Graph-yielding Function, S being GraphSum of F holds
    (F is acyclic iff S is acyclic) &
    (F is chordal iff S is chordal)
proof
  let F be non empty Graph-yielding Function, S be GraphSum of F;
  consider G9 being GraphUnion of rng canGFDistinction(F) such that
    A1: S is G9-Disomorphic by Def27;
  consider H being PGraphMapping of G9, S such that
    A2: H is Disomorphism by A1, GLIB_010:def 24;
  F, canGFDistinction(F) are_Disomorphic by Th87;
  then A3: F, canGFDistinction(F) are_isomorphic by Th42;
  :: acyclic
  thus F is acyclic implies S is acyclic by A2, GLIB_010:140;
  hereby
    assume S is acyclic;
    then G9 is acyclic by A2, GLIB_010:140;
    then rng canGFDistinction(F) is acyclic by Th60;
    hence F is acyclic by GLIB_014:3;
  end;
  :: chordal
  hereby
    assume F is chordal;
    then canGFDistinction(F) is chordal by A3, Th48;
    then G9 is chordal by Th63;
    hence S is chordal by A2, GLIB_010:140;
  end;
  hereby
    assume S is chordal;
    then G9 is chordal by A2, GLIB_010:140;
    then rng canGFDistinction(F) is chordal by Th63;
    then canGFDistinction(F) is chordal by GLIB_014:3;
    hence F is chordal by A3, Th48;
  end;
end;

registration
  let F be non empty acyclic Graph-yielding Function;
  cluster -> acyclic for GraphSum of F;
  coherence by Th125;
end;

registration
  let F be non empty non acyclic Graph-yielding Function;
  cluster -> non acyclic for GraphSum of F;
  coherence by Th125;
end;

theorem
  for F being non empty Graph-yielding Function, S being GraphSum of F
  holds card F c= S.numComponents()
proof
  let F be non empty Graph-yielding Function, S be GraphSum of F;
  consider G9 being GraphUnion of rng canGFDistinction(F) such that
    A1: S is G9-Disomorphic by Def27;
  consider H being PGraphMapping of G9, S such that
    A2: H is Disomorphism by A1, GLIB_010:def 24;
  A3: card F = card dom F by CARD_1:62
    .= card dom canGFDistinction(F) by Def25
    .= card rng canGFDistinction(F) by CARD_1:70;
  S.numComponents() = G9.numComponents() by A2, GLIBPRE1:83;
  hence thesis by A3, Th68;
end;

theorem
  for F being non empty connected Graph-yielding Function,S being GraphSum of F
  holds card F = S.numComponents()
proof
  let F be non empty connected Graph-yielding Function, S be GraphSum of F;
  consider G9 being GraphUnion of rng canGFDistinction(F) such that
    A1: S is G9-Disomorphic by Def27;
  consider H being PGraphMapping of G9, S such that
    A2: H is Disomorphism by A1, GLIB_010:def 24;
  A3: card F = card dom F by CARD_1:62
    .= card dom canGFDistinction(F) by Def25
    .= card rng canGFDistinction(F) by CARD_1:70;
  S.numComponents() = G9.numComponents() by A2, GLIBPRE1:83;
  hence thesis by A3, Th69;
end;

begin :: The Sum of two Graphs

definition
  let G1, G2 be _Graph;
  mode GraphSum of G1, G2 -> Supergraph of G1 means
  :Def28:
  it is GraphSum of <* G1, G2 *>;
  existence
  proof
    1 in {1,2} by TARSKI:def 2;
    then reconsider z = 1 as Element of dom <* G1, G2 *> by FINSEQ_1:92;
    consider S being GraphSum of <* G1, G2 *> such that
      A1: S is Supergraph of <* G1, G2 *>.z and
      S is GraphUnion of rng canGFDistinction(<* G1, G2 *>,z) by Th123;
    reconsider S as Supergraph of G1 by A1;
    take S;
    thus thesis;
  end;
end;

theorem Th128:
  for G1, G2 being _Graph, S being GraphSum of G1, G2 holds
    (G1 is loopless & G2 is loopless iff S is loopless) &
    (G1 is non-multi & G2 is non-multi iff S is non-multi) &
    (G1 is non-Dmulti & G2 is non-Dmulti iff S is non-Dmulti) &
    (G1 is simple & G2 is simple iff S is simple) &
    (G1 is Dsimple & G2 is Dsimple iff S is Dsimple) &
    (G1 is acyclic & G2 is acyclic iff S is acyclic) &
    (G1 is chordal & G2 is chordal iff S is chordal) &
    (G1 is edgeless & G2 is edgeless iff S is edgeless) &
    (G1 is loopfull & G2 is loopfull iff S is loopfull)
proof
  let G1, G2 be _Graph, S be GraphSum of G1, G2;
  1 in {1,2} & 2 in {1,2} by TARSKI:def 2;
  then A1: 1 in dom <* G1, G2 *> & 2 in dom <* G1, G2 *> by FINSEQ_1:92;
  A2: <* G1, G2 *>.1 = G1 & <* G1, G2 *>.2 = G2;
  A3: S is GraphSum of <* G1, G2 *> by Def28;
  :: loopless
  thus G1 is loopless & G2 is loopless implies S is loopless by A3;
  hereby
    assume S is loopless;
    then <* G1, G2 *> is loopless by A3;
    hence G1 is loopless & G2 is loopless by A1, A2;
  end;
  :: non-multi
  thus G1 is non-multi & G2 is non-multi implies S is non-multi by A3;
  hereby
    assume S is non-multi;
    then <* G1, G2 *> is non-multi by A3;
    hence G1 is non-multi & G2 is non-multi by A1, A2;
  end;
  :: non-Dmulti
  thus G1 is non-Dmulti & G2 is non-Dmulti implies S is non-Dmulti by A3;
  hereby
    assume S is non-Dmulti;
    then <* G1, G2 *> is non-Dmulti by A3;
    hence G1 is non-Dmulti & G2 is non-Dmulti by A1, A2;
  end;
  :: simple
  thus G1 is simple & G2 is simple implies S is simple by A3;
  hereby
    assume S is simple;
    then <* G1, G2 *> is simple by A3, Th124;
    hence G1 is simple & G2 is simple by A1, A2;
  end;
  :: Dsimple
  thus G1 is Dsimple & G2 is Dsimple implies S is Dsimple by A3;
  hereby
    assume S is Dsimple;
    then <* G1, G2 *> is Dsimple by A3, Th124;
    hence G1 is Dsimple & G2 is Dsimple by A1, A2;
  end;
  :: acyclic
  thus G1 is acyclic & G2 is acyclic implies S is acyclic by A3;
  hereby
    assume S is acyclic;
    then <* G1, G2 *> is acyclic by A3;
    hence G1 is acyclic & G2 is acyclic by A1, A2;
  end;
  :: chordal
  thus G1 is chordal & G2 is chordal implies S is chordal by A3, Th124;
  hereby
    assume S is chordal;
    then <* G1, G2 *> is chordal by A3, Th124;
    hence G1 is chordal & G2 is chordal by A1, A2;
  end;
  :: edgeless
  thus G1 is edgeless & G2 is edgeless implies S is edgeless by A3;
  hereby
    assume S is edgeless;
    then <* G1, G2 *> is edgeless by A3;
    hence G1 is edgeless & G2 is edgeless by A1, A2;
  end;
  :: loopfull
  thus G1 is loopfull & G2 is loopfull implies S is loopfull by A3;
  hereby
    assume S is loopfull;
    then <* G1, G2 *> is loopfull by A3;
    hence G1 is loopfull & G2 is loopfull by A1, A2;
  end;
end;

registration
  let G1, G2 be loopless _Graph;
  cluster -> loopless for GraphSum of G1, G2;
  coherence by Th128;
end;

registration
  let G1, G2 be non loopless _Graph;
  cluster -> non loopless for GraphSum of G1, G2;
  coherence;
end;

registration
  let G1, G2 be non-Dmulti _Graph;
  cluster -> non-Dmulti for GraphSum of G1, G2;
  coherence by Th128;
end;

registration
  let G1, G2 be non non-Dmulti _Graph;
  cluster -> non non-Dmulti for GraphSum of G1, G2;
  coherence;
end;

registration
  let G1, G2 be non-multi _Graph;
  cluster -> non-multi for GraphSum of G1, G2;
  coherence by Th128;
end;

registration
  let G1, G2 be non non-multi _Graph;
  cluster -> non non-multi for GraphSum of G1, G2;
  coherence;
end;

registration
  let G1, G2 be simple _Graph;
  cluster -> simple for GraphSum of G1, G2;
  coherence;
end;

registration
  let G1, G2 be Dsimple _Graph;
  cluster -> Dsimple for GraphSum of G1, G2;
  coherence;
end;

registration
  let G1, G2 be acyclic _Graph;
  cluster -> acyclic for GraphSum of G1, G2;
  coherence by Th128;
end;

registration
  let G1, G2 be non acyclic _Graph;
  cluster -> non acyclic for GraphSum of G1, G2;
  coherence;
end;

registration
  let G1, G2 be edgeless _Graph;
  cluster -> edgeless for GraphSum of G1, G2;
  coherence by Th128;
end;

registration
  let G1, G2 be non edgeless _Graph;
  cluster -> non edgeless for GraphSum of G1, G2;
  coherence;
end;

registration
  let G1, G2 be loopfull _Graph;
  cluster -> loopfull for GraphSum of G1, G2;
  coherence by Th128;
end;

registration
  let G1, G2 be non loopfull _Graph;
  cluster -> non loopfull for GraphSum of G1, G2;
  coherence by Th128;
end;

:: This is the two summands version and a corrolary
:: of the outcommented theorem above.
:: theorem Th147:
  :: for G1, G2 being _Graph, S being GraphSum of G1, G2
  :: ex G3 being _Graph
  :: st <* G1, G3 *> is vertex-disjoint edge-disjoint &
    :: G3 is G2-Disomorphic & S is GraphUnion of G1, G3 & S is GraphSum of G1, G3;

Lm6:
  for G1, G2 being _Graph
  for G9 being GraphUnion of rng canGFDistinction <* G1, G2 *>
  ex G3, G4 being _Graph
  st the_Edges_of G3 misses the_Edges_of G4 & G3 tolerates G4 &
    the_Vertices_of G3 misses the_Vertices_of G4 & G9 is GraphUnion of G3, G4 &
    G3 is G1-Disomorphic & G4 is G2-Disomorphic
proof
  let G1, G2 be _Graph;
  set F = <* G1, G2 *>;
  reconsider x = 1, y = 2 as Element of dom F by CALCUL_1:14;
  set R = rng canGFDistinction F;
  let G9 being GraphUnion of rng canGFDistinction F;
  A1: dom canGFDistinction F = dom F by Def25
    .= { x,y } by FINSEQ_1:92;
  then A2: x in dom canGFDistinction F & y in dom canGFDistinction F
    by TARSKI:def 2;
  then reconsider G3 = (canGFDistinction F).x, G4 = (canGFDistinction F).y
    as _Graph;
  take G3, G4;
  thus the_Edges_of G3 misses the_Edges_of G4 by A2, Def23;
  hence A3: G3 tolerates G4 by GLIB_014:12;
  thus the_Vertices_of G3 misses the_Vertices_of G4 by A2, Def22;
  A4: dom canGFDistinction F = Seg 2 by A1, FINSEQ_1:2;
  then reconsider p = canGFDistinction F as FinSequence by FINSEQ_1:def 2;
  len p = 2 by A4, FINSEQ_1:def 3;
  then p = <* G3,G4 *> by FINSEQ_1:44;
  then A5: rng p = { G3,G4 } by FINSEQ_2:127;
  then G3 in rng p by TARSKI:def 2;
  then G3 is Subgraph of G9 by GLIB_014:21;
  then G9 is Supergraph of G3 by GLIB_006:57;
  hence G9 is GraphUnion of G3, G4 by A3, A5, GLIB_014:def 26;
  A6: F.x = G1 & F.y = G2;
  hence G3 is G1-Disomorphic by A2, Th86;
  thus G4 is G2-Disomorphic by A2, A6, Th86;
end;

theorem
  for G1, G2 being _Graph, S being GraphSum of G1, G2
  holds S.order() = G1.order() +` G2.order()
proof
  let G1, G2 be _Graph, S be GraphSum of G1, G2;
  S is GraphSum of <* G1, G2 *> by Def28;
  then consider G9 being GraphUnion of rng canGFDistinction <* G1, G2 *>
    such that A1: S is G9-Disomorphic by Def27;
  consider H being PGraphMapping of G9, S such that
    A2: H is Disomorphism by A1, GLIB_010:def 24;
  consider G3, G4 being _Graph such that
    the_Edges_of G3 misses the_Edges_of G4 and
    A3: G3 tolerates G4 and
    A4: the_Vertices_of G3 misses the_Vertices_of G4 and
    A5: G9 is GraphUnion of G3, G4 and
    A6: G3 is G1-Disomorphic & G4 is G2-Disomorphic by Lm6;
  consider H1 being PGraphMapping of G1, G3 such that
    A7: H1 is Disomorphism by A6, GLIB_010:def 24;
  consider H2 being PGraphMapping of G2, G4 such that
    A8: H2 is Disomorphism by A6, GLIB_010:def 24;
  thus S.order() = G9.order() by A2, GLIB_010:84
    .= G3.order() +` G4.order() by A3, A4, A5, GLIBPRE1:120
    .= G1.order() +` G4.order() by A7, GLIB_010:84
    .= G1.order() +` G2.order() by A8, GLIB_010:84;
end;

theorem
  for G1, G2 being _Graph, S being GraphSum of G1, G2
  holds S.size() = G1.size() +` G2.size()
proof
  let G1, G2 be _Graph, S be GraphSum of G1, G2;
  S is GraphSum of <* G1, G2 *> by Def28;
  then consider G9 being GraphUnion of rng canGFDistinction(<* G1, G2 *>)
    such that A1: S is G9-Disomorphic by Def27;
  consider H being PGraphMapping of G9, S such that
    A2: H is Disomorphism by A1, GLIB_010:def 24;
  consider G3, G4 being _Graph such that
    A3: the_Edges_of G3 misses the_Edges_of G4 and
    A4: G3 tolerates G4 and
    the_Vertices_of G3 misses the_Vertices_of G4 and
    A5: G9 is GraphUnion of G3, G4 and
    A6: G3 is G1-Disomorphic & G4 is G2-Disomorphic by Lm6;
  consider H1 being PGraphMapping of G1, G3 such that
    A7: H1 is Disomorphism by A6, GLIB_010:def 24;
  consider H2 being PGraphMapping of G2, G4 such that
    A8: H2 is Disomorphism by A6, GLIB_010:def 24;
  thus S.size() = G9.size() by A2, GLIB_010:84
    .= G3.size() +` G4.size() by A3, A4, A5, GLIBPRE1:121
    .= G1.size() +` G4.size() by A7, GLIB_010:84
    .= G1.size() +` G2.size() by A8, GLIB_010:84;
end;

theorem
  for G1, G2 being _Graph, S being GraphSum of G1, G2
  holds S.numComponents() = G1.numComponents() +` G2.numComponents()
proof
  let G1, G2 be _Graph, S be GraphSum of G1, G2;
  S is GraphSum of <* G1, G2 *> by Def28;
  then consider G9 being GraphUnion of rng canGFDistinction(<* G1, G2 *>)
    such that A1: S is G9-Disomorphic by Def27;
  consider H being PGraphMapping of G9, S such that
    A2: H is Disomorphism by A1, GLIB_010:def 24;
  consider G3, G4 being _Graph such that
    the_Edges_of G3 misses the_Edges_of G4 and
    A3: G3 tolerates G4 and
    A4: the_Vertices_of G3 misses the_Vertices_of G4 and
    A5: G9 is GraphUnion of G3, G4 and
    A6: G3 is G1-Disomorphic & G4 is G2-Disomorphic by Lm6;
  consider H1 being PGraphMapping of G1, G3 such that
    A7: H1 is Disomorphism by A6, GLIB_010:def 24;
  consider H2 being PGraphMapping of G2, G4 such that
    A8: H2 is Disomorphism by A6, GLIB_010:def 24;
  thus S.numComponents() = G9.numComponents() by A2, GLIBPRE1:83
    .= G3.numComponents() +` G4.numComponents() by A3, A4, A5, GLIBPRE1:126
    .= G1.numComponents() +` G4.numComponents() by A7, GLIBPRE1:83
    .= G1.numComponents() +` G2.numComponents() by A8, GLIBPRE1:83;
end;