import proveit
from proveit import alpha
from proveit.core_expr_types import x_1_to_n, Q__x_1_to_n, P__x_1_to_n
from proveit.logic import Not, Equals, TRUE, NotEquals
from proveit import defaults
theory = proveit.Theory() # the theorem's theory
%proving skolem_elim_lemma
antecedent = skolem_elim_lemma.instance_expr.instance_expr.antecedent
main_assumptions = (*skolem_elim_lemma.conditions.entries, antecedent)
defaults.assumptions = (*main_assumptions, Not(alpha))
existential, universal = antecedent.derive_left(), antecedent.derive_right()
unfolded_existential = existential.unfold()
universal
alpha_under_assumptions = universal.instantiate(assumptions=[Q__x_1_to_n]).derive_consequent(
assumptions=[Equals(P__x_1_to_n, TRUE)])
contradiction = Not(alpha).derive_contradiction(
assumptions=[*defaults.assumptions, Q__x_1_to_n, Equals(P__x_1_to_n, TRUE)])
contradiction.deny_assumption(Equals(P__x_1_to_n, TRUE))
P_neq_T = NotEquals(P__x_1_to_n, TRUE).prove(assumptions=[*defaults.assumptions, Q__x_1_to_n])
P_neq_T.generalize(x_1_to_n, conditions=[Q__x_1_to_n])
unfolded_existential.affirm_via_contradiction(alpha, assumptions=main_assumptions)
%qed