module A201602.LFFOL where

open import Data.Nat
  using (; zero; suc; _+_; _*_; _<_)
open import Data.Product
  using (Σ; _×_)
open import Data.Sum
  using (_⊎_)
open import Relation.Binary.PropositionalEquality
  using (_≡_)
open import Relation.Nullary
  using (¬_)


Var : Set
Var = 

data ι : Set where
  ‘zero’ : ι
  ‘suc’  : ι  ι
  _‘+’_  : ι  ι  ι
  _‘*’_  : ι  ι  ι

data o : Set where
  _‘≡’_ : ι  ι  o
  _‘<’_ : ι  ι  o
  ‘¬’_  : o  o
  _‘∧’_ : o  o  o
  _‘∨’_ : o  o  o
  _‘→’_ : o  o  o
  ‘∀’_  : (ι  o)  o
  ‘∃’_  : (ι  o)  o

δ⟦_⟧ι : ι  
δ⟦ ‘zero’  ⟧ι = zero
δ⟦ ‘suc’ t ⟧ι = suc δ⟦ t ⟧ι
δ⟦ t ‘+’ u ⟧ι = δ⟦ t ⟧ι + δ⟦ u ⟧ι
δ⟦ t ‘*’ u ⟧ι = δ⟦ t ⟧ι * δ⟦ u ⟧ι

δ⟦_⟧o : o  Set
δ⟦ t ‘≡’ u ⟧o = δ⟦ t ⟧ι  δ⟦ u ⟧ι
δ⟦ t ‘<’ u ⟧o = δ⟦ t ⟧ι < δ⟦ u ⟧ι
δ⟦ ‘¬’ φ   ⟧o = ¬ δ⟦ φ ⟧o
δ⟦ φ ‘∧’ ψ ⟧o = δ⟦ φ ⟧o × δ⟦ ψ ⟧o
δ⟦ φ ‘∨’ ψ ⟧o = δ⟦ φ ⟧o  δ⟦ ψ ⟧o
δ⟦ φ ‘→’ ψ ⟧o = δ⟦ φ ⟧o  δ⟦ ψ ⟧o
δ⟦ ‘∀’ f   ⟧o = ∀{x : ι}  δ⟦ f x ⟧o
δ⟦ ‘∃’ f   ⟧o = Σ ι  x  δ⟦ f x ⟧o)