{-# OPTIONS --allow-unsolved-metas #-}
open import Relation.Binary using (Decidable)
open import Relation.Binary.PropositionalEquality using (_≡_ ; refl)
module BigSem
  {{ Α : Set }}    
  {{ C : Set }}    
  {{ Var : Set }}  
  {{ decEqVar : Decidable (_≡_ {A = Var}) }}
  {{ Κ : Set }} 
  where
import Syntax
open Syntax 
  {{ Α }}    
  {{ C }}    
  {{ Var }}  
  {{ decEqVar }} 
  {{ Κ }}    
mutual
  data _+_⟶_∷_  : Sig → Prog → PT → Go → Set where
    decide : {S : Sig} {P : Prog} {e : PT} {A : T} {κ : Κ} {D : De} →
      S + P - symbP κ ∷ D ⟶ e ∷ A →
      κ ∷ D ∈P P →
      S + P ⟶ e ∷ (at A)
    ∃R : {S : Sig} {P : Prog} {e : PT} {G : Go} {M : t} {A : T} {x : Var} →
      S + P ⟶ e ∷ (G [ M / x ]Go ) →
      S + · ⊢ M ∷ A →
      S + P ⟶ < M , e >P ∷ ∃Go x A G
    ⇒R : {S : Sig} {P : Prog} {κ : Κ} {e : PT} {D : De} {G : Go} →
      S + (P , κ ∷ D) ⟶ e ∷ G →
      
      S + P ⟶ (lamP κ e) ∷ (D ⇒ G)
    ∀R : {S : Sig} {P : Prog} {e : PT} {A : T} {G : Go} {x : Var} {c : C} →
     (S , c ∷T A) + P ⟶ e [ (const c) / x ]PT ∷ (G [ const c / x ]Go) →
      
      S + P ⟶ e ∷ ∀Go x A G
  
  data _+_-_∷_⟶_∷_  : Sig → Prog → PT → De → PT → T → Set where
    init : {S : Sig} {P : Prog} {e : PT} {A : T} →
      
      S + P - e ∷ at A ⟶ e ∷ A
    ⇒L : {S : Sig} {P : Prog} {e e₁ e₂ : PT} {A₁ A₂ : T} {D : De} →
      S + P ⟶ e₁ ∷ at A₁ →
      S + P - e apP e₁ ∷ D ⟶ e₂ ∷ A₂ →
      S + P - e ∷ at A₁ ⇒ D  ⟶ e₂ ∷ A₂
    ∀L : {S : Sig} {P : Prog} { e e₂ : PT} {x : Var} {A₁ A₂ : T} {D : De} {M : t} →
      S + P - e ∷ D [ M / x ]De ⟶ e₂ ∷ A₂ →
      S + · ⊢ M ∷ A₁ →
      S + P - e ∷ ∀De x A₁ D ⟶ e₂ ∷ A₂
import Syntax