Thm* For any graph
the_obj:GraphObject(the_graph), P:(V Traversal Traversal Prop), s:Traversal, i:V. ( s1,s2:Traversal, i:V. P(i,s1,s2)  l_disjoint(V+V;s2;s1) & no_repeats(V+V;s2))  ( s:Traversal, i:V. member-paren(x,y.the_obj.eq(x,y);i;s)  P(i,s,nil))  ( s1,s2,s3:Traversal, i,j:V. i-the_graph- > j  P(j,s1,s2)  P(i,s2 @ s1,s3)  P(i,s1,s3 @ s2))  ( s1,s2:Traversal, i:V. member-paren(x,y.the_obj.eq(x,y);i;s1)  ( j:V. i-the_graph- > j  j = i  (inl(j) s2) member-paren(x,y.the_obj.eq(x,y);j;s1))  P(i,[inr(i) / s1],s2)  P(i,s1,[inl(i) / (s2 @ [inr(i)])]))  ( s':Traversal. P(i,s,s') & dfs(the_obj;s;i) = (s' @ s)) | [dfs_induction3] |
Thm* For any graph
the_obj:GraphObject(the_graph), P:(V Traversal Traversal Prop), s:Traversal, i:V. ( s1,s2:Traversal, i:V. P(i,s1,s2)  l_disjoint(V+V;s2;s1) & no_repeats(V+V;s2))  ( s:Traversal, i:V. member-paren(x,y.the_obj.eq(x,y);i;s)  P(i,s,nil))  ( s1,s2,s3:Traversal, i,j:V. i-the_graph- > j  P(j,s1,s2)  P(i,s2 @ s1,s3)  P(i,s1,s3 @ s2))  ( s1,s2:Traversal, i:V. member-paren(x,y.the_obj.eq(x,y);i;s1)  P(i,[inr(i) / s1],s2)  P(i,s1,[inl(i) / (s2 @ [inr(i)])]))  ( s':Traversal. P(i,s,s') & dfs(the_obj;s;i) = (s' @ s)) | [dfs_induction] |
Thm* For any graph
the_obj:GraphObject(the_graph). M:(Traversal  ). ( i:V, s:Traversal. M([inl(i) / s]) M(s)) & ( i:V, s:Traversal. member-paren(x,y.the_obj.eq(x,y);i;s)  M([inr(i) / s]) < M(s)) | [dfs-measure] |
Thm* For any graph
the_obj:GraphObject(the_graph). ( x,y:V. the_obj.eq(x,y)  x = y) & ( T:Type, s:T, x:V, f:(T V T). L:V List. ( y:V. x-the_graph- > y  (y L)) & the_obj.eacc(f,s,x) = list_accum(s',x'.f(s',x');s;L)) & ( T:Type, s:T, f:(T V T). L:V List. no_repeats(V;L) & ( y:V. (y L)) & the_obj.vacc(f,s) = list_accum(s',x'.f(s',x');s;L)) | [graphobj-properties] |
Thm* For any graph
t:GraphObject(the_graph). t.eqw ( x,y:V. t.eq(x,y)  x = y) | [gro_eqw_wf] |
Def dfs(the_obj;s;i) == if member-paren(x,y.the_obj.eq(x,y);i;s) s else [inl(i) / (the_obj.eacc(( s',j. dfs(the_obj;s';j)),[inr(i) / s],i))] fi (recursive) | [dfs] |