完全替换 isar 中的内部语法?

completely replace the inner syntax in isar?

我有兴趣使用 Isar 作为一种元语言来编写有关 J 的形式证明,这是一种可执行的数学符号和编程语言,我希望能够使用 J 作为内部语法。

J 由大量 primitives 组成,并为每个 ASCII 字符(包括单引号和双引号)赋予(多个!)含义。

在哪里可以找到实现全新内部语法的文档或示例代码?或者这甚至可能吗? (我一直在 src/ 目录中四处寻找,但它有点让人不知所措,我不完全确定我在寻找什么。)

答案 B:基于 HOL,使用改进的 J 语法

澄清很好,但我不喜欢进行必要的握手。

我下面的第一个答案主要基于您的短语,"a completely new syntax",我认为这是对这样一个问题的一半答案:

Suppose, hypothetically, that I need syntax that's very close to the the syntax of J. What would that require, with regards to Isabelle/HOL?

我的回答:

  1. 最有可能的是,我会说您必须取消定义 Isabelle/HOL 的常量、函数和类型 classes 的大部分语法,这需要您进行大量编辑标准 Isabelle/HOL 发行版,让它恢复工作。还有Isabelle/HOL中的一些语法,你很可能拿不出来。
  2. 或者,您必须重新开始,以导入 Pure 作为起点。请在下面查看我的第一个答案。

只是语法?现在我们回到普通用户 space

Isabelle/HOL 中语法的自定义使我们都成为潜在的 真正的艺术家

有一些高级方法可以利用定义语法的力量,例如 parse_translation 和 Isabelle/ML,但我不使用高级方法。我使用一些基本关键字来定义语法:notationno_notationsyntaxtranslations,以及 abbreviation,当我想重新排列时函数的输入参数,或者我不想弄乱标准 HOL 函数的符号。

notation, no_notation, 简单的

我不经常使用 no_notation,但你需要它在你的武器库中。有关示例,请参阅 Can I overload the notation for operators that are assigned to bool and list?

notation的使用很简单,看几个例子就可以了。

对于中缀运算符 plus :: 'a => 'a => 'a,这里有一些例子:

notation plus (infixl "[+]" 65)

notation (input) plus (infixl "[+]" 65)

notation (output) plus (infixl "[+]" 65)

在这个例子中,我进入了可能搞乱 plus 符号的领域,它是标准的 HOL 类型 class.

的运算符

上面不会弄乱输出显示的行是使用 (input).

的行

对于 notation,要查找示例,请在 THY 文件或 src/HOL 文件夹中执行 greps,因为变体太多,无法在此处提供大量示例。

abbreviation,不要把其他事情搞砸

假设我想要对标准 even 谓词进行非常紧密的绑定。我可以这样做:

notation (input) even ("even _" [1000] 1000)
notation (output) even ("even _" [1000] 999)

我说"could",因为我不知道那会怎样弄乱even的标准函数应用,所以我不想那样做。

为什么 999?这只是来自反复试验和经验,我知道仅下一行就搞砸了 declare[[show_brackets]]:

notation even ("even _" [1000] 1000)

定义语法就是这样。它是反复试验、寻找用作模板的示例、经验以及稍后发现您搞砸了某些事情的结合。

我忘记了 abbreviation 帮助我解决的所有问题。 abbreviation 的创新用法可以让您不必使用更复杂的方法。

出于某些符号目的,您可以使用它来重新排列参数:

abbreviation list_foo :: "'a list => 'a => 'a list" where
  "list_foo xs x == x # xs"
notation 
  list_foo ("_ +#+ _" [65, 65] 64)

那个例子是几个例子中的一个例子。我只是想举个简单的例子,我有类似 (infixl "_ +#+ _" [65, 65] 64) 的东西。我定义符号的方式没有太多变化,所以我不得不在 Set.thy 中找到一个例子来告诉我我需要去掉 infixl,因为我想使用 [65, 65] 64 ] 作为如何定义语法的变体。

我在 [65, 65] 64 中的优先级是否正确?我不知道。这只是一个简单的例子。

syntaxtranslations

