Library examples.pool_quicksort

From zoo Require Import
  prelude.
From zoo.common Require Import
  list.
From zoo.language Require Import
  notations.
From zoo.diaframe Require Import
  diaframe.
From zoo_std Require Export
  array.
From zoo_std Require Import
  for_.
From zoo_parabs Require Import
  pool.
From examples Require Export
  pool_quicksort__code.
From zoo Require Import
  options.

Section pool_G.
  Context `{pool_G : PoolG}.

  #[local] Lemma pool_quicksortΩ partition𑁒spec arr i i_ xs sz :
    (0 ≀ i)%Z β†’
    i_ = β‚Ši β†’
    (1 < sz)%Z β†’
    length xs = β‚Šsz β†’
    {{{
      array_slice arr i_ (DfracOwn 1) (#*@{Z} xs)
    }}}
      pool_quicksortΩ partition arr #i #sz
    {{{
      xs1 p pivot xs2
    , RET #p;
      βŒœp = (i_ + length xs1)%nat⌝ βˆ—
      βŒœxs β‰‘β‚š xs1 ++ pivot :: xs2⌝ βˆ—
      βŒœForall ((β‰₯)%Z pivot) xs1⌝ βˆ—
      βŒœForall ((≀)%Z pivot) xs2⌝ βˆ—
      array_slice arr i_ (DfracOwn 1) (#*@{Z} xs1 ++ #@{Z} pivot :: #*@{Z} xs2)
    }}}.
  #[local] Lemma pool_quicksortΩ main₀𑁒spec pool ctx scope arr i i_ xs sz :
    (0 ≀ i)%Z β†’
    i_ = β‚Ši β†’
    length xs = β‚Šsz β†’
    {{{
      pool_context pool ctx scope βˆ—
      array_slice arr i_ (DfracOwn 1) (#*@{Z} xs)
    }}}
      pool_quicksortΩ mainβ‚€ ctx arr #i #sz
    {{{
      RET ();
      pool_context pool ctx scope βˆ—
      pool_consumer pool (
        βˆƒ xs',
        βŒœxs β‰‘β‚š xs'⌝ βˆ—
        βŒœStronglySorted (≀)%Z xs'⌝ βˆ—
        array_slice arr i_ (DfracOwn 1) (#*@{Z} xs')
      )
    }}}.
  #[local] Lemma pool_quicksortΩ main₁𑁒spec pool ctx scope arr xs :
    {{{
      pool_context pool ctx scope βˆ—
      array_model arr (DfracOwn 1) (#*@{Z} xs)
    }}}
      pool_quicksortΩ main₁ ctx arr
    {{{
      RET ();
      pool_context pool ctx scope βˆ—
      pool_consumer pool (
        βˆƒ xs',
        βŒœxs β‰‘β‚š xs'⌝ βˆ—
        βŒœStronglySorted (≀)%Z xs'⌝ βˆ—
        array_model arr (DfracOwn 1) (#*@{Z} xs')
      )
    }}}.

  Lemma pool_quicksortΩ main𑁒spec (num_dom : nat) arr xs :
    {{{
      array_model arr (DfracOwn 1) (#*@{Z} xs)
    }}}
      pool_quicksortΩ main #num_dom arr
    {{{
      xs'
    , RET ();
      βŒœxs β‰‘β‚š xs'⌝ βˆ—
      βŒœStronglySorted (≀)%Z xs'⌝ βˆ—
      array_model arr (DfracOwn 1) (#*@{Z} xs')
    }}}.
End pool_G.

From examples Require
  pool_quicksort__opaque.