Library examples.vertex_fibonacci

Require Import zoo.prelude.
Require Import zoo.iris.base_logic.lib.fupd.
Require Import zoo.iris.base_logic.lib.saved_prop.
Require Import zoo.base.
Require Export examples.fibonacci.
Require Export examples.vertex_fibonacci__code.
Require Import examples.vertex_fibonacci__types.
Require Import zoo.options.

Implicit Type r : location.
Implicit Type v ctx vtx : val.

Class VertexFibonacciG Σ `{zoo۰G : !ZooG Σ} :=
  { #[local] vertex_fibonacci۰G۰pool۰G :: PoolG Σ
  ; #[local] vertex_fibonacci۰G۰vertex۰G :: VertexG Σ
  ; #[local] vertex_fibonacci۰G۰ivar۰G :: Ivar4G Σ
  ; #[local] vertex_fibonacci۰G۰saved_prop۰G :: SavedPropG Σ
  }.

Definition vertex_fibonacci۰Σ :=
  #[pool۰Σ
  ; vertex۰Σ
  ; ivar_4۰Σ
  ; saved_prop۰Σ
  ].
#[global] Instance subGvertex_fibonacci۰Σ Σ `{zoo۰G : !ZooG Σ} :
  subG vertex_fibonacci۰Σ Σ
  VertexFibonacciG Σ.

Section vertex_fibonacci۰G.
  Context `{vertex_fibonacci۰G : VertexFibonacciG Σ}.

  #[local] Lemma vertex_fibonacci٠main₁spec vtx iter r n :
    vertex۰inv vtx (r ↦ᵣ #(fibonacci n)) True -∗
    r ↦ᵣ 0 -∗
    vertex۰wp
      vtx
      (r ↦ᵣ #(fibonacci n))
      True
      (𝗳𝘂𝗻 "ctx" vertex_fibonacci٠main₁ "ctx" vtx #r #n)
      iter.

  Lemma vertex_fibonacci٠mainspec (num_dom n : nat) :
    {{{
      True
    }}}
      vertex_fibonacci٠main #num_dom #n
    {{{
      RET #(fibonacci n);
      True
    }}}.
End vertex_fibonacci۰G.

Require examples.vertex_fibonacci__opaque.