Quicksort

Quicksort implementation from rosettacode.com, demonstrating verification of termination

from typing import List, cast from nagini_contracts.contracts import * from nagini_contracts.obligations import MustTerminate def quickSort(arr: List[int]) -> List[int]: Requires(Acc(list_pred(arr), 2/3)) Requires(MustTerminate(2 + len(arr))) Ensures(Acc(list_pred(arr), 2/3)) Ensures(Implies(len(arr) > 1, list_pred(Result()))) Ensures(Implies(len(arr) <= 1, Result() is arr)) less = [] # type: List[int] pivotList = [] # type: List[int] more = [] # type: List[int] if len(arr) <= 1: return arr else: pivot = arr[0] for i in arr: Invariant(list_pred(less) and list_pred(pivotList) and list_pred(more)) Invariant(len(Previous(i)) == len(less) + len(more) + len(pivotList)) Invariant(Implies(len(Previous(i)) > 0, len(pivotList) > 0)) Invariant(Acc(list_pred(arr), 1/2) and len(arr) > 0 and arr[0] == pivot) Invariant(MustTerminate(len(arr) - len(Previous(i)))) if i < pivot: less.append(i) elif i > pivot: more.append(i) else: pivotList.append(i) less = quickSort(less) more = quickSort(more) return less + pivotList + more