Разница в исполнении Coq между точкой с запятой; и период.

Учитывая действительное доказательство Coq с использованием тактики ;, существует ли общая формула для преобразования его в действительное эквивалентное доказательство с заменой . на ;?

Многие доказательства Coq используют ; или тактику последовательности тактики. Как новичок, я хочу наблюдать за выполнением отдельных шагов, поэтому я хочу заменить . на ;, но, к своему удивлению, я обнаружил, что это может нарушить доказательство.

Документация по ; скудна, и я нигде не нашел явного обсуждения .. Я видел документ, в котором неформальное значение t1; t2

применить t2 к каждой подзадаче, полученной в результате выполнения t1 в текущем контексте проверки,

и мне интересно, работает ли . только с текущей подцелью и этим объясняется различное поведение? Но особенно я хочу знать, есть ли общее решение для ремонта поломки, вызванной заменой . на ;.


person Christopher Brinkley    schedule 29.03.2016    source источник


Ответы (1)


Семантика tac1 ; tac2 заключается в запуске tac1, а затем tac2 для всех подцелей, созданных tac1. Таким образом, вы можете столкнуться с множеством случаев:

После бега не осталось голов tac1

Если после запуска tac1 не осталось целей, то tac2 никогда не запускается, и Coq просто молча завершает работу. Например, в этом первом выводе у нас есть бесполезный ; intros в конце (действительного) доказательства:

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros ; repeat split ; assumption ; intros.
Qed.

Если мы изолируем это, мы получим Error: No such goal., потому что мы пытаемся применить тактику, когда нечего доказывать!

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros ; repeat split ; assumption.
intros. (* Error! *)

После бега tac1 осталась ровно одна цель.

Если после запуска tac1 осталась ровно одна цель, то tac1 ; tac2 ведет себя как tac1. tac2. Основное отличие состоит в том, что если tac2 терпит неудачу, то же самое происходит и с tac1 ; tac2, потому что последовательность из двух тактик рассматривается как единое целое, которое может либо преуспеть в целом, либо потерпеть неудачу в целом. Но если tac2 преуспеет, то это в значительной степени эквивалентно.

Например. Следующее доказательство является действительным:

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros.
repeat split ; assumption.
Qed.

Бег tac1 порождает более одной цели.

Наконец, если при запуске tac1 создается несколько целей, то tac2 применяется ко всем сгенерированным подцелям. В нашем текущем примере мы можем заметить, что если мы отключим последовательность тактик после repeat split, то у нас на руках будет 5 голов. Это означает, что нам нужно скопировать / вставить assumption пять раз, чтобы воспроизвести доказательство, данное ранее, с использованием ;:

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros ; repeat split.
 assumption.
 assumption.
 assumption.
 assumption.
 assumption.
Qed.
person gallais    schedule 29.03.2016
comment
Спасибо за разбивку корпуса! Это очень помогает. - person Christopher Brinkley; 30.03.2016
comment
@ChristopherBrinkley. Этот пост отвечает на ваш вопрос, было бы неплохо, если бы вы отметили его как ответ. - person Anton Trunov; 28.10.2016
comment
Я отмечу, что, вероятно, наиболее важным отличием, помимо применения тактики в каждой ветке, является то, что Coq будет возвращаться через ;. Например. даже если tac1 когда-либо генерирует только одну цель, если для этого есть несколько способов (важным примером может быть constructor), тогда tac1. tac2 зафиксирует первый успех и запустит tac2 для этого. tac1; tac2 заставит tac1 попробовать одно, а затем попробовать tac2, а если это не поможет, попробуйте tac1 другой способ, а затем попробуйте tac2 после этого, а если это не удастся, попробуйте tac1 другой другой способ и т. Д. - person HTNW; 02.08.2020