(def-theorem removing-an-element-from-a-finite-set 
    "forall(s:sets[ind_1], x:ind_1, f_indic_q{s} and x in s implies 
                                                  f_card{s}=f_card{s diff singleton{x}}+1)"
    (usages transportable-macete)
    (theory generic-theory-1)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (force-substitution "s" "(s diff singleton{x}) union singleton{x}
" (0))
        (move-to-sibling 1)
        (apply-macete-with-minor-premises tr%diff-union-equal-whole)
        simplify-insistently
        (apply-macete-with-minor-premises f-card-disjoint-union)
        (apply-macete-with-minor-premises singleton-has-f-card-one-rewrite)
        (cut-with-single-formula "#(f_card{s diff singleton{x}})")
        simplify
        (apply-macete-with-minor-premises subset-of-finite-indic-is-finite)
        (instantiate-existential ("s"))
        simplify-insistently
        (apply-macete-with-minor-premises iota-free-definition-of-f-indic-q)
        (apply-macete-with-minor-premises singleton-has-f-card-one-rewrite)
        (instantiate-existential ("1"))
        (apply-macete-with-minor-premises tr%diff-with-indic-is-disj-from-indic)
        )))


(def-constant maximal 
    "lambda(x:uu,s:sets[uu], x in s and forall(y:uu, y in s and x prec y implies x=y))"
    (theory partial-order))


(def-theorem finite-sets-have-maximal-elements 
    "forall(s:sets[uu], f_indic_q{s} and nonempty_indic_q{s} 
                                              implies 
                                            forsome(x:uu, maximal(x,s)))"
    (theory partial-order)
    (usages transportable-macete)
    (proof
      (
        (apply-macete-with-minor-premises tr%iota-free-definition-of-f-indic-q)
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "forsome(m:zz, 1<=m and n=m)")
        (move-to-sibling 1)
        (instantiate-existential ("n"))
        (backchain-backwards "with(n:nn,n=n);")
        (force-substitution "1" "f_card{singleton{x}}" (0))
        (apply-macete-with-minor-premises tr%f-card-leq-iff-finite-and-embeds)
        (apply-macete-with-minor-premises tr%iota-free-definition-of-f-indic-q)
        direct-and-antecedent-inference-strategy
        (move-to-sibling 1)
        (apply-macete-with-minor-premises tr%subset-embeds-in-superset)
        simplify-insistently
        (instantiate-existential ("n"))
        (apply-macete-with-minor-premises tr%singleton-has-f-card-one-rewrite)
        (antecedent-inference "with(p:prop,forsome(m:zz,p));")
        (incorporate-antecedent "with(n:nn,n=n);")
        (backchain "with(p:prop,p and p);")
        (antecedent-inference "with(p:prop,p and p);")
        (weaken (0))
        (weaken (1))
        (cut-with-single-formula "forall(s:sets[uu], f_card{s}=m implies forsome(x_$4:uu,maximal(x_$4,s)))")
        (backchain "with(p:prop,forall(s:sets[uu],p));")
        (induction trivial-integer-inductor ("m"))
        beta-reduce-repeatedly
        (apply-macete-with-minor-premises tr%singleton-has-f-card-one)
        direct-and-antecedent-inference-strategy
        (instantiate-existential ("y"))
        (unfold-single-defined-constant (0) maximal)
        (backchain "with(p:prop,p);")
        (backchain "with(p:prop,p);")
        (apply-macete-with-minor-premises tr%singleton-equality-conversion)
        simplify
        (cut-with-single-formula "forsome(x:uu, x in s)")
        (antecedent-inference "with(s:sets[uu],nonempty_indic_q{s});")
        (instantiate-universal-antecedent "with(p:prop,forall(s:sets[uu],p));"
				            ("s diff singleton{x}"))
        (contrapose "with(p:prop,not(p));")
        (cut-with-single-formula "f_card{s}=f_card{s diff singleton{x}}+1")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises tr%removing-an-element-from-a-finite-set)
        simplify
        (case-split ("x_$9 prec x"))
        (instantiate-existential ("x"))
        (unfold-single-defined-constant (0) maximal)
        direct-and-antecedent-inference-strategy
        (contrapose "with(f:sets[uu],x_$9:uu,maximal(x_$9,f));")
        (unfold-single-defined-constant (0) maximal)
        (contrapose "with(p:prop,not(p));")
        (antecedent-inference "with(p:prop,p and p);")
        (contrapose "with(p:prop,forall(y_$0:uu,p));")
        (instantiate-existential ("y"))
        simplify-insistently
        (apply-macete-with-minor-premises prec-transitivity)
        auto-instantiate-existential
        (contrapose "with(p:prop,not(p));")
        (apply-macete-with-minor-premises prec-anti-symmetry)
        simplify
        (instantiate-existential ("x_$9"))
        (incorporate-antecedent "with(f:sets[uu],x_$9:uu,maximal(x_$9,f));")
        (unfold-single-defined-constant-globally maximal)
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(x_$9:uu,f,s:sets[uu],x_$9 in s diff f);")
        simplify-insistently
        simplify
        (backchain "with(p:prop,forall(y_$0:uu,p));")
        (cut-with-single-formula "not(x=y)")
        (move-to-ancestor 1)
        simplify-insistently
        (simplify-antecedent "with(y,x_$9:uu,x_$9 prec y);")
        (apply-macete-with-minor-premises tr%rev%positive-f-card-iff-nonempty)
        simplify
        )))

