При доказательстве в Coq приятно иметь возможность доказывать по одному маленькому кусочку за раз, и Coq поможет отслеживать обязательства.
Theorem ModusPonens: forall (A B : Prop), ((A -> B) /\ A) -> B.
Proof.
intros A B [H1 H2].
apply H1.
На этом этапе я вижу состояние проверки чтобы знать, что требуется для завершения sh доказательства:
context
H2: B
------
goal: B
Но когда мы пишем Галлину, нужно ли решать все это за один удар или создавать множество маленьких вспомогательных функций? Я хотел бы иметь возможность использовать вопросительный знак, чтобы спросить Coq, что он ищет:
Definition ModusPonens' := fun (A B : Prop) (H : (A -> B) /\ A) =>
match H with
| conj H1 H2 => H1 {?} (* hole of type B *)
end.
Похоже, что Coq должен быть в состоянии сделать это, потому что я даже могу поставить lta c там, и Coq найдет то, что ему нужно:
Definition ModusPonens' := fun (A B : Prop) (H : (A -> B) /\ A) =>
match H with
| conj H1 H2 => H1 ltac:(assumption)
end.
Если Coq достаточно умен, чтобы закончить sh писать определение для меня, вероятно, он достаточно умен, чтобы сказать мне, что мне нужно написать для того, чтобы до фини sh самой функции, по крайней мере, в простых случаях, подобных этому.
Так как мне это сделать? У Coq есть такая особенность?