GLIB_012

index · ← GLIBPRE0 · WALLACE1 →
:: About Graph Complements
::  by Sebastian Koch
::
:: Received December 30, 2019
:: Copyright (c) 2019-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, GLIB_000, RING_3, PARTFUN1, FUNCT_2, CHORD,
      SCMYCIEL, REWRITE1, ARYTM_1, GLIB_006, GLIB_007, GLIB_009, GLIB_010,
      GLIB_011, GLIB_012, MCART_1, WAYBEL_0, MOD_4, RELAT_2, GRAPH_1, GLIB_001,
      ORDINAL4, ABIAN, SGRAPH1, RFINSEQ, FINSEQ_8, GRAPH_2;
 notations TARSKI, XBOOLE_0, XTUPLE_0, ZFMISC_1, SUBSET_1, RELAT_1, FUNCT_1,
      ORDINAL1, RELSET_1, PARTFUN1, FUNCT_2, BINOP_1, DOMAIN_1, FUNCOP_1,
      ENUMSET1, FUNCT_4, FINSET_1, CARD_1, PBOOLE, NUMBERS, XCMPLX_0, XXREAL_0,
      XREAL_0, NAT_1, INT_1, VALUED_0, NAT_D, CARD_2, FINSEQ_1, NEWTON, ABIAN,
      RFINSEQ, FINSEQ_6, FINSEQ_8, GRAPH_2, GLIB_000, GLIB_001, GLIB_002,
      CHORD, GLIB_006, GLIB_007, GLIB_008, GLIB_009, GLIB_010, GLIB_011;
 constructors DOMAIN_1, FUNCT_4, XXREAL_0, NAT_1, NAT_D, BINOP_2, CARD_2,
      FINSEQ_4, PBOOLE, ORDINAL3, WELLORD2, PARTFUN1, RELSET_1, GLIB_000,
      NEWTON, XTUPLE_0, CHORD, GLIB_002, GLIB_006, GLIB_007, GLIB_008,
      GLIB_009, GLIB_010, GLIB_011, GLIB_001, ABIAN, BINOP_1, FINSOP_1,
      RVSUM_1, FINSEQ_5, GRAPH_5, FUNCT_2, FIB_NUM2, FINSEQ_8, HELLY, FUNCT_3,
      GRAPH_2, RFINSEQ, FINSEQ_6, FUNCT_7, FINSEQ_1, SUBSET_1, RELAT_1,
      ENUMSET1, ORDINAL1, INT_1, XREAL_0, XCMPLX_0, FINSET_1, CARD_3, FUNCT_1;
 registrations XBOOLE_0, SUBSET_1, RELAT_1, FUNCT_1, FUNCOP_1, FINSET_1,
      XREAL_0, NAT_1, CARD_1, FINSEQ_1, RELSET_1, GLIB_000, CHORD, GLIB_006,
      GLIB_007, GLIB_009, GLIB_008, GLIB_010, GLIB_011, XTUPLE_0, ABIAN,
      GLIB_001, MEMBERED, INT_1, MSAFREE5;
 requirements ARITHM, BOOLE, NUMERALS, REAL, SUBSET;
 equalities ORDINAL1, GLIB_000, GLIB_010, FUNCOP_1;
 theorems RELSET_1, GLIB_000, CHORD, GLIB_002, GLIB_006, GLIB_007, GLIB_009,
      GLIB_010, GLIB_011, TARSKI, ZFMISC_1, FUNCT_1, XBOOLE_0, XBOOLE_1,
      FUNCT_2, XREGULAR, PARTFUN1, FUNCT_4, GLIB_001, NECKLACE, RELAT_1,
      CARD_1, CARD_2, FUNCOP_1, FINSEQ_1, FINSEQ_3, XXREAL_0, GLIB_008,
      XREAL_1, NAT_1, ENUMSET1, ORDINAL1, FINSEQ_6, FINSEQ_8, RFINSEQ,
      FINSEQ_5, GLIBPRE0;
 schemes FUNCT_1, NAT_1, SUBSET_1;

begin :: Loopfull Graphs

definition
  let G be _Graph;
  attr G is loopfull means :: or reflexive
  :Def1:
  for v being Vertex of G ex e being object st e Joins v,v,G;
end;

theorem Th1:
  for G being _Graph holds G is loopfull iff
    for v being Vertex of G ex e being object st e DJoins v,v,G
proof
  let G be _Graph;
  hereby
    assume A1: G is loopfull;
    let v be Vertex of G;
    consider e being object such that
      A2: e Joins v,v,G by A1;
    take e;
    thus e DJoins v,v,G by A2, GLIB_000:16;
  end;
  assume A3: for v being Vertex of G ex e being object st e DJoins v,v,G;
  let v be Vertex of G;
  consider e being object such that
    A4: e DJoins v,v,G by A3;
  take e;
  thus e Joins v,v,G by A4, GLIB_000:16;
end;

theorem
  for G being _Graph holds G is loopfull iff
    for v being Vertex of G holds v,v are_adjacent
proof
  let G be _Graph;
  hereby
    assume A1: G is loopfull;
    let v be Vertex of G;
    consider e being object such that
      A2: e Joins v,v,G by A1;
    thus v,v are_adjacent by A2, CHORD:def 3;
  end;
  assume A3: for v being Vertex of G holds v,v are_adjacent;
  let v be Vertex of G;
  consider e being object such that
    A4: e Joins v,v,G by A3, CHORD:def 3;
  take e;
  thus thesis by A4;
end;

registration
  cluster loopfull -> non loopless for _Graph;
  coherence
  proof
    let G be _Graph;
    assume G is loopfull;
    then consider e being object such that
      A1: e Joins the Vertex of G,the Vertex of G,G;
    thus thesis by A1, GLIB_000:18;
  end;
  cluster _trivial non loopless -> loopfull for _Graph;
  coherence
  proof
    let G be _Graph;
    assume A2: G is _trivial non loopless;
    let v be Vertex of G;
    consider v0 being Vertex of G such that
      A3: the_Vertices_of G = {v0} by A2, GLIB_000:22;
    A4: v = v0 by A3, TARSKI:def 1;
    consider v9 being object such that
      A5: ex e being object st e Joins v9,v9,G by A2, GLIB_000:18;
    consider e being object such that
      A6: e Joins v9,v9,G by A5;
    take e;
    v9 in the_Vertices_of G by A6, GLIB_000:13;
    then v9 = v0 by A3, TARSKI:def 1;
    hence e Joins v,v,G by A4, A6;
  end;
  cluster loopfull complete for _Graph;
  existence
  proof
    set G2 = the _trivial _Graph;
    set G1 = the addEdge of
      G2,the Vertex of G2,the_Edges_of G2,the Vertex of G2;
    take G1;
    thus thesis;
  end;
  cluster non loopfull for _Graph;
  existence
  proof
    take the loopless _Graph;
    thus thesis;
  end;
end;

theorem Th3:
  for G1 being _Graph, E being set, G2 being reverseEdgeDirections of G1, E
  holds G1 is loopfull iff G2 is loopfull
proof
  let G1 be _Graph, E be set, G2 be reverseEdgeDirections of G1, E;
  hereby
    assume A1: G1 is loopfull;
    now
      let v be Vertex of G2;
      v is Vertex of G1 by GLIB_007:4;
      then consider e being object such that
        A2: e Joins v,v,G1 by A1;
      take e;
      thus e Joins v,v,G2 by A2, GLIB_007:9;
    end;
    hence G2 is loopfull;
  end;
  assume A3: G2 is loopfull;
  now
    let v be Vertex of G1;
    v is Vertex of G2 by GLIB_007:4;
    then consider e being object such that
      A4: e Joins v,v,G2 by A3;
    take e;
    thus e Joins v,v,G1 by A4, GLIB_007:9;
  end;
  hence G1 is loopfull;
end;

registration
  let G be loopfull _Graph, E be set;
  cluster -> loopfull for reverseEdgeDirections of G, E;
  coherence by Th3;
end;

registration
  let G be non loopfull _Graph, E be set;
  cluster -> non loopfull for reverseEdgeDirections of G, E;
  coherence by Th3;
end;

theorem Th4:
  for G1, G2 being _Graph st G1 == G2
  holds G1 is loopfull implies G2 is loopfull
proof
  let G1, G2 be _Graph;
  assume G1 == G2;
  then G2 is reverseEdgeDirections of G1, {} by GLIB_009:42;
  hence thesis;
end;

theorem Th5:
  for G2 being loopfull _Graph, G1 being Supergraph of G2
  st the_Vertices_of G1 = the_Vertices_of G2 holds G1 is loopfull
proof
  let G2 be loopfull _Graph, G1 be Supergraph of G2;
  assume A1: the_Vertices_of G1 = the_Vertices_of G2;
  let v be Vertex of G1;
  consider e being object such that
    A2: e Joins v,v,G2 by A1, Def1;
  take e;
  thus e Joins v,v,G1 by A2, GLIB_006:70;
end;

theorem Th6:
  for G1, G2 being _Graph, F being PGraphMapping of G1, G2
  st rng F_V = the_Vertices_of G2 & G1.loops() c= dom F_E
  holds G1 is loopfull implies G2 is loopfull
proof
  let G1, G2 be _Graph, F be PGraphMapping of G1, G2;
  assume A1: rng F_V = the_Vertices_of G2 & G1.loops() c= dom F_E;
  assume A2: G1 is loopfull;
  now
    let v be Vertex of G2;
    consider v0 being object such that
      A3: v0 in dom F_V & F_V.v0 = v by A1, FUNCT_1:def 3;
    consider e0 being object such that
      A4: e0 Joins v0,v0,G1 by A2, A3;
    reconsider e = F_E.e0 as object;
    take e;
    e0 in G1.loops() by A4, GLIB_009:def 2;
    hence e Joins v,v,G2 by A1, A3, A4, GLIB_010:4;
  end;
  hence G2 is loopfull;
end;

theorem Th7:
  for G1, G2 being _Graph, F being PGraphMapping of G1, G2
  st F is total onto holds G1 is loopfull implies G2 is loopfull
proof
  let G1, G2 be _Graph, F be PGraphMapping of G1, G2;
  assume A1: F is total onto;
  G1.loops() c= the_Edges_of G1;
  then G1.loops() c= dom F_E & rng F_V = the_Vertices_of G2
    by A1, GLIB_010:def 11, GLIB_010:def 12;
  hence thesis by Th6;
end;

theorem Th8:
  for G1, G2 being _Graph, F being PGraphMapping of G1, G2
  st F is semi-continuous & dom F_V=the_Vertices_of G1 & G2.loops() c= rng F_E
  holds G2 is loopfull implies G1 is loopfull
proof
  let G1, G2 be _Graph, F be PGraphMapping of G1, G2;
  assume that
    A1: F is semi-continuous and
    A2: dom F_V = the_Vertices_of G1 & G2.loops() c= rng F_E and
    A3: G2 is loopfull;
  now
    let v be Vertex of G1;
    F_V.v in rng F_V by A2, FUNCT_1:3;
    then consider e being object such that
      A4: e Joins F_V.v,F_V.v,G2 by A3;
    e in G2.loops() by A4, GLIB_009:def 2;
    then consider e0 being object such that
      A5: e0 in dom F_E & F_E.e0 = e by A2, FUNCT_1:def 3;
    take e0;
    thus e0 Joins v,v,G1 by A1, A2, A4, A5, GLIB_010:def 15;
  end;
  hence G1 is loopfull;
end;

theorem Th9:
  for G1, G2 being _Graph, F being PGraphMapping of G1, G2
  st F is total onto semi-continuous
  holds G2 is loopfull implies G1 is loopfull
proof
  let G1, G2 be _Graph, F be PGraphMapping of G1, G2;
  assume A1: F is total onto semi-continuous;
  G2.loops() c= the_Edges_of G2;
  then dom F_V=the_Vertices_of G1 & G2.loops() c= rng F_E
    by A1, GLIB_010:def 11, GLIB_010:def 12;
  hence thesis by A1, Th8;
end;

theorem
  for G1, G2 being _Graph, F being PGraphMapping of G1, G2
  st F is isomorphism holds G1 is loopfull iff G2 is loopfull by Th7, Th9;

registration
  let G be loopfull _Graph, V be set;
  cluster -> loopfull for inducedSubgraph of G, V;
  coherence
  proof
    let G2 be inducedSubgraph of G, V;
    per cases;
    suppose A1: V is non empty Subset of the_Vertices_of G;
      let v be Vertex of G2;
      v in the_Vertices_of G2;
      then reconsider v0 = v as Vertex of G;
      consider e being object such that
        A2: e Joins v0,v0,G by Def1;
      take e;
      the_Vertices_of G2 = V by A1, GLIB_000:def 37;
      then e in G.edgesBetween(V) by A2, GLIB_000:32;
      then e in the_Edges_of G2 &
        e is set & v is set by A1, GLIB_000:def 37;
      hence e Joins v,v,G2 by A2, GLIB_000:73;
    end;
    suppose not V is non empty Subset of the_Vertices_of G;
      then G2 == G by GLIB_000:def 37;
      hence thesis by Th4;
    end;
  end;
  cluster -> loopfull for removeVertices of G, V;
  coherence;
  cluster -> loopfull for removeVertex of G, V;
  coherence;
end;

registration
  let G be non loopfull _Graph;
  cluster -> non loopfull for spanning Subgraph of G;
  coherence
  proof
    let G2 be spanning Subgraph of G;
    assume A1: G2 is loopfull;
    now
      let v be Vertex of G;
      v is Vertex of G2 by GLIB_000:def 33;
      then consider e being object such that
        A2: e Joins v,v,G2 by A1;
      take e;
      thus e Joins v,v,G by A2, GLIB_000:72;
    end;
    hence contradiction by Def1;
  end;
  let E be set;
  cluster -> non loopfull for inducedSubgraph of G, the_Vertices_of G, E;
  coherence
  proof
    let G2 be inducedSubgraph of G, the_Vertices_of G, E;
    per cases;
    suppose E is Subset of the_Edges_of G;
      hence thesis;
    end;
    suppose not E is Subset of the_Edges_of G;
      then not E c= G.edgesBetween(the_Vertices_of G) by GLIB_000:34;
      then G == G2 by GLIB_000:def 37;
      hence thesis by Th4;
    end;
  end;
  cluster -> non loopfull for removeEdges of G, E;
  coherence;
  cluster -> non loopfull for removeEdge of G, E;
  coherence;
end;

theorem Th11:
  for G2 being _Graph, V being set, G1 being addVertices of G2, V
  st V \ the_Vertices_of G2 <> {} holds G1 is non loopfull
proof
  let G2 be _Graph, V be set, G1 be addVertices of G2, V;
  assume V \ the_Vertices_of G2 <> {};
  then consider v being object such that
    A1: v in V \ the_Vertices_of G2 by XBOOLE_0:def 1;
  reconsider v as Vertex of G1 by A1, GLIB_006:86;
  v.edgesInOut() = {} by A1, GLIB_006:88, GLIB_000:def 49;
  then for e being object holds not e Joins v,v,G1 by GLIB_000:62;
  hence thesis;
end;

registration
  let G be non loopfull _Graph, V be set;
  cluster -> non loopfull for addVertices of G, V;
  coherence
  proof
    let G1 be addVertices of G, V;
    per cases;
    suppose V \ the_Vertices_of G <> {};
      hence thesis by Th11;
    end;
    suppose V \ the_Vertices_of G = {};
      then G == G1 by GLIB_006:78, XBOOLE_1:37;
      hence thesis by Th4;
    end;
  end;
end;

registration
  let G be loopfull _Graph, v,e,w be object;
  cluster -> loopfull for addEdge of G,v,e,w;
  coherence
  proof
    let G1 be addEdge of G,v,e,w;
    per cases;
    suppose A1: v is Vertex of G & w is Vertex of G & not e in the_Edges_of G;
      reconsider e as set by TARSKI:1;
      G is removeEdge of G1,e by A1, GLIB_006:108;
      hence thesis;
    end;
    suppose not(v is Vertex of G & w is Vertex of G & not e in the_Edges_of G);
      then G == G1 by GLIB_006:def 11;
      hence thesis by Th4;
    end;
  end;
end;

theorem Th12:
  for G2 being _Graph, v being Vertex of G2, e,w being object
  for G1 being addAdjVertex of G2,v,e,w
  st not e in the_Edges_of G2 & not w in the_Vertices_of G2
  holds G1 is non loopfull
proof
  let G2 be _Graph, v be Vertex of G2, e,w be object;
  let G1 be addAdjVertex of G2,v,e,w;
  assume A1: not e in the_Edges_of G2 & not w in the_Vertices_of G2;
  then reconsider w as Vertex of G1 by GLIB_006:129;
  v <> w by A1;
  then for e being object holds not e Joins w,w,G1 by A1, GLIB_006:133;
  hence thesis;
end;

theorem Th13:
  for G2 being _Graph, v,e being object, w being Vertex of G2
  for G1 being addAdjVertex of G2,v,e,w
  st not e in the_Edges_of G2 & not v in the_Vertices_of G2
  holds G1 is non loopfull
proof
  let G2 be _Graph, v,e be object, w be Vertex of G2;
  let G1 be addAdjVertex of G2,v,e,w;
  assume A1: not e in the_Edges_of G2 & not v in the_Vertices_of G2;
  then reconsider v as Vertex of G1 by GLIB_006:130;
  v <> w by A1;
  then for e being object holds not e Joins v,v,G1 by A1, GLIB_006:134;
  hence thesis;
end;

registration
  let G be non loopfull _Graph, v,e,w be object;
  cluster -> non loopfull for addAdjVertex of G,v,e,w;
  coherence
  proof
    let G1 be addAdjVertex of G,v,e,w;
    per cases;
    suppose v in the_Vertices_of G & not w in the_Vertices_of G &
        not e in the_Edges_of G;
      hence thesis by Th12;
    end;
    suppose not v in the_Vertices_of G & w in the_Vertices_of G &
        not e in the_Edges_of G;
      hence thesis by Th13;
    end;
    suppose not(v in the_Vertices_of G & not w in the_Vertices_of G &
          not e in the_Edges_of G) &
        not(not v in the_Vertices_of G & w in the_Vertices_of G &
          not e in the_Edges_of G);
      then G1 == G by GLIB_006:def 12;
      hence thesis by Th4;
    end;
  end;
end;

theorem Th14:
  for G2 being _Graph, v being object, V being Subset of the_Vertices_of G2
  for G1 being addAdjVertexAll of G2,v,V st not v in the_Vertices_of G2
  holds G1 is non loopfull
proof
  let G2 be _Graph, v be object, V be Subset of the_Vertices_of G2;
  let G1 be addAdjVertexAll of G2,v,V;
  assume A1: not v in the_Vertices_of G2;
  then reconsider v as Vertex of G1 by GLIB_007:50;
  for e being object holds not e Joins v,v,G1 by A1, GLIB_007:def 4;
  hence thesis;
end;

registration
  let G be non loopfull _Graph, v be object, V be set;
  cluster -> non loopfull for addAdjVertexAll of G,v,V;
  coherence
  proof
    let G1 be addAdjVertexAll of G,v,V;
    per cases;
    suppose V c= the_Vertices_of G & not v in the_Vertices_of G;
      hence thesis by Th14;
    end;
    suppose not(V c= the_Vertices_of G & not v in the_Vertices_of G);
      then G == G1 by GLIB_007:def 4;
      hence thesis by Th4;
    end;
  end;
end;

registration
  let G be loopfull _Graph;
  cluster -> loopfull for removeParallelEdges of G;
  coherence
  proof
    let G2 be removeParallelEdges of G;
    consider E being RepEdgeSelection of G such that
      A1: G2 is inducedSubgraph of G, the_Vertices_of G, E by GLIB_009:def 7;
    now
      let v be Vertex of G2;
      v is Vertex of G by GLIB_000:def 33;
      then consider e0 being object such that
        A2: e0 Joins v,v,G by Def1;
      consider e being object such that
        A3: e Joins v,v,G & e in E  and
        for e9 being object st e9 Joins v,v,G & e9 in E holds e9 = e
        by A2, GLIB_009:def 5;
      take e;
      E c= the_Edges_of G;
      then A4: E c= G.edgesBetween(the_Vertices_of G) by GLIB_000:34;
      the_Vertices_of G c= the_Vertices_of G;
      then the_Edges_of G2 = E by A1, A4, GLIB_000:def 37;
      hence e Joins v,v,G2 by A3, GLIB_000:73;
    end;
    hence thesis;
  end;
  cluster -> loopfull for removeDParallelEdges of G;
  coherence
  proof
    let G2 be removeDParallelEdges of G;
    consider E being RepDEdgeSelection of G such that
      A5: G2 is inducedSubgraph of G, the_Vertices_of G, E by GLIB_009:def 8;
    now
      let v be Vertex of G2;
      v is Vertex of G by GLIB_000:def 33;
      then consider e0 being object such that
        A6: e0 DJoins v,v,G by Th1;
      consider e being object such that
        A7: e DJoins v,v,G & e in E  and
        for e9 being object st e9 DJoins v,v,G & e9 in E holds e9 = e
        by A6, GLIB_009:def 6;
      take e;
      E c= the_Edges_of G;
      then A8: E c= G.edgesBetween(the_Vertices_of G) by GLIB_000:34;
      the_Vertices_of G c= the_Vertices_of G;
      then the_Edges_of G2 = E by A5, A8, GLIB_000:def 37;
      hence e DJoins v,v,G2 by A7, GLIB_000:73;
    end;
    hence thesis by Th1;
  end;
end;

:: removeLoops is loopless, hence non loopfull
registration
  let G be non loopfull _Graph;
  cluster -> non loopfull for removeParallelEdges of G;
  coherence;
  cluster -> non loopfull for removeDParallelEdges of G;
  coherence;
end;

definition
  let GF be Graph-yielding Function;
  attr GF is loopfull means
  :Def2:
  for x being object st x in dom GF
    ex G being _Graph st GF.x = G & G is loopfull;
end;

registration
  let G be loopfull _Graph;
  cluster <* G *> -> loopfull;
  coherence
  proof
    let x be object;
    assume A1: x in dom <* G *>;
    then reconsider n = x as Nat;
    1 <= n <= len <* G *> by A1, FINSEQ_3:25;
    then 1 <= n <= 1 by FINSEQ_1:40;
    then n = 1 by XXREAL_0:1;
    hence thesis;
  end;
  cluster NAT --> G -> loopfull;
  coherence by FUNCOP_1:7;
end;

definition
  let GF be non empty Graph-yielding Function;
  redefine attr GF is loopfull means  :: redefines loopfull (GLIB_012, definition)
  :Def3:
  for x being Element of dom GF holds GF.x is loopfull;
  compatibility
  proof
    hereby
      assume A1: GF is loopfull;
      let x be Element of dom GF;
      consider G being _Graph such that
        A2: GF.x = G & G is loopfull by A1;
      thus GF.x is loopfull by A2;
    end;
    assume A3: for x being Element of dom GF holds GF.x is loopfull;
    let x be object;
    assume x in dom GF;
    then reconsider y = x as Element of dom GF;
    take GF.y;
    thus thesis by A3;
  end;
end;

Lm1: :: copied from GLIB_000
  for F being ManySortedSet of NAT, n being object
  holds n is Nat iff n in dom F
proof
  let F be ManySortedSet of NAT, n being object;
  hereby
    assume n is Nat;
    then n in NAT by ORDINAL1:def 12;
    hence n in dom F by PARTFUN1:def 2;
  end;
  assume n in dom F;
  hence n is Nat;
end;

definition
  let GSq be GraphSeq;
  redefine attr GSq is loopfull means  :: redefines loopfull (GLIB_012, redefinition) → loopfull (GLIB_012, definition)
  :Def4:
  for n being Nat holds GSq.n is loopfull;
  compatibility
  proof
    hereby
      assume A1: GSq is loopfull;
      let x be Nat;
      x in dom GSq by Lm1;
      hence GSq.x is loopfull by A1;
    end;
    assume A2: for x being Nat holds GSq.x is loopfull;
    let x be Element of dom GSq;
    thus thesis by A2;
  end;
end;

registration
  cluster empty -> loopfull for Graph-yielding Function;
  coherence;
  cluster non empty loopfull -> non loopless for Graph-yielding Function;
  coherence
  proof
    let GF be Graph-yielding Function;
    assume A1: GF is non empty loopfull;
    then consider x being object such that
      A2: x in dom GF by XBOOLE_0:def 1;
    consider G being _Graph such that
      A3: GF.x = G & G is loopfull by A1, A2;
    thus thesis by A1, A2, A3;
  end;
end;

registration
  cluster loopfull for GraphSeq;
  existence
  proof
    take NAT --> the loopfull _Graph;
    thus thesis;
  end;
  cluster non empty loopfull for Graph-yielding FinSequence;
  existence
  proof
    take <* the loopfull _Graph *>;
    thus thesis;
  end;
end;

registration
  let GF be loopfull non empty Graph-yielding Function, x be Element of dom GF;
  cluster GF.x -> loopfull;
  coherence by Def3;
end;

registration
  let GSq be loopfull GraphSeq, x be Nat;
  cluster GSq.x -> loopfull;
  coherence by Def4;
end;

registration
  let p be loopfull Graph-yielding FinSequence, n be Nat;
  cluster p | n -> loopfull;
  coherence
  proof
    A1: p|n = p|Seg n by FINSEQ_1:def 16;
    now
      let x be object;
      assume A2: x in dom(p|n);
      then x in dom p by A1, RELAT_1:60, TARSKI:def 3;
      then consider G being _Graph such that
        A3: p.x = G & G is loopfull by Def2;
      take G;
      thus (p|n).x = G & G is loopfull by A1, A3, A2, FUNCT_1:47;
    end;
    hence thesis;
  end;
  cluster p /^ n -> loopfull;
  coherence
  proof
    per cases;
    suppose A4: n <= len p;
      now
        let x be object;
        assume A5: x in dom(p /^ n);
        then reconsider i = x as Nat;
        n+i in dom p by A5, FINSEQ_5:26;
        then consider G being _Graph such that
          A6: p.(n+i) = G & G is loopfull by Def2;
        take G;
        thus (p /^ n).x = G & G is loopfull by A4, A5, A6, RFINSEQ:def 1;
      end;
      hence thesis;
    end;
    suppose not (n <= len p);
      hence thesis by RFINSEQ:def 1;
    end;
  end;
  let m be Nat;
  cluster smid(p,m,n) -> loopfull;
  coherence
  proof
    smid(p,m,n) = (p/^(m-'1))|(n+1-'m) by FINSEQ_8:def 1;
    hence thesis;
  end;
  cluster (m,n)-cut p -> loopfull;
  coherence
  proof
    per cases;
    suppose 1 <= m & m <= n & n <= len p;
      then 1 <= m & m <= len p & 1 <= n & n <= len p by XXREAL_0:2;
      then m in dom p & n in dom p by FINSEQ_3:25;
      then smid(p,m,n) = (m,n)-cut p by FINSEQ_8:29;
      hence thesis;
    end;
    suppose not(1 <= m & m <= n & n <= len p);
      hence thesis by FINSEQ_6:def 4;
    end;
  end;
end;

registration
  let p, q be loopfull Graph-yielding FinSequence;
  cluster p ^ q -> loopfull;
  coherence
  proof
    for x being object st x in dom (p^q) ex G being _Graph st
      G = (p^q).x & G is loopfull
    proof
      let x be object;
      assume A1: x in dom (p^q);
      then reconsider k = x as Nat;
      per cases by A1, FINSEQ_1:25;
      suppose k in dom p;
        then (p^q).k = p.k & ex G being _Graph st p.k = G & G is loopfull
          by Def2, FINSEQ_1:def 7;
        hence ex G being _Graph st (p^q).x = G & G is loopfull;
      end;
      suppose ex n being Nat st n in dom q & k = len p + n;
        then consider n being Nat such that
          A2: n in dom q & k = len p + n;
        (p^q).(len p + n) = q.n & ex G being _Graph st q.n = G & G is loopfull
          by A2, Def2, FINSEQ_1:def 7;
        hence ex G being _Graph st (p^q).x = G & G is loopfull by A2;
      end;
    end;
    hence thesis;
  end;
  cluster p ^' q -> loopfull;
  coherence
  proof
    p ^' q = p^(2,len q)-cut q by FINSEQ_6:def 5;
    hence thesis;
  end;
end;

registration
  let G1, G2 be loopfull _Graph;
  cluster <* G1, G2 *> -> loopfull;
  coherence
  proof
    <* G1, G2 *> = <* G1 *> ^ <* G2 *> by FINSEQ_1:def 9;
    hence thesis;
  end;
  let G3 be loopfull _Graph;
  cluster <* G1, G2, G3 *> -> loopfull;
  coherence
  proof
    <* G1, G2, G3 *> = <* G1 *> ^ <* G2 *> ^ <* G3 *> by FINSEQ_1:def 10;
    hence thesis;
  end;
end;

begin :: Adding Loops to a Graph

:: a loop is added to each vertex in V, regardless if that
:: vertex has a loop already or not
definition
  let G be _Graph, V be set;
  mode addLoops of G, V -> Supergraph of G means
  :Def5:
  the_Vertices_of it = the_Vertices_of G &
  ex E being set, f being one-to-one Function
  st E misses the_Edges_of G & the_Edges_of it = the_Edges_of G \/ E &
    dom f = E & rng f = V & the_Source_of it = the_Source_of G +* f &
    the_Target_of it = the_Target_of G +* f if V c= the_Vertices_of G
  otherwise it == G;
  existence
  proof
    hereby
      assume A1: V c= the_Vertices_of G;
      set E = {[the_Edges_of G,v] where v is Vertex of G : v in V};
      deffunc F(object) = $1`2;
      consider f being Function such that
        A2: dom f = E & for x being object st x in E holds f.x = F(x)
        from FUNCT_1:sch 3;
      :: define source and target
      set s = the_Source_of G +* f, t = the_Target_of G +* f;
      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;
          consider v being Vertex of G such that
            A4: x = [the_Edges_of G,v] & v in V by A2, A3;
          y = x`2 by A2, A3
            .= v by A4;
          hence y in V by A4;
        end;
        set x = [the_Edges_of G,y];
        assume y in V;
        then A5: x in dom f by A1, A2;
        then f.x = x`2 by A2
          .= y;
        hence y in rng f by A5, FUNCT_1:3;
      end;
      then A6: rng f = V by TARSKI:2;
      A7: dom s = dom the_Source_of G \/ dom f by FUNCT_4:def 1
        .= the_Edges_of G \/ E by A2, FUNCT_2:def 1;
      A8: dom t = dom the_Target_of G \/ dom f by FUNCT_4:def 1
        .= the_Edges_of G \/ E by A2, FUNCT_2:def 1;
      A9: the_Edges_of G misses E
      proof
        assume the_Edges_of G meets E;
        then consider e being object such that
          A10: e in the_Edges_of G & e in E by XBOOLE_0:3;
        reconsider e as set by TARSKI:1;
        consider v being Vertex of G such that
          A11: e = [the_Edges_of G,v] & v in V by A10;
        A12: the_Edges_of G in {the_Edges_of G} by TARSKI:def 1;
        e = {{the_Edges_of G, v}, {the_Edges_of G}} by A11, TARSKI:def 5;
        then {the_Edges_of G} in e by TARSKI:def 2;
        hence contradiction by A10, A12, XREGULAR:7;
      end;
      rng the_Source_of G \/ rng f c= the_Vertices_of G \/ V &
        rng the_Target_of G \/ rng f c= the_Vertices_of G \/ V
        by A6, XBOOLE_1:9;
      then A13: rng the_Source_of G \/ rng f c= the_Vertices_of G &
        rng the_Target_of G \/ rng f c= the_Vertices_of G by A1, XBOOLE_1:12;
      rng s c= rng the_Source_of G \/ rng f &
        rng t c= rng the_Target_of G \/ rng f by FUNCT_4:17;
      then A14: rng s c= the_Vertices_of G &
        rng t c= the_Vertices_of G by A13, XBOOLE_1:1;
      then reconsider s as Function of the_Edges_of G \/ E, the_Vertices_of G
        by A7, FUNCT_2:2;
      reconsider t as Function of the_Edges_of G \/ E, the_Vertices_of G
        by A8, A14, FUNCT_2:2;
      :: define the supergraph and show properties
      set H = createGraph(the_Vertices_of G, the_Edges_of G \/ E, s, t);
      A15: the_Edges_of G c= the_Edges_of H
        & the_Vertices_of G = the_Vertices_of H by XBOOLE_1:7;
      now
        let e be set;
        assume A16: e in the_Edges_of G;
        then e in the_Edges_of G \/ E by XBOOLE_0:def 3;
        then A17: not e in dom f by A2, A9, A16, XBOOLE_0:5;
        hence (the_Source_of G).e = (the_Source_of H).e by FUNCT_4:11;
        thus (the_Target_of G).e = (the_Target_of H).e by A17, FUNCT_4:11;
      end;
      then reconsider H as Supergraph of G by A15, GLIB_006:def 9;
      take H;
      thus the_Vertices_of H = the_Vertices_of G;
      now
        let x1, x2 be object;
        assume A19: x1 in dom f & x2 in dom f & f.x1 = f.x2;
        then consider v1 being Vertex of G such that
          A20: x1 = [the_Edges_of G,v1] & v1 in V by A2;
        consider v2 being Vertex of G such that
          A21: x2 = [the_Edges_of G,v2] & v2 in V by A2, A19;
        thus x1 = [the_Edges_of G,[the_Edges_of G,v1]`2] by A20
          .= [the_Edges_of G,f.x2] by A2, A19, A20
          .= [the_Edges_of G,[the_Edges_of G,v2]`2] by A2, A19, A21
          .= x2 by A21;
      end;
      then reconsider f as one-to-one Function by FUNCT_1:def 4;
      take E, f;
      thus E misses the_Edges_of G & the_Edges_of H = the_Edges_of G \/ E
        by A9;
      thus dom f = E & rng f = V by A2, A6;
      thus the_Source_of H = the_Source_of G +* f &
        the_Target_of H = the_Target_of G +* f;
    end;
    assume not V c= the_Vertices_of G;
    take G;
    thus thesis by GLIB_006:61;
  end;
  consistency;
end;

definition
  let G be _Graph;
  mode addLoops of G is addLoops of G, the_Vertices_of G;
end;

theorem Th15:
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  holds the_Vertices_of G1 = the_Vertices_of G2
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  per cases;
  suppose V c= the_Vertices_of G2;
    hence thesis by Def5;
  end;
  suppose not V c= the_Vertices_of G2;
    then G1 == G2 by Def5;
    hence thesis by GLIB_000:def 34;
  end;
end;

theorem Th16:
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  for e,v,w being object st v <> w holds e DJoins v,w,G1 iff e DJoins v,w,G2
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  per cases;
  suppose V c= the_Vertices_of G2;
    then consider E being set, f being one-to-one Function such that
      A1: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
        dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
        the_Target_of G1 = the_Target_of G2 +* f by Def5;
    let e,v,w be object;
    assume A2: v <> w;
    hereby
      assume A3: e DJoins v,w,G1;
      then A4: e in the_Edges_of G2 \/ E by A1, GLIB_000:def 14;
      not e in E
      proof
        assume A5: e in E;
        then A6: (the_Source_of G1).e = f.e by A1, FUNCT_4:13;
        (the_Target_of G1).e = f.e by A1, A5, FUNCT_4:13;
        then f.e = v & f.e = w by A3, A6, GLIB_000:def 14;
        hence contradiction by A2;
      end;
      then e in the_Edges_of G2 by A1, A4, XBOOLE_0:5;
      hence e DJoins v,w,G2 by A3, GLIB_006:71;
    end;
    assume A7: e DJoins v,w,G2;
    v is set & w is set by TARSKI:1;
    hence thesis by A7, GLIB_006:70;
  end;
  suppose not V c= the_Vertices_of G2;
    then G1 == G2 by Def5;
    hence thesis by GLIB_000:88;
  end;
end;

theorem Th17:
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  for e,v,w being object st v <> w holds e Joins v,w,G1 iff e Joins v,w,G2
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  let e,v,w be object;
  assume A1: v <> w;
  hereby
    assume e Joins v,w,G1;
    then per cases by GLIB_000:16;
    suppose e DJoins v,w,G1;
      then e DJoins v,w,G2 by A1, Th16;
      hence e Joins v,w,G2 by GLIB_000:16;
    end;
    suppose e DJoins w,v,G1;
      then e DJoins w,v,G2 by A1, Th16;
      hence e Joins v,w,G2 by GLIB_000:16;
    end;
  end;
  assume A2: e Joins v,w,G2;
  v is set & w is set by TARSKI:1;
  hence e Joins v,w,G1 by A2, GLIB_006:70;
end;

theorem
  for G2 being _Graph, V being Subset of the_Vertices_of G2
  for G1 being addLoops of G2, V for v being Vertex of G1
  st v in V holds v,v are_adjacent
proof
  let G2 be _Graph, V be Subset of the_Vertices_of G2, G1 be addLoops of G2, V;
  let v be Vertex of G1;
  consider E being set, f being one-to-one Function such that
    A1: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
      dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
      the_Target_of G1 = the_Target_of G2 +* f by Def5;
  assume v in V;
  then consider e being object such that
    A2: e in dom f & f.e = v by A1, FUNCT_1:def 3;
  A3: (the_Source_of G1).e = v by A1, A2, FUNCT_4:13;
  A4: (the_Target_of G1).e = v by A1, A2, FUNCT_4:13;
  e in the_Edges_of G1 by A1, A2, XBOOLE_0:def 3;
  then e Joins v,v,G1 by A3, A4, GLIB_000:def 13;
  hence v,v are_adjacent by CHORD:def 3;
end;

theorem
  for G2 being _Graph, V being set
  for G1 being addLoops of G2, V holds G1.order() = G2.order() by Th15;

theorem
  for G2 being _Graph, V being Subset of the_Vertices_of G2
  for G1 being addLoops of G2, V holds G1.size() = G2.size() +` card V
proof
  let G2 be _Graph, V be Subset of the_Vertices_of G2, G1 be addLoops of G2, V;
  consider E being set, f being one-to-one Function such that
    A1: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
      dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
      the_Target_of G1 = the_Target_of G2 +* f by Def5;
  thus G1.size() = card the_Edges_of G2 +` card E by A1, CARD_2:35
    .= G2.size() +` card V by A1, CARD_1:70;
end;

theorem Th21:
  for G1, G2 being _Graph holds G1 is addLoops of G2, {} iff G1 == G2
proof
  let G1, G2 be _Graph;
  hereby
    assume A1: G1 is addLoops of G2, {};
    {} c= the_Vertices_of G2 by XBOOLE_1:2;
    then consider E being set, f being one-to-one Function such that
      A2: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
        dom f = E & rng f = {} & the_Source_of G1 = the_Source_of G2 +* f &
        the_Target_of G1 = the_Target_of G2 +* f by A1, Def5;
    A3: f = {} by A2;
    then A4: E = {} by A2;
    A5: the_Source_of G1 = the_Source_of G2 by A2, A3, FUNCT_4:21;
    the_Target_of G1 = the_Target_of G2 by A2, A3, FUNCT_4:21;
    hence G1 == G2 by A1, A2, A4, A5, Th15, GLIB_000:def 34;
  end;
  assume A6: G1 == G2;
  then A7: G1 is Supergraph of G2 by GLIB_006:59;
  now
    thus {} c= the_Vertices_of G2 by XBOOLE_1:2;
    thus the_Vertices_of G1 = the_Vertices_of G2 by A6, GLIB_000:def 34;
    set E = the empty set, f = the empty one-to-one Function;
    take E,f;
    thus E misses the_Edges_of G2 by XBOOLE_1:65;
    thus the_Edges_of G1 = the_Edges_of G2 \/ E by A6, GLIB_000:def 34;
    thus dom f = E & rng f = {};
    thus the_Source_of G1 = the_Source_of G2 by A6, GLIB_000:def 34
      .= the_Source_of G2 +* f by FUNCT_4:21;
    thus the_Target_of G1 = the_Target_of G2 by A6, GLIB_000:def 34
      .= the_Target_of G2 +* f by FUNCT_4:21;
  end;
  hence G1 is addLoops of G2, {} by A7, Def5;
end;

theorem
  for G being _Graph holds G is addLoops of G, {}
proof
  let G be _Graph;
  A1: G is Supergraph of G & {}c= the_Vertices_of G by GLIB_006:61, XBOOLE_1:2;
  now
    thus the_Vertices_of G = the_Vertices_of G;
    reconsider E = {} as set;
    reconsider f = the empty Function as one-to-one Function;
    take E, f;
    thus E misses the_Edges_of G by XBOOLE_1:65;
    thus the_Edges_of G = the_Edges_of G \/ E;
    thus dom f = E & rng f = {};
    thus the_Source_of G = the_Source_of G +* f by FUNCT_4:21;
    thus the_Target_of G = the_Target_of G +* f by FUNCT_4:21;
  end;
  hence thesis by A1, Def5;
end;

theorem
  for G being _Graph, V1, V2 being Subset of the_Vertices_of G
  for G1 being addLoops of G, V1, G2 being addLoops of G1, V2
  st V1 misses V2 holds G2 is addLoops of G, V1 \/ V2
proof
  let G be _Graph, V1, V2 being Subset of the_Vertices_of G;
  let G1 be addLoops of G, V1, G2 be addLoops of G1, V2;
  assume A1: V1 misses V2;
  consider E1 being set, f1 being one-to-one Function such that
    A2: E1 misses the_Edges_of G & the_Edges_of G1 = the_Edges_of G \/ E1 &
      dom f1 = E1 & rng f1 = V1 & the_Source_of G1 = the_Source_of G +* f1 &
      the_Target_of G1 = the_Target_of G +* f1 by Def5;
  V2 c= the_Vertices_of G;
  then V2 c= the_Vertices_of G1 by Th15;
  then consider E2 being set, f2 being one-to-one Function such that
    A3: E2 misses the_Edges_of G1 & the_Edges_of G2 = the_Edges_of G1 \/ E2 &
      dom f2 = E2 & rng f2 = V2 & the_Source_of G2 = the_Source_of G1 +* f2 &
      the_Target_of G2 = the_Target_of G1 +* f2 by Def5;
  A4: G2 is Supergraph of G by GLIB_006:62;
  A5: the_Vertices_of G2 = the_Vertices_of G1 by Th15
    .= the_Vertices_of G by Th15;
  now
    reconsider E = E1 \/ E2 as set;
    reconsider f = f1 +* f2 as one-to-one Function by A1, A2, A3, FUNCT_4:92;
    take E,f;
    A6: E2 misses the_Edges_of G & E2 misses E1 by A2, A3, XBOOLE_1:70;
    hence E misses the_Edges_of G by A2, XBOOLE_1:70;
    thus the_Edges_of G2 =  the_Edges_of G \/ E by A2, A3, XBOOLE_1:4;
    thus dom f = E by A2, A3, FUNCT_4:def 1;
    thus rng f = V1 \/ V2 by A2, A3, A6, NECKLACE:6;
    thus the_Source_of G2 = the_Source_of G +* f by A2, A3, FUNCT_4:14;
    thus the_Target_of G2 = the_Target_of G +* f by A2, A3, FUNCT_4:14;
  end;
  hence thesis by A4, A5, Def5;
end;

theorem Th24:
  for G3 being _Graph, V1, V2 being Subset of the_Vertices_of G3
  for G1 being addLoops of G3, V1 \/ V2 st V1 misses V2
  ex G2 being addLoops of G3, V1 st G1 is addLoops of G2, V2
proof
  let G3 be _Graph, V1, V2 be Subset of the_Vertices_of G3;
  let G1 be addLoops of G3, V1 \/ V2;
  assume A1: V1 misses V2;
  consider E3 being set, f3 being one-to-one Function such that
    A2: E3 misses the_Edges_of G3 & the_Edges_of G1 = the_Edges_of G3 \/ E3 &
      dom f3 = E3 & rng f3 = V1 \/ V2 &
      the_Source_of G1 = the_Source_of G3 +* f3 &
      the_Target_of G1 = the_Target_of G3 +* f3 by Def5;
  :: define G2
  set E1 = f3"V1;
  set f1 = f3|(f3"V1);
  set s1 = the_Source_of G3 +* f1;
  set t1 = the_Target_of G3 +* f1;
  A3: E1 c= E3 by A2, RELAT_1:132;
  then A4: E1 = E1 /\ E3 by XBOOLE_1:28
    .= dom f1 by A2, RELAT_1:61;
  A5: dom s1 = dom the_Source_of G3 \/ dom f1 by FUNCT_4:def 1
    .= the_Edges_of G3 \/ E1 by A4, FUNCT_2:def 1;
  A6: dom t1 = dom the_Target_of G3 \/ dom f1 by FUNCT_4:def 1
    .= the_Edges_of G3 \/ E1 by A4, FUNCT_2:def 1;
  A7: V1 = f3.:(f3"V1) by A2, XBOOLE_1:7, FUNCT_1:77
    .= rng f1 by RELAT_1:115;
  then A8: the_Vertices_of G3 \/ rng f1 = the_Vertices_of G3 by XBOOLE_1:12;
  A9: rng s1 c= rng the_Source_of G3 \/ rng f1 by FUNCT_4:17;
  rng the_Source_of G3 \/ rng f1 c= the_Vertices_of G3 \/ rng f1 by XBOOLE_1:9;
  then reconsider s1 as Function of the_Edges_of G3 \/ E1, the_Vertices_of G3
    by A5, A8, A9, XBOOLE_1:1, FUNCT_2:2;
  A10: rng t1 c= rng the_Target_of G3 \/ rng f1 by FUNCT_4:17;
  rng the_Target_of G3 \/ rng f1 c= the_Vertices_of G3 \/ rng f1 by XBOOLE_1:9;
  then reconsider t1 as Function of the_Edges_of G3 \/ E1, the_Vertices_of G3
    by A6, A8, A10, XBOOLE_1:1, FUNCT_2:2;
  set G2 = createGraph(the_Vertices_of G3,the_Edges_of G3 \/ E1, s1, t1);
  :: G2 is Supergraph of G3
  now
    thus the_Vertices_of G3 c= the_Vertices_of G2;
    thus the_Edges_of G3 c= the_Edges_of G2 by XBOOLE_1:7;
    let e be set;
    assume A11: e in the_Edges_of G3;
    then e in the_Edges_of G3 \/ E3 by XBOOLE_0:def 3;
    then A12: not e in dom f1 by A2, A3, A4, A11, XBOOLE_0:5;
    thus (the_Source_of G3).e = s1.e by A12, FUNCT_4:11
      .= (the_Source_of G2).e;
    thus (the_Target_of G3).e = t1.e by A12, FUNCT_4:11
      .= (the_Target_of G2).e;
  end;
  then reconsider G2 as Supergraph of G3 by GLIB_006:def 9;
  :: G2 is addLoops of G3, V1
  now
    thus the_Vertices_of G2 = the_Vertices_of G3;
    reconsider E1 as set;
    reconsider f1 as one-to-one Function by FUNCT_1:52;
    take E1, f1;
    thus E1 misses the_Edges_of G3 by A2, A3, XBOOLE_1:63;
    thus the_Edges_of G2 = the_Edges_of G3 \/ E1;
    thus dom f1 = E1 by A4;
    thus rng f1 = V1 by A7;
    thus the_Source_of G2 = the_Source_of G3 +* f1;
    thus the_Target_of G2 = the_Target_of G3 +* f1;
  end;
  then reconsider G2 as addLoops of G3, V1 by Def5;
  take G2;
  :: G1 is Supergraph of G2
  set E2 = E3\E1;
  A13: the_Vertices_of G1 = the_Vertices_of G3 by Def5
      .= the_Vertices_of G2;
  A14: the_Edges_of G1 = the_Edges_of G3 \/ (E1 \/ E2) by A2, A3, XBOOLE_1:45
    .= (the_Edges_of G3 \/ E1) \/ E2 by XBOOLE_1:4
    .= the_Edges_of G2 \/ E2;
  now
    thus the_Vertices_of G2 c= the_Vertices_of G1 by A13;
    thus the_Edges_of G2 c= the_Edges_of G1 by A14, XBOOLE_1:7;
    let e be set;
    A15: E1 misses the_Edges_of G3 by A2, A3, XBOOLE_1:63;
    assume e in the_Edges_of G2;
    then A16: e in the_Edges_of G3 \/ E1;
    then per cases by XBOOLE_0:def 3;
    suppose A17: e in the_Edges_of G3;
      then A18: not e in E1 by A15, A16, XBOOLE_0:5;
      thus (the_Source_of G2).e = s1.e
        .= (the_Source_of G3).e by A4, A18, FUNCT_4:11
        .= (the_Source_of G1).e by A17, GLIB_006:def 9;
      thus (the_Target_of G2).e = t1.e
        .= (the_Target_of G3).e by A4, A18, FUNCT_4:11
        .= (the_Target_of G1).e by A17, GLIB_006:def 9;
    end;
    suppose A19: e in E1;
      thus (the_Source_of G2).e = s1.e
        .= f1.e by A4, A19, FUNCT_4:13
        .= f3.e by A19, FUNCT_1:49
        .= (the_Source_of G1).e by A2, A3, A19, FUNCT_4:13;
      thus (the_Target_of G2).e = t1.e
        .= f1.e by A4, A19, FUNCT_4:13
        .= f3.e by A19, FUNCT_1:49
        .= (the_Target_of G1).e by A2, A3, A19, FUNCT_4:13;
    end;
  end;
  then A20: G1 is Supergraph of G2 by GLIB_006:def 9;
  :: G1 is addLoops of G2, V2
  now
    reconsider E2 as set;
    reconsider f2 = f3|E2 as one-to-one Function by FUNCT_1:52;
    take E2, f2;
    E2 misses E3\E2 by XBOOLE_1:79;
    then E2 misses E3 /\ E1 by XBOOLE_1:48;
    then A22: E2 misses E1 by A3, XBOOLE_1:28;
    E2 misses the_Edges_of G3 by A2, XBOOLE_1:63;
    then E2 misses the_Edges_of G3 \/ E1 by A22, XBOOLE_1:70;
    hence E2 misses the_Edges_of G2;
    thus the_Edges_of G1 = the_Edges_of G2 \/ E2 by A14;
    A23: E2 = f3"(V1 \/ V2) \ f3"V1 by A2, RELAT_1:134
      .= f3"((V1 \/ V2) \ V1) by FUNCT_1:69
      .= f3"V2 by A1, XBOOLE_1:88;
    thus dom f2 = dom f3 /\ (f3"V2) by A23, RELAT_1:61
      .= E2 by A2, A23, XBOOLE_1:28;
    thus rng f2 = f3.:(f3"V2) by A23, RELAT_1:115
      .= V2 by A2, XBOOLE_1:7, FUNCT_1:77;
    A24: dom f3 c= E1 \/ E2 by A2, A3, XBOOLE_1:45;
    thus the_Source_of G1
       = the_Source_of G3 +* (f1 +* f3|E2) by A2, A24, FUNCT_4:70
      .= (the_Source_of G3 +* f1) +* f2 by FUNCT_4:14
      .= the_Source_of G2 +* f2;
    thus the_Target_of G1
       = the_Target_of G3 +* (f1 +* f2) by A2, A24, FUNCT_4:70
      .= (the_Target_of G3 +* f1) +* f2 by FUNCT_4:14
      .= the_Target_of G2 +* f2;
  end;
  hence G1 is addLoops of G2, V2 by A13, A20, Def5;
end;

theorem Th25:
  for G2 being loopless _Graph, V being Subset of the_Vertices_of G2
  for G1 being addLoops of G2, V
  holds the_Edges_of G2 misses G1.loops() &
    the_Edges_of G1 = the_Edges_of G2 \/ G1.loops()
proof
  let G2 be loopless _Graph, V be Subset of the_Vertices_of G2;
  let G1 be addLoops of G2, V;
  thus the_Edges_of G2 misses G1.loops()
  proof
    assume the_Edges_of G2 meets G1.loops();
    then consider e being object such that
      A1: e in the_Edges_of G2 & e in G1.loops() by XBOOLE_0:3;
    consider v being object such that
      A2: e Joins v,v,G1 by A1, GLIB_009:def 2;
    thus contradiction by A1, A2, GLIB_006:72, GLIB_000:18;
  end;
  consider E being set, f being one-to-one Function such that
    A3: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
      dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
      the_Target_of G1 = the_Target_of G2 +* f by Def5;
  now
    let e be object;
    hereby
      assume e in G1.loops();
      then consider v being object such that
        A4: e Joins v,v,G1 by GLIB_009:def 2;
      A5: not e in the_Edges_of G2 by A4, GLIB_000:18, GLIB_006:72;
      e in the_Edges_of G1 by A4, GLIB_000:def 13;
      hence e in E by A3, A5, XBOOLE_0:def 3;
    end;
    assume e in E;
    then A6: e in dom f & e in the_Edges_of G1 by A3, XBOOLE_0:def 3;
    then (the_Source_of G1).e = f.e & (the_Target_of G1).e = f.e
      by A3, FUNCT_4:13;
    hence e in G1.loops() by A6, GLIB_000:def 14, GLIB_009:45;
  end;
  hence the_Edges_of G1 = the_Edges_of G2 \/ G1.loops() by A3, TARSKI:2;
end;

theorem Th26:
  for G1 being loopless _Graph, V being set
  for G2 being addLoops of G1, V, G3 being removeLoops of G2
  holds G1 == G3
proof
  let G1 be loopless _Graph, V be set;
  let G2 be addLoops of G1, V, G3 be removeLoops of G2;
  per cases;
  suppose A1: V c= the_Vertices_of G1;
    then A2: the_Vertices_of G1 = the_Vertices_of G2 by Def5
      .= the_Vertices_of G3 by GLIB_000:53;
    A3: the_Edges_of G1
       = (the_Edges_of G1 \/ G2.loops()) \ G2.loops() by A1, Th25, XBOOLE_1:88
      .= the_Edges_of G2 \ G2.loops() by A1, Th25
      .= the_Edges_of G3 by GLIB_000:53;
    A4: dom the_Source_of G1 = the_Edges_of G3 by A3, FUNCT_2:def 1
      .= dom the_Source_of G3 by FUNCT_2:def 1;
    A5: dom the_Target_of G1 = the_Edges_of G3 by A3, FUNCT_2:def 1
      .= dom the_Target_of G3 by FUNCT_2:def 1;
    now
      let e be object;
      assume A6: e in dom the_Source_of G1;
      hence (the_Source_of G1).e
         = (the_Source_of G2).e by GLIB_006:def 9
        .= (the_Source_of G3).e by A3, A6, GLIB_000:def 32;
    end;
    then A7: the_Source_of G1 = the_Source_of G3 by A4, FUNCT_1:2;
    now
      let e be object;
      assume A8: e in dom the_Target_of G1;
      hence (the_Target_of G1).e
         = (the_Target_of G2).e by GLIB_006:def 9
        .= (the_Target_of G3).e by A3, A8, GLIB_000:def 32;
    end;
    then the_Target_of G1 = the_Target_of G3 by A5, FUNCT_1:2;
    hence thesis by A2, A3, A7, GLIB_000:def 34;
  end;
  suppose not V c= the_Vertices_of G1;
    then A9: G1 == G2 by Def5;
    then G2 is loopless by GLIB_000:89;
    then G2 == G3 by GLIB_009:58;
    hence thesis by A9, GLIB_000:85;
  end;
end;

theorem Th27:
  for G1, G2 being _Graph, v being Vertex of G2
  holds G1 is addLoops of G2, {v} iff ex e being object
    st not e in the_Edges_of G2 & G1 is addEdge of G2,v,e,v
proof
  let G1, G2 be _Graph, v be Vertex of G2;
  hereby
    assume A1: G1 is addLoops of G2, {v};
    then consider E being set, f being one-to-one Function such that
      A2: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
        dom f = E & rng f = {v} & the_Source_of G1 = the_Source_of G2 +* f &
        the_Target_of G1 = the_Target_of G2 +* f by Def5;
    v in rng f by A2, TARSKI:def 1;
    then consider e being object such that
      A3: e in dom f & f.e = v by FUNCT_1:def 3;
    take e;
    card E = card {v} by A2, CARD_1:70;
    then consider e0 being object such that
      A4: E = {e0} by CARD_1:29;
    A5: E = {e} by A2, A3, A4, TARSKI:def 1;
    hence A6: not e in the_Edges_of G2 by A2, ZFMISC_1:48;
    the_Vertices_of G1 = the_Vertices_of G2 &
      the_Edges_of G1 = the_Edges_of G2 \/ {e} &
      the_Source_of G1 = the_Source_of G2 +* (e .--> v) &
      the_Target_of G1 = the_Target_of G2 +* (e .--> v)
      by A1, A2, A5, Def5, FUNCOP_1:9;
    hence G1 is addEdge of G2,v,e,v by A1, A6, GLIB_006:def 11;
  end;
  given e being object such that
    A7: not e in the_Edges_of G2 & G1 is addEdge of G2,v,e,v;
  now
    thus the_Vertices_of G1 = the_Vertices_of G2 by A7, GLIB_006:def 11;
    reconsider f = e .--> v as one-to-one Function;
    take E = {e}, f;
    thus E misses the_Edges_of G2 by A7, ZFMISC_1:50;
    thus the_Edges_of G1 = the_Edges_of G2 \/ E by A7, GLIB_006:def 11;
    thus dom f = E;
    e is set & v is set by TARSKI:1;
    hence rng f = {v} by FUNCOP_1:88;
    thus the_Source_of G1 = the_Source_of G2 +* f by A7, GLIB_006:def 11;
    thus the_Target_of G1 = the_Target_of G2 +* f by A7, GLIB_006:def 11;
  end;
  hence G1 is addLoops of G2, {v} by A7, Def5;
end;

:: copied from GLIB_008
Lm2:
  for p being non empty FinSequence, x being object
  for n being Element of dom(p^<*x*>) st n <= len(p^<*x*>) - 1
  holds n = len(p^<*x*>) - 1 or n <= len p - 1
proof
  let p be non empty FinSequence, x be object, n be Element of dom(p^<*x*>);
  A1: len(p^<*x*>) = len p + len <*x*> by FINSEQ_1:22
    .= len p + 1 by FINSEQ_1:39;
  assume A2: n <= len(p^<*x*>) - 1;
  assume not n = len(p^<*x*>) - 1;
  then A3: n < len p - 1 + 1 by A1, A2, XXREAL_0:1;
  len p - 1 is Nat by CHORD:1;
  hence n <= len p - 1 by A3, NAT_1:13;
end;

:: finite addition of loops can be finitely constructed with one loop at a time
theorem
  for G2 being _Graph, V being finite Subset of the_Vertices_of G2
  for G1 being addLoops of G2, V
  ex p being non empty Graph-yielding FinSequence
  st p.1 == G2 & p.len p = G1 & len p = card V + 1 &
    for n being Element of dom p st n <= len p - 1 holds
    ex v being Vertex of G2, e being object
    st p.(n+1) is addEdge of p.n, v,e,v & v in V & not e in the_Edges_of p.n
proof
  :: Proof follows along the lines of the similar ones done in GLIB_008
  defpred P[Nat] means for G2 being _Graph
    for V being finite Subset of the_Vertices_of G2
    for G1 being addLoops of G2, V st card V = $1
    ex p being non empty Graph-yielding FinSequence
    st p.1 == G2 & p.len p = G1 & len p = card V + 1 &
      for n being Element of dom p st n <= len p - 1 holds
      ex v being Vertex of G2, e being object
      st p.(n+1) is addEdge of p.n, v,e,v & v in V & not e in the_Edges_of p.n;
  A1: P[0]
  proof
    :: no loops added at all
    let G2 be _Graph, V being finite Subset of the_Vertices_of G2;
    let G1 be addLoops of G2, V;
    assume card V = 0;
    then A2: V = {};
    take p = <* G1 *>;
    thus p.1 == G2 by A2, Th21;
    thus p.len p = p.1 by FINSEQ_1:40 .= G1;
    thus len p = card V + 1 by A2, FINSEQ_1:40;
    let n be Element of dom p;
    A3: 1 <= n by FINSEQ_3:25;
    assume n <= len p - 1;
    then n <= 1-1 by FINSEQ_1:40;
    hence thesis by A3, XXREAL_0:2; :: by contradiction
  end;
  A4: for k being Nat st P[k] holds P[k+1]
  proof
    let k be Nat;
    assume A5: P[k];
    let G2 be _Graph, V be finite Subset of the_Vertices_of G2;
    let G1 be addLoops of G2, V;
    assume A6: card V = k+1;
    then A7: V <> {};
    set v0 = the Element of V;
    v0 in V by A7;
    then reconsider v0 as Vertex of G2;
    reconsider V9 = V \ {v0} as finite Subset of the_Vertices_of G2;
    :: we use that we can partition the vertices loops should be added to
    :: into two disjoint subsets and then add loops on one subset first
    A8: V = V9 \/ {v0} by A7, ZFMISC_1:116;
    reconsider V0 = {v0} as finite Subset of the_Vertices_of G2;
    v0 in {v0} by TARSKI:def 1;
    then A9: not v0 in V9 by XBOOLE_0:def 5;
    then V9 misses V0 by ZFMISC_1:50;
    then consider G9 being addLoops of G2, V9 such that
      A10: G1 is addLoops of G9, V0 by A8, Th24;
    card V9 = card V - card V0 by A7, ZFMISC_1:31, CARD_2:44
      .= k+1-1 by A6, CARD_1:30;
    then consider p being non empty Graph-yielding FinSequence such that
      A11: p.1 == G2 & p.len p = G9 & len p = card V9 + 1 and
      A12: for n being Element of dom p st n <= len p - 1 holds
        ex v being Vertex of G2, e being object
        st p.(n+1) is addEdge of p.n, v,e,v & v in V9 &
          not e in the_Edges_of p.n by A5;
    take q = p ^ <* G1 *>;
    1 <= len p by FINSEQ_1:20;
    then 1 in dom p by FINSEQ_3:25;
    hence q.1 == G2 by A11, FINSEQ_1:def 7;
    A13: len q = len p + len <* G1 *> by FINSEQ_1:22
      .= len p + 1 by FINSEQ_1:40;
    hence A14: q.len q = G1 by FINSEQ_1:42;
    thus len q = card V + 1 by A8, A9, A11, A13, CARD_2:41;
    let n be Element of dom q;
    assume n <= len q - 1;
    then per cases by Lm2;
    suppose A15: n = len q - 1;
      then A16: q.(n+1) = G1 by A14;
      A17: 1 <= n by FINSEQ_3:25;
      A18: n = len p by A13, A15;
      then n in dom p by A17, FINSEQ_3:25;
      then A19: q.n = G9 by A11, A18, FINSEQ_1:def 7;
      v0 is Vertex of G9 by Th15;
      then consider e being object such that
        A20: not e in the_Edges_of G9 & G1 is addEdge of G9,v0,e,v0
        by A10, Th27;
      reconsider v0 as Vertex of G2;
      take v0, e;
      thus q.(n+1) is addEdge of q.n,v0,e,v0 by A16, A19, A20;
      thus v0 in V by A7;
      thus not e in the_Edges_of q.n by A19, A20;
    end;
    suppose A21: n <= len p - 1;
      then A22: n+0 <= len p - 1 + 1 by XREAL_1:7;
      1 <= n by FINSEQ_3:25;
      then reconsider m = n as Element of dom p by A22, FINSEQ_3:25;
      consider v being Vertex of G2, e being object such that
        A23: p.(m+1) is addEdge of p.m,v,e,v & v in V9 &
          not e in the_Edges_of p.m by A12, A21;
      1+0 <= n+1 & n+1 <= len p - 1 + 1 by A21, XREAL_1:6;
      then n+1 in dom p by FINSEQ_3:25;
      then A24: q.(n+1) = p.(m+1) by FINSEQ_1:def 7;
      A25: q.n = p.m by FINSEQ_1:def 7;
      take v,e;
      v in V by A23, XBOOLE_1:36, TARSKI:def 3;
      hence thesis by A23, A24, A25;
    end;
  end;
  A26: for k being Nat holds P[k] from NAT_1:sch 2(A1,A4);
  let G2 be _Graph, V be finite Subset of the_Vertices_of G2;
  let G1 be addLoops of G2, V;
  thus thesis by A26;
end;

theorem Th29:
  for G3, G4 being _Graph, V1, V2 being set
  for G1 being addLoops of G3, V1, G2 being addLoops of G4, V2
  for F0 being PGraphMapping of G3, G4
  st V1 c= the_Vertices_of G3 & V2 c= the_Vertices_of G4 &
    F0_V | V1 is one-to-one & dom(F0_V | V1) = V1 & rng(F0_V | V1) = V2
  ex F being PGraphMapping of G1, G2 st
    F_V = F0_V & F_E | dom F0_E = F0_E &
    (F0 is non empty  implies F is non empty) &
    (F0 is total implies F is total) &
    (F0 is onto implies F is onto) &
    (F0 is one-to-one implies F is one-to-one) &
    (F0 is directed implies F is directed) &
    (F0 is weak_SG-embedding implies F is weak_SG-embedding) &
    (F0 is isomorphism implies F is isomorphism) &
    (F0 is Disomorphism implies F is Disomorphism)
proof
  let G3, G4 be _Graph, V1, V2 be set;
  let G1 be addLoops of G3, V1, G2 be addLoops of G4, V2;
  let F0 be PGraphMapping of G3, G4;
  assume that
    A1: V1 c= the_Vertices_of G3 & V2 c= the_Vertices_of G4 and
    A2: F0_V | V1 is one-to-one & dom(F0_V | V1) = V1 & rng(F0_V | V1) = V2;
  :: define F_V and F_E
  the_Vertices_of G1 = the_Vertices_of G3 &
    the_Vertices_of G2 = the_Vertices_of G4 by A1, Def5;
  then reconsider f=F0_V as PartFunc of the_Vertices_of G1, the_Vertices_of G2;
  :: below does not accept A2 instead of A1...
  consider E1 being set, f1 being one-to-one Function such that
    A3: E1 misses the_Edges_of G3 & the_Edges_of G1 = the_Edges_of G3 \/ E1 &
      dom f1 = E1 & rng f1 = V1 & the_Source_of G1 = the_Source_of G3 +* f1 &
      the_Target_of G1 = the_Target_of G3 +* f1 by A1, Def5;
  :: why does the checker accept the following?
  consider E2 being set, f2 being one-to-one Function such that
    A4: E2 misses the_Edges_of G4 & the_Edges_of G2 = the_Edges_of G4 \/ E2 &
      dom f2 = E2 & rng f2 = V2 & the_Source_of G2 = the_Source_of G4 +* f2 &
      the_Target_of G2 = the_Target_of G4 +* f2 by A2, Def5;
  set h = f2"*(F0_V|V1)*f1;
  set g = F0_E +* h;
  A5: dom g = dom F0_E \/ dom h by FUNCT_4:def 1;
  A6: dom(f2") = rng(F0_V|V1) by A2, A4, FUNCT_1:33;
  then A7: dom(f2"*(F0_V|V1)) = rng f1 by A2, A3, RELAT_1:27;
  then A8: dom h = E1 by A3, RELAT_1:27;
  then A9: dom g c= the_Edges_of G1 by A3, A5, XBOOLE_1:9;
  rng(f2"*(F0_V|V1)) = rng(f2") by A6, RELAT_1:28
    .= E2 by A4, FUNCT_1:33;
  then A10: rng h = E2 by A7, RELAT_1:28;
  A11: rng g c= rng F0_E \/ rng h by FUNCT_4:17;
  rng F0_E \/ rng h c= the_Edges_of G4 \/ E2 by A10, XBOOLE_1:9;
  then rng g c= the_Edges_of G2 by A4, A11, XBOOLE_1:1;
  then reconsider g as PartFunc of the_Edges_of G1, the_Edges_of G2
    by A9, RELSET_1:4;
  A12: dom((F0_V|V1)*f1) = dom f1 by A2, A3, RELAT_1:27;
  :: reconsider F as PGM
  now
    hereby
      let e be object;
      set v = (the_Source_of G1).e, w = (the_Target_of G1).e;
      assume e in dom g;
      then per cases by FUNCT_4:12;
      suppose A13: e in dom F0_E;
        then v = (the_Source_of G3).e & w = (the_Target_of G3).e
          by GLIB_006:def 9;
        hence v in dom f & w in dom f by A13, GLIB_010:5;
      end;
      suppose e in dom h;
        then A14: e in dom f1 by A3, A8;
        then v = f1.e & w = f1.e by A3, FUNCT_4:13;
        then v in V1 & w in V1 by A3, A14, FUNCT_1:3;
        hence v in dom f & w in dom f by A2, RELAT_1:57;
      end;
    end;
    let e,v,w be object;
    assume A15: e in dom g & v in dom f & w in dom f;
    assume A16: e Joins v,w,G1;
    per cases by A15, FUNCT_4:12;
    suppose A17: e in dom F0_E;
      then e Joins v,w,G3 by A16, GLIB_006:72;
      then A18: F0_E.e Joins F0_V.v,F0_V.w,G4 by A15, A17, GLIB_010:4;
      not e in E1 by A3, A15, A17, XBOOLE_0:5;
      then g.e Joins f.v,f.w,G4 by A8, A18, FUNCT_4:11;
      hence g.e Joins f.v,f.w,G2 by GLIB_006:70;
    end;
    suppose e in dom h;
      then A19: e in E1 & g.e = h.e by A8, FUNCT_4:13;
      then (the_Source_of G1).e = f1.e &
        (the_Target_of G1).e = f1.e by A3, FUNCT_4:13;
      then A20: v = f1.e & w = f1.e by A16, GLIB_000:def 13;
      then A21: v in V1 by A3, A19, FUNCT_1:3;
      then A22: f.v = (F0_V|V1).v by FUNCT_1:49;
      then A23: f.v in V2 by A2, A21, FUNCT_1:3;
      then f.v in dom(f2") by A4, FUNCT_1:33;
      then f2".(f.v) in rng(f2") by FUNCT_1:3;
      then A24: f2".(f.v) in dom f2 by FUNCT_1:33;
      then (the_Source_of G2).(f2".(f.v)) = f2.(f2".(f.v)) &
        (the_Target_of G2).(f2".(f.v)) = f2.(f2".(f.v)) by A4, FUNCT_4:13;
      then A25: (the_Source_of G2).(f2".(f.v)) = f.v &
        (the_Target_of G2).(f2".(f.v))=f.v by A4, A23, FUNCT_1:35;
      f2".(f.v) in the_Edges_of G2 by A4, A24, XBOOLE_0:def 3;
      then f2".((F0_V|V1).v) Joins f.v,f.v,G2 by A22, A25, GLIB_000:def 13;
      then f2".(((F0_V|V1)*f1).e) Joins f.v,f.w,G2 by A3, A19, A20, FUNCT_1:13;
      then (f2"*((F0_V|V1)*f1)).e Joins f.v,f.w,G2 by A3, A12, A19, FUNCT_1:13;
      hence g.e Joins f.v,f.w,G2 by A19, RELAT_1:36;
    end;
  end;
  then reconsider F = [f,g] as PGraphMapping of G1, G2 by GLIB_010:8;
  take F;
  thus F_V = F0_V;
  A26: dom F0_E misses dom h by A3, A8, XBOOLE_1:63;
  hence F_E | dom F0_E = F0_E by FUNCT_4:33;
  :: show the properties
  hereby
    assume F0 is non empty;
    then dom F_V <> {};
    hence F is non empty;
  end;
  thus A27: F0 is total implies F is total
  proof
    assume F0 is total;
    then A28: dom F0_V = the_Vertices_of G3 & dom F0_E = the_Edges_of G3
      by GLIB_010:def 11;
    :: here A1 cannot be substituted by A2
    then A29: dom F_V = the_Vertices_of G1 by A1, Def5;
    dom F_E = the_Edges_of G1 by A3, A8, A28, FUNCT_4:def 1;
    hence F is total by A29, GLIB_010:def 11;
  end;
  thus A30: F0 is onto implies F is onto
  proof
    assume F0 is onto;
    then A31: rng F0_V = the_Vertices_of G4 & rng F0_E = the_Edges_of G4
      by GLIB_010:def 12;
    :: here A2 instead of A1 works again...
    then A32: rng F_V = the_Vertices_of G2 by A2, Def5;
    rng F_E = the_Edges_of G2 by A4, A10, A26, A31, NECKLACE:6;
    hence F is onto by A32, GLIB_010:def 12;
  end;
  thus A33: F0 is one-to-one implies F is one-to-one
  proof
    assume A34: F0 is one-to-one;
    rng F0_E misses E2 by A4, XBOOLE_1:63;
    then F_V is one-to-one & F_E is one-to-one by A2, A10, A34, FUNCT_4:92;
    hence F is one-to-one by GLIB_010:def 13;
  end;
  thus A35: F0 is directed implies F is directed
  proof
    assume A36: F0 is directed;
    now
      let e,v,w be object;
      assume A37: e in dom F_E & v in dom F_V & w in dom F_V;
      assume A38: e DJoins v,w,G1;
      per cases by A37, FUNCT_4:12;
      suppose A39: e in dom F0_E;
        then e DJoins v,w,G3 by A38, GLIB_006:71;
        then A40: F0_E.e DJoins F0_V.v,F0_V.w,G4
          by A36, A37, A39, GLIB_010:def 14;
        not e in E1 by A3, A37, A39, XBOOLE_0:5;
        then g.e DJoins f.v,f.w,G4 by A8, A40, FUNCT_4:11;
        hence F_E.e DJoins F_V.v,F_V.w,G2 by GLIB_006:70;
      end;
      suppose e in dom h;
        then A41: e in E1 & g.e = h.e by A8, FUNCT_4:13;
        then (the_Source_of G1).e = f1.e &
          (the_Target_of G1).e = f1.e by A3, FUNCT_4:13;
        then A42: v = f1.e & w = f1.e by A38, GLIB_000:def 14;
        then A43: v in V1 by A3, A41, FUNCT_1:3;
        then A44: f.v = (F0_V|V1).v by FUNCT_1:49;
        then A45: f.v in V2 by A2, A43, FUNCT_1:3;
        then f.v in dom(f2") by A4, FUNCT_1:33;
        then f2".(f.v) in rng(f2") by FUNCT_1:3;
        then A46: f2".(f.v) in dom f2 by FUNCT_1:33;
        then (the_Source_of G2).(f2".(f.v)) = f2.(f2".(f.v)) &
          (the_Target_of G2).(f2".(f.v)) = f2.(f2".(f.v)) by A4, FUNCT_4:13;
        then A47: (the_Source_of G2).(f2".(f.v)) = f.v &
          (the_Target_of G2).(f2".(f.v))=f.v
          by A4, A45, FUNCT_1:35;
        f2".(f.v) in the_Edges_of G2 by A4, A46, XBOOLE_0:def 3;
        then f2".((F0_V|V1).v) DJoins f.v,f.v,G2 by A44, A47, GLIB_000:def 14;
        then f2".(((F0_V|V1)*f1).e) DJoins f.v,f.w,G2
          by A3, A41, A42, FUNCT_1:13;
        then (f2"*((F0_V|V1)*f1)).e DJoins f.v,f.w,G2
          by A3, A12, A41, FUNCT_1:13;
        hence F_E.e DJoins F_V.v,F_V.w,G2 by A41, RELAT_1:36;
      end;
    end;
    hence F is directed by GLIB_010:def 14;
  end;
  thus F0 is weak_SG-embedding implies F is weak_SG-embedding by A27, A33;
  thus F0 is isomorphism implies F is isomorphism by A27, A30, A33;
  thus F0 is Disomorphism implies F is Disomorphism by A27, A30, A33, A35;
end;

theorem
  for G3 being _Graph, G4 being G3-isomorphic _Graph
  for G1 being addLoops of G3 for G2 being addLoops of G4
  holds G2 is G1-isomorphic
proof
  let G3 be _Graph, G4 be G3-isomorphic _Graph;
  let G1 be addLoops of G3;
  let G2 be addLoops of G4;
  consider F0 being PGraphMapping of G3, G4 such that
    A1: F0 is isomorphism by GLIB_010:def 23;
  A2: dom(F0_V | the_Vertices_of G3) = the_Vertices_of G3
    by A1, GLIB_010:def 11;
  rng(F0_V | the_Vertices_of G3) = the_Vertices_of G4
    by A1, GLIB_010:def 12;
  then consider F being PGraphMapping of G1, G2 such that
    F_V = F0_V & F_E | dom F0_E = F0_E and
    F0 is non empty  implies F is non empty and
    F0 is total implies F is total and
    F0 is onto implies F is onto and
    F0 is one-to-one implies F is one-to-one and
    F0 is directed implies F is directed and
    F0 is weak_SG-embedding implies F is weak_SG-embedding and
    A3: F0 is isomorphism implies F is isomorphism and
    F0 is Disomorphism implies F is Disomorphism by A1, A2, Th29;
  thus thesis by A1, A3, GLIB_010:def 23;
end;

theorem
  for G3 being _Graph, G4 being G3-Disomorphic _Graph
  for G1 being addLoops of G3 for G2 being addLoops of G4
  holds G2 is G1-Disomorphic
proof
  let G3 be _Graph, G4 be G3-Disomorphic _Graph;
  let G1 be addLoops of G3;
  let G2 be addLoops of G4;
  consider F0 being PGraphMapping of G3, G4 such that
    A1: F0 is Disomorphism by GLIB_010:def 24;
  A2: dom(F0_V | the_Vertices_of G3) = the_Vertices_of G3
    by A1, GLIB_010:def 11;
  rng(F0_V | the_Vertices_of G3) = the_Vertices_of G4
    by A1, GLIB_010:def 12;
  then consider F being PGraphMapping of G1, G2 such that
    F_V = F0_V & F_E | dom F0_E = F0_E and
    F0 is non empty  implies F is non empty and
    F0 is total implies F is total and
    F0 is onto implies F is onto and
    F0 is one-to-one implies F is one-to-one and
    F0 is directed implies F is directed and
    F0 is weak_SG-embedding implies F is weak_SG-embedding and
    F0 is isomorphism implies F is isomorphism and
    A3: F0 is Disomorphism implies F is Disomorphism by A1, A2, Th29;
  thus thesis by A1, A3, GLIB_010:def 24;
end;

theorem
  for G3, G4 being _Graph, V being set
  for G1 being addLoops of G3, V, G2 being addLoops of G4, V
  st G3 == G4 holds G2 is G1-Disomorphic
proof
  let G3, G4 be _Graph, V be set;
  let G1 be addLoops of G3, V, G2 be addLoops of G4, V;
  assume A1: G3 == G4;
  per cases;
  suppose A2: V c= the_Vertices_of G3;
    consider F0 being PGraphMapping of G3, G4 such that
      A3: F0 = id G3 & F0 is Disomorphism by A1, GLIBPRE0:75;
    A4: F0_V | V is one-to-one by A3, FUNCT_1:52;
    A5: dom(F0_V | V) = dom F0_V /\ V by RELAT_1:61
      .= V by A2, A3, XBOOLE_1:28;
    A6: rng(F0_V | V) = (id G3)_V.:V by A3, RELAT_1:115
      .= V by A2, FUNCT_1:92;
    consider F being PGraphMapping of G1, G2 such that
      F_V = F0_V & F_E | dom F0_E = F0_E and
      F0 is non empty  implies F is non empty and
      F0 is total implies F is total and
      F0 is onto implies F is onto and
      F0 is one-to-one implies F is one-to-one and
      F0 is directed implies F is directed and
      F0 is weak_SG-embedding implies F is weak_SG-embedding and
      F0 is isomorphism implies F is isomorphism and
      A7: F0 is Disomorphism implies F is Disomorphism
      by A2, A4, A5, A6, Th29;
    thus thesis by A3, A7, GLIB_010:def 24;
  end;
  suppose not V c= the_Vertices_of G3;
    then G1 == G3 & not V c= the_Vertices_of G4 by A1, Def5, GLIB_000:def 34;
    then G1 == G4 & G2 == G4 by A1, Def5, GLIB_000:85;
    hence thesis by GLIB_000:85,GLIBPRE0:76;
  end;
end;

theorem
  for G3 being _Graph, V, E being set, G4 being reverseEdgeDirections of G3, E
  for G1 being addLoops of G3, V, G2 being addLoops of G4, V
  holds G2 is G1-isomorphic
proof
  let G3 be _Graph, V, E be set, G4 be reverseEdgeDirections of G3, E;
  let G1 be addLoops of G3, V, G2 be addLoops of G4, V;
  per cases;
  suppose A1: V c= the_Vertices_of G3;
    consider F0 being PGraphMapping of G3, G4 such that
      A2: F0 = id G3 & F0 is isomorphism by GLIBPRE0:77;
    A3: F0_V | V is one-to-one by A2, FUNCT_1:52;
    A4: dom(F0_V | V) = dom F0_V /\ V by RELAT_1:61
      .= V by A1, A2, XBOOLE_1:28;
    A5: rng(F0_V | V) = (id G3)_V.:V by A2, RELAT_1:115
      .= V by A1, FUNCT_1:92;
    consider F being PGraphMapping of G1, G2 such that
      F_V = F0_V & F_E | dom F0_E = F0_E and
      F0 is non empty  implies F is non empty and
      F0 is total implies F is total and
      F0 is onto implies F is onto and
      F0 is one-to-one implies F is one-to-one and
      F0 is directed implies F is directed and
      F0 is weak_SG-embedding implies F is weak_SG-embedding and
      A6: F0 is isomorphism implies F is isomorphism and
      F0 is Disomorphism implies F is Disomorphism
      by A1, A3, A4, A5, Th29;
    thus thesis by A2, A6, GLIB_010:def 23;
  end;
  suppose not V c= the_Vertices_of G3;
    then G1 == G3 & not V c= the_Vertices_of G4 by Def5, GLIB_007:4;
    then A7: G1 == G3 & G2 == G4 by Def5;
    then G2 is reverseEdgeDirections of G3, E by GLIB_007:2;
    then G3 is reverseEdgeDirections of G2, E by GLIB_007:3;
    then G1 is reverseEdgeDirections of G2, E by A7, GLIB_007:2;
    then G2 is reverseEdgeDirections of G1, E by GLIB_007:3;
    hence thesis by GLIBPRE0:78;
  end;
end;

theorem
  for G3 being _Graph, E, V being set, G4 being reverseEdgeDirections of G3, E
  for G1 being addLoops of G3, V, G2 being reverseEdgeDirections of G1, E
  st E c= the_Edges_of G3 holds G2 is addLoops of G4, V
proof
  let G3 be _Graph, E, V be set, G4 be reverseEdgeDirections of G3, E;
  let G1 be addLoops of G3, V, G2 be reverseEdgeDirections of G1, E;
  assume A1: E c= the_Edges_of G3;
  A2: the_Vertices_of G2 = the_Vertices_of G1 by GLIB_007:4
    .= the_Vertices_of G3 by Th15
    .= the_Vertices_of G4 by GLIB_007:4;
  the_Edges_of G3 c= the_Edges_of G1 by GLIB_006:def 9;
  then A3: E c= the_Edges_of G1 by A1, XBOOLE_1:1;
  A4: G2 is Supergraph of G4 by A1, GLIBPRE0:50;
  per cases;
  suppose A5: V c= the_Vertices_of G3;
    then A6: V c= the_Vertices_of G4 by GLIB_007:4;
    now
      consider D being set, f being one-to-one Function such that
        A7: D misses the_Edges_of G3 & the_Edges_of G1 = the_Edges_of G3 \/ D &
          dom f = D & rng f = V & the_Source_of G1 = the_Source_of G3 +* f &
          the_Target_of G1 = the_Target_of G3 +* f by A5, Def5;
      take D, f;
      thus D misses the_Edges_of G4 by A7, GLIB_007:4;
      thus the_Edges_of G2 = the_Edges_of G1 by GLIB_007:4
        .= the_Edges_of G4 \/ D by A7, GLIB_007:4;
      thus dom f = D & rng f = V by A7;
      E = the_Edges_of G3 /\ E by A1, XBOOLE_1:28;
      then A8: dom f misses the_Edges_of G3 /\ E by A1, A7, XBOOLE_1:63;
      then dom f misses dom the_Source_of G3 /\ E by FUNCT_2:def 1;
      then A9: dom f misses dom((the_Source_of G3)|E) by RELAT_1:61;
      dom f misses dom the_Target_of G3 /\ E by A8, FUNCT_2:def 1;
      then A10: dom f misses dom((the_Target_of G3)|E) by RELAT_1:61;
      A11: (the_Source_of G1)|E
         = ((the_Source_of G1)|the_Edges_of G3)|E by A1, RELAT_1:74
        .= (the_Source_of G3)|E by GLIB_006:69;
      A12: (the_Target_of G1)|E
         = ((the_Target_of G1)|the_Edges_of G3)|E by A1, RELAT_1:74
        .= (the_Target_of G3)|E by GLIB_006:69;
      thus the_Source_of G2
         = the_Source_of G1 +* ((the_Target_of G1)|E) by A3, GLIB_007:def 1
        .= the_Source_of G3 +* (f +* ((the_Target_of G3)|E))
          by A7, A12, FUNCT_4:14
        .= the_Source_of G3 +* ((the_Target_of G3)|E +* f) by A10, FUNCT_4:35
        .= the_Source_of G3 +* ((the_Target_of G3)|E) +* f by FUNCT_4:14
        .= the_Source_of G4 +* f by A1, GLIB_007:def 1;
      thus the_Target_of G2
         = the_Target_of G1 +* ((the_Source_of G1)|E) by A3, GLIB_007:def 1
        .= the_Target_of G3 +* (f +* ((the_Source_of G3)|E))
          by A7, A11, FUNCT_4:14
        .= the_Target_of G3 +* ((the_Source_of G3)|E +* f) by A9, FUNCT_4:35
        .= the_Target_of G3 +* ((the_Source_of G3)|E) +* f by FUNCT_4:14
        .= the_Target_of G4 +* f by A1, GLIB_007:def 1;
    end;
    hence thesis by A2, A4, A6, Def5;
  end;
  suppose not V c= the_Vertices_of G3;
    then A13: G1 == G3 & not V c= the_Vertices_of G4 by Def5, GLIB_007:4;
    G3 is reverseEdgeDirections of G4, E by GLIB_007:3;
    then G1 is reverseEdgeDirections of G4, E by A13, GLIB_007:2;
    then G4 is reverseEdgeDirections of G1, E by GLIB_007:3;
    then G2 == G4 by GLIB_007:1;
    hence thesis by A4, A13, Def5;
  end;
end;

theorem
  for G3 being _Graph, V1 being Subset of the_Vertices_of G3
  for V2 being non empty Subset of the_Vertices_of G3
  for G4 being inducedSubgraph of G3, V2
  for G1 being addLoops of G3, V1, G2 being inducedSubgraph of G1, V2
  holds G2 is addLoops of G4, V1 /\ V2
proof
  let G3 be _Graph, V1 be Subset of the_Vertices_of G3;
  let V2 be non empty Subset of the_Vertices_of G3;
  let G4 be inducedSubgraph of G3, V2;
  let G1 be addLoops of G3, V1, G2 be inducedSubgraph of G1, V2;
  A1: the_Vertices_of G1 = the_Vertices_of G3 by Def5;
  A2: the_Vertices_of G4 = V2 by GLIB_000:def 37;
  A3: the_Vertices_of G2 = V2 by A1, GLIB_000:def 37;
  A4: the_Edges_of G4 = G3.edgesBetween(V2) by GLIB_000:def 37;
  A5: the_Edges_of G2 = G1.edgesBetween(V2) by A1, GLIB_000:def 37;
  consider E being set, f being one-to-one Function such that
    A6: E misses the_Edges_of G3 & the_Edges_of G1 = the_Edges_of G3 \/ E &
      dom f = E & rng f = V1 & the_Source_of G1 = the_Source_of G3 +* f &
      the_Target_of G1 = the_Target_of G3 +* f by Def5;
  set g = f|(f"V2);
  set D = dom g;
  :: show that the_Edges_of G2 = the_Edges_of G4 \/ D
  now
    let e be object;
    thus e in the_Edges_of G2 implies e in the_Edges_of G4 or e in D
    proof
      assume e in the_Edges_of G2;
      then A7: e in the_Edges_of G1 & (the_Source_of G1).e in V2 &
        (the_Target_of G1).e in V2 by A5, GLIB_000:31;
      then per cases by A6, XBOOLE_0:def 3;
      suppose A8: e in the_Edges_of G3;
        then (the_Source_of G3).e in V2 & (the_Target_of G3).e in V2
          by A7, GLIB_006:def 9;
        hence thesis by A4, A8, GLIB_000:31;
      end;
      suppose A9: e in E;
        then (the_Source_of G1).e = f.e by A6, FUNCT_4:13;
        then e in f"V2 by A6, A7, A9, FUNCT_1:def 7;
        hence thesis by A6, A9, RELAT_1:57;
      end;
    end;
    assume e in the_Edges_of G4 or e in D;
    then per cases;
    suppose e in the_Edges_of G4;
      then A10: e in the_Edges_of G3 & (the_Source_of G3).e in V2 &
        (the_Target_of G3).e in V2 by A4, GLIB_000:31;
      then A11: (the_Source_of G3).e = (the_Source_of G1).e &
        (the_Target_of G3).e = (the_Target_of G1).e by GLIB_006:def 9;
      the_Edges_of G3 c= the_Edges_of G1 by GLIB_006:def 9;
      hence e in the_Edges_of G2 by A5, A10, A11, GLIB_000:31;
    end;
    suppose e in D;
      then e in f"V2 by RELAT_1:57;
      then A12: e in dom f & f.e in V2 by FUNCT_1:def 7;
      then A13: (the_Source_of G1).e in V2 & (the_Target_of G1).e in V2
        by A6, FUNCT_4:13;
      e in the_Edges_of G1 by A6, A12, XBOOLE_0:def 3;
      hence e in the_Edges_of G2 by A5, A13, GLIB_000:31;
    end;
  end;
  then A14: the_Edges_of G2 = the_Edges_of G4 \/ D by XBOOLE_0:def 3;
  :: show that G2 is Supergraph of G4
  now
    thus the_Vertices_of G4 c= the_Vertices_of G2 by A2, A3;
    thus the_Edges_of G4 c= the_Edges_of G2 by A14, XBOOLE_1:7;
    let e be set;
    set v = (the_Source_of G4).e, w = (the_Target_of G4).e;
    assume A15: e in the_Edges_of G4;
    then e DJoins v,w,G4 by GLIB_000:def 14;
    then A16: e DJoins v,w,G3 by GLIB_000:72;
    then A17: e DJoins v,w,G1 by GLIB_006:70;
    then A18: v = (the_Source_of G1).e & w = (the_Target_of G1).e
      by GLIB_000:def 14;
    v = (the_Source_of G3).e & w = (the_Target_of G3).e
      by A16, GLIB_000:def 14;
    then A19: e in the_Edges_of G3 & v in V2 & w in V2 by A4, A15, GLIB_000:31;
    the_Edges_of G3 c= the_Edges_of G1 by GLIB_006:def 9;
    then e in G1.edgesBetween(V2) by A19, A18, GLIB_000:31;
    then e DJoins v,w,G2 by A5, A17, GLIB_000:73;
    hence (the_Source_of G2).e = (the_Source_of G4).e &
      (the_Target_of G2).e = (the_Target_of G4).e by GLIB_000:def 14;
  end;
  then A20: G2 is Supergraph of G4 by GLIB_006:def 9;
  A21: V1 /\ V2 c= the_Vertices_of G4 by A2, XBOOLE_1:17;
  :: show addLoops properties
  now
    thus the_Vertices_of G2 = the_Vertices_of G4 by A2, A3;
    reconsider D as set;
    reconsider g as one-to-one Function by FUNCT_1:52;
    take D,g;
    D c= dom f & the_Edges_of G4 c= the_Edges_of G3 by RELAT_1:60;
    hence A22: D misses the_Edges_of G4 by A6, XBOOLE_1:64;
    thus the_Edges_of G2 = the_Edges_of G4 \/ D by A14;
    thus dom g = D;
    thus rng g = f.:f"V2 by RELAT_1:115
      .= V2 /\ f.:dom f by FUNCT_1:78
      .= V1 /\ V2 by A6, RELAT_1:113;
    :: first the_Source_of G2
    A23: dom the_Source_of G2 = the_Edges_of G4 \/ D by A14, FUNCT_2:def 1
      .= dom the_Source_of G4 \/ dom g by FUNCT_2:def 1
      .= dom(the_Source_of G4 +* g) by FUNCT_4:def 1;
    now
      let x be object;
      assume x in dom the_Source_of G2;
      then A24: x in the_Edges_of G4 \/ D by A14;
      then per cases by XBOOLE_0:def 3;
      suppose A25: x in the_Edges_of G4;
        then A26: not x in D by A22, A24, XBOOLE_0:5;
        thus (the_Source_of G2).x
           = (the_Source_of G4).x by A20, A25, GLIB_006:def 9
          .= (the_Source_of G4 +* g).x by A26, FUNCT_4:11;
      end;
      suppose A27: x in D;
        then A28: x in f"V2 by RELAT_1:57;
        then A29: x in dom f & f.x in V2 by FUNCT_1:def 7;
        then A30: (the_Source_of G1).x = f.x & (the_Target_of G1).x = f.x
          by A6, FUNCT_4:13;
        x in the_Edges_of G1 by A6, A29, XBOOLE_0:def 3;
        then A31: x Joins f.x,f.x,G1 by A30, GLIB_000:def 13;
        then x in G1.edgesBetween(V2) by A29, GLIB_000:32;
        then x Joins f.x,f.x,G2 by A5, A31, GLIB_000:73;
        hence (the_Source_of G2).x = f.x by GLIB_000:def 13
          .= g.x by A28, FUNCT_1:49
          .= (the_Source_of G4 +* g).x by A27, FUNCT_4:13;
      end;
    end;
    hence the_Source_of G2 = the_Source_of G4 +* g by A23, FUNCT_1:2;
    :: analogous for the_Target_of G2
    A32: dom the_Target_of G2 = the_Edges_of G4 \/ D by A14, FUNCT_2:def 1
      .= dom the_Target_of G4 \/ dom g by FUNCT_2:def 1
      .= dom(the_Target_of G4 +* g) by FUNCT_4:def 1;
    now
      let x be object;
      assume x in dom the_Target_of G2;
      then A33: x in the_Edges_of G4 \/ D by A14;
      then per cases by XBOOLE_0:def 3;
      suppose A34: x in the_Edges_of G4;
        then A35: not x in D by A22, A33, XBOOLE_0:5;
        thus (the_Target_of G2).x
           = (the_Target_of G4).x by A20, A34, GLIB_006:def 9
          .= (the_Target_of G4 +* g).x by A35, FUNCT_4:11;
      end;
      suppose A36: x in D;
        then A37: x in f"V2 by RELAT_1:57;
        then A38: x in dom f & f.x in V2 by FUNCT_1:def 7;
        then A39: (the_Source_of G1).x = f.x & (the_Target_of G1).x = f.x
          by A6, FUNCT_4:13;
        x in the_Edges_of G1 by A6, A38, XBOOLE_0:def 3;
        then A40: x Joins f.x,f.x,G1 by A39, GLIB_000:def 13;
        then x in G1.edgesBetween(V2) by A38, GLIB_000:32;
        then x Joins f.x,f.x,G2 by A5, A40, GLIB_000:73;
        hence (the_Target_of G2).x = f.x by GLIB_000:def 13
          .= g.x by A37, FUNCT_1:49
          .= (the_Target_of G4 +* g).x by A36, FUNCT_4:13;
      end;
    end;
    hence the_Target_of G2 = the_Target_of G4 +* g by A32, FUNCT_1:2;
  end;
  hence G2 is addLoops of G4, V1 /\ V2 by A20, A21, Def5;
end;

theorem
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  for v1 being Vertex of G1, v2 being Vertex of G2
  st not v1 in V & v1 = v2 holds
    (v1 is isolated iff v2 is isolated) &
    (v1 is endvertex iff v2 is endvertex)
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: not v1 in V & v1 = v2;
  per cases;
  suppose V c= the_Vertices_of G2;
    then consider E being set, f being one-to-one Function such that
      A2: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
        dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
        the_Target_of G1 = the_Target_of G2 +* f by Def5;
    A3: G2 is Subgraph of G1 by GLIB_006:57;
    hence v1 is isolated implies v2 is isolated by A1, GLIB_000:83;
    thus v2 is isolated implies v1 is isolated
    proof
      assume A4: v2 is isolated;
      assume not v1 is isolated;
      then v1.allNeighbors() <> {} by GLIB_000:113;
      then consider w being object such that
        A5: w in v1.allNeighbors() by XBOOLE_0:def 1;
      consider e being object such that
        A6: e Joins v1,w,G1 by A5, GLIB_000:71;
      per cases by A1, A6, GLIB_006:72;
      suppose A7: e Joins v2,w,G2;
        w is set by TARSKI:1;
        then w in v2.allNeighbors() by A7, GLIB_000:71;
        hence contradiction by A4, GLIB_000:113;
      end;
      suppose A8: not e in the_Edges_of G2;
        e in the_Edges_of G2 \/ E by A2, A6, GLIB_000:def 13;
        then A9: e in dom f by A2, A8, XBOOLE_0:5;
        then (the_Source_of G1).e = f.e & (the_Target_of G1).e = f.e
          by A2, FUNCT_4:13;
        then v1 = f.e by A6, GLIB_000:def 13;
        hence contradiction by A1, A2, A9, FUNCT_1:3;
      end;
    end;
    thus v1 is endvertex implies v2 is endvertex
    proof
      assume A10: v1 is endvertex;
      assume not v2 is endvertex;
      then A11: v2 is isolated by A1, A3, A10, GLIB_000:84;
      consider e being object such that
        A12: v1.edgesInOut() = {e} & not e Joins v1,v1,G1
        by A10, GLIB_000:def 51;
      e in v1.edgesInOut() by A12, TARSKI:def 1;
      then A13: e in the_Edges_of G1 & ((the_Source_of G1).e = v1
        or (the_Target_of G1).e = v1) by GLIB_000:61;
      then per cases;
      suppose A14: (the_Source_of G1).e = v1;
        set w = (the_Target_of G1).e;
        e Joins v1,w,G1 by A13, A14, GLIB_000:def 13;
        then e Joins v2,w,G2 by A1, A12, Th17;
        then w in v2.allNeighbors() by GLIB_000:71;
        hence contradiction by A11, GLIB_000:113;
      end;
      suppose A15: (the_Target_of G1).e = v1;
        set w = (the_Source_of G1).e;
        e Joins v1,w,G1 by A13, A15, GLIB_000:def 13;
        then e Joins v2,w,G2 by A1, A12, Th17;
        then w in v2.allNeighbors() by GLIB_000:71;
        hence contradiction by A11, GLIB_000:113;
      end;
    end;
    thus v2 is endvertex implies v1 is endvertex
    proof
      assume v2 is endvertex;
      then consider e being object such that
        A16: v2.edgesInOut() = {e} & not e Joins v2,v2,G2 by GLIB_000:def 51;
      :: show that v1.edgesInOut() = {e}
      now
        let e0 be object;
        hereby
          assume e0 in v1.edgesInOut();
          then A17: e0 in the_Edges_of G1 & ((the_Source_of G1).e0 = v1
            or (the_Target_of G1).e0 = v1) by GLIB_000:61;
          then per cases;
          suppose A18: (the_Source_of G1).e0 = v1;
            set w = (the_Target_of G1).e0;
            A19: e0 Joins v1,w,G1 by A17, A18, GLIB_000:def 13;
            e0 in the_Edges_of G2
            proof
              assume not e0 in the_Edges_of G2;
              then A20: e0 in dom f by A2, A17, XBOOLE_0:def 3;
              then v1 = f.e0 by A2, A17, FUNCT_4:13;
              hence contradiction by A1, A2, A20, FUNCT_1:3;
            end;
            then e0 in v2.edgesInOut() by A1, A19, GLIB_006:72, GLIB_000:62;
            hence e0 = e by A16, TARSKI:def 1;
          end;
          suppose A21: (the_Target_of G1).e0 = v1;
            set w = (the_Source_of G1).e0;
            A22: e0 Joins v1,w,G1 by A17, A21, GLIB_000:def 13;
            e0 in the_Edges_of G2
            proof
              assume not e0 in the_Edges_of G2;
              then A23: e0 in dom f by A2, A17, XBOOLE_0:def 3;
              then v1 = f.e0 by A2, A17, FUNCT_4:13;
              hence contradiction by A1, A2, A23, FUNCT_1:3;
            end;
            then e0 in v2.edgesInOut() by A1, A22, GLIB_006:72, GLIB_000:62;
            hence e0 = e by A16, TARSKI:def 1;
          end;
        end;
        assume e0 = e;
        then e0 in v2.edgesInOut() by A16, TARSKI:def 1;
        hence e0 in v1.edgesInOut() by A1, A3, GLIB_000:78, TARSKI:def 3;
      end;
      then A24: v1.edgesInOut() = {e} by TARSKI:def 1;
      e in v2.edgesInOut() by A16, TARSKI:def 1;
      then not e Joins v1,v1,G1 by A1, A16, GLIB_006:72;
      hence v1 is endvertex by A24, GLIB_000:def 51;
    end;
  end;
  suppose not V c= the_Vertices_of G2;
    then G1 == G2 by Def5;
    hence thesis by A1, GLIB_000:97;
  end;
end;

theorem Th37:
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  for P being Path of G1
  holds P is Path of G2 or
    ex v,e being object st e Joins v,v,G1 & P = G1.walkOf(v,e,v)
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  let P be Path of G1;
  A1: G2 is Subgraph of G1 by GLIB_006:57;
  per cases;
  suppose P is non trivial & P.edges() c= the_Edges_of G2;
    hence thesis by A1, GLIB_001:169, GLIB_001:176;
  end;
  suppose A2: P is trivial;
    P.first() in the_Vertices_of G1;
    then P.first() in the_Vertices_of G2 by Th15;
    hence thesis by A1, A2, GLIB_001:168;
  end;
  suppose not V c= the_Vertices_of G2;
    then G1 == G2 by Def5;
    hence thesis by GLIB_001:179, GLIB_001:181;
  end;
  suppose A3: not P.edges() c= the_Edges_of G2 &
      V c= the_Vertices_of G2;
    then P.edges() \ the_Edges_of G2 <> {} by XBOOLE_1:37;
    then consider e being object such that
      A4: e in P.edges() \ the_Edges_of G2 by XBOOLE_0:def 1;
    consider E being set, f being one-to-one Function such that
      A5: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
        dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
        the_Target_of G1 = the_Target_of G2 +* f by A3, Def5;
    A6: not e in the_Edges_of G2 & e in the_Edges_of G1 by A4, XBOOLE_0:def 5;
    then e in dom f by A5, XBOOLE_0:def 3;
    then (the_Source_of G1).e = f.e & (the_Target_of G1).e = f.e
      by A5, FUNCT_4:13;
    then A7: e Joins f.e,f.e,G1 by A6, GLIB_000:def 13;
    e in P.edges() by A4, XBOOLE_0:def 5;
    then consider n being odd Element of NAT such that
      A8: n < len P & P.(n+1) = e by GLIB_001:100;
    P.(n+1) Joins P.n, P.(n+2), G1 by A8, GLIB_001:def 3;
    then A9: P.n = f.e & P.(n+2) = f.e by A7, A8, GLIB_000:15;
    n+0 < n+2 & n+2 <= len P by A8, CHORD:4, XREAL_1:8;
    then A10: n = 1 & n+2 = len P by A9, GLIB_001:def 28;
    A11: P = <*f.e,e,f.e*> by A8, A9, A10, FINSEQ_1:45;
    now
      reconsider e as object;
      reconsider v = f.e as object;
      take v,e;
      thus e Joins v,v,G1 by A7;
      hence P = G1.walkOf(v,e,v) by A11, GLIB_001:def 5;
    end;
    hence thesis;
  end;
end;

theorem
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  for W being Walk of G1 st W.edges() misses G1.loops() \ G2.loops()
  holds W is Walk of G2
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  let W be Walk of G1;
  A1: G2 is Subgraph of G1 by GLIB_006:57;
  assume A2: W.edges() misses G1.loops() \ G2.loops();
  per cases;
  suppose V c= the_Vertices_of G2;
    then consider E being set, f being one-to-one Function such that
      A3: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
        dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
        the_Target_of G1 = the_Target_of G2 +* f by Def5;
    now
      let e be object;
      assume A4: e in E;
      then A5: (the_Source_of G1).e = f.e & (the_Target_of G1).e = f.e
        by A3, FUNCT_4:13;
      A6: e in the_Edges_of G2 \/ E by A4, XBOOLE_0:def 3;
      then e Joins f.e,f.e,G1 by A3, A5, GLIB_000:def 13;
      then A7: e in G1.loops() by GLIB_009:def 2;
      not e in G2.loops() by A3, A4, A6, XBOOLE_0:5;
      hence e in G1.loops() \ G2.loops() by A7, XBOOLE_0:def 5;
    end;
    then W.edges() misses E by A2, XBOOLE_1:63, TARSKI:def 3;
    then A8: W.edges() c= the_Edges_of G2 by A3, XBOOLE_1:73;
    W.vertices() c= the_Vertices_of G1;
    then W.vertices() c= the_Vertices_of G2 by Th15;
    hence thesis by A1, A8, GLIB_001:170;
  end;
  suppose not V c= the_Vertices_of G2;
    then G1 == G2 by Def5;
    hence W is Walk of G2 by GLIB_001:179;
  end;
end;

registration
  let G be _Graph;
  cluster -> loopfull for addLoops of G;
  coherence
  proof
    let G1 be addLoops of G;
    let v be Vertex of G1;
    consider E being set, f being one-to-one Function such that
      A1: E misses the_Edges_of G & the_Edges_of G1 = the_Edges_of G \/ E &
        dom f = E & rng f = the_Vertices_of G &
        the_Source_of G1 = the_Source_of G +* f &
        the_Target_of G1 = the_Target_of G +* f by Def5;
    v in the_Vertices_of G1;
    then v in the_Vertices_of G by Th15;
    then consider e being object such that
      A2: e in dom f & f.e = v by A1, FUNCT_1:def 3;
    take e;
    A3: (the_Source_of G1).e = f.e & (the_Target_of G1).e = f.e
      by A1, A2, FUNCT_4:13;
    e in the_Edges_of G1 by A1, A2, XBOOLE_0:def 3;
    hence e Joins v,v,G1 by A2, A3, GLIB_000:def 13;
  end;
  let V be non empty Subset of the_Vertices_of G;
  cluster -> non loopless for addLoops of G, V;
  coherence
  proof
    let G1 be addLoops of G, V;
    consider E being set, f being one-to-one Function such that
      A4: E misses the_Edges_of G & the_Edges_of G1 = the_Edges_of G \/ E &
        dom f = E & rng f = V & the_Source_of G1 = the_Source_of G +* f &
        the_Target_of G1 = the_Target_of G +* f by Def5;
    now
      reconsider v = the Element of V as object;
      take v;
      consider e being object such that
        A5: e in dom f & f.e = v by A4, FUNCT_1:def 3;
      take e;
      A6: (the_Source_of G1).e = f.e & (the_Target_of G1).e = f.e
        by A4, A5, FUNCT_4:13;
      e in the_Edges_of G1 by A4, A5, XBOOLE_0:def 3;
      hence e DJoins v,v,G1 by A5, A6, GLIB_000:def 14;
    end;
    hence thesis by GLIB_000:136;
  end;
end;

theorem Th39:
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  holds G1 is _finite iff G2 is _finite
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  per cases;
  suppose A1: V c= the_Vertices_of G2;
    then consider E being set, f being one-to-one Function such that
      A2: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E &
        dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f &
        the_Target_of G1 = the_Target_of G2 +* f by Def5;
    thus G1 is _finite implies G2 is _finite;
    assume A3: G2 is _finite;
    then E is finite by A1, A2, CARD_1:59;
    then A4: the_Edges_of G1 is finite by A2, A3;
    the_Vertices_of G2 = the_Vertices_of G1 by Th15;
    hence thesis by A3, A4, GLIB_000:def 17;
  end;
  suppose not V c= the_Vertices_of G2;
    then G1 == G2 by Def5;
    hence thesis by GLIB_000:89;
  end;
end;

registration
  let G be _finite _Graph, V be set;
  cluster -> _finite for addLoops of G, V;
  coherence by Th39;
end;

registration
  let G be non _finite _Graph, V be set;
  cluster -> non _finite for addLoops of G, V;
  coherence;
end;

theorem Th40:
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  holds G1 is connected iff G2 is connected
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  hereby
    assume A1: G1 is connected;
    now
      let u,v be Vertex of G2;
      u is Vertex of G1 & v is Vertex of G1 by Th15;
      then consider W1 being Walk of G1 such that
        A2: W1 is_Walk_from u,v by A1, GLIB_002:def 1;
      set P1 = the Path of W1;
      per cases by Th37;
      suppose P1 is Path of G2;
        then reconsider P2 = P1 as Walk of G2;
        take P2;
        P1 is_Walk_from u,v by A2, GLIB_001:160;
        hence P2 is_Walk_from u,v by GLIB_001:19;
      end;
      suppose ex w,e being object st e Joins w,w,G1 & P1 = G1.walkOf(w,e,w);
        then consider w,e being object such that
          A3: e Joins w,w,G1 & P1 = G1.walkOf(w,e,w);
        A4: P1.first() = w & P1.last() = w by A3, GLIB_001:15;
        P1 is_Walk_from u,v by A2, GLIB_001:160;
        then A5: P1.first() = u & P1.last() = v by GLIB_001:def 23;
        reconsider W2 = G2.walkOf(u) as Walk of G2;
        take W2;
        thus W2 is_Walk_from u,v by A4, A5, GLIB_001:13;
      end;
    end;
    hence G2 is connected by GLIB_002:def 1;
  end;
  assume A6: G2 is connected;
  now
    let u,v be Vertex of G1;
    u is Vertex of G2 & v is Vertex of G2 by Th15;
    then consider W2 being Walk of G2 such that
      A7: W2 is_Walk_from u,v by A6, GLIB_002:def 1;
    G2 is Subgraph of G1 by GLIB_006:57;
    then reconsider W1 = W2 as Walk of G1 by GLIB_001:167;
    take W1;
    thus W1 is_Walk_from u,v by A7, GLIB_001:19;
  end;
  hence G1 is connected by GLIB_002:def 1;
end;

registration
  let G be connected _Graph, V be set;
  cluster -> connected for addLoops of G, V;
  coherence by Th40;
end;

registration
  let G be non connected _Graph, V be set;
  cluster -> non connected for addLoops of G, V;
  coherence by Th40;
end;

theorem Th41:
  for G2 being _Graph, V being set, G1 being addLoops of G2, V
  holds G1 is chordal iff G2 is chordal
proof
  let G2 be _Graph, V be set, G1 be addLoops of G2, V;
  hereby
    assume A1: G1 is chordal;
    now
      let P2 be Walk of G2;
      assume A2: P2.length() > 3 & P2 is Cycle-like;
      reconsider P1 = P2 as Walk of G1 by GLIB_006:75;
      A3: P1.length() = P2.length() & P1 is Cycle-like
        by A2, GLIB_006:76, GLIB_001:114;
      now
        consider m, n being odd Nat such that
          A4: m+2 < n & n <= len P1 & P1.m <> P1.n and
          A5: ex e being object st e Joins P1.m,P1.n,G1 and
          A6: for f being object st f in P1.edges()
            holds not f Joins P1.m,P1.n,G1
          by A1, A2, A3, CHORD:def 10, CHORD:def 11;
        take m,n;
        thus m+2 < n & n <= len P2 & P2.m <> P2.n by A4;
        thus ex e being object st e Joins P2.m,P2.n,G2
        proof
          consider e being object such that
            A7: e Joins P1.m,P1.n,G1 by A5;
          take e;
          thus e Joins P2.m,P2.n,G2 by A4, A7, Th17;
        end;
        thus for f being object st f in P2.edges()
          holds not f Joins P2.m,P2.n,G2
        proof
          let f be object;
          assume f in P2.edges();
          then f in P1.edges() by GLIB_001:110;
          then not f Joins P1.m,P1.n,G1 by A6;
          hence not f Joins P2.m,P2.n,G2 by A4, Th17;
        end;
      end;
      hence P2 is chordal by CHORD:def 10;
    end;
    hence G2 is chordal by CHORD:def 11;
  end;
  assume A8: G2 is chordal;
  now
    let P1 be Walk of G1;
    assume A9: P1.length() > 3 & P1 is Cycle-like;
    P1 is Walk of G2
    proof
      assume not P1 is Walk of G2;
      then consider v,e being object such that
        A10: e Joins v,v,G1 & P1 = G1.walkOf(v,e,v) by A9, Th37;
      2*1+1 = len P1 by A10, GLIB_001:14
        .= 2*P1.length()+1 by GLIB_001:112;
      hence contradiction by A9;
    end;
    then reconsider P2 = P1 as Walk of G2;
    A11: P1.length() = P2.length() & P2 is Cycle-like
      by A9, GLIB_006:76, GLIB_001:114;
    now
      consider m, n being odd Nat such that
        A12: m+2 < n & n <= len P2 & P2.m <> P2.n and
        A13: ex e being object st e Joins P2.m,P2.n,G2 and
        A14: for f being object st f in P2.edges()
          holds not f Joins P2.m,P2.n,G2
        by A8, A9, A11, CHORD:def 10, CHORD:def 11;
      take m,n;
      thus m+2 < n & n <= len P1 & P1.m <> P1.n by A12;
      thus ex e being object st e Joins P1.m,P1.n,G1
      proof
        consider e being object such that
          A15: e Joins P2.m,P2.n,G2 by A13;
        take e;
        thus e Joins P1.m,P1.n,G1 by A12, A15, Th17;
      end;
      thus for f being object st f in P1.edges()
        holds not f Joins P1.m,P1.n,G1
      proof
        let f be object;
        assume f in P1.edges();
        then f in P2.edges() by GLIB_001:110;
        then not f Joins P2.m,P2.n,G2 by A14;
        hence not f Joins P1.m,P1.n,G1 by A12, Th17;
      end;
    end;
    hence P1 is chordal by CHORD:def 10;
  end;
  hence thesis by CHORD:def 11;
end;

registration
  let G be chordal _Graph, V be set;
  cluster -> chordal for addLoops of G, V;
  coherence by Th41;
end;

:: non chordal clustering will be done later

registration
  let G be non edgeless _Graph, V be set;
  cluster -> non edgeless for addLoops of G, V;
  coherence;
end;

registration
  let G be loopfull _Graph, V be set;
  cluster -> loopfull for addLoops of G, V;
  coherence
  proof
    let G1 be addLoops of G, V;
    the_Vertices_of G1 = the_Vertices_of G by Th15;
    hence thesis by Th5;
  end;
end;

registration
  let G be simple _Graph, V be set;
  cluster -> non-multi for addLoops of G, V;
  coherence
  proof
    let G2 be addLoops of G, V;
    per cases;
    suppose A1: V c= the_Vertices_of G;
      now
        let e1,e2,v1,v2 be object;
        assume A2: e1 Joins v1,v2,G2 & e2 Joins v1,v2,G2;
        per cases;
        suppose A3: v1 = v2;
          consider E being set, f being one-to-one Function such that
            E misses the_Edges_of G and
            A4: the_Edges_of G2 = the_Edges_of G \/ E and
            A5: dom f = E & rng f = V and
            A6: the_Source_of G2 = the_Source_of G +* f and
            the_Target_of G2 = the_Target_of G +* f by A1, Def5;
          A7: not e1 in the_Edges_of G
          proof
            assume A8: e1 in the_Edges_of G;
            then e1 Joins v1,v1,G by A2, A3, GLIB_006:72;
            then (the_Source_of G).e1 = v1 & (the_Target_of G).e1 = v1
              by GLIB_000:def 13;
            hence contradiction by A8, GLIB_000:def 18;
          end;
          A9: not e2 in the_Edges_of G
          proof
            assume A10: e2 in the_Edges_of G;
            then e2 Joins v1,v1,G by A2, A3, GLIB_006:72;
            then (the_Source_of G).e2 = v1 & (the_Target_of G).e2 = v1
              by GLIB_000:def 13;
            hence contradiction by A10, GLIB_000:def 18;
          end;
          e1 in the_Edges_of G2 by A2, GLIB_000:def 13;
          then A11: e1 in E by A4, A7, XBOOLE_0:def 3;
          e2 in the_Edges_of G2 by A2, GLIB_000:def 13;
          then A12: e2 in E by A4, A9, XBOOLE_0:def 3;
          f.e1 = (the_Source_of G2).e1 by A5, A6, A11, FUNCT_4:13
            .= v1 by A2, A3, GLIB_000:def 13
            .= (the_Source_of G2).e2 by A2, A3, GLIB_000:def 13
            .= f.e2 by A5, A6, A12, FUNCT_4:13;
          hence e1 = e2 by A5, A11, A12, FUNCT_1:def 4;
        end;
        suppose v1 <> v2;
          then e1 Joins v1,v2,G & e2 Joins v1,v2,G by A2, Th17;
          hence e1 = e2 by GLIB_000:def 20;
        end;
      end;
      hence thesis by GLIB_000:def 20;
    end;
    suppose not V c= the_Vertices_of G;
      then G == G2 by Def5;
      hence thesis by GLIB_000:89;
    end;
  end;
end;

registration
  let G be Dsimple _Graph, V be set;
  cluster -> non-Dmulti for addLoops of G, V;
  coherence
  proof
    let G2 be addLoops of G, V;
    per cases;
    suppose A1: V c= the_Vertices_of G;
      now
        let e1,e2,v1,v2 be object;
        assume A2: e1 DJoins v1,v2,G2 & e2 DJoins v1,v2,G2;
        per cases;
        suppose A3: v1 = v2;
          consider E being set, f being one-to-one Function such that
            E misses the_Edges_of G and
            A4: the_Edges_of G2 = the_Edges_of G \/ E and
            A5: dom f = E & rng f = V and
            A6: the_Source_of G2 = the_Source_of G +* f and
            the_Target_of G2 = the_Target_of G +* f by A1, Def5;
          A7: not e1 in the_Edges_of G
          proof
            assume A8: e1 in the_Edges_of G;
            then e1 DJoins v1,v1,G by A2, A3, GLIB_006:71;
            then (the_Source_of G).e1 = v1 & (the_Target_of G).e1 = v1
              by GLIB_000:def 14;
            hence contradiction by A8, GLIB_000:def 18;
          end;
          A9: not e2 in the_Edges_of G
          proof
            assume A10: e2 in the_Edges_of G;
            then e2 DJoins v1,v1,G by A2, A3, GLIB_006:71;
            then (the_Source_of G).e2 = v1 & (the_Target_of G).e2 = v1
              by GLIB_000:def 14;
            hence contradiction by A10, GLIB_000:def 18;
          end;
          e1 in the_Edges_of G2 by A2, GLIB_000:def 14;
          then A11: e1 in E by A4, A7, XBOOLE_0:def 3;
          e2 in the_Edges_of G2 by A2, GLIB_000:def 14;
          then A12: e2 in E by A4, A9, XBOOLE_0:def 3;
          f.e1 = (the_Source_of G2).e1 by A5, A6, A11, FUNCT_4:13
            .= v1 by A2, GLIB_000:def 14
            .= (the_Source_of G2).e2 by A2, GLIB_000:def 14
            .= f.e2 by A5, A6, A12, FUNCT_4:13;
          hence e1 = e2 by A5, A11, A12, FUNCT_1:def 4;
        end;
        suppose v1 <> v2;
          then e1 DJoins v1,v2,G & e2 DJoins v1,v2,G by A2, Th16;
          hence e1 = e2 by GLIB_000:def 21;
        end;
      end;
      hence thesis by GLIB_000:def 21;
    end;
    suppose not V c= the_Vertices_of G;
      then G == G2 by Def5;
      hence thesis by GLIB_000:89;
    end;
  end;
end;

theorem Th42:
  for G2 being _Graph, V being Subset of the_Vertices_of G2
  for G1 being addLoops of G2, V, v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & v1 in V ex e being object
    st e DJoins v1,v1,G1 & not e in the_Edges_of G2 &
      v1.edgesIn() = v2.edgesIn()\/{e} & v1.edgesOut() = v2.edgesOut()\/{e} &
      v1.edgesInOut() = v2.edgesInOut() \/ {e}
proof
  let G2 be _Graph, V be Subset of the_Vertices_of G2;
  let G1 be addLoops of G2, V, v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & v1 in V;
  consider E being set, f being one-to-one Function such that
    A2: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E and
    A3: dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f and
    A4: the_Target_of G1 = the_Target_of G2 +* f by Def5;
  consider e being object such that
    A5: e in dom f & f.e = v1 by A1, A3, FUNCT_1:def 3;
  take e;
  A6: e in the_Edges_of G1 by A2, A3, A5, XBOOLE_0:def 3;
  A7: (the_Source_of G1).e = v1 by A3, A5, FUNCT_4:13;
  (the_Target_of G1).e = v1 by A4, A5, FUNCT_4:13;
  hence A8: e DJoins v1,v1,G1 by A6, A7, GLIB_000:def 14;
  thus not e in the_Edges_of G2
  proof
    assume e in the_Edges_of G2;
    then e in E /\ the_Edges_of G2 by A3, A5, XBOOLE_0:def 4;
    hence contradiction by A2, XBOOLE_0:def 7;
  end;
  now
    let x be object;
    hereby
      assume x in v1.edgesIn();
      then consider w being set such that
        A9: x DJoins w,v1,G1 by GLIB_000:57;
      per cases by A9, GLIB_006:71;
      suppose A10: x DJoins w,v1,G2;
        x is set by TARSKI:1;
        then x in v2.edgesIn() by A1, A10, GLIB_000:57;
        hence x in v2.edgesIn() \/ {e} by XBOOLE_0:def 3;
      end;
      suppose A11: not x in the_Edges_of G2;
        x in the_Edges_of G1 by A9, GLIB_000:def 14;
        then A12: x in E by A2, A11, XBOOLE_0:def 3;
        f.x = (the_Target_of G1).x by A3, A4, A12, FUNCT_4:13
          .= v1 by A9, GLIB_000:def 14;
        then x = e by A3, A5, A12, FUNCT_1:def 4;
        then x in {e} by TARSKI:def 1;
        hence x in v2.edgesIn() \/ {e} by XBOOLE_0:def 3;
      end;
    end;
    assume x in v2.edgesIn() \/ {e};
    then per cases by XBOOLE_0:def 3;
    suppose A13: x in v2.edgesIn();
      G2 is Subgraph of G1 by GLIB_006:57;
      then v2.edgesIn() c= v1.edgesIn() by A1, GLIB_000:78;
      hence x in v1.edgesIn() by A13;
    end;
    suppose x in {e};
      then x = e & e is set by TARSKI:def 1;
      hence x in v1.edgesIn() by A8, GLIB_000:57;
    end;
  end;
  hence A14: v1.edgesIn() = v2.edgesIn() \/ {e} by TARSKI:2;
  now
    let x be object;
    hereby
      assume x in v1.edgesOut();
      then consider w being set such that
        A15: x DJoins v1,w,G1 by GLIB_000:59;
      per cases by A15, GLIB_006:71;
      suppose A16: x DJoins v1,w,G2;
        x is set by TARSKI:1;
        then x in v2.edgesOut() by A1, A16, GLIB_000:59;
        hence x in v2.edgesOut() \/ {e} by XBOOLE_0:def 3;
      end;
      suppose A17: not x in the_Edges_of G2;
        x in the_Edges_of G1 by A15, GLIB_000:def 14;
        then A18: x in E by A2, A17, XBOOLE_0:def 3;
        f.x = (the_Source_of G1).x by A3, A18, FUNCT_4:13
          .= v1 by A15, GLIB_000:def 14;
        then x = e by A3, A5, A18, FUNCT_1:def 4;
        then x in {e} by TARSKI:def 1;
        hence x in v2.edgesOut() \/ {e} by XBOOLE_0:def 3;
      end;
    end;
    assume x in v2.edgesOut() \/ {e};
    then per cases by XBOOLE_0:def 3;
    suppose A19: x in v2.edgesOut();
      G2 is Subgraph of G1 by GLIB_006:57;
      then v2.edgesOut() c= v1.edgesOut() by A1, GLIB_000:78;
      hence x in v1.edgesOut() by A19;
    end;
    suppose x in {e};
      then x = e & e is set by TARSKI:def 1;
      hence x in v1.edgesOut() by A8, GLIB_000:59;
    end;
  end;
  hence A20: v1.edgesOut() = v2.edgesOut() \/ {e} by TARSKI:2;
  thus v1.edgesInOut() = v2.edgesInOut() \/ {e} by A14, A20, XBOOLE_1:5;
end;

theorem
  for G2 being _Graph, V being Subset of the_Vertices_of G2
  for G1 being addLoops of G2, V, v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & v1 in V holds
    v1.inDegree() = v2.inDegree() +` 1 & v1.outDegree() = v2.outDegree() +` 1 &
    v1.degree() = v2.degree() +` 2
proof
  let G2 be _Graph, V be Subset of the_Vertices_of G2;
  let G1 be addLoops of G2, V, v1 be Vertex of G1, v2 be Vertex of G2;
  assume v1 = v2 & v1 in V;
  then consider e being object such that
    A1: e DJoins v1,v1,G1 & not e in the_Edges_of G2 and
    A2: v1.edgesIn() = v2.edgesIn() \/ {e} and
    A3: v1.edgesOut() = v2.edgesOut() \/ {e} and
    v1.edgesInOut() = v2.edgesInOut() \/ {e} by Th42;
  not e in v2.edgesIn() by A1;
  hence A4: v1.inDegree() = v2.inDegree() +` card {e}
      by A2, CARD_2:35, ZFMISC_1:50
    .= v2.inDegree() +` 1 by CARD_1:30;
  not e in v2.edgesOut() by A1;
  hence v1.outDegree() = v2.outDegree() +` card {e}
      by A3, CARD_2:35, ZFMISC_1:50
    .= v2.outDegree() +` 1 by CARD_1:30;
  hence v1.degree()
     = v2.inDegree() +` (1 +` (v2.outDegree() +` 1)) by A4, CARD_2:19
    .= v2.inDegree() +` (v2.outDegree() +` (1 +` 1)) by CARD_2:19
    .= v2.degree() +` 2 by CARD_2:19;
end;

theorem
  for G2 being _Graph, V being Subset of the_Vertices_of G2
  for G1 being addLoops of G2, V, v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & not v1 in V holds
    v1.edgesIn() = v2.edgesIn() & v1.inDegree() = v2.inDegree() &
    v1.edgesOut() = v2.edgesOut() & v1.outDegree() = v2.outDegree() &
    v1.edgesInOut() = v2.edgesInOut() & v1.degree() = v2.degree()
proof
  let G2 be _Graph, V be Subset of the_Vertices_of G2;
  let G1 be addLoops of G2, V, v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & not v1 in V;
  consider E being set, f being one-to-one Function such that
    A2: E misses the_Edges_of G2 & the_Edges_of G1 = the_Edges_of G2 \/ E and
    A3: dom f = E & rng f = V & the_Source_of G1 = the_Source_of G2 +* f and
    A4: the_Target_of G1 = the_Target_of G2 +* f by Def5;
  A5: G2 is Subgraph of G1 by GLIB_006:57;
  then A6: v2.edgesIn() c= v1.edgesIn() by A1, GLIB_000:78;
  now
    let e be object;
    assume e in v1.edgesIn();
    then consider x being set such that
      A7: e DJoins x,v1,G1 by GLIB_000:57;
    e in the_Edges_of G2
    proof
      assume A8: not e in the_Edges_of G2;
      e in the_Edges_of G1 by A7, GLIB_000:def 14;
      then A9: e in E by A2, A8, XBOOLE_0:def 3;
      v1 = (the_Target_of G1).e by A7, GLIB_000:def 14
        .= f.e by A3, A4, A9, FUNCT_4:13;
      hence contradiction by A1, A3, A9, FUNCT_1:3;
    end;
    hence e in v2.edgesIn() by A1, A7, GLIB_006:71, GLIB_000:57;
  end;
  then v1.edgesIn() c= v2.edgesIn() by TARSKI:def 3;
  hence A10: v1.edgesIn() = v2.edgesIn() by A6, XBOOLE_0:def 10;
  hence v1.inDegree() = v2.inDegree();
  A11: v2.edgesOut() c= v1.edgesOut() by A1, A5, GLIB_000:78;
  now
    let e be object;
    assume e in v1.edgesOut();
    then consider x being set such that
      A12: e DJoins v1,x,G1 by GLIB_000:59;
    e in the_Edges_of G2
    proof
      assume A13: not e in the_Edges_of G2;
      e in the_Edges_of G1 by A12, GLIB_000:def 14;
      then A14: e in E by A2, A13, XBOOLE_0:def 3;
      v1 = (the_Source_of G1).e by A12, GLIB_000:def 14
        .= f.e by A3, A14, FUNCT_4:13;
      hence contradiction by A1, A3, A14, FUNCT_1:3;
    end;
    hence e in v2.edgesOut() by A1, A12, GLIB_006:71, GLIB_000:59;
  end;
  then v1.edgesOut() c= v2.edgesOut() by TARSKI:def 3;
  hence A15: v1.edgesOut() = v2.edgesOut() by A11, XBOOLE_0:def 10;
  hence v1.outDegree() = v2.outDegree();
  thus thesis by A10, A15;
end;

begin :: Directed Graph Complement with Loops

definition
  let G be _Graph;
  mode DLGraphComplement of G -> non-Dmulti _Graph means
  :Def6:
  the_Vertices_of it = the_Vertices_of G &
  the_Edges_of it misses the_Edges_of G &
  for v,w being Vertex of G holds
    (ex e1 being object st e1 DJoins v,w,G) iff
    (not ex e2 being object st e2 DJoins v,w,it);
  existence
  proof
    set E = {[the_Edges_of G,[v,w]] where v is Vertex of G, w is Vertex of G
      : not ex e being object st e DJoins v,w,G};
    deffunc S(object) = $1`2`1;
    consider s being Function such that
      A1: dom s = E & for x being object st x in E holds s.x = S(x)
      from FUNCT_1:sch 3;
    now
      let y be object;
      assume y in rng s;
      then consider x being object such that
        A2: x in dom s & s.x = y by FUNCT_1:def 3;
      consider v, w being Vertex of G such that
        A3: x = [the_Edges_of G,[v,w]] and
        not ex e being object st e DJoins v,w,G by A1, A2;
      y = [the_Edges_of G,[v,w]]`2`1 by A1, A2, A3
        .= v;
      hence y in the_Vertices_of G;
    end;
    then reconsider s as Function of E, the_Vertices_of G
      by A1, TARSKI:def 3, FUNCT_2:2;
    deffunc T(object) = $1`2`2;
    consider t being Function such that
      A4: dom t = E & for x being object st x in E holds t.x = T(x)
      from FUNCT_1:sch 3;
    now
      let y be object;
      assume y in rng t;
      then consider x being object such that
        A5: x in dom t & t.x = y by FUNCT_1:def 3;
      consider v, w being Vertex of G such that
        A6: x = [the_Edges_of G,[v,w]] and
        not ex e being object st e DJoins v,w,G by A4, A5;
      y = [the_Edges_of G,[v,w]]`2`2 by A4, A5, A6
        .= w;
      hence y in the_Vertices_of G;
    end;
    then reconsider t as Function of E, the_Vertices_of G
      by A4, TARSKI:def 3, FUNCT_2:2;
    set H = createGraph(the_Vertices_of G,E,s,t);
    now
      let e1,e2,v1,v2 be object;
      assume A7: e1 DJoins v1,v2,H & e2 DJoins v1,v2,H;
      then e1 in the_Edges_of H by GLIB_000:def 14;
      then A8: e1 in E;
      then consider a,b being Vertex of G such that
        A9: e1 = [the_Edges_of G,[a,b]] and
        not ex e being object st e DJoins a,b,G;
      A10: v1 = (the_Source_of H).e1 by A7, GLIB_000:def 14
        .= s.e1
        .= [the_Edges_of G,[a,b]]`2`1 by A1, A8, A9
        .= a;
      A11: v2 = (the_Target_of H).e1 by A7, GLIB_000:def 14
        .= t.e1
        .= [the_Edges_of G,[a,b]]`2`2 by A4, A8, A9
        .= b;
      e2 in the_Edges_of H by A7, GLIB_000:def 14;
      then A12: e2 in E;
      then consider c,d being Vertex of G such that
        A13: e2 = [the_Edges_of G,[c,d]] and
        not ex e being object st e DJoins c,d,G;
      A14: v1 = (the_Source_of H).e2 by A7, GLIB_000:def 14
        .= s.e2
        .= [the_Edges_of G,[c,d]]`2`1 by A1, A12, A13
        .= c;
      v2 = (the_Target_of H).e2 by A7, GLIB_000:def 14
        .= t.e2
        .= [the_Edges_of G,[c,d]]`2`2 by A4, A12, A13
        .= d;
      hence e1 = e2 by A9, A10, A11, A13, A14;
    end;
    then reconsider H as non-Dmulti _Graph by GLIB_000:def 21;
    take H;
    thus the_Vertices_of H = the_Vertices_of G;
    E /\ the_Edges_of G = {}
    proof
      assume E /\ the_Edges_of G <> {};
      then consider x being object such that
        A15: x in E /\ the_Edges_of G by XBOOLE_0:def 1;
      reconsider x as set by TARSKI:1;
      x in E by A15, XBOOLE_0:def 4;
      then consider v,w being Vertex of G such that
        A16: x = [the_Edges_of G,[v,w]] and
        not ex e being object st e DJoins v,w,G;
      A17: x in the_Edges_of G by A15, XBOOLE_0:def 4;
      A18: the_Edges_of G in {the_Edges_of G} by TARSKI:def 1;
      x = {{the_Edges_of G,[v,w]},{the_Edges_of G}} by A16, TARSKI:def 5;
      then {the_Edges_of G} in x by TARSKI:def 2;
      hence contradiction by A17, A18, XREGULAR:7;
    end;
    then the_Edges_of H /\ the_Edges_of G = {};
    hence the_Edges_of H misses the_Edges_of G by XBOOLE_0:def 7;
    let v,w be Vertex of G;
    hereby
      given e1 being object such that
        A19: e1 DJoins v,w,G;
      given e2 being object such that
        A20: e2 DJoins v,w,H;
      e2 in the_Edges_of H by A20, GLIB_000:def 14;
      then A21: e2 in E;
      then consider a,b being Vertex of G such that
        A22: e2 = [the_Edges_of G,[a,b]] and
        A23: not ex e being object st e DJoins a,b,G;
      A24: v = (the_Source_of H).e2 by A20, GLIB_000:def 14
        .= s.e2
        .= [the_Edges_of G,[a,b]]`2`1 by A1, A21, A22
        .= a;
      w = (the_Target_of H).e2 by A20, GLIB_000:def 14
        .= t.e2
        .= [the_Edges_of G,[a,b]]`2`2 by A4, A21, A22
        .= b;
      hence contradiction by A19, A23, A24;
    end;
    set e2 = [the_Edges_of G,[v,w]];
    now
      assume not ex e1 being object st e1 DJoins v,w,G;
      then A25: e2 in E;
      then A26: e2 in the_Edges_of H;
      A27: v = [the_Edges_of G,[v,w]]`2`1
        .= s.e2 by A1, A25
        .= (the_Source_of H).e2;
      w = [the_Edges_of G,[v,w]]`2`2
        .= t.e2 by A4, A25
        .= (the_Target_of H).e2;
      hence e2 DJoins v,w,H by A26, A27, GLIB_000:def 14;
    end;
    hence thesis;
  end;
end;

theorem Th45:
  for G1, G2, G3 being _Graph, G4 being DLGraphComplement of G1
  st G1 == G2 & G3 == G4 holds G3 is DLGraphComplement of G2
proof
  let G1, G2, G3 be _Graph, G4 be DLGraphComplement of G1;
  assume A1: G1 == G2 & G3 == G4;
  then the_Vertices_of G4 = the_Vertices_of G3 &
    the_Edges_of G4 = the_Edges_of G3 by GLIB_000:def 34;
  then the_Vertices_of G1 = the_Vertices_of G3 &
    the_Edges_of G3 misses the_Edges_of G1 by Def6;
  then A2: the_Vertices_of G3 = the_Vertices_of G2 &
    the_Edges_of G3 misses the_Edges_of G2 by A1, GLIB_000:def 34;
  A3: G3 is non-Dmulti by A1, GLIB_000:89;
  now
    let v,w be Vertex of G2;
    A4: v is Vertex of G1 & w is Vertex of G1 by A1, GLIB_000:def 34;
    hereby
      given e1 being object such that
        A5: e1 DJoins v,w,G2;
      A6: e1 DJoins v,w,G1 by A1, A5, GLIB_000:88;
      thus not ex e2 being object st e2 DJoins v,w,G3
      proof
        given e2 being object such that
          A7: e2 DJoins v,w,G3;
        e2 DJoins v,w,G4 by A1, A7, GLIB_000:88;
        hence contradiction by A4, A6, Def6;
      end;
    end;
    assume A8: not ex e2 being object st e2 DJoins v,w,G3;
    not ex e2 being object st e2 DJoins v,w,G4
    proof
      given e2 being object such that
        A9: e2 DJoins v,w,G4;
      e2 DJoins v,w,G3 by A1, A9, GLIB_000:88;
      hence contradiction by A8;
    end;
    then consider e1 being object such that
      A10: e1 DJoins v,w,G1 by A4, Def6;
    take e1;
    thus e1 DJoins v,w,G2 by A1, A10, GLIB_000:88;
  end;
  hence thesis by A2, A3, Def6;
end;

registration
  let G be _Graph;
  cluster plain for DLGraphComplement of G;
  existence
  proof
    set G1 = the DLGraphComplement of G;
    set G2 = G1 | _GraphSelectors;
    G1 == G1 & G1 == G2 by GLIB_000:128;
    then reconsider G2 as DLGraphComplement of G by Th45;
    take G2;
    thus thesis;
  end;
end;

theorem Th46:
  for G1 being _Graph, G2 being DLGraphComplement of G1, e1,e2,v,w being object
  holds e1 DJoins v,w,G1 implies not e2 DJoins v,w,G2
proof
  let G1 be _Graph, G2 be DLGraphComplement of G1, e1,e2,v,w be object;
  assume A1: e1 DJoins v,w,G1;
  then e1 Joins v,w,G1 by GLIB_000:16;
  then v in the_Vertices_of G1 & w in the_Vertices_of G1 by GLIB_000:13;
  hence thesis by A1, Def6;
end;

theorem Th47:
  for G1 being _Graph, G2 being removeDParallelEdges of G1
  for G3 being DLGraphComplement of G1
  holds G3 is DLGraphComplement of G2
proof
  let G1 be _Graph, G2 be removeDParallelEdges of G1;
  let G3 be DLGraphComplement of G1;
  consider E being RepDEdgeSelection of G1 such that
    A1: G2 is inducedSubgraph of G1, the_Vertices_of G1, E by GLIB_009:def 8;
  the_Vertices_of G1 c= the_Vertices_of G1 &
    the_Edges_of G1 = G1.edgesBetween(the_Vertices_of G1) by GLIB_000:34;
  then A2: the_Vertices_of G2 = the_Vertices_of G1 & the_Edges_of G2 = E
    by A1, GLIB_000:def 37;
  then A3: the_Vertices_of G3 = the_Vertices_of G2 by Def6;
  the_Edges_of G3 misses the_Edges_of G1 by Def6;
  then A4: the_Edges_of G3 misses the_Edges_of G2 by XBOOLE_1:63;
  now
    let v,w be Vertex of G2;
    A5: v is Vertex of G1 & w is Vertex of G1 by GLIB_000:def 33;
    reconsider v1=v, w1=w as Vertex of G1 by GLIB_000:def 33;
    hereby
      given e2 being object such that
        A6: e2 DJoins v,w,G2;
      A7: e2 DJoins v,w,G1 by A6, GLIB_000:72;
      given e3 being object such that
        A8: e3 DJoins v,w,G3;
      thus contradiction by A7, A8, Th46;
    end;
    assume not ex e3 being object st e3 DJoins v,w,G3;
    then consider e1 being object such that
      A9: e1 DJoins v,w,G1 by A5, Def6;
    consider e2 being object such that
      A10: e2 DJoins v,w,G1 & e2 in E and
      for e9 being object st e9 DJoins v,w,G1 & e9 in E holds e9 = e2
      by A9, GLIB_009:def 6;
    take e2;
    thus e2 DJoins v,w,G2 by A2, A10, GLIB_000:73;
  end;
  hence thesis by A3, A4, Def6;
end;

theorem Th48:
  for G1, G2 being _Graph
  for G3 being removeDParallelEdges of G1, G4 being removeDParallelEdges of G2
  for G5 being DLGraphComplement of G1, G6 being DLGraphComplement of G2
  st G4 is G3-Disomorphic holds G6 is G5-Disomorphic
proof
  let G1, G2 be _Graph;
  let G3 be removeDParallelEdges of G1, G4 be removeDParallelEdges of G2;
  let G5 be DLGraphComplement of G1, G6 be DLGraphComplement of G2;
  A1: G5 is DLGraphComplement of G3 & G6 is DLGraphComplement of G4 by Th47;
  assume G4 is G3-Disomorphic;
  then consider f being directed PVertexMapping of G3, G4 such that
    A2: f is Disomorphism by GLIB_011:50;
  A3: the_Vertices_of G3 = the_Vertices_of G5 &
    the_Vertices_of G4 = the_Vertices_of G6 by A1, Def6;
  then reconsider g = f as PartFunc of the_Vertices_of G5, the_Vertices_of G6;
  now
    let v,w,e be object;
    assume A4: v in dom g & w in dom g & e DJoins v,w,G5;
    then A5: not ex e3 being object st e3 DJoins v,w,G3 by A1, A3, Def6;
    thus ex e6 being object st e6 DJoins g.v,g.w,G6
    proof
      assume A6: not ex e6 being object st e6 DJoins g.v,g.w,G6;
      g.v in rng f & g.w in rng f by A4, FUNCT_1:3;
      then consider e4 being object such that
        A7: e4 DJoins g.v,g.w,G4 by A1, A6, Def6;
      consider e3 being object such that
        A8: e3 DJoins v,w,G3 by A2, A4, A7, GLIB_011:def 4;
      thus contradiction by A5, A8;
    end;
  end;
  then reconsider g as directed PVertexMapping of G5, G6 by GLIB_011:4;
  now
    let v,w,e6 be object;
    assume A9: v in dom g & w in dom g & e6 DJoins g.v,g.w,G6;
    then g.v in rng f & g.w in rng f by FUNCT_1:3;
    then A10: not ex e4 being object st e4 DJoins g.v,g.w,G4 by A1, A9, Def6;
    thus ex e5 being object st e5 DJoins v,w,G5
    proof
      assume not ex e5 being object st e5 DJoins v,w,G5;
      then consider e3 being object such that
        A11: e3 DJoins v,w,G3 by A1, A3, A9, Def6;
      consider e4 being object such that
        A12: e4 DJoins f.v,f.w,G4 by A9, A11, GLIB_011:def 2;
      thus contradiction by A10, A12;
    end;
  end;
  then g is Dcontinuous by GLIB_011:def 4;
  hence thesis by A2, A3, GLIB_011:50;
end;

theorem Th49:
  for G1 being _Graph, G2 being G1-Disomorphic _Graph
  for G3 being DLGraphComplement of G1, G4 being DLGraphComplement of G2
  holds G4 is G3-Disomorphic
proof
  let G1 be _Graph, G2 be G1-Disomorphic _Graph;
  let G3 be DLGraphComplement of G1, G4 be DLGraphComplement of G2;
  set G5 = the removeDParallelEdges of G1;
  set G6 = the removeDParallelEdges of G2;
  G6 is G5-Disomorphic by GLIB_010:170;
  hence thesis by Th48;
end;

theorem Th50:
  for G1 being _Graph, G2, G3 being DLGraphComplement of G1
  holds G3 is G2-Disomorphic
proof
  let G1 be _Graph, G2, G3 be DLGraphComplement of G1;
  G1 is G1-Disomorphic by GLIB_010:53;
  hence thesis by Th49;
end;

theorem
  for G1 being _Graph, G2 being reverseEdgeDirections of G1
  for G3 being DLGraphComplement of G1, G4 being reverseEdgeDirections of G3
  holds G4 is DLGraphComplement of G2
proof
  let G1 be _Graph, G2 be reverseEdgeDirections of G1;
  let G3 be DLGraphComplement of G1, G4 be reverseEdgeDirections of G3;
  A1: the_Vertices_of G4 = the_Vertices_of G3 by GLIB_007:4
    .= the_Vertices_of G1 by Def6
    .= the_Vertices_of G2 by GLIB_007:4;
  the_Edges_of G3 misses the_Edges_of G1 by Def6;
  then the_Edges_of G4 misses the_Edges_of G1 by GLIB_007:4;
  then A2: the_Edges_of G4 misses the_Edges_of G2 by GLIB_007:4;
  now
    let v,w be Vertex of G2;
    A3: v is Vertex of G1 & w is Vertex of G1 by GLIB_007:4;
    hereby
      given e2 being object such that
        A4: e2 DJoins v,w,G2;
      e2 in the_Edges_of G2 by A4, GLIB_000:def 14;
      then e2 in the_Edges_of G1 by GLIB_007:4;
      then A5: e2 DJoins w,v,G1 by A4, GLIB_007:7;
      given e4 being object such that
        A6: e4 DJoins v,w,G4;
      e4 in the_Edges_of G4 by A6, GLIB_000:def 14;
      then e4 in the_Edges_of G3 by GLIB_007:4;
      then e4 DJoins w,v,G3 by A6, GLIB_007:7;
      hence contradiction by A5, Th46;
    end;
    assume A7: not ex e4 being object st e4 DJoins v,w,G4;
    not ex e3 being object st e3 DJoins w,v,G3
    proof
      given e3 being object such that
        A8: e3 DJoins w,v,G3;
      e3 in the_Edges_of G3 by A8, GLIB_000:def 14;
      then e3 DJoins v,w,G4 by A8, GLIB_007:7;
      hence contradiction by A7;
    end;
    then consider e1 being object such that
      A9: e1 DJoins w,v,G1 by A3, Def6;
    take e1;
    e1 in the_Edges_of G1 by A9, GLIB_000:def 14;
    hence e1 DJoins v,w,G2 by A9, GLIB_007:7;
  end;
  hence thesis by A1, A2, Def6;
end;

theorem Th52:
  for G1 being _Graph, V being non empty Subset of the_Vertices_of G1
  for G2 being inducedSubgraph of G1, V
  for G3 being DLGraphComplement of G1, G4 being inducedSubgraph of G3, V
  holds G4 is DLGraphComplement of G2
proof
  let G1 be _Graph, V be non empty Subset of the_Vertices_of G1;
  let G2 be inducedSubgraph of G1, V;
  let G3 be DLGraphComplement of G1, G4 be inducedSubgraph of G3, V;
  A1: V is non empty Subset of the_Vertices_of G3 by Def6;
  then A2: the_Vertices_of G4 = V by GLIB_000:def 37
    .= the_Vertices_of G2 by GLIB_000:def 37;
  A3: the_Edges_of G4 misses the_Edges_of G2
  proof
    assume the_Edges_of G4 meets the_Edges_of G2;
    then consider e being object such that
      A4: e in the_Edges_of G4 & e in the_Edges_of G2 by XBOOLE_0:3;
    A5: e in the_Edges_of G1 \/ the_Edges_of G3 by A4, XBOOLE_0:def 3;
    the_Edges_of G3 misses the_Edges_of G1 by Def6;
    hence contradiction by A4, A5, XBOOLE_0:5;
  end;
  now
    let v,w be Vertex of G2;
    hereby
      given e2 being object such that
        A6: e2 DJoins v,w,G2;
      A7: e2 DJoins v,w,G1 by A6, GLIB_000:72;
      given e4 being object such that
        A8: e4 DJoins v,w,G4;
      e4 DJoins v,w,G3 by A8, GLIB_000:72;
      hence contradiction by A7, Th46;
    end;
    assume A9: not ex e4 being object st e4 DJoins v,w,G4;
    ex e1 being object st e1 DJoins v,w,G1
    proof
      assume A10: not ex e1 being object st e1 DJoins v,w,G1;
      the_Vertices_of G2 c= the_Vertices_of G1;
      then v is Vertex of G1 & w is Vertex of G1 by TARSKI:def 3;
      then consider e3 being object such that
        A11: e3 DJoins v,w,G3 by A10, Def6;
      A12: e3 Joins v,w,G3 by A11, GLIB_000:16;
      the_Vertices_of G2 = V by GLIB_000:def 37;
      then e3 in G3.edgesBetween(V) by A12, GLIB_000:32;
      then e3 in the_Edges_of G4 & e3 is set by A1, GLIB_000:def 37;
      then e3 DJoins v,w,G4 by A11, GLIB_000:73;
      hence contradiction by A9;
    end;
    then consider e1 being object such that
      A13: e1 DJoins v,w,G1;
    take e1;
    A14: e1 Joins v,w,G1 by A13, GLIB_000:16;
    the_Vertices_of G2 = V by GLIB_000:def 37;
    then e1 in G1.edgesBetween(V) by A14, GLIB_000:32;
    then e1 in the_Edges_of G2 & e1 is set by GLIB_000:def 37;
    hence e1 DJoins v,w,G2 by A13, GLIB_000:73;
  end;
  hence thesis by A2, A3, Def6;
end;

theorem
  for G1 being _Graph, V being proper Subset of the_Vertices_of G1
  for G2 being removeVertices of G1, V
  for G3 being DLGraphComplement of G1, G4 being removeVertices of G3, V
  holds G4 is DLGraphComplement of G2
proof
  let G1 be _Graph, V be proper Subset of the_Vertices_of G1;
  let G2 be removeVertices of G1, V;
  let G3 be DLGraphComplement of G1, G4 be removeVertices of G3, V;
  the_Vertices_of G1 \ V is non empty Subset of the_Vertices_of G1 &
    the_Vertices_of G1 \ V = the_Vertices_of G3 \ V
    by Def6, XBOOLE_1:105, GLIBPRE0:6;
  hence thesis by Th52;
end;

:: involutiveness of graph complement (DLC case)
theorem
  for G1 being non-Dmulti _Graph, G2 being DLGraphComplement of G1
  holds G1 is DLGraphComplement of G2
proof
  let G1 be non-Dmulti _Graph, G2 be DLGraphComplement of G1;
  A1: the_Vertices_of G1 = the_Vertices_of G2 &
    the_Edges_of G1 misses the_Edges_of G2 by Def6;
  now
    let v,w be Vertex of G2;
    v is Vertex of G1 & w is Vertex of G1 by Def6;
    hence (ex e2 being object st e2 DJoins v,w,G2) iff
      (not ex e1 being object st e1 DJoins v,w,G1) by Def6;
  end;
  hence thesis by A1, Def6;
end;

theorem Th55:
  for G1 being _Graph, G2 being DLGraphComplement of G1
  holds G1.order() = G2.order() by Def6;

theorem Th56:
  for G1 being _Graph, G2 being DLGraphComplement of G1 holds
    (G1 is _trivial iff G2 is _trivial) &
    (G1 is loopfull iff G2 is loopless) &
    (G1 is loopless iff G2 is loopfull)
proof
  let G1 be _Graph, G2 be DLGraphComplement of G1;
  hereby
    assume G1 is _trivial;
    then 1 = G1.order() by GLIB_000:26
      .= G2.order() by Th55;
    hence G2 is _trivial by GLIB_000:26;
  end;
  hereby
    assume G2 is _trivial;
    then 1 = G2.order() by GLIB_000:26
      .= G1.order() by Th55;
    hence G1 is _trivial by GLIB_000:26;
  end;
  hereby
    assume A1: G1 is loopfull;
    now
      let v be object;
      given e2 being object such that
        A2: e2 DJoins v,v,G2;
      e2 Joins v,v,G2 by A2, GLIB_000:16;
      then v in the_Vertices_of G2 by GLIB_000:13;
      then v in the_Vertices_of G1 by Def6;
      then consider e1 being object such that
        A3: e1 DJoins v,v,G1 by A1, Th1;
      thus contradiction by A2, A3, Th46;
    end;
    hence G2 is loopless by GLIB_000:136;
  end;
  hereby
    assume A4: G2 is loopless;
    now
      let v be Vertex of G1;
      assume not ex e1 being object st e1 DJoins v,v,G1;
      then ex e2 being object st e2 DJoins v,v,G2 by Def6;
      hence contradiction by A4, GLIB_000:136;
    end;
    hence G1 is loopfull by Th1;
  end;
  hereby
    assume A5: G1 is loopless;
    now
      let v be Vertex of G2;
      A6: v is Vertex of G1 by Def6;
      assume not ex e2 being object st e2 DJoins v,v,G2;
      then ex e1 being object st e1 DJoins v,v,G1 by A6, Def6;
      hence contradiction by A5, GLIB_000:136;
    end;
    hence G2 is loopfull by Th1;
  end;
  hereby
    assume A7: G2 is loopfull;
    now
      let v be object;
      given e1 being object such that
        A8: e1 DJoins v,v,G1;
      e1 Joins v,v,G1 by A8, GLIB_000:16;
      then v in the_Vertices_of G1 by GLIB_000:13;
      then v in the_Vertices_of G2 by Def6;
      then consider e2 being object such that
        A9: e2 DJoins v,v,G2 by A7, Th1;
      thus contradiction by A8, A9, Th46;
    end;
    hence G1 is loopless by GLIB_000:136;
  end;
end;

registration
  let G be _trivial _Graph;
  cluster -> _trivial for DLGraphComplement of G;
  coherence by Th56;
end;

registration
  let G be non _trivial _Graph;
  cluster -> non _trivial for DLGraphComplement of G;
  coherence by Th56;
end;

registration
  let G be loopfull _Graph;
  cluster -> loopless for DLGraphComplement of G;
  coherence by Th56;
end;

registration
  let G be non loopfull _Graph;
  cluster -> non loopless for DLGraphComplement of G;
  coherence by Th56;
end;

registration
  let G be loopless _Graph;
  cluster -> loopfull for DLGraphComplement of G;
  coherence by Th56;
end;

registration
  let G be non loopless _Graph;
  cluster -> non loopfull for DLGraphComplement of G;
  coherence by Th56;
end;

theorem Th57:
  for G1 being _Graph, G2 being DLGraphComplement of G1
  st the_Edges_of G1 = G1.loops() holds G2 is complete
proof
  let G1 be _Graph, G2 be DLGraphComplement of G1;
  assume A1: the_Edges_of G1 = G1.loops();
  now
    let v,w be Vertex of G2;
    A2: v is Vertex of G1 & w is Vertex of G1 by Def6;
    assume A3: v <> w;
    not ex e1 being object st e1 DJoins v,w,G1
    proof
      given e1 being object such that
        A4: e1 DJoins v,w,G1;
      e1 Joins v,w,G1 by A4, GLIB_000:16;
      hence contradiction by A1, A3, A4, GLIB_009:46, GLIB_000:def 14;
    end;
    then consider e2 being object such that
      A5: e2 DJoins v,w,G2 by A2, Def6;
    e2 Joins v,w,G2 by A5, GLIB_000:16;
    hence v,w are_adjacent by CHORD:def 3;
  end;
  hence thesis by CHORD:def 6;
end;

registration
  let G be edgeless _Graph;
  cluster -> complete for DLGraphComplement of G;
  coherence
  proof
    let G2 be DLGraphComplement of G;
    the_Edges_of G = {} & G.loops() = {};
    hence thesis by Th57;
  end;
end;

registration
  let G be non connected _Graph;
  cluster -> connected for DLGraphComplement of G;
  coherence
  proof
    let G2 be DLGraphComplement of G;
    consider w1, w2 being Vertex of G such that
      A1: for W being Walk of G holds not W is_Walk_from w1,w2
      by GLIB_002:def 1;
    not ex e being object st e DJoins w1,w2,G
    proof
      given e being object such that
        A2: e DJoins w1,w2,G;
      e Joins w1,w2,G by A2, GLIB_000:16;
      then G.walkOf(w1,e,w2) is_Walk_from w1,w2 by GLIB_001:15;
      hence contradiction by A1;
    end;
    then consider e being object such that
      A3: e DJoins w1,w2,G2 by Def6;
    now
      let v1,v2 be Vertex of G2;
      reconsider u1=v1, u2=v2 as Vertex of G by Def6;
      per cases;
      suppose A4: (ex e1 being object st e1 DJoins v1,w1,G) &
          (ex e2 being object st e2 DJoins v2,w2,G);
        then consider e1 being object such that
          A5: e1 DJoins v1,w1,G;
        consider e2 being object such that
          A6: e2 DJoins v2,w2,G by A4;
        A7: e1 Joins w1,v1,G by A5, GLIB_000:16;
        A8: e2 Joins v2,w2,G by A6, GLIB_000:16;
        not ex e3 being object st e3 DJoins u1,w2,G
        proof
          given e3 being object such that
            A9: e3 DJoins u1,w2,G;
          set W2 = G.walkOf(v1,e3,w2);
          e3 Joins v1,w2,G by A9, GLIB_000:16;
          then A10: W2 is_Walk_from v1,w2 by GLIB_001:15;
          set W1 = G.walkOf(w1,e1,v1);
          W1 is_Walk_from w1,v1 by A7, GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A10, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e3 being object such that
          A11: e3 DJoins u1,w2,G2 by Def6;
        A12: e3 Joins v1,w2,G2 by A11, GLIB_000:16;
        not ex e4 being object st e4 DJoins w1,u2,G
        proof
          given e4 being object such that
            A13: e4 DJoins w1,u2,G;
          set W1 = G.walkOf(w1,e4,u2);
          e4 Joins w1,v2,G by A13, GLIB_000:16;
          then A14: W1 is_Walk_from w1,v2 by GLIB_001:15;
          set W2 = G.walkOf(v2,e2,w2);
          W2 is_Walk_from v2,w2 by A8, GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A14, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e4 being object such that
          A15: e4 DJoins w1,u2,G2 by Def6;
        A16: e4 Joins w1,v2,G2 by A15, GLIB_000:16;
        set W1 = G2.walkOf(v1,e3,w2), W2 = G2.walkOf(w2,e,w1),
          W3 = G2.walkOf(w1,e4,v2);
        reconsider W = W1.append(W2).append(W3) as Walk of G2;
        take W;
        A17: W1 is_Walk_from v1,w2 by A12, GLIB_001:15;
        e Joins w2,w1,G2 by A3, GLIB_000:16;
        then W2 is_Walk_from w2,w1 by GLIB_001:15;
        then A18: W1.append(W2) is_Walk_from v1,w1 by A17, GLIB_001:31;
        W3 is_Walk_from w1,v2 by A16, GLIB_001:15;
        hence W is_Walk_from v1,v2 by A18, GLIB_001:31;
      end;
      suppose A19: (not ex e1 being object st e1 DJoins v1,w1,G) &
          (ex e2 being object st e2 DJoins v2,w2,G);
        then consider e2 being object such that
          A20: e2 DJoins v2,w2,G;
        A21: e2 Joins v2,w2,G by A20, GLIB_000:16;
        consider e3 being object such that
          A22: e3 DJoins u1,w1,G2 by A19, Def6;
        A23: e3 Joins v1,w1,G2 by A22, GLIB_000:16;
        not ex e4 being object st e4 DJoins w1,u2,G
        proof
          given e4 being object such that
            A24: e4 DJoins w1,u2,G;
          set W1 = G.walkOf(w1,e4,u2);
          e4 Joins w1,v2,G by A24, GLIB_000:16;
          then A25: W1 is_Walk_from w1,v2 by GLIB_001:15;
          set W2 = G.walkOf(v2,e2,w2);
          W2 is_Walk_from v2,w2 by A21, GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A25, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e4 being object such that
          A26: e4 DJoins w1,u2,G2 by Def6;
        A27: e4 Joins w1,v2,G2 by A26, GLIB_000:16;
        set W1 = G2.walkOf(v1,e3,w1), W2 = G2.walkOf(w1,e4,v2);
        reconsider W = W1.append(W2) as Walk of G2;
        take W;
        A28: W1 is_Walk_from v1,w1 by A23, GLIB_001:15;
        W2 is_Walk_from w1,v2 by A27, GLIB_001:15;
        hence W is_Walk_from v1,v2 by A28, GLIB_001:31;
      end;
      suppose A29: (ex e1 being object st e1 DJoins v1,w1,G) &
          (not ex e2 being object st e2 DJoins v2,w2,G);
        then consider e1 being object such that
          A30: e1 DJoins v1,w1,G;
        A31: e1 Joins w1,v1,G by A30, GLIB_000:16;
        not ex e3 being object st e3 DJoins u1,w2,G
        proof
          given e3 being object such that
            A32: e3 DJoins u1,w2,G;
          set W2 = G.walkOf(v1,e3,w2);
          e3 Joins v1,w2,G by A32, GLIB_000:16;
          then A33: W2 is_Walk_from v1,w2 by GLIB_001:15;
          set W1 = G.walkOf(w1,e1,v1);
          W1 is_Walk_from w1,v1 by A31, GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A33, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e3 being object such that
          A34: e3 DJoins u1,w2,G2 by Def6;
        A35: e3 Joins v1,w2,G2 by A34, GLIB_000:16;
        consider e4 being object such that
          A36: e4 DJoins u2,w2,G2 by A29, Def6;
        A37: e4 Joins w2,v2,G2 by A36, GLIB_000:16;
        set W1 = G2.walkOf(v1,e3,w2), W2 = G2.walkOf(w2,e4,v2);
        reconsider W = W1.append(W2) as Walk of G2;
        take W;
        A38: W1 is_Walk_from v1,w2 by A35, GLIB_001:15;
        W2 is_Walk_from w2,v2 by A37, GLIB_001:15;
        hence W is_Walk_from v1,v2 by A38, GLIB_001:31;
      end;
      suppose A39: (not ex e1 being object st e1 DJoins v1,w1,G) &
          (not ex e2 being object st e2 DJoins v2,w2,G);
        then consider e3 being object such that
          A40: e3 DJoins u1,w1,G2 by Def6;
        A41: e3 Joins v1,w1,G2 by A40, GLIB_000:16;
        consider e4 being object such that
          A42: e4 DJoins u2,w2,G2 by A39, Def6;
        A43: e4 Joins w2,v2,G2 by A42, GLIB_000:16;
        set W1 = G2.walkOf(v1,e3,w1), W2 = G2.walkOf(w1,e,w2),
          W3 = G2.walkOf(w2,e4,v2);
        reconsider W = W1.append(W2).append(W3) as Walk of G2;
        take W;
        A44: W1 is_Walk_from v1,w1 by A41, GLIB_001:15;
        e Joins w1,w2,G2 by A3, GLIB_000:16;
        then W2 is_Walk_from w1,w2 by GLIB_001:15;
        then A45: W1.append(W2) is_Walk_from v1,w2 by A44, GLIB_001:31;
        W3 is_Walk_from w2,v2 by A43, GLIB_001:15;
        hence W is_Walk_from v1,v2 by A45, GLIB_001:31;
      end;
    end;
    hence thesis by GLIB_002:def 1;
  end;
end;

theorem
  for G1 being _Graph, G2 being DLGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2 st v1 = v2 holds
    (v1 is isolated implies v2 is non isolated) &
    (v1 is endvertex implies v2 is non endvertex)
proof
  let G1 be _Graph, G2 be DLGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  hereby
    assume A2: v1 is isolated;
    not ex e1 being object st e1 DJoins v1,v1,G1
    proof
      given e1 being object such that
        A3: e1 DJoins v1,v1,G1;
      e1 Joins v1,v1,G1 by A3, GLIB_000:16;
      hence contradiction by A2, GLIB_000:143;
    end;
    then consider e2 being object such that
      A4: e2 DJoins v1,v1,G2 by Def6;
    e2 Joins v2,v2,G2 by A1, A4, GLIB_000:16;
    hence v2 is non isolated by GLIB_000:143;
  end;
  hereby
    assume A5: v1 is endvertex;
    not ex e1 being object st e1 DJoins v1,v1,G1
    proof
      given e1 being object such that
        A6: e1 DJoins v1,v1,G1;
      e1 Joins v1,v1,G1 by A6, GLIB_000:16;
      hence contradiction by A5, GLIB_000:146;
    end;
    then consider e2 being object such that
      A7: e2 DJoins v1,v1,G2 by Def6;
    e2 Joins v2,v2,G2 by A1, A7, GLIB_000:16;
    hence v2 is non endvertex by GLIB_000:146;
  end;
end;

theorem
  for G1 being _Graph, G2 being DLGraphComplement of G1
  for v,w being Vertex of G1 holds
    (not ex e being object st e Joins v,w,G1) implies
    (ex e being object st e Joins v,w,G2)
proof
  let G1 be _Graph, G2 be DLGraphComplement of G1;
  let v,w be Vertex of G1;
  assume A1: not ex e being object st e Joins v,w,G1;
  not ex e being object st e DJoins v,w,G1
  proof
    given e being object such that
      A2: e DJoins v,w,G1;
    e Joins v,w,G1 by A2, GLIB_000:16;
    hence contradiction by A1;
  end;
  then consider e being object such that
    A3: e DJoins v,w,G2 by Def6;
  take e;
  thus e Joins v,w,G2 by A3, GLIB_000:16;
end;

theorem Th60:
  for G1 being _Graph, G2 being DLGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2 st v1 = v2
  holds
    v2.inNeighbors() = the_Vertices_of G2 \ v1.inNeighbors() &
    v2.outNeighbors() = the_Vertices_of G2 \ v1.outNeighbors()
proof
  let G1 be _Graph, G2 be DLGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  now
    let x be object;
    hereby
      assume x in v2.inNeighbors();
      then consider e being object such that
        A2: e DJoins x,v2,G2 by GLIB_000:69;
      e Joins x,v2,G2 by A2, GLIB_000:16;
      then A3: x in the_Vertices_of G2 by GLIB_000:13;
      then reconsider w = x as Vertex of G1 by Def6;
      not ex e0 being object st e0 DJoins w,v1,G1 by A1, A2, Def6;
      then not x in v1.inNeighbors() by GLIB_000:69;
      hence x in the_Vertices_of G2 \ v1.inNeighbors() by A3, XBOOLE_0:def 5;
    end;
    assume x in the_Vertices_of G2 \ v1.inNeighbors();
    then A4: x in the_Vertices_of G2 & not x in v1.inNeighbors()
      by XBOOLE_0:def 5;
    then reconsider w = x as Vertex of G1 by Def6;
    not ex e0 being object st e0 DJoins w,v1,G1 by A4, GLIB_000:69;
    then consider e being object such that
      A5: e DJoins w,v1,G2 by Def6;
    thus x in v2.inNeighbors() by A1, A5, GLIB_000:69;
  end;
  hence v2.inNeighbors() = the_Vertices_of G2 \ v1.inNeighbors() by TARSKI:2;
  now
    let x be object;
    hereby
      assume x in v2.outNeighbors();
      then consider e being object such that
        A6: e DJoins v2,x,G2 by GLIB_000:70;
      e Joins v2,x,G2 by A6, GLIB_000:16;
      then A7: x in the_Vertices_of G2 by GLIB_000:13;
      then reconsider w = x as Vertex of G1 by Def6;
      not ex e0 being object st e0 DJoins v1,w,G1 by A1, A6, Def6;
      then not x in v1.outNeighbors() by GLIB_000:70;
      hence x in the_Vertices_of G2 \ v1.outNeighbors() by A7, XBOOLE_0:def 5;
    end;
    assume x in the_Vertices_of G2 \ v1.outNeighbors();
    then A8: x in the_Vertices_of G2 & not x in v1.outNeighbors()
      by XBOOLE_0:def 5;
    then reconsider w = x as Vertex of G1 by Def6;
    not ex e0 being object st e0 DJoins v1,w,G1 by A8, GLIB_000:70;
    then consider e being object such that
      A9: e DJoins v1,w,G2 by Def6;
    thus x in v2.outNeighbors() by A1, A9, GLIB_000:70;
  end;
  hence v2.outNeighbors() = the_Vertices_of G2 \ v1.outNeighbors() by TARSKI:2;
end;

theorem
  for G1 being _Graph, G2 being DLGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & v1 is isolated holds
    v2.inNeighbors() = the_Vertices_of G2 &
    v2.outNeighbors() = the_Vertices_of G2 &
    v2.allNeighbors() = the_Vertices_of G2
proof
  let G1 be _Graph, G2 be DLGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & v1 is isolated;
  then v1.allNeighbors() = {} by GLIB_000:113;
  then A2: v1.inNeighbors() = {} & v1.outNeighbors() = {};
  hence A3: v2.inNeighbors() = the_Vertices_of G2 \ {} by A1, Th60
    .= the_Vertices_of G2;
  thus v2.outNeighbors() = the_Vertices_of G2 \ {} by A1, A2, Th60
    .= the_Vertices_of G2;
  hence v2.allNeighbors() = the_Vertices_of G2 by A3;
end;

begin :: Undirected Graph Complement with Loops

definition
  let G be _Graph;
  mode LGraphComplement of G -> non-multi _Graph means
  :Def7:
  the_Vertices_of it = the_Vertices_of G &
  the_Edges_of it misses the_Edges_of G &
  for v,w being Vertex of G holds
    (ex e1 being object st e1 Joins v,w,G) iff
    (not ex e2 being object st e2 Joins v,w,it);
  existence
  proof
    set E = {[the_Edges_of G,{v,w}] where v is Vertex of G, w is Vertex of G
      : not ex e being object st e Joins v,w,G};
    deffunc S(object) = the Element of Segm($1`2);
    consider s being Function such that
      A1: dom s = E & for x being object st x in E holds s.x = S(x)
      from FUNCT_1:sch 3;
    now
      let y be object;
      assume y in rng s;
      then consider x being object such that
        A2: x in dom s & s.x = y by FUNCT_1:def 3;
      consider v, w being Vertex of G such that
        A3: x = [the_Edges_of G,{v,w}] and
        not ex e being object st e Joins v,w,G by A1, A2;
      y = S(x) by A1, A2
        .= the Element of {v,w} by A3;
      hence y in the_Vertices_of G;
    end;
    then reconsider s as Function of E, the_Vertices_of G
      by A1, TARSKI:def 3, FUNCT_2:2;
    deffunc T(object) = IFEQ(Segm($1`2)\{S($1)},{},
      S($1),the Element of (Segm($1`2)\{S($1)}));
    A4: for x,y being object st x <> y holds T([the_Edges_of G,{x,y}])
      = the Element of ({x,y}\{the Element of {x,y}})
      by FUNCOP_1:def 8, GLIBPRE0:3;
    A5: for x being object holds T([the_Edges_of G,{x,x}])
      = the Element of {x,x}
    proof
      let x be object;
      A6: {x,x}\{the Element of {x,x}} = {} by GLIBPRE0:3;
      thus T([the_Edges_of G,{x,x}])
        = the Element of {x,x} by A6, FUNCOP_1:def 8;
    end;
    consider t being Function such that
      A7: dom t = E & for x being object st x in E holds t.x = T(x)
      from FUNCT_1:sch 3;
    now
      let y be object;
      assume y in rng t;
      then consider x being object such that
        A8: x in dom t & t.x = y by FUNCT_1:def 3;
      consider v, w being Vertex of G such that
        A9: x = [the_Edges_of G,{v,w}] and
        not ex e being object st e Joins v,w,G by A7, A8;
      per cases;
      suppose A10: v <> w;
        y = T([the_Edges_of G,{v,w}]) by A7, A8, A9
          .= the Element of ({v,w}\{the Element of {v,w}}) by A4, A10;
        then y = v or y = w by A10, GLIBPRE0:4;
        hence y in the_Vertices_of G;
      end;
      suppose A11: v = w;
        y = T([the_Edges_of G,{v,w}]) by A7, A8, A9
          .= the Element of {v,v} by A5, A11;
        hence y in the_Vertices_of G;
      end;
    end;
    then reconsider t as Function of E, the_Vertices_of G
      by A7, TARSKI:def 3, FUNCT_2:2;
    set H = createGraph(the_Vertices_of G,E,s,t);
    now
      let e1,e2,v1,v2 be object;
      assume A12: e1 Joins v1,v2,H & e2 Joins v1,v2,H;
      then e1 in the_Edges_of H by GLIB_000:def 13;
      then A13: e1 in E;
      then consider a,b being Vertex of G such that
        A14: e1 = [the_Edges_of G,{a,b}] and
        not ex e being object st e Joins a,b,G;
      e2 in the_Edges_of H by A12, GLIB_000:def 13;
      then A15: e2 in E;
      then consider c,d being Vertex of G such that
        A16: e2 = [the_Edges_of G,{c,d}] and
        not ex e being object st e Joins c,d,G;
      per cases;
      suppose A17: a <> b & c <> d;
        per cases by A12, GLIB_000:16;
        suppose A18: e1 DJoins v1,v2,H & e2 DJoins v1,v2,H;
          A19: v1 = (the_Source_of H).e1 by A18, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A20: v2 = (the_Target_of H).e1 by A18, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A17, A14;
          A21: v1 = (the_Source_of H).e2 by A18, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          v2 = (the_Target_of H).e2 by A18, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A17, A16;
          then A22: v1 = c & v2 = d or v1 = d & v2 = c by A17, A21, GLIBPRE0:4;
          v1 = a & v2 = b or v1 = b & v2 = a by A17, A19, A20, GLIBPRE0:4;
          hence e1 = e2 by A14, A16, A22;
        end;
        suppose A23: e1 DJoins v1,v2,H & e2 DJoins v2,v1,H;
          A24: v1 = (the_Source_of H).e1 by A23, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A25: v2 = (the_Target_of H).e1 by A23, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A17, A14;
          A26: v1 = (the_Target_of H).e2 by A23, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A17, A16;
          v2 = (the_Source_of H).e2 by A23, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          then A27: v1 = c & v2 = d or v1 = d & v2 = c by A17, A26, GLIBPRE0:4;
          v1 = a & v2 = b or v1 = b & v2 = a by A17, A24, A25, GLIBPRE0:4;
          hence e1 = e2 by A14, A16, A27;
        end;
        suppose A28: e1 DJoins v2,v1,H & e2 DJoins v2,v1,H;
          A29: v1 = (the_Target_of H).e1 by A28, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A17, A14;
          A30: v2 = (the_Source_of H).e1 by A28, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A31: v1 = (the_Target_of H).e2 by A28, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A17, A16;
          v2 = (the_Source_of H).e2 by A28, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          then A32: v1 = c & v2 = d or v1 = d & v2 = c by A17, A31, GLIBPRE0:4;
          v1 = a & v2 = b or v1 = b & v2 = a by A17, A29, A30, GLIBPRE0:4;
          hence e1 = e2 by A14, A16, A32;
        end;
        suppose A33: e1 DJoins v2,v1,H & e2 DJoins v1,v2,H;
          A34: v1 = (the_Target_of H).e1 by A33, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A17, A14;
          A35: v2 = (the_Source_of H).e1 by A33, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A36: v1 = (the_Source_of H).e2 by A33, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          v2 = (the_Target_of H).e2 by A33, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A17, A16;
          then A37: v1 = c & v2 = d or v1 = d & v2 = c by A17, A36, GLIBPRE0:4;
          v1 = a & v2 = b or v1 = b & v2 = a by A17, A34, A35, GLIBPRE0:4;
          hence e1 = e2 by A14, A16, A37;
        end;
      end;
      suppose A38: a <> b & c = d;
        per cases by A12, GLIB_000:16;
        suppose A39: e1 DJoins v1,v2,H & e2 DJoins v1,v2,H;
          A40: v1 = (the_Source_of H).e1 by A39, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A41: v2 = (the_Target_of H).e1 by A39, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A38, A14;
          A42: v1 = (the_Source_of H).e2 by A39, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          A43: v2 = (the_Target_of H).e2 by A39, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of {c,d} by A5, A38, A16;
          v1 = a & v2 = b or v1 = b & v2 = a by A38, A40, A41, GLIBPRE0:4;
          hence e1 = e2 by A38, A42, A43; :: by contradiction
        end;
        suppose A44: e1 DJoins v1,v2,H & e2 DJoins v2,v1,H;
          A45: v1 = (the_Source_of H).e1 by A44, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A46: v2 = (the_Target_of H).e1 by A44, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A38, A14;
          A47: v1 = (the_Target_of H).e2 by A44, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of {c,d} by A5, A38, A16;
          A48: v2 = (the_Source_of H).e2 by A44, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          v1 = a & v2 = b or v1 = b & v2 = a by A38, A45, A46, GLIBPRE0:4;
          hence e1 = e2 by A38, A47, A48; :: by contradiction
        end;
        suppose A49: e1 DJoins v2,v1,H & e2 DJoins v2,v1,H;
          A50: v1 = (the_Target_of H).e1 by A49, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A38, A14;
          A51: v2 = (the_Source_of H).e1 by A49, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A52: v1 = (the_Target_of H).e2 by A49, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of {c,d} by A5, A38, A16;
          A53: v2 = (the_Source_of H).e2 by A49, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          v1 = a & v2 = b or v1 = b & v2 = a by A38, A50, A51, GLIBPRE0:4;
          hence e1 = e2 by A38, A52, A53; :: by contradiction
        end;
        suppose A54: e1 DJoins v2,v1,H & e2 DJoins v1,v2,H;
          A55: v1 = (the_Target_of H).e1 by A54, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A38, A14;
          A56: v2 = (the_Source_of H).e1 by A54, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A57: v1 = (the_Source_of H).e2 by A54, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          A58: v2 = (the_Target_of H).e2 by A54, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of {c,d} by A5, A38, A16;
          v1 = a & v2 = b or v1 = b & v2 = a by A38, A55, A56, GLIBPRE0:4;
          hence e1 = e2 by A38, A57, A58; :: by contradiction
        end;
      end;
      suppose A59: a = b & c <> d;
        per cases by A12, GLIB_000:16;
        suppose A60: e1 DJoins v1,v2,H & e2 DJoins v1,v2,H;
          A61: v1 = (the_Source_of H).e1 by A60, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A62: v2 = (the_Target_of H).e1 by A60, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of {a,b} by A5, A59, A14;
          A63: v1 = (the_Source_of H).e2 by A60, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          v2 = (the_Target_of H).e2 by A60, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A59, A16;
          then v1 = c & v2 = d or v1 = d & v2 = c by A59, A63, GLIBPRE0:4;
          hence e1 = e2 by A59, A61, A62; :: by contradiction
        end;
        suppose A64: e1 DJoins v1,v2,H & e2 DJoins v2,v1,H;
          A65: v1 = (the_Source_of H).e1 by A64, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A66: v2 = (the_Target_of H).e1 by A64, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of {a,b} by A5, A59, A14;
          A67: v1 = (the_Target_of H).e2 by A64, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A59, A16;
          v2 = (the_Source_of H).e2 by A64, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          then v1 = c & v2 = d or v1 = d & v2 = c by A59, A67, GLIBPRE0:4;
          hence e1 = e2 by A59, A65, A66; :: by contradiction
        end;
        suppose A68: e1 DJoins v2,v1,H & e2 DJoins v2,v1,H;
          A69: v1 = (the_Target_of H).e1 by A68, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of {a,b} by A5, A59, A14;
          A70: v2 = (the_Source_of H).e1 by A68, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A71: v1 = (the_Target_of H).e2 by A68, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A59, A16;
          v2 = (the_Source_of H).e2 by A68, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          then v1 = c & v2 = d or v1 = d & v2 = c by A59, A71, GLIBPRE0:4;
          hence e1 = e2 by A59, A69, A70; :: by contradiction
        end;
        suppose A72: e1 DJoins v2,v1,H & e2 DJoins v1,v2,H;
          A73: v1 = (the_Target_of H).e1 by A72, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of {a,b} by A5, A59, A14;
          A74: v2 = (the_Source_of H).e1 by A72, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= the Element of {a,b};
          A75: v1 = (the_Source_of H).e2 by A72, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= the Element of {c,d};
          v2 = (the_Target_of H).e2 by A72, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of ({c,d}\{the Element of {c,d}}) by A4, A59, A16;
          then v1 = c & v2 = d or v1 = d & v2 = c by A59, A75, GLIBPRE0:4;
          hence e1 = e2 by A59, A73, A74; :: by contradiction
        end;
      end;
      suppose A76: a = b & c = d;
        A77: {a,a} = {a} & {c,c} = {c} by ENUMSET1:29;
        per cases by A12, GLIB_000:16;
        suppose A78: e1 DJoins v1,v2,H & e2 DJoins v1,v2,H;
          A79: v1 = (the_Source_of H).e1 by A78, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= a by A76, A77, TARSKI:def 1;
          v1 = (the_Source_of H).e2 by A78, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= c by A76, A77, TARSKI:def 1;
          hence e1 = e2 by A14, A16, A76, A79;
        end;
        suppose A80: e1 DJoins v1,v2,H & e2 DJoins v2,v1,H;
          A81: v1 = (the_Source_of H).e1 by A80, GLIB_000:def 14
            .= s.e1
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A13, A14
            .= a by A76, A77, TARSKI:def 1;
          v1 = (the_Target_of H).e2 by A80, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of {c,d} by A5, A76, A16
            .= c by A76, A77, TARSKI:def 1;
          hence e1 = e2 by A14, A16, A76, A81;
        end;
        suppose A82: e1 DJoins v2,v1,H & e2 DJoins v2,v1,H;
          A83: v1 = (the_Target_of H).e1 by A82, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of {a,b} by A5, A76, A14
            .= a by A76, A77, TARSKI:def 1;
          v1 = (the_Target_of H).e2 by A82, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A15
            .= the Element of {c,d} by A5, A76, A16
            .= c by A76, A77, TARSKI:def 1;
          hence e1 = e2 by A14, A16, A76, A83;
        end;
        suppose A84: e1 DJoins v2,v1,H & e2 DJoins v1,v2,H;
          A85: v1 = (the_Target_of H).e1 by A84, GLIB_000:def 14
            .= t.e1
            .= T(e1) by A7, A13
            .= the Element of {a,b} by A5, A76, A14
            .= a by A76, A77, TARSKI:def 1;
          v1 = (the_Source_of H).e2 by A84, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{c,d}]`2) by A1, A15, A16
            .= c by A76, A77, TARSKI:def 1;
          hence e1 = e2 by A14, A16, A76, A85;
        end;
      end;
    end;
    then reconsider H as non-multi _Graph by GLIB_000:def 20;
    take H;
    thus the_Vertices_of H = the_Vertices_of G;
    E /\ the_Edges_of G = {}
    proof
      assume E /\ the_Edges_of G <> {};
      then consider x being object such that
        A86: x in E /\ the_Edges_of G by XBOOLE_0:def 1;
      reconsider x as set by TARSKI:1;
      x in E by A86, XBOOLE_0:def 4;
      then consider v,w being Vertex of G such that
        A87: x = [the_Edges_of G,{v,w}] and
        not ex e being object st e Joins v,w,G;
      A88: x in the_Edges_of G by A86, XBOOLE_0:def 4;
      A89: the_Edges_of G in {the_Edges_of G} by TARSKI:def 1;
      x = {{the_Edges_of G,{v,w}},{the_Edges_of G}} by A87, TARSKI:def 5;
      then {the_Edges_of G} in x by TARSKI:def 2;
      hence contradiction by A88, A89, XREGULAR:7;
    end;
    then the_Edges_of H /\ the_Edges_of G = {};
    hence the_Edges_of H misses the_Edges_of G by XBOOLE_0:def 7;
    let v,w be Vertex of G;
    hereby
      given e1 being object such that
        A90: e1 Joins v,w,G;
      given e2 being object such that
        A91: e2 Joins v,w,H;
      e2 in the_Edges_of H by A91, GLIB_000:def 13;
      then A92: e2 in E;
      then consider a,b being Vertex of G such that
        A93: e2 = [the_Edges_of G,{a,b}] and
        A94: not ex e being object st e Joins a,b,G;
      per cases;
      suppose A95: a <> b;
        per cases by A91, GLIB_000:16;
        suppose A96: e2 DJoins v,w,H;
          A97: v = (the_Source_of H).e2 by A96, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A92, A93
            .= the Element of {a,b};
          w = (the_Target_of H).e2 by A96, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A92
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A93, A95;
          then v = a & w = b or v = b & w = a by A95, A97, GLIBPRE0:4;
          hence contradiction by A90, A94, GLIB_000:14;
        end;
        suppose A98: e2 DJoins w,v,H;
          A99: v = (the_Target_of H).e2 by A98, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A92
            .= the Element of ({a,b}\{the Element of {a,b}}) by A4, A93, A95;
          w = (the_Source_of H).e2 by A98, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A92, A93
            .= the Element of {a,b};
          then v = a & w = b or v = b & w = a by A95, A99, GLIBPRE0:4;
          hence contradiction by A90, A94, GLIB_000:14;
        end;
      end;
      suppose A100: a = b;
        A101: {a,a} = {a} by ENUMSET1:29;
        per cases by A91, GLIB_000:16;
        suppose A102: e2 DJoins v,w,H;
          A103: v = (the_Source_of H).e2 by A102, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A92, A93
            .= a by A100, A101, TARSKI:def 1;
          w = (the_Target_of H).e2 by A102, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A92
            .= the Element of {a,b} by A5, A93, A100
            .= b by A100, A101, TARSKI:def 1;
          hence contradiction by A90, A94, A103;
        end;
        suppose A104: e2 DJoins w,v,H;
          A105: v = (the_Target_of H).e2 by A104, GLIB_000:def 14
            .= t.e2
            .= T(e2) by A7, A92
            .= the Element of {a,b} by A5, A93, A100
            .= a by A100, A101, TARSKI:def 1;
          w = (the_Source_of H).e2 by A104, GLIB_000:def 14
            .= s.e2
            .= the Element of Segm([the_Edges_of G,{a,b}]`2) by A1, A92, A93
            .= b by A100, A101, TARSKI:def 1;
          hence contradiction by A90, A94, A105;
        end;
      end;
    end;
    set e2 = [the_Edges_of G,{v,w}];
    now
      assume not ex e1 being object st e1 Joins v,w,G;
      then A106: e2 in E;
      then A107: e2 in the_Edges_of H;
      per cases;
      suppose A108: v <> w;
        the Element of {v,w} = the Element of {v,w} &
          the Element of ({v,w}\{the Element of {v,w}}) =
          the Element of ({v,w}\{the Element of {v,w}});
        then per cases by A108, GLIBPRE0:4;
        suppose A109: v = the Element of {v,w} &
            w = the Element of ({v,w}\{the Element of {v,w}});
          A110: v = the Element of Segm([the_Edges_of G,{v,w}]`2) by A109
            .= s.e2 by A1, A106
            .= (the_Source_of H).e2;
          w = T(e2) by A4, A108, A109
            .= t.e2 by A7, A106
            .= (the_Target_of H).e2;
          hence e2 Joins v,w,H by A107, A110, GLIB_000:def 13;
        end;
        suppose A111: w = the Element of {v,w} &
            v = the Element of ({v,w}\{the Element of {v,w}});
          A112: w = the Element of Segm([the_Edges_of G,{v,w}]`2) by A111
            .= s.e2 by A1, A106
            .= (the_Source_of H).e2;
          v = T(e2) by A4, A108, A111
            .= t.e2 by A7, A106
            .= (the_Target_of H).e2;
          hence e2 Joins v,w,H by A107, A112, GLIB_000:def 13;
        end;
      end;
      suppose A113: v = w;
        A114: {v,v} = {v} by ENUMSET1:29;
        A115: v = the Element of Segm([the_Edges_of G,{v,w}]`2)
            by A113, A114, TARSKI:def 1
          .= s.e2 by A1, A106
          .= (the_Source_of H).e2;
        w = the Element of Segm([the_Edges_of G,{v,w}]`2)
            by A113, A114, TARSKI:def 1
          .= T(e2) by A5, A113
          .= t.e2 by A7, A106
          .= (the_Target_of H).e2;
        hence e2 Joins v,w,H by A107, A115, GLIB_000:def 13;
      end;
    end;
    hence thesis;
  end;
end;

theorem Th62:
  for G1, G2, G3 being _Graph, G4 being LGraphComplement of G1
  st G1 == G2 & G3 == G4 holds G3 is LGraphComplement of G2
proof
  let G1, G2, G3 be _Graph, G4 be LGraphComplement of G1;
  assume A1: G1 == G2 & G3 == G4;
  then the_Vertices_of G4 = the_Vertices_of G3 &
    the_Edges_of G4 = the_Edges_of G3 by GLIB_000:def 34;
  then the_Vertices_of G1 = the_Vertices_of G3 &
    the_Edges_of G3 misses the_Edges_of G1 by Def7;
  then A2: the_Vertices_of G3 = the_Vertices_of G2 &
    the_Edges_of G3 misses the_Edges_of G2 by A1, GLIB_000:def 34;
  A3: G3 is non-multi by A1, GLIB_000:89;
  now
    let v,w be Vertex of G2;
    A4: v is Vertex of G1 & w is Vertex of G1 by A1, GLIB_000:def 34;
    hereby
      given e1 being object such that
        A5: e1 Joins v,w,G2;
      e1 Joins v,w,G1 by A1, A5, GLIB_000:88;
      then A6: not ex e2 being object st e2 Joins v,w,G4 by A4, Def7;
      thus not ex e2 being object st e2 Joins v,w,G3
      proof
        given e2 being object such that
          A7: e2 Joins v,w,G3;
        e2 Joins v,w,G4 by A1, A7, GLIB_000:88;
        hence contradiction by A6;
      end;
    end;
    assume A8: not ex e2 being object st e2 Joins v,w,G3;
    not ex e2 being object st e2 Joins v,w,G4
    proof
      given e2 being object such that
        A9: e2 Joins v,w,G4;
      e2 Joins v,w,G3 by A1, A9, GLIB_000:88;
      hence contradiction by A8;
    end;
    then consider e1 being object such that
      A10: e1 Joins v,w,G1 by A4, Def7;
    take e1;
    thus e1 Joins v,w,G2 by A1, A10, GLIB_000:88;
  end;
  hence thesis by A2, A3, Def7;
end;

registration
  let G be _Graph;
  cluster plain for LGraphComplement of G;
  existence
  proof
    set G1 = the LGraphComplement of G;
    set G2 = G1 | _GraphSelectors;
    G1 == G1 & G1 == G2 by GLIB_000:128;
    then reconsider G2 as LGraphComplement of G by Th62;
    take G2;
    thus thesis;
  end;
end;

theorem
  for G1 being _Graph, G2 being non-multi _Graph
  holds G2 is LGraphComplement of G1 iff
    the_Vertices_of G2 = the_Vertices_of G1 &
    the_Edges_of G2 misses the_Edges_of G1 &
    for v1,w1 being Vertex of G1, v2,w2 being Vertex of G2 st v1 = v2 & w1 = w2
    holds v1,w1 are_adjacent iff not v2,w2 are_adjacent
proof
  let G1 be _Graph, G2 be non-multi _Graph;
  hereby
    assume A1: G2 is LGraphComplement of G1;
    hence the_Vertices_of G2 = the_Vertices_of G1 &
      the_Edges_of G2 misses the_Edges_of G1 by Def7;
    let v1,w1 be Vertex of G1, v2,w2 be Vertex of G2;
    assume A2: v1 = v2 & w1 = w2;
    hereby
      assume v1,w1 are_adjacent;
      then ex e1 being object st e1 Joins v1,w1,G1 by CHORD:def 3;
      then not ex e2 being object st e2 Joins v1,w1,G2 by A1, Def7;
      hence not v2,w2 are_adjacent by A2, CHORD:def 3;
    end;
    assume not v2,w2 are_adjacent;
    then not ex e2 being object st e2 Joins v1,w1,G2 by A2, CHORD:def 3;
    then ex e1 being object st e1 Joins v1,w1,G1 by A1, Def7;
    hence v1,w1 are_adjacent by CHORD:def 3;
  end;
  assume that A3: the_Vertices_of G2 = the_Vertices_of G1 &
      the_Edges_of G2 misses the_Edges_of G1 and
    A4: for v1,w1 being Vertex of G1, v2,w2 being Vertex of G2
      st v1 = v2 & w1 = w2 holds v1,w1 are_adjacent iff not v2,w2 are_adjacent;
  now
    let v1,w1 be Vertex of G1;
    reconsider v2=v1, w2=w1 as Vertex of G2 by A3;
    hereby
      assume ex e1 being object st e1 Joins v1,w1,G1;
      then v1,w1 are_adjacent by CHORD:def 3;
      then not v2,w2 are_adjacent by A4;
      hence not ex e2 being object st e2 Joins v1,w1,G2 by CHORD:def 3;
    end;
    assume not ex e2 being object st e2 Joins v1,w1,G2;
    then not v2,w2 are_adjacent by CHORD:def 3;
    then v1,w1 are_adjacent by A4;
    hence ex e1 being object st e1 Joins v1,w1,G1 by CHORD:def 3;
  end;
  hence thesis by A3, Def7;
end;

theorem Th64:
  for G1 being _Graph, G2 being LGraphComplement of G1, e1,e2,v,w being object
  holds e1 Joins v,w,G1 implies not e2 Joins v,w,G2
proof
  let G1 be _Graph, G2 be LGraphComplement of G1, e1,e2,v,w be object;
  assume A1: e1 Joins v,w,G1;
  then v in the_Vertices_of G1 & w in the_Vertices_of G1 by GLIB_000:13;
  hence thesis by A1, Def7;
end;

theorem Th65:
  for G1 being _Graph, G2 being removeParallelEdges of G1
  for G3 being LGraphComplement of G1
  holds G3 is LGraphComplement of G2
proof
  let G1 be _Graph, G2 be removeParallelEdges of G1;
  let G3 be LGraphComplement of G1;
  consider E being RepEdgeSelection of G1 such that
    A1: G2 is inducedSubgraph of G1, the_Vertices_of G1, E by GLIB_009:def 7;
  the_Vertices_of G1 c= the_Vertices_of G1 &
    the_Edges_of G1 = G1.edgesBetween(the_Vertices_of G1) by GLIB_000:34;
  then A2: the_Vertices_of G2 = the_Vertices_of G1 & the_Edges_of G2 = E
    by A1, GLIB_000:def 37;
  then A3: the_Vertices_of G3 = the_Vertices_of G2 by Def7;
  the_Edges_of G3 misses the_Edges_of G1 by Def7;
  then A4: the_Edges_of G3 misses the_Edges_of G2 by XBOOLE_1:63;
  now
    let v,w be Vertex of G2;
    A5: v is Vertex of G1 & w is Vertex of G1 by GLIB_000:def 33;
    reconsider v1=v, w1=w as Vertex of G1 by GLIB_000:def 33;
    hereby
      given e2 being object such that
        A6: e2 Joins v,w,G2;
      A7: e2 Joins v,w,G1 by A6, GLIB_000:72;
      given e3 being object such that
        A8: e3 Joins v,w,G3;
      thus contradiction by A7, A8, Th64;
    end;
    assume not ex e3 being object st e3 Joins v,w,G3;
    then consider e1 being object such that
      A9: e1 Joins v,w,G1 by A5, Def7;
    consider e2 being object such that
      A10: e2 Joins v,w,G1 & e2 in E and
      for e9 being object st e9 Joins v,w,G1 & e9 in E holds e9 = e2
      by A9, GLIB_009:def 5;
    take e2;
    thus e2 Joins v,w,G2 by A2, A10, GLIB_000:73;
  end;
  hence thesis by A3, A4, Def7;
end;

theorem Th66:
  for G1, G2 being _Graph
  for G3 being removeParallelEdges of G1, G4 being removeParallelEdges of G2
  for G5 being LGraphComplement of G1, G6 being LGraphComplement of G2
  st G4 is G3-isomorphic holds G6 is G5-isomorphic
proof
  let G1, G2 be _Graph;
  let G3 be removeParallelEdges of G1, G4 be removeParallelEdges of G2;
  let G5 be LGraphComplement of G1, G6 be LGraphComplement of G2;
  A1: G5 is LGraphComplement of G3 & G6 is LGraphComplement of G4 by Th65;
  assume G4 is G3-isomorphic;
  then consider f being PVertexMapping of G3, G4 such that
    A2: f is isomorphism by GLIB_011:49;
  A3: the_Vertices_of G3 = the_Vertices_of G5 &
    the_Vertices_of G4 = the_Vertices_of G6 by A1, Def7;
  then reconsider g = f as PartFunc of the_Vertices_of G5, the_Vertices_of G6;
  now
    let v,w,e be object;
    assume A4: v in dom g & w in dom g & e Joins v,w,G5;
    then A5: not ex e3 being object st e3 Joins v,w,G3 by A1, A3, Def7;
    thus ex e6 being object st e6 Joins g.v,g.w,G6
    proof
      assume A6: not ex e6 being object st e6 Joins g.v,g.w,G6;
      g.v in rng f & g.w in rng f by A4, FUNCT_1:3;
      then consider e4 being object such that
        A7: e4 Joins g.v,g.w,G4 by A1, A6, Def7;
      consider e3 being object such that
        A8: e3 Joins v,w,G3 by A2, A4, A7, GLIB_011:2;
      thus contradiction by A5, A8;
    end;
  end;
  then reconsider g as PVertexMapping of G5, G6 by GLIB_011:1;
  now
    let v,w,e6 be object;
    assume A9: v in dom g & w in dom g & e6 Joins g.v,g.w,G6;
    g.v in rng f & g.w in rng f by A9, FUNCT_1:3;
    then A10: not ex e4 being object st e4 Joins g.v,g.w,G4 by A1, A9, Def7;
    thus ex e5 being object st e5 Joins v,w,G5
    proof
      assume not ex e5 being object st e5 Joins v,w,G5;
      then consider e3 being object such that
        A11: e3 Joins v,w,G3 by A1, A3, A9, Def7;
      consider e4 being object such that
        A12: e4 Joins f.v,f.w,G4 by A9, A11, GLIB_011:1;
      thus contradiction by A10, A12;
    end;
  end;
  then g is continuous by GLIB_011:2;
  hence thesis by A2, A3, GLIB_011:49;
end;

theorem Th67:
  for G1 being _Graph, G2 being G1-isomorphic _Graph
  for G3 being LGraphComplement of G1, G4 being LGraphComplement of G2
  holds G4 is G3-isomorphic
proof
  let G1 be _Graph, G2 be G1-isomorphic _Graph;
  let G3 be LGraphComplement of G1, G4 be LGraphComplement of G2;
  set G5 = the removeParallelEdges of G1;
  set G6 = the removeParallelEdges of G2;
  G6 is G5-isomorphic by GLIB_010:168;
  hence thesis by Th66;
end;

theorem Th68:
  for G1 being _Graph, G2, G3 being LGraphComplement of G1
  holds G3 is G2-isomorphic
proof
  let G1 be _Graph, G2, G3 be LGraphComplement of G1;
  G1 is G1-isomorphic by GLIB_010:53;
  hence thesis by Th67;
end;

theorem Th69:
  for G1 being _Graph, V being non empty Subset of the_Vertices_of G1
  for G2 being inducedSubgraph of G1, V
  for G3 being LGraphComplement of G1, G4 being inducedSubgraph of G3, V
  holds G4 is LGraphComplement of G2
proof
  let G1 be _Graph, V be non empty Subset of the_Vertices_of G1;
  let G2 be inducedSubgraph of G1, V;
  let G3 be LGraphComplement of G1, G4 be inducedSubgraph of G3, V;
  A1: V is non empty Subset of the_Vertices_of G3 by Def7;
  then A2: the_Vertices_of G4 = V by GLIB_000:def 37
    .= the_Vertices_of G2 by GLIB_000:def 37;
  A3: the_Edges_of G4 misses the_Edges_of G2
  proof
    assume the_Edges_of G4 meets the_Edges_of G2;
    then consider e being object such that
      A4: e in the_Edges_of G4 & e in the_Edges_of G2 by XBOOLE_0:3;
    A5: e in the_Edges_of G1 \/ the_Edges_of G3 by A4, XBOOLE_0:def 3;
    the_Edges_of G3 misses the_Edges_of G1 by Def7;
    hence contradiction by A4, A5, XBOOLE_0:5;
  end;
  now
    let v,w be Vertex of G2;
    hereby
      given e2 being object such that
        A6: e2 Joins v,w,G2;
      A7: e2 Joins v,w,G1 by A6, GLIB_000:72;
      given e4 being object such that
        A8: e4 Joins v,w,G4;
      e4 Joins v,w,G3 by A8, GLIB_000:72;
      hence contradiction by A7, Th64;
    end;
    assume A9: not ex e4 being object st e4 Joins v,w,G4;
    ex e1 being object st e1 Joins v,w,G1
    proof
      assume A10: not ex e1 being object st e1 Joins v,w,G1;
      the_Vertices_of G2 c= the_Vertices_of G1;
      then v is Vertex of G1 & w is Vertex of G1 by TARSKI:def 3;
      then consider e3 being object such that
        A11: e3 Joins v,w,G3 by A10, Def7;
      the_Vertices_of G2 = V by GLIB_000:def 37;
      then e3 in G3.edgesBetween(V) by A11, GLIB_000:32;
      then e3 in the_Edges_of G4 & e3 is set by A1, GLIB_000:def 37;
      then e3 Joins v,w,G4 by A11, GLIB_000:73;
      hence contradiction by A9;
    end;
    then consider e1 being object such that
      A12: e1 Joins v,w,G1;
    take e1;
    the_Vertices_of G2 = V by GLIB_000:def 37;
    then e1 in G1.edgesBetween(V) by A12, GLIB_000:32;
    then e1 in the_Edges_of G2 & e1 is set by GLIB_000:def 37;
    hence e1 Joins v,w,G2 by A12, GLIB_000:73;
  end;
  hence thesis by A2, A3, Def7;
end;

theorem
  for G1 being _Graph, V being proper Subset of the_Vertices_of G1
  for G2 being removeVertices of G1, V
  for G3 being LGraphComplement of G1, G4 being removeVertices of G3, V
  holds G4 is LGraphComplement of G2
proof
  let G1 be _Graph, V be proper Subset of the_Vertices_of G1;
  let G2 be removeVertices of G1, V;
  let G3 be LGraphComplement of G1, G4 be removeVertices of G3, V;
  the_Vertices_of G1 \ V is non empty Subset of the_Vertices_of G1 &
    the_Vertices_of G1 \ V = the_Vertices_of G3 \ V
    by Def7, XBOOLE_1:105, GLIBPRE0:6;
  hence thesis by Th69;
end;

:: involutiveness of graph complement (LC case)
theorem
  for G1 being non-multi _Graph, G2 being LGraphComplement of G1
  holds G1 is LGraphComplement of G2
proof
  let G1 be non-multi _Graph, G2 be LGraphComplement of G1;
  A1: the_Vertices_of G1 = the_Vertices_of G2 &
    the_Edges_of G1 misses the_Edges_of G2 by Def7;
  now
    let v,w be Vertex of G2;
    v is Vertex of G1 & w is Vertex of G1 by Def7;
    hence (ex e2 being object st e2 Joins v,w,G2) iff
      (not ex e1 being object st e1 Joins v,w,G1) by Def7;
  end;
  hence thesis by A1, Def7;
end;

theorem Th72:
  for G1 being _Graph, G2 being LGraphComplement of G1
  holds G1.order() = G2.order() by Def7;

theorem Th73:
  for G1 being _Graph, G2 being LGraphComplement of G1 holds
    (G1 is _trivial iff G2 is _trivial) &
    (G1 is loopfull iff G2 is loopless) &
    (G1 is loopless iff G2 is loopfull)
proof
  let G1 be _Graph, G2 be LGraphComplement of G1;
  hereby
    assume G1 is _trivial;
    then 1 = G1.order() by GLIB_000:26
      .= G2.order() by Th72;
    hence G2 is _trivial by GLIB_000:26;
  end;
  hereby
    assume G2 is _trivial;
    then 1 = G2.order() by GLIB_000:26
      .= G1.order() by Th72;
    hence G1 is _trivial by GLIB_000:26;
  end;
  hereby
    assume A1: G1 is loopfull;
    now
      let v be object;
      given e2 being object such that
        A2: e2 Joins v,v,G2;
      v in the_Vertices_of G2 by A2, GLIB_000:13;
      then v in the_Vertices_of G1 by Def7;
      then consider e1 being object such that
        A3: e1 Joins v,v,G1 by A1;
      thus contradiction by A2, A3, Th64;
    end;
    hence G2 is loopless by GLIB_000:18;
  end;
  hereby
    assume A4: G2 is loopless;
    now
      let v be Vertex of G1;
      assume not ex e1 being object st e1 Joins v,v,G1;
      then ex e2 being object st e2 Joins v,v,G2 by Def7;
      hence contradiction by A4, GLIB_000:18;
    end;
    hence G1 is loopfull;
  end;
  hereby
    assume A5: G1 is loopless;
    now
      let v be Vertex of G2;
      A6: v is Vertex of G1 by Def7;
      assume not ex e2 being object st e2 Joins v,v,G2;
      then ex e1 being object st e1 Joins v,v,G1 by A6, Def7;
      hence contradiction by A5, GLIB_000:18;
    end;
    hence G2 is loopfull;
  end;
  hereby
    assume A7: G2 is loopfull;
    now
      let v be object;
      given e1 being object such that
        A8: e1 Joins v,v,G1;
      v in the_Vertices_of G1 by A8, GLIB_000:13;
      then v in the_Vertices_of G2 by Def7;
      then consider e2 being object such that
        A9: e2 Joins v,v,G2 by A7;
      thus contradiction by A8, A9, Th64;
    end;
    hence G1 is loopless by GLIB_000:18;
  end;
end;

registration
  let G be _trivial _Graph;
  cluster -> _trivial for LGraphComplement of G;
  coherence by Th73;
end;

registration
  let G be non _trivial _Graph;
  cluster -> non _trivial for LGraphComplement of G;
  coherence by Th73;
end;

registration
  let G be loopfull _Graph;
  cluster -> loopless for LGraphComplement of G;
  coherence by Th73;
end;

registration
  let G be non loopfull _Graph;
  cluster -> non loopless for LGraphComplement of G;
  coherence by Th73;
end;

registration
  let G be loopless _Graph;
  cluster -> loopfull for LGraphComplement of G;
  coherence by Th73;
end;

registration
  let G be non loopless _Graph;
  cluster -> non loopfull for LGraphComplement of G;
  coherence by Th73;
end;

theorem Th74:
  for G1 being _Graph, G2 being LGraphComplement of G1
  st the_Edges_of G1 = G1.loops() holds G2 is complete
proof
  let G1 be _Graph, G2 be LGraphComplement of G1;
  assume A1: the_Edges_of G1 = G1.loops();
  now
    let v,w be Vertex of G2;
    A2: v is Vertex of G1 & w is Vertex of G1 by Def7;
    assume A3: v <> w;
    not ex e1 being object st e1 Joins v,w,G1
    proof
      given e1 being object such that
        A4: e1 Joins v,w,G1;
      not e1 in G1.loops() by A3, A4, GLIB_009:46;
      hence contradiction by A1, A4, GLIB_000:def 13;
    end;
    then consider e2 being object such that
      A5: e2 Joins v,w,G2 by A2, Def7;
    thus v,w are_adjacent by A5, CHORD:def 3;
  end;
  hence thesis by CHORD:def 6;
end;

registration
  let G be edgeless _Graph;
  cluster -> complete for LGraphComplement of G;
  coherence
  proof
    let G2 be LGraphComplement of G;
    the_Edges_of G = {} & G.loops() = {};
    hence thesis by Th74;
  end;
end;

theorem Th75:
  for G1 being complete _Graph, G2 being LGraphComplement of G1
  holds the_Edges_of G2 = G2.loops()
proof
  let G1 be complete _Graph, G2 be LGraphComplement of G1;
  now
    let e be object;
    set v = (the_Source_of G2).e, w = (the_Target_of G2).e;
    assume e in the_Edges_of G2;
    then A1: e Joins v,w,G2 by GLIB_000:def 13;
    v = w
    proof
      assume A2: v <> w;
      v is Vertex of G2 & w is Vertex of G2 by A1, GLIB_000:13;
      then reconsider v0=v, w0=w as Vertex of G1 by Def7;
      ex e0 being object st e0 Joins v0,w0,G1 by A2, CHORD:def 3, CHORD:def 6;
      hence contradiction by A1, Th64;
    end;
    hence e in G2.loops() by A1, GLIB_009:def 2;
  end;
  then the_Edges_of G2 c= G2.loops() by TARSKI:def 3;
  hence thesis by XBOOLE_0:def 10;
end;

registration
  let G be complete loopfull _Graph;
  cluster -> edgeless for LGraphComplement of G;
  coherence
  proof
    let G2 be LGraphComplement of G;
    the_Edges_of G2 = G2.loops() by Th75
      .= {};
    hence thesis;
  end;
end;

registration
  let G be non connected _Graph;
  cluster -> connected for LGraphComplement of G;
  coherence
  proof
    let G2 be LGraphComplement of G;
    consider w1, w2 being Vertex of G such that
      A1: for W being Walk of G holds not W is_Walk_from w1,w2
      by GLIB_002:def 1;
    not ex e being object st e Joins w1,w2,G
    proof
      given e being object such that
        A2: e Joins w1,w2,G;
      G.walkOf(w1,e,w2) is_Walk_from w1,w2 by A2, GLIB_001:15;
      hence contradiction by A1;
    end;
    then consider e being object such that
      A3: e Joins w1,w2,G2 by Def7;
    now
      let v1,v2 be Vertex of G2;
      reconsider u1=v1, u2=v2 as Vertex of G by Def7;
      per cases;
      suppose A4: (ex e1 being object st e1 Joins v1,w1,G) &
          (ex e2 being object st e2 Joins v2,w2,G);
        then consider e1 being object such that
          A5: e1 Joins v1,w1,G;
        consider e2 being object such that
          A6: e2 Joins v2,w2,G by A4;
        not ex e3 being object st e3 Joins u1,w2,G
        proof
          given e3 being object such that
            A7: e3 Joins u1,w2,G;
          set W2 = G.walkOf(v1,e3,w2);
          A8: W2 is_Walk_from v1,w2 by A7, GLIB_001:15;
          set W1 = G.walkOf(w1,e1,v1);
          e1 Joins w1,v1,G by A5, GLIB_000:14;
          then W1 is_Walk_from w1,v1 by GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A8, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e3 being object such that
          A9: e3 Joins u1,w2,G2 by Def7;
        not ex e4 being object st e4 Joins w1,u2,G
        proof
          given e4 being object such that
            A10: e4 Joins w1,u2,G;
          set W1 = G.walkOf(w1,e4,u2);
          A11: W1 is_Walk_from w1,v2 by A10, GLIB_001:15;
          set W2 = G.walkOf(v2,e2,w2);
          W2 is_Walk_from v2,w2 by A6, GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A11, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e4 being object such that
          A12: e4 Joins w1,u2,G2 by Def7;
        set W1 = G2.walkOf(v1,e3,w2), W2 = G2.walkOf(w2,e,w1),
          W3 = G2.walkOf(w1,e4,v2);
        reconsider W = W1.append(W2).append(W3) as Walk of G2;
        take W;
        A13: W1 is_Walk_from v1,w2 by A9, GLIB_001:15;
        e Joins w2,w1,G2 by A3, GLIB_000:14;
        then W2 is_Walk_from w2,w1 by GLIB_001:15;
        then A14: W1.append(W2) is_Walk_from v1,w1 by A13, GLIB_001:31;
        W3 is_Walk_from w1,v2 by A12, GLIB_001:15;
        hence W is_Walk_from v1,v2 by A14, GLIB_001:31;
      end;
      suppose A15: (not ex e1 being object st e1 Joins v1,w1,G) &
          (ex e2 being object st e2 Joins v2,w2,G);
        then consider e2 being object such that
          A16: e2 Joins v2,w2,G;
        consider e3 being object such that
          A17: e3 Joins u1,w1,G2 by A15, Def7;
        not ex e4 being object st e4 Joins w1,u2,G
        proof
          given e4 being object such that
            A18: e4 Joins w1,u2,G;
          set W1 = G.walkOf(w1,e4,u2);
          A19: W1 is_Walk_from w1,v2 by A18, GLIB_001:15;
          set W2 = G.walkOf(v2,e2,w2);
          W2 is_Walk_from v2,w2 by A16, GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A19, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e4 being object such that
          A20: e4 Joins w1,u2,G2 by Def7;
        set W1 = G2.walkOf(v1,e3,w1), W2 = G2.walkOf(w1,e4,v2);
        reconsider W = W1.append(W2) as Walk of G2;
        take W;
        A21: W1 is_Walk_from v1,w1 by A17, GLIB_001:15;
        W2 is_Walk_from w1,v2 by A20, GLIB_001:15;
        hence W is_Walk_from v1,v2 by A21, GLIB_001:31;
      end;
      suppose A22: (ex e1 being object st e1 Joins v1,w1,G) &
          (not ex e2 being object st e2 Joins v2,w2,G);
        then consider e1 being object such that
          A23: e1 Joins v1,w1,G;
        not ex e3 being object st e3 Joins u1,w2,G
        proof
          given e3 being object such that
            A24: e3 Joins u1,w2,G;
          set W2 = G.walkOf(v1,e3,w2);
          A25: W2 is_Walk_from v1,w2 by A24, GLIB_001:15;
          set W1 = G.walkOf(w1,e1,v1);
          e1 Joins w1,v1,G by A23, GLIB_000:14;
          then W1 is_Walk_from w1,v1 by GLIB_001:15;
          then W1.append(W2) is_Walk_from w1,w2 by A25, GLIB_001:31;
          hence contradiction by A1;
        end;
        then consider e3 being object such that
          A26: e3 Joins u1,w2,G2 by Def7;
        consider e4 being object such that
          A27: e4 Joins u2,w2,G2 by A22, Def7;
        set W1 = G2.walkOf(v1,e3,w2), W2 = G2.walkOf(w2,e4,v2);
        reconsider W = W1.append(W2) as Walk of G2;
        take W;
        A28: W1 is_Walk_from v1,w2 by A26, GLIB_001:15;
        e4 Joins w2,v2,G2 by A27, GLIB_000:14;
        then W2 is_Walk_from w2,v2 by GLIB_001:15;
        hence W is_Walk_from v1,v2 by A28, GLIB_001:31;
      end;
      suppose A29: (not ex e1 being object st e1 Joins v1,w1,G) &
          (not ex e2 being object st e2 Joins v2,w2,G);
        then consider e3 being object such that
          A30: e3 Joins u1,w1,G2 by Def7;
        consider e4 being object such that
          A31: e4 Joins u2,w2,G2 by A29, Def7;
        set W1 = G2.walkOf(v1,e3,w1), W2 = G2.walkOf(w1,e,w2),
          W3 = G2.walkOf(w2,e4,v2);
        reconsider W = W1.append(W2).append(W3) as Walk of G2;
        take W;
        A32: W1 is_Walk_from v1,w1 by A30, GLIB_001:15;
        W2 is_Walk_from w1,w2 by A3, GLIB_001:15;
        then A33: W1.append(W2) is_Walk_from v1,w2 by A32, GLIB_001:31;
        e4 Joins w2,v2,G2 by A31, GLIB_000:14;
        then W3 is_Walk_from w2,v2 by GLIB_001:15;
        hence W is_Walk_from v1,v2 by A33, GLIB_001:31;
      end;
    end;
    hence thesis by GLIB_002:def 1;
  end;
end;

theorem
  for G1 being _Graph, G2 being LGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2 st v1 = v2 holds
    (v1 is isolated implies v2 is non isolated) &
    (v1 is endvertex implies v2 is non endvertex)
proof
  let G1 be _Graph, G2 be LGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  hereby
    assume v1 is isolated;
    then not ex e1 being object st e1 Joins v1,v1,G1 by GLIB_000:143;
    then consider e2 being object such that
      A2: e2 Joins v1,v1,G2 by Def7;
    thus v2 is non isolated by A1, A2, GLIB_000:143;
  end;
  hereby
    assume v1 is endvertex;
    then not ex e1 being object st e1 Joins v1,v1,G1 by GLIB_000:146;
    then consider e2 being object such that
      A3: e2 Joins v1,v1,G2 by Def7;
    thus v2 is non endvertex by A1, A3, GLIB_000:146;
  end;
end;

theorem Th77:
  for G1 being _Graph, G2 being LGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2 st v1 = v2
  holds v2.allNeighbors() = the_Vertices_of G2 \ v1.allNeighbors()
proof
  let G1 be _Graph, G2 be LGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  now
    let x be object;
    hereby
      assume x in v2.allNeighbors();
      then consider e being object such that
        A2: e Joins v2,x,G2 by GLIB_000:71;
      A3: x in the_Vertices_of G2 by A2, GLIB_000:13;
      then reconsider w = x as Vertex of G1 by Def7;
      not ex e0 being object st e0 Joins v1,w,G1 by A1, A2, Def7;
      then not x in v1.allNeighbors() by GLIB_000:71;
      hence x in the_Vertices_of G2 \ v1.allNeighbors() by A3, XBOOLE_0:def 5;
    end;
    assume x in the_Vertices_of G2 \ v1.allNeighbors();
    then A4: x in the_Vertices_of G2 & not x in v1.allNeighbors()
      by XBOOLE_0:def 5;
    then reconsider w = x as Vertex of G1 by Def7;
    not ex e0 being object st e0 Joins v1,w,G1 by A4, GLIB_000:71;
    then consider e being object such that
      A5: e Joins v1,w,G2 by Def7;
    thus x in v2.allNeighbors() by A1, A5, GLIB_000:71;
  end;
  hence v2.allNeighbors() = the_Vertices_of G2 \ v1.allNeighbors() by TARSKI:2;
end;

theorem
  for G1 being _Graph, G2 being LGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & v1 is isolated
  holds v2.allNeighbors() = the_Vertices_of G2
proof
  let G1 be _Graph, G2 be LGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & v1 is isolated;
  then v1.allNeighbors() = {} by GLIB_000:113;
  hence v2.allNeighbors() = the_Vertices_of G2 \ {} by A1, Th77
    .= the_Vertices_of G2;
end;

begin :: Directed Graph Complement without Loops

definition
  let G be _Graph;
  mode DGraphComplement of G -> Dsimple _Graph means
  :Def8:
  ex G9 being DLGraphComplement of G st it is removeLoops of G9;
  existence
  proof
    set G1 = the DLGraphComplement of G;
    take the removeLoops of G1;
    thus thesis;
  end;
end;

theorem Th79:
  for G1, G2, G3 being _Graph, G4 being DGraphComplement of G1
  st G1 == G2 & G3 == G4 holds G3 is DGraphComplement of G2
proof
  let G1, G2, G3 be _Graph, G4 be DGraphComplement of G1;
  assume A1: G1 == G2 & G3 == G4;
  consider G9 being DLGraphComplement of G1 such that
    A2: G4 is removeLoops of G9 by Def8;
  G9 is DLGraphComplement of G2 & G3 is removeLoops of G9
    by A1, A2, Th45, GLIB_009:59;
  hence thesis by Def8;
end;

registration
  let G be _Graph;
  cluster plain for DGraphComplement of G;
  existence
  proof
    set G1 = the DGraphComplement of G;
    set G2 = G1 | _GraphSelectors;
    G1 == G1 & G1 == G2 by GLIB_000:128;
    then reconsider G2 as DGraphComplement of G by Th79;
    take G2;
    thus thesis;
  end;
end;

theorem Th80:
  for G1 being _Graph, G2 being Dsimple _Graph
  holds G2 is DGraphComplement of G1 iff
    the_Vertices_of G2 = the_Vertices_of G1 &
    the_Edges_of G2 misses the_Edges_of G1 &
    for v,w being Vertex of G1 st v <> w holds
      (ex e1 being object st e1 DJoins v,w,G1) iff
      (not ex e2 being object st e2 DJoins v,w,G2)
proof
  let G1 be _Graph, G2 be Dsimple _Graph;
  :: the first direction is straight forward
  hereby
    assume G2 is DGraphComplement of G1;
    then consider G9 being DLGraphComplement of G1 such that
      A1: G2 is removeLoops of G9 by Def8;
    thus the_Vertices_of G2 = the_Vertices_of G9 by A1, GLIB_000:def 33
      .= the_Vertices_of G1 by Def6;
    A2: the_Edges_of G2 c= the_Edges_of G9 by A1, GLIB_000:def 32;
    the_Edges_of G9 misses the_Edges_of G1 by Def6;
    hence the_Edges_of G2 misses the_Edges_of G1 by A2, XBOOLE_1:63;
    let v,w be Vertex of G1;
    assume A3: v <> w;
    hereby
      given e1 being object such that
        A4: e1 DJoins v,w,G1;
      given e2 being object such that
        A5: e2 DJoins v,w,G2;
      e2 DJoins v,w,G9 by A1, A5, GLIB_000:72;
      hence contradiction by A4, Th46;
    end;
    assume A6: not ex e2 being object st e2 DJoins v,w,G2;
    not ex e9 being object st e9 DJoins v,w,G9
    proof
      given e9 being object such that
        A7: e9 DJoins v,w,G9;
      A8: e9 in the_Edges_of G9 by A7, GLIB_000:def 14;
      e9 Joins v,w,G9 by A7, GLIB_000:16;
      then not e9 in G9.loops() by A3, GLIB_009:46;
      then e9 in the_Edges_of G9 \ G9.loops() by A8, XBOOLE_0:def 5;
      then A9: e9 in the_Edges_of G2 by A1, GLIB_000:53;
      e9 DJoins v,w,G2 by A1, A7, A9, GLIB_000:73;
      hence contradiction by A6;
    end;
    hence ex e1 being object st e1 DJoins v,w,G1 by Def6;
  end;
  :: for the second direction we need to add loops to G2 to get a G9
  :: but the loops must be distinct from both the edges of G1 and of G2,
  :: so some construction is needed (except if G1 is already loopfull)
  assume that A10: the_Vertices_of G2 = the_Vertices_of G1 &
      the_Edges_of G2 misses the_Edges_of G1 and
    A11: for v,w being Vertex of G1 st v <> w holds
      (ex e1 being object st e1 DJoins v,w,G1) iff
      (not ex e2 being object st e2 DJoins v,w,G2);
  per cases;
  suppose A12: G1 is non loopfull;
    defpred P[object] means not ex e being object st e Joins $1,$1,G1;
    consider V being Subset of the_Vertices_of G2 such that
      A13: for x being set holds x in V iff x in the_Vertices_of G2 & P[x]
      from SUBSET_1:sch 1;
    A14: V is non empty by A10, A12, A13;
    set E = the set of all [{the_Edges_of G1,the_Edges_of G2},v]
      where v is Element of V;
    deffunc F(object) = $1`2;
    consider f being Function such that
      A15: dom f = E & for x being object st x in E holds f.x = F(x)
      from FUNCT_1:sch 3;
    now
      let x1,x2 be object;
      assume A16: x1 in dom f & x2 in dom f & f.x1 = f.x2;
      then consider v1 being Element of V such that
        A17: x1 = [{the_Edges_of G1,the_Edges_of G2},v1] by A15;
      consider v2 being Element of V such that
        A18: x2 = [{the_Edges_of G1,the_Edges_of G2},v2] by A15, A16;
      v1 = [{the_Edges_of G1,the_Edges_of G2},v1]`2
        .= f.x1 by A15, A16, A17
        .= [{the_Edges_of G1,the_Edges_of G2},v2]`2 by A15, A16, A18
        .= v2;
      hence x1 = x2 by A17, A18;
    end;
    then reconsider f as one-to-one Function by FUNCT_1:def 4;
    now
      let y be object;
      hereby
        assume y in rng f;
        then consider x being object such that
          A19: x in dom f & f.x = y by FUNCT_1:def 3;
        consider v being Element of V such that
          A20: x = [{the_Edges_of G1,the_Edges_of G2},v] by A15, A19;
        y = [{the_Edges_of G1,the_Edges_of G2},v]`2 by A15, A19, A20
          .= v;
        hence y in V by A14;
      end;
      set x = [{the_Edges_of G1,the_Edges_of G2},y];
      assume y in V;
      then A21: x in E;
      then f.x = [{the_Edges_of G1,the_Edges_of G2},y]`2 by A15
        .= y;
      hence y in rng f by A15, A21, FUNCT_1:3;
    end;
    then A22: rng f = V by TARSKI:2;
    A23: E misses the_Edges_of G1
    proof
      assume E meets the_Edges_of G1;
      then consider e being object such that
        A24: e in E & e in the_Edges_of G1 by XBOOLE_0:3;
      reconsider e as set by TARSKI:1;
      consider v being Element of V such that
        A25: e = [{the_Edges_of G1,the_Edges_of G2},v] by A24;
      A26: e = {{{the_Edges_of G1,the_Edges_of G2}, v},
        {{the_Edges_of G1,the_Edges_of G2}}} by A25, TARSKI:def 5;
      A27: the_Edges_of G1 in
        {the_Edges_of G1, the_Edges_of G2} by TARSKI:def 2;
      A28: {the_Edges_of G1, the_Edges_of G2} in
        {{the_Edges_of G1, the_Edges_of G2}} by TARSKI:def 1;
      {{the_Edges_of G1, the_Edges_of G2}} in e by A26, TARSKI:def 2;
      hence contradiction by A24, A27, A28, XREGULAR:8;
    end;
    A29: E misses the_Edges_of G2
    proof
      assume E meets the_Edges_of G2;
      then consider e being object such that
        A30: e in E & e in the_Edges_of G2 by XBOOLE_0:3;
      reconsider e as set by TARSKI:1;
      consider v being Element of V such that
        A31: e = [{the_Edges_of G1,the_Edges_of G2},v] by A30;
      A32: e = {{{the_Edges_of G1,the_Edges_of G2}, v},
        {{the_Edges_of G1,the_Edges_of G2}}} by A31, TARSKI:def 5;
      A33: the_Edges_of G2 in
        {the_Edges_of G1, the_Edges_of G2} by TARSKI:def 2;
      A34: {the_Edges_of G1, the_Edges_of G2} in
        {{the_Edges_of G1, the_Edges_of G2}} by TARSKI:def 1;
      {{the_Edges_of G1, the_Edges_of G2}} in e by A32, TARSKI:def 2;
      hence contradiction by A30, A33, A34,  XREGULAR:8;
    end;
    set s = the_Source_of G2 +* f;
    now
      thus dom s = dom the_Source_of G2 \/ dom f by FUNCT_4:def 1
        .= the_Edges_of G2 \/ E by A15, FUNCT_2:def 1;
      A35: rng s c= rng the_Source_of G2 \/ rng f by FUNCT_4:17;
      rng the_Source_of G2 \/ rng f c= the_Vertices_of G2 by A22, XBOOLE_1:8;
      hence rng s c= the_Vertices_of G2 by A35, XBOOLE_1:1;
    end;
    then reconsider s as Function of the_Edges_of G2 \/ E, the_Vertices_of G2
      by FUNCT_2:2;
    set t = the_Target_of G2 +* f;
    now
      thus dom t = dom the_Target_of G2 \/ dom f by FUNCT_4:def 1
        .= the_Edges_of G2 \/ E by A15, FUNCT_2:def 1;
      A36: rng t c= rng the_Target_of G2 \/ rng f by FUNCT_4:17;
      rng the_Target_of G2 \/ rng f c= the_Vertices_of G2 by A22, XBOOLE_1:8;
      hence rng t c= the_Vertices_of G2 by A36, XBOOLE_1:1;
    end;
    then reconsider t as Function of the_Edges_of G2 \/ E, the_Vertices_of G2
      by FUNCT_2:2;
    set G9 = createGraph(the_Vertices_of G2,the_Edges_of G2 \/ E,s,t);
    :: show that G9 is addLoops
    now
      :: for that first show that G9 is Supergraph
      now
        thus the_Vertices_of G2 c= the_Vertices_of G9;
        thus the_Edges_of G2 c= the_Edges_of G9 by XBOOLE_1:7;
        let e be set;
        assume A37: e in the_Edges_of G2;
        then e in the_Edges_of G2 \/ E by XBOOLE_0:def 3;
        then A38: not e in dom f by A15, A29, A37, XBOOLE_0:5;
        hence (the_Source_of G2).e = (the_Source_of G2 +* f).e by FUNCT_4:11
          .= (the_Source_of G9).e;
        thus (the_Target_of G2).e = (the_Target_of G2 +* f).e
            by A38, FUNCT_4:11
          .= (the_Target_of G9).e;
      end;
      hence G9 is Supergraph of G2 by GLIB_006:def 9;
      thus the_Vertices_of G9 = the_Vertices_of G2;
      reconsider E as set;
      reconsider f as one-to-one Function;
      take E, f;
      thus E misses the_Edges_of G2 by A29;
      thus the_Edges_of G9 = the_Edges_of G2 \/ E;
      thus dom f = E by A15;
      thus rng f = V by A22;
      thus the_Source_of G9 = the_Source_of G2 +* f;
      thus the_Target_of G9 = the_Target_of G2 +* f;
    end;
    then A39: G9 is addLoops of G2, V by Def5;
    then G2 == the removeLoops of G9 by Th26;
    then A40: G2 is removeLoops of G9 by GLIB_009:59;
    A41: G9 is non-Dmulti by A39;
    :: show that G9 is DLGraphComplement
    now
      thus the_Vertices_of G9 = the_Vertices_of G1 by A10;
      thus the_Edges_of G9 misses the_Edges_of G1 by A10, A23, XBOOLE_1:70;
      let v,w be Vertex of G1;
      hereby
        given e1 being object such that
          A43: e1 DJoins v,w,G1;
        given e2 being object such that
          A44: e2 DJoins v,w,G9;
        per cases by A39, A44, GLIB_006:71;
        suppose A45: e2 DJoins v,w,G2;
          then v <> w by GLIB_000:136;
          hence contradiction by A11, A43, A45;
        end;
        suppose A46: not e2 in the_Edges_of G2;
          e2 in the_Edges_of G9 by A44, GLIB_000:def 14;
          then A47: e2 in E by A46, XBOOLE_0:def 3;
          then consider u being Element of V such that
            A48: e2 = [{the_Edges_of G1,the_Edges_of G2},u];
          A49: not ex e being object st e Joins u,u,G1 by A13, A14;
          A50: v = (the_Source_of G9).e2 by A44, GLIB_000:def 14
             .= s.e2
             .= f.e2 by A15, A47, FUNCT_4:13
             .= [{the_Edges_of G1,the_Edges_of G2},u]`2 by A15, A47, A48
             .= u;
          A51: w = (the_Target_of G9).e2 by A44, GLIB_000:def 14
             .= t.e2
             .= f.e2 by A15, A47, FUNCT_4:13
             .= [{the_Edges_of G1,the_Edges_of G2},u]`2 by A15, A47, A48
             .= u;
          e1 Joins v,w,G1 by A43, GLIB_000:16;
          hence contradiction by A49, A50, A51;
        end;
      end;
      assume A52: not ex e2 being object st e2 DJoins v,w,G9;
      assume A53: not ex e1 being object st e1 DJoins v,w,G1;
      per cases;
      suppose A54: v <> w;
        not ex e2 being object st e2 DJoins v,w,G2 by A39, A52, GLIB_006:70;
        hence contradiction by A11, A53, A54;
      end;
      suppose A55: v = w;
        set e = [{the_Edges_of G1,the_Edges_of G2},v];
        A56: not ex e1 being object st e1 Joins v,v,G1
        proof
          given e1 being object such that
            A57: e1 Joins v,v,G1;
          e1 DJoins v,v,G1 by A57, GLIB_000:16;
          hence contradiction by A53, A55;
        end;
        v in V by A10, A13, A56;
        then A58: e in E;
        then A59: e in the_Edges_of G9 by XBOOLE_0:def 3;
        A60: (the_Source_of G9).e = s.e
          .= f.e by A15, A58, FUNCT_4:13
          .= e`2 by A15, A58
          .= v;
        (the_Target_of G9).e = t.e
          .= f.e by A15, A58, FUNCT_4:13
          .= e`2 by A15, A58
          .= v;
        hence contradiction by A52, A55, A59, A60, GLIB_000:def 14;
      end;
    end;
    then G9 is DLGraphComplement of G1 by A41, Def6;
    hence thesis by A40, Def8;
  end;
  suppose A61: G1 is loopfull;
    now
      let v,w be Vertex of G1;
      hereby
        given e1 being object such that
          A62: e1 DJoins v,w,G1;
        per cases;
        suppose v <> w;
          hence not ex e2 being object st e2 DJoins v,w,G2 by A11, A62;
        end;
        suppose v = w;
          hence not ex e2 being object st e2 DJoins v,w,G2 by GLIB_000:136;
        end;
      end;
      assume A63: not ex e2 being object st e2 DJoins v,w,G2;
      per cases;
      suppose v <> w;
        hence ex e1 being object st e1 DJoins v,w,G1 by A11, A63;
      end;
      suppose v = w;
        hence ex e1 being object st e1 DJoins v,w,G1 by A61, Th1;
      end;
    end;
    then A64: G2 is DLGraphComplement of G1 by A10, Def6;
    G2 is removeLoops of G2 by GLIB_009:58;
    hence thesis by A64, Def8;
  end;
end;

theorem Th81:
  for G1 being _Graph, G2 being DGraphComplement of G1, e1,e2,v,w being object
  holds e1 DJoins v,w,G1 implies not e2 DJoins v,w,G2
proof
  let G1 be _Graph, G2 be DGraphComplement of G1;
  let e1,e2,v,w be object;
  assume A1: e1 DJoins v,w,G1;
  per cases;
  suppose A2: v <> w;
    e1 Joins v,w,G1 by A1, GLIB_000:16;
    then v is Vertex of G1 & w is Vertex of G1 by GLIB_000:13;
    hence thesis by A1, A2, Th80;
  end;
  suppose v = w;
    hence thesis by GLIB_000:136;
  end;
end;

theorem Th82:
  for G1 being _Graph, G2 being DSimpleGraph of G1
  for G3 being DGraphComplement of G1
  holds G3 is DGraphComplement of G2
proof
  let G1 be _Graph, G2 be DSimpleGraph of G1;
  let G3 be DGraphComplement of G1;
  consider E being RepDEdgeSelection of G1 such that
    A1: G2 is inducedSubgraph of G1, the_Vertices_of G1, E\G1.loops()
    by GLIB_009:def 10;
  the_Vertices_of G1 c= the_Vertices_of G1 &
    the_Edges_of G1 = G1.edgesBetween(the_Vertices_of G1) by GLIB_000:34;
  then A2: the_Vertices_of G2 = the_Vertices_of G1 &
    the_Edges_of G2 = E \ G1.loops() by A1, GLIB_000:def 37;
  then A3: the_Vertices_of G3 = the_Vertices_of G2 by Th80;
  the_Edges_of G3 misses the_Edges_of G1 by Th80;
  then A4: the_Edges_of G3 misses the_Edges_of G2 by XBOOLE_1:63;
  now
    let v,w be Vertex of G2;
    assume A5: v <> w;
    A6: v is Vertex of G1 & w is Vertex of G1 by GLIB_000:def 33;
    reconsider v1=v, w1=w as Vertex of G1 by GLIB_000:def 33;
    hereby
      given e2 being object such that
        A7: e2 DJoins v,w,G2;
      A8: e2 DJoins v,w,G1 by A7, GLIB_000:72;
      given e3 being object such that
        A9: e3 DJoins v,w,G3;
      thus contradiction by A8, A9, Th81;
    end;
    assume not ex e3 being object st e3 DJoins v,w,G3;
    then consider e1 being object such that
      A10: e1 DJoins v,w,G1 by A6, A5, Th80;
    consider e2 being object such that
      A11: e2 DJoins v,w,G1 & e2 in E and
      for e9 being object st e9 DJoins v,w,G1 & e9 in E holds e9 = e2
      by A10, GLIB_009:def 6;
    take e2;
    e2 Joins v,w,G1 by A11, GLIB_000:16;
    then not e2 in G1.loops() by A5, GLIB_009:46;
    then e2 in the_Edges_of G2 by A2, A11, XBOOLE_0:def 5;
    hence e2 DJoins v,w,G2 by A11, GLIB_000:73;
  end;
  hence thesis by A3, A4, Th80;
end;

theorem Th83:
  for G1, G2 being _Graph
  for G3 being DSimpleGraph of G1, G4 being DSimpleGraph of G2
  for G5 being DGraphComplement of G1, G6 being DGraphComplement of G2
  st G4 is G3-Disomorphic holds G6 is G5-Disomorphic
proof
  let G1, G2 be _Graph;
  let G3 be DSimpleGraph of G1, G4 be DSimpleGraph of G2;
  let G5 be DGraphComplement of G1, G6 be DGraphComplement of G2;
  A1: G5 is DGraphComplement of G3 & G6 is DGraphComplement of G4 by Th82;
  assume G4 is G3-Disomorphic;
  then consider f being directed PVertexMapping of G3, G4 such that
    A2: f is Disomorphism by GLIB_011:50;
  A3: the_Vertices_of G3 = the_Vertices_of G5 &
    the_Vertices_of G4 = the_Vertices_of G6 by A1, Th80;
  then reconsider g = f as PartFunc of the_Vertices_of G5, the_Vertices_of G6;
  now
    let v,w,e be object;
    assume A4: v in dom g & w in dom g & e DJoins v,w,G5;
    then A5: v <> w by GLIB_000:136;
    then A6: g.v <> g.w by A2, A4, FUNCT_1:def 4;
    A7: not ex e3 being object st e3 DJoins v,w,G3 by A1, A3, A4, A5, Th80;
    thus ex e6 being object st e6 DJoins g.v,g.w,G6
    proof
      assume A8: not ex e6 being object st e6 DJoins g.v,g.w,G6;
      g.v in rng f & g.w in rng f by A4, FUNCT_1:3;
      then consider e4 being object such that
        A9: e4 DJoins g.v,g.w,G4 by A1, A6, A8, Th80;
      consider e3 being object such that
        A10: e3 DJoins v,w,G3 by A2, A4, A9, GLIB_011:def 4;
      thus contradiction by A7, A10;
    end;
  end;
  then reconsider g as directed PVertexMapping of G5, G6 by GLIB_011:4;
  now
    let v,w,e6 be object;
    assume A11: v in dom g & w in dom g & e6 DJoins g.v,g.w,G6;
    A12: g.v <> g.w by A11, GLIB_000:136;
    g.v in rng f & g.w in rng f by A11, FUNCT_1:3;
    then A13: not ex e4 being object st e4 DJoins g.v,g.w,G4
      by A1, A11, A12, Th80;
    thus ex e5 being object st e5 DJoins v,w,G5
    proof
      assume not ex e5 being object st e5 DJoins v,w,G5;
      then consider e3 being object such that
        A14: e3 DJoins v,w,G3 by A1, A3, A11, A12, Th80;
      consider e4 being object such that
        A15: e4 DJoins f.v,f.w,G4 by A11, A14, GLIB_011:def 2;
      thus contradiction by A13, A15;
    end;
  end;
  then g is Dcontinuous by GLIB_011:def 4;
  hence thesis by A2, A3, GLIB_011:50;
end;

theorem Th84:
  for G1 being _Graph, G2 being G1-Disomorphic _Graph
  for G3 being DGraphComplement of G1, G4 being DGraphComplement of G2
  holds G4 is G3-Disomorphic
proof
  let G1 be _Graph, G2 be G1-Disomorphic _Graph;
  let G3 be DGraphComplement of G1, G4 be DGraphComplement of G2;
  set G5 = the DSimpleGraph of G1;
  set G6 = the DSimpleGraph of G2;
  G6 is G5-Disomorphic by GLIB_010:174;
  hence thesis by Th83;
end;

theorem Th85:
  for G1 being _Graph, G2, G3 being DGraphComplement of G1
  holds G3 is G2-Disomorphic
proof
  let G1 be _Graph, G2, G3 be DGraphComplement of G1;
  G1 is G1-Disomorphic by GLIB_010:53;
  hence thesis by Th84;
end;

theorem
  for G1 being _Graph, G2 being reverseEdgeDirections of G1
  for G3 being DGraphComplement of G1, G4 being reverseEdgeDirections of G3
  holds G4 is DGraphComplement of G2
proof
  let G1 be _Graph, G2 be reverseEdgeDirections of G1;
  let G3 be DGraphComplement of G1, G4 be reverseEdgeDirections of G3;
  A1: the_Vertices_of G4 = the_Vertices_of G3 by GLIB_007:4
    .= the_Vertices_of G1 by Th80
    .= the_Vertices_of G2 by GLIB_007:4;
  the_Edges_of G3 misses the_Edges_of G1 by Th80;
  then the_Edges_of G4 misses the_Edges_of G1 by GLIB_007:4;
  then A2: the_Edges_of G4 misses the_Edges_of G2 by GLIB_007:4;
  now
    let v,w be Vertex of G2;
    assume A3: v <> w;
    A4: v is Vertex of G1 & w is Vertex of G1 by GLIB_007:4;
    hereby
      given e2 being object such that
        A5: e2 DJoins v,w,G2;
      e2 in the_Edges_of G2 by A5, GLIB_000:def 14;
      then e2 in the_Edges_of G1 by GLIB_007:4;
      then A6: e2 DJoins w,v,G1 by A5, GLIB_007:7;
      given e4 being object such that
        A7: e4 DJoins v,w,G4;
      e4 in the_Edges_of G4 by A7, GLIB_000:def 14;
      then e4 in the_Edges_of G3 by GLIB_007:4;
      then e4 DJoins w,v,G3 by A7, GLIB_007:7;
      hence contradiction by A6, Th81;
    end;
    assume A8: not ex e4 being object st e4 DJoins v,w,G4;
    not ex e3 being object st e3 DJoins w,v,G3
    proof
      given e3 being object such that
        A9: e3 DJoins w,v,G3;
      e3 in the_Edges_of G3 by A9, GLIB_000:def 14;
      then e3 DJoins v,w,G4 by A9, GLIB_007:7;
      hence contradiction by A8;
    end;
    then consider e1 being object such that
      A10: e1 DJoins w,v,G1 by A3, A4, Th80;
    take e1;
    e1 in the_Edges_of G1 by A10, GLIB_000:def 14;
    hence e1 DJoins v,w,G2 by A10, GLIB_007:7;
  end;
  hence thesis by A1, A2, Th80;
end;

theorem Th87:
  for G1 being _Graph, V being non empty Subset of the_Vertices_of G1
  for G2 being inducedSubgraph of G1, V
  for G3 being DGraphComplement of G1, G4 being inducedSubgraph of G3, V
  holds G4 is DGraphComplement of G2
proof
  let G1 be _Graph, V be non empty Subset of the_Vertices_of G1;
  let G2 be inducedSubgraph of G1, V;
  let G3 be DGraphComplement of G1, G4 be inducedSubgraph of G3, V;
  A1: V is non empty Subset of the_Vertices_of G3 by Th80;
  then A2: the_Vertices_of G4 = V by GLIB_000:def 37
    .= the_Vertices_of G2 by GLIB_000:def 37;
  A3: the_Edges_of G4 misses the_Edges_of G2
  proof
    assume the_Edges_of G4 meets the_Edges_of G2;
    then consider e being object such that
      A4: e in the_Edges_of G4 & e in the_Edges_of G2 by XBOOLE_0:3;
    A5: e in the_Edges_of G1 \/ the_Edges_of G3 by A4, XBOOLE_0:def 3;
    the_Edges_of G3 misses the_Edges_of G1 by Th80;
    hence contradiction by A4, A5, XBOOLE_0:5;
  end;
  now
    let v,w be Vertex of G2;
    assume A6: v <> w;
    hereby
      given e2 being object such that
        A7: e2 DJoins v,w,G2;
      A8: e2 DJoins v,w,G1 by A7, GLIB_000:72;
      given e4 being object such that
        A9: e4 DJoins v,w,G4;
      e4 DJoins v,w,G3 by A9, GLIB_000:72;
      hence contradiction by A8, Th81;
    end;
    assume A10: not ex e4 being object st e4 DJoins v,w,G4;
    ex e1 being object st e1 DJoins v,w,G1
    proof
      assume A11: not ex e1 being object st e1 DJoins v,w,G1;
      the_Vertices_of G2 c= the_Vertices_of G1;
      then v is Vertex of G1 & w is Vertex of G1 by TARSKI:def 3;
      then consider e3 being object such that
        A12: e3 DJoins v,w,G3 by A6, A11, Th80;
      A13: e3 Joins v,w,G3 by A12, GLIB_000:16;
      the_Vertices_of G2 = V by GLIB_000:def 37;
      then e3 in G3.edgesBetween(V) by A13, GLIB_000:32;
      then e3 in the_Edges_of G4 & e3 is set by A1, GLIB_000:def 37;
      then e3 DJoins v,w,G4 by A12, GLIB_000:73;
      hence contradiction by A10;
    end;
    then consider e1 being object such that
      A14: e1 DJoins v,w,G1;
    take e1;
    A15: e1 Joins v,w,G1 by A14, GLIB_000:16;
    the_Vertices_of G2 = V by GLIB_000:def 37;
    then e1 in G1.edgesBetween(V) by A15, GLIB_000:32;
    then e1 in the_Edges_of G2 & e1 is set by GLIB_000:def 37;
    hence e1 DJoins v,w,G2 by A14, GLIB_000:73;
  end;
  hence thesis by A2, A3, Th80;
end;

theorem
  for G1 being _Graph, V being proper Subset of the_Vertices_of G1
  for G2 being removeVertices of G1, V
  for G3 being DGraphComplement of G1, G4 being removeVertices of G3, V
  holds G4 is DGraphComplement of G2
proof
  let G1 be _Graph, V be proper Subset of the_Vertices_of G1;
  let G2 be removeVertices of G1, V;
  let G3 be DGraphComplement of G1, G4 be removeVertices of G3, V;
  the_Vertices_of G1 \ V is non empty Subset of the_Vertices_of G1 &
    the_Vertices_of G1 \ V = the_Vertices_of G3 \ V
    by Th80, XBOOLE_1:105, GLIBPRE0:6;
  hence thesis by Th87;
end;

:: involutiveness of graph complement (DC case)
theorem
  for G1 being Dsimple _Graph, G2 being DGraphComplement of G1
  holds G1 is DGraphComplement of G2
proof
  let G1 be Dsimple _Graph, G2 be DGraphComplement of G1;
  A1: the_Vertices_of G1 = the_Vertices_of G2 &
    the_Edges_of G1 misses the_Edges_of G2 by Th80;
  now
    let v,w be Vertex of G2;
    assume A2: v <> w;
    v is Vertex of G1 & w is Vertex of G1 by Th80;
    hence (ex e2 being object st e2 DJoins v,w,G2) iff
      (not ex e1 being object st e1 DJoins v,w,G1) by A2, Th80;
  end;
  hence thesis by A1, Th80;
end;

theorem Th90:
  for G1 being _Graph, G2 being DGraphComplement of G1
  holds G1.order() = G2.order() by Th80;

theorem Th91:
  for G1 being _Graph, G2 being DGraphComplement of G1
  holds G1 is _trivial iff G2 is _trivial
proof
  let G1 be _Graph, G2 be DGraphComplement of G1;
  hereby
    assume G1 is _trivial;
    then 1 = G1.order() by GLIB_000:26
      .= G2.order() by Th90;
    hence G2 is _trivial by GLIB_000:26;
  end;
  hereby
    assume G2 is _trivial;
    then 1 = G2.order() by GLIB_000:26
      .= G1.order() by Th90;
    hence G1 is _trivial by GLIB_000:26;
  end;
end;

registration
  let G be _trivial _Graph;
  cluster -> _trivial for DGraphComplement of G;
  coherence by Th91;
end;

registration
  let G be non _trivial _Graph;
  cluster -> non _trivial for DGraphComplement of G;
  coherence by Th91;
end;

theorem Th92:
  for G1 being _Graph, G2 being DGraphComplement of G1
  st the_Edges_of G1 = G1.loops() holds G2 is complete
proof
  let G1 be _Graph, G2 be DGraphComplement of G1;
  assume A1: the_Edges_of G1 = G1.loops();
  now
    let v,w be Vertex of G2;
    A2: v is Vertex of G1 & w is Vertex of G1 by Th80;
    assume A3: v <> w;
    not ex e1 being object st e1 DJoins v,w,G1
    proof
      given e1 being object such that
        A4: e1 DJoins v,w,G1;
      e1 Joins v,w,G1 by A4, GLIB_000:16;
      hence contradiction by A1, A3, A4, GLIB_009:46, GLIB_000:def 14;
    end;
    then consider e2 being object such that
      A5: e2 DJoins v,w,G2 by A2, A3, Th80;
    e2 Joins v,w,G2 by A5, GLIB_000:16;
    hence v,w are_adjacent by CHORD:def 3;
  end;
  hence thesis by CHORD:def 6;
end;

registration
  let G be edgeless _Graph;
  cluster -> complete for DGraphComplement of G;
  coherence
  proof
    let G2 be DGraphComplement of G;
    the_Edges_of G = {} & G.loops() = {};
    hence thesis by Th92;
  end;
end;

registration
  let G be _trivial edgeless _Graph;
  cluster -> edgeless for DGraphComplement of G;
  coherence;
end;

registration
  let G be non connected _Graph;
  cluster -> connected for DGraphComplement of G;
  coherence
  proof
    let G2 be DGraphComplement of G;
    consider G9 being DLGraphComplement of G such that
      A1: G2 is removeLoops of G9 by Def8;
    thus thesis by A1;
  end;
end;

theorem
  for G1 being non _trivial _Graph, G2 being DGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2 st v1 = v2
  holds v1 is isolated implies v2 is non isolated
proof
  let G1 be non _trivial _Graph, G2 be DGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  assume A2: v1 is isolated;
  set v9 = the Element of the_Vertices_of G1 \ {v1};
  the_Vertices_of G1 \ {v1} <> {} by GLIB_000:20;
  then A3: v9 in the_Vertices_of G1 \ {v1};
  then reconsider v9 as Vertex of G1;
  A4: v9 <> v1 by A3, ZFMISC_1:56;
  not ex e being object st e DJoins v1,v9,G1 by A2, GLIB_000:144;
  then ex e being object st e DJoins v1,v9,G2 by A4, Th80;
  hence v2 is non isolated by A1, GLIB_000:144;
end;

theorem
  for G1 being _Graph, G2 being DGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & 3 c= G1.order()
  holds v1 is endvertex implies v2 is non endvertex
proof
  let G1 be _Graph, G2 be DGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & 3 c= G1.order();
  assume v1 is endvertex;
  then consider u,w being Vertex of G1 such that
    A2: u<>v1 & w<>v1 & u <> w & u,v1 are_adjacent & not v1,w are_adjacent
    by A1, GLIBPRE0:95;
  not ex e being object st e DJoins v1,w,G1
  proof
    given e being object such that
      A3: e DJoins v1,w,G1;
    e Joins v1,w,G1 by A3, GLIB_000:16;
    hence contradiction by A2, CHORD:def 3;
  end;
  then consider e1 being object such that
    A4: e1 DJoins v1,w,G2 by A2, Th80;
  not ex e being object st e DJoins w,v1,G1
  proof
    given e being object such that
      A5: e DJoins w,v1,G1;
    e Joins v1,w,G1 by A5, GLIB_000:16;
    hence contradiction by A2, CHORD:def 3;
  end;
  then consider e2 being object such that
    A6: e2 DJoins w,v1,G2 by A2, Th80;
  A7: e1 <> e2 by A2, A4, A6, GLIB_000:125;
  reconsider w as Vertex of G2 by Th80;
  reconsider e1, e2 as set by TARSKI:1;
  e1 Joins v2,w,G2 & e2 Joins v2,w,G2 by A1, A4, A6, GLIB_000:16;
  then e1 in v2.edgesInOut() & e2 in v2.edgesInOut() by GLIB_000:64;
  then A8: {e1,e2} c= v2.edgesInOut() by ZFMISC_1:32;
  assume v2 is endvertex;
  then consider e9 being object such that
    A9: v2.edgesInOut() = {e9} & not e9 Joins v2,v2,G2 by GLIB_000:def 51;
  e1 = e9 & e2 = e9 by A8, A9, ZFMISC_1:20;
  hence contradiction by A7;
end;

theorem Th95:
  for G1 being _Graph, G2 being DGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 holds
    v2.inNeighbors() = the_Vertices_of G2 \ (v1.inNeighbors() \/ {v2}) &
    v2.outNeighbors() = the_Vertices_of G2 \ (v1.outNeighbors() \/ {v2})
proof
  let G1 be _Graph, G2 be DGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  consider G9 being DLGraphComplement of G1 such that
    A2: G2 is removeLoops of G9 by Def8;
  reconsider v9 = v1 as Vertex of G9 by Def6;
  thus v2.inNeighbors() = v9.inNeighbors() \ {v2} by A1, A2, GLIBPRE0:63
    .= (the_Vertices_of G9 \ v1.inNeighbors()) \ {v2} by Th60
    .= the_Vertices_of G9 \ (v1.inNeighbors() \/ {v2}) by XBOOLE_1:41
    .= the_Vertices_of G2 \ (v1.inNeighbors() \/ {v2}) by A2, GLIB_000:53;
  thus v2.outNeighbors() = v9.outNeighbors() \ {v2} by A1, A2, GLIBPRE0:63
    .= (the_Vertices_of G9 \ v1.outNeighbors()) \ {v2} by Th60
    .= the_Vertices_of G9 \ (v1.outNeighbors() \/ {v2}) by XBOOLE_1:41
    .= the_Vertices_of G2 \ (v1.outNeighbors() \/ {v2}) by A2, GLIB_000:53;
end;

theorem
  for G1 being _Graph, G2 being DGraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & v1 is isolated holds
    v2.inNeighbors() = the_Vertices_of G2 \ {v2} &
    v2.outNeighbors() = the_Vertices_of G2 \ {v2} &
    v2.allNeighbors() = the_Vertices_of G2 \ {v2}
proof
  let G1 be _Graph, G2 be DGraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & v1 is isolated;
  then v1.allNeighbors() = {} by GLIB_000:113;
  then A2: v1.inNeighbors() = {} & v1.outNeighbors() = {};
  thus A3: v2.inNeighbors() = the_Vertices_of G2 \ ({}\/{v2}) by A1, A2, Th95
    .= the_Vertices_of G2 \ {v2};
  thus v2.outNeighbors() = the_Vertices_of G2 \ ({} \/ {v2}) by A1, A2, Th95
    .= the_Vertices_of G2 \ {v2};
  hence thesis by A3;
end;

begin :: Undirected Graph Complement without Loops

definition
  let G be _Graph;
  mode GraphComplement of G -> simple _Graph means
  :Def9:
  ex G9 being LGraphComplement of G st it is removeLoops of G9;
  existence
  proof
    set G1 = the LGraphComplement of G;
    take the removeLoops of G1;
    thus thesis;
  end;
end;

theorem Th97:
  for G1, G2, G3 being _Graph, G4 being GraphComplement of G1
  st G1 == G2 & G3 == G4 holds G3 is GraphComplement of G2
proof
  let G1, G2, G3 be _Graph, G4 be GraphComplement of G1;
  assume A1: G1 == G2 & G3 == G4;
  consider G9 being LGraphComplement of G1 such that
    A2: G4 is removeLoops of G9 by Def9;
  G9 is LGraphComplement of G2 & G3 is removeLoops of G9
    by A1, A2, Th62, GLIB_009:59;
  hence thesis by Def9;
end;

registration
  let G be _Graph;
  cluster plain for GraphComplement of G;
  existence
  proof
    set G1 = the GraphComplement of G;
    set G2 = G1 | _GraphSelectors;
    G1 == G1 & G1 == G2 by GLIB_000:128;
    then reconsider G2 as GraphComplement of G by Th97;
    take G2;
    thus thesis;
  end;
end;

theorem Th98:
  for G1 being _Graph, G2 being simple _Graph
  holds G2 is GraphComplement of G1 iff
    the_Vertices_of G2 = the_Vertices_of G1 &
    the_Edges_of G2 misses the_Edges_of G1 &
    for v,w being Vertex of G1 st v <> w holds
      (ex e1 being object st e1 Joins v,w,G1) iff
      (not ex e2 being object st e2 Joins v,w,G2)
proof
  let G1 be _Graph, G2 be simple _Graph;
  :: the first direction is straight forward
  hereby
    assume G2 is GraphComplement of G1;
    then consider G9 being LGraphComplement of G1 such that
      A1: G2 is removeLoops of G9 by Def9;
    thus the_Vertices_of G2 = the_Vertices_of G9 by A1, GLIB_000:def 33
      .= the_Vertices_of G1 by Def7;
    A2: the_Edges_of G2 c= the_Edges_of G9 by A1, GLIB_000:def 32;
    the_Edges_of G9 misses the_Edges_of G1 by Def7;
    hence the_Edges_of G2 misses the_Edges_of G1 by A2, XBOOLE_1:63;
    let v,w be Vertex of G1;
    assume A3: v <> w;
    hereby
      given e1 being object such that
        A4: e1 Joins v,w,G1;
      given e2 being object such that
        A5: e2 Joins v,w,G2;
      e2 Joins v,w,G9 by A1, A5, GLIB_000:72;
      hence contradiction by A4, Th64;
    end;
    assume A6: not ex e2 being object st e2 Joins v,w,G2;
    not ex e9 being object st e9 Joins v,w,G9
    proof
      given e9 being object such that
        A7: e9 Joins v,w,G9;
      A8: e9 in the_Edges_of G9 by A7, GLIB_000:def 13;
      not e9 in G9.loops() by A3, A7, GLIB_009:46;
      then e9 in the_Edges_of G9 \ G9.loops() by A8, XBOOLE_0:def 5;
      then A9: e9 in the_Edges_of G2 by A1, GLIB_000:53;
      e9 Joins v,w,G2 by A1, A7, A9, GLIB_000:73;
      hence contradiction by A6;
    end;
    hence ex e1 being object st e1 Joins v,w,G1 by Def7;
  end;
  :: for the second direction we need to add loops to G2 to get a G9
  :: but the loops must be distinct from both the edges of G1 and of G2,
  :: so some construction is needed (except if G1 is already loopfull)
  assume that A10: the_Vertices_of G2 = the_Vertices_of G1 &
      the_Edges_of G2 misses the_Edges_of G1 and
    A11: for v,w being Vertex of G1 st v <> w holds
      (ex e1 being object st e1 Joins v,w,G1) iff
      (not ex e2 being object st e2 Joins v,w,G2);
  per cases;
  suppose A12: G1 is non loopfull;
    defpred P[object] means not ex e being object st e Joins $1,$1,G1;
    consider V being Subset of the_Vertices_of G2 such that
      A13: for x being set holds x in V iff x in the_Vertices_of G2 & P[x]
      from SUBSET_1:sch 1;
    A14: V is non empty by A10, A12, A13;
    set E = the set of all [{the_Edges_of G1,the_Edges_of G2},v]
      where v is Element of V;
    deffunc F(object) = $1`2;
    consider f being Function such that
      A15: dom f = E & for x being object st x in E holds f.x = F(x)
      from FUNCT_1:sch 3;
    now
      let x1,x2 be object;
      assume A16: x1 in dom f & x2 in dom f & f.x1 = f.x2;
      then consider v1 being Element of V such that
        A17: x1 = [{the_Edges_of G1,the_Edges_of G2},v1] by A15;
      consider v2 being Element of V such that
        A18: x2 = [{the_Edges_of G1,the_Edges_of G2},v2] by A15, A16;
      v1 = [{the_Edges_of G1,the_Edges_of G2},v1]`2
        .= f.x1 by A15, A16, A17
        .= [{the_Edges_of G1,the_Edges_of G2},v2]`2 by A15, A16, A18
        .= v2;
      hence x1 = x2 by A17, A18;
    end;
    then reconsider f as one-to-one Function by FUNCT_1:def 4;
    now
      let y be object;
      hereby
        assume y in rng f;
        then consider x being object such that
          A19: x in dom f & f.x = y by FUNCT_1:def 3;
        consider v being Element of V such that
          A20: x = [{the_Edges_of G1,the_Edges_of G2},v] by A15, A19;
        y = [{the_Edges_of G1,the_Edges_of G2},v]`2 by A15, A19, A20
          .= v;
        hence y in V by A14;
      end;
      set x = [{the_Edges_of G1,the_Edges_of G2},y];
      assume y in V;
      then A21: x in E;
      then f.x = [{the_Edges_of G1,the_Edges_of G2},y]`2 by A15
        .= y;
      hence y in rng f by A15, A21, FUNCT_1:3;
    end;
    then A22: rng f = V by TARSKI:2;
    A23: E misses the_Edges_of G1
    proof
      assume E meets the_Edges_of G1;
      then consider e being object such that
        A24: e in E & e in the_Edges_of G1 by XBOOLE_0:3;
      reconsider e as set by TARSKI:1;
      consider v being Element of V such that
        A25: e = [{the_Edges_of G1,the_Edges_of G2},v] by A24;
      A26: e = {{{the_Edges_of G1,the_Edges_of G2}, v},
        {{the_Edges_of G1,the_Edges_of G2}}} by A25, TARSKI:def 5;
      A27: the_Edges_of G1 in
        {the_Edges_of G1, the_Edges_of G2} by TARSKI:def 2;
      A28: {the_Edges_of G1, the_Edges_of G2} in
        {{the_Edges_of G1, the_Edges_of G2}} by TARSKI:def 1;
      {{the_Edges_of G1, the_Edges_of G2}} in e by A26, TARSKI:def 2;
      hence contradiction by A24, A27, A28, XREGULAR:8;
    end;
    A29: E misses the_Edges_of G2
    proof
      assume E meets the_Edges_of G2;
      then consider e being object such that
        A30: e in E & e in the_Edges_of G2 by XBOOLE_0:3;
      reconsider e as set by TARSKI:1;
      consider v being Element of V such that
        A31: e = [{the_Edges_of G1,the_Edges_of G2},v] by A30;
      A32: e = {{{the_Edges_of G1,the_Edges_of G2}, v},
        {{the_Edges_of G1,the_Edges_of G2}}} by A31, TARSKI:def 5;
      A33: the_Edges_of G2 in
        {the_Edges_of G1, the_Edges_of G2} by TARSKI:def 2;
      A34: {the_Edges_of G1, the_Edges_of G2} in
        {{the_Edges_of G1, the_Edges_of G2}} by TARSKI:def 1;
      {{the_Edges_of G1, the_Edges_of G2}} in e by A32, TARSKI:def 2;
      hence contradiction by A30, A33, A34,  XREGULAR:8;
    end;
    set s = the_Source_of G2 +* f;
    now
      thus dom s = dom the_Source_of G2 \/ dom f by FUNCT_4:def 1
        .= the_Edges_of G2 \/ E by A15, FUNCT_2:def 1;
      A35: rng s c= rng the_Source_of G2 \/ rng f by FUNCT_4:17;
      rng the_Source_of G2 \/ rng f c= the_Vertices_of G2 by A22, XBOOLE_1:8;
      hence rng s c= the_Vertices_of G2 by A35, XBOOLE_1:1;
    end;
    then reconsider s as Function of the_Edges_of G2 \/ E, the_Vertices_of G2
      by FUNCT_2:2;
    set t = the_Target_of G2 +* f;
    now
      thus dom t = dom the_Target_of G2 \/ dom f by FUNCT_4:def 1
        .= the_Edges_of G2 \/ E by A15, FUNCT_2:def 1;
      A36: rng t c= rng the_Target_of G2 \/ rng f by FUNCT_4:17;
      rng the_Target_of G2 \/ rng f c= the_Vertices_of G2 by A22, XBOOLE_1:8;
      hence rng t c= the_Vertices_of G2 by A36, XBOOLE_1:1;
    end;
    then reconsider t as Function of the_Edges_of G2 \/ E, the_Vertices_of G2
      by FUNCT_2:2;
    set G9 = createGraph(the_Vertices_of G2,the_Edges_of G2 \/ E,s,t);
    :: show that G9 is addLoops
    now
      :: for that first show that G9 is Supergraph
      now
        thus the_Vertices_of G2 c= the_Vertices_of G9;
        thus the_Edges_of G2 c= the_Edges_of G9 by XBOOLE_1:7;
        let e be set;
        assume A37: e in the_Edges_of G2;
        then e in the_Edges_of G2 \/ E by XBOOLE_0:def 3;
        then A38: not e in dom f by A15, A29, A37, XBOOLE_0:5;
        hence (the_Source_of G2).e = (the_Source_of G2 +* f).e by FUNCT_4:11
          .= (the_Source_of G9).e;
        thus (the_Target_of G2).e = (the_Target_of G2 +* f).e
            by A38, FUNCT_4:11
          .= (the_Target_of G9).e;
      end;
      hence G9 is Supergraph of G2 by GLIB_006:def 9;
      thus the_Vertices_of G9 = the_Vertices_of G2;
      reconsider E as set;
      reconsider f as one-to-one Function;
      take E, f;
      thus E misses the_Edges_of G2 by A29;
      thus the_Edges_of G9 = the_Edges_of G2 \/ E;
      thus dom f = E by A15;
      thus rng f = V by A22;
      thus the_Source_of G9 = the_Source_of G2 +* f;
      thus the_Target_of G9 = the_Target_of G2 +* f;
    end;
    then A39: G9 is addLoops of G2, V by Def5;
    then G2 == the removeLoops of G9 by Th26;
    then A40: G2 is removeLoops of G9 by GLIB_009:59;
    A41: G9 is non-multi by A39;
    :: show that G9 is LGraphComplement
    now
      thus the_Vertices_of G9 = the_Vertices_of G1 by A10;
      thus the_Edges_of G9 misses the_Edges_of G1 by A10, A23, XBOOLE_1:70;
      let v,w be Vertex of G1;
      hereby
        given e1 being object such that
          A43: e1 Joins v,w,G1;
        given e2 being object such that
          A44: e2 Joins v,w,G9;
        per cases by A39, A44, GLIB_006:72;
        suppose A45: e2 Joins v,w,G2;
          then v <> w by GLIB_000:18;
          hence contradiction by A11, A43, A45;
        end;
        suppose A46: not e2 in the_Edges_of G2;
          e2 in the_Edges_of G9 by A44, GLIB_000:def 13;
          then A47: e2 in E by A46, XBOOLE_0:def 3;
          then consider u being Element of V such that
            A48: e2 = [{the_Edges_of G1,the_Edges_of G2},u];
          A49: not ex e being object st e Joins u,u,G1 by A13, A14;
          A50: (the_Source_of G9).e2 = s.e2
             .= f.e2 by A15, A47, FUNCT_4:13
             .= [{the_Edges_of G1,the_Edges_of G2},u]`2 by A15, A47, A48
             .= u;
          (the_Target_of G9).e2 = t.e2
             .= f.e2 by A15, A47, FUNCT_4:13
             .= [{the_Edges_of G1,the_Edges_of G2},u]`2 by A15, A47, A48
             .= u;
          then v = u & w = u by A44, A50, GLIB_000:def 13;
          hence contradiction by A43, A49;
        end;
      end;
      assume A51: not ex e2 being object st e2 Joins v,w,G9;
      assume A52: not ex e1 being object st e1 Joins v,w,G1;
      per cases;
      suppose A53: v <> w;
        not ex e2 being object st e2 Joins v,w,G2 by A39, A51, GLIB_006:70;
        hence contradiction by A11, A52, A53;
      end;
      suppose A54: v = w;
        set e = [{the_Edges_of G1,the_Edges_of G2},v];
        A55: not ex e1 being object st e1 Joins v,v,G1 by A52, A54;
        v in V by A10, A13, A55;
        then A56: e in E;
        then A57: e in the_Edges_of G9 by XBOOLE_0:def 3;
        A58: (the_Source_of G9).e = s.e
          .= f.e by A15, A56, FUNCT_4:13
          .= e`2 by A15, A56
          .= v;
        (the_Target_of G9).e = t.e
          .= f.e by A15, A56, FUNCT_4:13
          .= e`2 by A15, A56
          .= v;
        then e Joins v,w,G9 by A54, A57, A58, GLIB_000:def 13;
        hence contradiction by A51;
      end;
    end;
    then G9 is LGraphComplement of G1 by A41, Def7;
    hence thesis by A40, Def9;
  end;
  suppose A59: G1 is loopfull;
    now
      let v,w be Vertex of G1;
      hereby
        given e1 being object such that
          A60: e1 Joins v,w,G1;
        per cases;
        suppose v <> w;
          hence not ex e2 being object st e2 Joins v,w,G2 by A11, A60;
        end;
        suppose v = w;
          hence not ex e2 being object st e2 Joins v,w,G2 by GLIB_000:18;
        end;
      end;
      assume A61: not ex e2 being object st e2 Joins v,w,G2;
      per cases;
      suppose v <> w;
        hence ex e1 being object st e1 Joins v,w,G1 by A11, A61;
      end;
      suppose v = w;
        hence ex e1 being object st e1 Joins v,w,G1 by A59;
      end;
    end;
    then A62: G2 is LGraphComplement of G1 by A10, Def7;
    G2 is removeLoops of G2 by GLIB_009:58;
    hence thesis by A62, Def9;
  end;
end;

theorem Th99:
  for G1 being _Graph, G2 being simple _Graph
  holds G2 is GraphComplement of G1 iff
    the_Vertices_of G2 = the_Vertices_of G1 &
    the_Edges_of G2 misses the_Edges_of G1 &
    for v1,w1 being Vertex of G1, v2,w2 being Vertex of G2
    st v1 = v2 & w1 = w2 & v1 <> w1
    holds v1,w1 are_adjacent iff not v2,w2 are_adjacent
proof
  let G1 be _Graph, G2 be simple _Graph;
  hereby
    assume A1: G2 is GraphComplement of G1;
    hence the_Vertices_of G2 = the_Vertices_of G1 &
      the_Edges_of G2 misses the_Edges_of G1 by Th98;
    let v1,w1 be Vertex of G1, v2,w2 be Vertex of G2;
    assume A2: v1 = v2 & w1 = w2 & v1 <> w1;
    hereby
      assume v1,w1 are_adjacent;
      then ex e1 being object st e1 Joins v1,w1,G1 by CHORD:def 3;
      then not ex e2 being object st e2 Joins v1,w1,G2 by A1, A2, Th98;
      hence not v2,w2 are_adjacent by A2, CHORD:def 3;
    end;
    assume not v2,w2 are_adjacent;
    then not ex e2 being object st e2 Joins v1,w1,G2 by A2, CHORD:def 3;
    then ex e1 being object st e1 Joins v1,w1,G1 by A1, A2, Th98;
    hence v1,w1 are_adjacent by CHORD:def 3;
  end;
  assume that A3: the_Vertices_of G2 = the_Vertices_of G1 &
      the_Edges_of G2 misses the_Edges_of G1 and
    A4: for v1,w1 being Vertex of G1, v2,w2 being Vertex of G2
      st v1 = v2 & w1 = w2 & v1 <> w1
      holds v1,w1 are_adjacent iff not v2,w2 are_adjacent;
  now
    let v1,w1 be Vertex of G1;
    assume A5: v1 <> w1;
    reconsider v2=v1, w2=w1 as Vertex of G2 by A3;
    hereby
      assume ex e1 being object st e1 Joins v1,w1,G1;
      then v1,w1 are_adjacent by CHORD:def 3;
      then not v2,w2 are_adjacent by A5, A4;
      hence not ex e2 being object st e2 Joins v1,w1,G2 by CHORD:def 3;
    end;
    assume not ex e2 being object st e2 Joins v1,w1,G2;
    then not v2,w2 are_adjacent by CHORD:def 3;
    then v1,w1 are_adjacent by A5, A4;
    hence ex e1 being object st e1 Joins v1,w1,G1 by CHORD:def 3;
  end;
  hence thesis by A3, Th98;
end;

theorem Th100:
  for G1 being _Graph, G2 being GraphComplement of G1, e1,e2,v,w being object
  holds e1 Joins v,w,G1 implies not e2 Joins v,w,G2
proof
  let G1 be _Graph, G2 be GraphComplement of G1, e1,e2,v,w be object;
  assume A1: e1 Joins v,w,G1;
  per cases;
  suppose A2: v <> w;
    v in the_Vertices_of G1 & w in the_Vertices_of G1 by A1, GLIB_000:13;
    hence thesis by A1, A2, Th98;
  end;
  suppose v = w;
    hence thesis by GLIB_000:18;
  end;
end;

theorem Th101:
  for G1 being _Graph, G2 being SimpleGraph of G1
  for G3 being GraphComplement of G1 holds G3 is GraphComplement of G2
proof
  let G1 be _Graph, G2 be SimpleGraph of G1, G3 be GraphComplement of G1;
  consider E being RepEdgeSelection of G1 such that
    A1: G2 is inducedSubgraph of G1, the_Vertices_of G1, E\G1.loops()
    by GLIB_009:def 9;
  the_Vertices_of G1 c= the_Vertices_of G1 &
    the_Edges_of G1 = G1.edgesBetween(the_Vertices_of G1) by GLIB_000:34;
  then A2: the_Vertices_of G2 = the_Vertices_of G1 &
    the_Edges_of G2 = E \ G1.loops() by A1, GLIB_000:def 37;
  then A3: the_Vertices_of G3 = the_Vertices_of G2 by Th98;
  the_Edges_of G3 misses the_Edges_of G1 by Th98;
  then A4: the_Edges_of G3 misses the_Edges_of G2 by XBOOLE_1:63;
  now
    let v,w be Vertex of G2;
    assume A5: v <> w;
    A6: v is Vertex of G1 & w is Vertex of G1 by GLIB_000:def 33;
    reconsider v1=v, w1=w as Vertex of G1 by GLIB_000:def 33;
    hereby
      given e2 being object such that
        A7: e2 Joins v,w,G2;
      A8: e2 Joins v,w,G1 by A7, GLIB_000:72;
      given e3 being object such that
        A9: e3 Joins v,w,G3;
      thus contradiction by A8, A9, Th100;
    end;
    assume not ex e3 being object st e3 Joins v,w,G3;
    then consider e1 being object such that
      A10: e1 Joins v,w,G1 by A6, A5, Th98;
    consider e2 being object such that
      A11: e2 Joins v,w,G1 & e2 in E and
      for e9 being object st e9 Joins v,w,G1 & e9 in E holds e9 = e2
      by A10, GLIB_009:def 5;
    take e2;
    not e2 in G1.loops() by A5, A11, GLIB_009:46;
    then e2 in the_Edges_of G2 by A2, A11, XBOOLE_0:def 5;
    hence e2 Joins v,w,G2 by A11, GLIB_000:73;
  end;
  hence thesis by A3, A4, Th98;
end;

theorem Th102:
  for G1, G2 being _Graph
  for G3 being SimpleGraph of G1, G4 being SimpleGraph of G2
  for G5 being GraphComplement of G1, G6 being GraphComplement of G2
  st G4 is G3-isomorphic holds G6 is G5-isomorphic
proof
  let G1, G2 be _Graph;
  let G3 be SimpleGraph of G1, G4 be SimpleGraph of G2;
  let G5 be GraphComplement of G1, G6 be GraphComplement of G2;
  A1: G5 is GraphComplement of G3 & G6 is GraphComplement of G4 by Th101;
  assume G4 is G3-isomorphic;
  then consider f being PVertexMapping of G3, G4 such that
    A2: f is isomorphism by GLIB_011:49;
  A3: the_Vertices_of G3 = the_Vertices_of G5 &
    the_Vertices_of G4 = the_Vertices_of G6 by A1, Th98;
  then reconsider g = f as PartFunc of the_Vertices_of G5, the_Vertices_of G6;
  now
    let v,w,e be object;
    assume A4: v in dom g & w in dom g & e Joins v,w,G5;
    then A5: v <> w by GLIB_000:18;
    then A6: g.v <> g.w by A2, A4, FUNCT_1:def 4;
    A7: not ex e3 being object st e3 Joins v,w,G3
      by A1, A3, A4, A5, Th98;
    thus ex e6 being object st e6 Joins g.v,g.w,G6
    proof
      assume A8: not ex e6 being object st e6 Joins g.v,g.w,G6;
      g.v in rng f & g.w in rng f by A4, FUNCT_1:3;
      then consider e4 being object such that
        A9: e4 Joins g.v,g.w,G4 by A1, A6, A8, Th98;
      consider e3 being object such that
        A10: e3 Joins v,w,G3 by A2, A4, A9, GLIB_011:2;
      thus contradiction by A7, A10;
    end;
  end;
  then reconsider g as PVertexMapping of G5, G6 by GLIB_011:1;
  now
    let v,w,e6 be object;
    assume A11: v in dom g & w in dom g & e6 Joins g.v,g.w,G6;
    then A12: g.v <> g.w by GLIB_000:18;
    A13: v in the_Vertices_of G3 & w in the_Vertices_of G3 by A3, A11;
    g.v in rng f & g.w in rng f by A11, FUNCT_1:3;
    then A14: not ex e4 being object st e4 Joins g.v,g.w,G4
      by A1, A11, A12, Th98;
    thus ex e5 being object st e5 Joins v,w,G5
    proof
      assume not ex e5 being object st e5 Joins v,w,G5;
      then consider e3 being object such that
        A15: e3 Joins v,w,G3 by A1, A12, A13, Th98;
      consider e4 being object such that
        A16: e4 Joins f.v,f.w,G4 by A11, A15, GLIB_011:1;
      thus contradiction by A14, A16;
    end;
  end;
  then g is continuous by GLIB_011:2;
  hence thesis by A2, A3, GLIB_011:49;
end;

theorem Th103:
  for G1 being _Graph, G2 being G1-isomorphic _Graph
  for G3 being GraphComplement of G1, G4 being GraphComplement of G2
  holds G4 is G3-isomorphic
proof
  let G1 be _Graph, G2 be G1-isomorphic _Graph;
  let G3 be GraphComplement of G1, G4 be GraphComplement of G2;
  set G5 = the SimpleGraph of G1;
  set G6 = the SimpleGraph of G2;
  G6 is G5-isomorphic by GLIB_010:172;
  hence thesis by Th102;
end;

theorem Th104:
  for G1 being _Graph, G2, G3 being GraphComplement of G1
  holds G3 is G2-isomorphic
proof
  let G1 be _Graph, G2, G3 be GraphComplement of G1;
  G1 is G1-isomorphic by GLIB_010:53;
  hence thesis by Th103;
end;

theorem Th105:
  for G1 being _Graph, v being object, V being Subset of the_Vertices_of G1
  for G2 being addAdjVertexAll of G1,v,V
  for G3 being GraphComplement of G1
  st not v in the_Vertices_of G1 & the_Edges_of G2 misses the_Edges_of G3
  ex G4 being addAdjVertexAll of G3,v,the_Vertices_of G1 \ V
  st G4 is GraphComplement of G2
proof
  let G1 be _Graph, v be object, V be Subset of the_Vertices_of G1;
  let G2 be addAdjVertexAll of G1,v,V;
  let G3 be GraphComplement of G1;
  assume A1: not v in the_Vertices_of G1 &
    the_Edges_of G2 misses the_Edges_of G3;
  consider E0 being set such that
    card V = card E0 & E0 misses the_Edges_of G1 and
    the_Edges_of G2 = the_Edges_of G1 \/ E0 and
    A2: for v1 being object st v1 in V ex e1 being object st e1 in E0 &
      e1 Joins v1,v,G2 &
      for e2 being object st e2 Joins v1,v,G2 holds e1 = e2
    by A1, GLIB_007:def 4;
  per cases;
  suppose A3: the_Vertices_of G1 \ V <> {};
    :: construct G4
    set E = the set of all [{the_Edges_of G2,the_Edges_of G3},w]
      where w is Element of the_Vertices_of G1 \ V;
    deffunc S(object) = $1`2;
    consider h being Function such that
      A4: dom h = E & for x being object st x in E holds h.x = S(x)
      from FUNCT_1:sch 3;
    :: recognize the source
    set s = the_Source_of G3 +* h;
    A5: dom s = dom the_Source_of G3 \/ dom h by FUNCT_4:def 1
      .= the_Edges_of G3 \/ E by A4, FUNCT_2:def 1;
    now
      let y be object;
      hereby
        set x = [{the_Edges_of G2,the_Edges_of G3},y];
        assume y in the_Vertices_of G1 \ V;
        then A6: x in E;
        then h.x = x`2 by A4
          .= y;
        hence y in rng h by A4, A6, FUNCT_1:def 3;
      end;
      assume y in rng h;
      then consider x being object such that
        A7: x in dom h & h.x = y by FUNCT_1:def 3;
      reconsider x as set by TARSKI:1;
      consider w being Element of the_Vertices_of G1 \ V such that
        A8: x = [{the_Edges_of G2,the_Edges_of G3},w] by A4, A7;
      h.x = x`2 by A4, A7
        .= w by A8;
      hence y in the_Vertices_of G1 \ V by A3, A7;
    end;
    then A9: rng h = the_Vertices_of G1 \ V by TARSKI:2
      .= the_Vertices_of G3 \ V by Th98;
    then A10: rng the_Source_of G3 \/rng h c= the_Vertices_of G3 by XBOOLE_1:8;
    rng s c= rng the_Source_of G3 \/ rng h by FUNCT_4:17;
    then A11: rng s c= the_Vertices_of G3 by A10, XBOOLE_1:1;
    the_Vertices_of G3 c= the_Vertices_of G3 \/ {v} by XBOOLE_1:7;
    then reconsider s as Function of the_Edges_of G3 \/ E,
      the_Vertices_of G3 \/ {v} by A5, A11, XBOOLE_1:1, FUNCT_2:2;
    :: recognize the target
    set t = the_Target_of G3 +* (E --> v);
    A12: dom t = dom the_Target_of G3 \/ dom(E-->v) by FUNCT_4:def 1
      .= the_Edges_of G3 \/ E by FUNCT_2:def 1;
    the_Vertices_of G3 c= the_Vertices_of G3 \/ {v} by XBOOLE_1:7;
    then A13: rng the_Target_of G3 c= the_Vertices_of G3 \/ {v}
      by XBOOLE_1:1;
    A14: {v} c= the_Vertices_of G3 \/ {v} by XBOOLE_1:7;
    A15: rng t c= rng the_Target_of G3 \/ rng(E --> v) by FUNCT_4:17;
    rng(E --> v) c= the_Vertices_of G3 \/ {v} by A14, XBOOLE_1:1;
    then rng the_Target_of G3 \/ rng(E --> v) c= the_Vertices_of G3 \/ {v}
      by A13, XBOOLE_1:8;
    then reconsider t as Function of the_Edges_of G3 \/ E,
      the_Vertices_of G3 \/ {v} by A12, A15, XBOOLE_1:1, FUNCT_2:2;
    :: E misses all other edges
    A16: E misses the_Edges_of G3
    proof
      assume E meets the_Edges_of G3;
      then consider e being object such that
        A17: e in E & e in the_Edges_of G3 by XBOOLE_0:3;
      reconsider e as set by TARSKI:1;
      consider w being Element of the_Vertices_of G1 \ V such that
        A18: e = [{the_Edges_of G2,the_Edges_of G3},w] by A17;
      A19: the_Edges_of G3 in {the_Edges_of G2, the_Edges_of G3}
        by TARSKI:def 2;
      A20: {the_Edges_of G2, the_Edges_of G3} in
        {{the_Edges_of G2, the_Edges_of G3}} by TARSKI:def 1;
      e = { { {the_Edges_of G2, the_Edges_of G3}, w },
        {{the_Edges_of G2, the_Edges_of G3}} } by A18, TARSKI:def 5;
      then {{the_Edges_of G2, the_Edges_of G3}} in e by TARSKI:def 2;
      hence contradiction by A17, A19, A20, XREGULAR:8;
    end;
    A21: E misses the_Edges_of G2
    proof
      assume E meets the_Edges_of G2;
      then consider e being object such that
        A22: e in E & e in the_Edges_of G2 by XBOOLE_0:3;
      reconsider e as set by TARSKI:1;
      consider w being Element of the_Vertices_of G1 \ V such that
        A23: e = [{the_Edges_of G2,the_Edges_of G3},w] by A22;
      A24: the_Edges_of G2 in {the_Edges_of G2, the_Edges_of G3}
        by TARSKI:def 2;
      A25: {the_Edges_of G2, the_Edges_of G3} in
        {{the_Edges_of G2, the_Edges_of G3}} by TARSKI:def 1;
      e = { { {the_Edges_of G2, the_Edges_of G3}, w },
        {{the_Edges_of G2, the_Edges_of G3}} } by A23, TARSKI:def 5;
      then {{the_Edges_of G2, the_Edges_of G3}} in e by TARSKI:def 2;
      hence contradiction by A22, A24, A25, XREGULAR:8;
    end;
    :: show supergraph property
    set G4 =
      createGraph(the_Vertices_of G3 \/ {v}, the_Edges_of G3 \/ E, s, t);
    now
      thus the_Vertices_of G3 c= the_Vertices_of G4 by XBOOLE_1:7;
      thus the_Edges_of G3 c= the_Edges_of G4 by XBOOLE_1:7;
      let e be set;
      assume A26: e in the_Edges_of G3;
      then e in the_Edges_of G3 \/ E by XBOOLE_0:def 3;
      then A27: not e in E by A16, A26, XBOOLE_0:5;
      then A28: not e in dom(E --> v);
      thus (the_Source_of G3).e = s.e by A4, A27, FUNCT_4:11
        .= (the_Source_of G4).e;
      thus (the_Target_of G3).e = t.e by A28, FUNCT_4:11
        .= (the_Target_of G4).e;
    end;
    then reconsider G4 as Supergraph of G3 by GLIB_006:def 9;
    :: show addAdjVertexAll property
    the_Vertices_of G1 \ V c= the_Vertices_of G1;
    then A29: the_Vertices_of G1 \ V c= the_Vertices_of G3 &
      not v in the_Vertices_of G3 by A1, Th98;
    now
      thus the_Vertices_of G4 = the_Vertices_of G3 \/ {v};
      hereby
        let e be object;
        thus not e Joins v,v,G4
        proof
          assume A30: e Joins v,v,G4;
          then per cases by GLIB_006:72;
          suppose e Joins v,v,G3;
            then v in the_Vertices_of G3 by GLIB_000:13;
            hence contradiction by A1, Th98;
          end;
          suppose A31: not e in the_Edges_of G3;
            e in the_Edges_of G4 by A30, GLIB_000:def 13;
            then e in the_Edges_of G3 \/ E;
            then A32: e in E by A16, A31, XBOOLE_0:5;
            then consider w being Element of the_Vertices_of G1\V such that
              A33: e = [{the_Edges_of G2,the_Edges_of G3},w];
            (the_Source_of G4).e = s.e
              .= h.e by A4, A32, FUNCT_4:13
              .= [{the_Edges_of G2,the_Edges_of G3},w]`2 by A4, A32, A33
              .= w;
            then v = w by A30, GLIB_000:def 13;
            then v in the_Vertices_of G1 \ V by A3;
            hence contradiction by A1;
          end;
        end;
        let v1 be object;
        hereby
          assume A34: not v1 in the_Vertices_of G1 \ V;
          assume A35: e Joins v1,v,G4;
          then per cases by GLIB_006:72;
          suppose e Joins v1,v,G3;
            then v in the_Vertices_of G3 by GLIB_000:13;
            hence contradiction by A1, Th98;
          end;
          suppose A36: not e in the_Edges_of G3;
            e in the_Edges_of G4 by A35, GLIB_000:def 13;
            then e in the_Edges_of G3 \/ E;
            then A37: e in E by A36, XBOOLE_0:def 3;
            then consider w being Element of the_Vertices_of G1\V such that
              A38: e = [{the_Edges_of G2,the_Edges_of G3},w];
            (the_Source_of G4).e = s.e
              .= h.e by A4, A37, FUNCT_4:13
              .= [{the_Edges_of G2,the_Edges_of G3},w]`2 by A4, A37, A38
              .= w;
            then per cases by A35, GLIB_000:def 13;
            suppose w = v;
              then v in the_Vertices_of G1 \ V by A3;
              hence contradiction by A1;
            end;
            suppose w = v1;
              hence contradiction by A3, A34;
            end;
          end;
        end;
        let v2 be object;
        assume A39: v1 <> v & v2 <> v & e DJoins v1,v2,G4;
        e in the_Edges_of G3
        proof
          assume A40: not e in the_Edges_of G3;
          e in the_Edges_of G4 by A39, GLIB_000:def 14;
          then e in the_Edges_of G3 \/ E;
          then A41: e in E by A40, XBOOLE_0:def 3;
          then A42: e in dom(E --> v);
          (the_Target_of G4).e = t.e
            .= (E --> v).e by A42, FUNCT_4:13
            .= v by A41, FUNCOP_1:7;
          hence contradiction by A39, GLIB_000:def 14;
        end;
        hence e DJoins v1,v2,G3 by A39, GLIB_006:71;
      end;
      take E;
      now
        let x1,x2 be object;
        assume A43: x1 in dom h & x2 in dom h & h.x1 = h.x2;
        then consider w1 being Element of the_Vertices_of G1\V such that
          A44: x1 = [{the_Edges_of G2,the_Edges_of G3},w1] by A4;
        consider w2 being Element of the_Vertices_of G1\V such that
          A45: x2 = [{the_Edges_of G2,the_Edges_of G3},w2] by A4, A43;
        w1 = [{the_Edges_of G2,the_Edges_of G3},w1]`2
          .= h.x1 by A4, A43, A44
          .= [{the_Edges_of G2,the_Edges_of G3},w2]`2 by A4, A43, A45
          .= w2;
        hence x1 = x2 by A44, A45;
      end;
      then A46: h is one-to-one by FUNCT_1:def 4;
      thus card(the_Vertices_of G1 \ V)
         = card(the_Vertices_of G3 \ V) by Th98
        .= card E by A4, A9, A46, CARD_1:70;
      thus E misses the_Edges_of G3 by A16;
      thus the_Edges_of G4 = the_Edges_of G3 \/ E;
      let v1 be object;
      assume A47: v1 in the_Vertices_of G1 \ V;
      set e1 = [{the_Edges_of G2,the_Edges_of G3},v1];
      take e1;
      thus A48: e1 in E by A47;
      then e1 in the_Edges_of G3 \/ E by XBOOLE_0:def 3;
      then A49: e1 in the_Edges_of G4;
      A50: e1 in dom(E --> v) by A48;
      A51: (the_Source_of G4).e1 = s.e1
        .= h.e1 by A4, A48, FUNCT_4:13
        .= e1`2 by A4, A48
        .= v1;
      (the_Target_of G4).e1 = t.e1
        .= (E --> v).e1 by A50, FUNCT_4:13
        .= v by A48, FUNCOP_1:7;
      hence e1 Joins v1,v,G4 by A49, A51, GLIB_000:def 13;
      let e2 be object;
      assume A52: e2 Joins v1,v,G4;
      not e2 Joins v1,v,G3
      proof
        assume e2 Joins v1,v,G3;
        then v in the_Vertices_of G3 by GLIB_000:13;
        hence contradiction by A1, Th98;
      end;
      then A53: not e2 in the_Edges_of G3 by A52, GLIB_006:72;
      e2 in the_Edges_of G4 by A52, GLIB_000:def 13;
      then e2 in the_Edges_of G3 \/ E;
      then A54: e2 in E by A53, XBOOLE_0:def 3;
      then consider w being Element of the_Vertices_of G1\V such that
        A55: e2 = [{the_Edges_of G2,the_Edges_of G3},w];
      (the_Source_of G4).e2 = s.e2
        .= h.e2 by A4, A54, FUNCT_4:13
        .= [{the_Edges_of G2,the_Edges_of G3},w]`2 by A4, A54, A55
        .= w;
      then A56: v = w or v1 = w by A52, GLIB_000:def 13;
      v1 = w
      proof
        assume v1 <> w;
        then v in the_Vertices_of G1\V by A3, A56;
        hence contradiction by A1;
      end;
      hence e1 = e2 by A55;
    end;
    then reconsider G4 as addAdjVertexAll of G3, v, the_Vertices_of G1 \ V
      by A29, GLIB_007:def 4;
    take G4;
    :: show GraphComplement property
    now
      thus the_Vertices_of G4 = the_Vertices_of G3 \/ {v}
        .= the_Vertices_of G1 \/ {v} by Th98
        .= the_Vertices_of G2 by A1, GLIB_007:def 4;
      the_Edges_of G3 \/ E misses the_Edges_of G2 by A1, A21, XBOOLE_1:70;
      hence the_Edges_of G4 misses the_Edges_of G2;
      let u,w be Vertex of G2;
      assume A57: u <> w;
      hereby
        given e1 being object such that
          A58: e1 Joins u,w,G2;
        per cases by A58, GLIB_006:72;
        suppose A59: e1 Joins u,w,G1;
          then u is Vertex of G1 & w is Vertex of G1 by GLIB_000:13;
          then A60: not ex e2 being object st e2 Joins u,w,G3
            by A57, A59, Th98;
          u <> v & w <> v by A1, A59, GLIB_000:13;
          hence not ex e2 being object st e2 Joins u,w,G4
            by A29, A60, GLIB_007:49;
        end;
        suppose A61: not e1 in the_Edges_of G1;
          A62: the_Edges_of G2 = the_Edges_of G1 \/ G2.edgesBetween(V,{v})
            by A1, GLIB_007:59;
          e1 in the_Edges_of G2 by A58, GLIB_000:def 13;
          then e1 in G2.edgesBetween(V,{v}) by A61, A62, XBOOLE_0:def 3;
          then e1 SJoins V,{v},G2 by GLIB_000:def 30;
          then (the_Source_of G2).e1 in V &
            (the_Target_of G2).e1 in {v} or
            (the_Source_of G2).e1 in {v} &
            (the_Target_of G2).e1 in V by GLIB_000:def 15;
          then A63: u in V & w in {v} or u in {v} & w in V
            by A58, GLIB_000:def 13;
          then A64: u = v & w in V or u in V & w = v by TARSKI:def 1;
          thus not ex e2 being object st e2 Joins u,w,G4
          proof
            given e2 being object such that
              A65: e2 Joins u,w,G4;
            A66: not e2 in the_Edges_of G3
            proof
              assume e2 in the_Edges_of G3;
              then e2 Joins u,w,G3 by A65, GLIB_006:72;
              then v in the_Vertices_of G3 by A64, GLIB_000:13;
              hence contradiction by A1, Th98;
            end;
            e2 in the_Edges_of G4 by A65, GLIB_000:def 13;
            then e2 in the_Edges_of G3 \/ E;
            then A67: e2 in E by A66, XBOOLE_0:def 3;
            then consider x being Element of the_Vertices_of G1\V such that
              A68: e2 = [{the_Edges_of G2, the_Edges_of G3},x];
            (the_Source_of G4).e2 = s.e2
              .= h.e2 by A4, A67, FUNCT_4:13
              .= [{the_Edges_of G2, the_Edges_of G3},x]`2 by A4, A67, A68
              .= x;
            then (the_Source_of G4).e2 in the_Vertices_of G1 &
              not (the_Source_of G4).e2 in V by A3, XBOOLE_0:def 5;
            then per cases by A65, GLIB_000:def 13;
            suppose u in the_Vertices_of G1 & not u in V;
              hence contradiction by A1, A63, TARSKI:def 1;
            end;
            suppose w in the_Vertices_of G1 & not w in V;
              hence contradiction by A1, A63, TARSKI:def 1;
            end;
          end;
        end;
      end;
      assume A69: not ex e2 being object st e2 Joins u,w,G4;
      A70: not ex e2 being object st e2 Joins u,w,G3 by A69, GLIB_006:70;
      per cases;
      suppose A71: u = v;
        A72: not w in {v} by A57, A71, TARSKI:def 1;
        w in V
        proof
          assume A73: not w in V;
          the_Vertices_of G2 = the_Vertices_of G1 \/ {v}
            by A1, GLIB_007:def 4;
          then w in the_Vertices_of G1 by A72, XBOOLE_0:def 3;
          then A74: w in the_Vertices_of G1\V by A73, XBOOLE_0:def 5;
          set e1 = [{the_Edges_of G2,the_Edges_of G3},w];
          A75: e1 in E by A74;
          then A76: e1 in dom(E --> v);
          e1 in the_Edges_of G3 \/ E by A75, XBOOLE_0:def 3;
          then A77: e1 in the_Edges_of G4;
          A78: (the_Source_of G4).e1 = s.e1
            .= h.e1 by A4, A75, FUNCT_4:13
            .= [{the_Edges_of G2,the_Edges_of G3},w]`2 by A4, A75
            .= w;
          (the_Target_of G4).e1 = t.e1
            .= (E --> v).e1 by A76, FUNCT_4:13
            .= v by A75, FUNCOP_1:7;
          then e1 Joins v,w,G4 by A77, A78, GLIB_000:def 13;
          hence contradiction by A69, A71;
        end;
        then consider e1 being object such that
          A79: e1 in E0 & e1 Joins w,v,G2 and
          for e2 being object st e2 Joins w,v,G2 holds e1 = e2 by A2;
        take e1;
        thus e1 Joins u,w,G2 by A71, A79, GLIB_000:14;
      end;
      suppose A80: w = v;
        A81: not u in {v} by A57, A80, TARSKI:def 1;
        u in V
        proof
          assume A82: not u in V;
          the_Vertices_of G2 = the_Vertices_of G1 \/ {v}
            by A1, GLIB_007:def 4;
          then u in the_Vertices_of G1 by A81, XBOOLE_0:def 3;
          then A83: u in the_Vertices_of G1\V by A82, XBOOLE_0:def 5;
          set e1 = [{the_Edges_of G2,the_Edges_of G3},u];
          A84: e1 in E by A83;
          then A85: e1 in dom(E --> v);
          e1 in the_Edges_of G3 \/ E by A84, XBOOLE_0:def 3;
          then A86: e1 in the_Edges_of G4;
          A87: (the_Source_of G4).e1 = s.e1
            .= h.e1 by A4, A84, FUNCT_4:13
            .= [{the_Edges_of G2,the_Edges_of G3},u]`2 by A4, A84
            .= u;
          (the_Target_of G4).e1 = t.e1
            .= (E --> v).e1 by A85, FUNCT_4:13
            .= v by A84, FUNCOP_1:7;
          then e1 Joins u,v,G4 by A86, A87, GLIB_000:def 13;
          hence contradiction by A69, A80;
        end;
        then consider e1 being object such that
          A88: e1 in E0 & e1 Joins u,v,G2 and
          for e2 being object st e2 Joins u,v,G2 holds e1 = e2 by A2;
        take e1;
        thus e1 Joins u,w,G2 by A80, A88;
      end;
      suppose u <> v & w <> v;
        then A89: not u in {v} & not w in {v} by TARSKI:def 1;
        the_Vertices_of G2 = the_Vertices_of G1 \/ {v}
          by A1, GLIB_007:def 4;
        then u is Vertex of G1 & w is Vertex of G1 by A89, XBOOLE_0:def 3;
        then consider e1 being object such that
          A90: e1 Joins u,w,G1 by A57, A70, Th98;
        take e1;
        thus e1 Joins u,w,G2 by A90, GLIB_006:70;
      end;
    end;
    hence thesis by Th98;
  end;
  suppose A91: the_Vertices_of G1 \ V = {};
    take G4 = the addAdjVertexAll of G3,v,the_Vertices_of G1 \ V;
    A92: G4 is addVertex of G3, v by A91, GLIB_007:55;
    now
      thus the_Vertices_of G4
         = the_Vertices_of G3 \/ {v} by A92, GLIB_006:def 10
        .= the_Vertices_of G1 \/ {v} by Th98
        .= the_Vertices_of G2 by A1, GLIB_007:def 4;
      the_Edges_of G3 = the_Edges_of G4 by A92, GLIB_006:def 10;
      hence the_Edges_of G4 misses the_Edges_of G2 by A1;
      let u,w be Vertex of G2;
      assume A93: u <> w;
      hereby
        given e1 being object such that
          A94: e1 Joins u,w,G2;
        per cases by A94, GLIB_006:72;
        suppose A95: e1 Joins u,w,G1;
          then u is Vertex of G1 & w is Vertex of G1 by GLIB_000:13;
          then not ex e2 being object st e2 Joins u,w,G3 by A93, A95, Th98;
          hence not ex e2 being object st e2 Joins u,w,G4 by A92, GLIB_006:87;
        end;
        suppose A96: not e1 in the_Edges_of G1;
          A97: the_Edges_of G2 = the_Edges_of G1 \/ G2.edgesBetween(V,{v})
            by A1, GLIB_007:59;
          e1 in the_Edges_of G2 by A94, GLIB_000:def 13;
          then e1 in G2.edgesBetween(V,{v}) by A96, A97, XBOOLE_0:def 3;
          then e1 SJoins V,{v},G2 by GLIB_000:def 30;
          then (the_Source_of G2).e1 in V &
            (the_Target_of G2).e1 in {v} or
            (the_Source_of G2).e1 in {v} &
            (the_Target_of G2).e1 in V by GLIB_000:def 15;
          then u in V & w in {v} or u in {v} & w in V
            by A94, GLIB_000:def 13;
          then u in V & w = v or u = v & w in V by TARSKI:def 1;
          then not u in the_Vertices_of G3 or not w in the_Vertices_of G3
            by A1, Th98;
          then not ex e2 being object st e2 Joins u,w,G3 by GLIB_000:13;
          hence not ex e2 being object st e2 Joins u,w,G4 by A92, GLIB_006:87;
        end;
      end;
      assume not ex e2 being object st e2 Joins u,w,G4;
      then A98: not ex e2 being object st e2 Joins u,w,G3
        by A92, GLIB_006:87;
      A99: the_Vertices_of G2 = the_Vertices_of G1\/{v} by A1, GLIB_007:def 4;
      the_Vertices_of G1 c= V by A91, XBOOLE_1:37;
      then A100: V = the_Vertices_of G1 by XBOOLE_0:def 10;
      per cases;
      suppose A101: u = v;
        then not w in {v} by A93, TARSKI:def 1;
        then w in the_Vertices_of G1 by A99, XBOOLE_0:def 3;
        then consider e1 being object such that
          A102: e1 in E0 & e1 Joins w,v,G2 and
          for e2 being object st e2 Joins w,v,G2 holds e1 = e2
          by A2, A100;
        take e1;
        thus e1 Joins u,w,G2 by A101, A102, GLIB_000:14;
      end;
      suppose A103: w = v;
        then not u in {v} by A93, TARSKI:def 1;
        then u in the_Vertices_of G1 by A99, XBOOLE_0:def 3;
        then consider e1 being object such that
          A104: e1 in E0 & e1 Joins u,v,G2 and
          for e2 being object st e2 Joins u,v,G2 holds e1 = e2
          by A2, A100;
        take e1;
        thus e1 Joins u,w,G2 by A103, A104;
      end;
      suppose u <> v & w <> v;
        then not u in {v} & not w in {v} by TARSKI:def 1;
        then u is Vertex of G1 & w is Vertex of G1 by A99, XBOOLE_0:def 3;
        then consider e1 being object such that
          A105: e1 Joins u,w,G1 by A93, A98, Th98;
        take e1;
        thus e1 Joins u,w,G2 by A105, GLIB_006:70;
      end;
    end;
    hence thesis by Th98;
  end;
end;

theorem
  for G1 being _Graph, v being object, G2 being addVertex of G1,v
  for G3 being GraphComplement of G1 st not v in the_Vertices_of G1
  ex G4 being addAdjVertexAll of G3,v st G4 is GraphComplement of G2
proof
  let G1 be _Graph, v be object, G2 be addVertex of G1, v;
  let G3 be GraphComplement of G1;
  assume A1: not v in the_Vertices_of G1;
  the_Edges_of G1 misses the_Edges_of G3 by Th98;
  then A2: the_Edges_of G2 misses the_Edges_of G3 by GLIB_006:def 10;
  {} is Subset of the_Vertices_of G1 &
    G2 is addAdjVertexAll of G1,v,{} by XBOOLE_1:2, GLIBPRE0:51;
  then consider G4 being addAdjVertexAll of G3,v,the_Vertices_of G1 \ {}
    such that A3: G4 is GraphComplement of G2 by A1, A2, Th105;
  reconsider G4 as addAdjVertexAll of G3,v by Th98;
  take G4;
  thus thesis by A3;
end;

theorem
  for G1 being _Graph, v being object, G2 being addAdjVertexAll of G1,v
  for G3 being GraphComplement of G1, G4 being addVertex of G3,v
  st not v in the_Vertices_of G1 & the_Edges_of G2 misses the_Edges_of G3
  holds G4 is GraphComplement of G2
proof
  let G1 be _Graph, v be object, G2 be addAdjVertexAll of G1, v;
  let G3 be GraphComplement of G1, G4 be addVertex of G3, v;
  assume A1: not v in the_Vertices_of G1 &
    the_Edges_of G2 misses the_Edges_of G3;
  the_Vertices_of G1 c= the_Vertices_of G1;
  then consider G9 being
      addAdjVertexAll of G3,v,the_Vertices_of G1 \ the_Vertices_of G1 such that
    A2: G9 is GraphComplement of G2 by A1, Th105;
  the_Vertices_of G1 \ the_Vertices_of G1 = {} by XBOOLE_1:37;
  then G9 is addVertex of G3,v by GLIB_007:55;
  then G4 == G9 by GLIB_006:77;
  hence thesis by A2, Th97;
end;

theorem Th108:
  for G1 being _Graph, V being non empty Subset of the_Vertices_of G1
  for G2 being inducedSubgraph of G1, V
  for G3 being GraphComplement of G1, G4 being inducedSubgraph of G3, V
  holds G4 is GraphComplement of G2
proof
  let G1 be _Graph, V be non empty Subset of the_Vertices_of G1;
  let G2 be inducedSubgraph of G1, V;
  let G3 be GraphComplement of G1, G4 be inducedSubgraph of G3, V;
  A1: V is non empty Subset of the_Vertices_of G3 by Th98;
  then A2: the_Vertices_of G4 = V by GLIB_000:def 37
    .= the_Vertices_of G2 by GLIB_000:def 37;
  A3: the_Edges_of G4 misses the_Edges_of G2
  proof
    assume the_Edges_of G4 meets the_Edges_of G2;
    then consider e being object such that
      A4: e in the_Edges_of G4 & e in the_Edges_of G2 by XBOOLE_0:3;
    A5: e in the_Edges_of G1 \/ the_Edges_of G3 by A4, XBOOLE_0:def 3;
    the_Edges_of G3 misses the_Edges_of G1 by Th98;
    hence contradiction by A4, A5, XBOOLE_0:5;
  end;
  now
    let v,w be Vertex of G2;
    assume A6: v <> w;
    hereby
      given e2 being object such that
        A7: e2 Joins v,w,G2;
      A8: e2 Joins v,w,G1 by A7, GLIB_000:72;
      given e4 being object such that
        A9: e4 Joins v,w,G4;
      e4 Joins v,w,G3 by A9, GLIB_000:72;
      hence contradiction by A8, Th100;
    end;
    assume A10: not ex e4 being object st e4 Joins v,w,G4;
    ex e1 being object st e1 Joins v,w,G1
    proof
      assume A11: not ex e1 being object st e1 Joins v,w,G1;
      the_Vertices_of G2 c= the_Vertices_of G1;
      then v is Vertex of G1 & w is Vertex of G1 by TARSKI:def 3;
      then consider e3 being object such that
        A12: e3 Joins v,w,G3 by A6, A11, Th98;
      the_Vertices_of G2 = V by GLIB_000:def 37;
      then e3 in G3.edgesBetween(V) by A12, GLIB_000:32;
      then e3 in the_Edges_of G4 & e3 is set by A1, GLIB_000:def 37;
      then e3 Joins v,w,G4 by A12, GLIB_000:73;
      hence contradiction by A10;
    end;
    then consider e1 being object such that
      A13: e1 Joins v,w,G1;
    take e1;
    the_Vertices_of G2 = V by GLIB_000:def 37;
    then e1 in G1.edgesBetween(V) by A13, GLIB_000:32;
    then e1 in the_Edges_of G2 & e1 is set by GLIB_000:def 37;
    hence e1 Joins v,w,G2 by A13, GLIB_000:73;
  end;
  hence thesis by A2, A3, Th98;
end;

theorem
  for G1 being _Graph, V being proper Subset of the_Vertices_of G1
  for G2 being removeVertices of G1, V
  for G3 being GraphComplement of G1, G4 being removeVertices of G3, V
  holds G4 is GraphComplement of G2
proof
  let G1 be _Graph, V be proper Subset of the_Vertices_of G1;
  let G2 be removeVertices of G1, V;
  let G3 be GraphComplement of G1, G4 be removeVertices of G3, V;
  the_Vertices_of G1 \ V is non empty Subset of the_Vertices_of G1 &
    the_Vertices_of G1 \V = the_Vertices_of G3 \ V
    by Th98, XBOOLE_1:105, GLIBPRE0:6;
  hence thesis by Th108;
end;

:: involutiveness of graph complement (C case)
theorem Th110:
  for G1 being simple _Graph, G2 being GraphComplement of G1
  holds G1 is GraphComplement of G2
proof
  let G1 be simple _Graph, G2 be GraphComplement of G1;
  A1: the_Vertices_of G1 = the_Vertices_of G2 &
    the_Edges_of G1 misses the_Edges_of G2 by Th98;
  now
    let v,w be Vertex of G2;
    assume A2: v <> w;
    v is Vertex of G1 & w is Vertex of G1 by Th98;
    hence (ex e2 being object st e2 Joins v,w,G2) iff
      (not ex e1 being object st e1 Joins v,w,G1) by A2, Th98;
  end;
  hence thesis by A1, Th98;
end;

theorem Th111:
  for G1 being _Graph, G2 being GraphComplement of G1
  holds G1.order() = G2.order() by Th98;

theorem Th112:
  for G1 being _Graph, G2 being GraphComplement of G1 holds
    (G1 is _trivial iff G2 is _trivial)
proof
  let G1 be _Graph, G2 be GraphComplement of G1;
  hereby
    assume G1 is _trivial;
    then 1 = G1.order() by GLIB_000:26
      .= G2.order() by Th111;
    hence G2 is _trivial by GLIB_000:26;
  end;
  hereby
    assume G2 is _trivial;
    then 1 = G2.order() by GLIB_000:26
      .= G1.order() by Th111;
    hence G1 is _trivial by GLIB_000:26;
  end;
end;

registration
  let G be _trivial _Graph;
  cluster -> _trivial for GraphComplement of G;
  coherence by Th112;
end;

registration
  let G be non _trivial _Graph;
  cluster -> non _trivial for GraphComplement of G;
  coherence by Th112;
end;

theorem Th113:
  for G1 being _Graph, G2 being GraphComplement of G1 holds
    (G1 is complete iff G2 is edgeless) &
    (the_Edges_of G1 = G1.loops() iff G2 is complete)
proof
  let G1 be _Graph, G2 be GraphComplement of G1;
  hereby
    assume A1: G1 is complete;
    now
      let v2,w2 be Vertex of G2;
      assume A2: v2 <> w2;
      reconsider v1=v2, w1=w2 as Vertex of G1 by Th99;
      v1,w1 are_adjacent by A1, A2, CHORD:def 6;
      hence not v2,w2 are_adjacent by A2, Th99;
    end;
    hence G2 is edgeless by GLIBPRE0:60;
  end;
  hereby
    assume A3: G2 is edgeless;
    now
      let v1,w1 be Vertex of G1;
      assume A4: v1 <> w1;
      reconsider v2=v1, w2=w1 as Vertex of G2 by Th99;
      not v2,w2 are_adjacent by A3, A4, GLIBPRE0:60;
      hence v1,w1 are_adjacent by A4, Th99;
    end;
    hence G1 is complete by CHORD:def 6;
  end;
  hereby
    assume A5: the_Edges_of G1 = G1.loops();
    now
      let v2,w2 be Vertex of G2;
      assume A6: v2 <> w2;
      reconsider v1=v2, w1=w2 as Vertex of G1 by Th98;
      not ex e1 being object st e1 Joins v1,w1,G1
      proof
        given e1 being object such that
          A7: e1 Joins v1,w1,G1;
        e1 in G1.loops() by A5, A7, GLIB_000:def 13;
        then consider v9 being object such that
          A8: e1 Joins v9,v9,G1 by GLIB_009:def 2;
        v1 = v9 & w1 = v9 by A7, A8, GLIB_000:15;
        hence contradiction by A6;
      end;
      then ex e2 being object st e2 Joins v1,w1,G2 by A6, Th98;
      hence v2,w2 are_adjacent by CHORD:def 3;
    end;
    hence G2 is complete by CHORD:def 6;
  end;
  hereby
    assume A9: G2 is complete;
    now
      let e be object;
      assume A10: e in the_Edges_of G1;
      then reconsider v1=(the_Source_of G1).e, w1=(the_Target_of G1).e
        as Vertex of G1 by FUNCT_2:5;
      A11: e Joins v1,w1,G1 by A10, GLIB_000:def 13;
      then A12: v1,w1 are_adjacent by CHORD:def 3;
      reconsider v2=v1, w2=w1 as Vertex of G2 by Th99;
      assume not e in G1.loops();
      then A13: v1 <> w1 by A11, GLIB_009:def 2;
      then not v2,w2 are_adjacent by A12, Th99;
      hence contradiction by A9, A13, CHORD:def 6;
    end;
    then the_Edges_of G1 c= G1.loops() by TARSKI:def 3;
    hence the_Edges_of G1 = G1.loops() by XBOOLE_0:def 10;
  end;
  thus thesis;
end;

registration
  let G be complete _Graph;
  cluster -> edgeless for GraphComplement of G;
  coherence by Th113;
end;

registration
  let G be non complete _Graph;
  cluster -> non edgeless for GraphComplement of G;
  coherence by Th113;
end;

registration
  let G be edgeless _Graph;
  cluster -> complete for GraphComplement of G;
  coherence
  proof
    the_Edges_of G = {} & G.loops() = {};
    hence thesis by Th113;
  end;
end;

registration
  let G be non connected _Graph;
  cluster -> connected for GraphComplement of G;
  coherence
  proof
    let G2 be GraphComplement of G;
    consider G9 being LGraphComplement of G such that
      A1: G2 is removeLoops of G9 by Def9;
    thus thesis by A1;
  end;
end;

theorem
  for G1 being non _trivial _Graph, G2 being GraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 holds v1 is isolated implies v2 is non isolated
proof
  let G1 be non _trivial _Graph, G2 be GraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  assume A2: v1 is isolated;
  set v9 = the Element of the_Vertices_of G1 \ {v1};
  the_Vertices_of G1 \ {v1} <> {} by GLIB_000:20;
  then A3: v9 in the_Vertices_of G1 \ {v1};
  then reconsider v9 as Vertex of G1;
  A4: v9 <> v1 by A3, ZFMISC_1:56;
  not ex e being object st e Joins v1,v9,G1 by A2, GLIB_000:143;
  then ex e being object st e Joins v1,v9,G2 by A4, Th98;
  hence v2 is non isolated by A1, GLIB_000:143;
end;

theorem Th115:
  for G1 being _Graph, G2 being GraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & G1.order() = 2 holds
    (v1 is endvertex implies v2 is isolated) &
    (v1 is isolated implies v2 is endvertex)
proof
  let G1 be _Graph, G2 be GraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & G1.order() = 2;
  then G2.order() = 2 by Th111;
  then consider u1, u2 being object such that
    A2: u1<>u2 & the_Vertices_of G2 = {u1,u2} by CARD_2:60;
  A3: the_Vertices_of G1 = the_Vertices_of G2 by Th98;
  then reconsider u1,u2 as Vertex of G1 by A2, TARSKI:def 2;
  hereby
    assume v1 is endvertex;
    then consider e1 being object such that
      A4: v1.edgesInOut() = {e1} & not e1 Joins v1,v1,G1 by GLIB_000:def 51;
    e1 in v1.edgesInOut() by A4, TARSKI:def 1;
    then consider v9 being Vertex of G1 such that
      A5: e1 Joins v1,v9,G1 by GLIB_000:64;
    A6: v1 <> v9 by A4, A5;
    v9 in the_Vertices_of G1;
    then v9 in the_Vertices_of G2 by Th98;
    then A7: v9 = u1 or v9 = u2 by A2, TARSKI:def 2;
    assume v2 is non isolated;
    then v2.edgesInOut() <> {} by GLIB_000:def 49;
    then consider e2 being object such that
      A8: e2 in v2.edgesInOut() by XBOOLE_0:def 1;
    consider u being Vertex of G2 such that
      A9: e2 Joins v2,u,G2 by A8, GLIB_000:64;
    per cases by A2, TARSKI:def 2;
    suppose v2=u1 & u=u1;
      hence contradiction by A9, GLIB_000:18;
    end;
    suppose v2=u1 & u=u2;
      hence contradiction by A1, A5, A6, A7, A9, Th100;
    end;
    suppose v2=u2 & u=u1;
      hence contradiction by A1, A5, A6, A7, A9, Th100;
    end;
    suppose v2=u2 & u=u2;
      hence contradiction by A9, GLIB_000:18;
    end;
  end;
  assume A10: v1 is isolated;
  per cases by A2, A3, TARSKI:def 2;
  suppose A11: v1 = u1;
    not ex e1 being object st e1 Joins v1,u2,G1 by A10, GLIB_000:143;
    then consider e2 being object such that
      A12: e2 Joins v1,u2,G2 by A2, A11, Th98;
    for e being object holds e in v2.edgesInOut() iff e = e2
    proof
      let e be object;
      hereby
        assume e in v2.edgesInOut();
        then consider v9 being Vertex of G2 such that
          A13: e Joins v2,v9,G2 by GLIB_000:64;
        v9 = u2
        proof
          assume v9 <> u2;
          then v9 = u1 by A2, TARSKI:def 2;
          hence contradiction by A1, A11, A13, GLIB_000:18;
        end;
        hence e = e2 by A1, A12, A13, GLIB_000:def 20;
      end;
      reconsider w = u2 as Vertex of G2 by A2, TARSKI:def 2;
      assume e = e2;
      then e Joins v2,w,G2 & e is set by A1, A12, TARSKI:1;
      hence e in v2.edgesInOut() by GLIB_000:64;
    end;
    then v2.edgesInOut() = {e2} by TARSKI:def 1;
    hence thesis by GLIB_000:18, GLIB_000:def 51;
  end;
  suppose A14: v1 = u2;
    not ex e1 being object st e1 Joins v1,u1,G1 by A10, GLIB_000:143;
    then consider e2 being object such that
      A15: e2 Joins v1,u1,G2 by A2, A14, Th98;
    for e being object holds e in v2.edgesInOut() iff e = e2
    proof
      let e be object;
      hereby
        assume e in v2.edgesInOut();
        then consider v9 being Vertex of G2 such that
          A16: e Joins v2,v9,G2 by GLIB_000:64;
        v9 = u1
        proof
          assume v9 <> u1;
          then v9 = u2 by A2, TARSKI:def 2;
          hence contradiction by A1, A14, A16, GLIB_000:18;
        end;
        hence e = e2 by A1, A15, A16, GLIB_000:def 20;
      end;
      reconsider w = u1 as Vertex of G2 by A2, TARSKI:def 2;
      assume e = e2;
      then e Joins v2,w,G2 & e is set by A1, A15, TARSKI:1;
      hence e in v2.edgesInOut() by GLIB_000:64;
    end;
    then v2.edgesInOut() = {e2} by TARSKI:def 1;
    hence thesis by GLIB_000:18, GLIB_000:def 51;
  end;
end;

theorem
  for G1 being simple _Graph, G2 being GraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & G1.order() = 2 holds
    (v1 is endvertex iff v2 is isolated) &
    (v1 is isolated iff v2 is endvertex)
proof
  let G1 be simple _Graph, G2 be GraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & G1.order() = 2;
  then G1 is GraphComplement of G2 & G2.order() = 2 by Th110, Th111;
  hence thesis by A1, Th115;
end;

:: in case G.order() = 3 we have the endvertices of P3 with complement K2+K1
theorem
  for G1 being _Graph, G2 being GraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & 4 c= G1.order()
  holds v1 is endvertex implies v2 is non endvertex
proof
  let G1 be _Graph, G2 be GraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & 4 c= G1.order();
  assume v1 is endvertex;
  then consider x,y,z being Vertex of G1 such that
    A2: v1 <> x & v1 <> y & v1 <> z & x <> y & x <> z & y <> z and
    A3: v1,x are_adjacent & not v1,y are_adjacent & not v1,z are_adjacent
    by A1, GLIBPRE0:96;
  reconsider u = y, w = z as Vertex of G2 by Th99;
  v2,u are_adjacent & v2,w are_adjacent by A1, A2, A3, Th99;
  hence v2 is non endvertex by A2, GLIBPRE0:94;
end;

theorem Th118:
  for G1 being _Graph, G2 being GraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2 st v1 = v2
  holds v2.allNeighbors() = the_Vertices_of G2 \ (v1.allNeighbors() \/ {v2})
proof
  let G1 be _Graph, G2 be GraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2;
  consider G9 being LGraphComplement of G1 such that
    A2: G2 is removeLoops of G9 by Def9;
  reconsider v9 = v1 as Vertex of G9 by Def7;
  thus v2.allNeighbors() = v9.allNeighbors() \ {v2} by A1, A2, GLIBPRE0:63
    .= (the_Vertices_of G9 \ v1.allNeighbors()) \ {v2} by Th77
    .= the_Vertices_of G9 \ (v1.allNeighbors() \/ {v2}) by XBOOLE_1:41
    .= the_Vertices_of G2 \ (v1.allNeighbors() \/ {v2}) by A2, GLIB_000:53;
end;

theorem
  for G1 being _Graph, G2 being GraphComplement of G1
  for v1 being Vertex of G1, v2 being Vertex of G2
  st v1 = v2 & v1 is isolated
  holds v2.allNeighbors() = the_Vertices_of G2 \ {v2}
proof
  let G1 be _Graph, G2 be GraphComplement of G1;
  let v1 be Vertex of G1, v2 be Vertex of G2;
  assume A1: v1 = v2 & v1 is isolated;
  then v1.allNeighbors() = {} by GLIB_000:113;
  hence v2.allNeighbors() = the_Vertices_of G2 \ ({} \/ {v2}) by A1, Th118
    .= the_Vertices_of G2 \ {v2};
end;

begin :: Self-complementary Graphs

definition
  let G be _Graph;
  attr G is self-DLcomplementary means
  for H being DLGraphComplement of G holds H is G-Disomorphic;
  attr G is self-Lcomplementary means
  for H being LGraphComplement of G holds H is G-isomorphic;
  attr G is self-Dcomplementary means
  for H being DGraphComplement of G holds H is G-Disomorphic;
  attr G is self-complementary means
  for H being GraphComplement of G holds H is G-isomorphic;
end;

theorem
  for G being _Graph holds G is self-DLcomplementary iff
    ex H being DLGraphComplement of G st H is G-Disomorphic
proof
  let G be _Graph;
  hereby
    assume A1: G is self-DLcomplementary;
    reconsider H = the DLGraphComplement of G as DLGraphComplement of G;
    take H;
    thus H is G-Disomorphic by A1;
  end;
  given H0 being DLGraphComplement of G such that
    A2: H0 is G-Disomorphic;
  let H be DLGraphComplement of G;
  H is H0-Disomorphic by Th50;
  hence H is G-Disomorphic by A2;
end;

theorem
  for G being _Graph holds G is self-Lcomplementary iff
    ex H being LGraphComplement of G st H is G-isomorphic
proof
  let G be _Graph;
  hereby
    assume A1: G is self-Lcomplementary;
    reconsider H = the LGraphComplement of G as LGraphComplement of G;
    take H;
    thus H is G-isomorphic by A1;
  end;
  given H0 being LGraphComplement of G such that
    A2: H0 is G-isomorphic;
  let H be LGraphComplement of G;
  H is H0-isomorphic by Th68;
  hence H is G-isomorphic by A2;
end;

theorem
  for G being _Graph holds G is self-Dcomplementary iff
    ex H being DGraphComplement of G st H is G-Disomorphic
proof
  let G be _Graph;
  hereby
    assume A1: G is self-Dcomplementary;
    reconsider H = the DGraphComplement of G as DGraphComplement of G;
    take H;
    thus H is G-Disomorphic by A1;
  end;
  given H0 being DGraphComplement of G such that
    A2: H0 is G-Disomorphic;
  let H be DGraphComplement of G;
  H is H0-Disomorphic by Th85;
  hence H is G-Disomorphic by A2;
end;

theorem
  for G being _Graph holds G is self-complementary iff
    ex H being GraphComplement of G st H is G-isomorphic
proof
  let G be _Graph;
  hereby
    assume A1: G is self-complementary;
    reconsider H = the GraphComplement of G as GraphComplement of G;
    take H;
    thus H is G-isomorphic by A1;
  end;
  given H0 being GraphComplement of G such that
    A2: H0 is G-isomorphic;
  let H be GraphComplement of G;
  H is H0-isomorphic by Th104;
  hence H is G-isomorphic by A2;
end;

registration
  cluster self-DLcomplementary -> non loopless non loopfull non-Dmulti
    connected for _Graph;
  coherence
  proof
    let G1 be _Graph;
    set G2 = the DLGraphComplement of G1;
    assume G1 is self-DLcomplementary;
    then G2 is G1-Disomorphic;
    then consider F being PGraphMapping of G1, G2 such that
      A1: F is Disomorphism by GLIB_010:def 24;
    thus thesis by A1, GLIB_010:89, GLIB_010:140, GLIBPRE0:79;
  end;
  cluster self-Lcomplementary -> non loopless non loopfull non-multi
    connected for _Graph;
  coherence
  proof
    let G1 be _Graph;
    set G2 = the LGraphComplement of G1;
    assume G1 is self-Lcomplementary;
    then G2 is G1-isomorphic;
    then consider F being PGraphMapping of G1, G2 such that
      A2: F is isomorphism by GLIB_010:def 23;
    thus thesis by A2, GLIB_010:89, GLIB_010:140;
  end;
  cluster self-Dcomplementary -> Dsimple connected for _Graph;
  coherence
  proof
    let G1 be _Graph;
    set G2 = the DGraphComplement of G1;
    assume G1 is self-Dcomplementary;
    then G2 is G1-Disomorphic;
    then consider F being PGraphMapping of G1, G2 such that
      A3: F is Disomorphism by GLIB_010:def 24;
    thus thesis by A3, GLIB_010:140, GLIBPRE0:79;
  end;
  cluster self-complementary -> simple connected for _Graph;
  coherence
  proof
    let G1 be _Graph;
    set G2 = the GraphComplement of G1;
    assume G1 is self-complementary;
    then G2 is G1-isomorphic;
    then consider F being PGraphMapping of G1, G2 such that
      A4: F is isomorphism by GLIB_010:def 23;
    thus thesis by A4, GLIB_010:89, GLIB_010:140;
  end;
end;

:: K2 with an added loop is self-DLcomplementary and
:: P4 with loops at the endvertices or the other two vertices
:: is self-Lcomplementary, but both won't be clustered here
:: hence no existence cluster for the attributes here
registration
  cluster _trivial edgeless -> self-Dcomplementary self-complementary
    for _Graph;
  coherence by GLIB_010:178;
  cluster self-Dcomplementary self-complementary -> _trivial edgeless
    for _Graph;
  coherence
  proof
    let G be _Graph;
    assume A1: G is self-Dcomplementary self-complementary;
    set H1 = the DGraphComplement of G, H2 = the GraphComplement of G;
    H1 is G-Disomorphic by A1;
    then consider F1 being PGraphMapping of G, H1 such that
      A2: F1 is Disomorphism by GLIB_010:def 24;
    H2 is G-isomorphic by A1;
    then consider F2 being PGraphMapping of G, H2 such that
      A3: F2 is isomorphism by GLIB_010:def 23;
    now
      let v1,v2 be Vertex of G;
      assume A4: v1 <> v2;
      assume A5: not v1,v2 are_adjacent;
      not ex e being object st e DJoins v1,v2,G
      proof
        given e being object such that
          A6: e DJoins v1,v2,G;
        e Joins v1,v2,G by A6, GLIB_000:16;
        hence contradiction by A5, CHORD:def 3;
      end;
      then consider e1 being object such that
        A7: e1 DJoins v1,v2,H1 by A4, Th80;
      not ex e being object st e DJoins v2,v1,G
      proof
        given e being object such that
          A8: e DJoins v2,v1,G;
        e Joins v1,v2,G by A8, GLIB_000:16;
        hence contradiction by A5, CHORD:def 3;
      end;
      then consider e2 being object such that
        A9: e2 DJoins v2,v1,H1 by A4, Th80;
      A10: e1 Joins v1,v2,H1 & e2 Joins v1,v2,H1 by A7, A9, GLIB_000:16;
      H1 is non-multi by A1, A2, GLIB_010:89;
      then e1 = e2 by A10, GLIB_000:def 20;
      hence contradiction by A4, A7, A9, GLIB_000:125;
    end;
    then G is complete by CHORD:def 6;
    hence thesis by A3, GLIB_010:89; :: the complement must be edgeless
  end;
  cluster self-DLcomplementary -> non _trivial non self-Lcomplementary
    non self-Dcomplementary non self-complementary for _Graph;
  coherence
  proof
    let G be _Graph;
    assume A11: G is self-DLcomplementary;
    hence A12: G is non _trivial;
    thus G is non self-Lcomplementary
    proof
      assume A13: G is self-Lcomplementary;
      set H1 = the DLGraphComplement of G, H2 = the LGraphComplement of G;
      H1 is G-Disomorphic by A11;
      then consider F1 being PGraphMapping of G, H1 such that
        A14: F1 is Disomorphism by GLIB_010:def 24;
      H2 is G-isomorphic by A13;
      then consider F2 being PGraphMapping of G, H2 such that
        A15: F2 is isomorphism by GLIB_010:def 23;
      now
        let v1,v2 be Vertex of G;
        assume A16: v1 <> v2;
        assume A17: not v1,v2 are_adjacent;
        not ex e being object st e DJoins v1,v2,G
        proof
          given e being object such that
            A18: e DJoins v1,v2,G;
          e Joins v1,v2,G by A18, GLIB_000:16;
          hence contradiction by A17, CHORD:def 3;
        end;
        then consider e1 being object such that
          A19: e1 DJoins v1,v2,H1 by Def6;
        not ex e being object st e DJoins v2,v1,G
        proof
          given e being object such that
            A20: e DJoins v2,v1,G;
          e Joins v1,v2,G by A20, GLIB_000:16;
          hence contradiction by A17, CHORD:def 3;
        end;
        then consider e2 being object such that
          A21: e2 DJoins v2,v1,H1 by Def6;
        A22: e1 Joins v1,v2,H1 & e2 Joins v1,v2,H1 by A19, A21, GLIB_000:16;
        H1 is non-multi by A13, A14, GLIB_010:89;
        then e1 = e2 by A22, GLIB_000:def 20;
        hence contradiction by A16, A19, A21, GLIB_000:125;
      end;
      then A23: G is complete by CHORD:def 6;
      then A24: the_Edges_of H2 = H2.loops() by Th75;
      consider v1, v2 being Vertex of G such that
        A25: v1 <> v2 by A12, GLIB_000:21;
      consider e being object such that
        A26: e Joins v1,v2,G by A23, A25, CHORD:def 6, CHORD:def 3;
      dom F2_E = the_Edges_of G & dom F2_V = the_Vertices_of G
        by A15, GLIB_010:def 11;
      then A27: e in dom F2_E & v1 in dom F2_V & v2 in dom F2_V
        by A26, GLIB_000:def 13;
      then A28: F2_E.e Joins F2_V.v1,F2_V.v2,H2 by A26, GLIB_010:4;
      F2_V.v1 <> F2_V.v2 by A15, A25, A27, FUNCT_1:def 4;
      then not F2_E.e in H2.loops() by A28, GLIB_009:46;
      hence contradiction by A24, A28, GLIB_000:def 13;
    end;
    thus thesis by A11;
  end;
  cluster self-Lcomplementary -> non _trivial non self-DLcomplementary
    non self-Dcomplementary non self-complementary for _Graph;
  coherence;
end;

registration
  cluster self-Dcomplementary self-complementary for _Graph;
  existence
  proof
    take the _trivial edgeless _Graph;
    thus thesis;
  end;
end;