정렬 된 목록의 연결 증명은 스테인리스의 정렬 된 목록입니다.

로드리고

스테인리스 (이전에는 Leon이라고 함)에서 확인하려는 배열을 정렬하기위한 다음 코드가 있습니다.

import stainless.lang._
import stainless.collection._

object QuickSort {

  def isSorted(list: List[BigInt]): Boolean = list match {
    case Cons(x, xs @ Cons(y, _)) => x <= y && isSorted(xs)
    case _ => true
  }

  def quickSort(list: List[BigInt]): List[BigInt] = (list match {
        case Nil() => Nil[BigInt]()
        case Cons(x, xs) => par(x, Nil(), Nil(), xs)
  }) ensuring { res => isSorted(res) }


  def par(x: BigInt, l: List[BigInt], r: List[BigInt], ls: List[BigInt]): List[BigInt] = {
    require(l.forall(_ <= x) && r.forall(_ >= x))
    ls match {
      case Nil() => quickSort(l) ++ Cons(x, quickSort(r))
      case Cons(x2, xs2) => if (x2 <= x) par(x, Cons(x2, l), r, xs2) else par(x, l, Cons(x2, r), xs2)
    }
  } ensuring {res => isSorted(res)}
}

나는 여기에서 갈 방향이 많이 있지만 (확인에 성공하지 못하기 때문에) 제공된 힌트를 사용하여 확인이 성공해야한다고 생각하며 왜 그렇지 않은지 알고 싶습니다. 나는 나 자신을 설명한다.

분명히 par 함수를 확인하기 위해 두 경우가 isSorted 사후 조건을 개별적으로 의미한다는 것을 증명해야합니다. 이제 두 번째 경우에 재귀 호출이 포함되어 있으므로 사후 조건을 암시하는 것이 분명합니다. par의 첫 번째 경우에는 왼쪽 및 오른쪽 하위 배열이 정렬되고 전제 조건은 모든 요소가 피벗에 대해 정렬된다는 것을 알려줍니다.

이 마지막 부분은 연결 목록도 정렬되어 있음을 내 의견으로 암시해야합니다. 그렇다면 왜 확인되지 않습니까? 스테인리스에게이를 확인하도록 어떻게 지시 할 수 있습니까? 스테인리스 작업을 용이하게하기 위해 길이와 크기에 대한 힌트를 추가해야합니까?

편집하다:

def concatIsSorted(l1 : List[BigInt],l2 : List[BigInt],pivot : BigInt) : Boolean = {
    require(isSorted(l1) && isSorted(l2) && l1.forall(_ <= pivot) && l2.forall(_ >= pivot))
    isSorted(l1 ++ Cons(pivot,l2)) because{
      l1 match{
        case Nil() => isSorted(Cons(pivot,l2))
        case Cons(h,Nil()) => h <= pivot && isSorted(Cons(pivot,l2))
        case Cons(h,t) => h <= t.head && concatIsSorted(t,l2,pivot)
      }     
    }   
  }.holds
OlivierBlanvillain

이것은 숙제 질문 처럼 보이 므로 포기하지 않고 해결책으로 당신을 안내하려고 노력할 것입니다.

먼저 프로그램에서 Nil()케이스 parcase Nil() => Nil(). 이것은 검증자가의 결과 quickSort(l) ++ Cons(x, quickSort(r))가 정렬 되었음을 증명할 수 없다는 것을 보여줍니다 (그러나 그것을 위해 그것을 관리합니다 Nil()!).

--debug=verification검증은 당신이해야한다고 생각 증명할 수없는 이유를 이해하기에 충분하지 않습니다, 진행하는 방법은 정확하게 기대를 명시 할 수 있습니다 추가 기능을 소개하는 것입니다. 예를 들어 다음을 정의하는 경우 :

def plusplus(l: List[BigInt], r: List[BigInt]): List[BigInt] = l ++ r

그리고 검증자가 증명할 것으로 기대하는 내용으로 주석을 달아주세요.

  • 가정 lr정렬 및 l < r(의 적절한 정의를 위해 <)
  • 의 결과 l ++ r가 정렬됩니다.

검증자가이 속성을 증명할 수 없음을 알 수 있습니다. 즉, 추가 보조 기능, 사전 및 사후 조건으로 검증을 더 안내해야합니다.

이 예제는 프로그램 종료 확인을위한 종속 유형 에서 가져온 것이므로 여기에서 문서를 읽는 것이 도움이 될 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C에서 정렬되지 않은 연결 목록과 정렬 된 연결 목록의 효율성

분류에서Dev

C의 연결된 목록에 삽입 정렬

