Theory Plane

Up to index of Isabelle/HOL/Flyspeck-Tame

theory Plane
imports Enumerator FaceDivision RTranCl
(*  Author:     Gertrud Bauer
*)


header{* Plane Graph Enumeration *}

theory Plane
imports Enumerator FaceDivision RTranCl
begin


definition maxGon :: "nat => nat" where
"maxGon p ≡ p+3"

declare maxGon_def [simp]


definition duplicateEdge :: "graph => face => vertex => vertex => bool" where
"duplicateEdge g f a b ≡
2 ≤ directedLength f a b ∧ 2 ≤ directedLength f b a ∧ b ∈ set (neighbors g a)"


primrec containsUnacceptableEdgeSnd ::
"(nat => nat => bool) => nat => nat list => bool" where
"containsUnacceptableEdgeSnd N v [] = False" |
"containsUnacceptableEdgeSnd N v (w#ws) =
(case ws of [] => False
| (w'#ws') => if v < w ∧ w < w' ∧ N w w' then True
else containsUnacceptableEdgeSnd N w ws)"


primrec containsUnacceptableEdge :: "(nat => nat => bool) => nat list => bool" where
"containsUnacceptableEdge N [] = False" |
"containsUnacceptableEdge N (v#vs) =
(case vs of [] => False
| (w#ws) => if v < w ∧ N v w then True
else containsUnacceptableEdgeSnd N v vs)"


definition containsDuplicateEdge :: "graph => face => vertex => nat list => bool" where
"containsDuplicateEdge g f v is ≡
containsUnacceptableEdge (λi j. duplicateEdge g f (fi•v) (fj•v)) is"


definition containsDuplicateEdge' :: "graph => face => vertex => nat list => bool" where
"containsDuplicateEdge' g f v is ≡
2 ≤ |is| ∧
((∃k < |is| - 2. let i0 = is!k; i1 = is!(k+1); i2 = is!(k+2) in
(duplicateEdge g f (fi1 •v) (fi2 •v)) ∧ (i0 < i1) ∧ (i1 < i2))
∨ (let i0 = is!0; i1 = is!1 in
(duplicateEdge g f (fi0 •v) (fi1 •v)) ∧ (i0 < i1)))"



definition generatePolygon :: "nat => vertex => face => graph => graph list" where
"generatePolygon n v f g ≡
let enumeration = enumerator n |vertices f|;
enumeration = [is \<leftarrow> enumeration. ¬ containsDuplicateEdge g f v is];
vertexLists = [indexToVertexList f v is. is \<leftarrow> enumeration] in
[subdivFace g f vs. vs \<leftarrow> vertexLists]"


definition next_plane0 :: "nat => graph => graph list" ("next'_plane0_") where
"next_plane0p g ≡
if final g then []
else \<Squnion>f∈nonFinals g \<Squnion>v∈vertices f \<Squnion>i∈[3..<Suc(maxGon p)] generatePolygon i v f g"



definition Seed :: "nat => graph" ("Seed_") where
"Seedp ≡ graph(maxGon p)"

lemma Seed_not_final[iff]: "¬ final (Seed p)"
by(simp add:Seed_def graph_def finalGraph_def nonFinals_def)

definition PlaneGraphs0 :: "graph set" where
"PlaneGraphs0 ≡ \<Union>p. {g. Seedp [next_plane0p]->* g ∧ final g}"

end