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