(def-constant power 
    "lambda(s:sets[ind_1], indic{a:sets[ind_1], a subseteq s})"
    (theory generic-theory-1))


(def-constant filter 
    "lambda(x:ind_1, indic{a:sets[ind_1], x in a})"
    (theory generic-theory-1))


(def-theorem power-decomposition 
    "forall(s:sets[ind_1], x:ind_1, n:nn, 
                        x in s 
                        implies
                  power(s)=power(s diff singleton{x}) union 
                                    power(s) inters filter(x))"
    (theory generic-theory-1)
    (proof
      (
        
        direct-and-antecedent-inference-strategy
        unfold-defined-constants
        set-equality-script
        direct-and-antecedent-inference-strategy
        (contrapose "with(p:prop,not(p));")
        simplify-insistently
        (contrapose "with(p:prop,not(p));")
        simplify
        direct-and-antecedent-inference-strategy
        set-containment-script
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(f,x:sets[ind_1],x subseteq f);")
        simplify-insistently
        )))


(def-theorem power-disjointness 
    "forall(s:sets[ind_1], x:ind_1, n:nn, 
                  power(s diff singleton{x}) disj power(s) inters filter(x))"
    (theory generic-theory-1)
    (proof
      (
        
        direct-and-antecedent-inference-strategy
        unfold-defined-constants
        simplify-insistently
        
        )))


(def-theorem power-reduction 
    "forall(s:sets[ind_1], x:ind_1, x in s 
                          implies
                        power(s) inters filter(x) equinumerous power(s diff singleton{x}))"
    (theory generic-theory-1)
    (proof
      (
        
        direct-and-antecedent-inference-strategy
        (instantiate-existential ("lambda(t:sets[ind_1],
          if(t in power(s) inters filter(x), t diff singleton{x}, ?sets[ind_1]))"))
        insistent-direct-inference-strategy
        (apply-macete-with-minor-premises tr%indic-free-characterization-of-dom)
        beta-reduce-repeatedly
        direct-and-antecedent-inference-strategy
        simplify
        (weaken (0))
        unfold-defined-constants
        (apply-macete-with-minor-premises tr%indic-free-characterization-of-ran)
        beta-reduce-repeatedly
        (apply-macete-with-minor-premises tr%equality-of-conditional-term)
        (apply-macete-with-minor-premises indicator-facts-macete)
        beta-reduce-repeatedly
        direct-and-antecedent-inference-strategy
        (instantiate-existential ("y_$0 union singleton{x}"))
        set-containment-script
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(f,y_$0:sets[ind_1],y_$0 subseteq f);")
        simplify-insistently
        simplify
        simplify-insistently
        (apply-macete-with-minor-premises diff-conditionally-onto)
        (incorporate-antecedent "with(f,y_$0:sets[ind_1],y_$0 subseteq f);")
        simplify-insistently
        (incorporate-antecedent "with(y_$0,f:sets[ind_1],f=y_$0);")
        (move-to-ancestor 1)
        (backchain-backwards "with(y_$0,f:sets[ind_1],f=y_$0);")
        set-containment-script
        direct-and-antecedent-inference-strategy
        simplify
        (weaken (1))
        (incorporate-antecedent "with(p:prop,p and p and p);")
        beta-reduce-repeatedly
        (apply-macete-with-minor-premises tr%equality-of-conditional-term)
        (apply-macete-with-minor-premises tr%equality-of-conditional-term-backwards)
        (apply-macete-with-minor-premises diff-conditionally-one-to-one)
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(x_$0:sets[ind_1],x:ind_1,s:sets[ind_1],
    x_$0 in power(s) inters filter(x));")
        unfold-defined-constants
        simplify-insistently
        (incorporate-antecedent "with(x_$3:sets[ind_1],x:ind_1,s:sets[ind_1],
    x_$3 in power(s) inters filter(x));")
        unfold-defined-constants
        simplify-insistently
        )))


(def-constant combinations 
    "lambda(s:sets[ind_1], n:nn, indic{a:sets[ind_1], a subseteq s and f_card{a}=n})"
    (theory generic-theory-1))


