{-# OPTIONS --allow-unsolved-metas #-}
open import Relation.Binary using (Decidable)
open import Relation.Binary.PropositionalEquality using (_≡_)
module dtres
  {{ Α : Set }} 
  {{ C : Set }} 
  {{ Var : Set }} 
  {{ decEqVar : Decidable (_≡_ {A = Var}) }}
  {{ Κ : Set }} 
  
  where
import SyntaxRew
open SyntaxRew 
  {{ Α }} 
  {{ C }} 
  {{ Var }} 
  {{ decEqVar }}
  {{ Κ }} 
  using (Sig ; Prog ; Ctx ; PT ; Go ; go ; inMT ; · )
import BigSem
open BigSem
  {{ Α }} 
  {{ C }} 
  {{ Var }} 
  {{ decEqVar }}
  {{ Κ }} 
  using ( _+_⟶_∷_ )
import SmlSem
open SmlSem 
  {{ Α }}    
  {{ C }}    
  {{ Var }}  
  {{ decEqVar }}
  {{ Κ }}     
  using ( _+_⊢_∣_~>_∣_ ; ∀gen )
import LogRel.Gen
open LogRel.Gen
  {{ Α }}    
  {{ C }}    
  {{ Var }}  
  {{ decEqVar }}
  {{ Κ }}     
  using ( log-gen )
import Fundamental
open Fundamental
  {{ Α }} 
  {{ C }} 
  {{ Var }} 
  {{ decEqVar }}
  {{ Κ }} 
  using ( fundamental )
import Escape
open Escape
  {{ Α }} 
  {{ C }} 
  {{ Var }} 
  {{ decEqVar }}
  {{ Κ }} 
  using ( escape )
sound : {S : Sig} {P : Prog} {Γ : Ctx} {e : PT} {G : Go} →
  S + P ⊢ Γ ∣ (go G) ~> · ∣ (inMT e) →
  S + P ⟶  e ∷ G
sound sml = escape (fundamental sml)
gensound : {S : Sig} {P : Prog} {Γ Γ' : Ctx} {e : PT} {G : Go} →
  S + P ⊢ Γ ∣ (go G) ~> Γ' ∣ (inMT e) →
  S + P ⟶  e ∷ (∀gen Γ' G)
gensound sml = escape (log-gen (fundamental sml))