{-# OPTIONS --guardedness #-}
module SMT.Theory.Raw.Base where
open import Data.Empty as Empty using (⊥; ⊥-elim)
open import Data.Environment as Env using (Env; []; _∷_)
open import Data.Maybe as Maybe using (Maybe; just; nothing)
open import Data.List as List using (List; []; _∷_)
open import Data.Product as Prod using (_×_; _,_; proj₁; proj₂)
open import Data.String as String using (String)
open import Function using (id)
open import Function.Equivalence using (equivalence)
import Reflection as Rfl
open import Reflection.Term using () renaming (_≟_ to _≟-Term_)
open import Relation.Nullary using (Dec; yes; no)
import Relation.Nullary.Decidable as Dec
open import Relation.Binary.PropositionalEquality using (_≡_; refl; cong)
open import SMT.Theory.Base
open import SMT.Theory.Class.Parsable
open import SMT.Theory.Class.Printable
open import SMT.Theory.Class.Solvable
open import Text.Parser.String
data RawSort : Set where
  ⋆    : RawSort
  TERM : Rfl.Term → RawSort
TERM-injective : ∀ {t t′} → TERM t ≡ TERM t′ → t ≡ t′
TERM-injective refl = refl
_≟-RawSort_ : (σ σ′ : RawSort) → Dec (σ ≡ σ′)
⋆      ≟-RawSort ⋆       = yes refl
⋆      ≟-RawSort TERM _  = no λ()
TERM x ≟-RawSort ⋆       = no λ()
TERM t ≟-RawSort TERM t′ = Dec.map (equivalence (cong TERM) TERM-injective) (t ≟-Term t′)
rawTheory : Theory
Theory.Sort        rawTheory = RawSort
Theory._≟-Sort_    rawTheory = _≟-RawSort_
Theory.BOOL        rawTheory = ⋆
Theory.Value       rawTheory = λ _ → ⊥
Theory.Literal     rawTheory = λ _ → Rfl.Literal
Theory.Identifier  rawTheory = λ _ → Rfl.Name
Theory.quoteSort   rawTheory = λ _ → Rfl.con (quote ⋆) []
Theory.quoteValue  rawTheory = λ _ → ⊥-elim
Theory.interpValue rawTheory = λ t → t
instance
  rawPrintable : Printable rawTheory
  Printable.showSort       rawPrintable = λ _ → "⋆"
  Printable.showLiteral    rawPrintable = Rfl.showLiteral
  Printable.showIdentifier rawPrintable = Rfl.showName
  rawParsable : Parsable rawTheory
  Parsable.parseSort  rawParsable = ⋆ <$ lexeme "⋆"
  Parsable.parseValue rawParsable = λ _ → fail
  rawSolvable : Solvable rawTheory
  rawSolvable = makeSolvable rawTheory
open import SMT.Script.Base rawTheory public
  using ()
  renaming ( OutputType      to RawOutputType
           ; OutputCtxt      to RawOutputCtxt
           ; Ctxt            to RawCtxt
           ; _∋_             to _∋ᵣ_
           ; Term            to RawTerm
           ; `var            to `varᵣ
           ; `lit            to `litᵣ
           ; `app            to `appᵣ
           ; `forall         to `forallᵣ
           ; `exists         to `existsᵣ
           ; `let            to `letᵣ
           ; Args            to RawArgs
           ; `set-logic      to `set-logicᵣ
           ; `declare-const  to `declare-constᵣ
           ; `assert         to `assertᵣ
           ; `check-sat      to `check-satᵣ
           ; `get-model      to `get-modelᵣ
           ; Script          to RawScript
           ; []              to []ᵣ
           )
open import SMT.Script.Names rawTheory using (x′es)
showRawScript : {Γᵣ : RawCtxt} {Ξᵣ : RawOutputCtxt} → RawScript [] Γᵣ Ξᵣ → String
showRawScript scrᵣ = proj₁ (Solvable.toSMTLIBWithOutputParser rawSolvable scrᵣ)
RawVar : RawCtxt → Set
RawVar Γ = Γ ∋ᵣ ⋆