(def-theorem combination-decomposition 
    "forall(s:sets[ind_1], x:ind_1, n:nn, 
                        x in s 
                        implies
                  combinations(s,n)=combinations(s diff singleton{x},n) union 
                                                      combinations(s,n) inters filter(x))"
    (theory generic-theory-1)
    (proof
      (
        
        direct-and-antecedent-inference-strategy
        unfold-defined-constants
        set-equality-script
        direct-and-antecedent-inference-strategy
        (contrapose "with(p:prop,not(p));")
        simplify-insistently
        (contrapose "with(p:prop,not(p));")
        simplify
        direct-and-antecedent-inference-strategy
        set-containment-script
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(f,x:sets[ind_1],x subseteq f);")
        simplify-insistently
        )))


(def-theorem combination-disjointness 
    "forall(s:sets[ind_1], x:ind_1, n:nn, 
                  combinations(s diff singleton{x},n) disj combinations(s,n) inters filter(x))"
    (theory generic-theory-1)
    (proof
      (
        
        direct-and-antecedent-inference-strategy
        unfold-defined-constants
        simplify-insistently
        
        )))


(def-theorem combination-reduction 
    "forall(s:sets[ind_1], x:ind_1, n:nn, 
                      x in s and 1<=n
                          implies
              combinations(s,n) inters filter(x) equinumerous
              combinations(s diff singleton{x},n-1))"
    (theory  generic-theory-1)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (instantiate-existential ("lambda(t:sets[ind_1],
          if(t in combinations(s,n) inters filter(x), t diff singleton{x}, ?sets[ind_1]))"))
        insistent-direct-inference-strategy
        (apply-macete-with-minor-premises tr%indic-free-characterization-of-dom)
        beta-reduce-repeatedly
        direct-and-antecedent-inference-strategy
        simplify
        (weaken (0))
        unfold-defined-constants
        (apply-macete-with-minor-premises tr%indic-free-characterization-of-ran)
        beta-reduce-repeatedly
        (apply-macete-with-minor-premises tr%equality-of-conditional-term)
        (apply-macete-with-minor-premises indicator-facts-macete)
        beta-reduce-repeatedly
        direct-and-antecedent-inference-strategy
        (instantiate-existential ("y_$0 union singleton{x}"))
        set-containment-script
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(f,y_$0:sets[ind_1],y_$0 subseteq f);")
        simplify-insistently
        simplify
        (apply-macete-with-minor-premises f-card-disjoint-union)
        (apply-macete-with-minor-premises singleton-has-f-card-one-lemma-2)
        (move-to-ancestor 1)
        (apply-macete-with-minor-premises singleton-has-f-card-one-rewrite)
        simplify
        (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"))
        (incorporate-antecedent "with(f,s,y_$0:sets[ind_1],y_$0 subseteq s diff f);")
        simplify-insistently
        simplify-insistently
        (apply-macete-with-minor-premises diff-conditionally-onto)
        (incorporate-antecedent "with(f,y_$0:sets[ind_1],y_$0 subseteq f);")
        simplify-insistently
        (incorporate-antecedent "with(y_$0,f:sets[ind_1],f=y_$0);")
        (move-to-ancestor 1)
        (backchain-backwards "with(y_$0,f:sets[ind_1],f=y_$0);")
        set-containment-script
        direct-and-antecedent-inference-strategy
        simplify
        (backchain-backwards "with(y_$0,f:sets[ind_1],f=y_$0);")
        (apply-macete-with-minor-premises f_card_difference)
        (move-to-sibling 1)
        simplify-insistently
        (apply-macete-with-minor-premises singleton-has-f-card-one-rewrite)
        simplify
        (weaken (1))
        (incorporate-antecedent "with(p:prop,p and p and p);")
        beta-reduce-repeatedly
        (apply-macete-with-minor-premises tr%equality-of-conditional-term)
        (apply-macete-with-minor-premises tr%equality-of-conditional-term-backwards)
        (apply-macete-with-minor-premises diff-conditionally-one-to-one)
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(x_$0:sets[ind_1],x:ind_1,n:nn,s:sets[ind_1],
    x_$0 in combinations(s,n) inters filter(x));")
        unfold-defined-constants
        simplify-insistently
        (incorporate-antecedent "with(x_$3:sets[ind_1],x:ind_1,n:nn,s:sets[ind_1],
    x_$3 in combinations(s,n) inters filter(x));")
        unfold-defined-constants
        simplify-insistently
        )))