你必须拥有它,但它会给你带来很多 time-consuming 悲伤。执行 greps 并查找示例。尝试这个和那个。当你偶然发现一些有用的东西,并且你认为你需要它,然后把它保存在某个地方。如果你不这样做,并且你做了一个小的改变,破坏了你已有的东西,并且你没有保存你曾经工作过的东西,你会后悔不得不花很多时间试图恢复工作。

Isar Reference Manual, isar-ref.pdf#175 有一些信息。此外,您可以在该 PDF 中查找 notation 的用法。

答案 B 部分未要求的部分

在你的评论中,你是这样说的:

I already do have a "logic of programming" that I want to implement (cs.utoronto.ca/~hehner/FMSD) and J is a language that's especially well suited for formal proofs. I'm just trying to figure out how to re-use Isabelle's logic infrastructure rather than writing my own.

对于这样的问题,来自任何人的简短、不安全的回答,即使是对冲,也是这样的:

You most likely can't do, in Isabelle/HOL, what you're wanting to do with J.

一个更安全、简短的答案是这样的:

Most likely, you will have major problems trying to do what you're wanting to do with J in Isabelle/HOL.

这些都是简短而快速的答案。如果这样的问题确实试图解决原因,那么它的答案怎么能简短呢?

它最终成为一个 "given everything I know" 的答案,因为很多时候不是做不到,而是合适的人群,给定一个足够长的时间,鉴于正确的技术,还没有做到。

我下面的标题成为我的观点。我试着很快地看完剩下的部分,但仍然记录了一些东西。

你用HOL作为你的逻辑,我原来的答案稍微修改一下仍然适用

Robin Milner 开始,Isabelle/HOL 发展成今天的样子,我将其归类为 火箭科学逻辑

从我所有的搜索和我所有的聆听来看,在使用证明助手之前,似乎还有很多火箭科学逻辑需要开发正式验证用任何 ole 命令式编程语言.

编写的任何 ole 程序

你有逻辑,HOL,但你是在暗示你要实现的东西类似于很多人想要的东西,并且已经想要了很长时间。

下面是为了支持我在这里说的。

J 作为一种非常适合形式证明的语言

会有传统形式的算法分析,比如Introduction to Algorithms, 3rd, by Cormen & Leiserson

我将在 Isabelle/HOL 机械化证明 正式验证程序 中调用程序证明。我还认为某些 pencil-and-paper 证明 是正式的。

在传统的 non-mechanized 证明中,那么,是的,我想 J 是一种非常适合正式证明的语言,我这么说是因为你告诉我它是。但是,流行的大型编程语言,特别是 C++ 和 Java,都有关于形式化算法分析主题的教科书。所以,它必须是,用传统的 non-mechanized 证明,它们也可以被推理。

J 在机械化校样的背景下

不,它不是一种用于正式、机械化证明的语言 well-suited。它使用(比使用更好的词?)imperative programming, and it appears to be object oriented.

基本上,我只是在重复我读过的其他人所说的话。我将开始发表声明作为 我的个人结论 。这将使事情变得更短。

函数式编程语言适用于形式化证明。传统编程涉及 变异变量 ,据说这会增加证明的难度。

我在邮件列表中搜索关于 object 面向语言的声明,但是如果你仔细听,人们会说他们已经做了这个或那个特别的事情,但从来没有像 "Here's a complete development and formalization that easily allows you to verify programs written in general-purpose programming language X".

除其他事项外,正式证明是关于一组公理的强制执行,其中公理的选择是 火箭科学逻辑 多年来的结果,因为规范并不是让一组看似合意的公理在逻辑上保持一致。

对于形式验证,您无法绕过公理的执行。在教科书中,数字常量只是出现并被使用,并且他们对它们进行推理。

在形式化证明中,数字常量,尤其是实数,很难使用。问问自己,"What is a natural number, an integer, a rational number, and a real number constant in Isabelle/HOL?" 现在,如果你回答了这个问题,那么问问自己,"How do I do proofs involving natural numbers, integers, rational numbers, and real numbers in Isabelle/HOL?"

