(def-language octet-language (extensible (*octet-type* octet)) (base-types octet) (constants (logxor (octet octet octet)) (logand (octet octet octet)) (logneg (octet octet))))
(def-theory pre-octets (language octet-language) (component-theories h-o-real-arithmetic) (axioms ("forall(x:octet,logxor(x,logneg(x))=0#8)") (logand-is-idempotent "forall(x:octet,logand(x,x)=x)" rewrite) (associativity-of-logand "forall(x,y,z:octet,logand(logand(x,y),z)=logand(x,logand(y,z)))") ("forall(c,y,z:octet, logand(c,logxor(y,z))=logxor(logand(c,y),logand(c,z)))") ("forall(x:octet,logand(255#8,x)=x)") ("forall(x,y:octet,logand(x,y)=logand(y,x))") (associativity-of-logxor "forall(x,y,z:octet,logxor(logxor(x,y),z)=logxor(x,logxor(y,z)))") ("forall(x:octet,logxor(x,0#8)=x)") ("forall(x,y:octet,logxor(x,y)=logxor(y,x))")))
(def-theorem logand-is-total "total_q{logand,[octet,octet -> octet]}" (usages d-r-convergence) (theory pre-octets) (proof ( insistent-direct-inference (instantiate-theorem associativity-of-logand ("x_0" "x_1" "x_1")) )))
(def-theorem logxor-is-total "total_q{logxor,[octet,octet -> octet]}" (usages d-r-convergence) (theory pre-octets) (proof ( insistent-direct-inference (instantiate-theorem associativity-of-logxor ("x_0" "x_1" "x_1")) )))
(def-constant atomic%octet "lambda(x:octet, not(x=0#8) and forall(y:octet, logand(x,y)=y implies y=x or y=0#8))" (theory pre-octets))
(def-theory octets (component-theories pre-octets) (axioms (atom-1 "atomic%octet(1#8)") (atom-2 "atomic%octet(2#8)") (atom-4 "atomic%octet(4#8)") (atom-8 "atomic%octet(8#8)") (atom-16 "atomic%octet(16#8)") (atom-32 "atomic%octet(32#8)") (atom-64 "atomic%octet(64#8)") (atom-128 "atomic%octet(128#8)") ))
(def-algebraic-processor octet-algebraic-processor (language octets) (base ((scalars *octet-type*) (operations (+ logxor) (* logand) (- logneg)) use-numerals-for-ground-terms commutes)))
(def-theory-processors octets (algebraic-simplifier (octet-algebraic-processor logxor logand logneg)) (algebraic-term-comparator octet-algebraic-processor))
(def-theorem logand-simplification-lemma-1 "forall(o_1,o_2:octet, logand(logand(o_1,o_2),o_2) = logand(o_1,o_2))" lemma (theory octets) (proof ( simplify (apply-macete-with-minor-premises logand-is-idempotent) simplify )))
(def-theorem octet-unit-decomposition "with(o:octet, 255#8 = logxor(1#8, logxor(2#8, logxor(4#8, logxor(8#8, logxor(16#8, logxor(32#8, logxor(64#8, 128#8))))))))" (theory octets) (proof ( simplify )))
(def-theorem octet-decomposition "forall(o:octet, o = logxor(logand(1#8,o), logxor(logand(2#8,o), logxor(logand(4#8,o), logxor(logand(8#8,o), logxor(logand(16#8,o), logxor(logand(32#8,o), logxor(logand(64#8,o), logand(128#8,o)))))))))" (theory octets) (proof ( simplify )))
(def-constant octet%to%nn "lambda(o:octet, if(logand(1#8,o) = 1#8,1,0) * 2^0 + if(logand(2#8,o) = 2#8,1,0) * 2^1 + if(logand(4#8,o) = 4#8,1,0) * 2^2 + if(logand(8#8,o) = 8#8,1,0) * 2^3 + if(logand(16#8,o) = 16#8,1,0) * 2^4 + if(logand(32#8,o) = 32#8,1,0) * 2^5 + if(logand(64#8,o) = 64#8,1,0) * 2^6 + if(logand(128#8,o) = 128#8,1,0) * 2^7)" (theory octets))
(def-theorem octet%to%nn-is-injective "forall(o_1,o_2:octet, octet%to%nn(o_1) = octet%to%nn(o_2) implies o_1 = o_2)" (theory octets) (proof ( (informal-justification "follows from the fact that two polynomials in a natural number n with natural number coefficients less than n are equal iff their coefficients are equal.") )))
(def-constant octet%lt "lambda(o_1,o_2:octet, octet%to%nn(o_1) < octet%to%nn(o_2))" (usages rewrite) (theory octets))
(def-constant octet%le "lambda(o_1,o_2:octet, octet%to%nn(o_1) < octet%to%nn(o_2) or o_1 =o_2)" (usages rewrite) (theory octets))
(def-theorem octet%lt-irreflexivity "forall(o:octet, not(octet%lt(o,o)))" (theory octets) (proof ( (unfold-single-defined-constant-globally octet%lt) simplify )))
(def-theorem octet%lt-trichotomy "forall(o_1,o_2:octet, octet%lt(o_1,o_2) or o_1 = o_2 or octet%lt(o_2,o_1))" (theory octets) (proof ( (unfold-single-defined-constant-globally octet%lt) direct-inference (instantiate-theorem trichotomy ("octet%to%nn(o_2)" "octet%to%nn(o_1)")) direct-inference (block (script-comment "`instantiate-theorem' at (0 1)") direct-inference (contrapose "with(o_2,o_1:octet,not(o_1=o_2));") (instantiate-theorem octet%to%nn-is-injective ("o_1" "o_2")) ) direct-inference (block (script-comment "`instantiate-theorem' at (1 1 0)") (unfold-single-defined-constant (0) octet%to%nn) simplify ) (unfold-single-defined-constant (0) octet%to%nn) )))
(def-theorem octet%lt-transitivity "forall(o_1,o_2,o_3:octet, octet%lt(o_1,o_2) and octet%lt(o_2,o_3) implies octet%lt(o_1,o_3))" (theory octets) (proof ( (unfold-single-defined-constant-globally octet%lt) direct-and-antecedent-inference-strategy (apply-macete-with-minor-premises transitivity) auto-instantiate-existential )))