Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

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›)/ _)› [0, 10] 10)
  "_INTER1"     :: "pttrns → 'b set → 'b set"           (‹(3∩(‹unbreakable›)/ _)› [0, 10] 10)
  "_UNION"      :: "pttrn → 'a set → 'b set → 'b set"  (‹(3∪(‹unbreakable›∈_)/ _)› [0, 0, 10] 10)
  "_INTER"      :: "pttrn → 'a set → 'b set → 'b set"  (‹(3∩(‹unbreakable›∈_)/ _)› [0, 0, 10] 10)


subsection‹Notation›

type_synonym vertex = "nat"

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

abbreviation vertices_set :: "'a → vertex set" (‹V›) where
  "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: "f∙v = 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" (‹F›) where
  "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)))"

subsection‹Operations 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 ≡ ∀f ∈ 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 ∈ 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 ≡ [f∙v. 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=80 G=81

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-09-29) ¤

*© 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.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1126438
#Domains=1897691