isabelle - thy_goal_defn 关键字 qed 后更新理论数据
问题描述
在 thy_goal_defn 关键字引入的义务得到满足后,我正在尝试更新一些自定义理论数据。
例如,如果我有一个data
关键字,它会为给定的术语打开一个简单的证明。我有一个print_data
关键字,它只打印出理论数据的状态。
data example:
"(x::int) < y ⟹ x ≤ y"
by simp
data example2:
"(x::int) > 0 ⟹ x ≥ 0"
by simp
print_data
然后在上面,print_data
关键字只会显示
example: x < y ⟹ x ≤ y
example2: 0 < x ⟹ 0 ≤ x
我一直在尝试了解如何实现这一点,但到目前为止,我只能在证明义务的同时更新理论数据,即以下内容将按example: x < y ⟹ x ≤ y
预期打印。
data example:
"(x::int) < y ⟹ x ≤ y"
print_data
by simp
我的实现方法如下:
- 在理论开始时声明关键字
theory ProvedData
imports Main
keywords
"data" :: thy_goal_defn and
"print_data" :: diag
begin
- 实现一个简单的结构来存储数据。这里的合并逻辑不完整,但我怀疑不是罪魁祸首,因为我能够使用 ML 代码模拟向结构添加多个元素。
type data =
{name: string, expression: term}
signature DATA_LIST =
sig
val get: theory -> data list
val add: data -> theory -> theory
val reset: theory -> theory
end;
structure DataList: DATA_LIST =
struct
structure DataStore = Theory_Data
(
type T = data list;
val empty = [];
val extend = I;
val merge = Library.merge (fn (_) => true);
);
val get = DataStore.get;
fun add t thy = DataStore.map (cons t) thy
val reset = DataStore.put [];
end;
- 最后,我实现了一个简单的函数来启动证明状态并更新理论数据。
fun open_data_goal
((bind: binding, _), exp: string) ctxt =
let
val prop = Syntax.read_prop ctxt exp;
val term = Syntax.read_term ctxt exp;
val register = DataList.add {name=Binding.print bind, expression=term}
fun after_qed _ ctxt =
(Proof_Context.background_theory register ctxt)
in
Proof.theorem NONE after_qed [[(prop, [])]]
(Proof_Context.background_theory register ctxt)
end
val _ =
Outer_Syntax.local_theory_to_proof \<^command_keyword>‹data›
"define an data and open proof obligation"
(Parse_Spec.thm_name ":"
-- Parse.term
>> open_data_goal);
在这里,我对两者都使用了相同的数据更新逻辑,启动证明状态和 after_qed 回调。启动期间的逻辑是允许在校样中途打印数据的原因。
我相信我特别困惑的是如何在 after_qed 函数中更新顶级理论。实现这一目标的推荐方法是什么?
问题的最小工作示例:https ://gist.github.com/BraeWebb/ac6b73354e61736e11836e655c69b507
非常感谢您的参与!
解决方案
推荐阅读
- android - Firebase - 如何在 android 应用中获取归因
- symfony - Doctrine - 与关联实体的验证
- reactjs - 有没有比 redux persist 更好的方法来为生产环境持久化 redux 状态数据
- python - 背包问题
- android - chekbox 总是检查 recyclerview 中的最后一项
- javascript - jsf和javascript确认对话框
- c# - 我应该在哪里再次将标志设置为 false?
- javascript - 满足条件时使用 setInterval 和 clearInterval 运行函数?
- c++ - 在没有 std::nothrow 的构造函数中克服 std::bad_alloc
- r - 如何将 predict() 用于 survreg 模型?