这与Project Euler问题523有关。
以下算法对列表进行排序:
- 从列表的开头开始,依次检查每对相邻的元素。
- 如果元素出现故障:
- 将该对中最小的元素移动到列表的开头。
- 从步骤1重新开始此过程。
- 如果所有配对都有序,请停止。
醇>
我正在尝试(练习)在Isabelle中编写代码。我已经获得了以下函数定义:
fun firstpos :: "nat list ⇒ nat"
where "firstpos [] = 0"
| "firstpos (x # y # xs) = (if (x > y) then 1 else (firstpos (y#xs))+1)"
| "firstpos [x] = Suc 0"
和
fun insertAtFront :: "(nat list) ⇒ (nat) ⇒ (nat list)"
where "insertAtFront l 0 = l"
| "insertAtFront l i = [hd (rev (take i l))] @ (take (i-1) l) @ (rev (take ((length l) - i) (rev l)))"
其中firstpos
确定第一个元素的list-index大于列表中的后继元素,insertAtFront
置换列表,以便“第二个参数”元素位于前面
也就是说,firstPos
有效地告诉我们从哪里开始执行算法的第2步,insertAtFront
是算法的第2.1步。
现在,我希望定义基本上是这些组成的固定点的函数。换句话说,
fun sortproc :: "nat list ⇒ nat list"
where "sortproc l = sortproc (insertAtFront l (firstpos l + 1))"
这个程序永远不会终止,但我可以用数学证明:在每个阶段,$ \ sum_ {i = 1} ^ n 2 ^ i L_ {ni} $减少,其中$ n $是长度列表$ L $。
我是伊莎贝尔的新手。我如何编写“伊莎贝尔的这个定义是明确的,因为这个证明”的想法?文档似乎主要讨论大小参数,输入的大小没有变化:它总是一个相同长度的列表。