操作系统形式化验证实践教程(2) - HOL列表与集合

在进入相对比较烧脑的证明过程之前,我们先熟悉下HOL语言中处理列表和集合数据结构的部分。
这部分各种函数式语言其实是大同小异的,学习成本比较低。

列表类型

HOL的列表类型与别的语言比较像,也是使用[]来表示。类型只要相同就可以,比如我们以整数类型列表为例:

value "[uminus int(1),int(0),int(1)]"

值和类型如下:

"[- 1, 0, 1]":: "int list"

[]是Nil,是空列表。
除了用[int1,int2]这样表示外,也可以用int1 # int2 # []的方式来描述。#是Cons操作,为将两个列表连接在一起的操作。

来看个例子:

value "nat(2) # nat(10)# []"

值为:

"[2, 10]":: "nat list"

可以用"…"来生成序列,例:

value "[int(1)..int(10)]"

值为:

"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]":: "int list"

求表头

hd函数用于求列表表头。
例:

value "hd [int(1),int(3),int(5)]"

结果为:

"1":: "int"

除表头外剩余部分

用tl函数来求除表头外剩余部分,比如下表,就是除掉表头1之后,2到10的列表:

value "tl [int(1)..int(10)]"

结果为:

"[2, 3, 4, 5, 6, 7, 8, 9, 10]":: "int list"

求表尾元素

与tl不同,last用来求最后一个元素,例:

value "last [int(1)..int(20)]"

结果为20:

"20":: "int"

求列表长度

length函数可以计算列表的长度,例:

value "length [int(1)..int(102)]"

结果为:

"102":: "nat"

请注意长度结果是nat自然数,而不是int整数。因为长度不可能为负的。

截掉列表的内容

比如截掉头部的两个元素,可以通过drop 2 [列表] 来实现:

value "drop 2 [int(1)..int(5)]"

输出结果为:

"[3, 4, 5]":: "int list"

列表反序

reverse将现有列表顺序反过来:

value "rev [int(1)..int(5)]"

结果为:

"[5, 4, 3, 2, 1]":: "int list"

列表值求和

HOL中的sum_list函数可以求数值列表的元素的值的和:

value "sum_list [int(1)..int(100)]"

结果为:

"5050":: "int"

排序

列表支持sort函数用来排序:

value "sort (rev[int(5)..int(10)])"

结果为:

"[5, 6, 7, 8, 9, 10]":: "int list"

将列表转换成集合

通过set函数可以将列表转换成集合:

value "set [int(1)..int(5)]"

结果如下:

"{1, 2, 3, 4, 5}":: "int set"

上面的内容写得相对比较多,不是想写成手册,而是希望借着操练比较熟悉的内容的机会,让大家尽可能地熟悉Isabelle/HOL的环境,消除恐惧感。

集合

与列表类似,HOL支持以{}表示的集合类型。

与列表一样,集合也支持通过序列生成:

value "{int(1)..int(10)}"

结果为:

"{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}":: "int set"

插入元素

通过insert函数将元素插入到集合中:

value "insert (int(100)) {int(1)..int(10)}"

结果为:

"{100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}":: "int set"

判断元素是否属于集合

比起其它语言用的in操作,HOL直接使用∈符号,输入时写作’\’

value "(int(10)) ∈ {int(1)..int(100)}"

源代码实际上为:

value "(int(10)) \<in> {int(1)..int(100)}"

交集与并集

交集和并集直接使用∩和∪。输入时用\和\表示。

我们看下并集的例子:

value "{int(1)..int(5)} ∪ {int(100)..int(120)}"

输出为:

"{5, 4, 3, 2, 1, 100, 101, 102, 103, 104, 105, 106, 107,108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,119, 120}":: "int set"

再来看一个交集的例子:

value "{int(1)..int(105)} ∩ {int(100)..int(120)}"

结果如下:

"{100, 101, 102, 103, 104, 105}":: "int set"

幂集

幂集是由集合的所有子集所组合的集合。
我们看个最简单的例子,大家就能理解了:

value "Pow {int(1)..int(2)}"

组合的结果应该为空集,1的集合,2的集合和这个集合本身。