분류에서Dev

정렬 된 연결 목록의 상각 된 경계

분류에서Dev

R 정렬 다중 (연결된) 목록

분류에서Dev

정의 목록을 정렬 된 목록과 결합하는 올바른 방법은 무엇입니까?

분류에서Dev

2 개 이상의 노드로 연결된 목록 정렬

분류에서Dev

두 개의 정렬 된 연결 목록 병합

분류에서Dev

두 개의 정렬 된 단일 연결 목록 병합

분류에서Dev

두 개의 정렬 된 연결 목록 병합

분류에서Dev

두 개의 정렬 된 연결 목록 병합

분류에서Dev

Python에서 정렬 된 연결 목록

분류에서Dev

연결된 목록 정렬 구현

분류에서Dev

정렬 된 연결 목록 이해

분류에서Dev

정렬 된 연결 목록 기능 (C)

분류에서Dev

정렬 된 연결 목록의 삽입에서 메모리 누수

분류에서Dev

자바 스크립트-두 개의 정렬 된 연결 목록 이해 병합

분류에서Dev

정렬 된 목록 인쇄

분류에서Dev

연결된 목록 설명서 알파벳순 정렬

분류에서Dev

연결된 목록 정렬 된 연결 목록에 노드 삽입

분류에서Dev

정렬 된 연결 목록을 정렬 된 상태로 유지하면서 다른 정렬 된 목록에 어떻게 삽입 할 수 있습니까?

분류에서Dev

C #의 정렬 된 Json 속성 목록

분류에서Dev

두 개의 정렬 된 단일 연결 목록 병합 [버그 됨]

분류에서Dev

C의 연결 목록-정렬 된 위치에 구조체 추가

분류에서Dev

연결된 목록 알파벳순 정렬, c의 세그 오류

분류에서Dev

정렬 된 작업 목록을 하나의 Observable로 결합

분류에서Dev

역 정렬 된 정수 목록의 번호를 다시 매기는 방법은 무엇입니까?

분류에서Dev

F # 정수 목록 내의 정렬 된 하위 목록

분류에서Dev

정렬 된 이중 연결 목록에 노드 삽입

분류에서Dev

정렬 된 원형 이중 연결 목록에 요소 삽입

Related 관련 기사

  1. 1

    C에서 정렬되지 않은 연결 목록과 정렬 된 연결 목록의 효율성

  2. 2

    C의 연결된 목록에 삽입 정렬

  3. 3

    정렬 된 연결 목록의 상각 된 경계

  4. 4

    R 정렬 다중 (연결된) 목록

  5. 5

    정의 목록을 정렬 된 목록과 결합하는 올바른 방법은 무엇입니까?

  6. 6

    2 개 이상의 노드로 연결된 목록 정렬

  7. 7

    두 개의 정렬 된 연결 목록 병합

  8. 8

    두 개의 정렬 된 단일 연결 목록 병합

  9. 9

    두 개의 정렬 된 연결 목록 병합

  10. 10

    두 개의 정렬 된 연결 목록 병합

  11. 11

    Python에서 정렬 된 연결 목록

  12. 12

    연결된 목록 정렬 구현

  13. 13

    정렬 된 연결 목록 이해

  14. 14

    정렬 된 연결 목록 기능 (C)

  15. 15

    정렬 된 연결 목록의 삽입에서 메모리 누수

  16. 16

    자바 스크립트-두 개의 정렬 된 연결 목록 이해 병합

  17. 17

    정렬 된 목록 인쇄

  18. 18

    연결된 목록 설명서 알파벳순 정렬

  19. 19

    연결된 목록 정렬 된 연결 목록에 노드 삽입

  20. 20

    정렬 된 연결 목록을 정렬 된 상태로 유지하면서 다른 정렬 된 목록에 어떻게 삽입 할 수 있습니까?

  21. 21

    C #의 정렬 된 Json 속성 목록

  22. 22

    두 개의 정렬 된 단일 연결 목록 병합 [버그 됨]

  23. 23

    C의 연결 목록-정렬 된 위치에 구조체 추가

  24. 24

    연결된 목록 알파벳순 정렬, c의 세그 오류

  25. 25

    정렬 된 작업 목록을 하나의 Observable로 결합

  26. 26

    역 정렬 된 정수 목록의 번호를 다시 매기는 방법은 무엇입니까?

  27. 27

    F # 정수 목록 내의 정렬 된 하위 목록

  28. 28

    정렬 된 이중 연결 목록에 노드 삽입

  29. 29

    정렬 된 원형 이중 연결 목록에 요소 삽입

뜨겁다태그

보관