(def-recursive-constant br%partial%trans%closure "lambda(f:[nn,sets[ind_1,ind_1],sets[ind_1,ind_1]], lambda(n:nn,r:sets[ind_1,ind_1], if(n=0, r, lambda(s:sets[ind_1,ind_1], lambda(x,y:ind_1, if(forsome(z:ind_1, #(s(x,z)) and #(r(z,y))), an%individual, ?unit%sort))) (f(n-1,r)))))" (theory generic-theory-1) (definition-name br%partial%trans%closure))
(def-theorem br%partial%trans%closure-total-aux "forall(r:sets[ind_1,ind_1],n:zz, 0<=n implies #(br%partial%trans%closure(n,r)))" (theory generic-theory-1) (proof ( (induction integer-inductor ("n")) )))
(def-theorem br%partial%trans%closure-is-total "total_q{br%partial%trans%closure,[nn,sets[ind_1,ind_1],sets[ind_1,ind_1]]}" (theory generic-theory-1) (usages d-r-convergence) (proof ( insistent-direct-inference (apply-macete-with-minor-premises br%partial%trans%closure-total-aux) (apply-macete-with-minor-premises nn-in-quasi-sort_h-o-real-arithmetic) )))
(def-theorem br%partial%trans%closure-lemma-1 "forall(m:nn,n:zz,r:sets[ind_1,ind_1], 0<=n implies forall(x,y,z:ind_1, #(br%partial%trans%closure(m,r)(x,y)) and #(br%partial%trans%closure(n,r)(y,z)) implies #(br%partial%trans%closure(m+n+1,r)(x,z))))" (theory generic-theory-1) (proof ( (induction trivial-integer-inductor ("n")) beta-reduce-repeatedly (unfold-single-defined-constant (1 2) br%partial%trans%closure) simplify (unfold-single-defined-constant (0) br%partial%trans%closure) simplify (instantiate-existential ("z_$0")) (backchain "with(p:prop,forall(x,z:ind_1,p))") (instantiate-existential ("y")) )))
(def-theorem br%partial%trans%closure-lemma-2 "forall(n:zz,r:sets[ind_1,ind_1], br%symmetric(r) and 0<=n implies forall(x,y:ind_1, #(br%partial%trans%closure(n,r)(x,y)) implies #(br%partial%trans%closure(n,r)(y,x))))" (theory generic-theory-1) (proof ( (unfold-single-defined-constant (0) br%symmetric) (induction trivial-integer-inductor ("n")) beta-reduce-repeatedly (unfold-single-defined-constant-globally br%partial%trans%closure) (instantiate-existential ("z_$0")) (move-to-ancestor 8) (unfold-single-defined-constant (0) br%partial%trans%closure) simplify direct-and-antecedent-inference-strategy (instantiate-universal-antecedent "with(r:sets[ind_1,ind_1],forall(x,y:ind_1,#(r(x,y)) implies #(r(y,x))))" ("z_$0" "y")) (instantiate-universal-antecedent "with(p:prop,forall(x,y:ind_1,p))" ("x" "z_$0")) (cut-with-single-formula "#(br%partial%trans%closure(0,r)(y,z_$0))") (force-substitution "1+t" "0+t+1" (0)) (apply-macete-with-minor-premises br%partial%trans%closure-lemma-1) auto-instantiate-existential simplify (unfold-single-defined-constant (0) br%partial%trans%closure) )))
(def-constant br%trans%closure "lambda(r:sets[ind_1,ind_1], lambda(x,y:ind_1, if(forsome(n:nn, #(br%partial%trans%closure(n,r)(x,y))), an%individual, ?unit%sort)))" (theory generic-theory-1))
(def-theorem transitive-closure-is-transitive "forall(r:sets[ind_1,ind_1], br%transitive(br%trans%closure(r)))" (theory generic-theory-1) (proof ( unfold-defined-constants (raise-conditional (0)) (raise-conditional (0)) (raise-conditional (0)) direct-and-antecedent-inference-strategy (contrapose "with(p:prop,not(p))") (instantiate-existential ("n_$0+n+1")) (apply-macete-with-minor-premises br%partial%trans%closure-lemma-1) auto-instantiate-existential (apply-macete-with-minor-premises nn-in-quasi-sort_h-o-real-arithmetic) )))
(def-theorem trans-closure-of-reflexive-relation-is-reflexive "forall(r:sets[ind_1,ind_1], br%reflexive(r) implies br%reflexive(br%trans%closure(r)))" (theory generic-theory-1) (proof ( unfold-defined-constants direct-and-antecedent-inference-strategy simplify (instantiate-existential ("0")) (unfold-single-defined-constant (0) br%partial%trans%closure) )))
(def-theorem trans-closure-of-symmetric-relation-is-symmetric "forall(r:sets[ind_1,ind_1], br%symmetric(r) implies br%symmetric(br%trans%closure(r)))" (theory generic-theory-1) (proof ( unfold-defined-constants simplify direct-and-antecedent-inference-strategy (instantiate-existential ("n")) (apply-macete-with-minor-premises br%partial%trans%closure-lemma-2) direct-inference (unfold-single-defined-constant (0) br%symmetric) (apply-macete-with-minor-premises nn-in-quasi-sort_h-o-real-arithmetic) )))
(def-constant br%union "lambda(r,s:sets[ind_1,ind_1], lambda(x,y:ind_1, if(#(r(x,y)) or #(s(x,y)), an%individual, ?unit%sort)))" (theory generic-theory-1))
(def-theorem union-of-reflexive-relations-is-reflexive "forall(r,s:sets[ind_1,ind_1], br%reflexive(r) and br%reflexive(s) implies br%reflexive(br%union(r,s)))" (theory generic-theory-1) (proof ( unfold-defined-constants direct-and-antecedent-inference-strategy (case-split-on-conditionals (0)) )))
(def-theorem union-of-symmetric-relations-is-symmetric "forall(r,s:sets[ind_1,ind_1], br%symmetric(r) and br%symmetric(s) implies br%symmetric(br%union(r,s)))" (theory generic-theory-1) (proof ( unfold-defined-constants (raise-conditional (0)) direct-and-antecedent-inference-strategy (case-split-on-conditionals (0)) (case-split-on-conditionals (0)) )))
(def-theorem trans-closure-of-union-of-equiv-rels-is-an-equiv-rel "forall(r,s:sets[ind_1,ind_1], br%equiv%relation(r) and br%equiv%relation(s) implies br%equiv%relation(br%trans%closure(br%union(r,s))))" (theory generic-theory-1) (proof ( (unfold-single-defined-constant-globally br%equiv%relation) direct-and-antecedent-inference-strategy (apply-macete-with-minor-premises trans-closure-of-reflexive-relation-is-reflexive) (apply-macete-with-minor-premises union-of-reflexive-relations-is-reflexive) direct-inference (apply-macete-with-minor-premises trans-closure-of-symmetric-relation-is-symmetric) (apply-macete-with-minor-premises union-of-symmetric-relations-is-symmetric) direct-inference (apply-macete-with-minor-premises transitive-closure-is-transitive) )))