(load-section basic-cardinality)
(def-language graph-language
(embedded-language the-kernel-theory)
(base-types vertices edges)
(constants
(endpoints "[edges -> sets[vertices]]")))
(def-theory graphs
(language graph-language)
(component-theories h-o-real-arithmetic)
(axioms
(edges-have-two-endpoints
"forall(e:edges, forsome(v_1,v_2: vertices,
endpoints(e) = singleton{v_1} union singleton{v_2}))")))
(def-theorem endpoints-is-total
"total_q{endpoints,[edges -> sets[vertices]]}"
(usages d-r-convergence)
(theory graphs)
(proof
(
insistent-direct-inference
(instantiate-theorem edges-have-two-endpoints ("x_0"))
)))
(def-constant loop
"lambda(e:edges, singleton{endpoints(e)})"
(theory graphs))
(def-constant parallel
"lambda(e_1,e_2:edges, endpoints(e_1) = endpoints(e_2))"
(theory graphs))
(def-constant adjacent%vertices
"lambda(v_1,v_2:vertices, forsome(e:edges,
endpoints(e) = singleton{v_1} union singleton{v_2}))"
(theory graphs))
(def-constant adjacent%edges
"lambda(e_1,e_2:edges, forsome(v:vertices,
v in endpoints(e_1) and v in endpoints(e_2)))"
(theory graphs))
(def-constant vertex%incidence%set
"lambda(v:vertices, indic{e:edges, v in endpoints(e)})"
(theory graphs))
(def-constant degree
"lambda(v:vertices, f_card{vertex%incidence%set(v)})"
(theory graphs))
(def-constant isolated
"lambda(v:vertices, degree(v) = 0)"
(theory graphs))