У меня есть небольшая система, которая переписывает лямбда-термины. Он имеет обычные (три) детерминированные правила переписывания по значению. Я не перечислил их здесь.Докажите, что последовательность шагов завершается
Перезаписи моделируются как Step
s от одного Term
к другому. У меня также есть отношение StarStep
между достижимыми терминами, где последний может быть произведен с первого на ноль или более шагов перезаписи.
Теперь я хочу показать, что перезаписывание завершается (либо со значением, либо застревает). Я убрал детали, потому что я не думаю, что они имеют значение здесь, но я могу добавить больше деталей, если это необходимо.
Вот код (или here в CollaCoq в браузере):
Variable Term: Type.
Variable Step: Term -> Term -> Prop.
Inductive StarStep: Term -> Term -> Prop :=
| StepNone : forall t, StarStep t t
| StepOne : forall t t', Step t t' -> forall t'', StarStep t' t'' -> StarStep t t''.
Goal forall t : Term,
~ (forall t', StarStep t t' -> exists t'', Step t' t'') ->
exists t', StarStep t t' /\ forall t'', ~ Step t' t''.
Так что я хочу, чтобы показать
, если это не так, что «от всех достижимы состояний можно еще один шаг " THEN существует состояние
t'
, которое доступно отt
таким образом, чтобы оно невозможно сделать шаг от него.
Я застрял на том, как действовать. Нужна ли мне дополнительная информация, то есть индукция или деструкция (= анализ случая) t
? И как я могу использовать информацию в гипотезе, когда она отрицается?
EDIT: Here are more details about Term
and Step
Обратите внимание, что вы можете 'Комментарии«pkgs: Coq-реал».' в начале файла collacoq и она будет загружать намного больше библиотек Coq, так что вы не необходимо переопределить строку. – ejgallego