(def-theorem power-card 
    "forall(s:sets[ind_1],f_indic_q{s} implies f_card{power(s)}=2^f_card{s})"
    (theory  generic-theory-1)
    (usages transportable-macete)
    (proof
      (
        
        (block
          (script-comment "this is the basic set induction script.")
          (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, 0<=m and n=m)")
          (move-to-sibling 1)
          (instantiate-existential ("n"))
          (apply-macete-with-minor-premises nn-in-quasi-sort_h-o-real-arithmetic)
          (backchain "with(n:nn,n=n);")
          (antecedent-inference "with(p:prop,forsome(m:zz,p));")
          (backchain "with(p:prop,p and p);")
          (incorporate-antecedent "with(n:nn,n=n);")
          (backchain "with(p:prop,p);")
          (antecedent-inference "with(p:prop,p);")
          (weaken (0))
          (cut-with-single-formula
            "forall(s:sets[ind_1], f_card{s}=m implies f_card{power(s)}=2^m)")
          (backchain "with(p:prop,forall(s:sets[ind_1],p));")
          (induction trivial-integer-inductor ("m"))
          )
        beta-reduce-repeatedly
        simplify
        (apply-macete-with-minor-premises empty-indic-has-f-card-zero)
        (apply-macete-with-minor-premises tr%singleton-has-f-card-one)
        direct-and-antecedent-inference-strategy
        (backchain "with(p:prop,p);")
        (instantiate-existential ("empty_indic{ind_1}"))
        (weaken (0))
        (unfold-single-defined-constant (0) power)
        set-equality-script
        direct-and-antecedent-inference-strategy
        set-equality-script
        (apply-macete-with-minor-premises indicator-facts-macete)
        (incorporate-antecedent "with(p:prop,p);")
        simplify-insistently
        (apply-macete-with-minor-premises tr%subseteq-antisymmetry)
        direct-and-antecedent-inference-strategy
        (unfold-single-defined-constant (0) power)
        (cut-with-single-formula "forsome(x:ind_1, x in s)")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises rev%positive-f-card-iff-nonempty)
        simplify
        (antecedent-inference "with(s:sets[ind_1],nonempty_indic_q{s});")
        (instantiate-universal-antecedent "with(p:prop,forall(s:sets[ind_1],p));"
				            ("s diff singleton{x}"))
        (contrapose "with(p:prop,not(p));")
        (apply-macete-with-minor-premises f_card_difference)
        (apply-macete-with-minor-premises singleton-has-f-card-one-rewrite)
        simplify
        simplify-insistently
        (force-substitution "power(s)"
			"power(s diff singleton{x}) union 
                                    power(s) inters filter(x)"
			(0))
        (apply-macete-with-minor-premises power-decomposition)
        (apply-macete-with-minor-premises tr%f-card-disjoint-union)
        (cut-with-single-formula "f_card{power(s) inters filter(x)}=f_card{power(s diff singleton{x})}")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises tr%f-card-equal-iff-finite-and-equinumerous)
        (apply-macete-with-minor-premises tr%iota-free-definition-of-f-indic-q)
        direct-and-antecedent-inference-strategy
        auto-instantiate-existential
        (apply-macete-with-minor-premises power-reduction)
        (apply-macete-with-minor-premises power-reduction)
        (unfold-single-defined-constant (0) power)
        (unfold-single-defined-constant (0) power)
        (backchain "with(f:sets[sets[ind_1]],f_card{f}=f_card{f});")
        (case-split ("t=0"))
        simplify
        (apply-macete-with-minor-premises exp-out)
        simplify
        (apply-macete-with-minor-premises tr%iota-free-definition-of-f-indic-q)
        (cut-with-single-formula "f_card{power(s) inters filter(x)}=f_card{power(s diff singleton{x})}")
        (backchain "with(f:sets[sets[ind_1]],f_card{f}=f_card{f});")
        auto-instantiate-existential
        (apply-macete-with-minor-premises power-disjointness)
        (apply-macete-with-minor-premises power-decomposition)
        )))


(def-theorem subset-equal-if-equal-cardinality 
    "forall(s,a:sets[ind_1], a subseteq s and f_card{a}=f_card{s} implies a=s)"
    (theory  generic-theory-1)
    (proof
      (
        
        (apply-macete-with-minor-premises tr%subseteq-antisymmetry)
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "s subseteq a iff f_card{s diff a}=0")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises empty-indic-has-f-card-zero)
        (apply-macete-with-minor-premises tr%subseteq-antisymmetry)
        direct-and-antecedent-inference-strategy
        set-containment-script
        direct-and-antecedent-inference-strategy
        (contrapose "with(p:prop,not(p));")
        simplify
        simplify-insistently
        set-containment-script
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "s diff a subseteq empty_indic{ind_1};")
        simplify-insistently
        (backchain "with(p:prop,p iff p);")
        (apply-macete-with-minor-premises f_card_difference)
        simplify
        )))


