ada - SPARK 可以用来证明 Quicksort 确实排序了吗?
问题描述
我不是 SPARK 的用户。我只是想了解语言的功能。
例如,可以使用 SPARK 来证明 Quicksort 实际上对给它的数组进行排序吗?
(希望看到一个例子,假设这很简单)
解决方案
是的,它可以,虽然我不是特别擅长 SPARK 证明(还)。以下是快速排序的工作原理:
- 我们注意到快速排序背后的想法是分区。
- 选择了一个“枢轴”,它用于将集合划分为三组:等于、小于和大于。(这个排序会影响下面的过程;我使用它是因为它不同于按顺序的版本来说明它主要是关于分组,而不是排序。)
- 如果集合是
0
或1
长度,那么你是排序的;如果2
然后检查并可能更正排序并对其进行排序;否则继续。 - 将枢轴移动到第一个位置。
- 根据考虑的值,从第二个位置扫描到最后一个位置:
Less
Greater
– 与分区中的第一项交换。Greater
– 空操作。Equal
— 与 的第一项Less
交换,与 的第一项交换Greater
。
- 递归调用
Less
&Greater
分区。 - 如果函数返回
Less
&Equal
&Greater
,如果过程将输入重新排列in out
到该顺序。
以下是您将如何做事:
- 证明/断言
0
和1
案例为真, - 证明您对
2
物品的处理, - 证明给定一个输入集合和枢轴,有一组三个值
(L,E,G)
,它们是小于/等于/大于枢轴的元素的计数[这可能是一个幽灵子程序], - 证明
L
++E
等于G
你的集合的长度, - 证明[在后置条件中]给定枢轴和
(L,E,G)
元组,输出符合L
小于枢轴的E
项目,然后是相等的项目,然后G
是更大的项目。
那应该这样做。[IIUC]
推荐阅读
- c# - 如何在 ASP.Net 标记中定义 c# 版本
- reactjs - 从本地文件存储播放声音
- javascript - 如果我在“url”地址中有“perPage = 20”(获取 20)并且有 1000 个元素,如何检查数组长度?
- tailwind-css - 保持一列固定,而其他滚动
- javascript - 身体触摸动作:无,但可以捏缩放一个 div
- ios - “清单签名未验证成功”
- java - 如何捕获 TransientPropertyValueException
- java - 如何使选定的组合框值显示不同的文本?
- time - ISO 8601 可以表示开始/结束是持续时间的时间间隔吗?
- php - 如何/在哪里在 PHP 中两次声明一个静态函数?