Isabelle

时间:2015-11-15 14:32:20

标签: isabelle

这与Project Euler问题523有关。

以下算法对列表进行排序:

  
      
  1. 从列表的开头开始,依次检查每对相邻的元素。
  2.   
  3. 如果元素出现故障:      
        
    1. 将该对中最小的元素移动到列表的开头。
    2.   
    3. 从步骤1重新开始此过程。
    4.   
  4.   
  5. 如果所有配对都有序,请停止。
  6.   

我正在尝试(练习)在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 $。

我是伊莎贝尔的新手。我如何编写“伊莎贝尔的这个定义是明确的,因为这个证明”的想法?文档似乎主要讨论大小参数,输入的大小没有变化:它总是一个相同长度的列表。

0 个答案:

没有答案