标签: isabelle

在Isabelle中定义重载常量

如何在Isabelle中定义一个函数,该函数具有不同的定义,具体取决于其参数的类型或它所使用的上下文的类型?

例如,我可能想要定义一个is_default带有类型的函数'a ? bool,其中每个不同的类型'a都有一个可能不同的"默认值".(为了论证,我也假设现有的概念zero不合适.)

overloading isabelle

5
推荐指数
1
解决办法
384
查看次数

如何在Isabelle/jEdit中启用"跟踪"

我是vim粉丝,但只有emacs才有这个Isabelle/HOL环境.jEdit很棒,但我不能使用

using [[simp_trace=true]]
Run Code Online (Sandbox Code Playgroud)

就像在emacs中一样.

如何在jEdit中启用"跟踪" ?

isabelle

5
推荐指数
2
解决办法
1500
查看次数

有没有办法自动拆分连接?

我想A /\ B /\ C /\ D /\ E /\ F在伊莎贝尔证明.如何将子目标自动拆分为6个单独的子目标proof(rule ...),以便之后我可以单独证明它们?

当然,我可以写proof(rule conjI)5次,但也许有一种更优雅的方式可以一步完成分割?

isabelle

5
推荐指数
1
解决办法
212
查看次数

Isabelle / HOL中的primrec和fun有什么区别?

我正在阅读Isabelle教程,并试图阐明我对使用Primrec和乐趣的概念。到目前为止,我已经搜索了所有内容,包括此处的答案;我知道primrec内部的构造函数默认只能有一个方程式,而primrec默认具有[simp],而fun可以具有多个方程式,并且需要明确指定自动化策略。但是,我仍然很难清楚地理解它。

任何人都足以举例说明吗?

isabelle

5
推荐指数
1
解决办法
1015
查看次数

Isabelle:不支持通过类型构造函数“Set.set”递归出现数据类型

问题

我想知道在 Isabelle 中是否有一种自然的编码方式是这样的语法:

 type_synonym Var = string
 datatype Value = VInt int | ...
 datatype Cmd = Skip | NonDeterministicChoice "Cmd set" | ...
Run Code Online (Sandbox Code Playgroud)

动机是根据非确定性选择定义一些规范命令,例如:

 Magic == NonDeterministicChoice {}
 Rely c r z = Defined using set compreehension and NonDeterministicChoice
Run Code Online (Sandbox Code Playgroud)

Isabelle 抱怨“Cmd set”中类型“Cmd”的递归出现,即:

不支持通过类型表达式“Cmd set”中的类型构造函数“Set.set”递归出现类型“Cmd”。使用“bnf”命令将“Set.set”注册为有界自然函子以允许嵌套(共)递归通过它

在我使用 set 时查看 Isabelle 错误消息,我无法弄清楚如何在这种情况下为“set”类型注册有界自然函子,因此我决定尝试一种推测性解决方案。

投机解决方案

相反,如果我使用归纳定义的数据类型,例如列表,伊莎贝尔不会抱怨,例如

datatype Cmd = Skip | NonDeterministicChoice "Cmd list" | ...
Run Code Online (Sandbox Code Playgroud)

列表在这里不是正确的抽象,但我试一试看看它是否有效。使用列表的直接效果是,我需要使用序列过滤而不是使用集合理解,然后问题就变成了假设存在两个列表:一个包含Cmd 的所有元素,另一个包含Value 的所有元素。

我声明了两个未解释的常量:

consts Values :: "Value list"
consts Programs :: "Cmd …
Run Code Online (Sandbox Code Playgroud)

recursion theorem-proving isabelle

5
推荐指数
1
解决办法
303
查看次数

隐藏运算符以避免AST中的歧义

我正在尝试官方Isabelle教程中的列表示例.我将#with :@with 替换为与++Haskell具有相同的语法.现在我收到有关AST中含糊不清的警告.我知道我可以隐藏函数,hide_const但这对于中缀表示法的运算符不起作用.我怎样才能隐藏Isabelle的操作员?

确切的警告信息是:

Ambiguous input? produces 2 parse trees:
  ("\<^const>HOL.Trueprop"
    ("\<^const>HOL.eq" ("\<^const>Map.map_add" ("/<^const>toylist.list.Nil") ("_position" ys))
      ("_position" ys)))
  ("\<^const>HOL.Trueprop"
    ("\<^const>HOL.eq" ("\<^fixed>app" ("\<^const>toylist.list.Nil") ("_position" ys)) ("_position" ys)))
Fortunately, only one parse tree is well-formed and type-correct,
but you may still want to disambiguate your grammar or your input.
Run Code Online (Sandbox Code Playgroud)

isabelle

5
推荐指数
1
解决办法
214
查看次数

Isabelle/HOL中的通用量化

