- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用简化词来替换不等式的子项。我将通过一个示例来说明这一点,而不是对我的问题进行通用定义:
假设我有一个简单的编程语言和一个基于它的 Hoare 逻辑。假设我们有 if、while 和序列操作。此外,我们还有 denotation
和 hoare P c Q
。以下是 Isabelle/HOL 中的示例签名:
(* A simple language and Hoare logic *)
typedecl program
typedecl memory
consts
seq :: "program ⇒ program ⇒ program" (infixl ";" 10) (* c;d: run c, then run d *)
ifthen :: "(memory ⇒ bool) ⇒ program ⇒ program" (* ifthen e c: run c if e(current_mem)=true *)
while :: "(memory ⇒ bool) ⇒ program ⇒ program" (* while e c: run c while e(current_mem)=true *)
denotation :: "program ⇒ memory ⇒ memory" (* denotation c m: memory after running c, when starting with memory m *)
hoare :: "(memory ⇒ bool) ⇒ program ⇒ (memory ⇒ bool) ⇒ bool"
(* hoare P c Q: if P(current_mem), then after running c, we have Q(current_mem) *)
现在 (a;b);c = a;(b;c)
是不正确的(这些是不同的程序),但它确实认为它们在指称上是等价的,即, 表示 ((a;b);c)) = 表示 (a;(b;c))
。
这意味着,我应该能够在 Hoare 三元组中将 a;(b;c)
重写为 (a;b);c
。例如,我希望能够证明
lemma "hoare P (while e (a;b;c)) Q ==> hoare P (while e (a;(b;c))) Q"
只需使用简化器(by simp
),给定合适的简化规则。
从逻辑上讲,相关规则是:
lemma "denotation (a;(b;c)) = denotation ((a;b);c)"
lemma "denotation a = denotation b ==> hoare P a Q = hoare P b Q"
lemma "denotation a = denotation b ==> denotation (while e a) = denotation (while e b)"
lemma "denotation a = denotation b ==> denotation (ifthen e a) = denotation (ifthen e b)"
lemma "denotation a = denotation a' ==> denotation b = denotation b' ==> denotation (a;b) = denotation (a';b')"
不幸的是,似乎没有直接的方法可以将这些规则告诉简化器。 (更一般地,我们想告诉同余规则中的简化器,下面的重写必须完成模块某个等价关系,在本例中为指称等价。)
我已经找到了这个问题的部分解决方案(见下面我自己的答案),但这个解决方案似乎是一个 hack(我不知道它有多稳定),我想知道是否有一个好的方法做吧。
我不介意在此过程中必须使用一些 ML 代码(例如,编写 simproc),但我想避免必须重新实现整个简化器以在 Hoare 元组中重写。
最佳答案
Isabelle 的简化器不支持关于任意等价关系的重写。幸运的是,您的重写看起来相当简单,因此在 simproc 中实现重写可能是值得的。这是想法:
写一个 simproc 以 hoare P c Q
的形式触发.调用时,它会设置一个 hoare P c Q == ?rhs
形式的目标。和应用一条规则说明 %c. hoare P c Q
只关心其参数的等价类,而不关心具体元素。然后,应用重写规则作为引入规则,直到解决既定目标。这应该已经实例化了 ?rhs
形式为 hoare P c' Q
的东西.测试是否c
和 c'
是 alpha-beta-eta-...-等价的。如果是这样,则 simproc 失败并返回 NONE
。 , 否则返回证明方程。
这是我将用作开始的一堆引理:
definition fun_equiv :: "('a ⇒ 'b) ⇒ 'a ⇒ 'a ⇒ bool"
where "fun_equiv f x y ⟷ f x = f y"
lemma fun_equiv_refl: "fun_equiv f x x" by(simp add: fun_equiv_def)
lemma hoare_cong_start: (* start rule *)
"fun_equiv denotation c c' ⟹ hoare P c Q == hoare P' c' Q'"
sorry
lemma while_cong: "fun_equiv denotation c c' ⟹ fun_equiv denotation (while b c) (while b c')" sorry
lemma seq_cong: "⟦ fun_equiv denotation a a'; fun_equiv denotation b b' ⟧ ⟹ fun_equiv denotation (a ; b) (a' ; b')" sorry
lemma if_cong: "fun_equiv denotation c c' ⟹ fun_equiv denotation (ifthen b c) (ifthen b c')" sorry
lemma seq_assoc: "fun_equiv denotation (a ; (b ; c)) (a; b; c)" sorry
lemma ifthen_true: "fun_equiv denotation (ifthen (λm. True) c) c" sorry
lemmas hoare_intros =
-- ‹rewrites come first, congruences later, reflexivity last›
ifthen_true seq_assoc
while_cong if_cong seq_cong
fun_equiv_refl
由于这是简化器内部的 simproc,您可以假设调用中的命令已经是正常形式 w.r.t。简单集。在您的示例中,测试 %m. m = m
已经简化为%_. True
.因此,simproc 可以专注于实现 hoare 规则的重写。
simproc 调用的单个步骤应该执行类似于以下 Isar 代码段的操作:
schematic_lemma "hoare (λm. P x) (while P (c;(d;e);ifthen (λm. True) (f;g;c))) (λm. True) == ?c"
by(rule hoare_cong_start)(rule hoare_intros)+
由于化简器会迭代 simproc 直到它不再触发,所以您应该真正以正常形式结束。
如果你想支持条件重写规则 w.r.t.指称等价,rule hoare_intros
应该替换为检查子目标格式的内容。如果它不是 fun_equiv denotation _ _
的形式,那么 simproc 应该递归地调用简化器(或您选择的任何其他证明方法),而不是尝试 hoare_intros
的另一个规则应用程序.
关于isabelle - 使用 Isabelle 简化器重写非相等等价关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30573837/
我需要在一篇论文中做一个演示,该论文在某些时候使用了 Isabelle/Isar 和 Isabelle/HOL。 我尝试在线研究 Isabelle/HOL 和 Isabelle/Isar,以便能够在一
我想在一个名为 List 的理论中定义我自己的列表类型,但已经有一个同名的理论。 有没有比Main更轻量级的理论? ? 最佳答案 请注意 $ISABELLE_HOME/src/HOL/ex/Seq.t
Isabelle 中的“商型模式”是什么? 我在互联网上找不到任何解释。 最佳答案 如果你能从你看到这句话的地方引用一点会更好。我知道“模式匹配”,我知道“商类型”,但我不知道“商类型模式”。 我宁愿
有时我发现很难使用 Isabelle,因为我无法像在正常编程中那样使用“打印命令”。 比如我想看什么?thesis .具体语义书说: The unknown ?thesis is implicitly
我是 isabelle 的新手,并试图证明以下简单的不等式: lemma ineq: "(a::real) > 0 ⟹ a 0 ⟹ b 0" proof have "1/a + 1/b >
输入以下定义时 datatype env = "nat => 'a option" Isabelle/jedit 显示一个感叹号并说 Legacy feature! Bad name binding:
在 Isabelle 中,有时会遇到存在重复子目标的场景。例如,想象以下证明脚本: lemma "a ∧ a" apply (rule conjI) 目标: proof (prove): step
Isabelle/jEdit 中的颜色代码是什么意思?我在 Isabelle/jEdit manual 中找不到他们的描述.它唯一写的是 Prover feedback works via color
如何在 Isabelle 中定义常量集?例如像 {1,2,3}(给它一个更有趣的转折,1,2,3 是实数),或 {x\in N: x < m},其中 m 是某个固定数字 - 或者,也许更难,集合 {N
假设我在 Isabelle 中写了一个引理“(∀a. P a ⟹ Q a) ⟹ R b”。 ∀a只会量化 P a .如果我想量化超过 P a ⟹ Q a但是,在 ∀a 后面加上括号(即“(∀a. (P
使用 Isar 时,我发现了一个令人惊讶的行为(对我而言)。 我尝试使用假设,有时 Isar 提示它无法解决未决目标,例如我最典型的例子是有一个假设但无法假设它: lemma assumes "A
在伊莎贝尔中,人们通常可以达到证明目标,其中中间类型的术语对于证明的正确性至关重要。例如,考虑以下引理,将 nat 42 转换为 'a word,然后再返回: theory Test imports
已关注 how-to-use-persistent-heap-images-to-make-loading-of-theories-faster-in-isabelle另一个建议是我为 Nominal
我尝试使用 partial_function 关键字定义部分函数。它不起作用。这是最能表达直觉的: partial_function (tailrec) oddity :: "nat => nat"
我知道如何在 Isabelle 中制作“术语缩写”,但我可以制作行为相同的“类型缩写”吗? 我可以定义一个“术语缩写”使用 abbreviation "foo == True" 从此以后,输出中出现的
如何在 Isabelle 中将集合转换为列表? 我对带有签名的函数定义感兴趣: "'a set => 'a list" 我该如何定义? 最佳答案 通过搜索 "'a set" "'a list"在我偶然
我想用简化词来替换不等式的子项。我将通过一个示例来说明这一点,而不是对我的问题进行通用定义: 假设我有一个简单的编程语言和一个基于它的 Hoare 逻辑。假设我们有 if、while 和序列操作。此外
我是一名刚开始习惯 Isabelle 的数学家,而本应非常简单的事情却令人沮丧。如何定义两个常量之间的函数?比如说,函数 f: {1,2,3}\to {1,2,4} 映射 1 到 1、2 到 4 和
我想找到定理。我已阅读 find_theorems 上的部分在 Isabelle/Isar reference manual : find_theorems criteria Retrieves fa
我试图在 Isabelle/HOL 中证明这个引理。 引理“(0::nat) ≠ undefined” 但是挑剔的人找到了这个和它的否定的反例 引理“(0::nat) = undefined” 这怎么
我是一名优秀的程序员,十分优秀!