Синтаксис эквивалентен
have ‹p = q› if ‹q = solution sys (PROC p)› for q
using that by (coinduct rule: process.coinduct) simp
в
{fix q assume "q = solution sys (PROC p)" (* How did they know to do this! *)
hence "p = q"
proof (coinduct rule: process.coinduct)
case (Eq_process process process')
then show ?case
by simp
qed
}
{}
открывает новый блок (с переменными локалей и предположения локали), и предположить вводит локальное предположение. Блок экспортирует теорему вида ?q2 = solution sys (PROC p) ⟹ p = ?q2
.
Вероятно, вам следует прочитать руководство по Isar (например, «Конкретная семантика, а не isar-ref»), чтобы узнать об этих очень полезных конструкциях.
Идея состоит в том, что вам нужно предположение, которое включает в себя предикатный предикат. Я бы описал эту технику как стандартный обходной путь в Изабель, так как (со) индукция иногда теряет связи между переменными.
lemma solution_PROCFail: " p = solution sys (PROC p)"
proof (coinduct rule: process.coinduct) (* look up process.coinduct and
you can see the extra goal forced by the misalignment*)
case Eq_process
then show ?thesis (* cannot solve*)
qed
терпит неудачу, потому что случай / show генерируется мусор (это происходит, посмотрите на панель состояний).