现在,将这些问题与数字常量只是出现在大多数教科书中并被使用的事实进行对比。这不是它在正式证明中的工作方式。数字系统和常量没有神奇的外观。涉及数字的证明自动化可能有一点魔力,但我敢肯定,如果我的计划变得依赖于那样的魔力,我就完蛋了。

L4.verified(和 AutoCorres)

有一个 L4.verified project by NICTA. (Update: And at sel4.systems, with co-credit given to General Dynamics C4 Systems. A big-name company like GD being involved supports my thesis that formal verification of imperative programming languages 是长期以来一直非常需要的东西。)

引述:

We chose an operating system kernel to demonstrate this: seL4. It is a small, 3rd generation high-performance microkernel with about 8,700 lines of C code.

为什么这么挑剔?为什么不 任何 ole C 程序?我想验证 C 很难。 NICTA,他们不是一个小的、没有经验的、没有资金的团体。

(更新:还有相关的AutoCorres project at NICTA, with its Quickstart Guide PDF。发布版本是v1.0,发布于2014-12-16。那一定意味着他们实现了最初的目标他们应该实现。当我在 AutoCorres 网页上阅读他们的概述时,我认为它支持我所说的。在我看来,他们从事一些 火箭科学逻辑 将 C 变成另一种形式,至少需要一点 rocket science logic。我对 rocket science logic 的构成没有权威。我认为我可以肯定地说,他们正在使用 博士级逻辑 来获得结果。)

实用编程理论:数字常量从何而来?

我下载了本书 A Practical Theory of Programming 的 PDF 版本。

我开始在那本书中寻找的第一件事是 "what are numbers and how are they formalized".

数字系统,我们认为它们是理所当然的,但它们代表了所有关于形式证明的困难

在一本书中,当数字常量刚刚出现并开始使用时,很可能意味着相应的数字系统还没有真正的形式化。为什么?建立数字系统常数非常复杂。

如果数字常量没有被正式建立起来,就没有真正的正式证明。要是正式建起来了,日子还是不好过。

这里有一些关于使用实数的困难:Larry Paulson's talk at NASA in 2014

本书实用编程理论:while循环

我立即开始寻找的另一件事是传统循环的示例,您可以在其中重复修改变量。

它从 Section 5.2.0 While Loop, aPToP.pdf#76 开始。这个例子在下一页,练习 265:

while ¬ x = y = 0 do
    if y > 0 then y := y - 1
    else (x := x - 1. var· y := n)

给你,一个使用可变状态的 classic 示例(我在 "mutable state" 上搜索以实际查看我是否正确使用了该短语,但没有明确的结论)。

您有一个变量,并且您正在更改它的内容。那,所以我听说,或者我得出结论,代表了为什么当你想要验证你用 J 编写的程序时,你注定要失败。

我不是想让你完蛋。当你在 GitHub "The Formalization of the J Programming Language in Isabelle/HOL - with Many Demonstrations Showing the Ease with which J Programs Can Be Formally Verified" 上发布时,我会在那里。

辅酶Q。命令式编程有哪些?

我有这种预感,如果我的主要应用程序是编程,Coq 会更好。

我通过在 coq imperative 上进行 Google 搜索来保持最低要求。

第一个link是Ynot

这是否支持您应该能够采用 J 并在 Isabelle/HOL 中实现它的想法?

对我来说不是。它支持我的想法,如果某个人知道很多,并且可以就他们将要使用的语言做出设计决定,那么他们可以在证明助手中对命令式程序进行形式验证。

另一方面,您首先选择编程语言,然后现在要围绕它塑造一个证明助手。

我对 J 的兴趣,从 0 到 10 分

至此,我对J的兴趣基本为0,从0到10分。

不过,假设您建立了一个网站 "How It's Going with That J Thing",我使用 RSS reader 订阅了它。

不是不想让你正式验证Isabelle/HOL中的J程序,而是我认为你做不到,所以我没有理由去关心它,因为我不需要它。

但是,如果我在我的 RSS reader 中看到您站点的新 activity,它告诉我您成功了,并且您将代码放在 GitHub 上,那么我的兴趣转到 10。有人在 Isabelle/HOL 中对 full-blown 编程语言进行形式化,其中可以很好地实现证明,例如函数式编程,而不仅仅是语言的一小部分,这是值得的有兴趣。