"{{2}, {}, {1}, {1, 2}}":: "int set set"

巩固一下,如果扩展到5个元素,你还能写全吗?

value "Pow {int(1)..int(5)}"

结果为:

"{{2, 3, 4, 5}, {2, 3, 4}, {2, 3}, {2, 3, 5}, {2, 5}, {2},{2, 4}, {2, 4, 5}, {4, 5}, {4}, {}, {5}, {3, 5}, {3},{3, 4}, {3, 4, 5}, {1, 3, 4, 5}, {1, 3, 4}, {1, 3},{1, 3, 5}, {1, 5}, {1}, {1, 4}, {1, 4, 5}, {1, 2, 4, 5},{1, 2, 4}, {1, 2}, {1, 2, 5}, {1, 2, 3, 5}, {1, 2, 3},{1, 2, 3, 4}, {1, 2, 3, 4, 5}}":: "int set set"

量词

HOL终于要开始展示真实本领了,作为一种逻辑语言,它是支持量词的,也就是∀\forall∀和∃\exists∃.

我们还是直接上个例子,对于某个整数集合,所有元素都大于0:

value "∀x∈{int(1)..int(10000)}. x>0"

这自然是真的:

"True":: "bool"

这一期我们从比较熟悉的列表和集合操作,引入一点点逻辑相关的操作。其实就是想让大家看到,让这些LaTex符号运行起来,其实也没有什么神秘的。

最后,我们发一下这一节完整的源代码:

theory Test2imports Main
begin
value "hd [int(1),int(3),int(5)]"
value "nat(2) # nat(10)# []"
value "int(2) # int(3) # []"
value "tl [nat(2),nat(3)]"
value "[uminus int(1),int(0),int(1)]"
value "[int(1)..int(10)]"
value "tl [int(1)..int(10)]"
value "last [int(1)..int(20)]"
value "length [int(1)..int(102)]"
value "sum_list [int(1)..int(100)]"
value "drop 2 [int(1)..int(5)]"
value "rev [int(1)..int(5)]"
value "set [int(1)..int(5)]"
value "sort (rev[int(5)..int(10)])"
value "{int(1)..int(10)}"
value "insert (int(100)) {int(1)..int(10)}"
value "(int(10)) \<in> {int(1)..int(100)}"
value "{int(1)..int(5)} \<union> {int(100)..int(120)}"
value "{int(1)..int(105)} \<inter> {int(100)..int(120)}"
value "\<forall>x\<in>{int(1)..int(10000)}. x>0"
value "Pow {int(1)..int(2)}"
value "Pow {int(1)..int(5)}"
value "-{int(0)..int(10)}"
(* Tests on values *)
end

