Если вам удобно использовать оператор выбора, вы можете легко создать свидетеля, используя SOME
, например:
primrec infinite_trace :: ‹'s ⇒ nat ⇒ 's› where
‹infinite_trace c0 0 = c0›
| ‹infinite_trace c0 (Suc n) =
(SOME c. infinite_trace c0 n → c ∧ ¬ terminating c)›
(я не был уверен в типах ваших значений s
и (c,s)
- поэтому я просто использовал 's
для этого.)
Очевидно, что конструкция свидетеля потерпит неудачу, если в какой-то момент SOME
не сможет выбрать значение, удовлетворяющее ограничению. Таким образом, еще нужно доказать, что не прекращение действительно распространяется (как это совершенно очевидно из определения):
lemma terminating_suc:
assumes ‹¬ terminating c›
obtains c' where ‹c → c'› ‹¬ terminating c'›
using assms terminating.intros by blast
lemma nontermination_implies_infinite_trace:
assumes ‹¬ terminating c0›
shows ‹¬ terminating (infinite_trace c0 n)
∧ infinite_trace c0 n → infinite_trace c0 (Suc n)›
by (induct n,
(simp, metis (mono_tags, lifting) terminating_suc assms exE_some)+)
Доказать свою экзистенциальную количественную оценку, используя infinite_trace (c,s)
в качестве свидетеля, просто.