我注意到,在与Isabelle/HOL Isar合作时,有几种方法可以处理通用量化问题.我正在尝试以适合本科生理解和复制的风格写出一些证据(这就是我使用Isar的原因!)而且我对如何以一种很好的方式表达普遍量化感到困惑.

例如,在Coq中,我可以写forall x, P(x),然后我可以说"感应x",它将根据相应的归纳原理自动生成目标.然而,在Isabelle/HOL Isar中,如果我想直接应用归纳原理,我必须在没有任何量化的情况下陈述该定理,如下所示:

lemma foo: P(x)
proof (induct x)
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,因为x被视为一个原理图变量,就像它被普遍量化一样.但是,它在声明中缺乏普遍的量化,而这种量化并不是很有教育意义.我资助的另一种方式是使用\<And>\<forall>.但是,如果我以这种方式陈述引理,我不能直接应用归纳原理,我必须首先修复普遍量化的变量......从教育的角度来看,这似乎很不方便:

lemma foo: \<And>x. P(x)
proof -
fix x
show "P(x)"
proof (induct x)
Run Code Online (Sandbox Code Playgroud)

什么是表达通用量化的一个很好的证明模式,不需要我在归纳之前明确地修复变量?

proof isabelle

5
推荐指数
1
解决办法
297
查看次数

处所的顺序

如何更改规则中的前提顺序?例如,在伊莎贝尔的自然演绎规则中:

mp: ?P ? ?Q ? ?P ? ?Q
Run Code Online (Sandbox Code Playgroud)

我们可以将订单更改为:

?P ? ?P ? ?Q ? ?Q
Run Code Online (Sandbox Code Playgroud)

我可以使用rev_mp或定义一个新的引理,但我要找的是是否有一个定理修饰符改变了前提的顺序.

isabelle

5
推荐指数
1
解决办法
109
查看次数

给定一个具有对象逻辑含义的定理"P(t)⟶(∃x.P(x))",为什么证明目标"P(t)⟹(∃x.P(x))"与meta-给出逻辑含义?

我刚开始使用Isabelle/HOL并试图用自然演绎规则证明一个简单的HOL语句"P(t)⟶(∃x.P(x))".我从一个仅包含该定理的理论文件开始:

theory simple imports Main
begin

lemma T: shows "P(t) ? (?x . P(x))"
proof
  (* x *)
qed  

end
Run Code Online (Sandbox Code Playgroud)

在注释中标记为x的位置处,当前目标已经是"P(t)⟹(∃x.P(x))",即逻辑蕴涵已经简化为元逻辑蕴涵.

通过反复试验,我得出以下证据:

proof
  assume "P(t)" then
  have "? x . P(x)" by (rule exI) then
  have "P(t) ? (?x . P(x))" by (rule impI)
  then show "P(t) ? (?x . P(x))" by (rule impE)
qed
Run Code Online (Sandbox Code Playgroud)

这看起来有些奇怪:我正在介绍这个含义,只是为了在下一步中消除它.

我现在的问题是:

  1. 重写我的目标来自哪里,哪里可以找到更多关于它的信息?
  2. 如何简化证明(不使用auto绕过ND)?

isabelle

5
推荐指数
1
解决办法
112
查看次数

Coq/underdefined中的部分功能?

我一直在尝试使用Concrete Semantics(为Coq Isabelle/HOL 编写)作为参考点来编写和验证Agda中的编译器.我正在为该文本中使用的相同语言定义编译.

对于上下文,我已经完成了编译器的编写,现在我处于验证阶段,但是我必须在机器指令执行的定义中对Concrete Semantics做出重大改变.这种差异似乎在Agda中是必要的,但现在使验证阶段非常复杂.

在尝试使用Concrete Semantics中给出的更简单的指令执行版本时,我遇到了这一行,这可以解释为什么我无法直接将其转换为Agda:

列表的头部,第一个元素和尾部,列表的其余部分也很有用:

fun hd :: 'a list ? 'a
hd (x # xs) = x
Run Code Online (Sandbox Code Playgroud)

请注意,由于HOL是总函数的​​逻辑,hd []因此定义了,但我们不知道结果是什么.也就是说,hd []未定义但未定义.

hd []欠定义是什么意思?这相当于在Agda中使用不完整的模式吗?

汇编指令执行函数在很大程度上依赖于hd.在我在Agda中的实现中,我给了多个类型的索引,以允许我构建堆栈总是具有最小元素数量的证明,以避免不完整的模式匹配问题.现在我正在尝试验证编译器,证明的大小比具体语义中的证明更复杂,因为我必须使用这些索引.

我是否遗漏了某些东西,或者具体语义中的证据是不完整的,hd []未被定义?

compiler-construction agda isabelle

5
推荐指数
1
解决办法
102
查看次数