(def-transported-symbols (maximal)
    (translation order-reverse)
    (renamer third-renamer))


(def-theorem finite-sets-have-minimal-elements 
    "forall(s:sets[uu], f_indic_q{s} and nonempty_indic_q{s} 
                                              implies 
                                            forsome(x:uu, minimal(x,s)))"
    (theory partial-order)
    (usages transportable-macete)
    (proof
      (
        
        (apply-macete-with-minor-premises tr%finite-sets-have-maximal-elements)
        )))


(def-theory linear-order 
    (component-theories partial-order)
    (axioms
      (totality-of-order
        "forall(a,b:uu, a prec b or b prec a)")))


(def-constant maximum 
    "lambda(x:uu, s:sets[uu], x in s and forall(y:uu, y in s implies y prec x))"
    (theory partial-order))


(def-theorem maximal-is-maximum 
    "forall(a:uu, s:sets[uu], maximal(a,s) implies maximum(a,s))"
    (usages transportable-macete)
    (theory linear-order)
    (proof
      (
        unfold-defined-constants
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "y prec a or a prec a")
        (move-to-ancestor 1)
        (cut-with-single-formula "y prec a or a prec y")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises totality-of-order)
        (antecedent-inference "with(p:prop,p or p);")
        (instantiate-universal-antecedent "with(p:prop,forall(y:uu,p));" ("y"))
        simplify
        )))
        

(def-transported-symbols (maximum)
    (translation order-reverse)
    (renamer fourth-renamer))


(def-translation linear-order-reverse 
    (source linear-order)
    (target linear-order)
    (core-translation order-reverse)
    (theory-interpretation-check using-simplification))


(def-theorem minimal-is-minimum 
    "forall(a:uu, s:sets[uu], minimal(a,s) implies minimum(a,s))"
    (theory linear-order)
    (proof
      (
        (apply-macete-with-minor-premises tr%maximal-is-maximum)
        )))


(def-theorem finite-sets-have-maximum-elements 
    "forall(s:sets[uu], f_indic_q{s} and nonempty_indic_q{s} 
                                              implies 
                                            forsome(x:uu, maximum(x,s)))"
    (theory linear-order)
    (usages transportable-macete)
    (proof
      (
        
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises maximal-is-maximum)
        (apply-macete-with-minor-premises finite-sets-have-maximal-elements)
        direct-and-antecedent-inference-strategy
        (instantiate-existential ("x"))
        )))


(def-theorem finite-sets-have-minimum-elements 
    "forall(s:sets[uu], f_indic_q{s} and nonempty_indic_q{s} 
                                              implies 
                                            forsome(x:uu, minimum(x,s)))"
    (theory linear-order)
    (usages transportable-macete)
    (proof
      (
        
        (apply-macete-with-minor-premises tr%finite-sets-have-maximum-elements)
        )))