(def-theorem comb-reduction-schema 
    "forall(p:[zz,zz,prop],
          forall(k,m:zz,
              1<=k and k<=m and p(m,k-1) and p(m,k) implies p(1+m,k))
            and 
          forall(k:zz,0<=k implies p(k,0))
            and 
          forall(j:zz,0<=j implies p(j,j))
            implies 
          forall(m,k:zz,k<=m and 0<=k implies p(m,k)))"
    (theory h-o-real-arithmetic)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "forall(m:zz,0<=m implies forall(k,j:zz,0<=k and k<=j and j<=m implies p(j,k)))")
        (backchain "with(p:prop,forall(m:zz,0<=m implies forall(k,j:zz,p)));")
        (instantiate-existential ("m"))
        simplify
        simplify
        (weaken (4 3))
        (induction trivial-integer-inductor ("m"))
        beta-reduce-repeatedly
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "k=0 and j=0")
        simplify
        simplify
        (case-split ("k=0"))
        simplify
        (case-split ("j<=t"))
        (backchain "forall(k,j:zz,
    with(p:prop,p and p and p)
      implies 
    with(p:[zz,zz,prop],p(j,k)));")
        direct-and-antecedent-inference-strategy
        (case-split ("k=j"))
        (backchain "with(j,k:zz,k=j);")
        simplify
        (force-substitution "j" "1+(j-1)" (0))
        (backchain "with(r:rr,
    forall(k,m:zz,
        with(p:prop,p and p and p and p)
          implies 
        with(p:[zz,zz,prop],p(r,k))));")
        direct-and-antecedent-inference-strategy
        (backchain "forall(k,j:zz,
    with(p:prop,p and p and p)
      implies 
    with(p:[zz,zz,prop],p(j,k)));")
        simplify
        (backchain "forall(k,j:zz,
    with(p:prop,p and p and p)
      implies 
    with(p:[zz,zz,prop],p(j,k)));")
        simplify
        simplify
        (backchain "forall(k,j:zz,
    with(p:prop,p and p and p)
      implies 
    with(p:[zz,zz,prop],p(j,k)));")
        simplify
        simplify
        )))
      


