Этот вопрос касается проекта, которым я занимаюсь, а именно кодирования Principia Mathematica на Coq. Principia разработал правила вывода, одним из которых является Syll:
∀ P Q R: Опора, P → Q, Q → R: P → R
Я пытаюсь создать сценарий Ltac, который кодирует форму вывода Syll. Следующая тактика MP из (Chlipala 2019) работает отлично:
Ltac MP H1 H2 :=
match goal with
| [ H1 : ?P -> ?Q, H2 : ?P |- _ ] => specialize (H1 H2)
end.
Здесь я понимаю, что тактика справа от = ›специализируется на применении H1 к H2. Теперь коррелированная тактика Syll не работает:
Ltac Syll H1 H2 :=
match goal with
| [ H1 : ?P -> ?Q, H2 : ?Q -> ?R |- _ ] =>
specialize Syll2_06 with ?P ?Q ?R;
intros Syll2_06;
apply Syll2_06;
apply H1;
apply H2
end.
Ошибка, которую я получаю при его применении (в примере ниже):
Нет подходящих предложений для match.
Я не уверен, почему возникла такая ошибка. Была импортирована классическая логика, и я доказал теорему Syll2_06, т.е. (P → Q) → ((Q → R) → (P → R)). Фактически, то, что по сути является Syll Ltac, было применено в доказательстве теоремы Trans2_16 (см. Ниже). Поэтому я не уверен, почему превращение кода в сценарий Ltac не работает.
Возможно, я неправильно понимаю, что делает Ltac match и какова должна быть тактика справа от = ›. Но на основании просмотра руководства Coq , возможно, проблема заключается в левой стороне тактики, возможно, потому, что H1 неприменим к H2.
Дальнейшие предложения, особенно те, которые объясняют Ltac и / или мою ошибку в том, как я думаю об этом, были бы очень признательны.
Theorem Syll2_06 : ∀ P Q R : Prop,
(P → Q) → ((Q → R) → (P → R)).
Ltac Syll H1 H2 :=
match goal with
| [ H1 : ?P -> ?Q, H2 : ?Q -> ?R |- _ ] =>
specialize Syll2_06 with ?P ?Q ?R;
intros Syll2_06;
apply Syll2_06;
apply H1;
apply H2
end.
Ltac MP H1 H2 :=
match goal with
| [ H1 : ?P -> ?Q, H2 : ?P |- _ ] => specialize (H1 H2)
end.
Theorem Trans2_16 : forall P Q : Prop,
(P → Q) → (~Q → ~P).
Proof. intros P Q.
specialize n2_12 with Q. intros n2_12a.
specialize Syll2_05 with P Q (~~Q). intros Syll2_05a.
specialize n2_03 with P (~Q). intros n2_03a.
MP n2_12a Syll2_05a.
specialize Syll2_06 with (P→Q) (P→~~Q) (~Q→~P). intros Syll2_06a.
apply Syll2_06a.
apply Syll2_05a.
apply n2_03a.
Qed.
Theorem Trans2_17 : forall P Q : Prop,
(~Q -> ~P) -> (P -> Q).
Proof. intros P Q.
specialize n2_03 with (~Q) P. intros n2_03a.
specialize n2_14 with Q. intros n2_14a.
specialize Syll2_05 with P (~~Q) Q. intros Syll2_05a.
MP n2_14a Syll2_05a.
Syll 2_03a Syll2_05a.
Qed.
match
наlazymatch
. Это фиксируется на первой (единственной) соответствующей ветке без возврата. Ошибка, вероятно, в том, что вы написали справа от=>
(на первый взгляд это выглядит слишком сложным), но сообщение проглатывается, потому чтоmatch
пытается вернуться из этой ветки в другую и не может найти это другое - то, что сообщается. При фиксации в ветке вы получите правильное сообщение об ошибке. - person HTNW   schedule 14.09.2020specialize
? (Specialize
изменяет термины в вашем контексте (H1
, _4 _...)) Разве вы не хотите, чтобы тактика решала цель, т.е.apply
добавляя термин? И вы также можете позволить Coq найти два предположения, которые вам нужны, вместо того, чтобы указывать их, что может быть как хорошим, так и плохим. Это избавляет вас от необходимости придумывать произвольные имена для всего, но, возможно, облегчает людям поиск доказательства, читая тактику. - person larsr   schedule 14.09.2020