函数计算不动点的良定义性,在Isabelle中

函数计算不动点的良定义性,在Isabelle中,isabelle,Isabelle,这与项目Euler问题523有关 以下算法对列表进行排序: 从列表的开头开始,依次检查每对相邻元素 如果元件出现故障: 将该对中的最小元素移动到列表的开头 从步骤1重新启动流程 如果所有对都排列整齐,请停止 我试图(为了练习)在伊莎贝尔身上把这件事写下来。我已获得以下函数定义: fun firstpos :: "nat list ⇒ nat" where "firstpos [] = 0" | "firstpos (x # y # xs) = (if (x > y) then 1 els

这与项目Euler问题523有关

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

  • 从列表的开头开始,依次检查每对相邻元素
  • 如果元件出现故障:
  • 将该对中的最小元素移动到列表的开头
  • 从步骤1重新启动流程
  • 如果所有对都排列整齐,请停止
  • 我试图(为了练习)在伊莎贝尔身上把这件事写下来。我已获得以下函数定义:

    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"
    

    其中,
    firstpos
    确定第一个元素的列表索引,该索引大于其在列表中的后续元素,并且
    insertafront
    排列列表,以便第四个元素的“第二个参数”位于前面

    也就是说,
    firstPos
    有效地告诉我们从哪里开始执行算法的步骤2,而
    insertafront
    是算法的步骤2.1

    现在,我想定义一个函数,它基本上是这些函数组成的不动点。换句话说,

    fun sortproc :: "nat list ⇒ nat list" 
    where "sortproc l = sortproc (insertAtFront l (firstpos l + 1))"
    
    这个过程终止是不寻常的,但我可以用数学证明它:在每个阶段,$\sum{I=1}^n2^I L{n-I}$减少,其中$n$是列表$L$的长度


    我是伊莎贝尔的新手。我怎样才能把“这个定义定义很好,因为这个证明”的想法编码到伊莎贝尔身上?文档似乎主要讨论大小参数,输入的大小没有变化:它总是一个长度相同的列表。

    我不知道Isabelle,所以我不知道如何编码它,但您需要的是一些减小的整数。所以当文档谈到“大小”时,插入sum(2^i*L(n-i))@Gilles哦,当然!这就是答案的要点。之后还有一些工作要做(将终止证明转换为伊莎贝尔能够理解的足够简单的步骤),我需要对这一点进行整理,但当我完成后,我会自行回答。仅供记录:使用方法
    关系
    (有关示例,请参见
    伊莎贝尔文档函数
    第4节)您可以使用任意有充分根据的订单。当涉及自然数时,这通常可以方便地与
    measure:('a)结合使用⇒ nat)⇒ ('a×'a)集合
    。然后,终止证明大致如下:
    apply(关系“measure(%x.fx)”)…
    其中
    f
    是减小w.r.t.
    x
    的表达式。我不知道Isabelle,所以我不知道如何对其进行编码,但您需要的是一个减小的整数。所以当文档谈到“大小”时,插入sum(2^i*L(n-i))@Gilles哦,当然!这就是答案的要点。之后还有一些工作要做(将终止证明转换为伊莎贝尔能够理解的足够简单的步骤),我需要对这一点进行整理,但当我完成后,我会自行回答。仅供记录:使用方法
    关系
    (有关示例,请参见
    伊莎贝尔文档函数
    第4节)您可以使用任意有充分根据的订单。当涉及自然数时,这通常可以方便地与
    measure:('a)结合使用⇒ nat)⇒ ('a×'a)集合
    。然后,终止证明大致如下:
    apply(关系“measure(%x.fx)”)…
    其中
    f
    是减小w.r.t.
    x
    的表达式。
    fun sortproc :: "nat list ⇒ nat list" 
    where "sortproc l = sortproc (insertAtFront l (firstpos l + 1))"