Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Archive-of-Formal-Proofs/thys/Flyspeck-Tame/   (Archive of formal Proofs Version 2026-5©)  Datei vom 31.4.2026 mit Größe 10 kB image not shown  

Quelle  Graph.thy

  Sprache: Isabelle
 

(*  Author:     Gertrud Bauer, Tobias Nipkow
*)


section Graph

theory Graph
imports Rotation
begin

syntax
  "_UNION1"     :: "pttrns 'b set 'b set"           ((3(unbreakable)/ _) [01010)
  "_INTER1"     :: "pttrns 'b set 'b set"           ((3(unbreakable)/ _) [01010)
  "_UNION"      :: "pttrn 'a set 'b set 'b set"  ((3(unbreakable_)/ _) [001010)
  "_INTER"      :: "pttrn 'a set 'b set 'b set"  ((3(unbreakable_)/ _) [001010)


subsectionNotation

type_synonym vertex = "nat"

consts
  vertices :: "'a vertex list"
  edges :: "'a (vertex × vertex) set" (E)

abbreviation vertices_set :: "'a vertex set" (Vwhere
  "V f set (vertices f)"


subsection Faces

text 
  represent faces by (distinct) lists of vertices and a face type.
 


datatype facetype = Final | Nonfinal

datatype face = Face "(vertex list)"  facetype

consts final :: "'a bool"
consts type :: "'a facetype"

overloading
  final_face  "final :: face bool"
  type_face  "type :: face facetype"
  vertices_face  "vertices :: face vertex list"
  cong_face  "pr_isomorphic :: face face bool"
begin

primrec final_face where
  "final (Face vs f) = (case f of Final True | Nonfinal False)"

primrec type_face where
  "type (Face vs f) = f"

primrec vertices_face where
  "vertices (Face vs f) = vs"

definition cong_face :: "face face bool"
  where "(f1 :: face) f2 vertices f1 vertices f2"

end

text The following operation makes a face final.

definition setFinal :: "face face" where
  "setFinal f Face (vertices f) Final"


text The function nextVertex (written f v) is based on
 nextElem, that returns the successor of an element in a list.


primrec nextElem :: "'a list 'a 'a 'a" where
 "nextElem [] b x = b"
|"nextElem (a#as) b x =
    (if x=a then (case as of [] b | (a'#as') a') else nextElem as b x)"

definition nextVertex :: "face vertex vertex" (*<*)(\<open>_ \<bullet>\<close> [999]) (*>*)where (* *)
 "f let vs = vertices f in nextElem vs (hd vs)"


text nextVertices is $n$-fold application of
 nextvertex.


definition nextVertices :: "face nat vertex vertex" (*<*)(\<open>_\<^bsup>_\<^esup> \<bullet> _\<close> [100, 0, 100]) (*>*)where (* *)
  "f v (f ^^ n) v"

lemma nextV2: "fv = f (f v)"
by (simp add: nextVertices_def eval_nat_numeral)

(*<*)
overloading edges_face  "edges :: face (vertex × vertex) set"
begin
  definition "E f {(a, f a)|a. a V f}"
end
(*>*)

(*<*)consts op :: "'a \<Rightarrow> 'a" (\<open>_\<^bsup>op\<^esup>\<close> [1000] 999)  (*>*) (* *)
overloading op_vertices  "Graph.op :: vertex list vertex list"
begin
  definition "(vs::vertex list) rev vs"
end

overloading op_graph  "Graph.op :: face face"
begin
  primrec op_graph where "(Face vs f) = Face (rev vs) f"
end

(*<*)
lemma [simp]: "vertices ((f::face)) = (vertices f)"
  by (induct f) (simp add: op_vertices_def)
lemma [simp]: "xs [] ==> hd (rev xs)= last xs"
  by(induct xs) simp_all (*>*) (* *)

definition prevVertex :: "face vertex vertex" (*<*)(\<open>_\<^bsup>-1\<^esup> \<bullet>\<close> [100]) (*>*)where (* *)
  "f1 v (let vs = vertices f in nextElem (rev vs) (last vs) v)"

abbreviation
  triangle :: "face bool" where
  "triangle f == |vertices f| = 3"


subsection Graphs

datatype graph = Graph "(face list)" "nat" "face list list" "nat list"

primrec faces :: "graph face list" where
  "faces (Graph fs n f h) = fs"

abbreviation
  Faces :: "graph face set" (Fwhere
  "F g == set(faces g)"

primrec countVertices :: "graph nat" where
  "countVertices (Graph fs n f h) = n"

overloading
  vertices_graph  "vertices :: graph vertex list"
begin
  primrec vertices_graph where "vertices (Graph fs n f h) = [0 ..< n]"
end

lemma vertices_graph: "vertices g = [0 ..< countVertices g]"
by (induct g) simp

lemma in_vertices_graph:
  "v set (vertices g) = (v < countVertices g)"
by (simp add:vertices_graph)

lemma len_vertices_graph:
  "|vertices g| = countVertices g"
by (simp add:vertices_graph)

primrec faceListAt :: "graph face list list" where
  "faceListAt (Graph fs n f h) = f"

definition facesAt :: "graph vertex face list" where
 "facesAt g v 🚫if v set(vertices g) then faceListAt g ! v 🚫else []"

primrec heights :: "graph  nat list" where
  "heights (Graph fs n f h) = h"

definition height :: "graph  vertex  nat" where
  "height g v  heights g ! v"

definition graph :: "nat  graph" where
  "graph n 
    (let vs = [0 ..< n];
     fs = [ Face vs Final, Face (rev vs) Nonfinal]
     in (Graph fs n (replicate n fs) (replicate n 0)))"

subsectionOperations on graphs

text final graph, final / nonfinal faces

definition finals :: "graph  face list" where
  "finals g  [f  faces g. final f]"

definition nonFinals :: "graph  face list" where
  "nonFinals g  [f  faces g. ¬ final f]"

definition countNonFinals :: "graph  nat" where
  "countNonFinals g  |nonFinals g|"

overloading finalGraph "final :: graph  bool"
begin
  definition "finalGraph g  (nonFinals g = [])"
end

lemma finalGraph_faces[simp]: "final g ==> finals g = faces g"
 by (simp add: finalGraph_def finals_def nonFinals_def filter_compl1)

lemma finalGraph_face: "final g ==> f  set (faces g) ==> final f"
  by (simp only: finalGraph_faces[symmetric]) (simp add: finals_def)


definition finalVertex :: "graph  vertex  bool" where
  "finalVertex g v   set(facesAt g v). final f"

lemma finalVertex_final_face[dest]:
  "finalVertex g v ==> f  set (facesAt g v) ==> final f"
  by (auto simp add: finalVertex_def)




text counting faces

definition degree :: "graph  vertex  nat" where
  "degree g v  |facesAt g v|"

definition tri :: "graph  vertex  nat" where
 "tri g v  |[f  facesAt g v. final f  |vertices f| = 3]|"

definition quad :: "graph  vertex  nat" where
 "quad g v  |[f  facesAt g v. final f  |vertices f| = 4]|"

definition except :: "graph  vertex  nat" where
 "except g v  |[f  facesAt g v. final f  5  |vertices f| ]|"

definition vertextype :: "graph  vertex  nat × nat × nat" where
  "vertextype g v  (tri g v, quad g v, except g v)"

lemma[simp]: "0  tri g v" by (simp add: tri_def)

lemma[simp]: "0  quad g v" by (simp add: quad_def)

lemma[simp]: "0  except g v" by (simp add: except_def)


definition exceptionalVertex :: "graph  vertex  bool" where
  "exceptionalVertex g v  except g v  0"

definition noExceptionals :: "graph  vertex set  bool" where
  "noExceptionals g V  ( V. ¬ exceptionalVertex g v)"


text An edge $(a,b)$ is contained in face f,
  $b$ is the successor of $a$ in $f$.
(*>*)
overloading edges_graph "edges :: graph  (vertex × vertex) set"
begin
  definition "E (g::graph)    F g edges f"
end

definition neighbors :: "graph  vertex  vertex list" where
 "neighbors g v  [fv. f  facesAt g v]"


subsection Navigation in graphs

text
The function $s'$ permutating the faces at a vertex,
is implemeted by the function nextFace
\<close>

definition nextFace :: "definition nextFace :: "graph \<times> vertex \<Rightarrow> face \<Rightarrow> face" (*<*)(_ (*>*)where
(*<*) nextFace_def_aux: "p \<bullet> \<equiv> \<lambda>f. (let (g,v) = p; fs = (facesAt g v) in
   (case fs of []  f
           | g#gs  nextElem fs (hd fs) f))" (*>*)


(* precondition a b in f *)
definition directedLength :: "face  vertex  vertex  nat" where
  "directedLength f a b 
  if a = b then 0 else |(between (vertices f) a b)| + 1"


subsection Code generator setup

definition final_face :: "face  bool" where
  final_face_code_def [code_abbrev]: "final_face = final"

lemma final_face_code [code]:
  "final_face (Face vs Final)  True"
  "final_face (Face vs Nonfinal)  False"
  by (simp_all add: final_face_code_def)

definition final_graph :: "graph  bool" where
  final_graph_code_def [code_abbrev]: "final_graph = final"

lemma final_graph_code [code]: "final_graph g = List.null (nonFinals g)"
  by (simp add: final_graph_code_def finalGraph_def)

definition vertices_face :: "face  vertex list" where
  vertices_face_code_def [code_abbrev]: "vertices_face = vertices"

lemma vertices_face_code [code]: "vertices_face (Face vs f) = vs"
  unfolding vertices_face_code_def by simp

definition vertices_graph :: "graph  vertex list" where
  vertices_graph_code_def [code_abbrev]: "vertices_graph = vertices"

lemma vertices_graph_code [code]:
  "vertices_graph (Graph fs n f h) = [0 ..< n]"
  unfolding vertices_graph_code_def by simp

end

Messung V0.5 in Prozent
C=83 H=89 G=85

¤ Dauer der Verarbeitung: 0.16 Sekunden  (vorverarbeitet am  2026-07-02) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.