原答案

四天过去了,放假了,专家可能不会出现,所以我给你答案。

我尽量尽快得到简短的回答,但我先说一些事情(实际上,很多事情),试图给我的快速回答一些支持。

我认为您使用 Isabelle 词汇的方式不正确 ("inner syntax"),但我引用了您的两个短语,并加粗强调:

  1. 我有兴趣使用 Isar 作为元语言来编写正式证明 关于 J...
  2. 在哪里可以找到实现全新内部语法的文档或示例代码?

我不是一个愿意花时间澄清的人,所以这就是我的要求,我在其中添加了一些细节,听取了专家的意见,并为自己弄清楚了一些事情,基于关于他们所说的:

  1. 你想要一个逻辑,它可以用来推理你用 J 编写的程序,在那里你使用 Isabelle/Pure 的最小逻辑作为你的起点(因为你需要 J 的完整语法,想重新开始)。
  2. 你想定义语法,使用 Isabelle/Isar,它实现(或模型?)J 的完整语法和功能。(你没有说你只想推理J.的语法和功能)

很遗憾,我的简答没有完全成立。

为了让您了解您的要求,我现在引用 J 主页上的内容,重点是我的:

J is a modern, high-level, general-purpose, high-performance programming language.

我现在改写 general-purposefull-blown,像 C,像 Pascal,像许多 high-level, general-purpose 编程语言,我提醒你,你需要两件事:

  1. Isabelle 中的逻辑,在复杂性、功能和功能方面肯定必须与 Isabelle/HOL 的逻辑相媲美。
  2. Isabelle 中 full-blown 编程语言 J 的语法和使用(或建模?),从 Isabelle/Pure 开始,您的实现肯定是
    • 在复杂性和功能上与 Isabelle/HOL 的代码生成器相当,它可以导出 5 种编程语言的代码,SML、OCaml、Haskell、Scala 和 Eval (Isabelle/ML),
    • 并且在功能上可与 Isabelle/HOL 的逻辑引擎相媲美,后者实现(或建模?)high-level、definitionprimrec 等函数式编程构造, datatypefun,让人们可以定义函数和新数据类型,以及 Isabelle/HOL 类型的标准库,例如对、列表等

现在,我个人的结论是,你要实现的东西至少和Isabelle/HOL一样难实现,这是很多人的结果,完成了很多年了。

请考虑 Peter Lammich 在 I need a fixed mutable array 中的 Isabelle 用户列表中所说的话:

HOL itself does not support mutable arrays.

However, there is Imperative_HOL, which has a heap monad supporting mutable arrays.

Then there is afp/Collections/Lib/Diff_Array, which provides an implementation of arrays that behaves purely functional, but is efficient if only the last version is accessed.

However, if you are not after efficient executability, but only looking for an abstract model of a memory, it makes no sense using the above types, as the efficiency comes at the price of additional formalization overhead.

我引用的观点是,Isabelle/HOL 虽然强大到足以成为证明助手的主要竞争者之一,但并未在其逻辑的主要部分实现标准数组,您得到当你导入 Complex_Main.

(L, P)成为一对,其中L是逻辑,P是编程语言。我想说两对,(Isabelle/HOL, Haskell),还有你想要的,(x, J),其中x是你尚未确定的逻辑。

Isabelle/HOL和Haskell之间有着非常密切的关系。例如,Isabelle/HOL 的类型 class 被宣传为 Haskell-like 类型 classes,并且 Haskell 是一种纯函数式编程语言,并且Isabelle/HOL是纯粹的。我不想更进一步,因为作为一个non-expert,我肯定会说一些不对的东西。

我想说的重点是:

  1. Haskell 是一种 full-blown 编程语言,
  2. Isabelle/HOL逻辑强大,
  3. Haskell 是可以从 Isabelle/HOL,
  4. 导出的编程语言之一
  5. 但 Isabelle/HOL 并未实施(或建模?)大部分 Haskell。

