Это является продолжением на Isabelle's Code generation: Abstraction lemmas for containers?:Работа с генератором кода Изабеллы: Данные уточнения и более высокого порядка функции
Я хочу, чтобы сгенерировать код для the_question
в следующей теории:
theory Scratch imports Main begin
typedef small = "{x::nat. x < 10}" morphisms to_nat small
by (rule exI[where x = 0], simp)
code_datatype small
lemma [code abstype]: "small (to_nat x) = x" by (rule to_nat_inverse)
definition a_pred :: "small ⇒ bool"
where "a_pred = undefined"
definition "smaller j = [small i . i <- [0 ..< to_nat j]]"
definition "the_question j = (∀i ∈ set (smaller j). a_pred j)"
Проблема заключается в том что уравнение для smaller
не подходит для генерации кода, поскольку оно упоминает функцию абстракции small
.
Теперь в соответствии с ответом Андреаса на мой последний вопрос, и документ по уточнению данных, следующим шагом является введение типа для множества малых чисел и создать определение для smaller
в этом типе:
typedef small_list = "{l. ∀x∈ set l. (x::nat) < 10}" by (rule exI[where x = "[]"], auto)
code_datatype Abs_small_list
lemma [code abstype]: "Abs_small_list (Rep_small_list x) = x" by (rule Rep_small_list_inverse)
definition "smaller' j = Abs_small_list [ i . i <- [0 ..< to_nat j]]"
lemma smaller'_code[code abstract]: "Rep_small_list (smaller' j) = [ i . i <- [0 ..< to_nat j]]"
unfolding smaller'_def
by (rule Abs_small_list_inverse, cases j, auto elim: less_trans simp add: small_inverse)
Теперь smaller'
является исполняемым. Из того, что я понимаю, что нужно переопределить операции small list
как операции на small_list
:
definition "small_list_all P l = list_all P (map small (Rep_small_list l))"
lemma[code]: "the_question j = small_list_all a_pred (smaller' j)"
unfolding small_list_all_def the_question_def smaller'_code smaller_def Ball_set by simp
Я могу определить, хорошо выглядящий уравнение кода для the_question
. Но определение small_list_all
не подходит для генерации кода, так как в нем упоминается морфизм абстракции small
. Как сделать small_list_all
исполняемым?
(Обратите внимание, что я не могу раскрыть уравнение кода a_pred
, поскольку проблема на самом деле происходит в уравнении кода фактически рекурсивной a_pred
. Кроме того, я хотел бы избежать хаков, которые вовлекают повторную проверку инварианта во время выполнения.)
Спасибо за предложение. Я не думаю, что это хорошо работает для моего реального использования, но, по крайней мере, это еще одна работа, чтобы добавить в свой набор инструментов. –