{-# OPTIONS --safe #-}

open import Axiom.Set using (Theory)

module Ledger.Introduction (th : Theory) where

open import Prelude

import Data.Maybe as Maybe
open import Data.Maybe.Properties
open import Interface.STS hiding (_⊢_⇀⟦_⟧*_)
open import Relation.Binary.PropositionalEquality

private variable
  C S Sig : Type
  Γ : C
  s s' s'' : S
  b sig : Sig
  sigs : List Sig


module _ (_⊢_⇀⟦_⟧_ : C  S  Sig  S  Type) where



  data _⊢_⇀⟦_⟧*_ : C  S  List Sig  S  Type where



    RTC-base :
      Γ  s ⇀⟦ [] ⟧* s

    RTC-ind :
       Γ  s  ⇀⟦ sig    s'
       Γ  s' ⇀⟦ sigs ⟧* s''
      ───────────────────────────────────────
      Γ  s ⇀⟦ sig  sigs ⟧* s''


record Computational (_⊢_⇀⦇_,X⦈_ : C  S  Sig  S  Type) : Type where
  field
    compute     : C  S  Sig  Maybe S
    ≡-just⇔STS  : compute Γ s b  just s'  Γ  s ⇀⦇ b ,X⦈ s'

  nothing⇒∀¬STS : compute Γ s b  nothing   s'  ¬ Γ  s ⇀⦇ b ,X⦈ s'


  nothing⇒∀¬STS comp≡nothing s' h rewrite ≡-just⇔STS .Equivalence.from h =
    case comp≡nothing of λ ()


open Theory th using (_∈_) renaming (Set to )
private variable
  a c : Level
  A : Type a
Σ-syntax' : (A : Type a)  (A  Type c)  Type _
Σ-syntax' = Σ
syntax Σ-syntax' A  x  B) = x  A  B


_⊆_ : {A : Type}   A   A  Type
X  Y =  {x}  x  X  x  Y

_≡ᵉ_ : {A : Type}   A   A  Type
X ≡ᵉ Y = X  Y × Y  X

Rel : Type  Type  Type
Rel A B =  (A × B)

left-unique : {A B : Type}  Rel A B  Type
left-unique R =  {a b b'}  (a , b)  R  (a , b')  R  b  b'

_⇀_ : Type  Type  Type
A  B = r  Rel A B  left-unique r