我不想以权威的身份说话。但是从听下来,我的结论是:这就是逻辑。显然,实现编程语言比开发推理程序的逻辑要容易得多。

简短的回答是,在我看来,您正在寻找的示例代码是 Isabelle/HOL,因为尽管 Isabelle2014/src 中有一些其他逻辑的示例,但我'我已经引用了你所说的和想要的,我的意思是你说的和想要的,是你想要并且需要一个 full blown 逻辑,比如 Isabelle/HOL.

从这里开始,我尝试抛出一些快速的想法。

我喜欢那辆车,但我真正想要的是液氮燃料

这是我的笑话。

你在和一位在该行业工作多年的高级工程师交谈,并且学习了多年在汽车行业积累的专业知识,你说,"I like that idea of a car, but my idea is to use a nitrogen fuel cell instead of gasoline. How would I do that?"

Isabelle2014/src 文件夹中有更多逻辑

分发网页上 Theory libraries for Isabelle2014 下的 link 与 Isabelle2014/src 文件夹中的文件夹匹配。

src 文件夹中,您将看到文件夹 CCLCubeCTT 和其他文件夹。

我相信这些对学习很有帮助,虽然可能仍然难以理解,但这些不是你所描述的。您要求完全成熟实现某种编程语言模型。

如果 C/C++ 的用途如此之大,那么为什么 C/C++ 没有您想要的东西?

我想 C 至少有一些。我发现 vcc.codeplex.com/。再说一次,我不是专家,所以我不想确切地说出那里有什么,什么没有。

我的观点是,C 和 C++ 已经存在了很长时间,并且被大量使用,上面的 link 表明长期以来有专业人士对验证感兴趣C 程序,这很有意义。

但是,经过这么多年,为什么程序验证不是 C/C++ 编程的一个组成部分?

从到处听取那些人的意见,在邮件列表上,以及从听取像 Scala 架构师 Martin Odersky 这样的人的意见,他们总是想谈论可变和不可变状态,而传统编程,如 C ,我假设 J 属于使用可变状态的类别,并且非常喜欢使用它。随着时间的推移,我多次听说可变状态使得推断程序的行为变得困难。

我的观点是,设计编程语言一定比推理程序容易得多。

最后,一点源码

如果这个问题有一些竞争,我可能会不那么冗长,虽然可能不会,但可能是这样,甚至没有给出答案。

我的最后一点是上面的 re-emphasis 点。了解一点历史是有好处的,我比 Church 和 Curry 更早开始。

我知道 Isabelle/HOL 是剑桥大学开始的结果,先是 ML 的作者 Robin Milner,然后是 HOL 组的 Mike Gordon,然后是 using Pure as minimal 的作者 Larry Paulson定义其他逻辑的逻辑,然后 Tobias Nipkow 与他合作将 HOL 作为 Isabelle 中的逻辑开始,然后 Makarius Wenzel 在其上添加了 higher-level 语法,Isar(它不仅仅是语法糖;它是结构化证明功能的基础),以及 PIDE 前端,以及世界各地的其他人做出了无数贡献,其中许多来自德国 TUM 的大团队,但还有澳大利亚的 CERN(update: CERN?这可不是开玩笑的;我其实知道CERN和NICTA的区别;世界上,这不是一件容易谈论的事情),说回欧洲区,瑞士某机构,ETH,还有更多的地方分布在德国和奥地利,UIBK,然后回到英国?我遗漏了谁?当然是我,还有世界上很多其他人。

乱七八糟的地方?这是你要求的东西,体现了一个行业的专业知识。求之不得也不错。这是彻头彻尾的大胆,我说的可能完全错了,并且错过了 src 中的那个文件夹, HOWTO General-Purpose 编程语言的逻辑实现,全部在十主要是简单的步骤,立即发送 9.95 美元,或者如果你有那么多欧元,你进行转换,我相信你,但是等等,还有更多,将目录更改为 Isabelle2014/medicaldoctor 并学习如何成为大脑也是外科医生

我说这是另一个笑话。只是一个 space 填充物,仅此而已。

无论如何,请考虑 HOL.thy 的第 47 至 60 行:

