(load-section basic-cardinality)
(def-language pre-network-language
(base-types hosts spnets)
(sorts (loopbacks spnets))
(constants
(iface%relation "[hosts, spnets -> prop]")
(loopback%spnet "[hosts -> loopbacks]")
))
(def-theory pre-networks
(language pre-network-language)
(component-theories h-o-real-arithmetic)
(axioms
(loopback_spnet-is-bijective
"bijective_q{loopback%spnet}")
(loopback_spnet-gives-spnet-with-a-single-host
"forall(h:hosts,
indic{h_1:hosts, iface%relation(h_1,loopback%spnet(h))}
=
singleton{h})")
))
(def-theorem loopback_spnet-host
"forall(h:hosts, iface%relation(h,loopback%spnet(h)))"
(theory pre-networks)
(proof
(
direct-inference
(instantiate-theorem
loopback_spnet-gives-spnet-with-a-single-host
("h"))
(contrapose "with(p:prop,p);")
extensionality
(instantiate-existential ("h"))
simplify
)))
(def-theorem loopback_spnet-is-total
"total_q{loopback%spnet,[hosts -> loopbacks]}"
(theory pre-networks)
(usages d-r-convergence)
(proof
(
insistent-direct-inference
(instantiate-theorem loopback_spnet-host ("x_0"))
)))
(def-cartesian-product pre%ifaces
(hosts spnets)
(constructor make%pre%iface)
(accessors iface%host iface%spnet)
(theory pre-networks))
(def-theorem interfaces-exist
"forsome(x:pre%ifaces,
iface%relation(iface%host(x),iface%spnet(x)))"
(theory pre-networks)
(proof
(
(instantiate-existential
("with(h:hosts,make%pre%iface(h,loopback%spnet(h)))"))
simplify
(apply-macete-with-minor-premises loopback_spnet-host)
)))
(def-atomic-sort ifaces
"lambda(p:pre%ifaces,
iface%relation(iface%host(p), iface%spnet(p)))"
(theory pre-networks))
(def-constant loopback%iface
"lambda(h:hosts, make%pre%iface(h,loopback%spnet(h)))"
(theory pre-networks))
(def-constant hosts%of%spnet
"lambda(s:spnets, indic{h:hosts, iface%relation(h,s)})"
(theory pre-networks))
(def-constant is%loopback%spnet
"lambda(s:spnets, f_card{hosts%of%spnet(s)} = 1)"
(theory pre-networks))
(def-theorem loopback_spnet-gives-a-loopback-spnet
"forall(h:hosts, is%loopback%spnet(loopback%spnet(h)))"
(theory pre-networks)
(proof
(
direct-inference
(unfold-single-defined-constant-globally is%loopback%spnet)
(apply-macete-with-minor-premises tr%singleton-has-f-card-one)
(block
(script-comment "`apply-macete-with-minor-premises' at (0)")
(instantiate-existential ("h"))
(unfold-single-defined-constant-globally hosts%of%spnet)
(instantiate-theorem
loopback_spnet-gives-spnet-with-a-single-host
("h")))
simplify
)))
(def-constant is%point%to%point%spnet
"lambda(s:spnets, f_card{hosts%of%spnet(s)} = 2)"
(theory pre-networks))
(def-constant spnets%of%host
"lambda(h:hosts, indic{s:spnets, iface%relation(h,s)})"
(theory pre-networks))
(def-constant is%single%homed
"lambda(h:hosts, 2 = f_card{spnets%of%host(h)})"
(theory pre-networks))
(def-constant is%multi%homed
"lambda(h:hosts, 3 <= f_card{spnets%of%host(h)})"
(theory pre-networks))
(def-language network-language
(embedded-languages pre-networks octets)
(constants
(address%relation "[ifaces, addresses -> prop]")
(mask%relation "[ifaces, masks -> prop]")
))
(def-theory networks
(language network-language)
(component-theories pre-networks octets)
(axioms
(loopback-interface-has-loopback%address
"forall(h:hosts,
address%relation(loopback%iface(h),loopback%address))")
(loopback-interface-has-loopback%mask
"forall(h:hosts,
mask%relation(loopback%iface(h),loopback%mask))")
))
(def-constant addr%to%iface
"lambda(a:addresses, iota(i:ifaces, address%relation(i,a)))"
(theory networks))
(def-constant ifaces%of%host
"lambda(h:hosts,
indic{i:ifaces,
forsome(s:spnets,
i = make%pre%iface(h,s) and iface%relation(h,s))})"
(theory networks))
(def-theorem iface-is-an-iface-of-host
"forall(i:ifaces, i in ifaces%of%host(iface%host(i)))"
(theory networks)
(proof
(
direct-inference
(unfold-single-defined-constant-globally ifaces%of%host)
simplify-insistently
(instantiate-existential ("iface%spnet(i)"))
simplify
(apply-macete-with-minor-premises
ifaces-in-quasi-sort_pre-networks)
)))
(def-constant ifaces%of%spnet
"lambda(s:spnets,
indic{i:ifaces,
forsome(h:hosts,
i = make%pre%iface(h,s) and iface%relation(h,s))})"
(theory networks))
(def-constant addresses%of%host
"lambda(h:hosts,
indic{a:addresses,
forsome(i:ifaces,
h = iface%host(i) and address%relation(i,a))})"
(theory networks))
(def-constant masks%of%host
"lambda(h:hosts,
indic{m:masks,
forsome(i:ifaces,
h = iface%host(i) and mask%relation(i,m))})"
(theory networks))
(def-constant addresses%of%spnet
"lambda(s:spnets,
indic{a:addresses,
forsome(i:ifaces,
s = iface%spnet(i) and address%relation(i,a))})"
(theory networks))
(def-constant masks%of%spnet
"lambda(s:spnets,
indic{m:masks,
forsome(i:ifaces,
s = iface%spnet(i) and mask%relation(i,m))})"
(theory networks))
(def-constant spnet%is%conventional
"lambda(s:spnets,
forsome(m:masks,
forall(i:ifaces,
iface%spnet(i) = s implies mask%relation(i,m))))"
(theory networks))
(def-constant network%is%conventional
"forall(s:spnets, spnet%is%conventional(s))"
(theory networks))
(def-constant spnet%mask
"lambda(s:spnets,
iota(m:masks,
forall(i:ifaces,
iface%spnet(i) = s implies mask%relation(i,m))))"
(theory networks))
(def-constant spnet%address
"lambda(s:spnets,
iota(a:addresses,
forall(i:ifaces, b:addresses,
iface%spnet(i) = s
and
address%relation(i,b)
implies
a = address%and(b,spnet%mask(s)))))"
(theory networks))
(def-constant directly%connected
"lambda(h_1,h_2:hosts,
forsome(s:spnets,
h_1 in hosts%of%spnet(s) and h_2 in hosts%of%spnet(s)))"
(theory networks))
(def-recursive-constant connected
Remark: This entry is multiply defined. See: [1] [2]
"lambda(con:[hosts,hosts -> prop],
lambda(h_1,h_2:hosts,
directly%connected(h_1,h_2)
or
forsome(h_3:hosts, directly%connected(h_1,h_3) and con(h_3,h_2))))"
(theory networks))
(def-theorem host-spnet-inversion
"forall(h:hosts, s:spnets,
h in hosts%of%spnet(s) iff s in spnets%of%host(h))"
(theory networks)
(proof
(
direct-inference
unfold-defined-constants
simplify-insistently
)))
(def-theorem hosts-are-self-connected
"forall(h:hosts, connected(h,h))"
(theory networks)
(proof
(
direct-inference
(unfold-single-defined-constant-globally connected)
direct-and-antecedent-inference-strategy
(contrapose "with(p:prop,p);")
(unfold-single-defined-constant-globally directly%connected)
(instantiate-existential ("loopback%spnet(h)"))
(unfold-single-defined-constant-globally hosts%of%spnet)
simplify-insistently
(apply-macete-with-minor-premises loopback_spnet-host)
)))