操作系统形式化验证实践教程(2) - HOL列表与集合相关推荐

  1. 操作系统形式化验证实践教程(7) - C代码的自动验证

    操作系统形式化验证实践教程(7) - C代码的自动验证 上一节教程不知道大家看晕了没有,其实虽然细节很多还没有讲清楚,但是从结构上大家可以看到,其实是很模式化的工作. 那么能不能让这个模式化的工作自动 ...

  2. 操作系统形式化验证实践教程(7) - C代码的自动验证(转载)

    操作系统形式化验证实践教程(7) - C代码的自动验证 上一节教程不知道大家看晕了没有,其实虽然细节很多还没有讲清楚,但是从结构上大家可以看到,其实是很模式化的工作. 那么能不能让这个模式化的工作自动 ...

  3. 操作系统形式化验证实践教程(10) - 一阶直觉逻辑

    操作系统形式化验证实践教程(10) - 一阶直觉逻辑 前面我们用了九讲的篇幅把seL4验证操作系统的地图给大家迅速过了一遍,基础好的同学已经可以基于前面的知识开始自己的工作了. 对于只学过离散数学,而 ...

  4. 操作系统形式化验证实践教程(11) - 结构化证明语言Isar(转载)

    操作系统形式化验证实践教程(11) - 结构化证明语言Isar 结构化证明语言Isar基本语法 apply方法和by方法虽然可以完成功能,但是看起来更像是命令式语言.使用Isar语言,还可以写得更加形 ...

  5. 操作系统形式化验证实践教程(11) - 结构化证明语言Isar

    操作系统形式化验证实践教程(11) - 结构化证明语言Isar 结构化证明语言Isar基本语法 apply方法和by方法虽然可以完成功能,但是看起来更像是命令式语言.使用Isar语言,还可以写得更加形 ...

  6. linux内核形式化验证,聪明人的笨功夫 -- MesaTEE安全形式化验证实践

    各类TEE(例如TPM和Intel SGX)提供了强大的可信计算硬件基础,但他们并不直接保证软件的安全性.诸如缓冲区溢出等内存安全问题为攻击者提供了侵入TEE的可乘之机.因此,软件内存安全保护极其重要 ...

  7. 实验9Linux共享内存通信,操作系统原理与Linux实践教程(卓越工程师培养计划系列教材)...

    导语 由申丰山和王黎明共同编著的<操作系统原理与Linux实践教程(卓越工程师培养计划系列教材)>一书理论与实践并重,全面.系统地阐述了操作系统的重要概念和原理,深入.细致地剖析了操作系统 ...

  8. Scyther形式化验证工具简单教程

    Scyther形式化验证工具 Scyther是一种自动化的安全协议验证工具.在协议的安全性验证方面有着广泛的应用. 下面介绍其安装方法以及使用教程. 安装方法 Scyther工具在Windows 10 ...

  9. 鸿蒙 形式化验证,形式化验证在网络中的应用

    作者简介:唐昊,现就职于华为,从事云网络研发工作. IBN(基于意图的网络)是近年来网络领域中最热门的话题之一,网络验证是其中最关键的环节.我们在此之前一直专注于网络配置的自动化,例如根据模板创建配置 ...

  10. 「首席架构师推荐」最棒的的Flutter库,工具,教程,文章列表

    Flutter是一款移动应用SDK,可通过单一代码库为iOS和Android构建高性能,高保真的应用. 内容 文章 视频 组件 导航 模板 插件 构架 开源应用程序 WEB 工具 社区 文章 介绍 G ...

最新文章

  1. 【撸码师的读书笔记】 深入理解Java虚拟机——JVM高级特性与最佳实践
  2. mysql 开启守护进程_[求助]Linux上MySQL Server 5.6 安装后无法启动守护进程
  3. leetcode 5786. 可移除字符的最大数目(二分法)
  4. LeetCode 163. 缺失的区间
  5. 第六、七章重点知识点总结
  6. 我是如何利用一个只有500人的QQ通过人性的弱点来变现的
  7. QSS实践汇总(3)——QComboBox样式(风格)
  8. 图书馆管理系统设计说明书
  9. 直击灵魂:软件研发的第一性原理与10倍效能
  10. 淘宝API item_search_similar - 搜索相似的商品
  11. 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心...
  12. 二叉查找树(BST)专题
  13. 邮箱和手机号粗略验证
  14. Docker-设置redis容器主从模式哨兵模式
  15. GPS北斗模块串口助手输出测试
  16. ACwing 895 - 最长上升子序列(最长上升子序列模型)
  17. 阿里ECS云服务器连接RDS数据库服务器小白图文详细教程(云企业)
  18. 莫听穿林打叶声,2022年SSD行业回顾与展望
  19. Python 查看文字编码
  20. 关于Socket通信中SOCK_STREAM和SOCK_DGRAM区别

热门文章

  1. 做人最大的无知,是错把平台当本事(深度好文)
  2. 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
  3. node.js基于vue的化妆品销售管理系统的设计与实现毕业设计源码151314
  4. 密立根油滴实验数据处理(C++实现)
  5. PS调出怀旧雨中特写的非主流照片
  6. CVPR2019| 中科院VIPL实验室11篇CVPR解读:弱监督学习、视频分割、目标检测
  7. 201919102004张雪婷(第二次作业)
  8. linux vim命令详解 编辑文件 保存 退出
  9. Auto property synthesis will not synthesizeproterty;it will be implemented by its superclass, use@dy
  10. composer mysql_composer安装doctrine/dbal