setup {* Axclass.class_axiomatization (@{binding type}, []) *}
default_sort type
setup {* Object_Logic.add_base_sort @{sort type} *}

axiomatization where fun_arity: "OFCLASS('a ⇒ 'b, type_class)"
instance "fun" :: (type, type) type by (rule fun_arity)

axiomatization where itself_arity: "OFCLASS('a itself, type_class)"
instance itself :: (type) type by (rule itself_arity)

typedecl bool

judgment
  Trueprop :: "bool => prop" ("(_)" 5)

每隔一段时间,我都会努力理解那几行。很长一段时间以来,我的出发点都是 typedecl bool,除了 HOL.thy 导入 Pure.[=102= 之外,我并不关心试图理解之前的内容。 ]

最近,在尝试找出 Isabelle 中的类型和排序时,听取了专家的意见,我终于看到这一行是我们得到类似 x::'a::type:

的地方
setup {* Object_Logic.add_base_sort @{sort type} *}

还有一点?我回到我之前说的。因为你想要 full-blown,所以你的例子是 Isabelle/HOL,但是 HOL.thy 的前 57 行并不容易理解。但是,如果您不从 HOL 入手,您会去哪里寻找?好吧,如果您发现的东西最终变得简单,那很可能部分是因为多年来,数百人并没有将他们的努力放在最好的开始方式上。

或者,可能只是列为作者的 3 人,Nipkow、Wenzel 和 Paulson。无论如何,尽管 HOL.thy 不是那么长,只有 2019 行,但其中的内容背后仍有多年的经验和教育。当然,要理解HOL.thy中的内容,你至少得对Pure是什么有一个模糊的理解。

查看 src/Cube 文件夹。这是我上面提到的示例逻辑之一。

只有两个文件,Cube.thyExample.thy。它应该很容易,但这就是问题所在,它太容易了。它不会反映 Isabelle/HOL.

的复杂性

你的问题不是我的问题。 Isabelle/HOL 非常适合数学推理,比如它能够抽象出类型为 classes 的运算符。而且它有利于更多,比如使用函数式编程定义函数,导出 OCaml、Haskell、SML、Haskell 和 Eval。

我只是一个初学者,仅此而已。如果有更好的答案,希望有人能提出来。

关于原题的几点说明:

  • 外层语法是Isar的理论和证明语言;要更改它,您需要定义额外的 命令 。您受制于一般类型的理论内容,例如 theorylocal_theoryProof.context,但这些类型非常灵活,可以吸收特定于您的应用程序的任意 ML 数据。

  • 内部语法是逻辑的type/term语言,即纯用于框架,HOL用于应用程序(或您喜欢的任何其他逻辑,尽管HOL在今天如此先进,以至于如果没有真正充分的理由,你不应该忽略它)。最终,您拼出了简单类型的 lambda 术语。

对于外部语法和内部语法,您都受制于 tokens 的某些概念(标识符、带引号的字符串等)。如果要与现有语法框架直接共存,您的语言需要符合这一点。

通过使用引号,仍然可以将完全不同的语言嵌入到 Isabelle 的外部和内部语法中。例如。请参阅基于 LaTeX 的文档准备语言,并用有趣的 {* ... *} 标记分隔逐字文本。更多基本的引用使用 " ... " 类似于 ML 字符串语法。在内部语法中,'' ... ''(双单引号)做类似的工作。

在 Isabelle2014 中有一个新的句法设备 text cartouches 使这项工作更加顺利。例如。请参阅 Isabelle2014/src/HOL/ex/Cartouche_Examples.thy 中的示例,其中探索了一些可能性。

Isabelle2014 中的另一个当前示例是 Isabelle 文档源中的 rail 语言:它几乎可以作为从头定义的 "domain-specific formal language" 的独立示例。例如。请参阅 Isabelle2014/src/Doc/Isar_Ref/Document_Preparation.thy 并查看 @{rail ...} 的各种用途——其实现在 Isabelle2014/src/Pure/Tools/rail.ML 中 —— 一个有限大小的文件,需要仔细研究以了解更多信息。