(def-constant subgroup "lambda(a:sets[gg], nonempty_indic_q{a} and forall(g,h:gg, ((g in a) and (h in a)) implies ((g mul h) in a)) and forall(g:gg, (g in a) implies (inv(g) in a)))" (theory groups))
(def-constant gg%subgroup "sort_to_indic(gg)" (theory groups))
(def-constant e%subgroup "singleton{e}" (theory groups))
(def-theorem gg-is-a-subgroup "subgroup(gg%subgroup)" (theory groups) (usages transportable-macete) (proof ( unfold-defined-constants simplify (instantiate-existential ("e")) simplify )))
(def-theorem singleton-e-is-a-subgroup "subgroup(e%subgroup)" (theory groups) (usages transportable-macete) (proof ( unfold-defined-constants simplify-insistently direct-and-antecedent-inference-strategy simplify simplify )))
(def-theorem subgroups-are-subsets-of-gg%subgroup "forall(a:sets[gg], subgroup(a) implies a subseteq gg%subgroup)" (theory groups) (usages transportable-macete) (proof ( unfold-defined-constants direct-and-antecedent-inference-strategy insistent-direct-inference simplify )))
(def-theorem subgroups-are-nonempty "forall(a:sets[gg], subgroup(a) implies nonempty_indic_q{a})" (theory groups) (usages transportable-macete) (proof ( (unfold-single-defined-constant-globally subgroup) simplify )))
(def-theorem subgroups-closed-under-mul "forall(a:sets[gg], subgroup(a) implies forall(g,h:gg, (g in a) and (h in a) implies (g mul h) in a))" (theory groups) (usages transportable-macete) (proof ( (unfold-single-defined-constant-globally subgroup) direct-and-antecedent-inference-strategy (instantiate-universal-antecedent "with(p:prop, forall(g,h:gg,p))" ("g" "h")) )))
(def-theorem subgroups-closed-under-inv "forall(a:sets[gg], subgroup(a) implies forall(g,h:gg, (g in a) implies inv(g) in a))" (theory groups) (usages transportable-macete) (proof ( (unfold-single-defined-constant-globally subgroup) direct-and-antecedent-inference-strategy (instantiate-universal-antecedent "with(p:prop, forall(g:gg,p))" ("g")) )))
(def-theorem subgroups-contain-e "forall(a:sets[gg], subgroup(a) implies (e in a))" (theory groups) (usages transportable-macete) (proof ( direct-and-antecedent-inference-strategy (instantiate-theorem subgroups-are-nonempty ("a")) (force-substitution "e" "x mul inv(x)" (0)) (apply-macete-with-minor-premises subgroups-closed-under-mul) simplify (apply-macete-with-minor-premises subgroups-closed-under-inv) simplify simplify simplify )))
(def-compound-macete subgroup-membership (series (repeat subgroups-closed-under-mul subgroups-closed-under-inv subgroups-contain-e) simplify))
(def-theorem subgroups-are-groups "forall(a:sets[gg], subgroup(a) implies group{a,mul,e,inv})" (theory groups) (usages transportable-macete) (proof ( insistent-direct-inference-strategy (apply-macete-with-minor-premises subgroup-membership) (apply-macete-with-minor-premises subgroup-membership) (apply-macete-with-minor-premises subgroup-membership) simplify simplify simplify simplify simplify )))
(def-theorem groups->subgroup-obl-1 "forall(a:sets[gg], nonempty_indic_q{a} and forall(g,h:gg,g in a and h in a implies (g mul h) in a) and forall(g:gg,g in a implies inv(g) in a) implies e in a)" lemma (theory groups) (proof ( direct-and-antecedent-inference-strategy (instantiate-universal-antecedent "with(a:sets[gg], forall(g,h:gg,g in a and h in a implies (g mul h) in a));" ("x" "inv(x)")) (instantiate-universal-antecedent "with(a:sets[gg],forall(g:gg,g in a implies inv(g) in a));" ("x")) (incorporate-antecedent "with(x:gg,a:sets[gg],(x mul inv(x)) in a);") simplify )))
(def-theorem groups->subgroup-obl-2 "forall(a:sets[gg], nonempty_indic_q{a} and forall(g,h:gg,g in a and h in a implies (g mul h) in a) and forall(g:gg,g in a implies inv(g) in a) implies forall(x:gg,x in a implies if(e in a, x, ?gg)=x))" lemma (theory groups) (proof ( direct-and-antecedent-inference-strategy (instantiate-theorem groups->subgroup-obl-1 ("a")) (contrapose "with(a:sets[gg],empty_indic_q{a});") auto-instantiate-existential simplify )))
(def-translation groups->subgroup (source groups) (target groups) (assumptions "with(a:sets[gg], nonempty_indic_q{a})" "with(a:sets[gg], forall(g,h:gg, (g in a) and (h in a) implies (g mul h) in a))" "with(a:sets[gg], forall(g:gg, (g in a) implies (inv(g) in a)))") (fixed-theories h-o-real-arithmetic) (sort-pairs (gg (indic "with(a:sets[gg], a)"))) (constant-pairs (mul "with(a:sets[gg], lambda(x,y:gg, if((x in a) and (y in a), x mul y, ?gg)))") (inv "with(a:sets[gg], lambda(x:gg, if(x in a, inv(x), ?gg)))")) force-under-quick-load (theory-interpretation-check using-simplification))