【问题标题】:Isabelle proving with translation issue伊莎贝尔证明翻译问题
【发布时间】:2020-08-03 19:22:20
【问题描述】:

我已经定义了一些这样的翻译:

consts
  "time" :: "i"
  "sig" :: "i ⇒ i"
  "BaseChTy" :: "i"

syntax
  "time" :: "i"
  "sig" :: "i ⇒ i"
translations
  "time" ⇌ "CONST int"
  "sig(A)" ⇌ "CONST int → A"

那么,我想证明这样一个定理:

theorem sig_mono: "⟦ A ⊆ B ⟧ ⟹ sig(A) ⊆ sig(B)"

这应该是一个非常简单的定理,应该用定理Pi_mono一步一步证明:

thm Pi_mono
?B ⊆ ?C ⟹ ?A → ?B ⊆ ?A → ?C

所以我是这样做的:

theorem sig_mono: "⟦ A ⊆ B ⟧ ⟹ sig(A) ⊆ sig(B)"

apply(drule Pi_mono[of _ _ "time"])
(*Output:
goal (1 subgoal):
 1. sig(A) ⊆ sig(B) ⟹ sig(A) ⊆ sig(B)
*)

apply(simp)
(*Output:
Failed ...
*)

既然前提和目标一样,应该马上证明,但没有。我可以知道我在翻译定义中做错了什么吗? 我试图将定理更改为:

theorem sig_mono: "⟦ A ⊆ B ⟧ ⟹ (time → A) ⊆ (time → B)"
(*Output:
goal (1 subgoal):
 1. A ⊆ B ⟹ sig(A) ⊆ sig(B)
*)

apply(drule Pi_mono[of _ _ "time"])
(*Output:
goal (1 subgoal):
 1. sig(A) ⊆ sig(B) ⟹ sig(A) ⊆ sig(B)
*)

apply(simp)
(*Output:
Success ...
*)

然后它立即起作用,但翻译不应该使它们成为同一个东西吗?

更新: 感谢 Mathias Fleury 的回复,我尝试进行简化跟踪,它显示如下:

theorem sig_mono: "⟦ A ⊆ B ⟧ ⟹ sig(A) ⊆ sig(B)"
using [[show_sorts]] apply(drule Pi_mono[of _ _ "time"])
using [[simp_trace]] apply(simp)
oops

(*
Output:
[1]SIMPLIFIER INVOKED ON THE FOLLOWING TERM:
sig(A::i) ⊆ sig(B::i) ⟹ sig(A) ⊆ sig(B) 
[1]Adding rewrite rule "??.unknown":
sig(A::i) ⊆ sig(B::i) ≡ True 
*)

time -> A 版本显示:

theorem sig_mono: "⟦ A ⊆ B ⟧ ⟹ time → A ⊆ time → B"
using [[show_sorts]] apply(drule Pi_mono[of _ _ "time"])
using [[simp_trace]] apply(simp)
oops

(*
Output:
[1]SIMPLIFIER INVOKED ON THE FOLLOWING TERM:
sig(A::i) ⊆ sig(B::i) ⟹ sig(A) ⊆ sig(B) 
[1]Adding rewrite rule "??.unknown":
sig(A::i) ⊆ sig(B::i) ≡ True 
[1]Applying instance of rewrite rule "??.unknown":
sig(A::i) ⊆ sig(B::i) ≡ True 
[1]Rewriting:
sig(A::i) ⊆ sig(B::i) ≡ True
*)

为什么这个版本可以应用rewrite rule的实例继续证明,而原来的不行?

【问题讨论】:

  • 如果你的例子可以输入或者你可以给出你正在使用的导入会更容易...... sig 中的箭头是什么意思?
  • 一些建议:i) 检查供应 [[show_types]] 类型是否真的相同; ii) 与supply [[unify_trace_failure]] apply assumption 核对为什么没有发生统一; iii) 与供应商 [[show_sorts]] 确认排序是否相同
  • 导入是:imports Nlist IntExt Hilbert ZF.Univ,其中 Nlist IntExt Hilbert 是我自己写的,但它们都没有任何与 timetime -> A 相关的定义,它们只包含关于int,箭头表示它是一个从time(这里是int)设置A的函数。我去看看supply命令,非常感谢。
  • 问题是由于某种原因无法翻译...

标签: isabelle


【解决方案1】:

感谢您在评论中提到的导入(谢谢),我可以重现该问题。问题是翻译,你需要做类似的事情

syntax
  "sig" :: "i ⇒ i" (‹sig(_)›)
translations
  "sig(A)" == "CONST int → A"

theorem sig_mono: "⟦ A ⊆ B ⟧ ⟹ sig(A) ⊆ sig(B)"
  apply(rule Pi_mono)
  apply assumption
  done

只是为了扩展我的评论并解释我如何发现问题出在翻译上。我看了看统一失败:

theorem ⟦ A ⊆ B ⟧ ⟹ time → A ⊆ time → B
  supply[[unify_trace_failure]]
   apply (rule PI_mono)

错误消息告诉sigPi 不统一。这已经很奇怪了。为了确定问题出在翻译上,我查看了基本术语:

ML ‹@{print}@{term ‹sig(A)›}›

它显示了基础术语,我们可以看到翻译不起作用,我查看了库中的其他翻译来解决问题。

【讨论】:

  • 我明白了,所以我必须把括号放在语法声明之后。您如何看待 ML 代码中的翻译不起作用?您是否在定理中遇到了模棱两可的警告?
  • 如果有的话,ML 会在展开翻译后向您显示术语。对于歧义,一种解决方案是将语法替换为abbreviation sig where ‹sig(A) == CONST int → A›
  • syntax "sig" :: "i ⇒ i" ("sig(_)" [70] 70) 保留翻译。
  • 非常感谢。根据您的理解,您认为如果我用时间替换 int 会有区别吗?例如,abbreviation sig where ‹sig(A) == CONST time → A›"sig(A)" == "CONST time → A"
  • 这个缩写允许你写sig A而不是sig(A)。否则inttimes应该没有区别(我只是在调试的时候换了,忘记读了)
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多