(def-theorem combinations-card 
    "forall(s:sets[ind_1],k:zz,
          f_indic_q{s} and 0<=k and k<=f_card{s}
            implies 
          f_card{combinations(s,k)}=comb(f_card{s},k))"
    (theory generic-theory-1)
    (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, 0<=m and n=m)")
        (move-to-sibling 1)
        (instantiate-existential ("n"))
        (apply-macete-with-minor-premises nn-in-quasi-sort_h-o-real-arithmetic)
        (backchain "with(n:nn,n=n);")
        (antecedent-inference "with(p:prop,forsome(m:zz,p));")
        (backchain "with(p:prop,p and 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))
        direct-and-antecedent-inference-strategy
        (contrapose "with(s:sets[ind_1],k:zz,k<=f_card{s});")
        (backchain "with(m:zz,n:nn,n=m);")
        (contrapose "with(p:prop,not(p));")
        (incorporate-antecedent "with(m:zz,n:nn,n=m);")
        (cut-with-single-formula
	"forall(s:sets[ind_1], f_card{s}=m implies f_card{combinations(s,k)}=comb(m,k))")
        direct-inference
        (backchain "with(p:prop,forall(s:sets[ind_1],p));")
        (force-substitution "forall(s:sets[ind_1],
        f_card{s}=m implies 
        f_card{combinations(s,k)}=comb(m,k))"
			"lambda(m,k:zz,forall(s:sets[ind_1],
        f_card{s}=m implies 
        f_card{combinations(s,k)}=comb(m,k)))(m,k)"
			(0))
        (move-to-sibling 1)
        beta-reduce-repeatedly
        (apply-macete-with-minor-premises comb-reduction-schema)
        beta-reduce-repeatedly
        direct-and-antecedent-inference-strategy
        (weaken (7 6 5))
        (cut-with-single-formula "forsome(x:ind_1, x in s_$0)")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises rev%positive-f-card-iff-nonempty)
        simplify
        (antecedent-inference "with(s_$0:sets[ind_1],nonempty_indic_q{s_$0});")
        (instantiate-universal-antecedent "with(k_$0:zz,r:rr,m_$0:zz,
    forall(s_$0:sets[ind_1],
        f_card{s_$0}=m_$0
          implies 
        f_card{combinations(s_$0,r)}=comb(m_$0,k_$0-1)));"
				            ("s_$0 diff singleton{x}"))
        (contrapose "with(p:prop,not(p));")
        (apply-macete-with-minor-premises f_card_difference)
        (move-to-sibling 1)
        set-containment-script
        simplify
        (apply-macete-with-minor-premises singleton-has-f-card-one-rewrite)
        simplify
        (force-substitution 
          "combinations(s_$0,k_$0)"
          "combinations(s_$0 diff singleton{x},k_$0) union combinations(s_$0,k_$0) inters filter(x)"
          (0))
        (move-to-sibling 1)
        (apply-macete-with-minor-premises combination-decomposition)
        (apply-macete-with-minor-premises tr%f-card-disjoint-union)
        (cut-with-single-formula "f_card{combinations(s_$0 diff singleton{x},k_$0-1)}=
    f_card{combinations(s_$0,k_$0) inters filter(x)}")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises tr%finite-and-equinumerous-implies-f-card-equal)
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises tr%equinumerous-is-symmetric)
        (move-to-sibling 1)
        (unfold-single-defined-constant (0) combinations)
        (apply-macete-with-minor-premises combination-reduction)
        direct-and-antecedent-inference-strategy
        (unfold-single-defined-constant (0) combinations)
        (backchain-backwards "with(f:sets[sets[ind_1]],f_card{f}=f_card{f});")
        (backchain "with(r:rr,m_$0:zz,f:sets[sets[ind_1]],
    f_card{f}=comb(m_$0,r));")
        (backchain "with(p:prop,forall(s:sets[ind_1],p));")
        (apply-macete-with-minor-premises f_card_difference)
        (apply-macete-with-minor-premises singleton-has-f-card-one-rewrite)
        (apply-macete-with-minor-premises comb-ident)
        simplify
        set-containment-script
        simplify
        (apply-macete-with-minor-premises tr%iota-free-definition-of-f-indic-q)
        (cut-with-single-formula "f_card{combinations(s_$0 diff singleton{x},k_$0-1)}=
    f_card{combinations(s_$0,k_$0) inters filter(x)}")
        (backchain-backwards "with(f:sets[sets[ind_1]],f_card{f}=f_card{f});")
        (backchain "with(r:rr,m_$0:zz,f:sets[sets[ind_1]],
    f_card{f}=comb(m_$0,r));")
        (instantiate-existential ("comb(m_$0,k_$0-1)"))
        (apply-macete-with-minor-premises tr%iota-free-definition-of-f-indic-q)
        (instantiate-existential ("f_card{combinations(s_$0 diff singleton{x},k_$0)}"))
        (unfold-single-defined-constant (0) combinations)
        (apply-macete-with-minor-premises combination-disjointness)
        (apply-macete-with-minor-premises comb-0-value-lemma)
        (apply-macete-with-minor-premises tr%singleton-has-f-card-one)
        (instantiate-existential ("empty_indic{ind_1}"))
        (unfold-single-defined-constant (0) combinations)
        set-equality-script
        (apply-macete-with-minor-premises empty-indic-has-f-card-zero)
        direct-and-antecedent-inference-strategy
        direct-and-antecedent-inference-strategy
        (backchain "with(f,x_$4:sets[ind_1],x_$4=f);")
        (weaken (0))
        simplify-insistently
        (apply-macete-with-minor-premises empty-indic-has-f-card-zero)
        (unfold-single-defined-constant (0) combinations)
        (apply-macete-with-minor-premises comb-m-value-lemma)
        (apply-macete-with-minor-premises tr%singleton-has-f-card-one)
        (instantiate-existential ("s"))
        (unfold-single-defined-constant (0) combinations)
        set-equality-script
        (apply-macete-with-minor-premises subset-equal-if-equal-cardinality)
        direct-and-antecedent-inference-strategy
        simplify
        (unfold-single-defined-constant (0) combinations)
        )))