Проблема с вашей окончательной теоремой состоит в том, что у вас все еще есть p
и q
в качестве предположений, введенных через thm2
и thm3
, тогда как вы можете и должны получить их из thm1
.
Первая нужная вам теорема - это что-то вроде p /\ q ==> p
. Я нашел соответствующее правило, просматривая описание (с. 2.3.24). Это называется CONJUNCT1
.
Используя его, мы можем получить p
в качестве теоремы из thm1
:
val thmp = CONJUNCT1 thm1;
Та же идея работает для получения q
в качестве теоремы от thm1
:
val thmq = CONJUNCT2 thm1;
И тогда вы можете применить свою идею для thm5
:
val thm5 = CONJ thmq thmp;
Важная вещь в том, что мы не используем p
, полученные из p
(thm2
) и q
, полученные из q
(thm3
), а точнее p
, полученный из p /\ q
и q
, полученный из p /\ q
(настройка show_assumes := true;
может помочь увидеть это больше ясно).
Наконец, мы применим вашу идею для thm7
:
val thm7 = DISCH ``p /\ q`` thm5;
для получения первой половины желаемого результата, но без посторонних предположений.
Вторая половина получается аналогично:
val thm9 = ASSUME (``q /\ p``);
val thmp2 = CONJUNCT2 thm9;
val thmq2 = CONJUNCT1 thm9;
val thm6 = DISCH ``q /\ p`` (CONJ thmp2 thmq2);
И тогда ваша идея для thm8
отлично работает:
val thm8 = IMP_ANTISYM_RULE thm7 thm6;