Я пытаюсь что-то доказать с помощью Isar; пока что я достиг цели, которая выглядит так:
(∀P Q. P ≠ Q ⟶ (∃!l. plmeets P l ∧ plmeets Q l)) ∧
(∀P l. ¬ plmeets P l ⟶ (∃!m. affine_plane_data.parallel plmeets l m ∧ plmeets P m)) ∧
(∃P Q. P ≠ Q ∧ (∃R. P ≠ R ∧ Q ≠ R ∧ ¬ affine_plane_data.collinear plmeets P Q R))
(здесь plmeets
- это функция, которую я определил, где plmeets P l
- сокращение от «точка P лежит на прямой l» в аффинной плоскости, но я не думаю, что это важно для моего вопроса.)
Эта цель - сочетание трех вещей. На самом деле я уже доказал леммы, которые, как мне кажется, очень близки к каждой из этих вещей. Например, у меня есть
lemma four_points_a1: "P ≠ Q ⟹ ∃! l . plmeets P l ∧ plmeets Q l"
который производит вывод
theorem four_points_a1: ?P ≠ ?Q ⟹ ∃!l. plmeets ?P l ∧ plmeets ?Q l
который вы можете видеть, это почти в точности первый из трех соединенных элементов. (Я признаю, что мои другие леммы не совсем точно соответствуют двум другим пунктам, но я над этим поработаю).
Я хотел бы сказать: «из-за леммы four_points_a1 нам осталось доказать только item2 ∧ item3
», и я почти уверен, что есть способ сделать это. Но просмотр книги «Программирование и испытание» ничего мне не говорит. В Isabelle, а не Isar, я бы применил conjI
дважды, чтобы разделить одну цель на три, а затем решить первую цель.
Но я не вижу, как это сделать в Isar.
intro
вместо нескольких примененийrule conjI
, т.е. вы можете использоватьapply(intro conjI)
, чтобы разделить цель на 3 подцели. Затем вы можете использоватьsubgoal
для подтверждения каждой подцели в отдельности. Однако, если вы не предоставите свое приложение полностью, будет сложно сказать, существуют ли лучшие методы. - person user9716869   schedule 07.03.2019